← All projects

Fantasy Auction Scores a Real League Every Week

Auction fantasy football, rebuilt as a platform: a private app that scores every match and explains every point, a public sales site and two launch films. Live now, running in parallel with our league's old setup, and aiming to take on paying leagues and hobbyists from next season.

Film 01 / 0:53 Fantasy Auction showreel The 53-second launch film on fantasy.auction. Motion graphics built around the real product: the auction, the squad, sealed bids and the table. Exported by Claude in Remotion.

The short version

managers in the founding league
19
scores identical in the first independent check
287/293
automated test cases
690+
written decision records
40
guides on the sales site
29

Why it's cool

Fantasy Auction is fantasy football where every player has exactly one owner. Your group holds a real auction, in a room, with £100m each. Then the app runs the season: pick an XI before every kick-off, scores after every match, swaps between managers and blind sealed bids for new signings.

It is live now. It has scored every match for Thame Lads League, 19 managers, since 29 August 2026, running in parallel with our old setup this season. To earn that trust, I imported everyone's existing totals, let the app score everything after the switch and kept comparing the two. It holds. From next season the aim is bigger: real paying leagues and hobbyist groups, not just us.

What I had to steer

The rule I kept drilling into the agents: every point must be explainable from four facts. The player and fixture, the owner at kick-off, the XI saved for that kick-off and the scoring rules in force. If one fact is missing the app shows a failure instead of guessing. Agents love a sensible-looking default. I didn't want a single one.

The other steer was memory. Agents forget everything between sessions, so the repo remembers for them: one status page that a script rejects if it grows past 80 lines, one roadmap, a plain-English game guide and 40 dated decision records. When the FPL feed started refusing about a fifth of our requests, my call was to stop chasing the cause, measure the damage and run a month-long retry trial with a written exit rule.

What I wired together

Next.js and TypeScript on Vercel. Supabase for Postgres, auth and row-level security, across 146 migrations. Premier League statistics from the official FPL feed, a second source fenced off for penalties and API-Football ready as a fallback. Web push for the Friday team reminder, nightly encrypted backups, and a weekly scoring check where Claude in Chrome reads the old site so the app can be compared against it.

The sales site at fantasy.auction is a separate Next.js project: 29 guides, a real auction-price dataset, structured data, Search Console and IndexNow. The films were made in Remotion around the real team-pitch component with a sample squad.

Where I pushed it

This is the furthest I have taken an AI-built product: real people, real stakes and a season that does not pause for bugs. It is now built for more than one league. Two leagues share the same football facts without sharing anything private, and an organiser can sign up and set up a league without me. That groundwork is what lets it take on paying leagues next season.

The bit I am proudest of is the honesty. The first independent check matched 287 of 293 scores exactly, and the six differences sit in the open with their causes where we know them. An early website draft had a made-up founder quote and staged manager quotes. I cut them. The auction film uses an illustrated garden and says so.

Not a screenshot

See it live.

fantasy.auction homepage
Sales site The public site. Press 'Let the bids climb' in the hero to play an auction. The league app itself sits behind sign-in at app.fantasy.auction, so it stays out of the embed.

From the cutting room

More films.

Film 02 / 0:30 Auction night The first film. A generated garden illustration, the real team-pitch interface with a sample squad and original synthesised percussion. The captions describe every sound cue, so it works on mute.

The build log

From Chairman's Arithmetic to a Platform

The Question

Our league does fantasy football the old way. Everyone gets the same budget, we sit in a garden and auction the players, and once you own a player nobody else can have him. It is the best night of the football year. The rest of the season ran on an ageing website, a spreadsheet and whatever the chairman could work out in his head.

The question was simple and slightly mad: could I rebuild the whole thing, properly enough that 19 opinionated managers would trust it with their bragging rights?

The Build

The auction stays offline. That was the first decision and it has never moved. The app takes over once the squads are set: pick an XI before each kick-off, score each match from the official statistics, run swaps and sealed bids, keep the table.

The hard part was never the screens. It was trust. So every score has to be rebuilt from four stored facts, and anything ambiguous fails loudly. I imported everyone’s totals from the old site up to 29 August, let the app score everything after that, and compared the two. Then I set up a weekly check that keeps comparing.

I ran this with agents doing almost all of the typing, which meant the documents mattered as much as the code. A short status page, one roadmap, a game guide in plain English and a decision record for every rule we argued about. New sessions read those first. It is the only way a project this size stays coherent across well over a hundred agent sessions.

Then the sales job. A separate site at fantasy.auction, a guide library for organisers, and two films made in Remotion: a 30-second auction-night story and a 53-second showreel.

The Outcome

Live now. It has scored all 19 teams since 29 August, running in parallel with our old setup this season, and the numbers hold up. Self-service signup is already open. From next season the plan is to take on real paying leagues and hobbyist groups, not just ours. The FPL feed still refuses a chunk of our requests and we are partway through a retry trial with a written rule for when to switch sources.

My opinion now: the AI wrote the code, but the product is the set of rules about what the code must never do. That part was mine.