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 thehidapi
Python 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 launchd
On 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, nottrcc
directly.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 ccusage
must work in a terminal first; the launchd agent bakes the node path into its plist at install time, so re-runinstall-agent
after Node upgrades.Limits stale— Keychain access not granted, or you're logged out of Claude Code.