The built-in alert
Claude Code sends a desktop notification when it finishes or waits for permission and you seem to be away, but only in Ghostty, Kitty and iTerm2. In Windows Terminal, VS Code, Warp and the rest, ask for the terminal bell instead:
// ~/.claude/settings.json
{
"preferredNotifChannel": "terminal_bell"
}
Running inside tmux? Add set -g allow-passthrough on to ~/.tmux.conf, or the alert never reaches your terminal.
A sound the moment it's done
A Stop hook runs as soon as Claude finishes a reply. Pick the line for your system:
// ~/.claude/settings.json
{
"hooks": {
"Stop": [
{ "hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Glass.aiff" }] }
]
}
}
// Windows:
"command": "powershell -NoProfile -Command \"(New-Object Media.SoundPlayer 'C:/Windows/Media/chimes.wav').PlaySync()\""
// Linux:
"command": "paplay /usr/share/sounds/freedesktop/stereo/complete.oga"
Why the Notification hook feels late
The Notification hook's idle_prompt fires about a minute after Claude finished, if you haven't typed since. That's a reminder, not a "done" signal. Use Stop for done, and Notification with the permission_prompt matcher for "needs your OK", which fires after about six seconds of waiting.