Claude Code: Handy-Benachrichtigungen per Hooks

Erhalten Sie einen Handy-Alarm, wenn Claude Code eine Freigabe braucht oder fertig ist. Hook-Konfiguration zum Kopieren mit Notification, Stop und Webhook.

Aktualisiert

Inhaltsverzeichnis

Claude Code bleibt in zwei Situationen stehen, auf die es ankommt: Es wartet blockiert auf Sie (eine Freigabeabfrage, eine Rückfrage) oder es ist fertig. Wenn Sie nicht auf das Terminal schauen, sehen beide Fälle gleich aus – es passiert nichts, und die Sitzung steht still, bis Sie zurückkommen. Die Lösung ist ein Hook: ein paar Zeilen in settings.json, die in dem Moment, in dem eines von beidem eintritt, einen Webhook an Ihr Handy senden.

Dieser Leitfaden liefert die Konfiguration zum Kopieren, erklärt, welches Hook-Event zu welcher Situation passt, und behandelt die Details, die das Ganze zuverlässig machen: die Hook-Eingabe lesen, Shell-Quoting und wie Sie sich nicht mit Benachrichtigungen überfluten.

Welcher Hook für welche Situation

Claude Code führt Hooks bei Lebenszyklus-Events aus. Zwei davon decken dieses Problem ab (Hooks-Referenz):

Sie wollen wissen, wann …Hook-EventMatcher / Filter
Claude auf eine Freigabeentscheidung wartetNotificationpermission_prompt
Claude untätig ist und auf Ihre Eingabe wartetNotificationidle_prompt
Claude die Antwort beendet hatStopnicht nötig

Der matcher des Notification-Hooks filtert nach dem Benachrichtigungstyp, sodass Sie genau auswählen können, welche Benachrichtigungen Ihr Handy erreichen. Die Eingabe kommt als JSON über stdin und enthält notification_type, message, cwd und session_id. Notification-Hooks können nichts blockieren oder ändern – sie sind reine Beobachter, und genau das wollen Sie hier.

Die Stop-Eingabe enthält last_assistant_message, den letzten von Claude erzeugten Text. Das ist eine kostenlose Zusammenfassungszeile für die Benachrichtigung.

Was Sie brauchen

  • Echobell auf Ihrem Handy (App Store / Google Play)
  • curl und jq auf dem Rechner, auf dem Claude Code läuft
  • Zwei Minuten

Schritt 1 – Zwei Kanäle anlegen

Schicken Sie nicht alles an einen Kanal. Legen Sie in Echobell Folgendes an:

  • Claude Blocked, Typ Time Sensitive oder Calling – für Freigabeabfragen, bei denen der Agent stillsteht und jede Minute verschwendete Rechenzeit und Wartezeit bedeutet
  • Claude Done, Typ Normal – eine gewöhnliche Push-Benachrichtigung, die Sie lesen können, wann es passt

Kopieren Sie die Webhook-URL jedes Kanals. Sie sieht aus wie https://hook.echobell.one/t/<channel-token>. Behandeln Sie sie wie ein Passwort: Wer sie hat, kann Ihr Telefon klingeln lassen.

Speichern Sie beide als Umgebungsvariablen, damit sie nie in einer eingecheckten Konfigurationsdatei landen:

export ECHOBELL_CLAUDE_BLOCKED_URL="https://hook.echobell.one/t/<blocked-token>"
export ECHOBELL_CLAUDE_DONE_URL="https://hook.echobell.one/t/<done-token>"

Tragen Sie diese in Ihr Shell-Profil ein, damit Claude Code sie erbt.

Schritt 2 – Die Hooks hinzufügen

Fügen Sie dies in ~/.claude/settings.json ein, damit es für jedes Projekt gilt, oder in .claude/settings.local.json für ein einzelnes Repository:

{
  "hooks": {
    "Notification": [
      {
        "matcher": "permission_prompt",
        "hooks": [
          {
            "type": "command",
            "command": "jq -c '{title: \"Claude braucht eine Freigabe\", body: .message, project: (.cwd | split(\"/\") | last)}' | curl -sS -m 10 -X POST -H 'Content-Type: application/json' -d @- \"$ECHOBELL_CLAUDE_BLOCKED_URL\""
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "jq -c '{title: \"Claude ist fertig\", body: (.last_assistant_message // \"Erledigt\" | .[0:200]), project: (.cwd | split(\"/\") | last)}' | curl -sS -m 10 -X POST -H 'Content-Type: application/json' -d @- \"$ECHOBELL_CLAUDE_DONE_URL\""
          }
        ]
      }
    ]
  }
}

Was die einzelnen Teile tun:

  • jq -c '{...}' liest das Hook-JSON von stdin und baut ein kleines Payload, sodass Echobell genau die gewünschten Felder erhält und nicht das gesamte Hook-Dokument.
  • .cwd | split("/") | last macht aus /home/me/code/api den Wert api, sodass die Benachrichtigung zeigt, welches Projekt nachfragt.
  • .[0:200] kürzt die letzte Nachricht. Der Echobell-Worker begrenzt Benachrichtigungstexte auf 1500 Byte, und ein Sperrbildschirm zeigt ohnehin weit weniger an.
  • -m 10 gibt curl ein Timeout von 10 Sekunden, damit ein Netzwerkproblem Claude Code nie auf Ihren Hook warten lässt.

Echobell rendert die gesendeten Schlüssel über die Templates des Kanals, und ein neuer Kanal hat kein Template, das sie ausliest — legen Sie sie in den Kanaleinstellungen fest: Titel-Template {{title}}, Body-Template {{body}}. Fügen Sie {{project}} in eines davon ein, wenn der Projektname erscheinen soll, zum Beispiel {{title}} ({{project}}).

Schritt 3 – Testen, ohne auf eine echte Abfrage zu warten

Führen Sie dieselbe Pipeline von Hand mit einem erfundenen Hook-Payload aus:

echo '{"message":"Claude braucht Ihre Erlaubnis, Bash zu verwenden","cwd":"/home/me/code/api","notification_type":"permission_prompt"}' \
  | jq -c '{title: "Claude braucht eine Freigabe", body: .message, project: (.cwd | split("/") | last)}' \
  | curl -sS -m 10 -X POST -H 'Content-Type: application/json' -d @- "$ECHOBELL_CLAUDE_BLOCKED_URL"

Leuchtet Ihr Handy auf, funktioniert die Echobell-Seite, und ein verbleibendes Problem liegt darin, wie Claude Code die Konfiguration liest. Führen Sie in Claude Code /hooks aus, um zu prüfen, ob die Hooks geladen wurden; Änderungen an den Einstellungen während einer laufenden Sitzung brauchen eventuell das Hooks-Menü oder einen Neustart, um wirksam zu werden.

Schritt 4 – Den Blocked-Kanal klingeln lassen

Eine Push-Benachrichtigung verliert gegen „Nicht stören“. Ein Calling-Kanal verhält sich wie ein eingehender Anruf und kommt durch den iOS-Fokus-Modus, was vor allem dann zählt, wenn Sie eine lange Aufgabe starten und für den Abend weggehen. Wenn Sie nur bei bestimmten Abfragen unterbrochen werden möchten, filtern Sie mit einer Echobell-Kanalbedingung auf den gesendeten Variablen, zum Beispiel project == "api", statt den Hook zu ändern. Die vollständige Variablenliste finden Sie in der Bedingungen-Referenz.

Benachrichtigungsflut vermeiden

Eine ausgelastete Sitzung kann viele Stop-Events auslösen – jede Antwort endet mit einem. Drei Wege, das Signal zu erhalten:

  • Schicken Sie Stop nicht an einen klingelnden Kanal. Das Ende einer Aufgabe ist nicht dringend; lassen Sie es auf Normal.
  • Verwenden Sie idle_prompt statt Stop, wenn Sie nur erfahren möchten, dass Claude angehalten hat und auf Sie wartet, und nicht nach jeder Antwort.
  • Grenzen Sie nach Projekt ein – mit einer Bedingung, damit ein Test-Repository gar nicht erst benachrichtigt.

Claude Code remote oder in CI ausführen

Derselbe Ansatz funktioniert in Cloud- oder Remote-Umgebungen, denn der Hook ist nur ein ausgehender HTTPS-Request. Nichts muss aus dem Internet erreichbar sein. Setzen Sie die beiden Umgebungsvariablen in den Secrets der Umgebung statt in einem Shell-Profil, und die Benachrichtigung erreicht Ihr Handy, egal wo die Sitzung läuft.

Fehlerbehebung

Nichts kommt an, und der manuelle Test schlägt ebenfalls fehl. Prüfen Sie, ob die URL-Variable in der Shell gesetzt ist, die Claude Code startet: echo "$ECHOBELL_CLAUDE_BLOCKED_URL". Eine leere Variable lässt curl stillschweigend scheitern.

Der manuelle Test funktioniert, aber der Hook feuert nicht. Prüfen Sie den Matcher: permission_prompt und idle_prompt sind verschieden, und ein Matcher, der nicht passt, läuft schlicht nie. Führen Sie /hooks aus und prüfen Sie, ob das JSON gültig ist – ein überzähliges Komma deaktiviert die Hooks der gesamten Einstellungsdatei.

Der Benachrichtigungstext ist leer. Der jq-Filter hat auf ein Feld verwiesen, das es für dieses Event nicht gibt. message existiert in der Notification-Eingabe, last_assistant_message in der Stop-Eingabe. Nutzen Sie //, um einen Standardwert anzugeben, wie in der Konfiguration oben.

Es feuert zu oft. Siehe den Abschnitt oben – wechseln Sie von Stop zu idle_prompt oder fügen Sie eine Bedingung hinzu.

Häufig gestellte Fragen

Wie erhalte ich eine Benachrichtigung, wenn Claude Code eine Freigabe braucht?

Fügen Sie einen Notification-Hook mit dem Matcher permission_prompt hinzu, der einen Webhook an einen Kanal sendet. Echobell macht daraus einen Push oder einen anrufartigen Alarm auf Ihrem Handy.

Woher weiß ich, wann Claude Code eine Aufgabe beendet hat?

Fügen Sie einen Stop-Hook hinzu. Er läuft, wenn Claude die Antwort beendet hat, und seine Eingabe enthält last_assistant_message, die Sie als Benachrichtigungstext verwenden können.

Kann die Benachrichtigung „Nicht stören“ durchbrechen?

Ja, wenn der empfangende Kanal ein Calling-Kanal ist. Er verhält sich wie ein eingehender Anruf, den der iOS-Fokus-Modus durchlässt. Ein normaler Push von einer beliebigen App tut das nicht.

Funktioniert das in Claude Code im Web oder in Remote-Sitzungen?

Ja. Der Hook sendet nur einen ausgehenden HTTPS-Request und funktioniert deshalb überall, wo die Sitzung das Internet erreicht. Stellen Sie die Kanal-URLs über die Secrets der Umgebung bereit.

Ist die Webhook-URL in settings.json sicher?

Verwenden Sie besser eine Umgebungsvariable, wie oben gezeigt, damit das Token nicht in ein Repository eingecheckt wird. Falls es doch durchsickert, legen Sie einen neuen Kanal an und deaktivieren Sie den alten.

Fazit

Zwei Kanäle, zwei Hooks und eine jq | curl-Pipeline: ein Calling- oder Time-Sensitive-Kanal für permission_prompt, ein Normal-Kanal für Stop. Danach können Sie eine lange Agentenaufgabe starten, den Raum verlassen und werden nur dann zurückgeholt, wenn der Agent Sie wirklich braucht.

Echobell für das iPhone laden oder bei Google Play herunterladen, und führen Sie dann den manuellen Test oben aus, bevor Sie sich bei einer langen Aufgabe darauf verlassen.

Verwandt