How it works

GoodBusy uses Claude Code hooks to track your AI coding sessions automatically. No manual logging. No browser extension. Just a single install command.

1

Sign up and install

Run one command. It creates your account, generates an API key, and installs hooks into Claude Code. Takes about 30 seconds.

Terminal
$ curl -sSL 'https://goodbusy.ai/install.sh?key=YOUR_API_KEY' | bash

  ✓ Hook script written to ~/.goodbusy/goodbusy-hook.sh
  ✓ Claude Code hooks configured

  GoodBusy installed! Restart Claude Code to start tracking.
2

Code normally

Just use Claude Code, Codex, or Conductor like you always do. GoodBusy hooks fire in the background on every session start, turn, commit, and session end. Zero friction.

What gets tracked
EventHookDescription
session_startSessionStartWhen you open Claude Code or start a new session
turn_completeStopEvery time Claude finishes a response
commitPostToolUseWhen a git commit happens during a session
session_endSessionEndWhen the session ends, with duration and turn count
3

See your stats

Visit your profile to see sessions, commits, streaks, and coding patterns. Show up on the leaderboard. Share your profile with others.

Privacy

GoodBusy only sends metadata. We never see your code, prompts, file paths, or project names. Here's exactly what each event contains:

Event payload
{
  "event": "session_end",
  "source": "claude-code",
  "ts": "2026-04-13T10:30:00Z",
  "metadata": {
    "duration_s": 1800,
    "turn_count": 12
  }
}

That's it. No project names. No file paths. No code. No prompts. Just timestamps and counts.

What gets installed

The install script adds three entries to your ~/.claude/settings.json hooks config. Each one calls a small bash script that fires a curl request in the background.

~/.claude/settings.json (hooks added by goodbusy)
{
  "hooks": {
    "SessionStart": [{
      "hooks": [{
        "type": "command",
        "command": "GOODBUSY_HOOK_EVENT=session_start ~/.goodbusy/hooks/goodbusy-report.sh"
      }]
    }],
    "Stop": [{
      "hooks": [{
        "type": "command",
        "command": "GOODBUSY_HOOK_EVENT=turn_complete ~/.goodbusy/hooks/goodbusy-report.sh",
        "async": true
      }]
    }],
    "SessionEnd": [{
      "hooks": [{
        "type": "command",
        "command": "GOODBUSY_HOOK_EVENT=session_end ~/.goodbusy/hooks/goodbusy-report.sh",
        "async": true
      }]
    }]
  }
}

The hook script

This is the entire script that runs on each event. It reads your API key from ~/.goodbusy/config.json, fires a curl with a 2-second timeout, and exits. If the network is down, it silently fails.

~/.goodbusy/hooks/goodbusy-report.sh
#!/bin/bash
set -uo pipefail

GOODBUSY_CONFIG="$HOME/.goodbusy/config.json"
GOODBUSY_API_KEY=$(grep -o '"apiKey":"[^"]*"' "$GOODBUSY_CONFIG" | cut -d'"' -f4)

[ -z "$GOODBUSY_API_KEY" ] && exit 0

TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)

# Fire and forget (2s timeout, silent failure)
curl -s --max-time 2 -X POST "https://goodbusy.ai/api/events" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $GOODBUSY_API_KEY" \
  -d "{\"event\":\"$GOODBUSY_HOOK_EVENT\",\"source\":\"claude-code\",\"ts\":\"$TS\"}" \
  > /dev/null 2>&1 &

exit 0

Uninstall

# Remove hooks from Claude Code settings
$ sed -i.bak '/goodbusy/d' ~/.claude/settings.json

# Delete hook script and config
$ rm -rf ~/.goodbusy

Remove the GoodBusy entries from your Claude Code settings and delete the local hook script. Your data on goodbusy.ai stays until you delete your account.