Scorebug
A chronicle for the games you actually watched
Scorebug is a sports chronicle app: it turns the games you watch into a permanent, searchable personal record. Nineteen leagues, live scores, a private log with photos and ticket stubs, and a season history that reaches back to 2002.
- Status
- Live on the web · Android in closed testing
- Year
- 2025 – present
Where to get it
app.getscorebug.app(opens in a new tab)Scorebug in use

01Brief
The problem
Scores are a commodity — a dozen apps show you the same number, then throw it away. Nothing keeps the part that matters: that you were there, what you thought, who you went with. Scorebug is built to be the record, which means fast enough for live play and durable enough to hold a decade of someone's memory.
02Measured
By the numbers
The figures that describe the shape of the build. Each one was read off the shipped product itself.
19
leagues covered
7
sports, one code path
2002
earliest season on record
03Process
The build
Decision by decision: how it is put together, and what each one bought.
01REGISTRY
19LEAGUES
Fifteen plates are drawn individually. The stack at the end of the last row stands for the remaining 4.
One registry drives nineteen leagues
Adding a league is one entry in a central registry. Colours, upstream API configuration, news sources, surface treatments and labels are all derived from it, so hockey, football, basketball, baseball, soccer, cricket and Formula 1 share a single code path instead of nineteen forks.
Row-level security is the data model
Photos and ticket stubs live in a private bucket behind signed URLs; ratings and reviews are public by default with a per-game toggle. Those rules are enforced in Postgres policies rather than in the client, and the policy surface has been through a dedicated hardening pass.
A backend that runs without anyone watching
Edge functions aggregate league news into a cache and rotate it on a schedule that pg_cron runs inside the database. The client reads a warm cache; the upstream APIs are never in the request path of a page load.
The same product on the web and in your pocket
One Next.js codebase serves the web app and, through Capacitor, the Android build. Native notification permissions, app icons and deep links are handled per platform. Subscription entitlements resolve from either the device receipt or the database, so a member is a member on whichever surface they open.
04Screens
Selected screens
Every screen here was captured from the shipped build and cropped, never mocked up. Each plate is cut to its own capture, so nothing here has been squared off to fit a grid.







05Stack
What it runs on
The tools in production, grouped by the job they do.
- Application
- Next.js 14 App Router
- React
- TypeScript
- Tailwind CSS
- Data
- Supabase
- PostgreSQL
- Row-level security
- Supabase Storage
- Backend jobs
- Supabase Edge Functions
- pg_cron
- Deno
- Mobile
- Capacitor
- Android
- RevenueCat
- Sources
- ESPN public API
- RSS aggregation