Claude Code notifications not working? Fixes
Updated 21 October 2026
You set up Claude Code notifications and nothing shows up, or it shows up late, or only some of the time. Most cases come down to a handful of causes: the six-second rule, a terminal that doesn’t support it, a hook that never registered, or your system blocking the alert. Work through this list from the top.
Quick checklist
| Symptom | Likely cause | Fix |
|---|---|---|
| Arrives late, or never while you’re typing | Claude Code waits until you seem away | Use a PermissionRequest hook |
| Nothing at all, no hook set up | Your terminal isn’t Ghostty, Kitty or iTerm2 | Bell or hook |
| Hook never runs | Wrong file, broken JSON or hooks turned off | Check with /hooks |
| Hook runs, no alert on screen | macOS or Linux blocks it | System settings |
| Nothing inside tmux | tmux swallows it | Allow passthrough |
| No alert when Claude asks you a question | Questions aren’t a notification type | PreToolUse on AskUserQuestion |
1. It arrives late, or not while you’re typing
This is by design. In the terminal, Claude Code only notifies you when you appear to be away:
permission_promptfires once you haven’t typed for about six seconds after the prompt appears. Every keystroke restarts that timer.idle_promptfires about 60 seconds after Claude finishes responding, only if you haven’t typed since and no background agent, such as a background subagent, is still running.
If you want an alert the moment Claude asks for permission, use a PermissionRequest hook instead of a Notification hook. It runs as soon as a tool call needs your decision. A hook that prints nothing and exits normally doesn’t approve or deny anything, so the prompt still waits for you:
~/.claude/settings.json{
"hooks": {
"PermissionRequest": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code needs permission\" with title \"Claude Code\"'"
}
]
}
]
}
}
On Linux, use notify-send 'Claude Code' 'Claude Code needs permission' as the command. One exception: PermissionRequest doesn’t run for a sandboxed command’s network request; that still only reaches you as permission_prompt.
2. Your terminal doesn’t support built-in notifications
Without any setup, Claude Code sends desktop notifications only in Ghostty, Kitty and iTerm2, and iTerm2 needs Settings → Profiles → Terminal → Notification Center Alerts turned on, with Send escape sequence-generated alerts enabled under Filter Alerts. In Warp, the VS Code integrated terminal and most others, you get nothing until you either turn on the bell or add a hook:
~/.claude/settings.json{
"preferredNotifChannel": "terminal_bell"
}
The full setup for each option is in How to get Claude Code notifications.
3. The hook never registered
- Check what Claude Code loaded. Type
/hooksin a session. If your hook isn’t listed, Claude Code didn’t read it. - Right file. Use
~/.claude/settings.jsonfor every project, or.claude/settings.jsoninside one project. Cloud sessions don’t read your local file. - Valid JSON. A missing comma or a second top-level
"hooks"key breaks the file. If you already have hooks, addNotificationinside the existing"hooks"object. - Hooks turned off. Look for
"disableAllHooks": truein your user or project settings. At work, an administrator can also allow only managed hooks, which blocks your own. - Right matcher. An empty matcher runs for every notification type.
permission_promptoridle_promptruns only for that one; a typo means it never matches.
4. The hook runs but no alert appears
- macOS:
osascriptnotifications come from Script Editor. If Script Editor isn’t allowed to send notifications, the command fails silently. Runosascript -e 'display notification "test"'in a terminal and check System Settings → Notifications → Script Editor. Focus modes and Do Not Disturb hide them too. - Linux:
notify-sendneeds a desktop notification daemon. SSH sessions, headless servers and most containers don’t have one. - Built-in notifications: your terminal app itself needs permission to show notifications in system settings.
5. You’re inside tmux
tmux swallows the escape sequences terminals use for notifications. Add set -g allow-passthrough on to ~/.tmux.conf, then run tmux source-file ~/.tmux.conf.
6. No alert when Claude asks you a question
When Claude stops to ask a multiple-choice question with the AskUserQuestion tool, it isn’t a permission prompt, and users report no Notification hook firing for it. To be alerted anyway, run your command before that tool with a PreToolUse hook:
~/.claude/settings.json{
"hooks": {
"PreToolUse": [
{
"matcher": "AskUserQuestion",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code has a question\" with title \"Claude Code\"'"
}
]
}
]
}
}
7. In the VS Code extension or the desktop app
There, Claude Code sends permission_prompt about six seconds after it asks, whether or not you’re typing, and skips it if you or a PermissionRequest hook answer first. Before Claude Code v2.1.233 it didn’t fire in these sessions at all, so update if you’re on an older version.
Skip the setup: approve from your browser with Agent Pets
Every fix above still ends with you going back to the terminal. Agent Pets uses Claude Code’s PermissionRequest hook, so it hears about a prompt the moment Claude asks, with no six-second wait, and lets you answer it from Chrome:
- Each Claude Code, OpenCode and omp session becomes a pet that walks along the bottom of every page. When one needs permission, its pet bounces; click it and answer Allow, Always or Deny.
- A capsule over each pet says Thinking, Your Turn or Done, and the toolbar badge counts the sessions waiting on you.
- In another app, a desktop notification names the pet that needs you, with Allow and Deny on it.
npx getagentpets init adds the hooks for you, next to any you already have. It runs entirely on your computer, and the terminal prompt keeps working as usual.
Get Agent Pets — was $25, now $6Get Agent Pets — $25
Questions
Why is my Claude Code notification delayed?
In the terminal, Claude Code waits until you seem away: about six seconds without typing for a permission prompt, and about 60 seconds after it finishes for “waiting for you”. Use a PermissionRequest hook for an immediate alert.
How do I check that my Claude Code hook is registered?
Type /hooks in a Claude Code session. It lists every hook Claude Code loaded and where each one came from.
Why don’t I get notifications in Warp or the VS Code terminal?
Built-in desktop notifications only work in Ghostty, Kitty and iTerm2. Elsewhere, set preferredNotifChannel to terminal_bell or add a Notification hook.
Can a notification hook approve the permission for me?
A Notification hook can’t. A PermissionRequest hook can return a decision, but a plain alert command shouldn’t. Agent Pets lets you approve from a pet on any Chrome page or from its desktop notification.
Sources: Claude Code’s documentation on hooks, terminal configuration and tools; GitHub issue #59908.