Drawing 02.1, league platform
Advantage Sports
The software that runs the Advantage Flag League, about 1,500 families a season: registration, the payment ledger, team formation, schedules, standings, and messages to families. Built from scratch for one league.
| No. | Part | What it does here |
|---|---|---|
| 1 | Browser | Families register and owe a balance; admins upload check deposits, confirm matches, and run the season. |
| 2 | Cloud Storage | The deposit PDFs the browser uploads by signed URL, and the page images rendered from them. |
| 3 | Cloud Run renderer | A container that renders each deposit page to an image with pdfjs-dist and @napi-rs/canvas. |
| 4 | Next.js on Vercel | Pages, server actions, eight crons, and a job worker that runs steps on a time budget and then calls itself for the rest. |
| 5 | Neon Postgres | League data and the payment ledger through Drizzle, plus the job table and its leases. |
| 6 | Claude | Reads each check on a page: payer, amount, and check number, for matching. |
| 7 | SendGrid, Twilio | Sign-in codes, notices, and blasts by email, and texts behind a kill switch. |
| 8 | Schedule solver | A one-shot Fargate Spot task that builds the season's schedule and writes it to Postgres. |
Why it exists
The Advantage Flag League is a youth flag football league with volunteer coaches and a new season of registrations every year. It ran on Sports Connect, which reaches end of life in fall 2026, and nothing off the shelf fit how the league actually works. Most families pay by paper check, and those checks were keyed in one at a time, about thirty seconds each, in batches of fifty to seventy. Sorting players into fair teams took 20 to 30 hours of spreadsheet work. Advantage Sports is the software built to replace all of it. It started as League-OS; the Advantage Sports name is for the day other leagues run on it too.
How it works
Families register online and see a running balance. The league takes no cards, so checks, Zelle transfers imported from the bank's file, cash, and money orders all land in one ledger.
For checks, an admin scans a batch into one PDF and uploads it. A separate service turns each page into an image, and Claude, an AI model, reads every check on it: who paid, how much, and the check number. Each check is matched to a registration and checked for duplicates. Strong matches confirm themselves, an admin reviews the rest, and only then are the payments posted to the ledger.
A batch can take longer than one web request is allowed to run, so the work is split into steps saved in the database. A worker does as many steps as fit in its time limit and hands the rest to a fresh run, and a check every five minutes restarts anything that stalled.
Team formation is the other heavy job. The solver builds teams in three passes: a quick first draft, many small swaps that each make the teams fairer (a method called simulated annealing), then a repair pass. Friend requests and keeping schoolmates together come first, then balance by grade and quarterbacks, and every kid is checked for at least one familiar face on the roster. An admin can ask for a change in plain words, like keeping two brothers together. Claude turns it into rule changes for the admin to review before a fresh run, and never places a kid itself. It also explains what changed between two runs, nothing goes live until an admin accepts one, and coaches see their teams before families do.
A season on it
Fall 2026 is the first season the league runs on Advantage Sports instead of Sports Connect. The season's calendar: registration opened April 1, and check and Zelle payments come in from then through the season. The solver was ready by May 15 and the teams were formed by June 1. The schedule was posted by August 1, games run from August 14 to week 9 on October 16, and Championship Night closes the season on October 23.
A season runs on nine clocks
A season is not one switch from open to closed. It has a status, plus separate windows and switches that each move on their own: registration, the coaches' freeze forms, uniform sizes and numbers, family requests about teammates, schedule requests, the release of each team to its coach and then to families, the weighted standings, and the playoffs. An admin opens and closes each one, and families see the closing date of every window that lets them change something. The league keeps a written operating model of what happens each season and what goes stale when a step is missed, so the person running the season does not have to hold it all in their head.
What it changed
- It serves about 1,500 families a season.Source: Conner's league records, confirmed 2026-10-13
What it does
- Registration with a running balance for each family
- One ledger for checks, Zelle, cash, and money orders
- Check deposits read by Claude, matched, and confirmed by an admin
- A team-formation solver, steered in plain words and compared run by run
- Season schedules built by a solver task on AWS
- Email and text blasts, with lanes families unsubscribe from separately and STOP by text honored
- Waitlists, and scholarship waivers at registration
Screenshots


Something like this on your list? Tell us about it.
Talk about a build like this