So I have ADHD and whilst Claude Code is a great tool for my short-lived attention span, it takes anywhere from a few seconds to dozens of minutes to finish a task, and in that time I’ll inevitably find something else to focus on: Twitter (I’ll never call it X), Hacker News, or exploring a map of Malta. You get the picture.
By the time I remember I was supposed to be prompting, it's been fifteen minutes and Claude has been sat there patiently waiting for me to get my arse in gear.
So I wanted a beep. Just a simple sound that says "hey, I'm done, what's next?." Turns out Claude Code has a hooks system that makes this rather easy.
Hooks
Hooks are commands that Claude Code triggers automatically when certain events happen. There's a bunch of events you can hook into like tool calls, errors, session start etc, but the one I care about is Stop. It fires when Claude finishes responding and is waiting for my input.
The config lives in ~/.claude/settings.json. Here's what you need:
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "afplay /System/Library/Sounds/Ping.aiff"
}
]
}
]
}
}
That's it. macOS ships with a bunch of system sounds in /System/Library/Sounds/ and afplay is a built-in command that plays them. No dependencies, no installs, just a one-liner in your settings.
Picking a sound
Here's what you've got to choose from:
Frog.aiff- my pick, ribbitPing.aiff- clean and noticeableGlass.aiff- subtle, good if you're in calls a lotHero.aiff- dramatic, for when Claude finishes something impressiveTink.aiff- very quiet, for the easily startledPop.aiff- short and snappyBasso.aiff- deep and seriousBlow.aiff- a gentle whooshBottle.aiff- hollow and echoeyFunk.aiff- funky little error vibeMorse.aiff- dot dot dashPurr.aiff- soft rumbleSosumi.aiff- the classic Mac "so sue me" soundSubmarine.aiff- you're on a submarine now
You can test them out by running afplay /System/Library/Sounds/Glass.aiff in your terminal and pick whatever doesn't drive you nuts after the hundredth time.
Extending it
You can hook into other events too. A quiet Tink.aiff on every tool call so you know Claude is still working. A Basso.aiff on errors so you catch failures early. You could even wire up different sounds for different tools if you wanted to know what Claude is doing by ear alone, but at that point you should probably go outside and touch some grass.
The hooks docs have the full list of events if you want to get creative.
But to be honest, the Stop beep has been the biggest quality-of-life improvement for me. I can get distracted to my heart's (or brain's) desire, knowing Claude will ping me when it's time to lock in.