Edu-Streak
One contract, two repos — drift made impossible
Stack
Frontend
- Angular 21
- Signals
- TypeScript
Backend & Data
- Go
- MongoDB
- REST
Problem
Two-repo setups drift: the backend changes a handler, the frontend's hand-written client rots, and the bug surfaces at runtime. This treats the API contract as the single source of truth and makes the frontend data layer a generated artifact.
What I built
- A Go and MongoDB API with an Angular 21 admin built on signals.
- A generator that scans Go handlers and structs and emits matching TypeScript interfaces and injectable services.
- Type mapping handled at generation time, including database identifier types.
Technical decisions & trade-offs
- Types generated from the handler itself, so drift stops being possible rather than merely discouraged.
- Signals-first state in the admin — no store library for a surface this size.
- The generator ships as a repeatable command plus a conventions file, so regeneration is a habit rather than a project.
Outcome
Backend-to-frontend binding reduced to a single command. In active development.