Load
Streams your local logs line-by-line and dedups resumed sessions — for both agents.
A Spotify-Wrapped-style card of how you actually code — across Claude Code and Codex. Tokens, spend, top projects, model split, and your coding persona, straight from your local logs.


Every panel is computed from your real usage across both agents — no vanity metrics, just the numbers that tell the story of your month.
A wrap-up of your usage shouldn't cost your privacy or your confidence in the numbers. This one earns both.
It reads your local logs and renders the PNG offline. The only network call is a price table — and --offline skips that too.
Spend is computed from per-model LiteLLM rates for both Anthropic and OpenAI models.
Node 18 and nothing else. Fonts and a pricing fallback are embedded, so the first run just works — even on a plane.
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.
Streams your local logs line-by-line and dedups resumed sessions — for both agents.
Fetches the LiteLLM price table — cached 24h, with a bundled fallback for offline.
Totals, cache rate, top projects, model split, peak hour, persona and streaks — in your timezone.
Satori turns flexbox into SVG; resvg rasterizes a crisp PNG with fonts embedded.
One command. No config, no account, no upload.
$ npx claude-wrapped-cli# both agents → one combined card, then opens it$ npx claude-wrapped-cli --codex --dark
| Flag | Description |
|---|---|
| --claude | Only track Claude Code — a standalone card. |
| --codex | Only track Codex — a standalone card. |
| --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. |
| --dark | Render the near-black dark theme. |
| --offline | Use cached/bundled pricing — no network. |
| --scale <n> | Render scale. 2× → a crisp high-res PNG. |
| --no-open | Don't open the image after saving. |
| --json | Print the computed stats as JSON to stdout. |
Your peak hour decides your persona. There's no wrong answer — only an honest one.
The repo is quietest exactly when you ship.
First pull request in before the standup.
Locked in through the afternoon stretch.
Comes alive for golden-hour debugging.
Yes. By default it reads both and renders one combined card. Pass --claude or --codex for a standalone card, or if you only use one agent it renders that one automatically.
No. It reads your local ~/.claude/projects and ~/.codex/sessions 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 for both Anthropic and OpenAI models. Nothing is estimated; Codex models not in the table show $0.
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.
Claude in ~/.claude and Codex in ~/.codex by default. If yours are elsewhere, set CLAUDE_CONFIG_DIR and/or CODEX_HOME and it'll read from there.