Guide

Claude Code notifications on Mac

Updated July 2026 6 min read

Claude Code fires a notification when it finishes a task and when it pauses for a permission prompt. On macOS you can surface that three ways: the built-in desktop notification (automatic only in Ghostty, Kitty, and iTerm2), a DIY notification hook that runs a shell command in any terminal, or a notch monitor that also clicks you back to the exact terminal. Here is how each one works, and when each is enough.

When Claude Code notifies you

Claude Code emits a notification at two moments that matter during a long run: when it finishes and is waiting for your next prompt, and when it pauses for a permission prompt and can go no further until you approve. The question is never whether the signal exists, but whether it actually reaches you once you have tabbed away to do something else. The three methods below are just different ways to catch that signal.

Method 1: the built-in notification

Out of the box, Claude Code posts a real macOS desktop notification in only three terminals: Ghostty, Kitty, and iTerm2. Ghostty and Kitty forward it to Notification Center with no setup. iTerm2 needs one switch: open Settings, Profiles, Terminal, enable Notification Center Alerts, then under Filter Alerts enable Send escape sequence-generated alerts.

In every other terminal, including Apple Terminal, Warp, WezTerm, and the VS Code integrated terminal, you get nothing until you opt into the terminal bell. Set preferredNotifChannel to "terminal_bell" in ~/.claude/settings.json:

{
  "preferredNotifChannel": "terminal_bell"
}

The catch

The built-in path gives you a bell or a bare banner. It cannot play a custom sound, and the banner is not clickable to anywhere useful. If a long task is running across several terminal windows, "which one just pinged?" is still a manual hunt.

Method 2: a DIY notification hook

For a real notification in any terminal, Claude Code can run a shell command the moment it needs your attention. Add a Notification hook to ~/.claude/settings.json. This one uses osascript, which is built into macOS, so there is nothing to install:

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"
          }
        ]
      }
    ]
  }
}

The empty matcher fires on everything. To split the two moments, set it to permission_prompt (Claude wants to approve a tool) or idle_prompt (Claude is done and waiting).

Gotcha most guides miss

osascript posts through the built-in Script Editor app. If Script Editor does not have notification permission, the command fails silently and macOS never prompts you. Run osascript -e 'display notification "test"' once in Terminal, then open System Settings, Notifications, find Script Editor, and turn on Allow Notifications.

Want a sound too? Add a second hook command that runs afplay /System/Library/Sounds/Glass.aiff. Want a richer, clickable banner? Run brew install terminal-notifier and swap the command for terminal-notifier -title "Claude Code" -message "Needs your attention" -sound default.

This is genuinely enough if you run one agent in one terminal and just want a ping when it is done. Be honest about the ceiling, though: it is still a plain notification. It tells you something happened, not which session, and clicking it can at best raise an app, never the exact terminal tab or split. And you own the upkeep, the JSON, the Script Editor permission, the terminal-notifier install, on every Mac you work from.

Method 3: alerts that jump you back

Vibe Island turns your Mac's notch into a live monitor for every Claude Code session. When a task finishes, an approval is waiting, or Claude asks a question, the notch surfaces it, with a sound if you want one, and one click takes you straight back to the exact terminal window, tab, or split that needs you. There is no JSON to edit and no permission to grant: it configures itself the first time you launch it.

Vibe Island FileEditWindowHelp
fix auth bug 3
fix auth bug ClaudeiTerm 27m
You: fix the auth bug in middleware
Writing middleware.ts
backend server
CodexTerminal1h
optimize queries
GeminiGhostty5h
Permission Request
Edit src/auth/middleware.ts
12const verify = (token) =>
13-  jwt.verify(token);
13+  if (!token) throw new
14+   AuthError('missing');
15+  return jwt.verify(token,
+3 -1
Claude asks
Which deployment target?
fix auth bug ClaudeiTerm 28m
You: fix the auth bug in middleware
Done — click to jump
backend server
CodexTerminal1h
optimize queries
GeminiGhostty5h
Approved
gemini — optimize-queries
Analyzing the slow queries.
Read(schema.prisma)
└── 1.2 KB
Edit(src/db/queries.ts)
└── Updated (+8 -23)
codex — backend-server
Building the REST endpoints.
Write(src/routes/users.ts)
└── New file (47 lines)
Bash(npm test)
└── 3 passed
claude — fix-auth-bug
Let me look at the auth module.
Searching for 6 patterns… (ctrl+o to expand)
Read 2 files (ctrl+o to expand)
 
Found the issue — token validation skips expiry check.
Terminal
Vibe Island
Every agent. One glance.
Claude Code, Codex, Gemini CLI, and Cursor — all in a single view.

Two things the DIY paths cannot do:

Act on it in place. A permission request or a question arrives as a card you can answer right there, approve, reject, or pick an option, without leaving what you were doing to find the terminal.

Watch every terminal and agent at once. The same panel covers 13+ terminals and every agent you run, so you are never guessing which window pinged, and one setup replaces a per-terminal, per-machine pile of hooks.

Which method should you use

01

The built-in bell or banner

Best if you run Claude Code in Ghostty, Kitty, or iTerm2, work in a single window, and only need to know that something happened. Zero install, but the least reach.

02

A DIY notification hook

Best if you are comfortable editing JSON and want a notification (or a sound) in a terminal the built-in path ignores. Enough for one agent in one terminal, as long as you do not mind maintaining it.

03

A notch monitor

Best if you run long tasks, juggle more than one terminal or agent, or want to approve and jump back without breaking focus. It trades a one-time download for zero ongoing setup, and it is the only option that routes you to the right session.

Common questions

Why am I not getting Claude Code notifications on my Mac?

Two causes are common. First, your terminal may not be one of the three that receive a desktop notification by default (Ghostty, Kitty, and iTerm2); in any other terminal you get nothing until you turn on the terminal bell or add a hook. Second, if you set up an osascript hook, the notification is posted through the built-in Script Editor app, which fails silently until you grant it notification permission in System Settings.

Does Claude Code notify me when a task finishes, or only when it needs input?

Both. Claude Code fires a notification when it finishes and is waiting for your next prompt, and when it pauses for a permission prompt. With a hook you can target each one: use the idle_prompt matcher for 'done and waiting', and permission_prompt for 'needs your approval'.

How do I get a notification in Apple Terminal or Warp?

Neither receives Claude Code's built-in desktop notification. You have three options: set preferredNotifChannel to terminal_bell in your settings to ring the terminal bell, add a Notification hook that runs osascript or terminal-notifier, or use a notch monitor that behaves the same in every terminal without any per-terminal setup.

Can I get a sound with the notification?

Yes. Add a hook command that runs afplay on a system sound, such as afplay /System/Library/Sounds/Glass.aiff, or install terminal-notifier and pass -sound default. A notch monitor like Vibe Island plays a completion sound with nothing to configure.

One notch for every agent, not just Claude Code

Notifications are one part of it. Vibe Island watches Claude Code alongside every other agent you run: Codex CLI, ZCode, Gemini CLI, Antigravity CLI, Cursor Agent, Trae, OpenCode, MiMoCode, Factory Droid, Qoder, Qwen, Grok Build, Kimi Code, DeepSeek, Mistral Vibe, Copilot, CodeBuddy, WorkBuddy, Kiro, Hermes, Amp, Pi Agent, Oh My Pi, and Gajae Code. It surfaces completion, approvals, and questions in a single notch, and clicks you back to the exact session every time. See the AI coding session monitor, start with Claude Code monitoring, or read how it tracks several agents at once.

Vibe Island app icon

Vibe Island · macOS 14+

Never miss a Claude Code task or approval on your Mac

Download Free Trial

2-day free trial · all features included · no card required