Notificaciones al móvil cuando Claude Code te espera
Claude Code puede trabajar por su cuenta varios minutos seguidos y luego detenerse: necesita tu permiso para ejecutar un comando, o ha terminado y espera tu siguiente prompt. Si te has alejado de la terminal, espera lo mismo que tardes tú en volver.
Claude Code tiene hooks para los dos momentos. Un hook Notification se ejecuta cuando necesita tu permiso, y un hook Stop cuando termina una respuesta. Esta guía conecta los dos con Honk, para que te avisen tu iPhone y tu Apple Watch, y para que una sesión que avisa diez veces te envíe una sola notificación, no diez.
Antes de empezar
- Una cuenta de Honk (de momento, solo con invitación: solicita acceso) y un proyecto para tus agentes de programación, por ejemplo «Claude Code», con una clave de ingesta. Dale a este proyecto su propia clave: quien la tenga puede enviar mensajes a ese proyecto, y a nada más.
- La CLI
honken el ordenador donde se ejecuta Claude Code:go install github.com/honk-hq/go/cmd/honk@latest, o un binario de la página de releases. jq, que lee el JSON que Claude Code pasa a los hooks. Las versiones recientes de macOS lo incluyen; en Linux, instálalo con tu gestor de paquetes.
1. Guarda la clave en un archivo
Los hooks se ejecutan como comandos de shell en el entorno de Claude Code. Para que la clave no acabe en archivos de configuración que podrías subir al repositorio, guárdala en ~/.config/honk/env:
HONK_URL=https://honk-honk.app
HONK_KEY=honk_…Después ejecuta chmod 600 ~/.config/honk/env para que solo tú puedas leerlo.
2. Añade el script del hook
Guarda esto como ~/.claude/hooks/honk.sh y hazlo ejecutable con chmod +x:
#!/usr/bin/env bash
# A push when Claude Code needs your permission (Notification) or finishes (Stop).
# Claude Code sends the event as JSON on stdin. Every ping from one project
# shares a group key, so Honk folds repeats into one notification.
set -a; . "$HOME/.config/honk/env"; set +a
input=$(cat)
dir=${CLAUDE_PROJECT_DIR:-$(jq -r '.cwd // empty' <<<"$input")}
project=$(basename "${dir:-$PWD}")
case $(jq -r '.hook_event_name' <<<"$input") in
Notification)
level=loud
title="Claude Code needs you in $project"
text=$(jq -r '.message // empty' <<<"$input") ;;
Stop)
level=light
title="Claude Code finished in $project"
text=$(jq -r '.last_assistant_message // empty | .[:280]' <<<"$input") ;;
*) exit 0 ;;
esac
honk send --severity "$level" --title "$title" --message "${text:-$title}" \
--group-key "claude-code/$project" --source "$(hostname -s)" --quiet || trueLee el evento que Claude Code envía por stdin y lo convierte en un evento de Honk:
- Pide permiso: un Bocinazo fuerte con el título «Claude Code needs you in my-app» y el mensaje del propio Claude Code, como «Claude needs your permission».
- Ha terminado: un Bocinazo suave con el título «Claude Code finished in my-app» y los primeros 280 caracteres de la última respuesta.
Los títulos están en el script, así que puedes escribirlos en español. || true hace que un problema de red nunca se convierta en un error del hook.
3. Registra los hooks
Añade los dos hooks a ~/.claude/settings.json, que se aplica a todos los proyectos de este ordenador. Si el archivo ya tiene una clave hooks, añade Notification y Stop junto a los eventos que ya tenga:
{
"hooks": {
"Notification": [
{
"matcher": "permission_prompt",
"hooks": [
{
"type": "command",
"command": "$HOME/.claude/hooks/honk.sh",
"async": true
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "$HOME/.claude/hooks/honk.sh",
"async": true
}
]
}
]
}
}"matcher": "permission_prompt"limita el hookNotificationa las solicitudes de permiso. El hookStopno lleva matcher: se ejecuta al final de cada respuesta."async": trueejecuta el hook en segundo plano, así que Claude Code nunca espera a la notificación.
El mismo bloque sirve en el .claude/settings.json de un repositorio, que puedes subir para compartirlo con tu equipo (cada persona necesita entonces el script, la CLI y su propia clave), o en .claude/settings.local.json, para un solo proyecto y solo en tu ordenador.
Escribe /hooks en Claude Code para comprobar que aparecen los dos hooks. Para probar el script sin esperar a Claude, ejecuta:
echo '{"hook_event_name":"Notification","message":"Test from the terminal"}' | ~/.claude/hooks/honk.shUna notificación por proyecto, no una por aviso
Todos los eventos de un proyecto usan la clave de grupo claude-code/<project>, así que Honk los mantiene en un mismo grupo. Eso decide cuántas veces vibra tu teléfono:
- El primer aviso te llega al instante.
- Los siguientes no generan una notificación cada uno. Recibes como mucho una actualización cada 5 minutos, con el recuento, y en el iPhone cada actualización sustituye a la anterior en lugar de sumarse.
- Un evento de nivel más alto que cualquiera de los que el grupo ha enviado hasta entonces te avisa al momento, incluso dentro de esos 5 minutos: por ejemplo, una solicitud de permiso (Bocinazo fuerte) después de una respuesta terminada (Bocinazo suave).
Los dos valores están en los Ajustes del proyecto. Mientras un problema se repite, avisar como mucho una vez cada … cambia los 5 minutos. Tras un día sin avisos, el siguiente cuenta como nuevo y te llega al instante; Agrupar los mensajes que llegan con menos de … entre sí acorta ese día, para que cada nueva sesión de trabajo empiece con una notificación.
Más tranquilo: solo cuando te has ido
El hook Stop se ejecuta tras cada respuesta, aunque estés mirando la terminal. Para recibir notificaciones solo cuando te has alejado, borra el bloque Stop y cambia el matcher a "permission_prompt|idle_prompt". Claude Code envía idle_prompt cuando terminó hace unos 60 segundos y no has escrito nada desde entonces, así que una notificación significa que de verdad te está esperando.
Qué muestra la notificación
La notificación muestra el título y el mensaje, y el mensaje puede ser el principio de la respuesta de Claude, código incluido. Si trabajas en algo confidencial, abre los Ajustes del proyecto y en Qué muestran las notificaciones elige Genérica (sin contenido): la notificación muestra entonces solo el nombre del proyecto, y el texto se queda en la bandeja de entrada. O quita la respuesta del script por completo.
Codex
La CLI de Codex, de OpenAI, tiene un hook más sencillo: notify ejecuta un programa al terminar cada turno y le pasa el evento como un único argumento JSON. Este script envía el mismo Bocinazo suave, en un grupo propio:
#!/usr/bin/env bash
# Codex runs this after each finished turn, with the event as one JSON argument.
set -a; . "$HOME/.config/honk/env"; set +a
project=$(basename "$(jq -r '.cwd // "codex"' <<<"$1")")
text=$(jq -r '."last-assistant-message" // empty | .[:280]' <<<"$1")
honk light "Codex finished in $project" "${text:-Done.}" \
--group-key "codex/$project" --source "$(hostname -s)" --quiet || trueGuárdalo como ~/.codex/honk.sh, hazlo ejecutable y añade una línea a ~/.codex/config.toml, con tu carpeta de inicio en la ruta:
# a top-level key: put it above the first [section]
notify = ["/Users/you/.codex/honk.sh"]Por ahora, Codex solo envía a notify los turnos terminados (agent-turn-complete), así que esto cubre el final de una tarea, no las solicitudes de aprobación.
De momento, Honk es solo por invitación: solicita acceso. Todo lo que explica esta guía funciona con el plan Free.