Wrapping the engine: Nest, a client, and the first world skeleton

milestone origins, platform, nest, client

If 16 April was the engine’s renewed footprint, the rest of that month was the decision to stop treating simulation as a lonely CLI. The commit log for April 2025 is dense — on the order of two hundred non-merge commits — and reading it as a changelog would miss the point. What mattered was the bet: a v1 engine only becomes interesting when a manager can inhabit a world that produces fixtures for it.

The day after the engine cleanup, a Nest API and a base web app appeared, quickly followed by Tailwind styling and a draft dashboard. Through the following week the stack grew teeth that were, in retrospect, transitional: gRPC and Envoy, proto definitions, Clerk for sign-in, webhooks for user lifecycle, entities for users and profiles. In parallel, the domain started to look like football rather than plumbing — competition phases, match calendar entries, season schedule generation, seeders that could produce fixtures, indexes on match queries. By late April the client could show available countries, continents were exposed as data, Spartan UI primitives were coming in, and a new user could be assigned a team. In simple terms: the engine finally had somewhere to live.

The challenge of that fortnight was multiplicity without paralysis. Every layer invited a “proper” design — RPC versus REST, design-system completeness, perfect seed realism — while the real risk was stalling before a manager could see a clubhouse. In spite of the noise in commit messages (“Update”, “More updates”), the durable pattern was incremental wiring: get auth far enough to create a user, get seasons far enough to have fixtures, get the client far enough to show the next match. The drawback of moving that fast is obvious in hindsight: some of those early choices (gRPC as the primary client path, Clerk as the identity centre, Spartan as the UI kit) would later be replaced. The strength was momentum — a world skeleton existed before perfectionism could talk it out of existence.

Paths not taken include keeping the engine as a research repo forever, or building the full managerial loop inside a notebook of simulations with no product surface. Either would have been safer emotionally; neither would have forced the uncomfortable questions of onboarding, country choice, and “which team is mine?”

What it unlocked was May’s focus on the clubhouse as a place, not just an API that could answer questions about matches.

← All entries