Wenn Claude Code-Benachrichtigungen nicht mehr funktionieren, liegt es fast immer an einem von vier Dingen: Der Hook ist nicht geladen, der Hook läuft, schlägt aber fehl, das Event, auf das du dich verlässt, wird nicht dann ausgelöst, wann du es erwartest, oder das Betriebssystem blendet den Hinweis aus. Führ /hooks in Claude Code aus, um zu sehen, was geladen ist, starte eine Session mit claude --debug, um zu sehen, was jeder Hook tatsächlich gemacht hat, und prüf dann die Benachrichtigungseinstellungen auf deinem Computer oder Handy. Wenn du Claude Code Notifier nutzt, decken ccn doctor und ccn test das meiste davon mit zwei Befehlen ab.
Die Checkliste unten geht von der häufigsten zur seltensten Ursache. Sie gilt für Mac, Windows und Linux.
011. Prüfen, ob Claude Code den Hook geladen hat
Gib /hooks am Claude Code-Prompt ein. Das ist eine schreibgeschützte Übersicht aller Hooks, die Claude Code geladen hat, und zu jedem steht dabei, woher er kommt: User-Settings, Projekt-Settings, lokale Settings, ein Plugin oder die aktuelle Session. Wähl einen Hook aus, um den genauen Befehl und die Datei zu sehen, in der er definiert ist.
Wenn dein Hook nicht in der Liste steht:
- Das JSON ist ungültig. Settings-Dateien sind striktes JSON. Ein abschließendes Komma oder ein
//-Kommentar macht die Datei kaputt, und Claude Code meldet beim nächsten Start einen Settings Error. Führclaude doctoraus, um zu sehen, welche Einträge Claude Code abgelehnt hat. - Die Datei liegt am falschen Ort. Persönliche Hooks gehören in
~/.claude/settings.json(unter Windows%USERPROFILE%\.claude\settings.json). Projekt-Hooks gehören in.claude/settings.jsonim Projekt. Führ/statusaus und schau in die ZeileSetting sources, um zu sehen, welche Dateien geladen wurden. - Der Event-Name ist falsch. Event-Namen unterscheiden Groß- und Kleinschreibung:
Notification,Stop,PermissionRequest. Ein unbekannter Event-Name erscheint als Settings Warning und wird übersprungen. - Hooks sind abgeschaltet.
"disableAllHooks": truein irgendeiner Settings-Datei schaltet alle Hooks ab. Wenn/hooksOnly hooks from managed settings run hereanzeigt, hat deine OrganisationallowManagedHooksOnlygesetzt, und deine eigenen Hooks laufen nicht. - Die Änderung wurde nicht erkannt. Normalerweise lädt Claude Code die Settings selbst neu. Wenn der Hook nach ein paar Sekunden nicht auftaucht, starte die Session neu.
022. Workspace-Trust akzeptieren
In einer interaktiven Session hält Claude Code Hooks aus allen Settings-Dateien zurück, auch aus deiner eigenen ~/.claude/settings.json, bis du den Workspace-Trust-Dialog für den Ordner akzeptierst. Wenn du den Dialog weggeklickt hast oder in einem Ordner bist, in dem du Claude Code noch nie geöffnet hast, laufen deine Hooks dort nicht. Starte claude in diesem Ordner und akzeptier den Dialog.
033. Sicherstellen, dass das Event dann ausgelöst wird, wann du denkst
Viele „kaputte“ Benachrichtigungen sind in Wahrheit ein Timing-Problem. Aus der Hooks-Referenz von Anthropic:
Notification mit permission_promptEin Permission-Prompt wartet seit etwa sechs Sekunden und du hast nichts getippt. Jeder Tastendruck setzt den Timer zurück.Notification mit idle_promptEtwa 60 Sekunden, nachdem Claude fertig ist, sofern du nichts getippt hast und kein Hintergrund-Agent mehr läuft.StopJedes Mal, wenn Claude mit einer Antwort fertig ist. Nicht bei einem Abbruch. Bei API-Fehlern wird stattdessen StopFailure ausgelöst.PermissionRequestIn dem Moment, in dem Claude Code dich gleich um eine Berechtigung fragt.Wenn du also einen Notification-Hook testest, während du im Terminal tippst, wird er womöglich nie ausgelöst. Wechsel in ein anderes Fenster und warte. Für einen Hinweis genau dann, wenn ein Turn endet, nimm Stop; mehr dazu im Guide zum Stop hook.
Prüf auch deinen Permission-Modus. Aktuelle Versionen von Claude Code starten interaktive Sessions im Auto-Modus, in dem ein Classifier die meisten Aktionen ohne Nachfrage genehmigt. Kein Prompt heißt: keine permission_prompt-Benachrichtigung und kein PermissionRequest-Hook. Um Permission-Hinweise zu testen, drück Shift+Tab, bis die Statusleiste den manuellen Modus anzeigt, und bitte Claude dann um etwas, das eine Genehmigung braucht. Details findest du unter Permission-Modi erklärt.
Auch Matcher unterscheiden Groß- und Kleinschreibung. Ein PermissionRequest-Matcher bash passt nicht auf das Tool Bash.
044. Den Hook-Befehl selbst ausführen
Kopier den Befehl aus /hooks und führ ihn mit Beispiel-Input im Terminal aus:
echo '{"hook_event_name":"Stop","cwd":"/tmp","last_assistant_message":"done"}' | ./my-hook.sh
echo $?
Typische Fehler:
command not found: Nutze einen absoluten Pfad zum Skript oder${CLAUDE_PROJECT_DIR}für Skripte im Projekt.- Das Skript macht gar nichts: Mach es mit
chmod +x ./my-hook.shausführbar. jq: command not found: Installierjqoder parse das JSON mit Python oder Node.js.
055. Das Debug-Log lesen
Starte Claude Code mit claude --debug. Im Terminal erscheint nichts zusätzlich; das Log landet in ~/.claude/debug/<session-id>.txt. Um den Pfad selbst festzulegen, nutz claude --debug-file /tmp/claude.log und führ in einem anderen Terminal tail -f /tmp/claude.log aus. Läuft die Session schon, schaltet /debug das Logging ein und sagt dir, wo das Log liegt.
Such nach Zeilen, die mit Hooks: beginnen. Jede nennt das Event, den Befehl, wie er geendet hat (finished with status 0, timed out, failed to start) und wie lange er gedauert hat. Für mehr Details zum Matching setz CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose.
Zwei Probleme siehst du nur hier:
- Dein Shell-Profil gibt etwas aus. Wenn
~/.bashrcoder~/.zshrceinechoausführt und die Shell die Datei einliest, landet dieser Text vor der JSON-Ausgabe deines Hooks, und Claude Code behandelt die Ausgabe als reinen Text. Such im Log nachHook output does not start with {. Pack Ausgaben im Profil inif [[ $- == *i* ]]; then ... fi, damit sie nur in interaktiven Shells laufen. - Kein Terminal zum Schreiben. Unter Mac und Linux laufen Command-Hooks ohne steuerndes Terminal. Ein Hook, der die Terminal-Glocke läuten oder Escape-Codes nach
/dev/ttyschreiben will, schlägt stillschweigend fehl. Nutz stattdessen einen Desktop-Benachrichtigungsbefehl oder die eigenepreferredNotifChannel-Einstellung von Claude Code, beschrieben im Guide zur Terminal-Glocke.
066. Das Betriebssystem prüfen
Wenn das Debug-Log sagt, dass der Hook mit Status 0 beendet wurde und du trotzdem nichts gesehen hast, hat das Betriebssystem die Benachrichtigung unterdrückt. Prüfe, ob die App, die den Hinweis anzeigt, Benachrichtigungen senden darf, und ob Fokus (Mac), Nicht stören (Windows) bzw. der Nicht-stören-Schalter deines Linux-Desktops aus ist. Unter Linux muss außerdem ein Notification-Daemon laufen.
Plattformspezifische Befehle findest du in den Guides für macOS, Windows und Linux.
07Wenn du Claude Code Notifier nutzt
Claude Code Notifier ist ein unabhängiges Tool (nicht von Anthropic), das ein kleines Programm, ccn, als Claude Code-Hooks installiert. Alles oben gilt weiterhin, denn ccn ist ein Hook wie jeder andere. Fang mit den eingebauten Checks an:
ccn doctorprüft die Hooks, die Zugangsdaten, die Verbindung zum Server und die Anwesenheitserkennung. Behebe zuerst alles, was dabei gemeldet wird.ccn testschickt eine Testbenachrichtigung. Kommt sie an, liegt das Problem am Event oder an einer Einstellung, nicht an der Übertragung.ccn deviceslistet die Smartphones auf, die mit diesem Rechner gekoppelt sind. Ist keins aufgeführt, koppel neu mitccn pair; der Kopplungs-Guide führt dich durch.ccn config showzeigt die aktiven Einstellungen. Prüfe, obnotify_on_done,notify_on_permissionundnotify_on_questionan sind undquiet_hoursnicht die aktuelle Uhrzeit abdeckt. Auf dem Smartphone geänderte Einstellungen holst du mitccn syncauf den Rechner.
Manches sieht nach einem Fehler aus, ist aber so gewollt:
- Du sitzt an der Tastatur. Wenn du in den letzten 30 Sekunden getippt hast, wartet nichts aufs Smartphone und das Terminal fragt wie gewohnt. Mit
quiet_when_present(Standard: an) bekommt das Smartphone nichts, solange du im Terminal bist, in dem Claude läuft, und nur eine Info-Karte, wenn du in einer anderen App aktiv bist. - Doppelte oder fehlende Hinweise auf dem Mac. Lass die ältere Mac-Menüleisten-App und
ccnnicht gleichzeitig auf demselben Mac laufen. - Eine lange Pause. Wird ein Smartphone oder Rechner 60 Tage nicht genutzt, löscht der Server die Kopplung und du musst neu koppeln.
Prüfe auf dem Smartphone selbst, ob Benachrichtigungen für die App erlaubt sind und Fokus (iPhone) bzw. Nicht stören (Android) sie nicht stummschaltet. Unter Android kann die Akkuoptimierung Benachrichtigungen mancher Apps verzögern; kommen Hinweise verspätet an, erlaube der App in den Akkueinstellungen uneingeschränkte Ausführung. Wenn du settings.json von Hand bearbeitet hast, sagt dir ccn doctor, ob die Hooks noch da sind. ccn upgrade aktualisiert auf das neueste Release.
08FAQ
Warum feuert mein Notification hook nur manchmal?
Die Typen permission_prompt und idle_prompt sind darauf abgestimmt, wann du scheinbar weg bist. permission_prompt wartet etwa sechs Sekunden ohne Tippen, idle_prompt etwa 60 Sekunden, nachdem Claude fertig ist. Solange du tippst, werden sie verschoben. Für ein sofortiges Signal nimm PermissionRequest oder Stop.
Wo liegt das Debug-Log von Claude Code?
Starte claude --debug, dann wird das Log nach ~/.claude/debug/<session-id>.txt geschrieben. Mit claude --debug-file <path> legst du den Ort selbst fest, oder du nutzt /debug in einer laufenden Session.
ccn test funktioniert, aber echte Benachrichtigungen kommen nicht an. Warum?
Die Übertragung funktioniert, also schau dir Einstellungen und Timing an. Prüfe in ccn config show die Werte notify_on_* und quiet_hours, denk daran, dass mit quiet_when_present nichts gesendet wird, solange du am Terminal bist, und prüfe den Berechtigungsmodus in Claude Code.