---
title: "Notifications Claude Code sur téléphone via les hooks"
description: "Recevez une alerte sur votre téléphone quand Claude Code demande une autorisation ou termine. Config de hooks à copier avec Notification, Stop et un webhook."
date: 2026-10-02
author: Nooc
authorAvatarLink: /images/avatars/nooc.webp
authorLink: https://nooc.me
tags:
  - Claude Code
  - agents de codage IA
  - hooks
  - notifications sur téléphone
  - webhooks
  - productivité des développeurs
---

# Notifications Claude Code sur votre téléphone : sachez quand il a besoin de vous ou a terminé

Claude Code s'arrête dans deux situations qui comptent : il est bloqué et attend votre réponse (une demande d'autorisation, une question), ou il a terminé. Si vous ne regardez pas le terminal, les deux se ressemblent — rien ne se passe, et la session reste inactive jusqu'à votre retour. La solution est un hook : quelques lignes dans `settings.json` qui envoient un webhook à votre téléphone dès que l'un ou l'autre se produit.

Ce guide vous donne la config à copier, explique quel événement de hook utiliser pour quelle situation, et couvre les détails qui la rendent fiable : lire l'entrée du hook, les guillemets du shell, et éviter de vous noyer sous les notifications.

## Quel hook pour quelle situation

Claude Code exécute des hooks sur des événements de cycle de vie. Deux d'entre eux couvrent ce problème ([référence des hooks](https://code.claude.com/docs/en/hooks)) :

| Vous voulez savoir quand… | Événement de hook | Matcher / filtre |
| --- | --- | --- |
| Claude attend une décision d'autorisation | `Notification` | `permission_prompt` |
| Claude est inactif et attend votre saisie | `Notification` | `idle_prompt` |
| Claude a fini de répondre | `Stop` | aucun nécessaire |

Le `matcher` du hook `Notification` filtre sur le type de notification, ce qui vous permet de choisir exactement celles qui arrivent sur votre téléphone. L'entrée arrive en JSON sur stdin et inclut `notification_type`, `message`, `cwd` et `session_id`. Les hooks `Notification` ne peuvent rien bloquer ni modifier — ce sont des observateurs, et c'est exactement ce qu'il vous faut ici.

L'entrée de `Stop` inclut `last_assistant_message`, le dernier texte produit par Claude. C'est une ligne de résumé gratuite pour la notification.

## Ce dont vous avez besoin

- Echobell sur votre téléphone ([App Store](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-claude-code-phone-notifications-fr&mt=8) / [Google Play](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid))
- `curl` et `jq` sur la machine qui exécute Claude Code
- Deux minutes

## Étape 1 — Créer deux canaux

Évitez de tout envoyer sur un seul canal. Dans Echobell, créez :

- **Claude Blocked**, type **Time Sensitive** ou **Calling** — pour les demandes d'autorisation, où l'agent est à l'arrêt et où chaque minute est du temps de calcul et du temps réel perdu
- **Claude Done**, type **Normal** — une notification push ordinaire, à lire quand vous voulez

Copiez l'URL de webhook de chaque canal. Elle ressemble à `https://hook.echobell.one/t/<channel-token>`. Traitez-la comme un mot de passe : quiconque la possède peut faire sonner votre téléphone.

Stockez les deux dans des variables d'environnement pour qu'elles n'atterrissent jamais dans un fichier de config versionné :

```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>"
```

Placez-les dans le profil de votre shell pour que Claude Code les hérite.

## Étape 2 — Ajouter les hooks

Ajoutez ceci à `~/.claude/settings.json` pour l'appliquer à tous les projets, ou à `.claude/settings.local.json` pour un seul dépôt :

```json
{
  "hooks": {
    "Notification": [
      {
        "matcher": "permission_prompt",
        "hooks": [
          {
            "type": "command",
            "command": "jq -c '{title: \"Claude demande une autorisation\", 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 a terminé\", body: (.last_assistant_message // \"Terminé\" | .[0:200]), project: (.cwd | split(\"/\") | last)}' | curl -sS -m 10 -X POST -H 'Content-Type: application/json' -d @- \"$ECHOBELL_CLAUDE_DONE_URL\""
          }
        ]
      }
    ]
  }
}
```

Le rôle de chaque élément :

- `jq -c '{...}'` lit le JSON du hook sur stdin et construit une petite charge utile, de sorte qu'Echobell reçoive exactement les champs voulus plutôt que tout le document du hook.
- `.cwd | split("/") | last` transforme `/home/me/code/api` en `api`, pour que la notification indique quel projet fait la demande.
- `.[0:200]` tronque le message final. Le worker Echobell limite le corps des notifications à 1500 octets, et un écran verrouillé en affiche de toute façon bien moins.
- `-m 10` donne à `curl` un délai d'expiration de 10 secondes, pour qu'un problème réseau ne laisse jamais Claude Code attendre votre hook.

Echobell affiche les clés envoyées via les modèles du canal, et un nouveau canal n'a aucun modèle qui les lit : définissez-les dans les réglages du canal, modèle de titre `{{title}}` et modèle de corps `{{body}}`. Ajoutez `{{project}}` à l'un des deux si vous voulez voir le nom du projet, par exemple `{{title}} ({{project}})`.

## Étape 3 — Tester sans attendre une vraie demande

Exécutez à la main le même pipeline avec une fausse charge utile de hook :

```bash
echo '{"message":"Claude a besoin de votre autorisation pour utiliser Bash","cwd":"/home/me/code/api","notification_type":"permission_prompt"}' \
  | jq -c '{title: "Claude demande une autorisation", body: .message, project: (.cwd | split("/") | last)}' \
  | curl -sS -m 10 -X POST -H 'Content-Type: application/json' -d @- "$ECHOBELL_CLAUDE_BLOCKED_URL"
```

Si votre téléphone s'allume, le côté Echobell fonctionne et le problème restant vient de la façon dont Claude Code lit la config. Dans Claude Code, lancez `/hooks` pour confirmer que les hooks ont été chargés ; les changements de réglages faits pendant qu'une session tourne peuvent nécessiter le menu des hooks ou un redémarrage pour prendre effet.

## Étape 4 — Faire sonner le canal « blocked »

Une notification push perd face au mode Ne pas déranger. Un canal **Calling** se comporte comme un appel entrant et traverse le mode Concentration d'iOS, ce qui compte surtout quand vous lancez une longue tâche et partez pour la soirée. Si vous ne voulez être dérangé que pour certaines demandes, filtrez avec une condition de canal Echobell sur les variables que vous envoyez, par exemple `project == "api"`, plutôt que de modifier le hook. Pour la liste complète des variables, consultez la [référence des conditions](/fr/docs/conditions).

## Éviter le déluge de notifications

Une session chargée peut déclencher de nombreux événements `Stop` — chaque réponse se termine par un. Trois façons de garder le signal :

- **N'envoyez pas `Stop` vers un canal qui sonne.** La fin d'une tâche n'est pas urgente ; gardez-la sur Normal.
- **Utilisez `idle_prompt` plutôt que `Stop`** si vous voulez seulement savoir quand Claude s'est arrêté et vous attend, et non après chaque réponse.
- **Restreignez par projet** avec une condition, pour qu'un dépôt de test ne vous notifie pas du tout.

## Exécuter Claude Code à distance ou en CI

La même approche fonctionne dans les environnements cloud ou distants, car le hook n'est qu'une requête HTTPS sortante. Rien n'a besoin d'être joignable depuis Internet. Définissez les deux variables d'environnement dans les secrets de l'environnement plutôt que dans un profil de shell, et la notification atteint votre téléphone où que la session s'exécute.

## Dépannage

**Rien n'arrive, et le test manuel échoue aussi.** Vérifiez que la variable d'URL est définie dans le shell qui lance Claude Code : `echo "$ECHOBELL_CLAUDE_BLOCKED_URL"`. Une variable vide fait échouer `curl` en silence.

**Le test manuel fonctionne mais le hook ne se déclenche pas.** Vérifiez le matcher : `permission_prompt` et `idle_prompt` sont distincts, et un matcher qui ne correspond pas ne s'exécute tout simplement jamais. Lancez `/hooks` et vérifiez que le JSON est valide — une virgule en trop désactive les hooks de tout le fichier de réglages.

**Le corps de la notification est vide.** Le filtre `jq` référençait un champ qui n'existe pas pour cet événement. `message` existe dans l'entrée de `Notification` ; `last_assistant_message` existe dans l'entrée de `Stop`. Utilisez `//` pour fournir une valeur par défaut, comme dans la config ci-dessus.

**Ça se déclenche trop souvent.** Voir la section ci-dessus — passez de `Stop` à `idle_prompt`, ou ajoutez une condition.

## Foire aux questions

### Comment être notifié quand Claude Code demande une autorisation ?

Ajoutez un hook `Notification` avec le matcher `permission_prompt` qui envoie un webhook vers un canal. Echobell transforme cette requête en push ou en alerte de type appel sur votre téléphone.

### Comment savoir quand Claude Code a terminé une tâche ?

Ajoutez un hook `Stop`. Il s'exécute quand Claude a fini de répondre, et son entrée inclut `last_assistant_message`, que vous pouvez utiliser comme corps de notification.

### La notification peut-elle traverser le mode Ne pas déranger ?

Oui, si le canal destinataire est un canal Calling. Il se comporte comme un appel entrant, que le mode Concentration d'iOS laisse passer. Un push normal, quelle que soit l'application, n'y parvient pas.

### Est-ce que ça fonctionne avec Claude Code sur le web ou dans des sessions distantes ?

Oui. Le hook ne fait qu'une requête HTTPS sortante, il fonctionne donc partout où la session peut joindre Internet. Fournissez les URL des canaux via les secrets de l'environnement.

### L'URL du webhook peut-elle être mise dans settings.json sans risque ?

Préférez une variable d'environnement, comme indiqué plus haut, pour que le jeton ne soit pas versionné dans un dépôt. S'il fuit, créez un nouveau canal et retirez l'ancien.

## En résumé

Deux canaux, deux hooks et un pipeline `jq | curl` : un canal **Calling** ou Time Sensitive pour `permission_prompt`, un canal Normal pour `Stop`. Ensuite, vous pouvez lancer une longue tâche d'agent, quitter la pièce et n'être rappelé que lorsque l'agent a vraiment besoin de vous.

[Téléchargez Echobell pour iPhone](https://apps.apple.com/app/apple-store/id6743597198?pt=128151925&ct=blog-claude-code-phone-notifications-fr&mt=8) ou [obtenez-le sur Google Play](https://play.google.com/store/apps/details?id=one.echobell.echobellandroid), puis lancez le test manuel ci-dessus avant de lui confier une longue tâche.

## À lire aussi

- [Transformer les validations d'agents en appels téléphoniques](/fr/blog/ai-agent-human-in-the-loop-alerts)
- [Être notifié quand une longue commande de terminal se termine](/fr/blog/notify-when-terminal-command-finishes)
- [Guide d'intégration des webhooks](/fr/docs/webhook)
- [Référence des conditions de canal](/fr/docs/conditions)
- [Contourner le mode Concentration d'iOS pour les alertes critiques](/fr/blog/how-to-bypass-ios-focus-mode-for-critical-alerts)
