# Under the Hood: The Sideline Board

By David Skelton - 2026-07-30 - https://skeltonmedia.com/blog/under-the-hood-sideline-board.html

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](assets/os/sideline-config.webp "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](assets/os/lineup-engine.webp "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, so 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](assets/os/sideline-bebas.webp "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 every agent in my system follows: 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.