Cuando Claude Code se ejecuta en un servidor remoto, un hook con notify-send u osascript se dispara en el servidor, donde no hay escritorio que lo muestre. Hay dos opciones que funcionan. La primera es una secuencia de escape del terminal: la notificación integrada de Claude Code, o un hook que devuelve un terminalSequence, vuelve por la conexión SSH y tu terminal local (Ghostty, Kitty o iTerm2) la muestra, pero solo mientras estés conectado y con el terminal abierto. La segunda es un push por la red desde el servidor a tu móvil, mediante ntfy, un webhook o Claude Code Notifier, que sigue funcionando aunque tengas el portátil cerrado.
01Por qué los comandos de notificación locales no hacen nada por SSH
Un hook es un comando que Claude Code ejecuta en la máquina donde se está ejecutando Claude Code. En un servidor al que accedes por SSH, esa máquina es el servidor. Ahí notify-send necesita un daemon de notificaciones de escritorio, y la guía de hooks de Anthropic indica que los servidores headless y las sesiones SSH no lo tienen. osascript y las notificaciones toast de PowerShell directamente no existen.
Así que la pregunta no es "qué comando de notificación", sino "cómo me llega una señal desde el servidor". Hay tres formas:
02Opción 1: notificaciones a través de tu terminal SSH
La notificación propia de Claude Code es una secuencia de escape que se escribe en el terminal. La guía del terminal de Anthropic dice que llega a tu máquina local por SSH, así que una sesión remota puede avisarte igualmente. Ghostty y Kitty la pasan al centro de notificaciones de tu escritorio sin configurar nada. iTerm2 también, una vez que lo activas: en Settings > Profiles > Terminal, marca Notification Center Alerts y, en Filter Alerts, activa Send escape sequence-generated alerts.
Si tu terminal no es uno de esos, o quieres tu propio texto, un hook puede devolver una secuencia de escape para que Claude Code la escriba. Los hooks no tienen terminal propio, así que la devuelves en un campo terminalSequence. Guarda esto en el servidor como ~/.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}'
Luego añádelo a ~/.claude/settings.json en el servidor:
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{ "type": "command", "command": "~/.claude/hooks/notify-ssh.sh" }
]
}
]
}
}
Ejecuta chmod +x ~/.claude/hooks/notify-ssh.sh e instala jq en el servidor. La referencia de Anthropic enumera las secuencias que acepta: OSC 9 (iTerm2, ConEmu, Windows Terminal, WezTerm), OSC 99 (Kitty), OSC 777 (urxvt, Ghostty, Warp) y un simple bell. Claude Code solo escribe la secuencia en una sesión interactiva mientras su interfaz está en pantalla.
Las limitaciones vienen de serie. Si se cae la conexión SSH, el portátil entra en reposo o cierras la pestaña, no llega nada. Si ejecutas Claude Code dentro de tmux, añade set -g allow-passthrough on a ~/.tmux.conf en el servidor; la guía de tmux explica eso y las sesiones desconectadas.
03Opción 2: un push desde el servidor
Un push no depende de tu terminal, así que es la mejor opción para tareas largas. El hook hace una petición HTTPS desde el servidor y un servicio la entrega en tu móvil o chat. La guía de ntfy y la guía de Telegram, Slack y Discord tienen hooks que funcionan. Te avisan de que algo ha pasado, pero no pueden aprobar un comando ni responder a una pregunta, así que Claude sigue esperando a que te vuelvas a conectar.
04Opción 3: Claude Code Notifier en el servidor
Claude Code Notifier es una herramienta independiente (creada por TouchTap, no por Anthropic). Su herramienta de línea de comandos gratuita, ccn, funciona en Mac, Windows y Linux, así que la instalas en el servidor, donde se ejecuta Claude Code:
curl -fsSL https://claudecodenotifier.com/install.sh | sh
Añade sus entradas de hook al ~/.claude/settings.json del servidor, respeta el resto y hace una copia de seguridad. Las notificaciones de escritorio de ccn aparecen en la máquina donde se ejecuta ccn, lo que en un servidor headless significa en ningún sitio útil. Lo útil es el móvil: las notificaciones al móvil pasan por el servidor de relay cifrado de TouchTap, no por tu conexión SSH, así que funcionan desde cualquier máquina donde se ejecute ccn mientras tenga acceso a internet.
Emparejar por SSH
Para emparejar no necesitas navegador en el servidor. Puedes ejecutar ccn pair en tu sesión SSH; muestra en el terminal un código QR que escaneas con la cámara del móvil y un enlace válido durante 24 horas. O abre la app en el móvil, ve a Computers > Add a computer y ejecuta la línea que aparece, que instala y empareja en un solo paso:
curl -fsSL https://claudecodenotifier.com/install.sh | sh -s 482913
(El código de seis dígitos es un ejemplo; usa el que te muestre la app). Un móvil puede tener varios ordenadores, así que tanto un portátil como un servidor pueden enviarle avisos. Consulta la guía de emparejamiento para más detalles.
Qué puedes hacer desde el móvil
Una vez emparejado, recibes un push cuando Claude termina, necesita un permiso o hace una pregunta. Puedes permitir una vez, permitir para la sesión o denegar un permiso, elegir una respuesta a la pregunta de Claude y enviar la siguiente instrucción cuando Claude termine. Si no estás, la terminal espera la respuesta del teléfono, hasta un límite que tú eliges, y deja de esperar en cuanto escribes en el teclado. Ejecuta ccn doctor en el servidor para comprobar los hooks, las credenciales y la conexión con el relay. Consulta los precios de las apps para teléfono; la herramienta de línea de comandos es gratuita.
05Mantén Claude Code vivo cuando se cae el SSH
Las tres opciones necesitan que Claude Code siga ejecutándose. Si lanzas claude directamente desde tu shell SSH y se cae la conexión, la sesión se cierra con ella. Ejecútalo dentro de tmux o GNU screen para que sobreviva a una desconexión y vuelve a conectarte después. Los hooks siguen disparándose en una sesión desconectada, y ahí es donde un push al teléfono demuestra lo que vale. La guía de tmux y despreocúpate de las tareas largas explican este flujo de trabajo.
06Preguntas frecuentes
¿Por qué notify-send no hace nada cuando uso Claude Code por SSH?
El hook se ejecuta en el servidor, y el servidor no tiene un daemon de notificaciones de escritorio. Usa una secuencia de escape que entienda tu terminal local, o un servicio de push.
¿Funciona la notificación integrada de Claude Code por SSH?
Sí, en las terminales que la admiten. La documentación de Anthropic dice que la notificación de escritorio llega a tu máquina local por SSH; Ghostty y Kitty la muestran sin configurar nada, e iTerm2 cuando activas las alertas por secuencias de escape. Necesita que la conexión esté abierta.
¿Instalo ccn en mi portátil o en el servidor?
En el servidor, porque ahí es donde se ejecutan Claude Code y sus hooks. Instálalo también en tu portátil si ahí también usas Claude Code; un mismo teléfono puede emparejarse con ambos.
¿Me seguirán llegando avisos si se desconecta mi sesión SSH?
Solo con un push desde el servidor, y solo si Claude Code sigue ejecutándose, por ejemplo dentro de tmux. Las secuencias de escape dejan de funcionar en cuanto se cierra la conexión.
¿El servidor necesita algún puerto abierto para las notificaciones al teléfono?
ccn no necesita conexiones entrantes. Necesita acceso saliente a internet para llegar al servidor relay.