T3 Code en un VPS: tus agentes de código desde el móvil
Instala T3 Code en tu VPS, conecta Claude Code o Codex y dirígelos desde el móvil por Tailscale. Con versión fijada, servicio systemd, permisos y qué dicen los términos de Anthropic.
Qué es T3 Code y por qué tiene sentido en un VPS
Con T3 Code en un VPS, Claude Code o Codex trabajan en un servidor y tú sigues a los agentes desde el móvil, con el portátil cerrado. T3 Code es un servidor que maneja los agentes de código instalados y con sesión iniciada en esa misma máquina. Encima pone clientes web, de escritorio y para móvil. Un VPS encaja porque la documentación de acceso remoto de T3 Code pone una condición clara: «That machine must stay running and reachable while you work». Un portátil que se suspende no la cumple. Un servidor encendido todo el día sí la cumple.
El proyecto es de código abierto, con licencia MIT, y se presenta como un panel de control para agentes. Su web nombra Claude Code, Codex, Antigravity, OpenCode, Cursor y Grok, y el README del repositorio añade fx. T3 Code no revende tokens: usas las suscripciones que ya pagas. Cada proveedor entra por un camino distinto. Claude Code, Codex, OpenCode y Grok son CLI (programas de línea de comandos) que instalas e inicias en el servidor. Cursor entra a través de la librería @cursor/sdk, que el servidor de T3 Code ya trae como dependencia. Antigravity se activa en los ajustes con tu cuenta de Google y no necesita CLI.
Esta guía usa la versión 0.1.7. Es la que GitHub marca como última release estable el 9 de noviembre de 2026. También existe una versión nightly 0.1.8, que GitHub marca como prerelease. No conviene en un servidor que quieres estable.
Qué necesitas antes de empezar
- Un VPS con Ubuntu 24.04 o 26.04, en x86_64 o ARM64, con acceso SSH y un usuario que pueda usar
sudo. - Al menos 4 GB de RAM, que es el mínimo que pide la documentación de Claude Code.
- Un plan que incluya un agente. Claude Code necesita Pro, Max, Ultra, Team, Enterprise o una cuenta de Console. El plan gratuito de Claude no lo incluye. Para Codex, la página de precios de OpenAI indica qué planes de ChatGPT lo traen.
- Una cuenta de Tailscale y su app en el móvil (o el celular, como lo llames).
Si ya usas Claude Code en remoto con SSH y tmux, T3 Code no sustituye esa base. La guía de Claude Code en un VPS con tmux sigue siendo la alternativa cuando la interfaz web falla. Y si quieres usar Claude Code desde el teléfono sin software de terceros, revisa antes las opciones para usar Claude Code desde el móvil.
Crea un usuario sin root para los agentes
Ejecuta T3 Code con un usuario normal, sin sudo. Hay dos motivos. El primero lo da la documentación: el navegador remoto de T3 Code corre dentro del sandbox de Chrome, y «Chrome cannot start that sandbox as root». La única salida como root es poner T3CODE_SERVER_BROWSER_SANDBOX=0, y eso desactiva el aislamiento del navegador. El segundo motivo es tuyo: los agentes ejecutan comandos con el usuario del servidor. Si ese usuario no tiene sudo, un comando equivocado no puede tocar el sistema.
Desde tu usuario administrador, crea el usuario dev, copia tu clave SSH y activa el lingering. El lingering hace que systemd arranque los servicios de usuario al encender la máquina y los mantenga vivos cuando cierras la sesión SSH.
sudo useradd -m -s /bin/bash dev
sudo install -d -m 700 -o dev -g dev /home/dev/.ssh
sudo install -m 600 -o dev -g dev ~/.ssh/authorized_keys /home/dev/.ssh/authorized_keys
sudo loginctl enable-linger dev
ls /var/lib/systemd/linger/El último comando debe listar dev. Ahora entra como ese usuario con una conexión SSH directa: ssh dev@IP_DEL_VPS. No uses sudo -iu dev. Esa vía no crea una sesión de login, así que XDG_RUNTIME_DIR queda sin definir y cualquier systemctl --user falla con un error que empieza por Failed to connect to.
Instala T3 Code con la versión fijada
Hay dos vías de instalación. La más simple es el script oficial. Instala un binario nativo t3 y, según su propia cabecera, solo necesita sh, tar, sha256sum y curl: «no Node, npm, or compiler». El script acepta la variable T3CODE_VERSION para instalar una versión exacta, y esa variable tiene prioridad sobre T3CODE_CHANNEL.
curl -fsSL https://t3.codes/install.sh | T3CODE_VERSION=0.1.7 sh
command -v t3Escribe 0.1.7 sin la v. El código del script añade la v al construir la URL de la release, así que v0.1.7 pide una ruta que no existe, y el script termina con un mensaje que incluye has no release archive for. Si todo va bien, verás Installed T3 Code 0.1.7. El binario queda en ~/.t3/runtime/versions/0.1.7 y el comando t3 es un enlace en ~/.local/bin.
Si el instalador termina con Add /home/dev/.local/bin to your PATH, then run t3., tu shell todavía no busca en esa carpeta. Añádela:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
command -v t3command -v t3 debe imprimir /home/dev/.local/bin/t3. El script comprueba la descarga contra el fichero SHA256SUMS de la misma release. Eso detecta una descarga rota. No es una firma, porque el binario y la suma vienen del mismo sitio.
La segunda vía es el paquete de npm t3, que es solo un lanzador pequeño. Descarga el binario nativo de GitHub Releases, comprueba su SHA-256 y lo ejecuta. Este lanzador pide Node.js 20.11 o superior, y aquí importa qué Ubuntu tienes. En Ubuntu 24.04 el paquete nodejs del archivo es la versión 18.19.1, y noble-updates no trae otra, así que no llega. En Ubuntu 26.04 el paquete es la 22.22.1, que sí sirve. Si eliges npm, fija la versión en el comando, por ejemplo npx t3@0.1.7 serve, y no dejes que npm elija por ti. En un VPS el script es más sencillo, porque no depende de Node.
Para actualizar más adelante, repite el script con la nueva versión en T3CODE_VERSION. El comando t3 update existe, pero según la documentación pasa a la release más reciente, y eso deshace tu versión fijada.
Inicia sesión en un agente dentro del servidor
T3 Code no tiene cuentas propias para los modelos. Usa las CLI que encuentra en el PATH del servidor, con la sesión que tú iniciaste. Por eso el login se hace en el VPS, como el usuario dev.
Para Claude Code, el instalador oficial y el login:
curl -fsSL https://claude.ai/install.sh | bash
claude --version
claude auth loginclaude --version debe imprimir un número de versión. En un VPS no hay navegador, así que el login no puede abrir una pestaña. La documentación de Claude Code indica que pulses c para copiar la URL de login, la abras en otro dispositivo y pegues el código de vuelta en la terminal. Las credenciales quedan en ~/.claude/.credentials.json con permisos 0600. Un detalle importa en un servidor desatendido: cuando caduca el login, la sesión deja de avanzar hasta que vuelves a entrar. La diferencia entre entrar con tu plan y usar una clave de API está explicada en login con suscripción o con clave de API en Claude Code.
Para Codex, instálalo según su documentación oficial y usa el login por código de dispositivo. Es la vía que esa documentación recomienda para máquinas remotas, y todavía está en beta. Antes, activa el login por código de dispositivo en los ajustes de seguridad de ChatGPT o pide al administrador que lo active en los permisos del workspace:
codex login --device-authCodex guarda la sesión en ~/.codex/auth.json o en el almacén de credenciales del sistema, según la configuración. Si usa el fichero, su documentación pide tratarlo como una contraseña. Si usas una clave de API en lugar de tu cuenta de ChatGPT, el uso se cobra a precio de API y no sale de tu plan.
OpenCode se conecta con opencode auth login y Grok con grok login. Si ya tienes OpenCode funcionando en un servidor, la guía para ejecutar OpenCode en un VPS sirve como base. Después activa cada proveedor en Settings → Providers. Si T3 Code no encuentra una CLI, escribe su ruta completa en los ajustes de ese proveedor. command -v claude te da esa ruta.
Conecta el móvil a T3 Code por Tailscale
Tailscale crea una red privada entre tus dispositivos, llamada tailnet. T3 Code la usa con Tailscale Serve, que publica el servidor con una dirección HTTPS dentro de esa red. La documentación de T3 pide que el VPS y el móvil estén en la misma tailnet. Si dudas entre exponerlo solo a tu red o a todo internet, lee antes la diferencia entre Tailscale Serve y Funnel.
Desde el usuario administrador, instala Tailscale y une el VPS a tu tailnet:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale upDespués, en la consola de Tailscale, abre la página DNS. Activa MagicDNS y luego, en «HTTPS Certificates», pulsa «Enable HTTPS». Tailscale avisa de que los nombres de tus máquinas y el de tu tailnet se publican en un registro público. Por eso el VPS no debe tener un nombre con datos sensibles.
Para una primera prueba en primer plano, como dev:
t3 serve --tailscale-servePara un servidor que ya está en marcha, t3 pair --tailscale crea el enlace de emparejamiento. El enlace tiene una forma como https://machine.tailnet.ts.net/. Si el puerto por defecto ya está ocupado, elige otro con --tailscale-serve-port. La documentación de Tailscale dice que reenviar un puerto con Serve no necesita root, lo que encaja con un usuario sin sudo.
Haz que siga funcionando con el portátil cerrado
Un t3 serve en primer plano muere cuando cierras la sesión SSH. Para que T3 Code arranque con la máquina, instálalo como servicio de usuario de systemd:
t3 service install
t3 service status
systemctl --user status t3code.serviceEl servicio se llama t3code.service y es un servicio de usuario, no de sistema. systemctl --user status debe mostrar active (running). La documentación no publica el contenido de la unidad. Si quieres ver qué ejecuta, míralo en tu máquina con systemctl --user cat t3code.service. La instalación intenta activar el lingering por su cuenta. Si t3 service status muestra linger-disabled, el lingering no está activo, y un administrador debe ejecutar sudo loginctl enable-linger dev, como en el primer paso.
Con el servicio en marcha, genera el enlace para el móvil:
t3 pair --tailscaleAbre el enlace en el móvil con Tailscale conectado. T3 Code también tiene app para iOS y Android, que se conecta a tu servidor por acceso remoto. Según la documentación, la configuración que crea pair --tailscale se mantiene tras los reinicios.
Dos ajustes más. Las variables de entorno del servicio van en ~/.t3/service.env, una por línea con la forma CLAVE=valor. Si guardas credenciales ahí, ejecuta chmod 600 ~/.t3/service.env y luego t3 service restart. Y en Linux, t3 service protect reduce la presión de memoria y el riesgo de que el kernel mate el servidor por falta de RAM: usa MemoryLow y OOMScoreAdjust=-900, pero el kernel todavía puede matarlo como último recurso. El comando pide sudo, así que necesitas ayuda del administrador si dev no tiene ese permiso. Ejecuta t3 service restart después para aplicar la protección contra el cierre por falta de memoria al proceso del servidor. t3 service protect --undo quita esa protección.
Existe también t3 up, que pregunta cómo llegan tus otros dispositivos a la máquina: T3 Connect, la red local o ambos. T3 Connect es el servicio propio de T3, y con una cuenta gratuita enlaza 3 máquinas. Si ya usas Tailscale, no lo necesitas. Evita también --lan en un VPS. Con esa opción T3 Code acepta conexiones de la red local y de la tailnet, y la documentación lo dice claro: «a pairing code is all that keeps other devices on them out».
Pairing, scopes y sesiones: cada enlace es una contraseña
Un enlace de emparejamiento sirve una sola vez. Al usarlo, autoriza ese dispositivo para conexiones futuras. Cada dispositivo nuevo necesita su propio enlace. Trata los enlaces y los códigos como contraseñas, porque quien los use primero entra.
Sin --scope, el token de emparejamiento y las sesiones que genera reciben todos los permisos, incluido gestionar el acceso y T3 Connect. Con --scope pasas un permiso cada vez, y los que eliges sustituyen a los de por defecto. Algunos scopes que nombra la documentación son orchestration:read, orchestration:operate, terminal:operate, filesystem:read, filesystem:write, relay:read y source-control:write. La lista completa de tu versión sale de la ayuda:
t3 pair --help
t3 pair --scope orchestration:read --scope relay:readEl segundo comando, que es el ejemplo de la documentación, crea un cliente con permisos de lectura. Ten en cuenta una advertencia de esa misma página. Una terminal, o un agente con acceso total en el servidor, también puede gestionar el acceso. Por eso un cliente que no debe gestionar accesos tampoco debe tener terminal:operate ni orchestration:operate. Con ellos, puede pedir a un agente lo que su scope no le deja hacer.
Si pierdes el móvil, revoca su sesión desde el servidor:
t3 auth session list
t3 auth session revoke <id>Vuelve a ejecutar t3 auth session list y comprueba que esa sesión ya no aparece activa. En la app de escritorio, lo mismo está en Settings → Sharing & access.
Qué modo de permisos usar si el servidor guarda tus credenciales de git
Cada hilo de T3 Code tiene un modo de permisos, y hay cuatro. Supervised pide aprobación antes de ejecutar comandos o cambiar ficheros. Auto-accept edits aprueba las ediciones sin preguntar, pero otras acciones pueden seguir pidiendo aprobación. Auto deja que una revisión automática apruebe lo rutinario y te pregunta el resto. Full access ejecuta todo sin preguntar.
La documentación de la versión 0.1.7 dice que el valor inicial para hilos nuevos es Full access. No lo dejes así en un VPS. El agente corre como dev, así que puede leer ~/.ssh y los ficheros de sesión de tus CLI, y puede hacer git push con tus credenciales. En Full access nada se interpone entre una instrucción mal entendida y ese push. Cambia el valor por defecto en Settings → Threads → New threads → Permissions y elige Supervised. Cada proyecto puede tener su propio valor, y cambiar el valor por defecto no toca los hilos que ya existen. Comprueba el modo en tu instalación, porque esta guía toma el valor inicial de la documentación y no de una ejecución.
Hay diferencias por proveedor. Claude puede pedir aprobación incluso en Full access, según su propia configuración. Grok no tiene Auto-accept edits. Kiro y Muse Code solo ofrecen Supervised y Full access. Para entender qué decide Claude Code por su cuenta, mira los permisos del modo auto de Claude Code. Para el resto del aislamiento del servidor, como claves de despliegue por repositorio, sigue la guía para ejecutar Claude Code de forma segura en un VPS.
¿Usar T3 Code con tu plan Pro o Max cumple los términos de Anthropic?
Respuesta corta: no está resuelto. Ninguna página de Anthropic que revisé para esta guía nombra T3 Code. Esto es lo que dicen las fuentes, cada una con su enlace para que la leas tú.
La página legal de Claude Code dice que el login OAuth es exclusivamente para quienes compran los planes Free, Pro, Max, Ultra, Team o Enterprise, y para el uso normal de Claude Code y otras aplicaciones nativas de Anthropic. Quien desarrolla productos, también con el Agent SDK, debe usar una clave de API. Y añade: «Anthropic does not permit third-party developers to offer Claude.ai login into their own applications, or to route requests through Free, Pro, Max, or Ultra plan credentials on behalf of their users.» La misma página aclara que eso no impide a un usuario entrar en el binario de Claude Code sin modificar con su propia suscripción, también cuando una plataforma aloja Claude Code. Y avisa de que Anthropic puede actuar sin aviso previo. Está en code.claude.com/docs/en/legal-and-compliance.
La página del Agent SDK dice que, salvo aprobación previa, Anthropic no permite a terceros ofrecer el login de claude.ai ni sus límites de uso en sus productos, incluidos los agentes hechos con el Agent SDK. Los Consumer Terms prohíben acceder a los servicios por medios automáticos, como un bot o un script, salvo con una clave de API o con permiso explícito de Anthropic.
¿Usa T3 Code el Agent SDK? El package.json del servidor en la etiqueta v0.1.7 declara la dependencia @anthropic-ai/claude-agent-sdk en la versión ^0.3.284. Eso prueba la dependencia. No revisé el código que la llama, así que no puedo decir exactamente cómo arranca Claude.
Sobre los límites, el artículo de ayuda sobre el Agent SDK con tu plan dice que, con la sesión iniciada con tu plan, el Agent SDK, claude -p y el uso desde apps de terceros siguen gastando los límites de tu suscripción. El artículo tiene actualizaciones del 15 de junio y del 7 de octubre de 2026. La FAQ de T3 Code añade dos afirmaciones propias. Una: que está dentro de los términos de Claude Code, Codex y Google Antigravity. Otra: que el uso a través del Agent SDK gasta los límites de 5 horas más rápido que Claude Code directo, no los semanales. Son afirmaciones de T3, no de Anthropic.
La duda está en el encaje. Tú inicias sesión en tu propio servidor, y eso se parece al caso del usuario final que la página legal permite. Pero T3 Code es software de terceros que depende del Agent SDK, no el binario de Claude Code sin modificar, y la regla sobre terceros habla de ese tipo de software. Ninguna fuente de Anthropic resuelve esta mezcla. Si no quieres arriesgar tu cuenta, usa una clave de API de Console, que se cobra por uso. Los planes Max, Ultra y Team incluyen créditos mensuales de API que solo funcionan con una clave de Console. Pro no es elegible para esos créditos. Para Codex, esta guía no revisó los términos de OpenAI, así que la única fuente que lo afirma es la FAQ de T3.
Problemas frecuentes y cómo reconocerlos
t3: command not found. ~/.local/bin no está en tu PATH. El instalador lo avisa con Add /home/dev/.local/bin to your PATH, then run t3. Añade la línea a ~/.bashrc como en el paso de instalación.
El instalador dice has no release archive for. Ese mensaje no identifica una causa única: aparece si falta SHA256SUMS en la release o si ese fichero no contiene un archivo para tu plataforma. Comprueba que usas T3CODE_VERSION=0.1.7, sin la v, y que la release incluye el archivo para tu sistema y arquitectura. Para versiones anteriores al CLI autocontenido, el propio instalador indica usar npm install -g t3@VERSION.
systemctl --user falla con Failed to connect to. Entraste con sudo -iu dev, así que no hay sesión de usuario ni XDG_RUNTIME_DIR. Sal y entra con ssh dev@IP_DEL_VPS.
El servicio se para al cerrar SSH. El lingering no está activo, y t3 service status lo marca como linger-disabled. Ejecuta sudo loginctl enable-linger dev desde el administrador.
El enlace no abre en el móvil. El móvil no está en la misma tailnet, o HTTPS no está activado en la consola de Tailscale. Abre la app de Tailscale en el móvil y comprueba que el VPS aparece en la lista de máquinas.
El agente deja de avanzar en mitad de una tarea. Comprueba si la CLI muestra un error de autenticación. Codex renueva sus tokens automáticamente durante el uso, así que una tarea detenida no demuestra que haya caducado el login. Si necesitas volver a entrar, hazlo por SSH con claude auth login o codex login --device-auth y vuelve a lanzar el hilo.
FAQ
¿Puedo instalar T3 Code en un VPS sin Node.js?
Sí. El script https://t3.codes/install.sh instala un binario nativo y solo necesita sh, tar, sha256sum y curl. Node.js solo hace falta si usas el lanzador de npm, que pide la versión 20.11 o superior, y Ubuntu 24.04 trae la 18.19.1 en su archivo. Fija la versión con T3CODE_VERSION=0.1.7, sin la v.
¿Por qué no debo ejecutar T3 Code como root?
El navegador remoto de T3 Code corre en el sandbox de Chrome, y Chrome no puede arrancar ese sandbox como root. La única alternativa es T3CODE_SERVER_BROWSER_SANDBOX=0, que desactiva el sandbox. Además, los agentes ejecutan comandos con el usuario del servidor. Con un usuario sin sudo, un comando equivocado no puede romper el sistema.
¿Qué hago si pierdo el móvil emparejado con T3 Code?
Entra por SSH en el VPS y ejecuta t3 auth session list para ver las sesiones. Luego ejecuta t3 auth session revoke <id> con el identificador de esa sesión. Si emparejaste el móvil sin --scope, esa sesión tenía todos los permisos, incluido gestionar el acceso, así que revócala cuanto antes. Para el móvil nuevo, genera otro enlace con t3 pair --tailscale.
¿T3 Code con Claude Pro o Max gasta los mismos límites que Claude Code?
Sí, el uso sale del mismo plan. El artículo de ayuda de Anthropic sobre el Agent SDK dice que, con la sesión iniciada con tu plan, el Agent SDK, claude -p y las apps de terceros gastan los límites de tu suscripción. La FAQ de T3 Code añade que el uso a través del Agent SDK gasta los límites de 5 horas más rápido que Claude Code directo. Varios hilos a la vez gastan ese mismo límite.