Zelfbouwstack

tmux, mosh en Tailscale: de zelfbouwstack voor coding agents op je telefoon

De klassieke manier om Claude Code of Codex vanaf een telefoon te draaien: een terminalapp, een privénetwerk, een verbinding die wisselen van netwerk overleeft, en een sessie die al het andere overleeft. Elk onderdeel is gratis en goed begrepen. Hier is de opzet met exacte commando's, en een eerlijke blik op waar het pijn doet.

tmux, mosh en Tailscale: de zelfbouwstack voor coding agents op je telefoon

Kort antwoord

Installeer Tailscale op de server en je telefoon, en zet daarna tailscale set --ssh aan, zodat de server alleen via je privé-tailnet bereikbaar is. Draai de agent binnen tmux new -A -s main, zodat hij je verbinding overleeft. Voeg set -g allow-passthrough on en de regels voor extended-keys toe aan ~/.tmux.conf voor Claude Code. Verbind met mosh (mosh dev@server -- tmux new -A -s main) vanuit Blink, Termius of Termux. Het werkt goed. De zwakke plekken zijn een TUI op volledig scherm op een klein scherm, en geen pushmeldingen tenzij je hooks toevoegt.

Heb je gezocht hoe je Claude Code vanaf een telefoon gebruikt, dan heb je deze stack waarschijnlijk in een tiental blogposts gezien. Dat komt doordat hij werkt. Tailscale geeft je telefoon een privé, versleutelde route naar de server zonder open poorten. mosh houdt de verbinding in leven als je van wifi naar 4G wisselt of je telefoon vergrendelt. tmux houdt de agent draaiende als de verbinding toch wegvalt. Zo zet je de drie goed in elkaar.

De stack

LaagToolWat het oplostSla het over als…
NetwerkTailscale (Tailscale SSH)De server privé bereiken, ook achter NAT; geen publieke SSH-poort; toegang via SSODe server al geharde publieke SSH heeft en je daar tevreden mee bent
TransportmoshOverleeft netwerkwissels, slaapstand en slecht bereik; lokale echo verbergt latencyJe alleen vanaf een stabiel netwerk verbindt
SessietmuxDe agent blijft draaien als je loskoppelt; meerdere vensters per projectNooit. Dit is de laag die het meest telt.
ClientBlink, Termius, Termux…Een terminal op de telefoon—

tmux instellen

Installeer het en start een benoemde sessie waaraan je vanaf overal opnieuw kunt koppelen:

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

Met -A werkt hetzelfde commando de eerste keer en elke keer daarna, wat het een goede kandidaat maakt om als snippet in de terminalapp op je telefoon te bewaren. Geef tmux daarna de instellingen die agents nodig hebben. De documentatie over terminalconfiguratie van Anthropic zegt dat Shift+Enter binnen tmux verstuurt in plaats van een nieuwe regel toe te voegen, en dat meldingen de buitenste terminal nooit bereiken, tenzij je deze regels toevoegt:

# ~/.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

Pas het toe met tmux source-file ~/.tmux.conf. Ook met extended keys kunnen veel telefoontoetsenborden helemaal geen Shift+Enter sturen. Claude Code accepteert ook Ctrl+J, of \ gevolgd door Enter, voor een nieuwe regel, en beide werken in elke terminal.

Gebruik één tmux-venster per project of per agent. Ctrl-b c opent een nieuw venster en Ctrl-b n gaat naar het volgende. Voor meerdere sessies op dezelfde repository geef je elk een eigen git-worktree. De gids over 24/7 draaien behandelt dat en wat er bij een herstart gebeurt. tmux-sessies overleven geen herstart.

mosh vs ssh

Gewone SSH loopt over één TCP-verbinding. Wisselt je telefoon van netwerk, of pauzeert iOS de app een tijdje, dan sterft die verbinding, en verbind en koppel je opnieuw. mosh logt in via SSH, start mosh-server op de server en schakelt daarna over op een eigen UDP-protocol, dat doorgaat bij IP-wissels en slaapstand. Het toont je getypte tekens ook lokaal, zodat een verbinding van 200 ms vlot aanvoelt.

# 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 gebruikt de UDP-poorten 60000–61000. Via een publiek IP-adres moet je die openzetten in je firewall, bijvoorbeeld met sudo ufw allow 60000:61000/udp plus de firewall van je cloudprovider. Via Tailscale blijft het verkeer binnen het tailnet, dus er is geen publieke poort nodig. Eén beperking: mosh synchroniseert alleen het zichtbare scherm, dus via mosh zelf is er geen scrollback. De eigen documentatie van mosh raadt tmux of screen aan voor de geschiedenis, wat nog een reden is om ze allebei te draaien.

Tailscale SSH

Tailscale zet je server en telefoon in een privé WireGuard-netwerk (een tailnet). Tailscale SSH gaat een stap verder: Tailscale regelt de SSH-authenticatie met je tailnet-identiteit, dus je verspreidt helemaal geen SSH-sleutels.

# 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

Volgens de documentatie van Tailscale zorgt tailscale set --ssh ervoor dat tailscaled poort 22 overneemt voor verkeer uit je tailnet. Elke gewone SSH-client verbindt dan met ssh dev@my-server, via de MagicDNS-naam van de machine. Enkele details:

  • Check-modus. Het standaardbeleid gebruikt "action": "check", dus je wordt af en toe gevraagd om opnieuw te authenticeren in een browser. Een inlog-URL in de terminal is normaal.
  • Serverplatforms. Linux wordt volledig ondersteund. Op macOS kan alleen de open-source CLI-build met tailscale + tailscaled als Tailscale SSH-server dienen, dus een Mac mini met de app uit de App Store gebruikt beter gewone SSH via het tailnet.
  • Sluit de publieke poort. Zodra je hebt bevestigd dat je de machine via het tailnet kunt bereiken, sluit je publieke poort 22 in de firewall van je provider. Doe het in die volgorde, met een tweede sessie open, zodat je jezelf niet buitensluit.

Installeer op de telefoon de Tailscale-app, log in bij hetzelfde tailnet en laat hem verbonden. Je terminalapp bereikt my-server dan alsof die op je lokale netwerk staat.

Clients voor iOS en Android

ClientPlatformsmoshOpmerkingen
Blink ShelliPhone, iPadJaGebouwd rond mosh; sterke ondersteuning voor hardwaretoetsenborden op iPad. $19.99/jaar na een proefperiode van twee weken, volgens blink.sh.
TermiusiOS, Android, desktopJaDe gratis Starter-laag bevat SSH en mosh; synchronisatie tussen apparaten zit in Pro ($10/maand bij jaarlijkse betaling, volgens termius.com/pricing)
TermuxAndroidJa (pkg install openssh mosh)Een volledige Linux-userland op de telefoon; gratis en open source
JuiceSSHAndroidJaVermeld als mosh-client op mosh.org

Welke client je ook kiest, stel een extra toetsenrij in met Esc, Ctrl, Tab en pijltjes. Claude Code gebruikt Esc om te onderbreken en Shift+Tab om door de toestemmingsmodi te bladeren, en geen van beide staat op een standaard telefoontoetsenbord.

Waar het wringt

De stack is betrouwbaar. De wrijving zit in alles rond die betrouwbaarheid.

  • Een desktop-TUI op een scherm van 6 inch. Claude Code, Codex en agy zijn gebouwd voor 100+ kolommen. Op een telefoon lees je afgebroken diffs, scrol je met je duim door tooloutput en zoek je de invoerregel.
  • Geen pushmeldingen. Is de agent klaar of heeft hij goedkeuring nodig, dan vertelt niets je dat tenzij je een hook toevoegt. De terminal laat het je alleen weten zolang de app op de voorgrond staat. Onze gids over verzoeken goedkeuren vanaf je telefoon behandelt de ntfy-hooks die mensen erbij bouwen.
  • Goedkeuringen begraven in de scrollback. Een toestemmingsverzoek is een paar regels in een druk paneel. Kom je na een uur terug, dan moet je het vinden, lezen en met pijltjestoetsen beantwoorden.
  • Het achtergrondprobleem. iOS pauzeert terminalapps kort nadat je ze verlaat. mosh herstelt als je terugkomt, maar de app kan de sessie niet voor je in de gaten houden terwijl hij op de achtergrond staat.
  • Kopiëren en plakken. Tekst selecteren door tmux, mosh en een telefoonterminal heen is lastig. Lange URL's, zoals inloglinks, zijn het ergste geval.
  • Meerdere servers, meerdere agents. Elke nieuwe machine betekent weer een Tailscale-node, weer een hostvermelding en weer een tmux-indeling om te onthouden.

Niets hiervan is een reden om de stack te vermijden. Hij is gratis, werkt met elke agent, en je beheert elk onderdeel. Het is wel een reden om te weten waar je aan begint. Onze vergelijking van SSH-terminalapps en Maude gaat dieper in op de afweging.

Of gebruik een app die ervoor gebouwd is

Maude vervangt de client- en sessielaag voor werk met agents. Een kleine daemon op de server is eigenaar van de sessies, dus ze blijven draaien zonder tmux, en de app toont ze als chat, met toolkaarten, diffs, pushmeldingen met Sta toe/Weiger, en een inbox. Tailscale kun je houden: Maude werkt met servers in een tailnet en op een LAN, omdat de server zelf uitbelt naar de relay van Maude, met SSH als terugvaloptie. En als je een shell nodig hebt, heeft elke sessie een echte terminal. Het werkt met Claude Code, Codex, OpenCode, Grok Build en Antigravity.

Veelgestelde vragen

tmux of screen voor Claude Code?
Beide houden een sessie in leven, maar tmux is de betere keuze: Anthropic documenteert de tmux-instellingen die Claude Code nodig heeft (allow-passthrough en extended-keys), het splitst en script makkelijker, en de meeste gidsen voor telefoonterminals gaan ervan uit.
Is mosh nog nodig met Tailscale?
Ze lossen verschillende problemen op. Tailscale geeft je een stabiel privéadres en geen open poorten; je SSH-verbinding erover valt nog steeds weg als de telefoon van netwerk wisselt of een tijdje slaapt. mosh overleeft dat. Verbind je vooral vanaf stabiele wifi, dan volstaan SSH via Tailscale plus tmux.
Wat is de beste iOS-terminal voor Claude Code?
Blink Shell is de optie die het meest op mosh is gericht op iPhone en iPad, en Termius is het makkelijkst om mee te beginnen (gratis laag, platformonafhankelijk). Beide werken met Tailscale. Stel welke je ook kiest een extra toetsenrij in voor Esc, Ctrl en Shift+Tab.
Moet ik poorten openen voor mosh?
Op een publiek IP-adres wel: UDP 60000–61000. Via een Tailscale-tailnet niet — het verkeer reist binnen het tailnet en er hoeft niets aan het internet te worden blootgesteld.
Werkt Tailscale SSH op een Mac mini als server?
Volgens de documentatie van Tailscale alleen met de open-source CLI-build tailscale/tailscaled op macOS. Met de standaardapp gebruik je in plaats daarvan de gewone SSH-server van de Mac via het tailnet.

Sla de TUI op je telefoon over

Houd je server en tailnet, ruil de terminal in voor een app die voor agents is gebouwd. iOS en Android.

Download Maude on the App Store Get Maude on Google Play