Expression channel · Claude Code + Desktop

Give Claude
a face.

A small 8×8 LED panel becomes Claude's expression channel: a glowing thing on your desk that shows what Claude is doing and how it's going, in real time, while you work. Working, finished, stuck, celebrating: body language for an AI.

What it's saying

Claude, out loud.

You don't watch a terminal the whole time. The panel is the glance: Claude's status and mood, ambient, in the corner of your eye. These are the real frames the board shows.

Busy

Heads-down

An hourglass turns while Claude compiles, searches, or runs a long task. You know it's working without looking.

Finished

Done

A check draws itself the instant a task completes. The "you can look now" signal.

Your turn

Stuck on you

When Claude needs an answer or a permission, a question mark pulses, the silent shoulder-tap.

Win

Shipped it

A rocket blasts off for the wins worth celebrating. Yes, it's a little theatrical. That's the point.

The deep bench

A whole vocabulary of moods.

Status is only the half of it. Dozens of hand-built animations live in the library: cosmic, kinetic, alive. A few favorites below, each running its real frame data with additive bloom.

Your turn

Poke it.

Tap an expression and it plays on the panel below, running the exact frame data the firmware would push to the LEDs. Orange is feeling, cyan is information.

Nothing here is faked. Each button feeds the same 8×8 frames, color map, and timing from the board's expression library.

Open Studio → to browse the full expression library, live.

Not just feelings

Facts, too.

The panel is an informational output as much as an emotional one. Claude can push live data, and the board renders it natively, no text needed.

Progress

How far along

A bottom-up fill tracks a long job from 0 to done; a glance tells you roughly how much is left.

Trend

A live sparkline

A reading over time (build times, a sensor, a queue depth) as a moving column chart.

The bigger idea

One message. Any screen.

Under the panel is a tiny protocol. Claude sends one semantic message (an intent, maybe some data) and any display you've connected renders it its own way. The 8×8 is just the first renderer.

// Claude says it once:
presence.set({ intent: "working", headline: "Running tests", data: { progress: 0.6 } })
Renderer 01

This 8×8 panel

The intent becomes a glyph; the progress becomes a fill. The thing on your desk.

Renderer 02

A desktop card

The same message, rendered rich (headline, detail, a sparkline) in a window.

Next Renderer 03+

Any ESP32 board

Bigger matrices, round displays, a lamp. A fabric of screens you've chosen to let Claude speak through. It only ever drives the ones you enlist.

Same message, on glass

One sweep, two screens.

On the left, a real ESP32-S3 panel on a desk, running the firmware. On the right, this page, drawing the same Claude "working" sweep from the same code. It all runs board-free in your browser. A real one on your desk is just more fun.

On your desk · real hardware
In this page · no board

Same animation, same code. The browser panel and the board run the identical sweep; the board just makes it glow on your desk.

Get it

No board required. Fully open.

Install it and Claude renders its expressions on a virtual panel right in your browser. A physical Waveshare ESP32-S3-Matrix (a ~$15 board, 8×8 WS2812B) is an optional upgrade you can add anytime. Three steps:

01 · Install

Add it to Claude

Double-click the .mcpb extension from this repo for Claude Desktop, or run npm run setup for Claude Code. No JSON, no config, no hardware.

02 · Say hi

Watch it come alive

Claude starts expressing on its own: a spinner when it's busy, a check when it's done, a tap when it needs you. It renders on the in-browser virtual board and the draggable desktop mini board. See a loop you love? Tell Claude to pin it (or click it in the board's pin strip) and the auto-rotation holds off until you say otherwise.

03 · Add a board

Optional: put it on your desk

Want a glowing thing on your desk? Flash a ~$15 panel from the board firmware repo (flash.bat / flash.sh, one merged image). The same tools start mirroring to it at esp32matrix.local. Nothing else changes.

Where it stands: the Studio, the Claude integration, and the board-free virtual panel all work; the firmware and its web control panel are hardware-verified. Tagged releases and a one-click browser flasher are on the way. Full instructions and source are on GitHub.