Deterministische Shell-Befehle, die an festgelegten Lifecycle-Events feuern – für Security-Gates, Auto-Format, Audit-Logs und mehr.
Hooks sind Shell-Befehle, die Claude Code an festgelegten Lifecycle-Events automatisch ausführt – vor einem Tool-Aufruf, nach einem Tool-Aufruf, beim Session-Start oder am Turn-Ende. Sie sind deterministisch (kein LLM-Call, kein Token-Verbrauch) und greifen IMMER, unabhängig davon, ob Claude eine Regel im Kopf hat oder nicht.
Für Entwickler, die professionelle Claude-Code-Setups bauen – mit Security-Gates, Compliance-Regeln oder Team-Standards. Wer eine Regel hat, die niemals umgangen werden darf, schreibt sie als Hook.
.env, Migrations, Secrets) niemals editieren lassenEdit automatisch prettier/black/gofmt laufen lassen| Event | Wann | Typischer Einsatz |
|---|---|---|
SessionStart | Einmal beim Start | Werte einlesen, ENV-Check, Greeting |
UserPromptSubmit | Nach jedem Prompt | Prompt-Logging, Pre-Processing |
PreToolUse | Vor jedem Tool-Call | Security-Gate – kann BLOCKEN |
PostToolUse | Nach jedem Tool-Call | Auto-Format, Audit, Notification |
Stop | Am Turn-Ende | Cleanup, Summary, Slack-Ping |
SessionEnd | Beim Beenden | Logs schließen, Backup |
PreToolUse ist der einzige Hook, der eine Aktion blockieren kann: Exit-Code 2 stoppt den Tool-Call, Exit-Code 0 lässt ihn durch.
Hooks leben in .claude/settings.json – pro Event ein Eintrag mit Matcher-Regex und Hook-Liste:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": ".claude/hooks/protect-secrets.sh"
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "prettier --write $CLAUDE_FILE_PATHS",
"async": true
}
]
}
]
}
}
Der Matcher ist eine Regex auf den Tool-Namen – Edit|Write greift bei beiden, .* bei allem.
Seit Februar 2026 gibt es zusätzlich HTTP-Hooks – Claude POSTet das Event an eine URL, dein Backend antwortet mit Allow/Block. Praktisch für Team-weite Policies, die zentral aktualisiert werden sollen.
Ein simples, mächtiges Pattern: niemals .env-Dateien oder Migrationen editieren lassen.
#!/bin/bash
# .claude/hooks/protect-secrets.sh
# Hook bekommt JSON via stdin
INPUT=$(cat)
PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
if echo "$PATH" | grep -qE '\.env$|/migrations/|secrets\.yaml'; then
echo "BLOCKED: $PATH ist geschützt" >&2
exit 2 # Block
fi
exit 0 # Allow
Exit-Code 2 → Claude bekommt die Fehlermeldung und versucht den Edit nicht erneut.
Wenn du eine Regel in CLAUDE.md schreibst („niemals .env editieren”), kann Claude sie übersehen, vergessen oder durch eine geschickte Folge-Anweisung umgehen. Ein Hook ist Shell-Code, der immer läuft – er hängt nicht davon ab, ob das LLM die Regel im Kontext hat. Genau das macht Hooks zum richtigen Werkzeug für Sicherheit und Compliance.
Nach jedem Edit den Formatter laufen lassen – ohne Claude zu bremsen:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "prettier --write \"$CLAUDE_FILE_PATHS\" 2>/dev/null",
"async": true
}
]
}
]
}
}
"async": true lässt den Befehl im Hintergrund laufen – Claude wartet nicht, du gewinnst Geschwindigkeit.
Welcher Lifecycle-Moment ist relevant? PreToolUse für Gates, PostToolUse für Reaktionen, SessionStart für Setup.
Welche Tools sollen den Hook auslösen? `Edit|Write` für Datei-Änderungen, `Bash` für Shell-Befehle, `.*` für alles.
Lege `.claude/hooks/
Bei PreToolUse: `exit 0` erlaubt, `exit 2` blockiert. Bei anderen Events egal. stderr wird an Claude weitergegeben – nutze das für klare Fehlermeldungen.
Hook unter `.claude/settings.json` eintragen. Projekt-Scope macht das Setup mit `git` teilbar.
Eine passende Aktion in Claude Code auslösen und prüfen, ob der Hook feuert. `claude --debug` zeigt Hook-Ausführungen im Log.
Welches Lifecycle-Event ist das richtige, um zu verhindern, dass Claude eine `.env`-Datei editiert?
CLAUDE.md ist Kontext fürs Modell – kann übersehen oder umgangen werden. Hooks sind Shell-Code, der immer läuft. Für Sicherheit immer Hooks.
npm run lint nach jedem Edit verlangsamt Claude spürbar. Setze async: true, wenn die Reaktion nicht blockend sein muss..* auf PreToolUse betrifft auch Read-Operationen – das ist meist nicht gewollt. Sei spezifisch (Edit|Write|Bash).chmod +x vergessen → Hook scheitert mit Permission Denied. Im Setup-Skript fest verdrahten.Baue einen Audit-Log-Hook für Bash-Befehle:
.claude/hooks/audit-bash.sh anecho "$(date -Iseconds) $(echo $(cat) | jq -r '.tool_input.command')" >> .claude/audit.logchmod +x .claude/hooks/audit-bash.sh.claude/settings.json als PostToolUse mit Matcher Bash registrieren, async: truecat .claude/audit.log – du siehst ein lückenloses ProtokollDu weißt jetzt, wie du Claude Codes Verhalten deterministisch steuerst. Als Nächstes: Wenn dein Setup wächst, lohnt sich der Guide Plugins und Marketplace – denn Plugins bündeln Skills, Hooks und MCP-Server zu wiederverwendbaren Paketen, die du installieren und teilen kannst.
Wissen testen, Entscheidungen trainieren oder den nächsten Guide starten.