CB Labs

04 — REAL-TIME DISPLAYS · 2026

Signal Beacon

An LED sign on the lab wall, run from its own dashboard: printers, launches, live airspace and game day, each with designed offline and empty states.

Built
An LED sign, its renderer and its control dashboard.
Stack
Raspberry Pi, Python, HUB75 panels; an ESP32-S3 second head.
State
In use, nine screens in rotation.

IN USE · UPDATED 2 OCT 2026

Nine screens in rotation, including live airspace.

Carter Barnes · cloud engineer, federal Azure · Contact

Photo · The sign on the wall, mid-cook. Backdrop replaced in post.

What it is

A sign on the wall that tells me things without being asked. One Raspberry Pi process drives the panels, polls about 25 sources and serves its own control dashboard. Screens rotate by priority and mode, so a live game preempts the weather and the whole board dims at night.

A second, smaller sign runs on an ESP32-S3 as a thin client: the PC renders the frames and streams them, and the board just paints.

Screen capture · The sign's own control dashboard.

How it works

Panel
It started as two P5 LED matrices. It grew into eight P4 matrices, four wide by two high.
Renderer
Python, a motion loop on the Pi that runs at 30 fps while anything on screen moves and idles at 10. On the airspace screen, about 2.5 ms per idle frame and about 17 ms with 60 aircraft on the glass, against a 33 ms budget.
Type
Shapes are drawn 4× supersampled and every screen's text is anti-aliased, so a thermometer or a clock reads clean, without stair-steps.
Ingest
Sports, weather, headlines, printers, rocket launches, the grill and its meat probe, and public ADS-B, each on its own poll schedule.
States
Screens are designed for six states: normal, loading, empty, stale, offline and alert. The full matrix is rendered for the weather and system screens.
Deploy
Dry-run first, a tarball snapshot, automatic rollback. A preview mode rehearses the real board offline on the PC.
Render · Four of the sign's screens, straight from its own renderer.

By the numbers

57 screens
on the control dashboard; nine in rotation now
17 ms
per frame with 60 aircraft on screen, of a 33 ms budget
Screen capture · The NFL command deck that drives game day on the sign.

What I learned

  1. 01

    A display with no input needs a design language for failure

    Nobody can click 'retry' on a wall panel. Stale data has to look stale or it is worse than no data. The six states are the design system.

  2. 02

    One missing timeout can wedge everything downstream

    A feed parser with no timeout hung the shared daily-poll thread for twelve and a half hours. The board kept running, so nothing alarmed. A profiler on the Pi found it; every network call in the tree has a timeout now.

  3. 03

    Rehearse on the desk, not on the wall

    The preview mode renders the real board offline. Almost every bug now dies on my desk instead of on the wall.

Render · Four more, from space station to aurora.

What went wrong

  1. 01

    Saving from the dashboard crash-looped the board

    A scoreboard save on 27 Aug 2026 rewrote every league list in the settings file, not just its own, and left a bad entry in the fantasy block. The running board kept its copy in memory, so nothing showed until the next restart five days later, which crash-looped and left the sign dark for about four minutes. Every save now edits only its own key and replaces the file atomically, and a bad entry logs a warning instead of stopping boot.

  2. 02

    The airspace screen hit a rate limit

    Polling every 12 seconds while held on the glass drew a rate-limit reply about every two minutes. It polls every 20 seconds now, and dead reckoning covers the gap.

Render · Two empty states, grill offline and a quiet sky. Those are designed too.
Next · 05 / 18Golf Cart ModernizationA 2019 golf cart, rebuilt: lithium power, a relay ignition, a GPS speedometer, an aftermarket shifter, WLED lighting and printed speaker pods.