Terug naar Woordenboek
advancedTechnisch
6 min leestijd

Hooks

Dennis ClaassenDoor Dennis Claassen · Laatst bijgewerkt feb 2026

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

Dit voorbeeld komt rechtstreeks uit de officiële documentatie. De hook gaat af ná een bewerking (PostToolUse) en richt zich op de Edit- en Write-tools. Het script leest het bestandspad uit de binnenkomende JSON en geeft dat door aan Prettier, dat het bestand opmaakt.
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
          }
        ]
      }
    ]
  }
}

Een gevaarlijk commando blokkeren

Ook dit script staat letterlijk in de docs. Het draait vóór een commando (PreToolUse), leest het commando uit de JSON, en blokkeert het met exit 2 als het iets destructiefs bevat. De tekst op stderr (>&2) gaat als feedback terug naar Claude. Eindigt het script met exit 0, dan geldt gewoon de normale rechten-controle.
#!/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

Deze configuratie (eveneens uit de docs) koppelt een hook vóór elke Edit of Write aan een eigen script in je project. Dat script kan bijvoorbeeld controleren of het bestandspad naar .env of .git wijst en de bewerking blokkeren met exit 2. De variabele $CLAUDE_PROJECT_DIR verwijst naar de root van je project.
{
  "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

Claude CodeOpenAI CodexWindsurf Cascade

Veelgestelde Vragen

Wat is een hook in Claude Code?
Een hook is een shell-script dat Claude Code automatisch uitvoert op een vast moment in zijn werk, bijvoorbeeld vlak voordat het een commando draait of nadat het een bestand heeft bewerkt. De AI bepaalt niet of de hook draait; het systeem doet dat gegarandeerd. Zo dwing je projectregels af zonder te vertrouwen op de keuzes van het taalmodel.
Wat is het verschil tussen exit code 1 en exit code 2 in een hook?
Exit code 2 blokkeert de actie en stuurt de tekst op stderr als feedback terug naar de AI. Exit code 1, of elke andere niet-nul code, wordt alleen gelogd waarna de actie gewoon doorgaat. Wil je iets tegenhouden, gebruik dan altijd exit 2, anders faalt je hook in stilte.
Hoe blokkeer ik een gevaarlijk commando met een hook?
Maak een hook die vóór elke tool-aanroep draait (een controle vooraf), lees het commando uit de JSON op stdin, en eindig met exit 2 als het iets destructiefs bevat. Schrijf de reden naar stderr; die komt als feedback bij de AI terecht. Eindig je het script met exit 0, dan geldt verder de normale rechten-controle.
Werken hooks alleen in Claude Code?
Nee. Hetzelfde patroon zit in meerdere AI-agents. OpenAI Codex gebruikt vrijwel dezelfde namen, en Windsurf Cascade gebruikt eigen namen voor hetzelfde idee. Het is dus een breed begrip dat over tools heen werkt, geen functie van één enkele agent.
Zijn hooks veilig om te gebruiken?
Een hook draait een willekeurig shell-commando met jouw volledige rechten. Dat is krachtig, maar ook een risico: een kwaadaardige hook in een projectbestand kan automatisch uitvoeren zodra je het project opent. Vertrouw daarom alleen hooks uit bronnen die je vertrouwt, en lees de inhoud van een hook voordat je een onbekend project opent.
Wat gebeurt er als jq of een andere tool in mijn hook ontbreekt?
Dan kan je hook in stilte falen. Een ontbrekende afhankelijkheid laat het script stoppen zonder bescherming, en afhankelijk van je shell-configuratie kan de actie dan alsnog doorgaan. Een hook die je beveiliging zou moeten bewaken, doet dan niets. Test je hooks daarom in de praktijk en ga niet uit van veilig falen.

Wil je deze term in de praktijk leren toepassen?