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.

tmux, mosh e Tailscale: a stack DIY para agentes de código no celular

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

CamadaFerramentaO que resolvePule se…
RedeTailscale (Tailscale SSH)Acessar o servidor de forma privada, mesmo atrás de NAT; sem porta SSH pública; acesso com SSOO servidor já tem SSH público reforçado e você está satisfeito com ele
TransportemoshSobrevive a trocas de rede, suspensão e sinal ruim; o eco local disfarça a latênciaVocê só se conecta de uma rede estável
SessãotmuxO agente continua rodando quando você se desconecta; várias janelas por projetoNunca. Esta é a camada que mais importa.
ClienteBlink, 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 + tailscaled pode 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

ClientePlataformasmoshObservações
Blink ShelliPhone, iPadSimConstruí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.
TermiusiOS, Android, desktopSimO 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)
TermuxAndroidSim (pkg install openssh mosh)Um userland Linux completo no celular; gratuito e open source
JuiceSSHAndroidSimListado 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?
Os dois mantêm uma sessão viva, mas o tmux é a melhor escolha: a Anthropic documenta as configurações do tmux de que o Claude Code precisa (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.
Ainda preciso do mosh com o Tailscale?
Eles resolvem problemas diferentes. O Tailscale dá um endereço privado estável e nenhuma porta aberta; a sua conexão SSH por ele ainda cai quando o celular troca de rede ou fica suspenso por um tempo. O mosh sobrevive a isso. Se você se conecta quase sempre de um Wi-Fi estável, SSH pelo Tailscale mais tmux é suficiente.
Qual é o melhor terminal para iOS para o Claude Code?
O Blink Shell é a opção mais focada em mosh no iPhone e no iPad, e o Termius é o mais fácil para começar (plano gratuito, multiplataforma). Os dois funcionam com o Tailscale. Seja qual for a escolha, configure uma fileira extra de teclas para Esc, Ctrl e Shift+Tab.
Preciso abrir portas para o mosh?
Num IP público, sim: UDP 60000–61000. Numa tailnet do Tailscale, não — o tráfego passa por dentro da tailnet e nada precisa ficar exposto à internet.
O Tailscale SSH funciona num servidor Mac mini?
Só com a build open source da CLI tailscale/tailscaled no macOS, segundo a documentação do Tailscale. Com o app padrão, use o servidor SSH normal do Mac pela tailnet.

Deixe a TUI de lado no celular

Mantenha o seu servidor e a sua tailnet, troque o terminal por um app feito para agentes. iOS e Android.

Download Maude on the App Store Get Maude on Google Play