Als je Claude Code-notificaties niet meer werken, ligt dat bijna altijd aan een van vier dingen: de hook is niet geladen, de hook draait maar faalt, het event waarop je vertrouwt vuurt niet wanneer je verwacht, of het besturingssysteem verbergt de melding. Voer /hooks uit in Claude Code om te zien wat er geladen is, start een sessie met claude --debug om te zien wat elke hook echt deed, en controleer daarna de notificatie-instellingen op je computer of telefoon. Gebruik je Claude Code Notifier, dan dekken ccn doctor en ccn test het meeste hiervan in twee commando's.
De checklist hieronder gaat van de meest voorkomende oorzaak naar de minst voorkomende. Hij werkt op Mac, Windows en Linux.
011. Controleer of Claude Code de hook heeft geladen
Typ /hooks in de prompt van Claude Code. Dat is een alleen-lezen overzicht van elke hook die Claude Code heeft geladen, met bij elke hook waar die vandaan komt: user settings, project settings, local settings, een plugin of de huidige sessie. Selecteer een hook om het exacte commando te zien en het bestand waarin hij is gedefinieerd.
Staat je hook niet in de lijst?
- De JSON is ongeldig. Settings-bestanden zijn strikte JSON. Een komma aan het eind of een
//-commentaar maakt het bestand kapot, en Claude Code meldt bij de volgende start een Settings Error. Voerclaude doctoruit om te zien welke entries Claude Code heeft afgewezen. - Het bestand staat op de verkeerde plek. Persoonlijke hooks horen in
~/.claude/settings.json(op Windows%USERPROFILE%\.claude\settings.json). Projecthooks horen in.claude/settings.jsonbinnen het project. Voer/statusuit en kijk naar de regelSetting sourcesom te zien welke bestanden geladen zijn. - De eventnaam klopt niet. Eventnamen zijn hoofdlettergevoelig:
Notification,Stop,PermissionRequest. Een onbekende eventnaam verschijnt als Settings Warning en wordt overgeslagen. - Hooks staan uit.
"disableAllHooks": truein een willekeurig settings-bestand zet alle hooks uit. Zegt/hooksOnly hooks from managed settings run here, dan heeft je organisatieallowManagedHooksOnlyingesteld en draaien je eigen hooks niet. - De wijziging is niet opgepikt. Claude Code laadt settings normaal vanzelf opnieuw. Verschijnt de hook na een paar seconden nog niet, herstart dan de sessie.
022. Accepteer workspace trust
In een interactieve sessie houdt Claude Code hooks uit alle settings-bestanden tegen, ook die in je eigen ~/.claude/settings.json, totdat je de workspace trust-dialoog voor die map accepteert. Heb je die dialoog weggeklikt, of zit je in een map waarin je Claude Code nog nooit hebt geopend, dan draaien je hooks daar niet. Start claude in die map en accepteer de dialoog.
033. Zorg dat het event vuurt wanneer jij denkt
Veel "kapotte" notificaties zijn eigenlijk een kwestie van timing. Uit de hooks-referentie van Anthropic:
Notification met permission_promptEen permission prompt wacht al zo'n zes seconden en je hebt niets getypt. Elke toetsaanslag reset de timer.Notification met idle_promptOngeveer 60 seconden nadat Claude klaar is, als je niets hebt getypt en er geen background agent meer draait.StopElke keer dat Claude klaar is met antwoorden. Niet bij een onderbreking. Bij API-fouten vuurt in plaats daarvan StopFailure.PermissionRequestOp het moment dat Claude Code je om toestemming gaat vragen.Test je een Notification-hook terwijl je in de terminal typt, dan vuurt hij misschien nooit. Ga naar een ander venster en wacht. Wil je direct een melding als een beurt eindigt, gebruik dan Stop; de Stop hook-gids legt dat uit.
Controleer ook je permission mode. Recente versies van Claude Code starten interactieve sessies in auto mode, waarin een classifier de meeste acties goedkeurt zonder te vragen. Geen prompt betekent geen permission_prompt-notificatie en geen PermissionRequest-hook. Om permission-meldingen te testen druk je op Shift+Tab tot de statusbalk manual mode toont, en vraag je Claude iets te doen waarvoor goedkeuring nodig is. In Permission modes uitgelegd lees je de details.
Ook matchers zijn hoofdlettergevoelig. Een PermissionRequest-matcher bash matcht niet met de Bash-tool.
044. Voer het hook-commando zelf uit
Kopieer het commando uit /hooks en voer het in een terminal uit met voorbeeldinput:
echo '{"hook_event_name":"Stop","cwd":"/tmp","last_assistant_message":"done"}' | ./my-hook.sh
echo $?
Veelvoorkomende fouten:
command not found: gebruik een absoluut pad naar het script, of${CLAUDE_PROJECT_DIR}voor scripts in het project.- Het script doet helemaal niets: maak het uitvoerbaar met
chmod +x ./my-hook.sh. jq: command not found: installeerjq, of parse de JSON met Python of Node.js.
055. Lees het debuglog
Start Claude Code met claude --debug. Er verschijnt niets extra's in de terminal; het log gaat naar ~/.claude/debug/<session-id>.txt. Wil je zelf het pad kiezen, gebruik dan claude --debug-file /tmp/claude.log en draai tail -f /tmp/claude.log in een andere terminal. Loopt de sessie al, dan zet /debug logging aan en vertelt waar het log staat.
Zoek naar regels die beginnen met Hooks:. Elke regel noemt het event, het commando, hoe het afliep (finished with status 0, timed out, failed to start) en hoe lang het duurde. Voor meer detail over matching zet je CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose.
Twee problemen zie je alleen hier:
- Je shellprofiel print iets. Als
~/.bashrcof~/.zshrceenechouitvoert en de shell het bestand inleest, komt die tekst vóór de JSON-output van je hook terecht, en behandelt Claude Code de output als platte tekst. Zoek in het log naarHook output does not start with {. Zet output in je profiel binnenif [[ $- == *i* ]]; then ... fi, zodat die alleen in interactieve shells draait. - Geen terminal om naar te schrijven. Op Mac en Linux draaien command hooks zonder controlling terminal. Een hook die de bel probeert te laten klinken of escape codes naar
/dev/ttyschrijft, faalt stilletjes. Gebruik in plaats daarvan een desktopnotificatie-commando, of de eigen instellingpreferredNotifChannelvan Claude Code, uitgelegd in de gids over de terminal bell.
066. Controleer het besturingssysteem
Als de debug log zegt dat de hook eindigde met status 0 en je toch niets zag, dan heeft het besturingssysteem de melding verborgen. Controleer of de app die de melding toont meldingen mag weergeven, en of Focus (Mac), Niet storen (Windows) of de niet-storen-schakelaar van je Linux-desktop uit staat. Op Linux moet er een notification daemon draaien.
Platformspecifieke commando's vind je in de handleidingen voor macOS, Windows en Linux.
07Als je Claude Code Notifier gebruikt
Claude Code Notifier is een onafhankelijke tool (niet gemaakt door Anthropic) die een klein programma, ccn, installeert als Claude Code-hooks. Alles hierboven geldt nog steeds, want ccn is gewoon een hook zoals elke andere. Begin met de eigen checks:
ccn doctorcontroleert de hooks, de credentials, de verbinding met de server en de aanwezigheidsdetectie. Los eerst op wat hij meldt.ccn teststuurt een testmelding. Komt die aan, dan ligt het probleem bij het event of een instelling, niet bij de pipeline.ccn devicestoont de telefoons die aan deze computer gekoppeld zijn. Staat er niets, koppel dan opnieuw metccn pair; de koppelhandleiding legt het stap voor stap uit.ccn config showtoont de actieve instellingen. Controleer ofnotify_on_done,notify_on_permissionennotify_on_questionaan staan, en ofquiet_hourshet huidige tijdstip niet omvat. Instellingen die je op de telefoon wijzigt, komen op de computer terecht metccn sync.
Een paar dingen lijken fouten, maar zijn zo bedoeld:
- Je zit achter het toetsenbord. Als je in de afgelopen 30 seconden hebt getypt, wacht er niets op de telefoon en vraagt de terminal het gewoon zoals altijd. Met
quiet_when_presentaan (de standaard) krijgt de telefoon niets zolang je in de terminal zit waarin Claude draait, en een informatiekaart als je in een andere app actief bent. - Dubbele of ontbrekende meldingen op een Mac. Draai de oudere Mac-menubalkapp en
ccnniet tegelijk op dezelfde Mac. - Lang niet gebruikt. Als een telefoon of computer 60 dagen niet gebruikt wordt, verwijdert de server de koppeling en moet je opnieuw koppelen.
Controleer op de telefoon zelf of meldingen voor de app zijn toegestaan, en of Focus (iPhone) of Niet storen (Android) ze niet dempt. Op Android kan batterijoptimalisatie meldingen van sommige apps vertragen; komen meldingen te laat binnen, sta de app dan onbeperkt toe in de batterij-instellingen. Heb je settings.json met de hand aangepast, dan vertelt ccn doctor je of de hooks er nog in staan. ccn upgrade werkt bij naar de nieuwste release.
08FAQ
Waarom gaat mijn Notification hook maar af en toe af?
De types permission_prompt en idle_prompt worden getimed op het moment dat je weg lijkt te zijn. permission_prompt wacht ongeveer zes seconden zonder typen, en idle_prompt ongeveer 60 seconden nadat Claude klaar is. Ben je aan het typen, dan worden ze uitgesteld. Gebruik PermissionRequest of Stop voor een direct signaal.
Waar staat de debug log van Claude Code?
Draai claude --debug, dan wordt de log weggeschreven naar ~/.claude/debug/<session-id>.txt. Gebruik claude --debug-file <path> om zelf de locatie te kiezen, of /debug binnen een lopende sessie.
ccn test werkt, maar echte meldingen komen niet aan. Hoe kan dat?
De pipeline is in orde, dus kijk naar instellingen en timing. Controleer notify_on_* en quiet_hours in ccn config show, onthoud dat er niets wordt verstuurd zolang je in de terminal zit met quiet_when_present aan, en check de permission mode in Claude Code.