-
Week notes: clicking around like a manager who's never heard of Nest
Old URLs finally match the live tree, a handful of screens that fell over the moment you clicked them, youth and Features behaving like a club, and stars that rank against your own league.
-
So much for the librarian
Goose takes the schema, the Nest tree comes out of the repository, and seeding runs as Go — retracting the hedge I wrote ten days earlier.
-
The public door moves to Go
Photographing the Nest API before copying it, cutting over one domain at a time, and finally turning off /v1 — with Nest keeping the schema and the seeds. For now.
-
A real 1–20, and roles you have to teach
Attributes stop being remapped for display, current ability counts the skills outside a player's role, and listed positions become a familiarity score you train, decay, and pay for on Saturday.
-
LB, DL, and a game that speaks one language
Who a player is, where a body stands in this shape, and what a manager reads on the pitch — three different questions that had been sharing one answer.
-
Week notes: Free Agent 15 from Saudi Arabia
A name generator that didn't survive the move to Go, badges my one tester called generic, onboarding tours worth replaying, and fixtures that aren't a mirror after Christmas.
-
Week notes: a Batumi blackout, contract jeopardy, and head-to-heads
A power cut, a balcony, and a week spent giving players the agency to say no — plus richer inbox messages and every meeting two clubs have ever had.
-
Opening the books: an engineering diary for The Dugout
Why I'm keeping a diary of building The Dugout, what goes in it, and what stays out.
-
Week notes: Tbilisi, clinched titles, and tables that tell you
Eleven weeks of staging, a league season nearly over, and nobody being told they'd won it or gone down — plus grids that finally behave the same everywhere.
-
Potential should be a ceiling, not a rumour
Birth potential becomes a hard ceiling, growth rewards the training ground you actually built, and weekly youth intake samples the division you actually play in.
-
A nursery for the pyramid
Youth academy intake, U21 league and cup, eligibility and registration — plus the last of the duplicate tick paths leaving Nest for good.
-
Week notes: one request instead of twelve, and throwing things away
Club-house and route bootstraps with stale-while-revalidate, a verified dead-code pass, and some quiet tightening I'm not going to describe in detail.
-
Deleting the safety net
With Go running the tick on staging, Nest loses its processors and cron producers for good — it answers HTTP and enqueues, and that's the whole job now.
-
Week notes: the draw fix I promised, and finally being able to see the workers
A reconciler takes over cup and playoff progression, restart safety gets teeth, the bracket stops stacking cards on itself, and the Go workers show up on a dashboard.
-
Moving the heartbeat to Go
A Go worker and scheduler speaking Nest's job shapes, gated by queue ownership — plus the claims, dedupe keys, and ledgers that make a restart boring.
-
Letting a model write the words, never the numbers
A narrative queue for briefings, articles, and press copy with procedural fallback — then giving up on running a model in my own cluster and moving to a hosted one.
-
Every nation gets a cup
Per-country Sunday knockout cups — progressive draws, cup-tied lineups, prize money, discipline, and a full Cup section in the game beside the league.
-
A front porch, and a DNS switch I didn't flip
Prerendered marketing site — homepage, blog, legal pages — deployed to Cloudflare Pages on a staging project, while the apex domain stayed deliberately unpointed.
-
Making match day feel live without lying about it
Matches simulate before kickoff, then every client reveals the stored timeline minute by minute — with a commentary registry that has its own RNG so flavour never touches the result.
-
Giving the world a newspaper and a microphone
News at global, national and division level with procedural match write-ups, plus press conferences as a modal so answering the media doesn't drag you out of the clubhouse.
-
A day in the life of the world, and a season that ends properly
An ordered daily tick that moves the world in a known sequence, match simulation kept on its own clock, and cross-tier playoffs after MD30 that don't poison the league table.
-
Transfers, take two: a market instead of a price field
Listings, shortlists, offers with timers, windows and board fee limits — plus an economy the FA desk can tune without a redeploy. No loans yet, on purpose.
-
The FA needs a desk of its own
Building the admin console as a separate Angular app — seasons, clock controls, seeding, user lookup, queue visibility and maintenance mode, all with preview-before-apply.
-
Swapping Clerk for Firebase, and finding a way to actually deploy
Paying for a second identity rewrite in a young codebase, and putting the first Terraform-and-Actions path in place so the game could live somewhere that wasn't my laptop.
-
A second wind, and the whole loop in one go
Six quiet months, then April 2026 lands match day, transfers, training, finances and the inbox in one world — and swaps Spartan for PrimeNG on the way in.
-
Coming back to my own code and writing a list
October 2025 was a handshake with the codebase after months away — bump the dependencies, delete the auth UI that had already died, and finally write down what was actually left to build.
-
Badges, then nothing for four months
One June commit generates team badges, and then the log goes quiet through July, August and September. There's no hidden epic in there. I just stopped.
-
Where does a manager spend their first ten minutes?
May 2025 was nav, a squad list, player photos, fixtures and form — the month the browser started to matter and the empty panels started to nag.
-
A match engine with nowhere to play
The rest of April 2025 was me giving the engine somewhere to live — an API, a login, seasons, seeders, and a first Angular shell. Roughly two hundred commits, half of which I've since thrown away.
-
The first commit is a liar
Git says this started on 16 April 2025. It actually started in 2024, with sketches, borrowed abstractions, and a crude simulator I ran until the scorelines stopped being funny.