Three apps, one contract
Three Next.js apps on one C# API and one generated TypeScript contract, and an honest map of what crosses between them.
Who each app is for
Business is the venue owner's console and every venue's public site. Market is the console for the coordinators who run markets, the vendors who sell at them and the artists who play. Consumer is the guest's side: finding events and venues, and the night itself.
One contract
The API is C# on .NET 10 over PostgreSQL. The apps never hand-write a response shape: the shared contract package is generated from the API's OpenAPI document, and five gates check every change to it. On every push to master, CI compares the API's routes with the contract and goes red when the contract falls behind.
What crosses between them
A DJ posts a gig in Market, and the venue it names gets an invitation to join. A crew member asks for time off in Market, and the venue decides in Business. Guests share photos from a night in Consumer, and the venue sees them in Business. A vendor's booking shows up on the venue's 3D floor.
Measuring the seams
On 27 Oct 2026 I had every API call in Market, Consumer and Business checked against the API's routes. None points at a route that doesn't exist, and none of the 17,490 calls the route map resolved uses the wrong HTTP method. The same pass found 27 seams that aren't finished yet, like a sign-up one app writes and no app reads. Each one became a work item.
- API
- 1,630 endpoints in 220 controllerscounted from the API source on 27 Oct 2026
- Database
- 475 PostgreSQL tablescounted from the API source on 27 Oct 2026
- Calls checked
- 17,490, none with the wrong methodthe seam recon, 27 Oct 2026
- Open seams
- 27the seam recon, 27 Oct 2026