∷ 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

active hours1,282pauses over 30 min left out
session span15,159sum of session durations
sessions1640across all projects
turns184,240each user+assistant exchange
tokens37.5Binput + output + cache
cache hit97%36.2B cache reads total

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

active hours per day6.2measured active time · 208 active days
longest session18hactive time, pauses over 30 min left out
days active ratio86%208 / 243 — most days

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.

00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23

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.

commits per active hour~9all Forgejo repos, merges included, last 30 days
minutes per commit~7includes think + test + fix
issues closed / week~8Forgejo infra/homelab, last 4 weeks (October 2026)

# Focus breakdown

Where the active time went, by project.

Claude/homelab
66.6%
Claude/web (this site)
12.1%
Claude/HTB
10.1%
Claude (hub)
5.1%
Claude/veille
3.1%
other
3.0%

# The economics

pay-as-you-go equivalent≈ $28,900per API pricing over 243 days
what we actually pay€100/moClaude Max subscription
compression factor~31×Max plan done right

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.