Now playing, in hardware
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.
—
—
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.
The cover as Spotify serves it — a 640 px JPEG, decoded at quarter scale to spare the chip.
640 × 640 pxEvery source pixel landing on a panel pixel is averaged in — not sampled. Nearest-neighbour reads as noise at this ratio.
→ 32 × 32The driver holds a fixed number of levels per channel. Fewer bits buys a faster refresh and costs you gradients.
4 bit · 4,096 colorsScaled for brightness and clocked out to the shift registers, one row at a time, faster than the eye resolves.
100% · ~120 HzThe panel holds no account credentials. It knows a single hostname and asks it a single question on a timer.
Reports the currently playing track and a URL for its cover. Nothing is ever written back to the account.
Keeps the OAuth tokens, refreshes them, and re-serves the artwork. The only party in the chain that holds a secret.
An ESP32-S3 polls on a timer, decodes the JPEG in RAM, and redraws only when the track id actually changes.
Values as flashed. The poll interval is the only one the worker can change at runtime.
| Panel | HUB75 · 32×32 or 64×64 |
|---|---|
| Driver | Adafruit Protomatter |
| Color depth | 4 bit / channel |
| Data lines | R1 G1 B1 R2 G2 B2 |
| Address lines | 4 (32²) · 5 (64²) |
| Control | CLK · LAT · OE |
| Board | MatrixPortal ESP32-S3 |
|---|---|
| Poll interval | 5 s, server-adjustable |
| JPEG decode | 1/4 scale, in RAM |
| Art size cap | 200 KB |
| Request retries | 3 × 700 ms |
| Redraw trigger | track id change only |