Simpele Uitleg
Een hook is een klein scriptje dat een AI-agent zoals Claude Code automatisch laat draaien op een vast moment in zijn werk. Niet wanneer de AI er zelf voor kiest, maar gegarandeerd, elke keer. Vergelijk het met een bewegingssensor in de gang: niemand hoeft het licht aan te doen, het gaat vanzelf aan zodra je langsloopt. De AI besluit niet of de hook draait; het systeem draait hem. Dat maakt een hook een harde regel buiten het taalmodel om.
Technische Definitie
Volgens Anthropic zijn hooks "user-defined shell commands that execute at specific points in Claude Code's lifecycle. They provide deterministic control over Claude Code's behavior, ensuring certain actions always happen rather than relying on the LLM to choose to run them." Een hook communiceert via stdin, stdout, stderr en exit-codes: als een event afgaat, krijgt jouw script de bijbehorende data als JSON binnen op stdin, en via de exit-code geeft het script terug wat er moet gebeuren. Exit 0 betekent geen bezwaar (de normale rechten-controle geldt nog), exit 2 blokkeert de actie en stuurt de tekst op stderr als feedback terug naar de AI. Hooks kunnen restricties strenger maken maar niet soepeler dan de permissieregels toelaten.
Waarom Dit Belangrijk Is
Waarom zou je een AI laten controleren door een script in plaats van door slimme instructies? Omdat een taalmodel van nature onvoorspelbaar is. Je kunt het vragen "vergeet niet te linten" of "raak nooit het .env-bestand aan", maar het kan het overslaan. Daar zit precies de waarde van het woord dat in de officiële definitie staat: deterministic. Een hook haalt de garantie weg bij het model en legt die bij het systeem.
Voor teams die serieus met AI-agents werken is dat het verschil tussen hopen en weten. Hopen dat de Ai je tests draait, of weten dat ze draaien. Hopen dat geen gevaarlijk commando glipt, of het keihard blokkeren. In de Claude Code Masterclass leer je hoe je dit soort harde regels instelt zodat je een agent vertrouwd zelfstandig kunt laten werken.
Hooks zijn bovendien geen Claude-only truc. Hetzelfde patroon zit in meerdere agents, wat het een breed en blijvend begrip maakt in plaats van een tijdelijke feature van één tool.
Hoe Het Werkt
Een hook werkt in drie simpele stappen.
1. Er gebeurt iets. Een "event" gaat af, bijvoorbeeld: de AI staat op het punt een commando uit te voeren, of heeft net een bestand bewerkt.
2. Het systeem geeft jouw script informatie door. Die komt binnen op stdin als JSON, met details als welk commando of welk bestandspad het betreft. Letterlijk uit de docs: "When an event fires, Claude Code passes event-specific data as JSON to your script's stdin."
3. Jouw script reageert via de exit-code. Exit 0 = geen bezwaar, ga door (de normale rechten-controle geldt nog wel). Exit 2 = blokkeer de actie, en de tekst die je naar stderr schrijft gaat als feedback terug naar de AI zodat die zich kan aanpassen. Een andere exit-code laat de actie doorgaan maar toont een foutmelding.
De momenten waarop een hook kan afgaan, heten events. De stabiele kern is goed te onthouden: vlak vóór de AI een tool gebruikt (kan blokkeren), nadat een tool klaar is, bij de start van een sessie, en bij het stoppen. Er bestaan op dit moment meer events, en die lijst groeit en verschilt per tool, dus richt je op deze kern.
Naast gewone shell-commando's zijn er op dit moment ook andere hook-types beschikbaar, waarvan er één volgens de docs nog experimenteel is en kan veranderen. Hooks stel je in via instellingenbestanden op verschillende niveaus: voor al je projecten, voor één gedeeld project (via git), of lokaal en privé.
Use Cases
Linten en formatteren afdwingen
De meest voorkomende toepassing: zorg dat code altijd netjes is, zonder erop te vertrouwen dat de AI eraan denkt. Met een hook op het moment ná een bestandsbewerking draait bijvoorbeeld Prettier automatisch over elk bestand dat de agent aanraakt. Eén keer instellen, daarna gebeurt het bij elke wijziging vanzelf.
Guardrails tegen gevaarlijke acties
Plaats een hook vlak vóór de AI een commando uitvoert en blokkeer destructieve acties, zoals het droppen van een databasetabel. Het script eindigt met exit 2 om de actie tegen te houden en stuurt een reden terug naar de AI. Dit is een guardrail die niet afhangt van de bui van het model.
Beschermde bestanden afschermen
Voorkom dat de agent gevoelige bestanden zoals .env of de .git-map aanraakt. Een hook vóór elke bewerking controleert het bestandspad en blokkeert de actie als het een beschermd bestand betreft. Zo bewaak je geheimen en projectstructuur, ongeacht wat de AI van plan was.
Een commando aanpassen vóór het draait
Een hook kan een commando ook herschrijven voordat het wordt uitgevoerd, bijvoorbeeld om altijd een veilige standaardvlag toe te voegen. De docs raden aan niet twee hooks tegelijk hetzelfde te laten herschrijven, omdat de volgorde dan niet vaststaat. Houd het bij één hook per aanpassing.
Teamregels inbakken in de tooling
Een gedeeld instellingenbestand in git zorgt dat dezelfde hooks gelden voor het hele team. Niemand hoeft afspraken te onthouden; ze worden afgedwongen. In AI als Teamsport leer je hoe je dit soort gedeelde standaarden voor een team inricht.
Voorbeelden
Prettier draaien na elke bewerking
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
}
]
}
]
}
}Een gevaarlijk commando blokkeren
#!/bin/bash INPUT=$(cat) COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command') if echo "$COMMAND" | grep -q "drop table"; then echo "Blocked: dropping tables is not allowed" >&2 # stderr becomes Claude's feedback exit 2 # exit 2 = block the action fi exit 0 # exit 0 = no decision; the normal permission flow applies
Een eigen beschermingsscript registreren
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh"
}
]
}
]
}
}Veelgemaakte Fouten
"Exit code 1 blokkeert de actie ook wel"
Alleen exit 2 blokkeert. Exit 1, of elke andere niet-nul code, wordt gelogd en de actie gaat gewoon door. Dit is de meest gemaakte fout: mensen denken dat ze beschermd zijn terwijl hun hook in stilte faalt en alles doorlaat.
"Exit 0 op een controle-vooraf betekent goedkeuren"
Exit 0 betekent alleen "deze hook heeft geen bezwaar". Daarna geldt nog steeds de normale rechten- en permissieflow. Een hook keurt dus niets goed; hij kan alleen geen bezwaar maken of juist blokkeren.
"Een hook die 'allow' teruggeeft kan alle beveiliging overrulen"
Hooks kunnen wel strenger maken maar niet soepeler. Een deny-regel uit je instellingen blijft gelden, zelfs als een hook 'allow' zegt. Letterlijk: "Hooks can tighten restrictions but not loosen them past what permission rules allow."
"De AI bepaalt zelf of de hook draait"
Precies andersom. Dat is de hele reden dat hooks bestaan: ze draaien deterministisch buiten het model om. Het systeem draait de hook, niet de AI. Daarom kun je erop bouwen.
Tools Die Dit Gebruiken
Veelgestelde Vragen
Wat is een hook in Claude Code?
Wat is het verschil tussen exit code 1 en exit code 2 in een hook?
Hoe blokkeer ik een gevaarlijk commando met een hook?
Werken hooks alleen in Claude Code?
Zijn hooks veilig om te gebruiken?
Wat gebeurt er als jq of een andere tool in mijn hook ontbreekt?
Wil je deze term in de praktijk leren toepassen?