---
title: "Claude Code: Handy-Benachrichtigungen per Hooks"
description: "Erhalten Sie einen Handy-Alarm, wenn Claude Code eine Freigabe braucht oder fertig ist. Hook-Konfiguration zum Kopieren mit Notification, Stop und Webhook."
date: 2026-10-02
author: Nooc
authorAvatarLink: /images/avatars/nooc.webp
authorLink: https://nooc.me
tags:
  - Claude Code
  - KI-Coding-Agenten
  - Hooks
  - Handy-Benachrichtigungen
  - Webhooks
  - Entwicklerproduktivität
---

# Claude-Code-Benachrichtigungen aufs Handy: Wissen, wann es Sie braucht oder fertig ist

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](https://code.claude.com/docs/en/hooks)):

| Sie wollen wissen, wann … | Hook-Event | Matcher / Filter |
| --- | --- | --- |
| Claude auf eine Freigabeentscheidung wartet | `Notification` | `permission_prompt` |
| Claude untätig ist und auf Ihre Eingabe wartet | `Notification` | `idle_prompt` |
| Claude die Antwort beendet hat | `Stop` | nicht 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](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-claude-code-phone-notifications-de&mt=8) / [Google Play](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid))
- `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:

```bash
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:

```json
{
  "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:

```bash
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](/de/docs/conditions).

## 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](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-claude-code-phone-notifications-de&mt=8) oder [bei Google Play herunterladen](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid), und führen Sie dann den manuellen Test oben aus, bevor Sie sich bei einer langen Aufgabe darauf verlassen.

## Verwandt

- [Freigabeschritte von Agenten in Telefonanrufe verwandeln](/de/blog/ai-agent-human-in-the-loop-alerts)
- [Benachrichtigt werden, wenn ein langer Terminal-Befehl fertig ist](/de/blog/notify-when-terminal-command-finishes)
- [Webhook-Integrationsleitfaden](/de/docs/webhook)
- [Referenz der Kanalbedingungen](/de/docs/conditions)
- [Den iOS-Fokus-Modus bei kritischen Alarmen umgehen](/de/blog/how-to-bypass-ios-focus-mode-for-critical-alerts)
