Blog

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.

Try it on your own agents.

Two commands on the Mac, one QR code on the phone. No account.