back

under the hood · 2026-07-30 · 2 min

Under the Hood: The Sideline Board

A game-day sideline board built as data plus a renderer — how the same content-in-files pattern behind DavidOS handles live cards.

Sideline board interface showing live game-day cards

I coach a 7v7 rec team — the Nacho Ninjas, 3rd and 4th graders, two 25-minute halves. Every rec coach knows the real problem isn't tactics: it's making sure every kid plays a fair share while you're also refereeing snack disputes.

The brief was three constraints

Not features — constraints. Equal playing time, verifiable, not vibes. Works at a field with no signal. Operable with one thumb while watching a game. I told the OS what had to be true and let the design fall out of that.

A markdown config file listing game format, ball size, halves, and formation
The constraints as a file. Format, halves, and formation live here, so changing the league rules never means editing code.

What came back, and what we refined

The first output was a lineup engine plus a tap-to-sub board. The engine got tested against the thing that actually matters: it schedules every present player to within one five-minute window of equal time, and that's verified in the data, not asserted — the roster lives in a markdown file, a render script produces the board, and the math is checkable.

Python source for the lineup renderer reading configuration from markdown
The renderer reads the config and the roster. Nothing about the format is hardcoded, which is why a league rule change is a one-line edit.

The offline constraint shaped everything visual. No web fonts you can't guarantee — the display face is embedded straight into the file so the board opens from a phone's files app with airplane mode on. Giant condensed type, because sideline legibility in sunlight is a real requirement, not an aesthetic.

The sideline board header in tall condensed capitals on a dark screen
Bebas Neue, embedded as a data URI. The board opens from a phone in airplane mode and the numerals read at arm’s length in sun.

One governance detail I'm stubborn about: the board still runs on a sample roster. Real kids' names don't go into a system until I put them there deliberately — the tool ships gated, marked clearly, waiting for me. That's the same rule my job-search and finance agents follow: the human loads the sensitive data, never the machine by default.

Update, August 19, 2026: the real roster is loaded now — I put it there before the season started, which is exactly the step this paragraph describes. The board shipped gated; the gate opened when I opened it.

Why this is on a design portfolio

Because it's the shape of every good AI collaboration I've had: the human brings constraints that are actually true about the world, the system proposes, the output gets verified against the constraint rather than admired. A pretty board that shorted some kid four minutes would be a failure. This one can prove it doesn't.

share