Skip to content

ANLEITUNG

Claude Code Hooks: Regeln, die Claude nicht vergessen kann

Hooks sind kleine Befehle, die Claude Code automatisch an bestimmten Stellen ausführt: bevor er eine Datei ändert, nachdem er sie geändert hat, wenn er fertig ist. Anders als eine Regel in der CLAUDE.md muss Claude sich nicht an einen Hook erinnern, er läuft einfach. Hier steht, wie Hooks funktionieren und drei Beispiele, die ich für jedes App-Projekt nehmen würde.

Das Wichtigste in Kürze

Was ein Hook ist
Ein Befehl oder Skript, das Claude Code bei einem bestimmten Ereignis ausführt, zum Beispiel vor oder nach jeder Dateiänderung.
Wo du ihn einträgst
In .claude/settings.json im Projekt, für alle Projekte in ~/.claude/settings.json. Mit /hooks siehst du, welche Hooks aktiv sind.
Wie ein Hook etwas verhindert
Mit exit 2. Bei Ereignissen wie PreToolUse stoppt das die Aktion, und Claude bekommt deine Fehlermeldung als Grund.
Wofür ich sie nehme
Für alles, was immer passieren muss: Code prüfen, Dateien formatieren, geheime Dateien schützen.

Hook oder CLAUDE.md: was ist der Unterschied?

In die CLAUDE.md schreibst du, wie Claude arbeiten soll. Das ist eine Bitte. Claude hält sich meistens daran, aber nicht immer, vor allem wenn die Datei lang ist. Ein Hook ist keine Bitte. Er läuft jedes Mal, egal was Claude gerade denkt.

Die Faustregel: Alles, was nie passieren darf oder immer passieren muss, gehört in einen Hook. Alles, was Erklärung und Urteilsvermögen braucht, in die CLAUDE.md.

Die wichtigsten Hook-Events

Claude Code kennt laut Doku über 30 Events. Für den Anfang reichen diese sechs:

PreToolUse
Bevor Claude ein Werkzeug benutzt, also zum Beispiel eine Datei schreibt oder einen Befehl ausführt. Kann die Aktion blockieren.
PostToolUse
Nachdem ein Werkzeug erfolgreich lief. Gut zum Prüfen und Formatieren.
UserPromptSubmit
Wenn du eine Nachricht abschickst, bevor Claude sie bearbeitet.
Stop
Wenn Claude mit seiner Antwort fertig ist.
Notification
Wenn Claude Code eine Benachrichtigung schickt, zum Beispiel weil er auf dich wartet.
SessionStart
Wenn eine Sitzung startet oder fortgesetzt wird.

So ist ein Hook aufgebaut

Ein Hook hat drei Ebenen: das Event, dann einen Matcher, der festlegt, für welche Werkzeuge er gilt (zum Beispiel Edit|Write für Dateiänderungen oder Bash für Befehle), und dann den eigentlichen Befehl. Claude Code schickt dem Befehl die Details als JSON über stdin, bei Dateiänderungen steht der Pfad in tool_input.file_path.

Wichtig sind die Exit-Codes. Exit 0 heißt: alles gut. Exit 2 heißt: blockieren, und was dein Skript auf stderr schreibt, bekommt Claude als Begründung. Jeder andere Code ist nur ein Hinweis, die Aktion läuft trotzdem. Exit 1 blockiert also nichts, darauf weist auch Anthropic ausdrücklich hin.

Beispiel 1: Typprüfung nach jeder Änderung

Das ist der Hook, den ich zuerst einrichten würde. Nach jeder Dateiänderung läuft die TypeScript-Prüfung. Findet sie Fehler, landen sie direkt bei Claude, und er repariert sie, bevor er weitermacht. Bei einem PostToolUse-Hook blockiert exit 2 nichts mehr, die Änderung ist ja schon passiert, aber Claude sieht die Fehlermeldung.

// .claude/settings.json
// Nach jeder Änderung prüft TypeScript das Projekt.
// Fehler gehen per exit 2 direkt zurück an Claude, der sie dann behebt.
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "npx tsc --noEmit 1>&2 || exit 2" }
        ]
      }
    ]
  }
}
Beispiel 1: Typprüfung nach jeder Änderung. Kommentare sind in JSON eigentlich nicht erlaubt, lösch sie beim Kopieren.

Beispiel 2: die .env schützen

In der .env stehen deine Schlüssel und Passwörter. Mit diesem Hook kann Claude sie nicht mehr bearbeiten, egal was im Chat passiert. Das ist genau die Art Regel, die man nicht nur in die CLAUDE.md schreiben sollte.

// .claude/settings.json
// Bevor Claude eine Datei schreibt, läuft das Skript. Exit 2 blockiert die Änderung.
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/env-schuetzen.sh" }
        ]
      }
    ]
  }
}
Beispiel 2, Teil 1: der Eintrag in den Einstellungen. CLAUDE_PROJECT_DIR ist der Projektordner, das setzt Claude Code selbst.
#!/bin/bash
# .claude/hooks/env-schuetzen.sh (danach: chmod +x)
# Claude Code schickt die geplante Änderung als JSON über stdin.
datei=$(jq -r '.tool_input.file_path')

case "$datei" in
  *.env*)
    echo "Die .env darf Claude nicht bearbeiten." >&2
    exit 2 ;;
esac
exit 0
Beispiel 2, Teil 2: das Skript. Es braucht jq, unter macOS installierst du es mit brew install jq.

Beispiel 3: Code automatisch formatieren

Claude formatiert Code nicht immer so, wie dein Projekt es will. Statt ihn jedes Mal daran zu erinnern, formatiert dieser Hook jede geänderte Datei sofort.

// .claude/settings.json
// Nach jeder Änderung wird genau die geänderte Datei formatiert.
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" }
        ]
      }
    ]
  }
}
Beispiel 3: Formatieren nach jeder Änderung. Statt Prettier geht jedes Tool, das dein Projekt schon nutzt, zum Beispiel Biome.

Worauf du achten solltest

Hooks laufen mit deinen Rechten
Ein Hook ist ein Befehl auf deinem Rechner. Übernimm keine Hooks aus fremden Projekten, ohne sie zu lesen.
Ein abgestürzter Hook blockiert nicht
Fehlt das Skript oder stürzt es ab, läuft die Aktion standardmäßig trotzdem. Für harte Verbote gibt es zusätzlich die Berechtigungen in Claude Code.
Hooks kurz halten
Ein Hook nach jeder Änderung läuft oft. Eine Prüfung, die eine Minute dauert, bremst jede Sitzung aus.
Alle Hooks auf einmal ausschalten
Mit "disableAllHooks": true in den Einstellungen, zum Beispiel wenn etwas klemmt.

Wo finde ich meine Hooks?

Tipp /hooks in Claude Code. Du siehst alle aktiven Hooks und woher sie kommen: aus deinen Einstellungen, aus dem Projekt oder aus einem Plugin. Ändern oder löschen kannst du sie dort nicht, das machst du direkt in der settings.json.

Kann ein Hook Claude stoppen?

Ja, bei Events wie PreToolUse mit exit 2. Die Aktion wird dann nicht ausgeführt, und Claude bekommt deine Meldung als Grund. Bei PostToolUse ist die Aktion schon passiert, dort zeigt exit 2 Claude nur die Meldung.

Brauche ich Programmierkenntnisse für Hooks?

Für die drei Beispiele oben nicht, die kannst du kopieren. Für eigene Hooks hilft es, ein bisschen Shell zu verstehen. Du kannst Claude aber auch einfach bitten, dir einen Hook zu schreiben, und ihn dann lesen, bevor du ihn einträgst.

Der Kurs dazu, auf Deutsch

Wenn du es lieber gezeigt bekommst, als es zu lesen: einmal komplett von der Idee bis zur App auf deinem Handy, als Videokurs auf Deutsch und ohne Vorkenntnisse.

Weitere Anleitungen auf Deutsch

Zum Weiterlesen (englisch)

Wenn du mit einer Vorlage starten willst

NativeExpress kostet einmal 229 Dollar. Du bekommst den kompletten Code und jede künftige Version. Den Support mache ich selbst, per Discord oder E-Mail, gern auch auf Deutsch.