← All work
Live · running a real league

Sports Pool OS

A football pick’em that runs itself, so the commissioner doesn’t have to.

See the front door Code on GitHub
automated tests
473automated tests
between agent checks
5 minbetween agent checks
accounts to create
0accounts to create
house cut on the pot
$0house cut on the pot
The problem

A friends’ football pool lives or dies on one person. Every week the commissioner chases picks by text, looks up scores, works out who won, splits the money and remembers who still owes. Miss one reminder and someone gets locked out; get one split wrong and it’s an argument.

Sports Pool OS hands that whole job to the app. It runs a real league with real money on the line, and the commissioner’s only weekly task is to watch the games.

Sports Pool OS front page: a frosted-glass card over a blurred football backdrop, explaining the app opens only from a commissioner’s private link
The front door is closed on purpose — the league is private, and every player comes in through their own link.
What it does

Everything the commissioner used to do by hand.

No accounts, just a link

Each player gets a private link and picks from their phone. There is nothing to sign up for and no password to forget.

Reminders timed to kickoff

The week is announced three days before the first game, with nudges a day out and three hours out, so nobody is caught by an early Thursday or Thanksgiving lock.

Scores and standings on their own

Live scores pull in automatically. Standings update as games finish, ties go to the closest guess on the total points of the tiebreak game, and the week freezes the moment every game is final.

Payouts to the cent

The pot is split across every winner, with no house cut, and the leftover cents from an uneven split are handed out so the payouts always add up to the exact pot. Anyone unpaid gets a Cash App link for the exact amount.

A forgotten pick isn’t a zero

Anyone who joined the week but never picked gets the home team filled in before the lock — a coin flip instead of an automatic loss.

A recap with some trash talk

When the week settles, Claude writes a short group-chat recap from the real results — and if it can’t, the league still gets a plain summary.

How it’s built

The decisions that matter, and why.

  1. 01

    Small agents on a five-minute clock

    A scheduled job wakes every five minutes and runs a set of narrow agents — the commissioner, the scorekeeper, the auto-picker, the recap writer. Each one only decides what should happen; a single executor does the actual work, which keeps every decision testable without a network.

  2. 02

    Doing the same thing twice is impossible, not just unlikely

    Every agent run and every message carries a key that the database requires to be unique. An overlapping timer, a manual re-run or a retry loses that insert and skips — so a reminder or a payout can’t go out twice.

  3. 03

    Money is whole cents, end to end

    Amounts are stored and calculated as integers, never decimals, so rounding can’t create or lose a penny. The payout code refuses to run if a pot has no eligible winner rather than quietly dropping it.

  4. 04

    The schedule anchors to the first kickoff, not the weekday

    The first version sent reminders on fixed days, which broke on every week that didn’t start on a Sunday. Measuring backwards from the first kickoff makes one rule right for every week shape, and a late timer still sends instead of skipping the week.

  5. 05

    The optional parts fail soft

    The AI recap falls back to a plain summary on a refusal, a rate limit or an outage. Text messages sit behind the same interface as email, switched off until they’re registered, so turning them on later is a setting rather than a rewrite.

Built with
Next.js 16TypeScriptSupabase (Postgres + pg_cron)ZodClaude APIResendESPN scores feedVitestVercel
Where it stands

Sports Pool OS is running a real league this season. The same engine can host any number of pools, so the next step is opening it to other commissioners — with text-message reminders switched on once registration is done.

Talk about a build like this