GoodBusy uses Claude Code hooks to track your AI coding sessions automatically. No manual logging. No browser extension. Just a single install command.
Run one command. It creates your account, generates an API key, and installs hooks into Claude Code. Takes about 30 seconds.
$ 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.
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.
| Event | Hook | Description |
|---|---|---|
| session_start | SessionStart | When you open Claude Code or start a new session |
| turn_complete | Stop | Every time Claude finishes a response |
| commit | PostToolUse | When a git commit happens during a session |
| session_end | SessionEnd | When the session ends, with duration and turn count |
Visit your profile to see sessions, commits, streaks, and coding patterns. Show up on the leaderboard. Share your profile with others.
GoodBusy only sends metadata. We never see your code, prompts, file paths, or project names. Here's exactly what each event contains:
{
"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.
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.
{
"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
}]
}]
}
}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.
#!/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# 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.