Training door Tarik Eraslan App Tarik

Claude Code hooks: automatische controles instellen

In het kort

Hooks zijn shell-commando's die Claude Code automatisch uitvoert op vaste momenten, zoals PreToolUse vlak voordat een tool draait en PostToolUse erna. Je zet ze onder de sleutel hooks in een settings-bestand, bijvoorbeeld .claude/settings.json in je project. Een hook die afsluit met exitcode 2 blokkeert de actie. Met /hooks zie je welke hooks actief zijn. Stand oktober 2026.

Wat zijn hooks in Claude Code?

Hooks zijn shell-commando's die jij zelf definieert. Claude Code voert ze uit op vaste momenten tijdens een sessie. Het verschil met een instructie in je CLAUDE.md: een hook draait altijd. Claude hoeft er niet aan te denken of voor te kiezen.

Daarom gebruik je hooks voor regels die zonder uitzondering moeten gelden. Denk aan een formatter na elke bewerking, of een blokkade op bestanden die niemand mag aanpassen. Afspraken die om oordeel vragen, horen eerder in je CLAUDE.md.

Welke hook-events zijn er?

Een event is het moment waarop een hook afgaat. De documentatie noemt er ruim dertig. Deze gebruik je het vaakst:

EventWanneer
SessionStartAls een sessie begint of wordt hervat
UserPromptSubmitAls je een bericht verstuurt, voordat Claude het verwerkt
PreToolUseVlak voordat een tool draait. Kan de actie blokkeren
PermissionRequestAls een tool om toestemming vraagt
PostToolUseNadat een tool gelukt is
NotificationAls Claude Code een melding stuurt, bijvoorbeeld omdat het op je wacht
StopAls Claude klaar is met antwoorden
PreCompactVlak voordat de context wordt samengevat
SessionEndAls een sessie stopt

Waar zet je een hook?

Je zet hooks in een settings-bestand. De plek bepaalt waar de hook geldt.

BestandGeldt voor
~/.claude/settings.jsonAl je projecten, alleen op jouw computer
.claude/settings.jsonEén project, te delen via je repository
.claude/settings.local.jsonEén project, alleen voor jou

Hooks kunnen ook in een plugin, een skill of een subagent staan. In een skill gelden ze voor de rest van de sessie nadat de skill is aangeroepen. Meer over skills lees je in Claude Code skills maken.

Voorbeeld: code automatisch opmaken na elke bewerking

Deze hook draait Prettier op elk bestand dat Claude bewerkt. De matcher Edit|Write zorgt dat hij alleen afgaat na de tools die bestanden bewerken. Zet dit in .claude/settings.json:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
          }
        ]
      }
    ]
  }
}

Het commando leest het pad van het bewerkte bestand uit de JSON die Claude Code meestuurt. Daarvoor heb je jq nodig. Gaat alles goed, dan zie je niets in het gesprek. Je merkt het aan het opgemaakte bestand.

Voorbeeld: bewerkingen van gevoelige bestanden blokkeren

Met een PreToolUse-hook stop je een actie voordat hij gebeurt. Sla dit script op als .claude/hooks/protect-files.sh:

#!/bin/bash
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

PROTECTED_PATTERNS=(".env" "package-lock.json" ".git/")

for pattern in "${PROTECTED_PATTERNS[@]}"; do
  if [[ "$FILE_PATH" == *"$pattern"* ]]; then
    echo "Blocked: $FILE_PATH matches protected pattern '$pattern'" >&2
    exit 2
  fi
done

exit 0

Maak het script uitvoerbaar met chmod +x .claude/hooks/protect-files.sh en registreer het in .claude/settings.json:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh"
          }
        ]
      }
    ]
  }
}

Vraag Claude daarna om iets in je .env te zetten. De hook blokkeert de bewerking en Claude krijgt de melding uit het script te zien, zodat het een andere aanpak kan kiezen.

Hoe een hook laat weten wat er moet gebeuren

Claude Code stuurt bij elk event JSON naar je script via stdin. Bij PreToolUse staan daarin onder meer tool_name en tool_input. Je script antwoordt met een exitcode:

  • Exitcode 0: geen bezwaar. Bij PreToolUse betekent dat geen automatische goedkeuring. De gewone toestemmingsvraag volgt nog.
  • Exitcode 2: Claude Code blokkeert de actie. Schrijf de reden naar stderr.
  • Een andere exitcode: de actie gaat meestal door en je ziet een foutmelding van de hook.

Een PostToolUse-hook kan niets terugdraaien, want de tool heeft dan al gedraaid. Wil je iets tegenhouden, gebruik dan PreToolUse.

Matchers: wanneer een hook afgaat

Zonder matcher gaat een hook af bij elk voorkomen van het event. Bij de tool-events filter je op toolnaam, zoals Bash of Edit|Write. Tools van MCP-servers heten mcp__<server>__<tool>, dus met mcp__github__.* vang je alle tools van de GitHub-server.

Claude kan bestanden ook aanpassen via shell-commando's. Moet je hook echt elke wijziging zien, dan adviseert de documentatie een extra Stop-hook die na elke beurt de werkmap controleert.

Controleren of je hook werkt

Typ /hooks in Claude Code. Je ziet dan alle actieve hooks, gegroepeerd per event. Wijzig je een settings-bestand tijdens een sessie, dan pikt Claude Code de wijziging normaal gesproken zelf op. Voor meer detail start je met claude --debug.

Zie je een hook niet in de lijst? Claude Code voert in een interactieve sessie pas hooks uit nadat je de map hebt vertrouwd in het vertrouwensvenster bij de start.

Veiligheid van hooks

Een command-hook draait met al jouw gebruikersrechten. Hij kan bij elk bestand waar jouw account bij kan, en kan het ook verwijderen. Lees en test dus elke hook voordat je hem toevoegt, zeker als hij uit andermans repository komt.

De documentatie geeft er vaste regels bij. Zet shell-variabelen tussen aanhalingstekens en gebruik absolute paden naar scripts. Een sterk punt: een PreToolUse-hook die een tool weigert, blokkeert die ook in de modus bypassPermissions.

Hooks inrichten voor je eigen werk

Welke controles je nodig hebt, hangt af van je project en je manier van werken. In een 1-op-1 Claude Code-coachsessie van 3 uur kijkt Tarik Eraslan met je mee naar je eigen setup, op locatie in Amsterdam-Zuid of digitaal via Microsoft Teams, vanaf €449 ex btw.

Veelgestelde vragen

Wat is het verschil tussen een hook en een regel in CLAUDE.md?

Een regel in CLAUDE.md is een instructie die Claude meeneemt in zijn afweging. Een hook is een commando dat Claude Code altijd uitvoert op het ingestelde moment.

Hoe blokkeer ik een actie met een hook?

Gebruik een PreToolUse-hook die afsluit met exitcode 2 en de reden naar stderr schrijft. Claude Code houdt de actie dan tegen en geeft de reden aan Claude.

Hoe zet ik alle hooks tijdelijk uit?

Zet "disableAllHooks": true in je settings-bestand. Hooks uit beheerde organisatie-instellingen blijven dan wel draaien, tenzij het daar ook staat.

Plan je training via WhatsApp