Usage Meter
A physical desk widget that shows your Claude Code usage at a glance: round ESP32 touchscreen + a local daemon.
Working prototype
Summary
Usage Meter is hardware: a round 2.8" ESP32-S3 touchscreen that sits on the desk and renders Claude Code usage as a typography-led UI with an arc bar around the bezel. Tap to flip between a primary view and a detail view. It updates every 30 seconds and has dignified error states, including a live countdown when you're rate-limited.
Why it exists
Usage limits are invisible until you hit them, and a dashboard tab you have to go check isn't ambient. A small object in peripheral vision is. It's also a deliberate exercise in taking a product from idea to physical artifact solo: firmware, daemon, UI design, and enclosure, with a commercial assessment to follow the personal v1.
How it works
Two halves. A small daemon (Bun + TypeScript, single binary, auto-starts on Windows and macOS) runs on the dev machine, polls Anthropic's usage endpoint using the local OAuth token, and serves the result as JSON on the local network. The token never leaves the machine. The ESP32 firmware polls the daemon, renders the UI, syncs time over NTP, persists brightness settings, and takes over-the-air updates on the LAN.
The hard parts
The display fought back: a corruption saga of magenta flashes, rainbow noise, and pinstripes that traced to RGB timing, a wrong color mode, and cache/DMA tearing. Fixed with explicit cache syncs, double framebuffering, and a lower pixel clock, then a migration off hand-rolled display code onto the official panel library.
Stack
- Waveshare ESP32-S3 round display 2.8", 480×480, touch
- ESP32 firmware ESP32_Display_Panel, OTA over LAN, NTP, NVS persistence
- Bun + TypeScript daemon single binary, LAN JSON endpoint
- 3D-printed enclosure CAD iterations in progress
Status
Working prototype, live on the desk now. Enclosure design is in its second CAD iteration; the commercial read comes after v1 ships.