Monthly · Claude Code usage

Your month in Claude Code, beautifully wrapped.

A Spotify-Wrapped-style card of how you actually code — tokens, spend, top projects, model split, and your coding persona. Generated from your local logs.

View on GitHub →

Reads local logs·Nothing uploaded·Open source·Node 18+

A sample Claude Wrapped card showing total tokens, spend, top projects, model split, an activity heatmap and a coding personaThe same Claude Wrapped card rendered in the warm near-black dark theme
01

Inside your card

Every panel is computed from your real usage — no vanity metrics, just the numbers that tell the story of your month.

1.94B
Total tokens
across 18.2K messages
$1,480
Spent
computed from LiteLLM pricing
94.0%
Cache hit rate
served from cache
27/31
Active days
12-day longest streak
Total tokens
Everything you ran through Claude Code this month, headlined.
Spend
Real cost from per-model LiteLLM pricing — computed, not estimated.
Top projects
Your biggest repos by spend, with worktrees rolled into the parent.
Model split
How spend divides across Opus, Sonnet, and Haiku.
When you code
A 7×24 heatmap of your week, peak hour called out.
Coding persona
Night Owl, Early Bird, Daylight Coder, or Evening Hacker.
Models by spend
Opus70%
Sonnet27%
Haiku3%
When you codePeak · 10 PM
02

Built to be trusted

A wrap-up of your usage shouldn't cost your privacy or your confidence in the numbers. This one earns both.

Private by default

Nothing leaves your machine

It reads your local logs and renders the PNG offline. The only network call is a price table — and --offline skips that too.

Real pricing

Costs, not guesses

Spend is computed from per-model LiteLLM rates — the prices Anthropic actually bills.

Zero setup

One self-contained binary

Node 18 and nothing else. Fonts and a pricing fallback are embedded, so the first run just works — even on a plane.

03

How it works

Four steps, entirely on your machine. The price table is the only thing fetched — and there's a bundled fallback for when you're offline.

01

Load

Streams every *.jsonl under ~/.claude/projects line-by-line and dedups resumed sessions.

~/.claude/projects
02

Price

Fetches the LiteLLM price table — cached 24h, with a bundled fallback for offline.

LiteLLM · cached
03

Aggregate

Totals, cache rate, top projects, model split, peak hour, persona and streaks — in your timezone.

WrappedStats
04

Render

Satori turns flexbox into SVG; resvg rasterizes a crisp 2160×2700 PNG with fonts embedded.

Satori → resvg
05

Install & usage

One command. No config, no account, no upload.

claude-wrapped-cli
$ npx claude-wrapped-cli
# current month → ~/Desktop, then opens it
 
$ npx claude-wrapped-cli --month 2026-05 --dark
FlagDescription
--month <YYYY-MM>Month to summarize. Defaults to the current month.
--output <path>Where to save the PNG. Defaults to ~/Desktop.
--timezone <iana>Timezone for date grouping. Defaults to system local.
--darkRender the warm near-black dark theme.
--offlineUse cached/bundled pricing — no network.
--scale <n>Render scale. 2× → a crisp 2160×2700 PNG.
--no-openDon't open the image after saving.
--jsonPrint the computed stats as JSON to stdout.
04

Which coder are you?

Your peak hour decides your persona. There's no wrong answer — only an honest one.

🦉

Night Owl

Peaks after midnight

The repo is quietest exactly when you ship.

🐤

Early Bird

Dawn commits

First pull request in before the standup.

☀️

Daylight Coder

Peak · 4 PM

Locked in through the afternoon stretch.

🌙

Evening Hacker

After dinner

Comes alive for golden-hour debugging.

06

Questions

No. It reads your local ~/.claude/projects logs and renders a PNG on your machine. The only network request is the LiteLLM price table — and --offline skips even that.

Tokens are read straight from your local logs, and cost comes from per-model LiteLLM pricing — the rates Anthropic actually bills. Nothing is estimated.

It groups by your system-local timezone so “your May” is genuinely your local May. Prefer UTC? Pass --timezone UTC.

Node 18 or newer. That's it — the fonts and a pricing fallback are bundled into the binary, so there's nothing else to set up.

It looks in ~/.claude by default. If yours is elsewhere, set the CLAUDE_CONFIG_DIR environment variable and it'll read from there.