Tend to your quads while you tend to your Claudes.
Do exercises and think a little yourself while you wait for Claude.
"It's the era of tending to your Claudes." β Boris Cherny, creator of Claude Code, on Greg Isenberg's podcast
Based on xkcd #303 by Randall Munroe (CC BY-NC 2.5)
curl -sSL https://raw.githubusercontent.com/Flow-Club/vibereps/main/install.sh | bashThen restart Claude Code and run /setup-vibereps to choose your exercises.
Alternative: Install from local clone
git clone https://github.com/Flow-Club/vibereps.git
cd vibereps
./install.shUninstall
~/.vibereps/install.sh --uninstallFor a more integrated experience, use the VibeReps menubar app:
- Always-on menubar presence with exercise/usage stats
- Random exercise auto-selection
- Native desktop notifications
- Multi-instance Claude session tracking
- Works offline (bundled MediaPipe)
cd electron
./install.shThis will:
- Build the native macOS app
- Install to /Applications
- Optionally configure Claude Code hooks
Or build a distributable DMG:
cd electron
npm install
npm run build:dmg
# Output: electron/dist/VibeReps-1.0.0.dmgMenubar App Features
- Stats in menu: Today's reps and Claude Code usage at a glance
- Auto-refresh: Stats update after each exercise
- Random exercise: Opens with a random exercise (quick mode)
- Session tracking: Tracks multiple Claude instances
- Start at login: Add to Login Items for always-on tracking
The workflow: Claude edits a file β Exercise until Claude is done β Get notified when ready
You: "Hey Claude, refactor this code"
β
ποΈ Exercise tracker launches
β
You exercise β β Claude processes your request
β
Exercise complete β "β³ Claude is working..."
β
Claude: "Here's your refactored code"
β
π Desktop notification: "Claude is ready!"
β
You return to check the response
Manual setup (if not using installer)
Add to ~/.claude/settings.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit|MultiEdit",
"hooks": [
{
"type": "command",
"command": "VIBEREPS_EXERCISES=squats,jumping_jacks,standing_crunches,calf_raises,side_stretches /path/to/exercise_tracker.py post_tool_use '{}'",
"async": true
}
]
}
],
"Notification": [
{
"matcher": "idle_prompt|permission_prompt",
"hooks": [
{
"type": "command",
"command": "/path/to/notify_complete.py '{}'",
"async": true
}
]
}
]
}
}- Real-time pose detection using MediaPipe AI
- Stand-up verification - ensures you're fully visible before starting
- 13 exercise types including:
- Squats, push-ups, jumping jacks
- Standing crunches, calf raises, side stretches
- High knees, torso twists, arm circles
- Shoulder shrugs, neck rotations, neck tilts (posture correction)
- Two modes:
- Quick mode: Keep exercising while Claude works β‘
- Normal mode: 10+ reps for breaks
- Desktop notifications when Claude is ready
- No installation required - uses Python standard library
- Privacy-focused - all video processing happens locally in browser
Browser Version:
- Python 3 (standard library only!)
- Modern web browser (Chrome, Firefox, Safari)
- Webcam
- Internet connection (for MediaPipe CDN)
Menubar App (Electron):
- macOS 10.15+
- Node.js 18+ (for building)
- Webcam
- No internet required (MediaPipe bundled)
# Choose which exercises to use (comma-separated, random selection each time)
export VIBEREPS_EXERCISES=squats,jumping_jacks # Only squats and jumping jacks
export VIBEREPS_EXERCISES=squats,pushups,jumping_jacks,standing_crunches,calf_raises,side_stretches # All exercises
# --dangerously-skip-leg-day (filters out squats, calf raises, high knees, jumping jacks)
export VIBEREPS_DANGEROUSLY_SKIP_LEG_DAY=1
# Remote VibeReps server (optional)
export VIBEREPS_API_URL=https://your-server.com
export VIBEREPS_API_KEY=your_api_key
# Disable tracking entirely
export VIBEREPS_DISABLED=1
# UI mode (for non-interactive install)
export VIBEREPS_UI_MODE=electron # or webapp
# Trigger mode
export VIBEREPS_TRIGGER_MODE=edit-only # or promptIf VIBEREPS_EXERCISES is set, the tracker will randomly pick one exercise from the list and auto-start it (no manual selection needed).
Edit exercise_ui.html to change target reps:
let targetReps = {squats: 10, pushups: 10, jumping_jacks: 20, standing_crunches: 10, calf_raises: 15, side_stretches: 10}; // Normal mode
let quickModeReps = {squats: 5, pushups: 5, jumping_jacks: 10, standing_crunches: 5, calf_raises: 8, side_stretches: 6}; // Quick modeAdjust angle thresholds in exercise_ui.html (in the detection functions):
// Example: Make squats require deeper depth
if (angle < 80 && exerciseState !== 'down') { // Default: 100# Test quick mode with specific exercises
VIBEREPS_EXERCISES=squats,standing_crunches ./exercise_tracker.py post_tool_use '{}'
# Test notification (run in another terminal while tracker is open)
./notify_complete.py '{}'
# Test normal mode
./exercise_tracker.py task_complete '{}'Hooks not triggering?
# Check hooks are registered
/hooks list
# Make scripts executable
chmod +x exercise_tracker.py notify_complete.py
# Verify paths are correct (use absolute paths)
which python3 # Use this path if neededCamera permission denied?
- Grant permission when browser prompts
- macOS: System Preferences > Security & Privacy > Camera
- Browser settings: Check camera permissions for localhost
Exercises not detecting?
- Ensure good lighting
- Position camera to see full body (head to feet)
- Stand 3-6 feet from camera
- Check browser console (F12) for errors
Desktop notifications not showing?
- Grant notification permission when prompted
- Check browser notification settings
- Check system notification preferences
Menubar app camera not working?
- Check System Settings > Privacy & Security > Camera
- Ensure VibeReps has camera permission
- Try:
tccutil reset Camera com.vibereps.app
Menubar app not showing stats?
- Click "Refresh Stats" in the menu
- Ensure exercises are being logged to
~/.vibereps/exercises.jsonl - For Claude usage, ensure
ccusageis installed:npm install -g ccusage
VibeReps includes built-in skills you can run in Claude Code:
| Command | Description |
|---|---|
/setup-vibereps |
Interactive setup wizard - customize exercises and triggers |
/test-tracker |
Launch, restart, or test the exercise tracker |
/add-exercise |
Add a new exercise type with pose detection |
/tune-detection |
Adjust detection thresholds if reps aren't counting correctly |
Example: After installing, run /setup-vibereps in Claude Code to pick your preferred exercises.
Track your Claude Code usage alongside exercise data with vibereps-usage.py:
./vibereps-usage.pyThis combines ccusage output with your exercise log into a single table:
ββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββ¬ββββββββββββ¬ββββββββββββββββ¬βββββββββββββββ¬ββββββββββββββββ¬ββββββββββββββ¬ββββββββββββββββββββββββββββ
β Date β Models β Input β Output β Cache Create β Cache Read β Total Tokens β Cost β Exercises β
ββββββββββββββΌββββββββββββββββββββββββββββββββββββββββΌββββββββββββΌββββββββββββΌββββββββββββββββΌβββββββββββββββΌββββββββββββββββΌββββββββββββββΌββββββββββββββββββββββββββββ€
β 2026-01-27 β - opus-4-5 β 890,234 β 45,678 β 1,234,567 β 8,901,234 β 11,071,713 β $12.34 β 45 Squats, 30 Jumping β
β β - sonnet-4-5 β β β β β β β Jacks, 20 Calf Raises β
ββββββββββββββΌββββββββββββββββββββββββββββββββββββββββΌββββββββββββΌββββββββββββΌββββββββββββββββΌβββββββββββββββΌββββββββββββββββΌββββββββββββββΌββββββββββββββββββββββββββββ€
β 2026-01-28 β - opus-4-5 β 456,789 β 23,456 β 567,890 β 4,567,890 β 5,616,025 β $6.78 β 25 Squats, 15 Standing β
β β β β β β β β β Crunches β
ββββββββββββββΌββββββββββββββββββββββββββββββββββββββββΌββββββββββββΌββββββββββββΌββββββββββββββββΌβββββββββββββββΌββββββββββββββββΌββββββββββββββΌββββββββββββββββββββββββββββ€
β Total β β 1,347,023 β 69,134 β 1,802,457 β 13,469,124 β 16,687,738 β $19.12 β 70 Squats, 30 Jumping β
β β β β β β β β β Jacks, 20 Calf Raises, β
β β β β β β β β β 15 Standing Crunches β
ββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββ΄ββββββββββββ΄ββββββββββββββββ΄βββββββββββββββ΄ββββββββββββββββ΄ββββββββββββββ΄ββββββββββββββββββββββββββββ
# Filter by date range (passed to ccusage)
./vibereps-usage.py --since 2026-01-01
./vibereps-usage.py --since 2026-01-20 --until 2026-01-27
# Show only exercises (no Claude usage)
./vibereps-usage.py --exercises-only- ccusage:
npm install -g ccusage - Exercise data logged to
~/.vibereps/exercises.jsonl(automatic when using hooks)
CLAUDE.md- Technical architecture, remote server setup, and monitoring stackexercise_ui.html- UI and pose detection logic (customize reps and sensitivity here)server/- Remote server for multi-user stats, leaderboards, and MCP integration
- Too easy? Increase reps in quick mode
- Too hard? Decrease reps or choose easier exercises
- Want variety? The tracker suggests exercises you haven't done recently
- Track progress? Set up the MCP server for stats and streaks
Stay healthy and keep coding! πͺπ
