Claude Code notifications not working
Why a Claude Code notification hook fires but no banner appears on macOS, and the checks that fix it, from Focus mode to which settings file the hook lives in.
By Piotr Jura, creator of AgentNotch. Tested on macOS with AgentNotch v1.3.1.
❯ claude
● Wiring the license claim endpoint
⎿ Edited lib/license/store.ts (+38 −6)
⎿ Edited app/api/license/claim/route.ts (+21 −3)
⎿ Ran npm test (42 passed)
● Run npm run db:migrate?
❯ 1. Yes 2. No, tell Claude what to do
waiting for your approval
You wired up a Notification hook, saw it work once, and now nothing. This usually splits into two problems: the hook isn't firing, or it fires and macOS eats the banner. Work through them in that order.
- Run
/hooksin the session. It lists what is actually loaded. If your hook isn't there, the session is reading a different settings file than the one you edited: project settings in.claude/settings.jsontake precedence over~/.claude/settings.json, and.claude/settings.local.jsonbeats both. - Check the matcher. A
Notificationhook with an empty matcher fires on everything; a specific one likepermission_promptoridle_promptfires only on that event, and a typo in it fails silently. - Watch it live with
claude --debug hooksfrom the terminal. If the command runs and you still see nothing, the rest is macOS. - Grant the notification permission. A banner sent with
osascriptshows up under Script Editor in System Settings, Notifications, and it's off until you allow it.terminal-notifierneeds its own entry. - Turn off Focus. Do Not Disturb suppresses the banner without telling anyone, and this is the answer more often than it should be.
- Check what the terminal swallows. A bell inside tmux, or inside the VS Code or Cursor integrated terminal, frequently never reaches you even when everything upstream is correct.
Where AgentNotch fits
Every step above is worth doing, and none of it changes the shape of a notification: it fires once, and if you miss it, it's gone. That's the part people are actually fighting when they debug this for the third time.
AgentNotch keeps the state visible instead. Session status lives in the menu bar while the session runs, so a finished or waiting session stays marked until you act on it, and with several open it points at the one that needs you. There is no hook to configure and nothing to keep working. It runs on your Mac and never reads your code or keys.
Questions
- Why are my Claude Code notifications not working?
- The two usual causes are the hook never firing and the banner being swallowed by macOS. Check the hook is registered by running the /hooks command, then check macOS is allowed to show the notification, since a banner sent by osascript needs Script Editor enabled in System Settings and is suppressed by Focus mode.
- Why is my Claude Code hook not firing?
- Usually the hook is in a settings file the session is not reading, or the matcher does not match. Project settings in .claude/settings.json override your user settings, so a hook in one file can be replaced by the other, and running /hooks in the session shows what is actually loaded.
- Do Claude Code notifications work inside tmux or VS Code?
- The hook fires normally, but a terminal bell inside tmux or an editor's integrated terminal is often swallowed before it reaches you. A macOS banner or a menu-bar monitor is more reliable in those setups because neither depends on the terminal passing the signal through.
- How do I debug a Claude Code notification hook?
- Run /hooks in the session to confirm it is registered, then run claude --debug hooks from the terminal to watch the hook evaluate as it fires. If the command runs but nothing appears, the problem is on the macOS side rather than in Claude Code.
Keep reading
See which agent needs you.
Try AgentNotchfree for 14 days, no card. Watch Claude Code, Cursor, and Codex from your Mac's menu bar.
Updated 2026-07-18