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.
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
| Laag | Tool | Wat het oplost | Sla het over als… |
|---|---|---|---|
| Netwerk | Tailscale (Tailscale SSH) | De server privé bereiken, ook achter NAT; geen publieke SSH-poort; toegang via SSO | De server al geharde publieke SSH heeft en je daar tevreden mee bent |
| Transport | mosh | Overleeft netwerkwissels, slaapstand en slecht bereik; lokale echo verbergt latency | Je alleen vanaf een stabiel netwerk verbindt |
| Sessie | tmux | De agent blijft draaien als je loskoppelt; meerdere vensters per project | Nooit. Dit is de laag die het meest telt. |
| Client | Blink, 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+tailscaledals 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
| Client | Platforms | mosh | Opmerkingen |
|---|---|---|---|
| Blink Shell | iPhone, iPad | Ja | Gebouwd rond mosh; sterke ondersteuning voor hardwaretoetsenborden op iPad. $19.99/jaar na een proefperiode van twee weken, volgens blink.sh. |
| Termius | iOS, Android, desktop | Ja | De gratis Starter-laag bevat SSH en mosh; synchronisatie tussen apparaten zit in Pro ($10/maand bij jaarlijkse betaling, volgens termius.com/pricing) |
| Termux | Android | Ja (pkg install openssh mosh) | Een volledige Linux-userland op de telefoon; gratis en open source |
| JuiceSSH | Android | Ja | Vermeld 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?
allow-passthrough en extended-keys), het splitst en script makkelijker, en de meeste gidsen voor telefoonterminals gaan ervan uit.