Blog
Más allá de SSH: por qué WebSocket supera a los protocolos de terminal para agentes de codificación IA
SSH fue diseñado para sesiones interactivas humanas. Los agentes de codificación IA necesitan algo diferente. Aquí explicamos por qué WebSocket es el mejor protocolo para control remoto de agentes.
Sigue las novedades de producto e ingeniería de esta categoría.
Ver categoríaCuando los desarrolladores oyen hablar de controlar Claude Code desde un teléfono, la reacción natural es: "¿Por qué no simplemente hacer SSH a mi Mac?"
Es una pregunta razonable. SSH es probado, seguro, ubicuo. Todos los desarrolladores lo conocen. Hay excelentes clientes SSH para móvil como Termius, Blink Shell y Prompt. ¿Por qué construir algo diferente?
La respuesta no es que SSH sea malo. Es que los agentes de codificación IA tienen patrones de interacción fundamentalmente diferentes a las sesiones interactivas de shell, y esas diferencias se acumulan en una peor experiencia cuando intentas forzar SSH.
La incompatibilidad del modelo de interacción
SSH fue diseñado en 1995 para un modelo específico: un humano se sienta ante un terminal, escribe comandos, lee la salida, escribe más comandos. La sesión es interactiva y síncrona — estás activamente involucrado todo el tiempo.
Los agentes de codificación IA invierten este modelo:
| SSH (Shell interactivo) | Control de agente IA | |
|---|---|---|
| Duración de sesión | Minutos a horas de uso activo | Horas a días, mayormente monitoreo pasivo |
| Atención humana | Continua | Intermitente — consultar cuando hay notificación |
| Patrón de entrada | Pulsaciones frecuentes | Prompts ocasionales + decisiones de aprobación |
| Patrón de salida | Respuesta a tus comandos | Streams autónomos largos que escaneas, no lees |
| Eventos críticos | Los ves porque estás mirando | Podrías perderlos si no estás mirando |
| Modo de fallo | Lo notas inmediatamente | El agente podría esperar indefinidamente por aprobación |
Las dos últimas filas son el problema. Cuando Claude Code termina una tarea o necesita tu aprobación para una operación peligrosa, SSH no tiene forma de avisarte. Tienes que estar mirando.
Problema 1: Sin notificaciones push
Esta es la mayor brecha. Con un agente de codificación IA, el flujo más valioso es:
- Enviar una tarea: "Refactoriza el módulo de pagos para usar la nueva API"
- Guardar el teléfono
- Recibir notificación cuando Claude termine o necesite entrada
- Revisar y continuar
SSH no puede hacer el paso 3. El protocolo SSH no tiene mecanismo para enviar notificaciones push a un dispositivo móvil. La conexión TCP existe solo mientras tu cliente SSH está en primer plano (o usando Mosh, mientras la sesión UDP está viva). Incluso entonces, no hay puente entre "aparecieron datos en el terminal" y "enviar una notificación push a este dispositivo."
Puedes solventarlo con shell scripts que envíen notificaciones vía servicios externos, pero eso es infraestructura frágil que tienes que construir y mantener tú mismo.
Enfoque WebSocket: El servidor monitoriza la salida de Claude Code y los eventos de hooks. Cuando detecta una finalización o solicitud de aprobación, envía un evento estructurado a los clientes conectados. La app iOS los convierte en notificaciones push nativas. Sin polling, sin servicios externos.
Problema 2: Comportamiento en segundo plano de iOS
iOS suspende agresivamente las apps que no están en primer plano. Un cliente SSH que pasa a segundo plano obtiene aproximadamente 30 segundos antes de que iOS suspenda sus conexiones de red. Después:
- SSH: La conexión cae. Cuando reabres la app, obtienes un error de "broken pipe". Te reconectas, pero has perdido tu posición de scroll y toda la salida que ocurrió mientras estabas fuera.
- Mosh: Mejor — usa UDP y puede reanudar. Pero igualmente te pierdes todo lo que ocurrió durante la suspensión. Y Mosh no resuelve el problema de notificaciones.
Esta es una restricción fundamental de iOS, no un bug de los clientes SSH. Apple no permite conexiones de red arbitrarias en segundo plano por razones de batería.
Enfoque WebSocket: El servidor almacena en buffer la salida del terminal independientemente del estado de conexión del cliente. Cuando la app iOS vuelve a primer plano, se reconecta automáticamente y realiza una hidratación de estado multi-etapa — refrescando a 0.2s, 0.7s y 1.5s tras la reconexión para capturar el estado actual completo. Mientras tanto, los eventos críticos (finalización de tareas, errores) se entregan como notificaciones push incluso cuando la app está suspendida.
Problema 3: Gestión del estado de sesión
Los agentes de codificación IA a menudo ejecutan múltiples tareas en paralelo. Podrías tener:
- Sesión A: refactorizando el módulo de autenticación
- Sesión B: escribiendo tests para la capa API
- Sesión C: arreglando un bug en producción
Con SSH, gestionar esto implica:
- SSH a tu Mac
- Adjuntarse manualmente a la sesión tmux correcta:
tmux attach -t session-a - Comprobar estado, desadjuntarse:
Ctrl+B, D - Adjuntarse a la siguiente sesión:
tmux attach -t session-b - Repetir
Funciona, pero es manual y propenso a errores en un teclado de teléfono.
Enfoque WebSocket: El servidor expone la gestión de sesiones como comandos estructurados. La app iOS muestra una lista de sesiones activas con sus estados actuales. Toca para cambiar. Crea nuevas sesiones con un selector de rutas que navega el sistema de archivos de tu Mac. Elimina sesiones con un deslizamiento. El servidor gestiona toda la orquestación de tmux.
Problema 4: Semántica de eventos del agente
SSH transporta bytes crudos. No entiende qué está pasando en el terminal. No sabe la diferencia entre Claude pensando, Claude escribiendo código, Claude esperando aprobación o Claude terminando una tarea.
Claude Code tiene un sistema de hooks que ejecuta shell scripts en eventos específicos: inicio de tarea, finalización de tarea, eventos de notificación. Estos hooks son cómo el servidor aprende sobre las transiciones de estado del agente.
Limitación de SSH: No hay forma limpia de enrutar estos eventos de hooks a través de una sesión SSH. Necesitarías un canal separado (otra conexión SSH, un servicio webhook, algo) ejecutándose junto a tu sesión de terminal.
Enfoque WebSocket: El servidor recibe eventos de hooks vía HTTP POST desde los scripts hook de Claude Code. Los analiza, los deduplica (con una ventana de 3 segundos para evitar alertas duplicadas), y los envía a la app iOS por la misma conexión WebSocket que transporta los datos del terminal. Una conexión, múltiples tipos de datos.
Problema 5: Autenticación y control de acceso
La autenticación SSH es potente pero compleja para casos de uso móvil:
- La gestión de claves en iOS es incómoda
- Necesitas configurar sshd en tu Mac
- El reenvío de puertos a través de NAT requiere configuración adicional
- Exponer SSH a internet exige una configuración de seguridad cuidadosa
Enfoque WebSocket: Tactic Remote usa autenticación por clave API sobre WebSocket. Para conexiones LAN, la clave API es opcional (tu red doméstica es el límite de confianza). Para conexiones Cloudflare Tunnel, la clave API es obligatoria. La app Mac genera una clave aleatoria de 32 caracteres y la transfiere vía código QR — sin gestión de archivos de claves, sin configuración de sshd.
Este es un modelo de seguridad deliberadamente más simple. Intercambia la flexibilidad de SSH por facilidad de configuración. Si necesitas las garantías de seguridad de la autenticación por clave pública SSH, SSH es la herramienta correcta — pero probablemente para un caso de uso diferente.
Cuándo SSH sigue siendo mejor
SSH gana cuando:
- Gestionas muchos servidores — SSH es el protocolo estándar para acceso a servidores. Un cliente, muchos hosts.
- Necesitas transferencia de archivos — SFTP/SCP están integrados en SSH. Tactic Remote no hace transferencia de archivos.
- Usas herramientas que no son Claude — SSH es agnóstico respecto al agente. Funciona con cualquier aplicación de terminal.
- Necesitas reenvío de puertos — los túneles SSH están probados en batalla para proxying de servicios.
- Tus requisitos de compliance exigen SSH — algunas organizaciones requieren SSH para auditoría y control de acceso.
La arquitectura en la práctica
Así se ve la arquitectura WebSocket para Tactic Remote:
El servidor se sitúa entre el teléfono y Claude Code, añadiendo:
- Semántica de eventos (bytes crudos del terminal se convierten en eventos estructurados)
- Gestión de sesiones (un servidor, muchas sesiones tmux)
- Resiliencia de reconexión (estado almacenado en buffer, hidratación automática)
- Enrutamiento de notificaciones (eventos hook se convierten en notificaciones push)
SSH te daría la conexión de terminal cruda (las flechas superiores), pero nada de la inteligencia intermedia.
¿Y Mosh?
Mosh (Mobile Shell) es la sugerencia más común para mejorar SSH en móvil. Usa UDP en lugar de TCP, lo que ayuda con:
- Roaming de red (cambiar entre WiFi y datos móviles)
- Persistencia de conexión (el servidor mantiene estado incluso cuando el cliente se desconecta)
- Echo local (feedback de pulsaciones instantáneo independiente de la latencia)
Mosh mejora genuinamente la experiencia SSH en móvil. Pero sigue sin resolver los problemas fundamentales:
- Sin notificaciones push
- Sin conocimiento de eventos del agente
- Sin gestión de sesiones estructurada
- Sigue sujeto a la suspensión en segundo plano de iOS (aunque la recuperación es más rápida)
Si estás comprometido con herramientas basadas en SSH, Blink Shell con Mosh es la mejor opción en iOS. Es una buena herramienta que resuelve un problema diferente.
Conclusión
La pregunta no es "¿SSH o WebSocket?" como comparación abstracta de protocolos. Es "¿qué modelo de interacción necesita tu flujo de trabajo?"
Si gestionas servidores y ejecutas comandos interactivos, SSH es el protocolo correcto con décadas de fiabilidad probada.
Si controlas un agente IA que se ejecuta autónomamente, necesita tu atención de forma intermitente y se beneficia de notificaciones push y manejo estructurado de eventos, una arquitectura WebSocket diseñada a propósito resuelve problemas que SSH no puede — no porque SSH tenga defectos, sino porque fue diseñado para una era diferente de interacción humano-computadora.
Prueba Tactic Remote
Controla tus agentes de programación desde el móvil
Conéctate a Claude Code, Codex y otros agentes en tu Mac, Windows o Linux. Consulta el progreso y envía la siguiente instrucción desde el iPhone o iPad.