How to tell when Claude Code is waiting for you
Claude Code says when it needs you through its hooks: Notification and PermissionRequest when it wants an answer, Stop when it has finished. Wire them to a sound, or let a tool read them.
Claude Code stops in two ways. It asks for something (a permission, an answer to a question) or it finishes and waits for your next prompt. Either way it sits there until you notice. It does tell you, though, through hooks: commands it runs when something happens. Three of them cover waiting.
The three hooks that matter
| Hook | Fires | It means |
|---|---|---|
Notification |
When Claude Code sends a notification, for example for a permission prompt or when it needs input | It wants you |
PermissionRequest |
When a tool call needs a permission decision | It wants a yes or a no |
Stop |
When Claude finishes responding | It is done; your move |
The full list is in Anthropic’s hooks reference.
A sound on your Mac
Put this in ~/.claude/settings.json (it then holds for every project) or in a project’s .claude/settings.json:
{
"hooks": {
"Notification": [
{ "hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Glass.aiff" }] }
],
"Stop": [
{ "hooks": [{ "type": "command", "command": "afplay /System/Library/Sounds/Hero.aiff" }] }
]
}
}
Now a glass sound means Claude wants you, and a hero sound means it has finished. afplay and both sounds come with macOS.
A hook gets the event as JSON on its standard input, with the session’s id, its folder (cwd) and the event’s name. A Notification also carries a message. So a hook can do more than play a sound: write a line to a file, send a webhook, or post a message.
What a sound does not tell you
A sound works with one session, at your desk. It stops working when:
- there are several sessions. The sound says someone is waiting, not who.
- you are not in the room. To reach a phone, the hook has to call something that can, and then you still answer at the keyboard.
- the prompt needs reading. A permission is a command you should see before you allow it.
The same hooks, read by Grenade
Grenade is built on these hooks. It starts Claude Code with them for that session only (claude --settings), so nothing in ~/.claude changes, and it maps them to a status:
| Hook | Status | Color |
|---|---|---|
UserPromptSubmit, PreToolUse, PostToolUse |
Working | Blue |
PermissionRequest, and a Notification for a permission prompt or a request for input |
Needs an answer | Amber |
Stop |
Finished | Green |
One detail matters here: Claude Code’s idle notification arrives about a minute after it stopped, when the session is marked as waiting already. Grenade leaves the status alone for that one, so a session you have looked at does not light up again.
The status shows per session, in the list on your phone and in the Mac app. A permission comes as a card with the full command, and you answer it there.
brew install holdgrenade/tap/grenade
grenade setup
grenade new api --cwd ~/code/api --agent claude
Read on: Grenade for Claude Code, approving from your phone, and how it compares with Anthropic’s own Remote Control.