Claude Code does your job. You do push ups. That's the deal.
It counts the tokens Claude just burned doing your work, turns them into reps you owe, and puts the number in your status line where you can't ignore it.
Nothing is blocked, nothing is gated, your prompts always go through. It just watches and adds up.
Needs bash, jq and awk.
git clone https://github.com/Deorbiting/claude-pushups.git
cd claude-pushups
./install.shRestart Claude Code. Got a status line already? It's kept, and the reps get
stapled on the end of it. ./uninstall.sh puts everything back.
pu # what you owe
pu done # cleared 47. sure you did.
pu 20 # paid 20. 27 still owed.
pu skip # write it off
pu tier rat # switch tierInside Claude Code put a ! in front: ! pu done.
Debt survives turns, sessions and restarts. Only pu clears it.
name tokens/rep cap/turn cap/day
fat fat fuck 4000 15 30
cuck claude cuck 2000 35 75 ← default
rat gym rat 1000 60 150
roid roid monkey 600 99 250
pu tier roidEach tier talks to you differently. Find out.
It's all in talk.txt, one line each:
tier|kind|text # tier "*" hits every tier
roid|jab-mid|your delts are lying
fat|tally-low|{n} reps. that is one advert break, fatty.
jab-low/jab-mid/jab-high/jab-max— status bar, at debt ≤20, ≤50, ≤100, 100+. Keep under 28 characters or the line wraps.tally-zero/tally-low/tally-mid/tally-high— turn-end notification, at 0, ≤10, ≤30, 30+ reps.{n}is the number.
Drop your own talk.txt into ~/.claude/pushups/ and it overrides the shipped
one. git pull won't touch it.
Reps come from output tokens, not the clock, so you don't get billed while you
read a permission prompt. Subagents are +5 each. Ledger lives at
~/.claude/pushups/ledger.
| macOS | everything |
| Linux | everything, notifications need notify-send |
| Windows, Git Bash or WSL | works, no desktop notification |
| Windows, no bash | no |
bash test.sh — 34 asserts, no framework.
No streaks, no leaderboard, and nothing checks that you actually did them.
MIT.
