claudeers.

🔓 unclaimed — this page was auto-generated from GitHub. Are you the creator?

Claim this page →
// Claude Plugins

workout-gate

A Claude Code hook that blocks your prompt until you do your push-ups, counted live via webcam. Random reps, session-persistent debt (no closing the tab to s…

// Claude Plugins[ cli ][ api ][ desktop ][ web ][ claude ]#claude#pluginsMIT$open-sourceupdated 12 days ago
Actively maintained
97/100
last commit 14 days ago
last release none
releases 0
open issues 0
// install
git clone https://github.com/BotchetDig/workout-gate

Workout Gate 🏋️

Your AI works hard, so should you.

Workout Gate — push-ups gate your AI coding prompts

A Claude Code and Codex hook that blocks your prompt until you work out — push-ups or squats, counted live via webcam. When a challenge fires you pick your pain (say 6 push-ups or 9 squats). Random reps, session-persistent debt (no closing the tab to skip), streak stats, and three trigger modes.

Version française : README.fr.md · made by @Botchet

Requirements

  • Python 3.9–3.13 — including the macOS system Python 3.9, so there's no newer Python to install.
  • A webcam + an internet connection (first run downloads MediaPipe/OpenCV and a ~9 MB pose model).
  • macOS for the zero-config plugin onboarding — it pops the setup in a Terminal and triggers the camera-permission dialog. Linux/Windows work too; Claude just points you at bootstrap.sh to run once by hand.
  • git and python3 on your PATH.

Install

/plugin marketplace add BotchetDig/workout-gate
/plugin install workout-gate@workout-gate

Then start a new session (or run /reload-plugins) — nothing happens until you do. The plugin works in Claude Code CLI and desktop. Onboarding pops up in a Terminal window on its own — dependencies install, then a 30-second wizard (your max, trigger choice, a 2-pushup camera test). Until setup is done, prompts pass freely. The gate and /workout-gate:workout then work in every session, and plugin updates never break the install (the runtime lives in ~/.workout-gate/).

Also works in Codex (CLI + desktop)

The gate uses the same UserPromptSubmit hook in Codex — CLI and desktop. From Codex, open /plugins, add the BotchetDig/workout-gate marketplace if needed, then install workout-gate. Codex shows the hook review separately, so approve the plugin hooks once with /hooks before testing a prompt.

Prefer terminal commands? After setup, wire it into all your Codex sessions:

workout codex on     # adds the hook to ~/.codex/hooks.json
workout codex off    # remove it

If workout is not on your PATH yet, use the installed launcher directly:

~/.workout-gate/app/workout codex on

Heads-up: workout global on wires both Claude Code and Codex when it sees ~/.codex, because you're gating your AI usage, not one tool. Verified working across all four surfaces — Claude Code CLI and desktop, Codex CLI and desktop.

Everything is shared across tools: one runtime in ~/.workout-gate/ holds your debt, prompt counter, stats and streak. Dodge a challenge in Claude Code and the debt blocks your next Codex prompt. Concurrent prompts from two tools can't double-trigger (the counter is locked) and never open two webcam windows at once (a challenge already running elsewhere just lets the other prompt through). On macOS desktop flows that run hooks without a controlling terminal, the challenge opens in a Terminal window so the camera prompt attaches to Terminal — force it either way with WORKOUT_GATE_TERMINAL=1 / 0.

One line, without the plugin

curl -fsSL https://raw.githubusercontent.com/BotchetDig/workout-gate/main/get.sh | bash

Re-running the same line updates the install. Prefer to look around first?

git clone https://github.com/BotchetDig/workout-gate.git && cd workout-gate
./install.sh

The installer sets everything up (venv, dependencies, pose model) then walks you through a 30-second wizard: it asks your one-set max to size the challenges to you (25–50% of it), lets you pick a trigger, offers the global install, and runs a 2-pushup camera test so the macOS permission dialog happens now — not in the middle of your first gated prompt.

Re-run the wizard anytime with workout setup. Use ./install.sh --no-setup for a non-interactive install with defaults (every 15 prompts, 5–10 reps).

Usage

Drive it with ! workout from inside Claude Code (the ! prefix runs a shell command — instant, zero tokens), or just workout from any terminal. Codex CLI does not have Claude's ! shell shortcut, so use a terminal for settings commands like workout on, workout off, and workout status.

CommandEffect
! workoutopen the web dashboard (settings + live stats) in your browser
! workout tuithe terminal dashboard instead (curses, arrow keys)
! workout nowforce a challenge right now (great for filming)
! workout statsper-exercise totals + 7-day chart (arrow keys to switch exercise in a real terminal)
! workout statusgate state (counter, debt, settings)
! workout on / offenable / disable
! workout stopclose a running challenge window
! workout preset chill|demo|hardcoresee presets below
! workout enable|disable squatsturn an exercise on/off
! workout set reps squats 8 15rep range for one exercise
! workout set mode choice|randompick the exercise yourself, or at random
! workout debug on|offoverlay the detected skeleton + live joint angle (handy when adding exercises)
! workout set freq 15one challenge every 15 prompts
! workout set time 30time-based: at most one challenge per 30 min
! workout set chance 10roulette: 10% chance on every prompt

There's also a /workout-gate:workout slash command, but it routes through Claude and costs tokens — prefer ! workout for everything above.

Dashboard

! workout (or workout in a terminal) opens the web dashboard in your browser. It's organised in tabs: an Overview tab (all the settings — preset, trigger, gate on/off — plus combined stats) and one tab per exercise, each with its own enable toggle, rep range, today/total counters and 7-day chart. Add an exercise (one entry in detector.py) and its tab appears on its own. A "force a challenge" button is one click away. It's a tiny local-only server (stdlib, no dependencies, bound to 127.0.0.1) that shuts itself down a few minutes after you close the tab.

Prefer the terminal? ! workout tui opens the curses settings dashboard (arrow keys to navigate, left/right to change values), and ! workout stats is the dedicated stats viewer (←/→ cycles through ALL + each exercise: total, streak, record, 7-day chart). Both pop up in a Terminal window on macOS; the webcam challenge itself is unchanged everywhere.

Presets

  • chill — every 25 prompts, 3–6 reps. Everyday use.
  • demo — every single prompt, 5–8 reps. Filming mode.
  • hardcore — every 5 prompts, 15–25 reps. You asked for it.

How it works

  • A UserPromptSubmit hook counts your prompts. When a challenge is due, it draws a random rep count, persists the debt to disk first, opens the webcam window and freezes your prompt until you're done. Then the prompt sends itself.
  • Detection: MediaPipe Pose. Push-ups from the elbow angle (profile view, on the floor, body horizontal); squats from the knee angle (stand in full view, side-on, body upright). One rep = full descent then full extension, with smoothing and a posture guard so you can't cheat.
  • When more than one exercise is enabled, the challenge offers a choice ("pick your pain") — or picks at random in mode random.
  • The challenge window names whoever's paying right now — CLAUDE or CODEX — same trash-talk voice, just the tag.
  • Every rep is written to disk the moment it happens (atomic writes): quit at 4/8 and you keep 4 in the stats, with 4 still owed next session.
  • Blocking by default: an aborted challenge holds your prompt until you finish (resend to retry). Flip Challenge mode to non-blocking in the dashboard and the webcam still counts your reps, but closing it always lets the prompt through.
  • Data lives in ~/.workout-gate/: config.json, state.json, stats.json, gate.log.

Escape hatches (anti-lockout, by design)

  1. workout off from any terminal — the universal off switch (works no matter which tool you're in).
  2. Gate-management prompts are never blocked, so you can always reach the gate: /workout ... in Claude Code, or the bare workout ... / wg ... forms in Codex CLI. They may still cost a model turn in Codex; use a terminal for zero-token control.
  3. WORKOUT_GATE_OFF=1 env var bypasses everything.
  4. A challenge already running in another tool/session → this prompt fails open (no second webcam window).
  5. Fail-open: no webcam, broken dependency, any crash → your prompt goes through and the error lands in ~/.workout-gate/gate.log. You can never be locked out of your own tool.

Global install

By default the gate only fires in this folder. To gate every Claude Code session on your machine (the plugin install does this for you):

./install.sh --global        # or: workout global on
workout global off           # to remove

This surgically adds one hook entry to ~/.claude/settings.json (a backup of your original file is kept next to it) and removes exactly that on off. Takes effect in new sessions.

For Codex CLI without the plugin, use:

workout codex on
workout codex off

Then approve the hook once with /hooks in a new Codex CLI session.

Tests

.venv/bin/python -m unittest discover -s tests

Statusline segment (optional)

Show your reps right in the Claude Code statusline. workout statusline prints a compact self-colored segment — 🏋 36 🔥4d (today's reps + day streak).

Claude Code runs one statusline command (statusLine in settings.json). If you already have a statusline script, append the segment to its output:

# near the end of your statusline script, before the final printf
WG="$HOME/.local/bin/workout"
[ -x "$WG" ] && wg=$("$WG" statusline 2>/dev/null)
# ...then add  ${wg:+ $wg}  to your printf

Or, for a statusline that's only the workout segment, set in settings.json:

"statusLine": { "type": "command", "command": "workout statusline" }

Add your own exercise (forking)

Everything routes through one registry, detector.EXERCISES. Adding an exercise is two steps in workout_gate/detector.py and nothing else:

  1. A counter — subclass ExerciseCounter, declare the joint angle to track and the down/up thresholds (override posture() to reject bad form):

    class SitupCounter(ExerciseCounter):
        SIDES = ((L_HIP, L_SHOULDER, L_KNEE), (R_HIP, R_SHOULDER, R_KNEE))
        DOWN_ANGLE = 55.0   # torso folded
        UP_ANGLE = 110.0    # lying back
    
  2. A registry entry:

    "situps": {
        "label": "SIT-UPS", "counter": SitupCounter,
        "cue": "LIE DOWN - SIDE-ON",
        "default_reps": (8, 15), "default_max": 30,
    },
    

Config defaults, presets, the setup wizard, the dashboard, the choice screen and per-exercise stats all read the registry — they pick it up automatically. Run the tests (test_factory.py proves a new entry flows end-to-end).


Built by @Botchet. If Workout Gate made you sweat, a follow is appreciated. 🏋️

// compatibility

Platformscli, api, desktop, web
Operating systems
AI compatibilityclaude
LicenseMIT
Pricingopen-source
LanguagePython

// faq

What is workout-gate?

A Claude Code hook that blocks your prompt until you do your push-ups, counted live via webcam. Random reps, session-persistent debt (no closing the tab to skip), streak stats, and three trigger modes. Your AI works hard, so should you.. It is open-source on GitHub.

Is workout-gate free to use?

workout-gate is open-source under the MIT license, so it is free to use.

What category does workout-gate belong to?

workout-gate is listed under data in the Claudeers registry of Claude-compatible tools.

0 views
206 stars
unclaimed
updated 12 days ago

// embed badge

workout-gate on Claudeers
[![Claudeers](https://claudeers.com/api/badge/workout-gate.svg)](https://claudeers.com/workout-gate)

// retro hit counter

workout-gate hit counter
[![Hits](https://claudeers.com/api/counter/workout-gate.svg)](https://claudeers.com/workout-gate)

// reviews

// guestbook

0/500

// related in Claude Plugins

🔓

A single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathy's observations on LLM coding pitfalls.

// pluginsmultica-ai/187,223[ claude ]
🔓

Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explainin…

// pluginsanthropics/Python135,848[ claude ]
🔓

"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/

// pluginsHKUDS/Python44,672Apache-2.0[ claude ]
🔓

A Claude Code plugin that shows what's happening - context usage, active tools, running agents, and todo progress

// pluginsjarrodwatts/JavaScript26,116MIT[ claude ]
→ see how workout-gate connects across the ecosystem