---
title: "Controla Agentes de IA Desde tu Teléfono: Moshi + Herdr en un VPS"
description: "Controla agentes de IA desde tu teléfono con Moshi y Herdr en un VPS barato y siempre encendido. Guía de configuración paso a paso: aprobaciones push, mosh, trampas y costos reales."
date: 2026-09-27
categories: ["ai"]
tags: ["moshi","herdr","claude-code"]
---

import Button from "@components/widgets/Button.astro";
import Notice from "@components/widgets/Notice.astro";
import ListCheck from "@components/widgets/ListCheck.astro";
import Accordion from "@components/widgets/Accordion.astro";
import Tabs from "@components/widgets/Tabs.astro";
import Tab from "@components/widgets/Tab.astro";
import YouTubeEmbed from "@components/widgets/YouTubeEmbed.astro";

Si quieres controlar agentes de IA desde tu teléfono (aprobar prompts de Claude Code desde la pantalla de bloqueo, ver qué agente está bloqueado, responder una pregunta por voz), esta es la configuración. Herdr mantiene los agentes vivos en un VPS siempre encendido. Moshi convierte el teléfono en el terminal que los dirige. Ambos son baratos o gratuitos, y todo el conjunto cabe en una máquina de €4-5/mes.

El modelo mental importa más que los comandos: la manada vive en el host, y cada laptop o teléfono es solo otro cliente que puede conectarse y desconectarse a voluntad.

## Por qué tus agentes de IA necesitan un host siempre encendido

Los agentes de codificación no son interactivos de la forma en que un shell es interactivo. Lanzas uno, trabaja durante 20 minutos, y luego te necesita durante 30 segundos impredecibles: un prompt de permiso, una pregunta aclaratoria, un «terminé, ¿quieres que abra el PR?». Esos 30 segundos son todo el cuello de botella.

Encadena los agentes a tu laptop y tú también quedas encadenado. Cierra la tapa y se detienen. Ejecútalos en una configuración solo de teléfono y estarás escribiendo prompts en un teclado de cristal. La solución aburrida es ejecutar los agentes en una máquina que nunca duerme y tratar cada pantalla que posees como una ventana desechable hacia esa máquina.

Un VPS barato supera aquí a las otras opciones siempre encendidas. Un Mac mini funciona, pero necesita energía, refrigeración y un lugar en un estante, y si alguna vez se duerme tu manada se detiene. Un VPS clase Hetzner cuesta aproximadamente lo mismo que un café al mes, no tiene tapa que cerrar, y puedo reconstruirlo desde cero en 10 minutos cuando inevitablemente rompo algo.

<Notice type="info" title="Claude Code no se instala en tu iPhone">
El mayor malentendido sobre los agentes móviles: no existe un Claude Code nativo para teléfono. El agente se ejecuta en un host que tú controlas (VPS, servidor doméstico, Mac siempre encendido). El teléfono es un terminal y un timbre. Todo lo que sigue se deriva de esa división.
</Notice>

Lo que realmente quieres del teléfono es limitado y concreto: ver qué agente está bloqueado, aprobar el prompt en el que está atascado, responder una pregunta corta y echar un vistazo a un diff cuando te apetezca. Eso es un bucle de 30 segundos, no una sesión de codificación. Diseña para el bucle de 30 segundos y la configuración se mantiene pequeña.

## El stack: Herdr, Moshi y moshi-hook

Tres piezas, cada una haciendo un trabajo. Puedes parar después de cualquiera de ellas y aún así tener algo útil.

![Arquitectura: el servidor Herdr en un VPS posee los terminales de agentes; el cliente Moshi del teléfono se conecta vía Mosh; moshi-hook envía notificaciones de aprobación](@assets/images/26/09/herdr-moshi-architecture.webp)

### Herdr: el runtime sobre el que viven tus agentes

Herdr es un multiplexor de terminal consciente de agentes escrito en Rust. Un servidor en segundo plano posee los PTY. Los clientes se conectan y desconectan. Los paneles siguen ejecutándose cuando la sesión SSH se cae o la pantalla del teléfono se bloquea. Se distribuye como un único binario de ~10-11 MB, sin Electron, sin telemetría, sin cuenta. El repositorio tenía ~40.9k estrellas y licencia Apache-2.0 cuando lo verifiqué el 2026-09-27, y está bajo desarrollo muy activo (pre-1.0, con financiación seed, principalmente un desarrollador en solitario).

La parte que justifica su existencia frente a tmux puro es la detección del estado del agente. Herdr lee el buffer inferior en vivo de cada panel con «screen manifests» en TOML (más hooks de ciclo de vida opcionales) y acumula los estados en una barra lateral: `working`, `blocked`, `done`, `idle`, `unknown`. Si alguna vez has ejecutado cinco agentes sin saber cuál te estaba esperando, esa barra lateral es la función estrella. Para la comparación completa con tmux, consulta [nuestra reseña de Herdr](https://www.bitdoze.com/herdr-agent-multiplexer/).

<Notice type="warning" title="La licencia cambió en algún momento">
Mi reseña anterior de Herdr indicaba AGPL-3.0-or-later. El README del repositorio al 2026-09-27 muestra Apache-2.0, y el changelog del proyecto registra el cambio de licencia de AGPL-3.0-or-later a Apache-2.0. Aun así, revisa el archivo LICENSE antes de construir un producto comercial sobre él.
</Notice>

### Moshi: un terminal móvil construido para agentes de codificación IA

Moshi (iOS 17+, Android 10+) es una app de terminal diseñada en torno a CLIs de agentes en lugar de SSH genérico. El nivel gratuito te da un terminal SSH completo con sesiones ilimitadas, notificaciones push para eventos del agente (con límite de frecuencia), dictado y protección biométrica de claves. Pro cuesta $7.99/mes o $69.99/año y desbloquea lo que hace buena a esta configuración: transporte Mosh, la UI del multiplexor (tmux/Zellij/Herdr), pegado de imágenes, un visor de diffs y acciones de bandeja de entrada ilimitadas. Una licencia cubre tres dispositivos.

Dos cosas lo hacen más que «Termius con tema oscuro». Primero, soporte nativo de Herdr: una pestaña de selector de sesiones que lista las sesiones Herdr en ejecución, un panel de atajos para los acordes `Ctrl-B` y gestos ajustados para pantallas estrechas. Segundo, la bandeja de entrada de agentes que clasifica los eventos en Needs you / Working / Done en lugar de hacerte desplazar por el historial. Como terminal móvil para agentes de codificación IA, esa combinación es la que elegiría ahora mismo.

![Moshi en iPhone ejecutando una sesión de Claude Code sobre Mosh, con la función de pegar capturas de pantalla en el chat resaltada](@assets/images/26/09/moshi-dash.webp)

### moshi-hook: el timbre que convierte prompts en aprobaciones push

moshi-hook es un daemon gratuito en el host. Instala hooks en las propias configuraciones de los agentes (`PreToolUse`/`Notification`/`Stop` de Claude Code en `~/.claude/settings.json`, Codex en `~/.codex/hooks.json`, OpenCode también), escucha en un socket Unix local y mantiene un WebSocket hacia el gateway de Moshi. Cuando un agente llega a un prompt de permiso, tu pantalla de bloqueo se enciende con Approve y Deny.

Dos propiedades de seguridad que vale la pena conocer antes de instalarlo. Los eventos de aprobación están limitados a 256 caracteres, así que un prompt no puede volcar tu archivo env en una notificación push. Y si una aprobación expira antes de que la toques, el agente vuelve a su propio prompt local en el terminal. Nada se auto-aprueba silenciosamente porque tu teléfono estuviera en modo avión.

También conoce Herdr: lee `$HERDR_ENV` / `$HERDR_SESSION`, etiqueta los eventos de la bandeja con la sesión y el workspace, y un toque en una tarjeta de la bandeja reconecta a esa sesión exacta vía `moshi://herdr?workspace=<id>&session=<name>`.

## Qué necesitas antes de empezar

La regla para toda esta guía: prueba cada capa en un escritorio antes de añadir la siguiente. Primero los agentes funcionando sobre SSH. Luego mosh. Luego el teléfono. Luego push. Saltarse ese orden es como la gente termina depurando una notificación de pantalla de bloqueo cuando su problema real es una clave SSH incorrecta.

<ListCheck>
<ul>
<li>VPS con Ubuntu 22.04+ o Debian 12. 2 vCPU / 4 GB es cómodo para unos pocos agentes más un servidor de desarrollo. Una máquina clase CX22 de [Hetzner Cloud](https://go.bitdoze.com/hetzner) es el host de referencia en toda esta guía.</li>
<li>SSH accesible con autenticación solo por clave. SSH público está bien para empezar; una tailnet es mejor (cubierto en la sección de seguridad).</li>
<li>CLIs de agentes ya autenticados y funcionando en ese host desde un terminal de escritorio. Claude Code, Codex, o lo que uses. Si aún estás eligiendo, consulta las [mejores herramientas y agentes de codificación IA](https://www.bitdoze.com/ai-coding-tools/).</li>
<li>Paquetes del host: `mosh`, `tmux` (como respaldo), `git`.</li>
<li>Teléfono con Moshi instalado desde la App Store o Google Play, notificaciones push activadas, clave SSH importada con protección Face ID / biométrica.</li>
<li>Plan de firewall: TCP 22 más UDP 60000-61000 para Mosh, o solo Tailscale sin puertos públicos.</li>
</ul>
</ListCheck>

Si tu VPS aún no está provisionado, sigue primero la [configuración segura de VPS para agentes de codificación IA](https://www.bitdoze.com/vps-ai-coding-setup/). Cubre el hardening, las claves SSH y la instalación de los CLIs de agentes.

<Button text="Guía de configuración de VPS" link="/vps-ai-coding-setup/" variant="outline" color="blue" />

Contexto de costos antes de empezar: la infraestructura cuesta unos €4-5/mes. Tus suscripciones de tokens de agentes la harán parecer pequeña. Esta guía trata sobre el plano de control, que es casi gratuito.

## Configuración de Herdr en el VPS: construir el host

Todo lo que sigue asume una máquina Ubuntu/Debian nueva y un usuario con sudo. Los comandos se pueden copiar y pegar en orden.

### Instala Herdr en el VPS

<Tabs>
  <Tab name="curl (VPS Linux)">
    ```bash
    curl -fsSL https://herdr.dev/install.sh | sh
    herdr --version
    ```
  </Tab>
  <Tab name="Homebrew (host macOS)">
    ```bash
    brew install herdr
    herdr --version
    ```
  </Tab>
  <Tab name="mise">
    ```bash
    mise use -g herdr
    herdr --version
    ```
  </Tab>
</Tabs>

Ahora la primera trampa. Moshi sondea tu host con un comando SSH no interactivo, lo que significa que `~/.bashrc` y `~/.zshrc` no se cargan. Si el script de instalación puso `herdr` en `~/.local/bin`, Moshi no lo encontrará. Ponlo en algún lugar del PATH predeterminado:

```bash
sudo ln -sf ~/.local/bin/herdr /usr/local/bin/herdr
```

**Verifica:** ejecuta `ssh you@vps 'command -v herdr'` desde tu laptop. Debe imprimir una ruta. Si no imprime nada, la pestaña Herdr faltará en Moshi más adelante.

### Instala Mosh y corrige el locale UTF-8

```bash
sudo apt update && sudo apt install -y mosh tmux
sudo locale-gen en_US.UTF-8 && sudo update-locale LANG=en_US.UTF-8
```

Mosh es el transporte que hace viables los terminales de teléfono. SSH puro es una conexión TCP, y los sistemas operativos de teléfonos son agresivamente buenos matando conexiones TCP: bloquea la pantalla, cambia de wifi a LTE, camina entre habitaciones, y la sesión se congela. Mosh arranca sobre SSH y luego cambia a UDP (60000-61000 por defecto) y está diseñado exactamente para este caso de enlace intermitente.

<Notice type="warning" title="Las imágenes mínimas de VPS vienen sin locales UTF-8">
Fallo clásico en una imagen mínima nueva de Debian/Ubuntu: `The locale requested by LC_CTYPE=UTF-8 isn't available here`, y mosh se niega a arrancar. Los comandos `locale-gen` + `update-locale` de arriba lo corrigen. Barato de ejecutar preventivamente, molesto de diagnosticar después.
</Notice>

**Verifica:** `locale` muestra `LANG=en_US.UTF-8` (u otro locale UTF-8) y `which mosh-server` devuelve una ruta. Con una conexión normal de laptop, `mosh you@vps` debería llevarte a un shell.

### Abre el firewall: SSH más el rango UDP de Mosh

```bash
sudo ufw allow OpenSSH
sudo ufw allow 60000:61000/udp
sudo ufw status
```

Nada más necesita estar abierto para este stack. Sin puertos web, sin paneles de agentes. Si quieres ver lo feo que se pone un firewall demasiado abierto en la práctica, la historia de [cómo proteger un servidor Hetzner con ufw](https://www.bitdoze.com/bsi-security-report-docker-ufw/) es una buena lectura antes de saltarte este paso.

La alternativa a SSH público + UDP: pon el VPS en una tailnet y no abras ninguno. La propia documentación de Moshi recomienda Tailscale cuando es posible. Lo cubro en la sección de seguridad más abajo; por ahora la ruta pública mantiene el tutorial simple.

**Verifica:** `sudo ufw status verbose` muestra ambas reglas. Desde una red externa (el hotspot del teléfono es perfecto para esto), `nc -u -z -v you.vps.ip 60000` no debería quedarse colgado en un puerto filtrado.

### Empareja moshi-hook y activa el lingering

En el teléfono, abre Moshi → Settings → Hooks y copia el token de emparejamiento. Luego en el host:

<Tabs>
  <Tab name="Linux (VPS)">
    ```bash
    curl -fsSL https://getmoshi.app/install.sh | sh

    moshi-hook pair --token <token from Moshi: Settings -> Hooks>
    moshi-hook install
    moshi-hook serve

    # separate terminal
    moshi-hook status
    ```
  </Tab>
  <Tab name="macOS">
    ```bash
    brew tap rjyo/moshi
    brew install rjyo/moshi/moshi-hook
    brew trust --formula rjyo/moshi/moshi-hook
    brew services start rjyo/moshi/moshi-hook

    moshi-hook pair --token <token from Moshi: Settings -> Hooks>
    moshi-hook install
    moshi-hook status
    ```
  </Tab>
</Tabs>

`moshi-hook install` escribe los hooks en las configuraciones de tus agentes. `moshi-hook serve` es el daemon de ejecución prolongada en Linux (macOS obtiene un servicio brew).

<Notice type="warning" title="Lingering, o tu daemon muere al cerrar sesión">
En un VPS sin pantalla, los servicios de usuario de systemd se desmontan cuando termina la última sesión de ese usuario. Sin lingering, moshi-hook muere en el momento en que te desconectas. Ejecuta esto una vez:

```bash
sudo loginctl enable-linger $USER
```

Confirma con `loginctl show-user $USER | grep Linger`.
</Notice>

**Verifica:** `moshi-hook status` reporta un daemon limpio con una conexión viva al gateway, y una notificación de prueba llega al teléfono. Si el status dice `herdr: not found`, salta a la sección de fallos: es un problema de PATH de systemd con una solución de dos líneas.

### Inicia tu primer workspace de agentes

Ahora la manada real.

```bash
ssh you@vps
herdr                 # starts the background server and attaches a client
```

Acordes que necesitas el primer día: `Ctrl+B v` divide verticalmente, `Ctrl+B -` divide hacia abajo, `Ctrl+B c` nueva pestaña, `Ctrl+B q` desconecta. Lanza un agente en un panel:

```bash
claude                # or codex / opencode / pi
```

Luego conecta las integraciones de ciclo de vida. Estas registran los IDs de sesión nativos para que las conversaciones sobrevivan a un reinicio del servidor:

```bash
herdr integration install claude
herdr integration install codex
herdr session list --json    # this is what Moshi's picker calls
```

Aquí es también donde un segundo agente se gana su lugar. Me gusta [OpenCode](https://go.bitdoze.com/opencode-go) como un segundo cerebro barato en un segundo panel; si quieres la instalación completa, [ejecutar OpenCode en tu VPS](/es/guia-configuracion-opencode/) lo explica paso a paso. Una tercera opción en su propia pestaña también está bien: la [guía de configuración de Pi coding agent](/es/guia-configuracion-pi-agent/) cubre esa.

**Verifica:** la barra lateral de Herdr muestra el agente como `working` o `idle` (no `unknown`), y `herdr session list --json` devuelve la sesión. Si el estado es `unknown`, ejecuta `herdr agent explain <target> --verbose`; los screen manifests van detrás de las nuevas versiones de UI de los agentes y `herdr server update-agent-manifests` descarga los actualizados.

## Ejecuta Claude Code desde tu teléfono

El host está listo. Ahora la mitad del teléfono.

### Conecta Moshi al VPS (clave SSH, luego Mosh)

Crea o importa una clave SSH en Moshi y activa la protección biométrica de claves. Añade un host, conéctate primero por SSH puro y confirma que ves la TUI de `herdr`. Eso prueba la clave, el usuario y la corrección del PATH de antes.

Luego cambia el transporte a Mosh (Pro). Todo lo que instalaste en la sección anterior es lo que Mosh necesita: `mosh-server` en el host, un locale UTF-8 y UDP 60000-61000 accesible.

<Notice type="info" title="La ruta gratuita funciona hoy">
SSH puro en el nivel gratuito de Moshi es suficiente para probar el concepto: sesiones ilimitadas, el terminal, incluso eventos push de agentes con límite de frecuencia. Lo que pierdes es el roaming de Mosh y la UI del multiplexor Herdr. Prueba primero la ruta gratuita; consulta la sección de costos para ver lo que Pro realmente compra.
</Notice>

**Verifica:** conéctate, ejecuta `htop` o `herdr`, luego activa el modo avión durante 10 segundos. Con Mosh la sesión está viva cuando vuelves. Con SSH no. Esa única prueba te dice en qué transporte estás.

### El selector de sesiones de Herdr y el panel de atajos

Moshi detecta Herdr al conectar ejecutando un sondeo SSH no interactivo, luego llama a `herdr session list --json` y muestra las sesiones en ejecución bajo una pestaña Herdr. Si tienes dos o tres sesiones de agentes, aparecen aquí con los nombres de sus workspaces. Un deslizamiento vertical abre el navegador de workspaces.

El panel de atajos pre-asigna los acordes `Ctrl-B` de Herdr como botones táctiles, que es como haces `Ctrl+B c` en cristal. Si remapeaste el prefijo en `~/.config/herdr/config` (o `config.toml`), configura el mismo prefijo en Moshi bajo Settings → Shortcuts → Herdr. Los gestos están en Settings → Input → Gestures.

Ergonomía de teléfono que vale la pena conocer: usa pestañas, no muchos paneles pequeños. Un teléfono acomoda aproximadamente un panel. Pliega la barra lateral cuando estés leyendo. Si quieres la verdadera experiencia de cliente ligero, usa un iPad con Magic Keyboard. La pantalla más grande maneja este flujo de trabajo mejor que un teléfono.

### Aprueba prompts desde la pantalla de bloqueo

Esta es la recompensa. Con moshi-hook emparejado y el lingering activado, un agente que llega a un prompt de permiso produce una notificación push en el teléfono. Approve o Deny desde la pantalla de bloqueo (o desde un Watch, o una Live Activity) y la decisión viaja de vuelta: teléfono → gateway de Moshi → socket Unix del host → el agente.

![Flujo de aprobación: prompt de permiso del agente a moshi-hook al gateway de Moshi a notificación push a Approve o Deny en la pantalla de bloqueo y de vuelta al agente](@assets/images/26/09/moshi-hook-approval-flow.webp)

La bandeja de entrada ordena los eventos en Needs you / Working / Done. Los eventos conscientes de Herdr llevan la sesión y el workspace, así que tocar una tarjeta reconecta ese panel exacto. Un estado «done while unviewed» significa que el agente terminó mientras no mirabas, que es la señal para abrir el visor de diffs y revisar lo que hizo.

Resumen de seguridad, porque un botón Approve en la pantalla de bloqueo merece escepticismo: límite de 256 caracteres por evento, sin exfiltración de secretos vía push, las aprobaciones expiradas vuelven al prompt local del terminal del agente, y nada se auto-aprueba silenciosamente.

<YouTubeEmbed url="https://youtube.com/embed/o1Zfr4CMt-U" label="Probando Moshi: cliente SSH para agentes de codificación" />

## El bucle diario: dirigir la manada desde el sofá

Una vez que las piezas están en su lugar, el ritmo es el mismo cada día:

1. En el escritorio (o desde el teléfono), abre 2-3 workspaces de Herdr y lanza un agente en cada uno. `claude` en una pestaña, `codex` en otra.
2. Cierra la laptop. El VPS sigue ejecutando los agentes.
3. El teléfono vibra ante un muro de permiso. Approve o Deny desde la pantalla de bloqueo. Interacción total: 5 segundos.
4. El agente hace una pregunta aclaratoria. Responde por voz (el dictado en dispositivo de Moshi maneja Whisper/Parakeet/Apple) sobre Mosh. Interacción total: 30 segundos.
5. Más tarde, cuando quieras mirar código, siéntate y conéctate correctamente. Herdr 0.9 (sept. 2026) añadió `herdr machine add myvps --label "VPS herd"`, que integra las máquinas remotas en la misma barra lateral que las locales:

```bash
herdr machine add myvps --label "VPS herd"
herdr --remote myvps      # thin client against a single host
```

El modo de cliente ligero también es útil para el puenteo de pegado de imágenes del portapapeles desde el lado del teléfono. Revisa `herdr --version` en ambos extremos y `herdr status` para detectar desfases de versión cliente/servidor antes de depender de la barra lateral multi-máquina.

## Qué se rompe (y cómo arreglarlo)

Todo lo que sigue es un síntoma que realmente encontrarás. Cada uno está titulado de la forma en que lo buscarías.

### Moshi no muestra la pestaña Herdr (PATH de SSH)

**Síntoma:** Moshi conecta, obtienes un shell, pero la pestaña Herdr está vacía o falta.

**Causa:** `herdr` no está en el PATH de un comando SSH no-login y no interactivo. `~/.bashrc` no se ejecuta para `ssh host 'command -v herdr'`. Además: solo se listan los servidores Herdr *en ejecución*.

**Solución:**

```bash
ssh you@vps 'command -v herdr'      # if empty, that is the bug
sudo ln -sf ~/.local/bin/herdr /usr/local/bin/herdr
# or set PATH in ~/.ssh/environment
```

Luego asegúrate de que un servidor realmente está en ejecución: `ssh you@vps herdr` inicia uno. Reconecta en Moshi y el selector se puebla.

### Mosh no conecta (rango UDP, locale, mosh-server)

**Síntoma:** Mosh agota el tiempo de espera, o la sesión inicia y muere inmediatamente con un error de locale.

Tres causas, en el orden en que las revisaría:

1. UDP 60000-61000 bloqueado. `sudo ufw allow 60000:61000/udp` y revisa también las ACLs de red de tu proveedor.
2. Sin locale UTF-8 en una imagen mínima. Texto del error: `The locale requested by LC_CTYPE=UTF-8 isn't available here`. Corrige con `sudo locale-gen en_US.UTF-8 && sudo update-locale LANG=en_US.UTF-8`.
3. `mosh-server` no instalado. `sudo apt install -y mosh`.

Nota la trampa: si Mosh falla, Moshi recurre silenciosamente a SSH, que parece funcionar hasta que caminas entre habitaciones y la pantalla se congela.

### moshi-hook dice `herdr: not found` (PATH de systemd)

**Síntoma:** `moshi-hook status` no encuentra `herdr`, pero la app lo detecta bien en un shell interactivo.

**Causa:** el daemon de usuario de systemd tiene su propio PATH y no ve `~/.local/bin`.

**Solución:**

```bash
systemctl --user edit moshi-hook.service
```

```ini
[Service]
Environment="MOSHI_HERDR_PATH=/absolute/path/to/herdr"
```

```bash
systemctl --user daemon-reload && systemctl --user restart moshi-hook.service
moshi-hook status
```

Relacionado: los hooks no se disparan para sesiones de agentes iniciadas *antes* de `moshi-hook install`. Reinicia esos paneles de agentes. En macOS, Homebrew ahora requiere `brew trust --formula rjyo/moshi/moshi-hook` para el tap de terceros.

### El panel de atajos no hace nada (el prefijo no coincide)

**Síntoma:** tocar los botones de atajo de Herdr en Moshi no produce ningún efecto visible.

**Causa:** el panel envía el prefijo configurado en Moshi, pero Herdr escucha en otro diferente.

**Solución:** Settings → Shortcuts → Herdr en Moshi debe coincidir con el prefijo en `~/.config/herdr/config` (predeterminado `Ctrl-B`). Después de cambiar la configuración de Herdr, `herdr server reload-config`. Reasigna los gestos en Settings → Input → Gestures mientras estás ahí.

### Desconectar no es reiniciar (el reinicio del servidor mata los paneles)

Esta es la semántica que todos entienden mal una vez, normalmente en un mal momento.

<Notice type="error" title="Desconectar no es reiniciar">
`Ctrl+B q` (desconectar) deja todos los procesos en ejecución. `herdr server stop`, y la mayoría de los flujos de `herdr update` que reinician el servidor, **matan los procesos de los paneles**. El layout y los directorios vuelven. Tu servidor de desarrollo en ejecución no. Programa los reinicios del servidor como los reinicios que son.
</Notice>

| Evento | Procesos de panel | Layout | Conversaciones de agentes |
|---|---|---|---|
| Desconexión de cliente (`Ctrl+B q`) | vivos | intacto | intactas |
| Caída de SSH/Mosh | vivos | intacto | intactas |
| `herdr server stop` / reinicio | muertos | restaurado | reanudables vía IDs de sesión registrados |
| Reinicio del VPS | muertos | restaurado | reanudables vía IDs de sesión registrados |

Por qué sobreviven las conversaciones: las integraciones de ciclo de vida (`herdr integration install claude|codex`) registran los IDs de sesión nativos, así que `codex resume <id>` (o el equivalente de Claude) continúa donde lo dejaste. Los contenidos del terminal no vuelven, por eso existe `[experimental] pane_history = true` en la configuración. Déjalo desactivado a menos que aceptes que el contenido de la pantalla (incluidos secretos en el scrollback) se escriba en disco.

Revisa `herdr status` para detectar desfases de versión cliente/servidor después de cualquier actualización. `herdr update --handoff` es la ruta sin tiempo de inactividad y sigue siendo experimental. Si los estados de los agentes parecen incorrectos, `herdr agent explain <target> --verbose` es la herramienta de diagnóstico. tmux anidado dentro de un panel Herdr oculta los agentes a la detección, y los agentes en sandbox/envueltos necesitan `HERDR_AGENT=claude <wrapper> -- claude`.

Una advertencia más con mordida: ambos proyectos son pre-1.0 y se mueven rápido. Fija las versiones, re-verifica este tutorial trimestralmente, y no auto-actualices el agente del host un viernes.

### Reversión / desmantelamiento

¿Quieres que todo desaparezca? En orden:

```bash
# stop the doorbell and remove its hooks from ~/.claude/settings.json, ~/.codex/hooks.json
systemctl --user disable --now moshi-hook.service   # or: brew services stop moshi-hook
sudo loginctl disable-linger $USER

# stop the herd (this kills pane processes - see above)
herdr server stop

# close the Mosh range if you opened it publicly
sudo ufw delete allow 60000:61000/udp
```

Desempareja desde Moshi → Settings → Hooks. El VPS en sí y sus árboles de trabajo permanecen hasta que elimines la máquina; respáldalos antes de hacerlo.

## Cuánto cuesta: la ruta gratuita vs Moshi Pro

Obtuve los precios de abajo de las páginas de los proveedores el 2026-09-27. Verifica antes de comprar; ambos lados de este stack publican semanalmente.

| Pieza | Costo | Qué obtienes |
|---|---|---|
| VPS ([Hetzner Cloud](https://go.bitdoze.com/hetzner) clase CX22) | ~€4-5/mes | 2 vCPU / 4 GB, cómodo para unos pocos agentes |
| Herdr | $0 | binario único Apache-2.0, sin cuenta |
| moshi-hook | $0 | daemon gratuito, aprobaciones push |
| Nivel gratuito de Moshi | $0 | terminal SSH, sesiones ilimitadas, push de agentes con límite de frecuencia |
| Moshi Pro | $7.99/mes, $69.99/año, ~$199 vitalicia (web) | Mosh, UI de Herdr/tmux/Zellij, pegado de imágenes, visor de diffs, bandeja ilimitada, 3 dispositivos |

El precio vitalicio es $199 en el sitio web y $249 vía compra dentro de la App Store al momento de escribir. Compra en la web si vas por la vitalicia.

Para el host, [Hetzner Cloud](https://go.bitdoze.com/hetzner) es mi predeterminado, y un [VPS de Hostinger](https://go.bitdoze.com/hostinger-vps) es una alternativa económica razonable (KVM, NVMe) si su promo actual supera a Hetzner ese día. Elijas lo que elijas, [haz benchmark del VPS antes de comprometerte](https://www.bitdoze.com/benchmark-cloud-servers/), y ojea lo que las [subidas de precios de VPS de 2026](https://www.bitdoze.com/vps-price-increases/) hicieron a los niveles que estás comparando.

<Notice type="info" title="La ruta gratuita es real">
Moshi gratis + SSH puro + `herdr` sobre SSH, sin moshi-hook, es una configuración funcional de 15 minutos. Pierdes el roaming, la UI del multiplexor y las aprobaciones rápidas, pero puedes ver la manada desde tu teléfono y probar el flujo de trabajo antes de gastar nada. Yo lo ejecutaría una semana antes de pagar Pro.
</Notice>

Lo que empequeñece todo esto: los costos de suscripción de los agentes. Claude Max o equivalente está un orden de magnitud por encima del plano de control. El VPS y la app son la parte barata.

Nota operativa sobre el radio de impacto: ese VPS contiene tus árboles de trabajo y tus inicios de sesión de agentes. La misma disciplina de respaldo que cualquier otro servidor con datos que te importan. Respaldos compatibles con S3, fuera de la máquina, restauraciones probadas.

## Seguridad: qué permanece en el host

La propia documentación de Moshi lo expresa bien: es «una ventana y un timbre, no un sandbox».

<Notice type="info" title="Una ventana y un timbre, no un sandbox">
Tu código, credenciales de git e inicios de sesión de agentes nunca abandonan el host. Moshi no aloja tu shell, tus repos ni el proceso del agente. El visor de diffs se sirve a través de tu sesión desde el gateway del host, no se sube a un tercero.
</Notice>

Lo que cruza el cable: tráfico de terminal (SSH o Mosh, ambos cifrados) y eventos de aprobación limitados a 256 caracteres. Lo que ve el gateway de Moshi: tráfico de retransmisión push, igual que cualquier servicio push.

Postura que yo desplegaría:

- SSH solo por clave, sin autenticación por contraseña, y protección biométrica de claves en el lado del teléfono.
- Prefiere una tailnet sobre SSH público + UDP si puedes. Los docs de Moshi recomiendan Tailscale cuando es posible, y un [servidor de control de Tailscale autoalojado con Headscale](https://www.bitdoze.com/headscale-self-hosted-tailscale-setup/) mantiene el plano de control en tu propio VPS. (Mosh funciona sobre una tailnet mientras la tailnet pase UDP.)
- Ten en cuenta que `loginctl enable-linger` mantiene los servicios de usuario en ejecución después del cierre de sesión. Eso es lo que quieres para moshi-hook, y también es un hecho a recordar durante la limpieza de incidentes.
- Respalda los árboles de trabajo. Los agentes que nunca duermen generan mucho trabajo que nunca has revisado.
- Trata ambos proyectos como cadena de suministro pre-1.0: fija versiones, vigila las notas de lanzamiento, y no ejecutes instaladores `curl | sh` en hosts que contienen secretos de producción sin leerlos primero.

## Moshi vs las alternativas: terminales móviles para agentes de codificación IA

Corto y honesto, no un listado.

| Herramienta | Qué es | Consciencia de agentes | Aprobaciones push | Costo |
|---|---|---|---|---|
| Moshi + Herdr | terminal móvil + multiplexor de agentes | nativa (estados, selector de sesiones) | moshi-hook | gratis, Pro $7.99/mes |
| Claude Code Remote Control | remoto propio de Claude | solo Claude | sí | incluido con Claude |
| Happy | cliente móvil estilo chat | modelo de chat | sí | gratis |
| Termius / Blink / JuiceSSH | clientes SSH genéricos | ninguna (sondeo de scrollback) | no | varía |
| TermRover | terminal móvil | Herdr «en camino» | no | varía |
| cmux / Conductor | orquestación de escritorio (Mac) | sí | n/a | varía |
| herdr-mobile-relay | relay web autoalojado DIY | Herdr | DIY | $0 + tu tiempo |
| ccgram | puente de Telegram para notificaciones de Herdr | solo notificaciones | vía Telegram | $0 |

La forma limpia de elegir: Claude Code Remote Control extiende Claude, y es excelente si solo usas Claude y quieres cero configuración. Moshi extiende la máquina, así que cualquier CLI de agente funciona y tu flujo de trabajo es un terminal real. Happy es el punto medio con forma de chat. Termius y Blink son grandes clientes SSH sin concepto de un agente esperándote. herdr-mobile-relay y ccgram son la ruta DIY si quieres push sin dependencia de una app. Uno para vigilar en lugar de elegir hoy: [Superlogical Rex](/es/superlogical-rex/) tiene un cliente iOS en desarrollo como parte de su multiplexor de terminal, pero aún no ha salido.

Para el stack de este artículo: control a nivel de terminal, visibilidad del estado del agente y un VPS de €4 como host. Esa combinación es para lo que está hecho Moshi + Herdr.

## FAQ

<Accordion label="¿Puedo ejecutar Claude Code en mi teléfono directamente?" group="faq" expanded="true">
No. No existe un Claude Code nativo para teléfono (ni Codex, ni OpenCode). El agente se ejecuta en un host que tú controlas y el teléfono es un cliente: una ventana de terminal más un timbre de notificaciones. Esto es una característica, no un apaño. Tu repo, credenciales y acceso a modelos permanecen en el host, y el agente conserva una máquina con CPU y disco reales. Si estás eligiendo qué agente de terminal ejecutar en ese host, la comparación [OpenCode vs Pi Agent](/es/opencode-vs-pi-agent/) cubre dos opciones sólidas.
</Accordion>

<Accordion label="¿Mi código o sesión de agente se sube a algún lugar?" group="faq">
No. El proceso del agente, los repos y las credenciales de git viven en tu VPS. El tráfico del terminal está cifrado con SSH/Mosh. Los eventos de aprobación a través de moshi-hook están limitados a 256 caracteres. El visor de diffs lo sirve un gateway en tu host a través de tu sesión, no se sube. Los servidores de Moshi retransmiten notificaciones push; no guardan tu código.
</Accordion>

<Accordion label="¿Qué pasa cuando el VPS se reinicia?" group="faq">
El layout y los directorios de trabajo se restauran. Los procesos de los paneles no: cualquier servidor de desarrollo o agente en ejecución en un panel desaparece. Las conversaciones de agentes vuelven vía los IDs de sesión registrados por `herdr integration install`, así que `codex resume <id>` (o el equivalente de Claude) continúa el hilo. Por eso un `herdr server stop` debe programarse como el reinicio que efectivamente es.
</Accordion>

<Accordion label="Ya uso tmux. ¿Por qué Herdr?" group="faq">
tmux sigue estando bien y deberías mantenerlo instalado como respaldo. Lo que Herdr añade a este flujo de trabajo: la barra lateral de estados de agentes (`working`/`blocked`/`done`), detección con integraciones de ciclo de vida e IDs de sesión reanudables, una API de socket Unix para que los scripts controlen agentes (`herdr agent wait --until blocked`), y soporte de primera clase en el selector de sesiones y panel de atajos de Moshi. Si no te importa el estado del agente y solo necesitas persistencia, tmux hace el trabajo.
</Accordion>

## Tu manada en tu bolsillo

La configuración es pequeña a propósito: Herdr para persistencia y estado, Moshi para la ventana con forma de teléfono, moshi-hook para el timbre. El host es un VPS de €4 que nunca duerme. Las partes caras (tu tiempo, tus suscripciones de agentes) quedan intactas.

Antes de darlo por terminado, ejecuta la lista de verificación de extremo a extremo. Cada ítem detecta una clase de fallo que el anterior no puede:

<ListCheck>
<ul>
<li>El agente funciona en un escritorio en el host primero, sobre SSH puro.</li>
<li>`mosh` conecta desde el teléfono y sobrevive a un cambio de modo avión.</li>
<li>La sesión de Herdr persiste a través de esa caída de red (el panel sigue vivo).</li>
<li>Un prompt de permiso real ejercitado de extremo a extremo desde la pantalla de bloqueo.</li>
<li>`herdr status`, `moshi-hook status` y `herdr agent explain` todos limpios.</li>
<li>Reinicia el VPS una vez a propósito y anota exactamente qué vuelve (layout sí, procesos no).</li>
<li>Mide la RAM/CPU en reposo de la manada. Si una máquina de 2 vCPU / 4 GB ya está sudando, la solución es menos agentes concurrentes, no un VPS más grande.</li>
</ul>
</ListCheck>

Si aún no has provisionado y protegido el host, empieza por ahí. Todo en este artículo asume una máquina en la que puedes confiar.

<Button text="Protege tu VPS primero" link="/vps-ai-coding-setup/" variant="solid" color="blue" icon="arrow-right" />