Avisos y aprobaciones de Claude Code en el móvil
Claude Code tiene hooks: puntos en los que ejecuta un comando tuyo. Con eso se puede montar un aviso cuando pide permiso o termina, y hasta contestarle desde el teléfono. Aquí va cómo funciona por dentro y cómo lo usa Wendo.
Qué es un hook de Claude Code
Un hook es un comando que Claude Code lanza cuando ocurre un evento: empieza una sesión, le envías un prompt, necesita un permiso, termina de responder. Se declaran en ~/.claude/settings.json, un evento por clave, y cada uno apunta a un comando:
{
"hooks": {
"Stop": [
{ "hooks": [{ "type": "command", "command": "~/.wendo/wendo-hook.sh" }] }
]
}
}
Claude Code ejecuta ese comando y le pasa por la entrada estándar un JSON con los datos del evento: el nombre del evento, la carpeta de trabajo, el identificador de sesión y, según el caso, la herramienta que quiere usar. El comando hace lo que quiera con eso. En algunos eventos también puede devolver una respuesta por la salida estándar, y así Claude Code se entera de la decisión.
Los eventos que registra Wendo
El instalador añade el mismo script a seis eventos:
PermissionRequest: Claude Code va a pedirte permiso.Notification: un aviso de Claude Code que requiere atención.Stop: ha terminado de responder.UserPromptSubmit: has enviado un prompt, así que está trabajando.SessionStartySessionEnd: la sesión empieza o acaba.
Cada evento se guarda como una línea en ~/.wendo/events.jsonl en el ordenador. La app lee ese archivo por SSH con tu clave, así que no hay servidor intermedio ni cuenta de por medio. Lo que aparece en la Bandeja sale de ahí.
Para instalarlo, un comando:
curl -fsSL https://wendo.lirafy.dev/install.sh | sh
Antes de tocar settings.json hace una copia en settings.json.bak-wendo, y puedes ejecutarlo varias veces sin duplicar entradas. Si ya tienes otros hooks, los deja como están. Las opciones y el registro a mano están en la página de avisos y aprobaciones; la guía general para montar todo el entorno está en cómo usar Claude Code desde el móvil.
Cómo funciona una aprobación
PermissionRequest es el único evento donde el hook se queda esperando. Cuando Claude Code pide permiso, el script apunta la petición como pendiente, y la Bandeja de la app muestra la fila con los botones para aprobar o denegar. Al pulsar uno, la app deja la respuesta en un archivo del ordenador, el hook la recoge y le devuelve la decisión a Claude Code.
La espera dura 90 segundos. Si en ese tiempo no contestas, el hook no imprime nada y Claude Code muestra su pregunta normal en el terminal, como si Wendo no existiera. Eso importa: si te quedas sin batería o sin cobertura, no se bloquea nada, solo vuelves al caso de siempre.
Si contestas en el terminal antes que en el móvil, también queda constancia de que se resolvió en local.
Hay variables de entorno para ajustarlo, que se ponen delante del comando del hook:
WENDO_APPROVAL_TIMEOUT: segundos de espera. Eltimeoutdel hook ensettings.json(120 en la instalación) tiene que ser mayor.WENDO_BLOCKING=0: solo avisa, sin esperar respuesta.WENDO_HOST: el nombre con el que la app reconoce el ordenador, si no coincide conhostname -s.
Las preguntas de Claude (AskUserQuestion) y la aprobación de planes (ExitPlanMode) no bloquean. Piden una elección, no un sí o un no, así que se contestan desde la vista de chat.
Avisos con la app cerrada: ntfy
Con Wendo abierto, la app lee la bandeja cada pocos segundos. Con la app cerrada hace falta algo que empuje el aviso hasta el móvil, y para eso se usa ntfy: un servicio de notificaciones push sencillo que se publica con una petición HTTP.
- Pon
NTFY_TOPICdelante del comando del hook ensettings.json:
NTFY_TOPIC=un-topic-largo-y-aleatorio ~/.wendo/wendo-hook.sh
- Instala la app de ntfy en el móvil y suscríbete a ese mismo topic.
- Escribe el topic también en Ajustes › Agentes › Notificaciones, dentro de Wendo.
Para generar un topic que no se adivine:
openssl rand -hex 16
El topic hace de contraseña. En el ntfy público, quien conozca el nombre del topic puede leer lo que se publica y publicar en él, así que no uses algo como claude-juan. Los avisos incluyen el proyecto y un extracto del mensaje o del comando, lo bastante para decidir; no conviene que los lea cualquiera.
Si prefieres no depender del servidor público, NTFY_URL apunta el hook a tu propio servidor de ntfy. Por defecto es https://ntfy.sh. Al tocar un aviso, la app abre el panel de tmux, zellij o herdr donde corre el agente, siempre que lo ejecutes dentro de uno de ellos (consulta la página de tmux).
En Android hay además una comprobación en segundo plano como mínimo cada 15 minutos. Solo se envían a ntfy los avisos de permiso, de notificación y de tarea terminada; el hook no empuja el inicio ni el fin de sesión, ni cada prompt.
Límites
- Por ahora solo Claude Code. El hook no se registra en otros agentes.
- Necesita
jqen el ordenador.curlsolo hace falta para ntfy. - Sin multiplexor, la app no sabe en qué panel corre Claude y no puede llevarte directamente a él.
- El plan gratis incluye 5 aprobaciones de prueba desde la Bandeja; con Pro no hay límite.
- Wendo no está todavía en las tiendas: llegará pronto a App Store y Google Play.