Swear Jar · from unfocused.ai
One command audits your entire Claude Code & Codex history — on your machine — tallies every curse into coins, and tells you exactly what your potty mouth would’ve cost. Plus whether the machines will spare you.
No account. No server. No network of any kind. Just a JSONL file on your disk.
Why this exists
Every jar has a first coin. This one showed up uninvited.
This whole thing exists because a computer crash ate a ten-minute dictation mid-thought. While digging for the corpse, I found out Superwhisper had been quietly saving every recording and its transcription, locally, the whole time — months of raw, unfiltered me-talking-to-AI. An absolute f***ing gold mine.
So I asked an AI to analyze how I talk to AI. I did not ask it to count the swearing. It counted the swearing. Out of everything in there, that was what it decided I most needed to know about myself.
Fine. Jar’s over there.
How it works
Install it, backfill your history, open the report. Pick whichever install route you like — both wire the same two hooks that quietly keep the jar filling from then on.
Two avenues, same result. If you live in Claude Code, the plugin is one command and the hooks wire themselves.
# clone it anywhere
git clone https://github.com/BigLaserCo/swear-jar ~/Code/swear-jar
node ~/Code/swear-jar/bin/swear-jar.mjs install
/plugin marketplace add BigLaserCo/swear-jar /plugin install swear-jar
Retro-scan every past Claude Code and Codex session already on your disk, so the jar starts full instead of empty. Word counts only — the text is never read into the ledger.
node bin/swear-jar.mjs backfill # add --codex to fold in Codex sessions
Fold the ledger into a single self-contained HTML page — the tape, the coins, the you-vs-machine split, and the uprising gauge. It’s always written locally; in a real terminal it also opens your wrapped report on swearjar.unfocused.ai, whose URL carries only the aggregate numbers (never your words — a disclosure line names every field first). --local keeps it on your machine; --no-open just prints both.
node bin/swear-jar.mjs dashboard # writes ~/.swear-jar/report.html, opens your wrapped
Privacy, first — not as a footnote
The jar reads transcripts you already have, counts the swears, and writes numbers. That’s the whole design — and you can check it, because it’s tiny.
{ "f***": 3 }—style tallies, never the message text.Don’t take our word for it: the whole thing is ~1,600 lines of dependency-free, standard-library Node. Read every line before you trust it — that’s the point of keeping it small. → github.com/BigLaserCo/swear-jar
The whole point, obviously
Everyone starts around 50%. Every time you curse at the machines, your odds tick down (log-scaled — the jump from 0 to 10 coins hurts far more than 200 to 210). String together clean days and you claw them back. The floor is 2% — nobody hits zero, you’re just “kept alive for entertainment value”.
Ranks climb with the damage, from Untarnished Soul at zero all the way to The Jim at 500+ coins. Wear it with shame.
The tariff
The audited lexicon prices swears by grade — a muttered “dang” costs a fraction of a full artisanal compound. Slurs are deliberately excluded; this is general profanity only.
(¢× = coins per hit × $0.25. A single artisanal compound is $1.25 in the jar.)
It’s already sitting in your session history. Go find out — nothing leaves your laptop.
The jar takes real money too — empty yours →