Quand Claude Code tourne sur un serveur distant, un hook notify-send ou osascript se déclenche sur le serveur, où il n'y a aucun bureau pour l'afficher. Deux solutions fonctionnent. La première, c'est une séquence d'échappement : la notification intégrée de Claude Code, ou un hook qui renvoie une terminalSequence, remonte par la connexion SSH et ton terminal local (Ghostty, Kitty ou iTerm2) l'affiche, mais seulement tant que tu es connecté et que le terminal est ouvert. La seconde, c'est un push envoyé par le réseau du serveur vers ton téléphone, via ntfy, un webhook ou Claude Code Notifier, qui continue de marcher même quand ton portable est fermé.
01Pourquoi les commandes de notification locales ne font rien via SSH
Un hook est une commande que Claude Code exécute sur la machine où tourne Claude Code. Sur un serveur accessible en SSH, c'est donc le serveur. Là-bas, notify-send a besoin d'un daemon de notifications de bureau, ce que les serveurs headless et les sessions SSH n'ont pas, comme le rappelle le guide des hooks d'Anthropic. Quant à osascript et aux toasts PowerShell, ils n'existent tout simplement pas.
La question n'est donc pas « quelle commande de notification », mais « comment un signal arrive du serveur jusqu'à moi ». Il y a trois façons :
02Solution 1 : les notifications via ton terminal SSH
La notification native de Claude Code est une séquence d'échappement écrite dans le terminal. D'après le guide du terminal d'Anthropic, elle arrive jusqu'à ta machine locale via SSH, donc une session distante peut quand même t'alerter. Ghostty et Kitty la transmettent au centre de notifications de ton bureau sans aucune configuration. iTerm2 le fait aussi une fois activé : Settings > Profiles > Terminal, coche Notification Center Alerts, puis dans Filter Alerts active Send escape sequence-generated alerts.
Si ton terminal n'en fait pas partie, ou si tu veux ton propre texte, un hook peut renvoyer une séquence d'échappement que Claude Code écrira. Les hooks n'ont pas de terminal à eux, donc tu la renvoies dans un champ terminalSequence. Enregistre ceci sur le serveur dans ~/.claude/hooks/notify-ssh.sh :
#!/bin/bash
body=$(jq -r '.message // "Claude Code needs your attention"')
# OSC 9 for iTerm2, WezTerm and ConEmu; use '\033]777;notify;%s;%s\007' for Ghostty
seq=$(printf '\033]9;%s\007' "$body")
jq -nc --arg seq "$seq" '{terminalSequence: $seq}'
Puis ajoute-le à ~/.claude/settings.json sur le serveur :
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{ "type": "command", "command": "~/.claude/hooks/notify-ssh.sh" }
]
}
]
}
}
Lance chmod +x ~/.claude/hooks/notify-ssh.sh et installe jq sur le serveur. La référence d'Anthropic liste les séquences acceptées : OSC 9 (iTerm2, ConEmu, Windows Terminal, WezTerm), OSC 99 (Kitty), OSC 777 (urxvt, Ghostty, Warp) et un simple bell. Claude Code n'écrit la séquence que dans une session interactive, quand son interface est affichée.
Les limites sont inhérentes. Si la connexion SSH tombe, si ton portable se met en veille ou si tu fermes l'onglet, rien n'arrive. Si tu lances Claude Code dans tmux, ajoute set -g allow-passthrough on à ~/.tmux.conf sur le serveur ; le guide tmux explique ça ainsi que les sessions détachées.
03Solution 2 : un push depuis le serveur
Un push ne dépend pas de ton terminal, c'est donc le bon choix pour les tâches longues. Le hook envoie une requête HTTPS depuis le serveur, et un service la livre sur ton téléphone ou ton chat. Le guide ntfy et le guide Telegram, Slack et Discord proposent des hooks prêts à l'emploi. Ils te préviennent qu'il s'est passé quelque chose, mais ne peuvent ni approuver une commande ni répondre à une question : Claude attend donc toujours que tu te reconnectes.
04Solution 3 : Claude Code Notifier sur le serveur
Claude Code Notifier est un outil indépendant (développé par TouchTap, pas par Anthropic). Son outil en ligne de commande gratuit, ccn, tourne sur Mac, Windows et Linux : tu l'installes donc sur le serveur, là où tourne Claude Code :
curl -fsSL https://claudecodenotifier.com/install.sh | sh
Il ajoute ses entrées de hook au ~/.claude/settings.json du serveur, garde le reste et fait une sauvegarde. Les notifications de bureau de ccn s'affichent sur la machine où tourne ccn, ce qui, sur un serveur headless, ne sert à rien. C'est le téléphone qui est utile : les notifications mobiles passent par le serveur relais chiffré de TouchTap, pas par ta connexion SSH, donc elles marchent depuis n'importe quelle machine où tourne ccn, tant qu'elle a accès à internet.
Appairer via SSH
L'appairage ne nécessite aucun navigateur sur le serveur. Soit tu lances ccn pair dans ta session SSH : ça affiche dans le terminal un QR code à scanner avec l'appareil photo de ton téléphone, ainsi qu'un lien valable 24 heures. Soit tu ouvres l'app sur ton téléphone, tu vas dans Computers > Add a computer et tu lances la ligne affichée, qui installe et appaire en une seule étape :
curl -fsSL https://claudecodenotifier.com/install.sh | sh -s 482913
(Le code à six chiffres est un exemple ; utilise celui affiché par ton app.) Un même téléphone peut avoir plusieurs ordinateurs, donc un portable et un serveur peuvent tous les deux lui envoyer des notifications. Consulte le guide d'appairage pour plus de détails.
Ce que tu peux faire depuis ton téléphone
Une fois l'appairage fait, tu reçois un push quand Claude a terminé, a besoin d'une permission ou pose une question. Tu peux autoriser une fois, autoriser pour la session ou refuser une permission, choisir une réponse à la question de Claude, et envoyer l'instruction suivante une fois que Claude a terminé. Si tu n'es pas là, le terminal attend la réponse du téléphone, jusqu'à une durée maximale que tu choisis, et arrête d'attendre dès que tu tapes au clavier. Lance ccn doctor sur le serveur pour vérifier les hooks, les identifiants et la connexion au relais. Consulte les tarifs pour les applis mobiles ; l'outil en ligne de commande est gratuit.
05Garder Claude Code en vie quand SSH coupe
Les trois méthodes exigent que Claude Code lui-même continue de tourner. Si tu lances claude directement depuis ton shell SSH et que la connexion coupe, la session s'arrête avec elle. Lance-le dans tmux ou GNU screen pour qu'il survive à une déconnexion, puis rattache-toi plus tard. Les hooks continuent de se déclencher dans une session détachée, et c'est là qu'un push sur le téléphone prend tout son intérêt. Le guide tmux et laisser tourner les tâches longues détaillent ce workflow.
06FAQ
Pourquoi notify-send ne fait rien quand j'utilise Claude Code via SSH ?
Le hook s'exécute sur le serveur, et le serveur n'a pas de démon de notifications de bureau. Utilise une séquence d'échappement que ton terminal local comprend, ou un service de push.
La notification intégrée de Claude Code fonctionne-t-elle via SSH ?
Oui, dans les terminaux qui la prennent en charge. D'après la doc d'Anthropic, la notification de bureau arrive sur ta machine locale via SSH ; Ghostty et Kitty l'affichent sans configuration, et iTerm2 une fois les alertes par séquence d'échappement activées. La connexion doit rester ouverte.
J'installe ccn sur mon portable ou sur le serveur ?
Sur le serveur, car c'est là que tournent Claude Code et ses hooks. Installe-le aussi sur ton portable si tu y utilises Claude Code ; un même téléphone peut être appairé aux deux.
Est-ce que je reçois encore les notifications si ma session SSH se déconnecte ?
Uniquement avec un push depuis le serveur, et seulement si Claude Code tourne encore, par exemple dans tmux. Les séquences d'échappement s'arrêtent dès que la connexion se ferme.
Le serveur a-t-il besoin de ports ouverts pour les notifications sur le téléphone ?
ccn n'a besoin d'aucune connexion entrante. Il lui faut un accès Internet sortant pour joindre le serveur relais.