Stack DIY
tmux, mosh y Tailscale: el stack DIY para agentes de código en el móvil
La forma clásica de usar Claude Code o Codex desde el móvil es una app de terminal, una red privada, una conexión que sobrevive a los cambios de red y una sesión que sobrevive a todo lo demás. Cada pieza es gratuita y bien conocida. Aquí tienes la configuración con los comandos exactos, y una mirada honesta a dónde se vuelve incómoda.
Respuesta rápida
Instala Tailscale en el servidor y en el móvil, y activa tailscale set --ssh para que el servidor solo sea accesible por tu tailnet privada. Ejecuta el agente dentro de tmux new -A -s main para que sobreviva a tu conexión. Añade set -g allow-passthrough on y las líneas de extended-keys a ~/.tmux.conf para Claude Code. Conéctate con mosh (mosh dev@server -- tmux new -A -s main) desde Blink, Termius o Termux. Funciona bien. Sus puntos débiles son una TUI a pantalla completa en una pantalla pequeña y la falta de notificaciones push salvo que añadas hooks.
Si has buscado cómo usar Claude Code desde el móvil, seguramente has visto este stack en una docena de posts. Es porque funciona. Tailscale le da a tu móvil una ruta privada y cifrada hasta el servidor sin puertos abiertos. mosh mantiene viva la conexión cuando pasas de Wi-Fi a 4G o bloqueas el móvil. tmux mantiene el agente en marcha cuando la conexión sí se cae. Así se combinan bien las tres piezas.
El stack
| Capa | Herramienta | Qué resuelve | Sáltatela si… |
|---|---|---|---|
| Red | Tailscale (Tailscale SSH) | Llegar al servidor de forma privada, incluso detrás de NAT; sin puerto SSH público; acceso respaldado por SSO | El servidor ya tiene SSH público bastionado y estás contento con él |
| Transporte | mosh | Sobrevive a los cambios de red, al reposo y a la mala cobertura; el eco local disimula la latencia | Solo te conectas desde una red estable |
| Sesión | tmux | El agente sigue funcionando cuando te desconectas; varias ventanas por proyecto | Nunca. Es la capa que más importa. |
| Cliente | Blink, Termius, Termux… | Una terminal en el móvil | — |
Configurar tmux
Instálalo e inicia una sesión con nombre a la que puedas volver a conectarte desde cualquier sitio:
sudo apt install tmux # Debian/Ubuntu (dnf / apk elsewhere)
tmux new -A -s main # attach to "main", or create it
cd ~/src/my-app && claude # or: codex, agy, opencode…
# detach with Ctrl-b then d — the agent keeps running
-A hace que el mismo comando funcione la primera vez y todas las siguientes, así que conviene guardarlo como snippet en la app de terminal del móvil. Después dale a tmux los ajustes que necesitan los agentes. La documentación de configuración de la terminal de Anthropic dice que, dentro de tmux, Shift+Enter envía el mensaje en lugar de añadir un salto de línea y las notificaciones nunca llegan a la terminal exterior, salvo que añadas estas líneas:
# ~/.tmux.conf
set -g allow-passthrough on
set -s extended-keys on
set -as terminal-features 'xterm*:extkeys'
# quality of life on a phone
set -g mouse on # scroll and pick panes with your finger
set -g history-limit 50000 # agents print a lot
Aplícalo con tmux source-file ~/.tmux.conf. Incluso con extended keys, muchos teclados de móvil no pueden enviar Shift+Enter. Claude Code también acepta Ctrl+J, o \ seguido de Enter, para un salto de línea, y ambos funcionan en cualquier terminal.
Usa una ventana de tmux por proyecto o por agente. Ctrl-b c abre una ventana nueva y Ctrl-b n pasa a la siguiente. Para varias sesiones en el mismo repositorio, dale a cada una su propio git worktree. La guía 24/7 cubre eso y qué pasa al reiniciar. Las sesiones de tmux no sobreviven a un reinicio.
mosh frente a ssh
SSH a secas va sobre una única conexión TCP. Cuando tu móvil cambia de red, o iOS suspende la app un rato, esa conexión muere, y tienes que volver a conectarte y reengancharte. mosh inicia sesión por SSH, arranca mosh-server en el servidor y después pasa a su propio protocolo UDP, que aguanta los cambios de IP y el reposo. Además muestra localmente lo que escribes, así que un enlace de 200 ms se siente ágil.
# on the server
sudo apt install mosh # Fedora: sudo dnf install mosh · Alpine: apk add mosh
# from a client
mosh dev@my-server -- tmux new -A -s main
mosh usa los puertos UDP 60000–61000. Con una IP pública tendrías que abrirlos en tu firewall, por ejemplo con sudo ufw allow 60000:61000/udp más el firewall de tu proveedor cloud. Por Tailscale, el tráfico se queda dentro de la tailnet, así que no hace falta ningún puerto público. Un límite: mosh solo sincroniza la pantalla visible, así que mosh por sí mismo no tiene scrollback. La propia documentación de mosh recomienda tmux o screen para el historial, un motivo más para usar ambos.
Tailscale SSH
Tailscale pone tu servidor y tu móvil en una red privada WireGuard (una tailnet). Tailscale SSH va un paso más allá: Tailscale gestiona la autenticación SSH con tu identidad en la tailnet, así que no tienes que repartir claves SSH.
# on the server (Linux)
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up # log in to your tailnet
sudo tailscale set --ssh # enable Tailscale SSH
Según la documentación de Tailscale, tailscale set --ssh hace que tailscaled se encargue del puerto 22 para el tráfico que viene de tu tailnet. Cualquier cliente SSH normal se conecta entonces con ssh dev@my-server, usando el nombre MagicDNS de la máquina. Algunos detalles:
- Modo check. La política por defecto usa
"action": "check", así que de vez en cuando se te pide volver a autenticarte en un navegador. Que aparezca una URL de inicio de sesión en la terminal es lo esperado. - Plataformas de servidor. Linux es totalmente compatible. En macOS, solo la compilación de código abierto de la CLI
tailscale+tailscaledpuede actuar como servidor de Tailscale SSH, así que un Mac mini con la app de la App Store debería usar SSH normal por la tailnet. - Cierra el puerto público. Cuando hayas comprobado que llegas a la máquina por la tailnet, cierra el puerto 22 público en el firewall de tu proveedor. Hazlo en ese orden, con una segunda sesión abierta, para no quedarte fuera.
En el móvil, instala la app de Tailscale, inicia sesión en la misma tailnet y déjala conectada. Tu app de terminal llegará entonces a my-server como si estuviera en tu red local.
Clientes para iOS y Android
| Cliente | Plataformas | mosh | Notas |
|---|---|---|---|
| Blink Shell | iPhone, iPad | Sí | Construido en torno a mosh; muy buen soporte de teclado físico en iPad. $19.99/año tras una prueba de dos semanas, según blink.sh. |
| Termius | iOS, Android, escritorio | Sí | El nivel gratuito Starter incluye SSH y mosh; la sincronización entre dispositivos está en Pro ($10/mes con facturación anual, según termius.com/pricing) |
| Termux | Android | Sí (pkg install openssh mosh) | Un entorno Linux completo en el móvil; gratis y de código abierto |
| JuiceSSH | Android | Sí | Aparece como cliente de mosh en mosh.org |
Elijas el cliente que elijas, configura una fila de teclas extra con Esc, Ctrl, Tab y flechas. Claude Code usa Esc para interrumpir y Shift+Tab para cambiar de modo de permisos, y ninguna de las dos está en el teclado estándar de un móvil.
Dónde falla
El stack es fiable. La fricción está en todo lo que rodea a la fiabilidad.
- Una TUI de escritorio en una pantalla de 6 pulgadas. Claude Code, Codex y agy están hechos para 100 columnas o más. En el móvil lees diffs partidos, desplazas la salida de las herramientas con el pulgar y buscas la línea de entrada.
- Sin notificaciones push. Cuando el agente termina o necesita aprobación, nada te avisa salvo que añadas un hook. La terminal solo te avisa mientras la app está en primer plano. Nuestra guía para aprobar solicitudes desde el móvil cubre los hooks de ntfy que la gente añade.
- Aprobaciones enterradas en el scrollback. Una solicitud de permiso son unas pocas líneas en un panel lleno de texto. Si vuelves al cabo de una hora, tienes que encontrarla, leerla y responderla con las flechas.
- El problema del segundo plano. iOS suspende las apps de terminal poco después de salir de ellas. mosh se recupera cuando vuelves, pero la app no puede vigilar la sesión por ti mientras está en segundo plano.
- Copiar y pegar. Seleccionar texto a través de tmux, mosh y una terminal de móvil es un suplicio. Las URL largas, como los enlaces de inicio de sesión, son el peor caso.
- Varios servidores, varios agentes. Cada máquina nueva supone otro nodo de Tailscale, otra entrada de host y otra disposición de tmux que recordar.
Nada de esto es motivo para evitar el stack. Es gratis, funciona con todos los agentes y controlas cada pieza. Es motivo para saber a qué te apuntas. Nuestra comparativa de apps de terminal SSH y Maude analiza ese equilibrio en detalle.
O usa una app hecha para ello
Maude sustituye las capas de cliente y de sesión para el trabajo con agentes. Un pequeño daemon en el servidor es dueño de las sesiones, así que siguen en marcha sin tmux, y la app las muestra como un chat, con tarjetas de herramientas, diffs, notificaciones push con Permitir/Denegar y una bandeja. Puedes mantener Tailscale: Maude funciona con servidores en una tailnet o en una LAN porque el servidor se conecta hacia fuera al relay de Maude, con SSH como alternativa. Y cuando necesitas una shell, cada sesión tiene una terminal de verdad. Funciona con Claude Code, Codex, OpenCode, Grok Build y Antigravity.
Preguntas frecuentes
¿tmux o screen para Claude Code?
allow-passthrough y extended-keys), se divide y se automatiza con más facilidad, y la mayoría de las guías de terminal en el móvil dan por hecho que lo usas.