Skip to content
Product

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

Scorebug in use

Two phones showing Scorebug: the home dashboard alongside The Slate's list of the day's games
Fig. 01 — Scorebug

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.

Dia. 01One central registry, nineteen leagues. A single entry sets a league's colours, its upstream API configuration, its news sources, its surface treatments and its labels, which is how hockey, football, basketball, baseball, soccer, cricket and Formula 1 all run down one code path instead of nineteen forks. Adding the twentieth league is a data change.
  1. 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.

  2. 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.

  3. 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.

  4. 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

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.

Scorebug's home dashboard showing The Log, The Almanac, a month calendar and The Docket of upcoming games
, open Fig. 02 at full size
Fig. 02Home: the calendar, the Docket of games you have lined up, and the way into the Log.
Scorebug's Slate listing live and finished games beside the full month calendar
, open Fig. 03 at full size
Fig. 03The Slate puts every league on one card, with the calendar behind it.
Scorebug's game rating screen with a 4.0 out of 5 dial and a written note
, open Fig. 04 at full size
Fig. 04Rate and journal. A finished game becomes a rated, written entry.
Scorebug's Vault, a searchable archive of logged games with ratings and notes
, open Fig. 05 at full size
Fig. 05The Vault: every score, note and rating, searchable by team.
Scorebug's Franchise view showing a combined 61-65-0 record across favourite teams
, open Fig. 06 at full size
Fig. 06Franchise rolls every team you follow into one record.
Scorebug's Wire news feed with pinned leagues, followed clubs and top stories
, open Fig. 07 at full size
Fig. 07The Wire: league news aggregated server-side on a schedule, served from cache.
Scorebug's Bleachers, a stadium map for picking which sport's conversation to join
, open Fig. 08 at full size
Fig. 08The Bleachers. Fan takes, grouped by the sport you came for.

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

Next project — Product

An orbital odyssey: build the ship, then fly it