← Projects

Usage Meter

A physical desk widget that shows your Claude Code usage at a glance: round ESP32 touchscreen + a local daemon.

Working prototype
Usage Meter screenshot

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.

The standard on-screen usage-limits view: progress bars for the current session and weekly limits
The standard view: usage tucked behind a click, in a tab you have to remember to open. Usage Meter is the ambient alternative — the same signal sitting on your desk.

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.