A desk HUD that shows live Claude usage on a Thermalright Trofeo Vision 6.86" LCD (1280×480, USB-C, ~$38), driven from macOS. Inspired by the r/ClaudeAI "$38 Claude LCD Table Display" post.
What it shows: Pro/Max session + weekly limit bars with reset countdowns (from Anthropic's usage endpoint), today's tokens and hypothetical API cost (via ccusage), the live session (project, model, burn rate), a clock, and an hourly token sparkline.
- macOS, Python 3.12+, uv, Node (for
npx ccusage) brew install hidapi(C library behind thehidapiPython package)- Claude Code installed and logged in (the HUD reads its local logs and its OAuth token from the Keychain — read-only, nothing leaves your machine except the usage query to api.anthropic.com)
uv sync
uv run python -m claude_trofeo_hud preview # render mock layout to out/preview.png
uv run python -m claude_trofeo_hud run # live HUD on the LCD (Ctrl-C stops)
uv run python -m claude_trofeo_hud install-agent # start at login via launchdOn the first run, macOS asks for Keychain access to "Claude Code-credentials"
— choose Always Allow so the daemon can run unattended.
uninstall-agent stops and removes the launchd agent. Config lives in
config.toml (fps, JPEG quality, night dim/off hours). Logs go to
~/Library/Logs/claude-trofeo-hud/.
The panel is not a monitor — it's a USB HID device (VID:PID 0416:5302) that
accepts JPEG frames over a reverse-engineered protocol. We use the device
classes from thermalright-trcc-linux
with its HidApiTransport (IOHIDManager), bypassing its CLI — trcc's default
transport routes through libusb, which macOS blocks for HID devices. The
firmware blanks when idle, so the HUD streams continuously (default 2 fps).
See PLANNING.md for the full protocol notes.
- "Access denied (insufficient permissions)" — something is opening the
device via libusb instead of hidapi; make sure you're running our CLI, not
trccdirectly. - Panel shows boot logo / blanks — no frames arriving; check
~/Library/Logs/claude-trofeo-hud/hud.log. Unplug/replug is handled automatically with backoff. - Empty cost/tokens —
npx ccusagemust work in a terminal first; the launchd agent bakes the node path into its plist at install time, so re-runinstall-agentafter Node upgrades. - Limits stale — Keychain access not granted, or you're logged out of Claude Code.
