Notifications Claude Code sur téléphone via les hooks

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.

Mis à jour

Table des matières

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) :

Vous voulez savoir quand…Événement de hookMatcher / filtre
Claude attend une décision d'autorisationNotificationpermission_prompt
Claude est inactif et attend votre saisieNotificationidle_prompt
Claude a fini de répondreStopaucun 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 / Google Play)
  • 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é :

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 :

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

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.

É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 ou obtenez-le sur Google Play, puis lancez le test manuel ci-dessus avant de lui confier une longue tâche.

À lire aussi