Een hook in Claude Code is een lokaal shell-commando dat Claude Code automatisch uitvoert op een vast punt in zijn eigen levenscyclus, ingesteld in .claude/settings.json in plaats van gevraagd in een prompt. Daar zit het hele verschil: een hook draait gegarandeerd, terwijl een instructie in een prompt waarschijnlijk wordt opgevolgd.
Als je al een tijdje met Claude Code werkt, gebruik je waarschijnlijk een CLAUDE.md-bestand om het model projectspecifieke instructies te geven. Je zou het bijvoorbeeld kunnen vertellen om "altijd Prettier te draaien na het bewerken van een bestand."
En meestal doet het precies dat. Maar soms... ook niet. Het blijft een AI, gewoon een loop in plaats van een strikte state machine, wat betekent dat gehoorzaamheid waarschijnlijk is, maar niet gegarandeerd.
Als iets elke keer zonder uitzondering moet gebeuren, zet je het niet in een prompt. Je zet het in een hook.
Wat zijn hooks?
Dat gegarandeerde draaien is het hele punt, en het is precies wat een prompt-instructie je niet geeft. Hooks zijn deterministisch.
Hooks configureer je in je .claude/settings.json-bestand. Omdat het configuraties op projectniveau zijn, kun je ze in je repository committen. Zo zorg je ervoor dat je hele team dezelfde geautomatiseerde workflow deelt.
Events in de levenscyclus
Bij het configureren van een hook kies je een event dat als trigger dient. Claude Code ondersteunt verschillende events:
- userPromptSubmit: Draait onmiddellijk wanneer je een prompt indient, nog voordat Claude het verwerkt.
- preToolUse: Draait vlak voordat een tool wordt uitgevoerd.
- postToolUse: Draait direct nadat een tool zijn taak heeft voltooid.
- notification: Draait wanneer Claude een melding naar de gebruiker stuurt.
- stop: Draait wanneer Claude klaar is met reageren en de interactie is afgerond.
Je kunt een matcher opgeven om de hook te beperken tot specifieke tools (bijv. alleen laten draaien bij edit- of bash-tools).
Die lijst met events is sindsdien gegroeid, en een van de nieuwere events verandert alleen wat jij op je scherm ziet. Een plugin die elk bericht van een tijdstempel voorziet combineert allebei de soorten: één hook die alleen jouw scherm aanpast en Claude nooit bereikt, en één die Claude de tijd doorgeeft en op je scherm niets verandert.
De auto-formatter: post-tool hooks
De meest voorkomende toepassing voor hooks is het afdwingen van code-formattering. In plaats van te hopen dat Claude er na een aanpassing aan denkt het bestand te formatteren, kun je een postToolUse-hook gebruiken.
Door de matcher in te stellen op edit of multi-edit, vuurt de hook elke keer als Claude een bestand wijzigt. Je kunt het script van de hook zo configureren dat het de bestandsextensie controleert en de juiste formatter draait: Prettier voor TypeScript, gofmt voor Go, of Ruff voor Python.
Harde regels afdwingen: pre-tool hooks
Waar post-tool hooks ideaal zijn voor opruimwerkzaamheden, bieden pre-tool hooks een mechanisme voor veiligheid en compliance. Pre-tool hooks kunnen daadwerkelijk voorkomen dat Claude een tool uitvoert. Hoe die blokkade zich verhoudt tot modes, allow-regels en de sandbox staat uitgewerkt in de gids over Claude Code permissions.
Wanneer een pre-tool hook vuurt, ontvangt deze de naam van de tool en de input als JSON op stdin. Het hook-script kan vervolgens de payload inspecteren en een beslissing nemen:
- Exit code 0: Ga door met de uitvoering van de tool.
- Exit code 2: Blokkeer de uitvoering van de tool.
Als je de uitvoering blokkeert, wordt alles wat je naar stderr print direct teruggekoppeld naar Claude. Dit betekent dat Claude begrijpt waarom hij geblokkeerd is en zijn aanpak kan aanpassen.
Zo dwing je niet-onderhandelbare regels af:
- Blokkeer schrijfacties naar een productie-configuratiemap.
- Blokkeer bash-commando's die
rm -rfbevatten. - Log alle uitgevoerde commando's voor compliance-doeleinden.
Omgeving en uitvoering
Wanneer je hook-scripts schrijft, vertrouw dan op de CLAUDE_PROJECT_DIR-omgevingsvariabele. Dit zorgt ervoor dat je scripts correct draaien, ongeacht wat de huidige werkmap van Claude is op het moment dat de hook vuurt.
Sla je complexe hook-scripts op binnen je repository (bijvoorbeeld in een .claude/hooks/-map) en verwijs ernaar in je settings.json.
Stop met suggesties, begin met garanties
Hooks geven je de deterministische controle die prompts simpelweg niet kunnen bieden. Gebruik postToolUse voor formattering en logging, en gebruik preToolUse om gevaarlijke operaties te blokkeren. Nu de defaults van Claude Code richting autonomie schuiven, zijn die garanties geen luxe meer.
Twijfel je of iets een hook moet zijn of iets anders, kijk dan naar de beslisboom voor skills, subagents en hooks. Configureer ze eenmalig, commit ze in je repo, en geef je team een veiligere, betrouwbaardere AI-programmeeromgeving.