Terminal Gym is a Claude Code mod for a daily bodyweight rep goal: tracker band, streaks, and a strict mode that spreads your sets through the day. Your agent put in the reps. You next.
TypeScript
0
53 commits
updated Oct 3, 2026
Your agent put in the reps. You next.
A Claude Code mod for a daily bodyweight rep goal. While Claude works, you train: log sets from a band above your prompt, keep a streak, and let strict mode spread the reps through your day.
claude plugin marketplace add DrumAndCode/terminal-gym && claude plugin install terminal-gym@terminal-gym
Start a new Claude Code session and the welcome band appears above your prompt.

https://github.com/user-attachments/assets/14373c7e-ad8a-4f92-812b-c93c3201b1b3
💪 ▓▓▓▓▓▓░░░░ 60/100 pushups next set 10:53 log reps: [ +5 ] [ +10 ] [ +25 ] 🔥3d. It's grey at 0, then red, yellow and green as you close in on the goal./fit score): an ASCII barbell (in the terminal), your streak, a 28-day grid and the last week by exercise, with today marked.Strict mode spreads today's goal into evenly spaced sets over a training window (8 hours by default) that starts with your first prompt of the day. With 100 pushups:
| When | What happens |
|---|---|
| First prompt (say 9:00) | The day starts and the opening set is due. Your prompt waits: "Behind pace: 10 pushups to catch up (10/100 due by now). /fit 10 to log." |
After /fit 10 | You're through. The band reads next set 09:53 |
| 9:53 | Toast: "⏱ Set due: 10 pushups. 20/100 by now." Your next prompt waits until you log it |
| …about every 53 minutes… | Ten sets in all, the last due 8 hours after your first prompt |
| Goal done, or a rest day | Nothing waits |
Only prompts you type can be held. Background tasks, /loop runs, messages from other sessions and slash commands like /fit 10 always go through. Prompts before 5am count as the night before, so a late night never leaves you a wall of overdue sets in the morning.
Easy mode (the default) shows the same schedule on the band and the same reminders, but never holds a prompt.
| Command | Does |
|---|---|
/fit | today's progress, pace and streak |
/fit 20 | log 20 reps |
/fit set 80 | fix today's count |
/fit reset | today back to 0 |
/fit swap [exercise] | switch today's exercise: the next in your program, or the one you name |
/fit rest | rest day: no sets due, breaks your streak |
/fit rest off | undo today's rest day (or press Train today on the band) |
/fit score | scoreboard: streak, grid and the last week (run again or press Esc to close) |
/fit program | pick your program (the walkthrough) |
/fit strict / /fit easy | strict mode on / off |
/fit rules | house rules |
/fit start | replay the welcome |
/fit hide | close panels |
In /config, under terminal-gym:
| Setting | Default | What it does |
|---|---|---|
| Strict mode | off | Hold typed prompts while you're behind pace |
| Training window | 8 hours | How long after your first prompt the day's sets are spread over |
| Set size | auto | Reps per set; auto is a tenth of the goal, rounded to fives |
| Long-turn nudges | on | Easy mode: suggest a set when a turn runs long |
| Nudge after | 30 seconds | How long a turn runs before the nudge |
| Reps per nudge | 10 | The set the nudge suggests |
| Spinner takeover | on | Easy mode: show the suggested set in the spinner |
| Quick-log band | on | Show the tracker band above the prompt |
The mod makes no network calls and adds no hidden context for the model. /fit replies appear in your conversation like any slash command's output, so Claude can see them. Everything else stays on your machine: a few values in the mod's own store (see below), and your data in ~/.claude/fitness:
routine.json: the plan per weekday, for example { "mon": { "exercise": "pushups", "goal": 100 } }, with an optional "unit": "s" for timed exercises. Edit it for a custom program.log/YYYY-MM-DD: that day's count.log/YYYY-MM-DD.skip: a rest day. If it contains off, the rest day was undone.log/YYYY-MM-DD.swap: that day's exercise after /fit swap, in the same shape as a routine day.A mod runs inside Claude Code, so here is everything Terminal Gym touches:
~/.claude/fitness: the routine, the daily logs listed above, and routine.json.bak (a copy of your custom routine, made before the walkthrough replaces it). It never writes settings files, instructions, build or start-up files directly./fit strict and /fit easy turn its own Strict mode setting (terminal-gym.strict) on and off. That's the only setting it changes. It sets no environment variables; it reads HOME to find ~/.claude/fitness.prompt.submit: in strict mode, holds a prompt you typed while you're behind pace and puts its text back in the prompt box. Easy mode lets everything through. Prompts from other sources are never touched.command.run: answers its own /fit command, and nothing else.session.start and the SessionStart event after /clear or /resume: load today's state and register /fit. The event passes through unchanged.turn.start and turn.complete: time the easy-mode nudge and refresh the band.ui.render: draws the band, the scoreboard, the house rules and the walkthrough, and (easy mode) the suggested set in the spinner.Claude Code 2.1.288 or newer. The band and panes draw in the terminal and the Desktop app's Code tab. In the VS Code chat panel and claude -p, /fit still works but nothing is drawn. Mods are early access, so the API can change between Claude Code releases.
Update with claude plugin update terminal-gym@terminal-gym. From inside a chat, you can also install with /plugin install terminal-gym --marketplace DrumAndCode/terminal-gym.
Issues and PRs welcome. Keep changes small and include a test.
claude --plugin-dir . # load your checkout for one session
claude plugin validate --strict .
claude plugin test .
claude plugin test runs tests/*.test.tsx against the engine itself. Once the mod has loaded, tsc -p . type-checks it against the engine's types in .claude-plugin/types/.
MIT
TypeScript
100.0%
Terminal Gym is a Claude Code mod for a daily bodyweight rep goal: tracker band, streaks, and a strict mode that spreads your sets through the day. Your agent put in the reps. You next.
TypeScript
0
53 commits
updated Oct 3, 2026
Your agent put in the reps. You next.
A Claude Code mod for a daily bodyweight rep goal. While Claude works, you train: log sets from a band above your prompt, keep a streak, and let strict mode spread the reps through your day.
claude plugin marketplace add DrumAndCode/terminal-gym && claude plugin install terminal-gym@terminal-gym
Start a new Claude Code session and the welcome band appears above your prompt.

https://github.com/user-attachments/assets/14373c7e-ad8a-4f92-812b-c93c3201b1b3
💪 ▓▓▓▓▓▓░░░░ 60/100 pushups next set 10:53 log reps: [ +5 ] [ +10 ] [ +25 ] 🔥3d. It's grey at 0, then red, yellow and green as you close in on the goal./fit score): an ASCII barbell (in the terminal), your streak, a 28-day grid and the last week by exercise, with today marked.Strict mode spreads today's goal into evenly spaced sets over a training window (8 hours by default) that starts with your first prompt of the day. With 100 pushups:
| When | What happens |
|---|---|
| First prompt (say 9:00) | The day starts and the opening set is due. Your prompt waits: "Behind pace: 10 pushups to catch up (10/100 due by now). /fit 10 to log." |
After /fit 10 | You're through. The band reads next set 09:53 |
| 9:53 | Toast: "⏱ Set due: 10 pushups. 20/100 by now." Your next prompt waits until you log it |
| …about every 53 minutes… | Ten sets in all, the last due 8 hours after your first prompt |
| Goal done, or a rest day | Nothing waits |
Only prompts you type can be held. Background tasks, /loop runs, messages from other sessions and slash commands like /fit 10 always go through. Prompts before 5am count as the night before, so a late night never leaves you a wall of overdue sets in the morning.
Easy mode (the default) shows the same schedule on the band and the same reminders, but never holds a prompt.
| Command | Does |
|---|---|
/fit | today's progress, pace and streak |
/fit 20 | log 20 reps |
/fit set 80 | fix today's count |
/fit reset | today back to 0 |
/fit swap [exercise] | switch today's exercise: the next in your program, or the one you name |
/fit rest | rest day: no sets due, breaks your streak |
/fit rest off | undo today's rest day (or press Train today on the band) |
/fit score | scoreboard: streak, grid and the last week (run again or press Esc to close) |
/fit program | pick your program (the walkthrough) |
/fit strict / /fit easy | strict mode on / off |
/fit rules | house rules |
/fit start | replay the welcome |
/fit hide | close panels |
In /config, under terminal-gym:
| Setting | Default | What it does |
|---|---|---|
| Strict mode | off | Hold typed prompts while you're behind pace |
| Training window | 8 hours | How long after your first prompt the day's sets are spread over |
| Set size | auto | Reps per set; auto is a tenth of the goal, rounded to fives |
| Long-turn nudges | on | Easy mode: suggest a set when a turn runs long |
| Nudge after | 30 seconds | How long a turn runs before the nudge |
| Reps per nudge | 10 | The set the nudge suggests |
| Spinner takeover | on | Easy mode: show the suggested set in the spinner |
| Quick-log band | on | Show the tracker band above the prompt |
The mod makes no network calls and adds no hidden context for the model. /fit replies appear in your conversation like any slash command's output, so Claude can see them. Everything else stays on your machine: a few values in the mod's own store (see below), and your data in ~/.claude/fitness:
routine.json: the plan per weekday, for example { "mon": { "exercise": "pushups", "goal": 100 } }, with an optional "unit": "s" for timed exercises. Edit it for a custom program.log/YYYY-MM-DD: that day's count.log/YYYY-MM-DD.skip: a rest day. If it contains off, the rest day was undone.log/YYYY-MM-DD.swap: that day's exercise after /fit swap, in the same shape as a routine day.A mod runs inside Claude Code, so here is everything Terminal Gym touches:
~/.claude/fitness: the routine, the daily logs listed above, and routine.json.bak (a copy of your custom routine, made before the walkthrough replaces it). It never writes settings files, instructions, build or start-up files directly./fit strict and /fit easy turn its own Strict mode setting (terminal-gym.strict) on and off. That's the only setting it changes. It sets no environment variables; it reads HOME to find ~/.claude/fitness.prompt.submit: in strict mode, holds a prompt you typed while you're behind pace and puts its text back in the prompt box. Easy mode lets everything through. Prompts from other sources are never touched.command.run: answers its own /fit command, and nothing else.session.start and the SessionStart event after /clear or /resume: load today's state and register /fit. The event passes through unchanged.turn.start and turn.complete: time the easy-mode nudge and refresh the band.ui.render: draws the band, the scoreboard, the house rules and the walkthrough, and (easy mode) the suggested set in the spinner.Claude Code 2.1.288 or newer. The band and panes draw in the terminal and the Desktop app's Code tab. In the VS Code chat panel and claude -p, /fit still works but nothing is drawn. Mods are early access, so the API can change between Claude Code releases.
Update with claude plugin update terminal-gym@terminal-gym. From inside a chat, you can also install with /plugin install terminal-gym --marketplace DrumAndCode/terminal-gym.
Issues and PRs welcome. Keep changes small and include a test.
claude --plugin-dir . # load your checkout for one session
claude plugin validate --strict .
claude plugin test .
claude plugin test runs tests/*.test.tsx against the engine itself. Once the mod has loaded, tsc -p . type-checks it against the engine's types in .claude-plugin/types/.
MIT
TypeScript
100.0%