Two community pull requests. The headline: polling no longer spends an inference request, so the meter stops consuming the quota it reports.
Polling was billing you
poll_api() sent a max_tokens: 1 POST to /v1/messages and read the anthropic-ratelimit-* response headers. That POST is a real inference request, so every poll counted against the 5-hour window it was measuring. At --interval 30 it is plainly visible: roughly 18% of a Pro 5-hour window burned over four idle hours with nothing running but the daemon.
The poller now reads GET https://api.anthropic.com/api/oauth/usage, a plain status query that spends nothing. Polling no longer moves the numbers, and short intervals are safe.
The device no longer sits blank after a failed first poll
Every transport waits for a successful poll before it sends anything, so a failed poll leaves the device on its logo. The common case is login: autostart beats the network up, the first call dies on DNS, and with --interval 300 the next attempt is five minutes away.
Failed polls now retry at 5s, 10s, 20s, 40s, capped at 60s and never above --interval, and reset to the normal interval on the first success. A missing or invalid token still waits out the full interval, since that one needs you to run claude setup-token.
Breaking: st changed vocabulary
The payload keys are unchanged (s / sr / w / wr / st / ok), but st now carries the session limit severity from the usage endpoint (normal, warning, rejected) instead of the rate-limit header status (allowed, allowed_warning, rejected).
Firmware that branches on the exact string needs updating:
- smalltv-mod: use 2.13.1 or newer. Older builds read
normalas a warning and light the accent dot permanently. - clawdmeter-win: unaffected, it stores
stwithout branching on it.
Full details in CHANGELOG.md.