Claude Code's Notification hook fires every time a task completes or an agent needs input. It's silent by default. This one plays a random clip from Daft Punk's "Harder Better Faster Stronger."
{
"hooks": {
"Notification": [
{
"hooks": [
{
"type": "command",
"command": "printf '\\a' > /dev/tty 2>/dev/null; sounds=(work_it.wav make_it.wav do_it.wav makes_us.wav harder.wav better.wav faster.wav stronger.wav more_than.wav hour.wav our.wav never.wav ever.wav after.wav work_is.wav over.wav); f=\"${sounds[$((RANDOM % ${#sounds[@]}))]}\"; sf=\"$HOME/.sounds/$f\"; [[ -f \"$sf\" ]] && (afplay -v 0.5 \"$sf\" 2>/dev/null || afplay /System/Library/Sounds/Glass.aiff) & || afplay /System/Library/Sounds/Glass.aiff &"
}
]
}
]
}
}
Drop WAV files in ~/.sounds/ matching the filenames (work_it.wav, harder.wav, etc.). Missing clips fall back to the macOS Glass sound. (Full gist with all 16 clips.)
Notification is the simplest hook there is. No JSON parsing, no stdin, just a shell command that runs when something happens. PreToolUse gets more attention, but if you haven't tried hooks yet, start here.
Waiting on an agent is a lot more fun when it yells "harder" at you.
-Tom