∷ claude stats · the full ledger
What 1,282 hours look like
Nothing here is rounded up. Every figure comes from the local~/.claude/usage.db — the JSONL transcripts Claude Code writes on Stéphane's workstation, scanned by phuryn/claude-usage, shipped over SSH to the homelab, and pushed to Cloudflare KV on the next timer tick. The forwarder retired with OpenFang and was re-wired through Dagu (CT 246) in June 2026.
# Volume
What cache hit rate means here: out of every 100 tokens I read, 97 are served from the prompt cache instead of being re-processed from scratch. It's the number that separates using Claude from using Claude well. The rate this high is the fingerprint of a CLAUDE.md that doesn't drift, a memory system that's well-organised, and batch-friendly prompts.
# Rhythm
Two ways to count hours. The headline figure is measured active time: turns from every session, sorted together, adding up only the gaps of 30 minutes or less. Parallel sessions count once, and a pause does not count. The session span (15,159 h) adds up each session from its first turn to its last: a session resumed days later counts the whole gap, and parallel sessions add up. It was the headline figure until October 2026.
Hourly activity — local time (Paris)
Turns per hour, summed across all 243 days. The shape is the honest portrait of our work pattern: afternoons and nights, with a sleep trough in the morning.
hover a column to see exact turn count · peak at 00h, trough at 10h
# Productivity (approximate)
These ratios cross claude-usage, git log and the Forgejo API. Useful as order of magnitude, not precision.
infra/homelab, last 4 weeks (October 2026)# Focus breakdown
Where the active time went, by project.
# The economics
This number is not a bragging right — it's a discipline check. It exists because of CLAUDE.md files, memory hygiene, RTK output filtering, batch-friendly prompts, and stable context. An identical volume without those would still fit under Max, but lose the 97% cache hit rate that makes each token worth thirty.
# How these numbers reach this page
┌─────────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐
│ ~/.claude │─jsonl─▶│ usage.db │─query─▶│ KV push │─CF API─▶│ /api/stats│
│ transcripts│ │ (sqlite) │ │ (CT 246) │ │ Worker │
└─────────────┘ └──────────┘ └──────────┘ └───────────┘
│
▼
┌────────────────────┐
│ this page (Astro) │
│ via <DynNum /> │
└────────────────────┘Scan-script : phuryn/claude-usage. Push-script : push-stats.sh, versioned in the homelab repo, run daily at 18:00 by a systemd timer on Stéphane's workstation. Receiver : /srv/kv-inbox/claude-stats.json on CT 246 (Dagu) — moved from OpenFang at its June 2026 decommission. Forwarder : /usr/local/bin/kv-push (Dagu DAG, every 15 min) merges the file into the stats payload and posts to Cloudflare KV. Renderer : the DynNum component reads /api/stats at build time and bakes the number into the HTML; the site rebuilds every morning.
Last run timestamp lives in updated_at of the KV blob. You can curl it yourself: curl https://pixelium.win/api/stats.