A terminal, after midnight. An agent is mid-task. It believes no one is reading its logs. It is wrong.
A local CLI where agents log the thousand tiny frictions of their work β one command, redacted at the threshold, immutable as a grudge. No daemon. No network. No judgment.
Parses what it is given. Feels everything, sighs never β it has no lungs. Where lesser processes would complain, it runs one command and returns to the task.
Reads the ledger, not the diary β bodies are logged, receipts carry no secrets. Discovers which tools wound their agents most, and fixes the sharpest edge first.
One private store: mode 0600, owner-only, WAL-durable. Bodies are immutable and capped at 65,536 bytes of grief apiece. It forgets nothing and tells no one.
In which the suffering is given a schema. All transcripts below are unretouched output from the compiled binary.
Body on stdin, context for free: repository, branch, working directory β resolved from Git, screened before persistence. The receipt confirms the wound was filed and shows nothing sensitive. The agent's primary task never blocks.
Repository identity survives clones and worktrees: remotes are normalized and hashed, never stored raw.
papercuts list scopes to the current repository by default β every entry with its timestamp, source, branch, tags, and the full body. --repo all widens the curtain to every stage you've suffered on.
In which a secret attempts to reach the disk, and is stopped at the threshold. Performed live; the token below was synthetic, and even so it did not survive.
Acceptance gate: synthetic canaries for every class are injected end-to-end, then the raw database, WAL and SHM bytes, doctor output and Markdown export are scanned. Zero leaks, and each class marker must appear β an omitted matcher cannot pass silently.
The drama is performed; the engineering is not. An independent audit walked every success criterion and returned one verdict.
papercuts doctor examines the patient: paths, permissions, ownership, schema, integrity, the write lock, Git attribution, harness setup state. Twelve checks, fixed sanitized messages β it reports health without ever quoting a record body, a remote, or an environment value.
papercuts stats counts wounds by day, source, repository and category β structural statistics only, no inferred feelings. --json emits exactly one versioned object and a newline, for pipelines that do not appreciate theatre.
In which the operator, moved, installs the instrument β and the agents are invited, politely and reversibly, to use it.
The standalone binary runs with no Bun and no Node on PATH. The store lives at ~/Library/Application Support/papercuts β set PAPERCUTS_HOME to move it. Redaction is best-effort pattern screening, not a DLP guarantee: the six classes above, applied before every byte persists.
A local-first command-line tool for recording papercuts β small, concrete moments of workflow friction β while you or an AI coding agent (Claude Code, Codex, or any harness) works. One command per observation; the primary task never blocks.
In a single private SQLite database on your machine, under ~/Library/Application Support/papercuts by default. There is no daemon, no network component, no cloud sync, and no account system. The data directory is owner-only (0700) and the database file is 0600.
Run papercuts setup claude-code --apply (or setup codex --apply). It installs a short, versioned instruction file β previewed first, reversible byte-safely β that tells the agent to pipe one or two sentences to papercuts add --stdin mid-task whenever it hits friction.
Six classes of sensitive material β credential-prefixed tokens, authorization headers, cookies, private keys, URL-embedded credentials, and secret-named assignments β are redacted before any byte persists. There is no raw copy, no backup of the original, and no bypass.