EN JA
Free download

How to Get Claude Code Notifications on macOS

Updated August 26, 2026

You kick off a task, switch to Slack, and come back ten minutes later to find Claude Code finished nine minutes ago — or worse, that it's been sitting on a permission dialog the whole time. Here's how to get notified the moment a session needs you, from a one-line setting to custom hooks to a full status monitor.

The two moments that matter

Claude Code blocks on you in two distinct situations, and they need different urgency:

Both are exposed through Claude Code hooks: the Notification event fires when Claude needs your attention (for permission prompts, shortly after the dialog appears unanswered — quick approvals don't spam you), and the Stop event fires when Claude finishes a response.

Option 1: native notifications from your terminal

Before writing any scripts, check your terminal — Claude Code can post macOS desktop notifications through Ghostty, Kitty, and iTerm2 when it's waiting for you.

Apple's stock Terminal.app has no such integration — for that, use the bell or hooks below.

Option 2: the terminal bell

Claude Code can ring the terminal bell when it needs attention. One line in ~/.claude/settings.json:

{
  "preferredNotifChannel": "terminal_bell"
}

Most terminals turn the bell into something visible: Terminal.app badges the tab, iTerm2 can post a notification for it, and tmux marks the window with a bell indicator. Crude, but it works everywhere and needs no scripts.

Option 3: custom macOS notifications via hooks

No extra tools needed — macOS's built-in osascript can post to Notification Center.

1. Create two small scripts

mkdir -p ~/.claude/scripts

cat > ~/.claude/scripts/notify-waiting.sh <<'EOF'
#!/bin/bash
# Claude Code "Notification" hook: a session needs your input.
osascript -e 'display notification "A session is waiting for your input" with title "Claude Code" sound name "Glass"'
EOF

cat > ~/.claude/scripts/notify-done.sh <<'EOF'
#!/bin/bash
# Claude Code "Stop" hook: a session finished responding.
osascript -e 'display notification "Finished responding" with title "Claude Code"'
EOF

chmod +x ~/.claude/scripts/notify-waiting.sh ~/.claude/scripts/notify-done.sh

2. Register them in ~/.claude/settings.json

Add a hooks section (or merge into your existing one). This applies to every project; use a project's .claude/settings.json instead to scope it.

{
  "hooks": {
    "Notification": [
      {
        "hooks": [
          { "type": "command", "command": "$HOME/.claude/scripts/notify-waiting.sh" }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          { "type": "command", "command": "$HOME/.claude/scripts/notify-done.sh" }
        ]
      }
    ]
  }
}

Start a new Claude Code session (hooks are read at startup), ask for something that runs a tool you haven't allowlisted, and leave the permission dialog unanswered for a few seconds — a notification should appear.

Optional refinements

Where notifications fall short

This setup is genuinely useful — we recommend it to everyone. But banners have structural limits you'll hit as usage grows:

The alternative: a persistent status window

AgentManager approaches the same problem as state you can glance at rather than events that interrupt you. It's a macOS menu bar app that keeps a small always-on-top window listing every Claude Code session with a status lamp — waiting, running, done, idle:

Setup is one click (it registers its hooks for you, and they're cleanly removable). It also coexists with the osascript setup above — hooks compose, so you can keep banners for Stop and let the window handle waiting states.

Never miss a waiting session

AgentManager surfaces the moment any Claude Code session needs you — free to use, no account required.

macOS 13+ — free plan shows up to 2 sessions at once