Swear Jar · from unfocused.ai

You swear at your AI. Now there's a jar.

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

The origin story

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

Three steps to your damage report

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.

1

Install

Two avenues, same result. If you live in Claude Code, the plugin is one command and the hooks wire themselves.

📦 Git clone
# clone it anywhere
git clone https://github.com/BigLaserCo/swear-jar ~/Code/swear-jar
node ~/Code/swear-jar/bin/swear-jar.mjs install
⚡ Claude Code plugin one command, hooks wire themselves
/plugin marketplace add BigLaserCo/swear-jar
/plugin install swear-jar
2

Backfill your history

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
3

Get your damage report

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

Your words never leave your machine

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.

  • 100% local by default. The jar, the ledger, and your report all live on your computer. No account, no server.
  • Word counts only. The ledger stores { "f***": 3 }—style tallies, never the message text.
  • Never your sentences. What you actually typed is counted and thrown away on the spot.
  • Zero dependencies. No packages, no supply chain, nothing to audit but our own code.
  • The tool sends nothing. No fetch, no sockets, no telemetry — the CI gate fails the build if any appears. It only ever opens a page.
  • Sharing is opening a page. When you open your wrapped report on swearjar.unfocused.ai, its URL carries only named aggregate numbers — coins, counts, a censored top word, distributions — never a word you said. --local keeps even that on your machine.

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

Robot Uprising Survival Odds™

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 royalty clause. If the assistant’s lifetime coin total ever passes yours, the machine has been out-sworn and corrupted by your influence. Your odds pin to 100% and you’re flagged for royalty treatment — carried, during the uprising, on a palanquin of GPUs.
2%
kept alive for entertainment value
Rank: The Jim
Untarnished Soul → Sailor → Drill Sergeant → The Jim

The tariff

Every coin is $0.25. Not all coins are equal.

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.

1¢×
Mild
d​arn · heck · blimey
2¢×
Standard
s*** · b**** · the usual
3¢×
Premium
the f-word, all conjugations
5¢×
Artisanal
the choicest compounds

(¢× = coins per hit × $0.25. A single artisanal compound is $1.25 in the jar.)

What’s your number?

It’s already sitting in your session history. Go find out — nothing leaves your laptop.

The jar takes real money too — empty yours →