A physical dashboard for Claude Code and Codex. Lives next to your keyboard. Streams the current session, the running tool, the token spend. Tap to approve or deny.
The toolkit is esp-harness. The protocol is one-line JSON. The bridge is a single Python file. No cloud, no telemetry, no daemon you can't read.
Gentle "zZz" pulse. No agent has emitted an event in 60 s.
One row per agent. Status pip, cwd, last 3-5 transcript entries. Totals header.
Tool name, command preview, BOOT to approve, USER to deny. 60 s timeout.
Cumulative + today's spend. 24 h sparkline. Per-agent breakdown.
Battery, heap, uptime, build info. The "is the box healthy" view.
Claude Code's hook system calls hook_dispatch.py on every
PreToolUse / PostToolUse / Stop.
Codex's JSONL stream is tee'd through codex_wrapper.py.
Both forward to the long-running claude_buddy_bridge.py
which aggregates per-agent state and throttles pushes to ≤ 1 / 250 ms.
Read the host integration doc →
dash snapshot for periodic state, dash prompt
when blocked on approval, dash event for transient
transcript lines, dash tokens for spend, dash idle
to sleep. Replies are OK: / ERR: / EVT:
framed by esp-harness's console_protocol. v1 over USB-Serial.
Read the protocol spec →
Firmware built on the esp-harness scene framework
(LVGL 9.x, ESP-IDF v6.0+). Five scenes registered through
harness_scene_register. BOOT & USER buttons routed
into EVT: permission id=… decision=… events back to
the bridge.
| Project | Transport | Agents | Hardware | Approval button |
|---|---|---|---|---|
| claude-desktop-buddy | BLE (NUS) | Claude Desktop (single) | nRF reference / generic BLE | — display only |
| claude-dashboard plugin | in-app status line | Claude Code | none (lives in your terminal) | — no hardware |
| esp32-agent-dashboard (this repo) | USB-Serial → BLE → WiFi | Claude Code + Codex (multi-agent) | Waveshare ESP32-S3-Touch-AMOLED-2.16 | ✓ BOOT / USER + 60s timeout |
Multi-agent dashboard over USB-Serial. Claude Code hooks + Codex wrapper, five scenes, physical approval button, TCP mock for CI.
Nordic UART Service for tetherless Claude Desktop pairing. Same wire format, just framed over BLE characteristics. No USB cable on your desk.
Headless dev box on a server, dashboard on your desk. mDNS discovery, TLS to localhost relay, USB fallback when the network's down.