Stack DIY
tmux, mosh e Tailscale: a stack DIY para agentes de código no celular
O jeito clássico de rodar o Claude Code ou o Codex pelo celular é um app de terminal, uma rede privada, uma conexão que sobrevive à troca de rede e uma sessão que sobrevive a todo o resto. Cada peça é gratuita e bem conhecida. Aqui está a configuração com os comandos exatos, e uma avaliação honesta de onde ela começa a doer.
Resposta rápida
Instale o Tailscale no servidor e no celular e ative tailscale set --ssh, para que o servidor só seja acessível pela sua tailnet privada. Rode o agente dentro de tmux new -A -s main para que ele sobreviva à sua conexão. Adicione set -g allow-passthrough on e as linhas de extended-keys ao ~/.tmux.conf para o Claude Code. Conecte com mosh (mosh dev@server -- tmux new -A -s main) pelo Blink, Termius ou Termux. Funciona bem. Os pontos fracos são uma TUI em tela cheia numa tela pequena e nenhuma notificação push, a menos que você adicione hooks.
Se você já pesquisou como usar o Claude Code pelo celular, provavelmente viu esta stack em uma dúzia de posts. É porque ela funciona. O Tailscale dá ao seu celular um caminho privado e criptografado até o servidor, sem portas abertas. O mosh mantém a conexão viva quando você passa do Wi-Fi para o 4G ou bloqueia o celular. O tmux mantém o agente rodando quando a conexão cai de vez. Veja como juntar os três do jeito certo.
A stack
| Camada | Ferramenta | O que resolve | Pule se… |
|---|---|---|---|
| Rede | Tailscale (Tailscale SSH) | Acessar o servidor de forma privada, mesmo atrás de NAT; sem porta SSH pública; acesso com SSO | O servidor já tem SSH público reforçado e você está satisfeito com ele |
| Transporte | mosh | Sobrevive a trocas de rede, suspensão e sinal ruim; o eco local disfarça a latência | Você só se conecta de uma rede estável |
| Sessão | tmux | O agente continua rodando quando você se desconecta; várias janelas por projeto | Nunca. Esta é a camada que mais importa. |
| Cliente | Blink, Termius, Termux… | Um terminal no celular | — |
Configuração do tmux
Instale e inicie uma sessão com nome, à qual você pode se reconectar de qualquer lugar:
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
O -A faz o mesmo comando funcionar na primeira vez e em todas as seguintes, o que o torna um bom candidato a snippet salvo no app de terminal do celular. Depois, dê ao tmux as configurações de que os agentes precisam. A documentação de configuração do terminal da Anthropic diz que, dentro do tmux, Shift+Enter envia a mensagem em vez de adicionar uma nova linha, e as notificações nunca chegam ao terminal externo, a menos que você adicione estas linhas:
# ~/.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
Aplique com tmux source-file ~/.tmux.conf. Mesmo com as extended keys, muitos teclados de celular simplesmente não conseguem enviar Shift+Enter. O Claude Code também aceita Ctrl+J, ou \ seguido de Enter, para uma nova linha, e os dois funcionam em qualquer terminal.
Use uma janela do tmux por projeto ou por agente. Ctrl-b c abre uma nova janela e Ctrl-b n vai para a próxima. Para várias sessões no mesmo repositório, dê a cada uma a própria git worktree. O guia 24/7 cobre isso e o que acontece num reboot. As sessões do tmux não sobrevivem a um reboot.
mosh vs ssh
O SSH puro roda sobre uma única conexão TCP. Quando o celular troca de rede, ou o iOS suspende o app por um tempo, essa conexão morre, e você precisa se reconectar e voltar à sessão. O mosh faz login via SSH, inicia o mosh-server no servidor e depois passa para o próprio protocolo UDP, que continua funcionando através de mudanças de IP e suspensão. Ele também ecoa localmente o que você digita, então um link de 200 ms parece responsivo.
# 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
O mosh usa as portas UDP 60000–61000. Num IP público, você teria que abri-las no firewall, por exemplo com sudo ufw allow 60000:61000/udp, além do firewall do seu provedor de nuvem. Pelo Tailscale, o tráfego fica dentro da tailnet, então nenhuma porta pública é necessária. Uma limitação: o mosh só sincroniza a tela visível, então não há histórico de rolagem pelo próprio mosh. A documentação do mosh recomenda tmux ou screen para o histórico, mais um motivo para rodar os dois.
Tailscale SSH
O Tailscale coloca o seu servidor e o seu celular numa rede WireGuard privada (uma tailnet). O Tailscale SSH vai um passo além: o Tailscale cuida da autenticação SSH com a sua identidade na tailnet, então você não precisa distribuir chaves 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
Segundo a documentação do Tailscale, tailscale set --ssh faz o tailscaled assumir a porta 22 para o tráfego vindo da sua tailnet. Qualquer cliente SSH comum então se conecta com ssh dev@my-server, usando o nome MagicDNS da máquina. Alguns detalhes:
- Modo check. A política padrão usa
"action": "check", então de tempos em tempos você precisa se autenticar de novo num navegador. Uma URL de login aparecendo no terminal é esperado. - Plataformas de servidor. O Linux é totalmente suportado. No macOS, só a build open source da CLI
tailscale+tailscaledpode funcionar como servidor Tailscale SSH, então um Mac mini com o app da App Store deve usar o SSH normal pela tailnet. - Feche a porta pública. Depois de confirmar que você acessa a máquina pela tailnet, feche a porta 22 pública no firewall do provedor. Faça nessa ordem, com uma segunda sessão aberta, para não ficar trancado do lado de fora.
No celular, instale o app do Tailscale, entre na mesma tailnet e deixe-o conectado. O seu app de terminal então alcança my-server como se estivesse na sua rede local.
Clientes para iOS e Android
| Cliente | Plataformas | mosh | Observações |
|---|---|---|---|
| Blink Shell | iPhone, iPad | Sim | Construído em torno do mosh; ótimo suporte a teclado físico no iPad. $19.99/ano depois de um teste de duas semanas, segundo blink.sh. |
| Termius | iOS, Android, desktop | Sim | O plano gratuito Starter inclui SSH e mosh; a sincronização entre dispositivos fica no Pro ($10/mês com cobrança anual, segundo termius.com/pricing) |
| Termux | Android | Sim (pkg install openssh mosh) | Um userland Linux completo no celular; gratuito e open source |
| JuiceSSH | Android | Sim | Listado como cliente mosh no mosh.org |
Seja qual for o cliente escolhido, configure uma fileira extra de teclas com Esc, Ctrl, Tab e setas. O Claude Code usa Esc para interromper e Shift+Tab para alternar os modos de permissão, e nenhuma das duas está num teclado de celular padrão.
Onde ela falha
A stack é confiável. O atrito está em tudo ao redor da confiabilidade.
- Uma TUI de desktop numa tela de 6 polegadas. Claude Code, Codex e agy foram feitos para mais de 100 colunas. No celular, você lê diffs quebrados em várias linhas, rola a saída das ferramentas com o polegar e procura a linha de entrada.
- Sem notificações push. Quando o agente termina ou precisa de aprovação, nada avisa você, a menos que você adicione um hook. O terminal só notifica enquanto o app está em primeiro plano. Nosso guia para aprovar pedidos pelo celular cobre os hooks do ntfy que as pessoas acoplam.
- Aprovações enterradas no histórico. Um pedido de permissão são algumas linhas num painel movimentado. Se você volta depois de uma hora, precisa encontrá-lo, lê-lo e respondê-lo com as setas.
- O problema do segundo plano. O iOS suspende apps de terminal pouco depois de você sair deles. O mosh se recupera quando você volta, mas o app não consegue vigiar a sessão por você enquanto está em segundo plano.
- Copiar e colar. Selecionar texto através de tmux, mosh e um terminal de celular é sofrido. URLs longas, como links de login, são o pior caso.
- Vários servidores, vários agentes. Cada máquina nova significa mais um nó do Tailscale, mais uma entrada de host e mais um layout do tmux para lembrar.
Nada disso é motivo para evitar a stack. Ela é gratuita, funciona com qualquer agente e você controla cada peça. É motivo para saber no que você está se metendo. Nossa comparação entre apps de terminal SSH e o Maude detalha essa escolha.
Ou use um app feito para isso
O Maude substitui as camadas de cliente e de sessão para o trabalho com agentes. Um pequeno daemon no servidor é dono das sessões, então elas continuam rodando sem tmux, e o app as mostra como chat, com cards de ferramentas, diffs, notificações push com Permitir/Negar e uma caixa de entrada. Você pode manter o Tailscale: o Maude funciona com servidores na tailnet e na LAN porque o servidor se conecta para fora, ao relay do Maude, com o SSH como alternativa. E quando você precisa de um shell, cada sessão tem um terminal de verdade. Funciona com Claude Code, Codex, OpenCode, Grok Build e Antigravity.
Perguntas frequentes
tmux ou screen para o Claude Code?
allow-passthrough e extended-keys), ele divide painéis e aceita scripts com mais facilidade, e a maioria dos guias de terminal para celular parte dele.