@benmalaga/absolutely
v0.1.0
Published
Spotify Wrapped for your AI coding agent. Reads your local Claude Code transcripts, counts the funny stuff (em-dashes, groveling, 'the tests pass'), and prints a shareable card. Local and read-only.
Maintainers
Readme
absolutely
Spotify Wrapped for your AI coding agent.
It read every session. It counted every em-dash. It has notes.
Your AI coding agent has been busy. It has agreed with you, apologized to you, promised that this time it would definitely work, and quietly emitted a small mountain of em-dashes while doing it. All of that is sitting in plain JSONL on your own disk.
absolutely reads those local transcripts, counts the funny stuff, and prints a
Wrapped-style stats card you can screenshot and post. It is genuinely funny and
technically real: every number on the card is a literal count from your own
sessions. Nothing is invented, nothing is uploaded, nothing is even written
back. It runs offline in a couple of seconds.
The name is a tribute to the phrase that started it all: "You're absolutely right."
Demo

Recorded against a synthetic session fixture (generic project names, no private data). Reproduce it with python3 demo/generate_fixture.py then vhs demo/demo.tape. Run it on your own sessions with just npx @benmalaga/absolutely.
Install
npx @benmalaga/absolutelyThat's it. No account, no API key, no config. It finds your Claude Code
transcripts under ~/.claude/projects and wraps them.
Install it globally and the command is just absolutely:
npm install -g @benmalaga/absolutely
absolutelyThe card
+----------------------------------------------------------+
| ABSOLUTELY |
| your AI agent, wrapped |
+----------------------------------------------------------+
| |
| 21,327 |
| em-dashes |
| A crime spree. Find-and-replace is right there. |
| |
+----------------------------------------------------------+
| |
| Tool calls 72,348 |
| in your name |
| Lines changed 768,709 |
| 665,636 added, 103,073 removed |
| Em-dashes emitted 21,327 |
| the founder's nemesis |
| Most-used tool Bash |
| 24,461 calls |
| Most-edited file src/index.js |
| 519 touches |
| Busiest hour 8pm |
| peak grind |
| Longest session 12,314 tool calls |
| one sitting |
| "Absolutely right" count 6 |
| groveling logged |
| Apologies 9 |
| all forgiven |
| Thinking blocks 19,977 |
| the quiet part |
| |
+----------------------------------------------------------+
| |
| its most-used phrase |
| "said let me / i'll just before working" |
| x 26,950 |
| |
| THE EM-DASH MAXIMALIST |
| 21,327 em-dashes. This tool exists to count them and |
| it is exhausted. |
| |
+----------------------------------------------------------+
| 1,329 sessions over 100 days |
| read-only - nothing left your machine |
+----------------------------------------------------------+In a real terminal the headline number is cyan, the stats are green, the phrase is yellow, and the superlative is in your agent's signature color of shame.
If your card made you laugh, a star costs you nothing and helps other people find it.
The behavioral lexicon
The comedy is in the counting. absolutely scans only the agent's own prose
(not your prompts, not tool output) for the tics every coding agent has:
| Stat | What it counts | | --- | --- | | Em-dashes emitted | The agent's favorite punctuation mark, totaled. The marquee number. | | "You're absolutely right" | The groveling phrase the tool is named for, plus its variants. | | Agreed with you | The wider agreement reflex: "you're right", "good catch", "fair point". | | Apologized | "I apologize", "my mistake", "sorry about that". | | Perfect / excellent | The hype reflex, applied to your code, your idea, or itself. | | Promised it would just work | "this should fix it", "now it works", "easy", "just a quick". | | Claimed the tests pass | "all tests pass", "everything is green". Citations: zero. | | Said "let me" / "I'll just" | The throat-clear that precedes every burst of work. | | Tool calls | Every Bash, Edit, Read, and Write it ran on your behalf. | | Lines changed | Additions and removals, derived from the actual Edit / Write payloads. | | Most-edited file | The one file it could not leave alone. | | Busiest hour / day | When the grind peaked, from message timestamps. | | Longest session | The single transcript with the most tool calls. One sitting. |
It picks the funniest headline number, surfaces the most-used phrase, and closes
with a roast-style superlative (The Em-Dash Maximalist, The Serial
Apologizer, Trust Me Bro It Passes, and friends) tuned to whichever tic stood
out most.
How it compares
Most tools that touch your Claude Code data are built to answer "how much did
this cost / how many tokens." absolutely is the only one built to answer "how
did my agent behave", and to make it shareable. It counts nothing you can bill.
| | absolutely | token/cost trackers | Claude Code /cost |
| --- | --- | --- | --- |
| Counts behavioral tics (em-dashes, groveling, "tests pass") | yes | no | no |
| Shareable Wrapped-style card (terminal + SVG) | yes | usually a table | no |
| Runs fully local, zero network calls | yes | varies | yes |
| Read-only (never writes to a transcript) | yes | varies | yes |
| Zero runtime dependencies | yes | varies | n/a |
| Reports token spend / dollar cost | no, on purpose | yes | yes |
If you want dollars and tokens, use a cost tracker. If you want to know how many times your agent told you that you were absolutely right, you are in the right place.
Usage
absolutely # wrap everything it can find
absolutely --limit 50 # just your 50 most recent sessions
absolutely --svg wrapped.svg # also write a shareable SVG card to post
absolutely --json | jq .totals # the raw numbers, for the curious
absolutely --dir ./some/path # analyze transcripts under a specific folderThe --svg card is an 800x1000 image in the dark Wrapped aesthetic, ready to
drop on social. It is plain SVG with zero dependencies, so it converts to PNG
with anything (a browser, rsvg-convert, Quick Look on macOS) if you want a
raster.
Privacy
This is the whole point, so it gets its own section.
- Everything runs on your machine. No account, no API key, no network calls, no telemetry. Pull your ethernet cable and it works exactly the same.
- Read-only. It opens your transcripts, reads them, and closes them. It never
writes to, moves, or deletes a transcript. The only thing it ever writes is the
SVG card, and only when you pass
--svg. - Nothing is uploaded, ever. The numbers on the card came from your disk and stay on your disk. What you do with the screenshot is your business.
- Zero dependencies. The entire tool is a handful of small files using only the Node standard library. You can read all of it in ten minutes.
What it reads
absolutely supports Claude Code, which writes one JSONL transcript per
session under ~/.claude/projects/<project>/<session>.jsonl. It parses that
format directly and tolerates partial or malformed lines without crashing.
Cursor and most other agents store chat history in SQLite rather than JSONL, so
a zero-dependency reader can't parse them cleanly yet. If your agent exports
plain JSONL logs, point absolutely at them with --dir. Support for more
agents is the most-wanted contribution (see below).
FAQ
Does it send my code anywhere? No. It makes zero network calls. The card is built entirely from local files and printed to your terminal.
Will the numbers be accurate?
Yes. Every count is a literal scan of your transcripts, and --json shows you
the raw totals if you want to check the math. The jokes are editorial; the
numbers are not.
My "you're absolutely right" count is low. Am I doing it wrong? You may have a well-behaved agent, or a custom system prompt that bans the phrase. Check your em-dash count instead. That one is never zero.
Why is em-dash counting the headline? Because it is the funniest true thing about how these models write, and because the author of this tool is contractually forbidden from using em-dashes himself. The irony writes itself, in commas.
It found no transcripts.
You either haven't run Claude Code yet, or your history lives elsewhere. Run a
session or two, or point it at your logs with --dir <path>.
Is this affiliated with Anthropic or Spotify? No. It is an independent, local, read-only parody of the "Wrapped" format. It touches your own files and no one else's services.
Contributing
The lexicon is the heart of this, and your best material is welcome. New tics to count, new superlatives, and support for more agents (especially the SQLite ones) are all great PRs. See CONTRIBUTING.md.
Recording the demo
The card is the whole pitch, so it deserves a moving picture. This is the exact sequence to cast a short, loopable clip for the top of this README and for social:
# 1. Get a clean, wide, dark terminal (about 80x40, large font).
# 2. Clear it so the recording starts on an empty screen.
clear
# 3. Run absolutely against a real history so every number is genuine.
npx @benmalaga/absolutely --limit 300
# 4. Let the finished card sit on screen for ~2 seconds, then stop.Two easy ways to capture it:
- asciinema (crisp, tiny, text-based):
asciinema rec demo.cast, run the command above, exit, then either embed the.castor convert it to a GIF withagg demo.cast docs/demo.gif. - A screen recorder (QuickTime, Kap, or
terminalizer): record the window, trim to the run, and export a GIF or short MP4.
Keep it under 20 seconds, no audio, and loopable. Drop the file at docs/demo.gif
and replace the placeholder line in the Demo section with
.
Repo setup (topics + About)
For discovery, set the GitHub About sidebar description to the one-liner above and add these repo topics:
claude-code cli developer-tools ai ai-agents wrapped stats
terminal nodejs privacy local-first humorLicense
MIT.
