Unter macOS schickt Claude Code in Ghostty, Kitty und iTerm2 bereits eine Desktop-Mitteilung (bei iTerm2 musst du die Alert-Einstellungen aktivieren), in Apple Terminal und den meisten anderen Terminals kommt aber nichts an. Für eine Mitteilung in jedem Terminal trägst du in ~/.claude/settings.json einen Notification-Hook ein, der osascript -e 'display notification ...' ausführt, und zusätzlich einen Stop-Hook, wenn du sofort wissen willst, dass Claude fertig ist. Erlaube in den Systemeinstellungen Mitteilungen für den Skripteditor, sonst schlägt der osascript-Befehl kommentarlos fehl.
01Was Claude Code von sich aus macht
Claude Code löst ein Notification-Event aus, wenn es eine Aufgabe abgeschlossen hat oder auf eine Berechtigung wartet und du anscheinend nicht am Terminal bist. Was du dann siehst, hängt laut Terminal-Guide von Anthropic vom Terminal ab:
In iTerm2 öffnest du Settings > Profiles > Terminal, setzt den Haken bei Notification Center Alerts, klickst dann auf Filter Alerts und aktivierst Send escape sequence-generated alerts. Prüf außerdem unter Systemeinstellungen > Mitteilungen, ob iTerm2 Mitteilungen senden darf.
In Apple Terminal bekommst du zumindest einen Ton. Setz "preferredNotifChannel": "terminal_bell" in ~/.claude/settings.json und aktiviere Hörbarer Signalton unter Einstellungen > Profile > Erweitert. Details dazu findest du im Guide zur Terminal-Glocke.
Der eingebaute Alert hat Grenzen: Er feuert nur, wenn Claude Code glaubt, dass du weg bist, sagt nur, dass etwas passiert ist, und verlässt nie den Rechner.
02Ein Notification-Hook mit osascript
Ein Hook funktioniert in jedem Terminal, auch in IDE-Terminals. Das hier ist das macOS-Beispiel aus dem Hooks-Guide von Anthropic. Füg es in ~/.claude/settings.json ein und lass vorhandene Keys stehen:
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"
}
]
}
]
}
}
Gib in Claude Code /hooks ein, um zu prüfen, ob er unter Notification aufgeführt ist.
Die Berechtigung für den Skripteditor
osascript verschickt Mitteilungen im Namen des Skripteditors. Hat der Skripteditor keine Mitteilungsberechtigung, schlägt der Befehl still fehl, und macOS fragt nicht nach. Führ das einmal im Terminal aus:
osascript -e 'display notification "test"'
Beim ersten Mal erscheint nichts. Öffne Systemeinstellungen > Mitteilungen, such Skripteditor und aktiviere Mitteilungen erlauben. Führ den Befehl noch einmal aus, dann sollte die Testmitteilung kommen.
Wann er feuert
Der leere Matcher greift bei jedem Benachrichtigungstyp. Die zwei wichtigsten sind permission_prompt (Claude wartet seit etwa sechs Sekunden auf eine Freigabe und du hast nichts eingegeben) und idle_prompt (Claude ist seit etwa 60 Sekunden fertig und du hast seitdem nichts eingegeben). Im Guide zum Notification hook findest du alle Typen samt Timing.
03Sofort erfahren, wenn Claude fertig ist
idle_prompt wartet eine Minute. Willst du sofort Bescheid bekommen, füg einen Stop-Hook hinzu, der läuft, sobald Claude seinen Turn beendet. Stop braucht keinen Matcher:
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude has finished\" with title \"Claude Code\" sound name \"Glass\"'"
}
]
}
]
}
}
sound name akzeptiert jeden Sound aus /System/Library/Sounds, etwa Glass, Ping oder Hero. Willst du nur einen Ton, reicht afplay /System/Library/Sounds/Glass.aiff als Befehl. Mehr zu diesem Event im Guide zum Stop hook.
04Die echte Nachricht anzeigen
Hooks bekommen JSON über die Standardeingabe. Der Notification-Input enthält ein message-Feld, etwa „Claude needs your permission“. Ein kleines Skript kann diesen Text in die Mitteilung packen. Speicher das als ~/.claude/hooks/notify-mac.sh:
#!/bin/bash
msg=$(jq -r '.message // "Claude Code needs your attention"')
osascript -e 'on run argv' \
-e 'display notification (item 1 of argv) with title "Claude Code"' \
-e 'end run' "$msg"
Weil der Text als Argument übergeben wird und nicht im AppleScript-String steht, können Anführungszeichen in der Nachricht den Befehl nicht kaputt machen. Mach das Skript mit chmod +x ~/.claude/hooks/notify-mac.sh ausführbar und setz den Hook-Befehl auf ~/.claude/hooks/notify-mac.sh. Das Skript braucht jq (brew install jq, falls jq --version fehlschlägt).
05terminal-notifier: per Klick zurück ins Terminal
Klickst du auf eine Mitteilung von osascript, öffnet sich der Skripteditor – nicht gerade, wo du hinwillst. Mit terminal-notifier legst du fest, welche App in den Vordergrund kommt:
brew install terminal-notifier
terminal-notifier -title "Claude Code" -message "Claude has finished" -sound default -activate com.googlecode.iterm2
Nimm com.apple.Terminal für Apple Terminal oder die Bundle-ID deines Editors. Derselbe Befehl kommt ins command-Feld des Hooks. Beim ersten Mal musst du in den Systemeinstellungen Mitteilungen für terminal-notifier erlauben.
06Fokus und Nicht stören
All das sind normale macOS-Mitteilungen, ein Fokus-Modus kann sie also ausblenden. Verschwinden sie zu bestimmten Zeiten, prüf Systemeinstellungen > Fokus und erlaube die App, die sie verschickt (Skripteditor, terminal-notifier oder dein Terminal). Für Benachrichtigungen, die stattdessen deine eigenen Zeiten respektieren, sieh dir Ruhezeiten und Nicht stören an.
07Wo Claude Code Notifier ins Spiel kommt
Die Hooks oben sind eine gute Lösung, wenn du am Mac sitzt und nur einen kleinen Stups willst. Sobald du weggehst, reichen sie nicht mehr: Eine Mac-Mitteilung erreicht dich nicht in der Küche und kann Claude nicht antworten.
Claude Code Notifier ist ein unabhängiges Tool (von TouchTap, nicht von Anthropic), das auf denselben Hooks aufbaut. Das kostenlose Kommandozeilentool ccn läuft auf Mac, Windows und Linux. Installier es auf deinem Mac mit:
curl -fsSL https://claudecodenotifier.com/install.sh | sh
oder mit Homebrew: brew trust --formula touch-tap/tap/ccn && brew install touch-tap/tap/ccn. Es trägt seine Hooks in ~/.claude/settings.json ein, lässt den Rest der Datei in Ruhe und legt ein Backup an. Ab dann zeigt es eine macOS-Mitteilung, wenn Claude fertig ist, eine Berechtigung braucht oder eine Frage stellt – ganz ohne Netzwerk und Handy.
Koppelst du ein iPhone oder Android-Handy, kommen dieselben Events als Push-Benachrichtigungen an, und du kannst vom Handy aus Berechtigungen erlauben oder ablehnen, eine Antwort auf Claudes Frage auswählen oder die nächste Anweisung schicken. Hast du in den letzten 30 Sekunden getippt, fragt das Terminal wie gewohnt und auf dem Handy wartet nichts. Mehr dazu unter Handy koppeln und auf der ccn-Seite. Die Handy-Apps brauchen ein Abo oder einen Lifetime-Kauf; siehe Preise.
Wenn du ccn nutzt, entfern deine eigenen osascript-Hooks, sonst bekommst du für jedes Event zwei Mitteilungen. Es gibt außerdem eine ältere Menüleisten-App für den Mac; lass sie nicht parallel zu ccn auf demselben Mac laufen.
08FAQ
Warum zeigt mein osascript-Hook nichts an?
Meistens fehlt dem Skripteditor die Berechtigung für Mitteilungen, und macOS verwirft die Mitteilung ohne Fehlermeldung. Führ einmal osascript -e 'display notification "test"' aus und erlaube dann den Skripteditor unter Systemeinstellungen > Mitteilungen. Klappt es immer noch nicht, prüf, ob ein Fokus-Modus aktiv ist und ob /hooks deinen Hook auflistet.
Schickt Claude Code macOS-Mitteilungen ganz ohne Einrichtung?
Ja, in Ghostty und Kitty, und in iTerm2, sobald dort die Mitteilungszentrale-Hinweise aktiviert sind. Apple Terminal und IDE-Terminals bekommen standardmäßig keine Desktop-Mitteilung, dort brauchst du einen Hook oder ccn.
Wie bekomme ich eine Mitteilung direkt, wenn Claude fertig ist, und nicht erst eine Minute später?
Nimm einen Stop-Hook. Die idle_prompt-Mitteilung kommt erst etwa 60 Sekunden, nachdem Claude fertig ist, und nur, wenn du nichts getippt hast. Stop läuft dagegen am Ende jedes Turns.
Kann ich statt eines Banners einen Ton hören?
Ja. Nimm afplay /System/Library/Sounds/Glass.aiff als Hook-Befehl oder ergänze den osascript-Befehl um sound name "Glass", dann bekommst du beides.
Kann ich eine Berechtigung direkt aus der macOS-Mitteilung freigeben?
Nicht mit osascript oder terminal-notifier, die zeigen nur Text an. Um eine Berechtigung per Hook zu beantworten, brauchst du das PermissionRequest-Event; siehe Berechtigungsanfragen per Hook beantworten, oder gib sie mit Claude Code Notifier vom Handy aus frei.