Pour recevoir des notifications push Claude Code avec ntfy, installe l'app ntfy sur ton téléphone, abonne-toi à un topic au nom difficile à deviner, puis ajoute un hook Claude Code qui lance curl -d "message" https://ntfy.sh/your-topic. Un hook Notification te prévient quand Claude a besoin d'une permission ou t'attend, et un hook Stop te prévient dès qu'un tour se termine. C'est gratuit, ça prend une dizaine de minutes et ça marche sur Mac, Windows et Linux.
01Étape 1 : choisis un topic et abonne-toi
ntfy ne demande aucune inscription. Un topic est créé la première fois que quelqu'un y publie ou s'y abonne, et toute personne qui connaît son nom peut le lire. La documentation de ntfy le dit elle-même : le topic fait office de mot de passe, donc choisis-le long et aléatoire, par exemple claude-7f3k9q2xw4mz. Les noms de topic acceptent lettres, chiffres, underscores et tirets, jusqu'à 64 caractères.
Installe l'app ntfy (App Store, Google Play ou F-Droid), appuie sur + et abonne-toi à ton topic sur ntfy.sh.
Vérifie que ça marche depuis un terminal :
curl -H "Title: Test" -d "Hello from my computer" https://ntfy.sh/claude-7f3k9q2xw4mz
Ton téléphone devrait vibrer en une ou deux secondes. Sur Windows, curl.exe est fourni avec Windows 10 et 11 et accepte la même commande.
02Étape 2 : un script de hook (Mac et Linux)
Claude Code transmet à chaque hook un objet JSON sur l'entrée standard. Les deux événements partagent des champs comme cwd et hook_event_name. Notification ajoute message et notification_type, et Stop ajoute last_assistant_message, le texte de la dernière réponse de Claude. Ce script transforme l'un ou l'autre en push lisible. Il nécessite jq (brew install jq, ou apt install jq sur Debian et Ubuntu).
Enregistre-le sous ~/.claude/ntfy-notify.sh et lance chmod +x ~/.claude/ntfy-notify.sh :
#!/bin/sh
TOPIC_URL="https://ntfy.sh/claude-7f3k9q2xw4mz"
input=$(cat)
event=$(printf '%s' "$input" | jq -r '.hook_event_name')
project=$(basename "$(printf '%s' "$input" | jq -r '.cwd')")
if [ "$event" = "Stop" ]; then
title="Claude finished: $project"
body=$(printf '%s' "$input" | jq -r '(.last_assistant_message // "Done") | .[0:300]')
priority=3
else
title="Claude needs you: $project"
body=$(printf '%s' "$input" | jq -r '.message // "Needs your attention"')
priority=4
fi
curl -s -H "Title: $title" -H "Priority: $priority" -H "Tags: robot" \
-d "$body" "$TOPIC_URL" > /dev/null
exit 0
La priorité va de 1 (min) à 5 (urgent). Tags ajoute un emoji à la notification ; robot affiche une tête de robot.
03Étape 3 : branche-le dans settings.json
Ajoute les hooks dans ~/.claude/settings.json. Si le fichier contient déjà un objet hooks, ajoute ces événements dedans au lieu de le remplacer.
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{ "type": "command", "command": "~/.claude/ntfy-notify.sh" }
]
}
],
"Stop": [
{
"hooks": [
{ "type": "command", "command": "~/.claude/ntfy-notify.sh", "async": true }
]
}
]
}
}
"async": true permet au hook Stop d'envoyer en arrière-plan, pour qu'un réseau lent ne ralentisse jamais Claude. Lance une nouvelle session Claude Code, car les hooks sont chargés au démarrage d'une session.
Stop ou idle_prompt ?
Stop se déclenche dès que Claude termine, même si tu es devant ton clavier. Si c'est trop, supprime le bloc Stop et utilise plutôt le matcher permission_prompt|idle_prompt. D'après la documentation d'Anthropic, idle_prompt se déclenche environ 60 secondes après la fin de Claude, seulement si tu n'as rien tapé entre-temps, et permission_prompt se déclenche quand une demande de permission attend depuis environ six secondes sans frappe au clavier. Tu obtiens ainsi gratuitement un filtre approximatif « seulement quand je ne suis pas là ». Le guide du Notification hook et le guide du Stop hook détaillent chaque champ et chaque délai.
04Windows (PowerShell)
Sur Windows, enregistre ceci sous %USERPROFILE%\.claude\ntfy-notify.ps1. Rien d'autre à installer :
$in = [Console]::In.ReadToEnd() | ConvertFrom-Json
$project = Split-Path $in.cwd -Leaf
if ($in.hook_event_name -eq 'Stop') {
$title = "Claude finished: $project"
$body = [string]$in.last_assistant_message
if ($body.Length -gt 300) { $body = $body.Substring(0, 300) }
$priority = '3'
} else {
$title = "Claude needs you: $project"
$body = [string]$in.message
$priority = '4'
}
Invoke-RestMethod -Method Post -Uri 'https://ntfy.sh/claude-7f3k9q2xw4mz' `
-Headers @{ Title = $title; Priority = $priority } `
-Body ([Text.Encoding]::UTF8.GetBytes($body)) | Out-Null
Utilise ensuite cette entrée de hook à la place des lignes command ci-dessus :
{
"type": "command",
"shell": "powershell",
"command": "powershell -NoProfile -ExecutionPolicy Bypass -File \"$HOME\\.claude\\ntfy-notify.ps1\""
}
Si tu fais tourner Claude Code dans WSL, utilise plutôt le script Mac et Linux ; pour le hook, WSL, c'est du Linux.
05Garder ça privé
Tout le contenu du push passe par le serveur ntfy, et sur ntfy.sh, n'importe qui connaissant le nom du topic peut le lire. Le message Stop ci-dessus inclut le début de la réponse de Claude, qui peut contenir du code ou des noms de fichiers. Trois façons de verrouiller ça :
- Envoie moins. Remplace le corps du
Stoppar une chaîne fixe comme"Done"et garde seulement le nom du projet dans le titre. - Utilise un token d'accès. ntfy accepte
-H "Authorization: Bearer tk_..."sur n'importe quelle publication. Sur ton propre serveur, configureauth-default-access: "deny-all", crée un utilisateur avecntfy user addet un token avecntfy token add. - Héberge ton propre serveur. ntfy peut être auto-hébergé. Pour une livraison instantanée vers l'app iPhone, la doc de ntfy recommande de configurer
upstream-base-url: "https://ntfy.sh", qui ne transmet qu'un ID de message et un hash du topic à ntfy.sh pour réveiller le téléphone ; l'app récupère ensuite le message depuis ton serveur.
Si Claude Code tourne sur un serveur distant, le même hook y fonctionne tel quel, ce qui fait de ntfy une bonne option pour les notifications via SSH.
06Où se situe Claude Code Notifier
Pour des alertes à sens unique, cette config fait parfaitement le job et on ne va pas t'en dissuader. Mais elle se contente de te prévenir. Quand le push t'indique que Claude a besoin d'une permission, la session attend quand même que tu reviennes au clavier.
ntfy gère bien des boutons d'action qui envoient une requête HTTP, donc tu pourrais construire toi-même un moyen de répondre : un hook PermissionRequest qui publie la demande, attend une réponse sur un second topic et renvoie une décision. Certains projets open source font exactement ça (voir le comparatif).
Claude Code Notifier fait tout ça clé en main. Avec un téléphone appairé, tu peux autoriser une fois, autoriser pour la session ou refuser une permission, choisir une réponse quand Claude pose une question et envoyer la prochaine instruction quand Claude a fini, le tout depuis ton téléphone. Il détecte aussi ta présence : si tu as tapé dans les 30 dernières secondes, le terminal demande comme d'habitude et rien n'attend sur le téléphone. Si tu n'es pas là, le terminal attend ta réponse jusqu'à un plafond que tu définis, et arrête d'attendre dès que tu touches le clavier. ccn tourne sur Mac, Windows et Linux ; consulte la page ccn et les tarifs des apps mobiles.
07FAQ
ntfy est-il gratuit pour les notifications Claude Code ?
Publier et s'abonner sur ntfy.sh ne nécessite aucun compte, et le serveur est ouvert à tous. ntfy propose aussi une offre payante et peut être auto-hébergé. Consulte le site de ntfy pour les limites actuelles.
Pourquoi mon hook ntfy ne se déclenche pas ?
Lance une nouvelle session Claude Code après avoir modifié settings.json, car les hooks sont chargés au démarrage. Ensuite, lance la commande de test curl à la main, et envoie du JSON d'exemple au script via un pipe, par exemple echo '{"hook_event_name":"Stop","cwd":"/tmp/x"}' | ~/.claude/ntfy-notify.sh. La checklist de dépannage couvre le reste.
Puis-je répondre à Claude Code depuis une notification ntfy ?
Pas avec une simple publication. Les boutons d'action HTTP de ntfy peuvent envoyer une requête, mais il te faut un hook qui attend la réponse et la transforme en décision compréhensible par Claude Code.
Est-ce que je reçois un push pour chaque type de notification ?
Seulement pour les matchers que tu indiques. Omets matcher dans l'entrée Notification pour recevoir tous les types, y compris les dialogues d'authentification et MCP.