rgbtrix
rgbtrix / hardware note
Rev. C HUB75 · ESP32-S3

Now playing, in hardware

Album art, averaged down to 1,024 lit pixels.

rgbtrix reads what's on your Spotify session and paints it onto a physical LED matrix. The cover gets box-filtered from 640 px to 32 px, quantized to what the driver can actually hold, and pushed to the panel every few seconds. Everything to the right is that pipeline, running live.

Resolution
32 × 32
Color depth
4 bit
Palette
4,096
Poll
5 s
Panel output — simulated Running
32 px

4
100%

What happens to a cover on its way to the wall.

Four stages, each one throwing away information the panel could never have shown. The output is the last frame — move the controls above and every stage recomputes.

Stage 01

Source

The cover as Spotify serves it — a 640 px JPEG, decoded at quarter scale to spare the chip.

640 × 640 px
Stage 02

Box filter

Every source pixel landing on a panel pixel is averaged in — not sampled. Nearest-neighbour reads as noise at this ratio.

→ 32 × 32
Stage 03

Quantize

The driver holds a fixed number of levels per channel. Fewer bits buys a faster refresh and costs you gradients.

4 bit · 4,096 colors
Stage 04

Emit

Scaled for brightness and clocked out to the shift registers, one row at a time, faster than the eye resolves.

100% · ~120 Hz

Three hops, one of them trusted.

The panel holds no account credentials. It knows a single hostname and asks it a single question on a timer.

Hop 01 — read only

Spotify

Reports the currently playing track and a URL for its cover. Nothing is ever written back to the account.

Returns: track id, art url, play state
Hop 02 — trusted

Worker

Keeps the OAuth tokens, refreshes them, and re-serves the artwork. The only party in the chain that holds a secret.

Holds: refresh token, client secret
Hop 03 — the wall

Panel

An ESP32-S3 polls on a timer, decodes the JPEG in RAM, and redraws only when the track id actually changes.

Holds: wifi password, one hostname

Bill of specifics.

Values as flashed. The poll interval is the only one the worker can change at runtime.

Display

PanelHUB75 · 32×32 or 64×64
DriverAdafruit Protomatter
Color depth4 bit / channel
Data linesR1 G1 B1 R2 G2 B2
Address lines4 (32²) · 5 (64²)
ControlCLK · LAT · OE

Behaviour

BoardMatrixPortal ESP32-S3
Poll interval5 s, server-adjustable
JPEG decode1/4 scale, in RAM
Art size cap200 KB
Request retries3 × 700 ms
Redraw triggertrack id change only