Print a store receipt for your AI coding: tokens, what they'd cost at API prices, and how many times the agent said "You're absolutely right". Claude Code, Codex, OpenCode. 100% local.
See the codePrint a store receipt for your AI coding. Tokens, what they'd cost at API prices, and how many times the agent said "You're absolutely right".
npx github:glmn-ai/vibereceipt
(Once it's on npm: npx vibereceipt.)
The receipt above comes from --demo sample data, not a real person's logs.
Posting it? --short prints a compact receipt and saves it as an exact 4:5 PNG,
which the X timeline shows uncropped:
vibereceipt reads the session logs that Claude Code, Codex CLI and OpenCode already keep on your machine. It prints a thermal-printer receipt in your terminal, line by line, and saves a PNG of it that's ready to post. It needs no account, makes no network calls and uploads nothing.
--plan, you also get your subscription for the same months and either
YOU SAVED or YOU OVERPAID, whichever is true.0 BYTES UPLOADED, a decorative barcode, and a thank-you.npx github:glmn-ai/vibereceipt # all time
npx github:glmn-ai/vibereceipt --since 30d # or 7d, 4w, 6m, 1y, 2026-09-01
npx github:glmn-ai/vibereceipt --month # this calendar month
npx github:glmn-ai/vibereceipt --plan max20 # compare with your subscription
npx github:glmn-ai/vibereceipt --short # compact 4:5 receipt for the timeline
npx github:glmn-ai/vibereceipt --demo # sample data, clearly marked DEMO
| Flag | What it does |
|---|---|
--since <when> | Period: 30d, 7d, 4w, 6m, 1y, or a date YYYY-MM-DD (local time). The default is all time. |
--month / --year | This calendar month or year. |
--plan <plan> | pro ($20), max5 ($100), max20 ($200), chatgpt-plus ($20), chatgpt-pro ($200), or any monthly price, e.g. 100 or $49.99. |
--short | A compact receipt for posting: header; sessions, prompts and tool calls; total tokens; cost by harness; subtotal or plan comparison; the top 4 fun counters; footer. The PNG is an exact 4:5. |
--out <path> | Where to save the PNG. The default is ./vibereceipt-YYYY-MM-DD.png. |
--no-png | Don't save a PNG. |
--no-anim | Print the receipt instantly. Output that isn't a TTY never animates. |
--no-color | No ANSI styling. NO_COLOR is respected too. |
--json | Print the stats as JSON instead of the receipt. Money is given in exact picodollars plus a dollar string. No PNG is saved unless you pass --out. |
--projects | Add your top 3 project folder names, as base names only. Off by default. |
--demo | Print a receipt made from built-in sample data. It says DEMO at the top and bottom. |
-h, --help / -v, --version | Show help or the version. |
After the receipt prints, you get the path to the PNG and a ready-made Share on X link. The link fills in the text only, so attach the PNG yourself.
| Harness | Where |
|---|---|
| Claude Code | $CLAUDE_CONFIG_DIR/projects, otherwise ~/.claude/projects and ~/.config/claude/projects. Subagent logs are included. |
| Codex CLI | $CODEX_HOME/sessions and archived_sessions, otherwise ~/.codex/… |
| OpenCode | $XDG_DATA_HOME/opencode/opencode.db, otherwise ~/.local/share/opencode/opencode.db (the same path on Windows and macOS) |
OpenCode keeps its history in SQLite, which vibereceipt reads with Node's
built-in node:sqlite in read-only mode. That module needs Node 22.13 or
newer. On older Node versions, OpenCode is skipped with a note and everything
else still works on Node 18.17 and up.
If no logs are found, vibereceipt lists every place it looked.
No network. vibereceipt has zero runtime dependencies and never
imports http, https, net, tls or dgram, and never calls fetch.
You can check for yourself:
grep -rnE "fetch\(|node:https?|node:net|node:tls|node:dgram|WebSocket" dist # prints nothing
The only URLs in dist/ are text: the share link it prints and the
two price-table source URLs kept as plain strings. Every CI run repeats
this check.
Read-only. Logs are only ever opened for reading, and the OpenCode
database is opened with readOnly: true. The only file vibereceipt writes
is the PNG.
Nothing private goes on the receipt. Prompt text is reduced to a
timestamp and a yes/no "rage" flag the moment it's read, and replies are
reduced to phrase counts. Edited file paths are used only to count distinct
files. MCP and unknown tools are grouped together, so private server or tool
names never appear. Project folder names show up only with --projects.
A test feeds the scanners fixture logs full of marker strings and fails if
any of them reaches the receipt or the JSON.
The parsers and the pricing are vendored from
@neurosquad/core, the engine
behind nsq:
token_usage_record. OpenCode uses one row per assistant step.inference_geo: us multiplier and web searches are all
priced separately.price table 2026-10-12). The prices are Anthropic's and OpenAI's
published API list prices.* marks rows that are only
partly priced. When the table has no price for a request but the harness
recorded a cost of its own (OpenCode computes one from its provider
catalogue), that recorded cost is used. A recorded cost of 0 counts as no
price.Caveats:
--plan charges the subscription once for each calendar month touched:
every month from your first activity in the period to your last, inclusive.
The receipt prints the months, e.g. 4 mo x $200 (Jul-Oct 2026).turn_aborted: interrupted events. OpenCode
interrupts are aborted assistant messages.2.75B). --json has every exact value.Want another one? The parsers come from @neurosquad/core, which already
reads more harnesses. Open an issue.
npm install
npm run build # TypeScript -> dist/ (committed, so npx github:… works without a build step)
npm test # node:test, synthetic Claude/Codex/OpenCode fixtures
npm run demo # regenerates assets/receipt-demo.png
dist/ is committed on purpose, and CI fails if it's out of date. The vendored
parsers in src/vendor/neurosquad-core/ are a read-only copy: fixes go
upstream first, then get re-vendored. One deliberate exception for now:
pricing.ts adds Claude Sonnet 5.5 and Claude Haiku 5.5 (price table
2026-10-12) ahead of upstream; its header says so.
fonts/LICENSE-spleen and NOTICE).MIT © NeuroSquad. Printed by nsq · neurosquad.ai
Print a store receipt for your AI coding: tokens, what they'd cost at API prices, and how many times the agent said "You're absolutely right". Claude Code, Codex, OpenCode. 100% local.
See the codePrint a store receipt for your AI coding. Tokens, what they'd cost at API prices, and how many times the agent said "You're absolutely right".
npx github:glmn-ai/vibereceipt
(Once it's on npm: npx vibereceipt.)
The receipt above comes from --demo sample data, not a real person's logs.
Posting it? --short prints a compact receipt and saves it as an exact 4:5 PNG,
which the X timeline shows uncropped:
vibereceipt reads the session logs that Claude Code, Codex CLI and OpenCode already keep on your machine. It prints a thermal-printer receipt in your terminal, line by line, and saves a PNG of it that's ready to post. It needs no account, makes no network calls and uploads nothing.
--plan, you also get your subscription for the same months and either
YOU SAVED or YOU OVERPAID, whichever is true.0 BYTES UPLOADED, a decorative barcode, and a thank-you.npx github:glmn-ai/vibereceipt # all time
npx github:glmn-ai/vibereceipt --since 30d # or 7d, 4w, 6m, 1y, 2026-09-01
npx github:glmn-ai/vibereceipt --month # this calendar month
npx github:glmn-ai/vibereceipt --plan max20 # compare with your subscription
npx github:glmn-ai/vibereceipt --short # compact 4:5 receipt for the timeline
npx github:glmn-ai/vibereceipt --demo # sample data, clearly marked DEMO
| Flag | What it does |
|---|---|
--since <when> | Period: 30d, 7d, 4w, 6m, 1y, or a date YYYY-MM-DD (local time). The default is all time. |
--month / --year | This calendar month or year. |
--plan <plan> | pro ($20), max5 ($100), max20 ($200), chatgpt-plus ($20), chatgpt-pro ($200), or any monthly price, e.g. 100 or $49.99. |
--short | A compact receipt for posting: header; sessions, prompts and tool calls; total tokens; cost by harness; subtotal or plan comparison; the top 4 fun counters; footer. The PNG is an exact 4:5. |
--out <path> | Where to save the PNG. The default is ./vibereceipt-YYYY-MM-DD.png. |
--no-png | Don't save a PNG. |
--no-anim | Print the receipt instantly. Output that isn't a TTY never animates. |
--no-color | No ANSI styling. NO_COLOR is respected too. |
--json | Print the stats as JSON instead of the receipt. Money is given in exact picodollars plus a dollar string. No PNG is saved unless you pass --out. |
--projects | Add your top 3 project folder names, as base names only. Off by default. |
--demo | Print a receipt made from built-in sample data. It says DEMO at the top and bottom. |
-h, --help / -v, --version | Show help or the version. |
After the receipt prints, you get the path to the PNG and a ready-made Share on X link. The link fills in the text only, so attach the PNG yourself.
| Harness | Where |
|---|---|
| Claude Code | $CLAUDE_CONFIG_DIR/projects, otherwise ~/.claude/projects and ~/.config/claude/projects. Subagent logs are included. |
| Codex CLI | $CODEX_HOME/sessions and archived_sessions, otherwise ~/.codex/… |
| OpenCode | $XDG_DATA_HOME/opencode/opencode.db, otherwise ~/.local/share/opencode/opencode.db (the same path on Windows and macOS) |
OpenCode keeps its history in SQLite, which vibereceipt reads with Node's
built-in node:sqlite in read-only mode. That module needs Node 22.13 or
newer. On older Node versions, OpenCode is skipped with a note and everything
else still works on Node 18.17 and up.
If no logs are found, vibereceipt lists every place it looked.
No network. vibereceipt has zero runtime dependencies and never
imports http, https, net, tls or dgram, and never calls fetch.
You can check for yourself:
grep -rnE "fetch\(|node:https?|node:net|node:tls|node:dgram|WebSocket" dist # prints nothing
The only URLs in dist/ are text: the share link it prints and the
two price-table source URLs kept as plain strings. Every CI run repeats
this check.
Read-only. Logs are only ever opened for reading, and the OpenCode
database is opened with readOnly: true. The only file vibereceipt writes
is the PNG.
Nothing private goes on the receipt. Prompt text is reduced to a
timestamp and a yes/no "rage" flag the moment it's read, and replies are
reduced to phrase counts. Edited file paths are used only to count distinct
files. MCP and unknown tools are grouped together, so private server or tool
names never appear. Project folder names show up only with --projects.
A test feeds the scanners fixture logs full of marker strings and fails if
any of them reaches the receipt or the JSON.
The parsers and the pricing are vendored from
@neurosquad/core, the engine
behind nsq:
token_usage_record. OpenCode uses one row per assistant step.inference_geo: us multiplier and web searches are all
priced separately.price table 2026-10-12). The prices are Anthropic's and OpenAI's
published API list prices.* marks rows that are only
partly priced. When the table has no price for a request but the harness
recorded a cost of its own (OpenCode computes one from its provider
catalogue), that recorded cost is used. A recorded cost of 0 counts as no
price.Caveats:
--plan charges the subscription once for each calendar month touched:
every month from your first activity in the period to your last, inclusive.
The receipt prints the months, e.g. 4 mo x $200 (Jul-Oct 2026).turn_aborted: interrupted events. OpenCode
interrupts are aborted assistant messages.2.75B). --json has every exact value.Want another one? The parsers come from @neurosquad/core, which already
reads more harnesses. Open an issue.
npm install
npm run build # TypeScript -> dist/ (committed, so npx github:… works without a build step)
npm test # node:test, synthetic Claude/Codex/OpenCode fixtures
npm run demo # regenerates assets/receipt-demo.png
dist/ is committed on purpose, and CI fails if it's out of date. The vendored
parsers in src/vendor/neurosquad-core/ are a read-only copy: fixes go
upstream first, then get re-vendored. One deliberate exception for now:
pricing.ts adds Claude Sonnet 5.5 and Claude Haiku 5.5 (price table
2026-10-12) ahead of upstream; its header says so.
fonts/LICENSE-spleen and NOTICE).MIT © NeuroSquad. Printed by nsq · neurosquad.ai