Get a sound or a spoken summary when Claude Code finishes
Three ways to know when Claude Code is done: the built-in terminal bell, a Notification or Stop hook that plays a sound, and a spoken summary of what it did.
You hand the Claude Code CLI a task, switch to the browser or another terminal, and come back ten minutes later to find it finished eight minutes ago — or that it has been sitting on a permission prompt the whole time. The fix is to make it tell you. There are three levels of "tell me", from a bell to a voice that says what actually happened. Here is how each one works and where it stops.
Level 1: the built-in bell
The Claude Code CLI can ring the terminal bell when a task completes. It's one setting in ~/.claude/settings.json:
{
"preferredNotifChannel": "terminal_bell"
}
What you get depends on the terminal. By default, according to Anthropic's docs, iTerm2, Ghostty and Kitty show a desktop notification when the agent needs you, Apple's Terminal stays silent, and most other terminals do nothing at all. The setting above switches to the bell character instead, which your terminal may turn into a sound, a badge, or nothing. If you live in one of the first three terminals, the default may already be all you need.
Level 2: a hook that plays a sound
Hooks run your own command at points in the agent's lifecycle. They live under a top-level hooks key in the same settings file — ~/.claude/settings.json for every project, .claude/settings.json to share with a repo, or .claude/settings.local.json for a private, gitignored copy.
Two events matter here:
- Notification fires when the agent needs you — most usefully when it has been waiting on a permission prompt for about six seconds (
permission_prompt), or when it finished and you haven't typed anything for about a minute (idle_prompt). Omit the matcher to catch every notification type, or name the ones you want. - Stop fires every time the agent finishes responding — every turn, not just at the end of a long task. It receives the final message as
last_assistant_messageon stdin, which is handy if you want to do more than beep.
The docs' own example plays a system sound on macOS when the agent needs attention:
{
"hooks": {
"Notification": [
{
"hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Glass.aiff" }]
}
]
}
}
On Windows, swap the command for PowerShell:
{
"type": "command",
"command": "powershell -c \"(New-Object Media.SoundPlayer 'C:\\Windows\\Media\\notify.wav').PlaySync()\""
}
A plain powershell -c [console]::beep(880,300) works too. On Linux, paplay /usr/share/sounds/freedesktop/stereo/complete.oga does the job on most desktops. If you want the chime on completion rather than on "needs attention", put the same handler under "Stop" instead — just know it will also chime after a one-line answer.
Type /hooks inside the CLI to see what's configured and where each hook comes from.
What a beep can't tell you
A sound solves the "I didn't notice" problem. It doesn't solve the "now I have to go and look" problem:
- Done, waiting, or failed sound the same. You still walk back to the screen to find out which.
- It can't tell you what happened. Did it finish the migration, or stop halfway with a question?
- A permission prompt is still a prompt. The chime tells you something wants approval. Approving it means reading the command and pressing a key.
- Two agents, one beep. Run several sessions and the sound stops carrying any information at all.
If you're at the desk anyway, that's fine. If the point of an agent is that you can leave the desk, it isn't.
Level 3: hear what it did
Verbative is a VS Code extension that adds a voice loop around the Claude Code CLI, and the last step of that loop is exactly this: when the agent finishes, it speaks a short summary of what it did, in a natural neural voice generated on your machine. Not "done" — "I added the migration and the tests pass, two files changed."
The same voice reads out every permission prompt with what the agent is about to do, and you answer out loud: "approve", "deny", or "explain" to hear more before you decide. Say "update" while it's working for a spoken status check, or "stop claude" to abort a run. Each agent gets a status bar that shows when it's working, so with several agents in parallel you still know who said what.
A few details that matter if you compared the hook approach above:
- Nothing is uploaded. The voice is synthesized on your machine, and with Local mode your dictation is transcribed there too, with whisper.cpp. Our servers never see audio or prompts.
- It runs on your existing Claude Pro or Max subscription through the Claude Code CLI. No API key, no SDK, and the free tier activates itself.
- macOS and Windows, inside VS Code. See the voice docs for the full command list.
Which one should you use?
- One terminal, always at the desk: the bell, or a Notification hook if your terminal ignores bells.
- You want a sound specifically on permission prompts: a Notification hook with the
permission_promptmatcher. - You leave the desk, run several agents, or want to answer prompts without walking back: Verbative. Keep the hook too — they run side by side.
Frequently asked
How do I make Claude Code play a sound when it finishes?
Set preferredNotifChannel to terminal_bell in your settings file for the built-in bell, or add a Notification hook whose command plays a sound, for example afplay with a system sound on macOS or a PowerShell SoundPlayer call on Windows. A Stop hook chimes after every response instead.
What is the difference between the Notification hook and the Stop hook?
Notification fires when the agent needs you: after it has waited on a permission prompt for about six seconds, or when it has been idle for about a minute after finishing. Stop fires every time the agent finishes a response, including short ones, and receives the final message on stdin.
Can Claude Code read its answer aloud?
Not out of the box. The built-in options are a bell and hooks that run commands. Verbative adds spoken output on top of the Claude Code CLI: a short summary when a task finishes, permission prompts read aloud, and a spoken status check on request, all generated on your machine.
Does the sound notification work on Windows?
Yes. Hooks run any command, so a PowerShell call such as a SoundPlayer on a Windows media file or a console beep works. Verbative's spoken summaries and voice-answered permissions also run on Windows 10 and 11 inside VS Code.
Does Verbative's voice go to the cloud?
No. Speech is generated on your machine, and with Local mode, which is on by default, your own voice is transcribed there as well. Our servers never receive audio, prompts or code.