Case study · NO. 06
Football's biggest problem was football.
It's 2036. The Super League came back, went global, and removed the sport's most inefficient feature: sporting merit. You've been appointed manager of one of the fifteen clubs that can never go down. The fans are not shareholders. Please do not confuse the two.
- Started
- August 2026, as a fork
- League
- 15 founders + 5 by lottery
- Engine
- Seeded Poisson, 100 seasons tested
- Platforms
- Web, plus an Android twin
A fork with a premise
This is EPL Manager with a point of view. The engine, the cards, the transfer market and the board meetings all carried over; what changed, in one long commit in August 2026, was the world they run in. Twenty real Premier League clubs became twenty-eight invented ones — The Armory Group, Royal VARdrid, White Hart Loan FC, Bavarian Monopoly, the Inter Retirement Fund — presided over by PEFA™, Private Equity Football Accelerate, and its president Giacomo Infamtino. Technology partners Microsack, Clawed AI and ChatGDP were invited to model recovery scenarios for a sport in which clubs could lose matches, miss qualification, even be relegated. Their conclusion was unanimous, and it’s the line the whole game hangs off. The satire only works if it’s airtight, so there isn’t a real trademark anywhere in it — the last two to go were the trophies, which had been traced from the actual Premier League trophy and FA Cup, and are now our own art.

Twenty clubs, five of them by lottery
Fifteen founders hold permanent seats. The other five places are drawn every summer from a thirteen-club global pool — Riyadh, Shanghai, Cairo, Buenos Aires — regardless of how last year’s guests finished, because merit was deemed an unreliable basis for commercial planning. There is no relegation; the bottom three sit in the “Brand Damage” zone, which costs standing rather than status. Mechanically the draw is ninety lines of seeded Fisher–Yates: a pure function of the save’s seed and the season number, never persisted, so a replayed career meets the same guests in the same summers. The draft ceremony’s broadcast — a rationale and a confidence figure for each berth, in the register of a media kit — runs on a sibling seed, deliberately, so that rewriting a joke can never change which clubs actually get drawn. Departing clubs leave with their squads. Arrivals turn up with fresh ones.
A hundred seasons, headless
The simulation is pure TypeScript with no React in it, which is what lets a test play a hundred consecutive seasons with everything switched on — transfers, aging, injuries, retirements, regens, the lottery — and check that nothing quietly breaks. After the conversion it reported the numbers you’d want: the champion averaging 78 points, tier-one clubs taking 84 titles in 100. It has also caught the kind of thing that only shows up at scale. AI clubs were sitting on an average of £8.9 billion by season 100 because three small bugs compounded — the AI window only ran if you opened the transfer screen, imports were logged and then dropped, unspent budget rolled over forever. Squads were reaching 149 players by season 40 because the cap lived in four places and youth intake wasn’t any of them. And the world-player-of-the-year ballot, at a flat 1.1 points per rating point, meant being eleven points better than the entire league bought you the equivalent of 2.9 goals, so a generational midfielder could never win it. None of those is visible in a single season. All of them would have been felt by season ten.

Cards, decks, and a private-equity promo reel
The trading-card layer this game inherited from EPL Manager grew up here. Formation and mentality became a three-slot collectible loadout — Shape, Tempo, Instruction — with manager schools, silver and gold tier variants, set bonuses, and legendary chase cards minted on career achievements. A rival manager beaten three times mints a card; losing to one three times mints a different, less flattering one. Each season the league passes one or two “decrees” that mutate the rules, and every one now carries a structured effect the engine actually interprets, because sixteen of them shipped for a whole phase as description with nothing behind it. Claiming a new save plays a seven-scene PEFA pitch video first — cold open, the indictment, the certificate of incorporation with three of five objectives redacted — with Instagram-stories controls, because a satirical corporate reel that you can’t skip is just a corporate reel.

Twins on two platforms
There is a native Android port, in Kotlin, and the contract between the two is the part I’m proudest of: the engines stay twins; the screens do not. Twenty-eight export scripts run the real TypeScript and dump golden-master JSON that the Android test suite asserts against, so a match, a transfer window or a lottery draw produces the identical result on both. Above the engine the two are free to differ, and a ledger records each surface as locked, free, or — the status that matters — ahead on one side. That last one exists because parity used to be a one-way ratchet, and when Android wired a feature first the only tool was a prose note saying “don’t regenerate this,” which nobody enforced and everybody forgot. The web build ships as a private npm package and mounts inside this site with its own CSS prefix and its own save-slot keys, because IndexedDB is per-origin and its ancestor lives on the same one.
How it gets built
Three hundred and thirty commits and about fifty-seven thousand lines of TypeScript, nights and weekends, one person pairing with Claude Code throughout — the balance harness, the parity ledger, the contrast audit that walked every screen in both themes and found twenty real failures a grep never could. In September the whole thing was re-skinned as a tactile sports console: cream paper stocks, hairline rules, a rocker key for advancing the month, and every club’s colour normalised so that all twenty-eight palettes pass contrast on whatever surface they land. The agents are tireless about the hundredth season. Whether Pyramid Scheme FC is a good enough joke remains my problem.