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








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.








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.








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








What I learned
- 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.
- 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.
- 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.








What went wrong
- 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.
- 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.
Talk about this








