SSD Nodes Learn 8GB RAM — $66/jaar
Gidsen Matt ConnorDoor Matt Connor · Bijgewerkt 2026-08-02

Claude Code vanaf uw telefoon gebruiken via een VPS

Claude Code draait in tmux op een VPS; uw telefoon toont alleen de sessie. Leer SSH-sleutels, mosh bij slecht bereik, tmux attach en toetsenbordfixes.

Claude Code vanaf uw telefoon: hoe het echt werkt

Claude Code vanaf uw telefoon is geen mobiele app. Claude Code draait op een VPS (virtual private server), in een tmux-sessie die open blijft. Uw telefoon opent zolang u de sessie bekijkt een SSH-verbinding (secure shell) met die sessie. Als u de app sluit, blijft de agent werken, omdat het proces nooit op de telefoon draaide.

Deze scheiding vormt de volledige opzet. Een besturingssysteem voor telefoons schort een app enkele seconden nadat u deze verlaat op. Daardoor stopt elke langlopende taak die op de telefoon is gestart. De telefoon krijgt ook telkens een nieuw netwerkadres wanneer u van wifi naar mobiele data loopt. Beide problemen verdwijnen wanneer het proces op een server draait en de telefoon alleen het scherm weergeeft.

U hebt vier dingen op de server nodig: tmux om de sessie vast te houden, SSH-sleutels om verbinding te maken, mosh voor wijzigingen in de netwerkverbinding en Claude Code zelf. Aan de telefoon hebt u één terminal-app nodig met een toetsenrij die u kunt openen.

Wat u nodig hebt op de VPS

Een kleine Ubuntu 24.04-server is voldoende voor de onderdelen over SSH en tmux. Claude Code vereist meer. Volgens de officiële vereisten van juli 2026 hebt u Ubuntu 20.04 of nieuwer nodig op een x64- of ARM64-processor, met 4 GB RAM of meer. Op een abonnement met 1 GB wordt het geïnstalleerd, maar onder belasting beëindigt de kernel het proces. Claude Code vereist ook een betaald Claude-account (Pro, Max, Team of Enterprise) of een Console-account met API-toegang, omdat het gratis Claude.ai-abonnement dit niet bevat.

Configureer de server voor een gewone gebruiker met sudo, niet voor root. Als de server nieuw is, doorloopt u eerst de eerste tien minuten op een nieuwe VPS, omdat de SSH-wijzigingen verderop in deze handleiding eenvoudiger zijn zodra de gebruiker en de firewall bestaan.

sudo apt update && sudo apt install -y tmux mosh
curl -fsSL https://claude.ai/install.sh | bash
claude --version

Het installatieprogramma plaatst het binaire bestand in ~/.local/bin/claude en claude --version geeft een regel zoals 2.1.211 (Claude Code) weer. Als command not found wordt weergegeven, staat die map nog niet in uw PATH: meld u af, meld u opnieuw aan en controleer dit vervolgens met command -v claude. claude doctor geeft diagnostische gegevens over de installatie en instellingen weer zonder een sessie te starten.

Meld u nu eenmaal aan vanaf een laptop, voordat u afhankelijk bent van de telefoon. Voer claude uit in een projectmap en volg de aanmeldingsprompt. Tijdens deze procedure moet u een URL in een browser openen en een code terugbrengen naar de terminal. Het wisselen tussen twee apps op een telefoonscherm verloopt daarbij traag. Doe dit eenmaal met een echt toetsenbord; de aanmeldingsgegevens blijven vervolgens op de server staan.

Start Claude Code in tmux, zodat een verbroken verbinding het proces niet kan beëindigen

tmux new -s claude
cd ~/projects/api
claude

Maak de sessie los met Ctrl-b en daarna met d. tmux geeft [detached (from session claude)] weer en geeft de shell aan u terug. Sluit nu de app, verlies het signaal of steek de telefoon in uw zak. Het paneel blijft actief.

tmux ls
tmux attach -t claude

tmux ls geeft één regel per sessie weer, bijvoorbeeld claude: 1 windows (created Thu Jul 30 09:14:02 2026). Met tmux attach -t claude gaat u precies terug naar de plek waar u was gebleven, inclusief de gedeeltelijk voltooide bewerking.

Dit werkt omdat tmux een eigen serverproces uitvoert. Uw shell en Claude Code zijn kinderen van die server en niet van sshd. Wanneer de SSH-verbinding wordt verbroken, stuurt de kernel het hangup-signaal, SIGHUP, naar de processen die aan die verbinding zijn gekoppeld. De tmux-server is daar geen onderdeel van. Zonder tmux stopt dezelfde schermvergrendeling die uw verbinding verbreekt Claude Code midden in een toolaanroep. Claude Code op een VPS uitvoeren binnen tmux behandelt de sessie-indeling uitgebreider.

Voer tmux uit op de server, nooit op de telefoon. Als u tmux invoert binnen een sessie waarbij u al bent aangemeld, wordt sessions should be nested with care, unset $TMUX to force weergegeven. Als u dit toch forceert, moet u twee prefix-toetsen tegen elkaar laten strijden.

Automatisch koppelen bij elke aanmelding

Het wordt snel vervelend om de attach-opdracht op een toetsenbord met aanraakbediening te typen. Plaats dit aan het einde van ~/.profile op de server:

if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
  exec tmux new-session -A -s claude
fi

new-session -A -s claude koppelt aan de sessie met de naam claude als die bestaat en maakt de sessie aan als die niet bestaat. Met één opdracht worden dus beide gevallen afgehandeld. exec vervangt de login-shell door tmux. Als u tmux verlaat, wordt de verbinding gesloten in plaats van dat u bij een lege prompt terechtkomt. Als u een gewone shell nodig hebt, slaat u het bestand over: ssh you@server -t "bash --noprofile".

Plaats dit in ~/.profile en niet in ~/.bashrc. ~/.bashrc wordt ook uitgevoerd voor niet-interactieve sessies. Daardoor mislukken bestandsoverdrachten: scp en sftp lezen de onverwachte uitvoer als protocolgegevens en mislukken met Received message too long. ~/.profile wordt alleen uitgevoerd voor login-shells. Dat is wat een interactieve SSH-sessie gebruikt.

~/.profile is ook de plaats waar Ubuntu ~/.local/bin toevoegt aan PATH. Als claude direct na het aanmelden werkt, maar een shell binnen tmux command not found meldt, wordt dit veroorzaakt door de uitvoervolgorde. Start tmux daarom vanuit een login-shell zoals hierboven, en niet vanuit een script dat het profiel overslaat.

Beide apps ondersteunen SSH en mosh en slaan sleutels op in de app. Het verschil zit in de interface.

Blink Shell werkt met opdrachten. Bij de prompt voert u ssh you@server of mosh you@server in, met dezelfde syntaxis als in een terminal op een desktop. U opent de instellingen door config in te voeren. In het gedeelte Keys maakt u een sleutelpaar aan.

Termius werkt met formulieren. U vult een hostvermelding in en schakelt die host vervolgens in de hostgegevens van SSH naar Mosh. Termius bevat een eigen mosh-implementatie en ondersteunt mosh 1.3.0 en hoger. Op de server moet daarom nog steeds het pakket mosh zijn geïnstalleerd.

Genereer de sleutel in beide gevallen in de app. Kopieer nooit een bestaande privésleutel naar de telefoon. De app toont de publieke sleutel. Dit is de ene regel die u op de server aan ~/.ssh/authorized_keys toevoegt. SSH-sleutels per apparaat en hoe u er een intrekt behandelt de naamgeving en het intrekken van een sleutel. Dit is belangrijker voor een telefoon dan voor een laptop.

Schakel de biometrische vergrendeling of toegangscodevergrendeling van de terminalapp zelf in. Zonder deze vergrendeling biedt een ontgrendelde telefoon toegang tot een shell op uw server zolang het scherm actief blijft.

Android: Termux

pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pub

Termux biedt OpenSSH en mosh aan in zijn eigen repository. Daardoor werken ssh, ssh-keygen en mosh hetzelfde als op een desktop. Voeg de weergegeven regel met de openbare sleutel toe aan ~/.ssh/authorized_keys op de server. Maak daarna verbinding met mosh you@server.

Het schermtoetsenbord van Android heeft geen Esc-toets en geen Ctrl-toets. Claude Code heeft beide nodig. Termux kan een eigen toetsenrij weergeven. Voeg één regel toe aan ~/.termux/termux.properties:

extra-keys = [['ESC','|','/','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]

Voer daarna termux-reload-settings uit. De toetsenrij verschijnt boven het toetsenbord. Met dezelfde herlading wordt ook een monospace TrueType-lettertype geladen dat u in ~/.termux/font.ttf hebt geplaatst.

Android kan Termux stoppen wanneer de app op de achtergrond actief is. In dit geval kost dat alleen een nieuwe verbinding. De sessie en de agent draaien op de server.

Waarom loopt de terminal vast wanneer ik wifi verlaat, en wat lost mosh op?

Een SSH-verbinding is een TCP-verbinding (transmission control protocol). Een TCP-verbinding wordt geïdentificeerd door beide adressen en beide poorten. Wanneer u buiten het wifi-bereik loopt, krijgt de telefoon een nieuw adres van het mobiele netwerk. Daardoor komt de oude verbinding aan geen van beide kanten meer overeen. Dit wordt niet gemeld. De terminal reageert gewoon niet meer totdat TCP de verbinding opgeeft. Daarna geeft ssh client_loop: send disconnect: Broken pipe weer. Druk achtereenvolgens op Enter, ~ en . om een vastgelopen sessie direct te beëindigen.

mosh (mobile shell) voorkomt dit probleem. Het gebruikt SSH eenmaal om in te loggen en een mosh-server-proces te starten. Vervolgens leest het de UDP-poort (user datagram protocol) uit die de server heeft gekozen en sluit het de SSH-verbinding. Daarna wisselen de twee kanten UDP-datagrammen uit die met een gedeelde sessiesleutel zijn geauthenticeerd. De sessie wordt daardoor met die sleutel geïdentificeerd en niet met uw adres. Een nieuw adres vormt dan geen probleem. mosh geeft uw invoer ook lokaal weer en ververst het scherm wanneer de server een andere status doorgeeft. Daardoor blijft de sessie bruikbaar via een trage mobiele verbinding.

mosh gebruikt een UDP-poort tussen 60000 en 61000. Open daarom dat bereik:

sudo ufw allow 60000:61000/udp
sudo ufw status

Poorten openen met ufw bevat de rest van de firewallconfiguratie. Als uw provider in het configuratiescherm een afzonderlijke netwerkfirewall aanbiedt, voegt u daar hetzelfde bereik toe. Een ufw-regel heeft namelijk geen invloed op een filter dat vóór de machine staat.

Twee problemen met mosh komen vaak voor. Als het inloggen slaagt en daarna blijft hangen met Nothing received from server on UDP port 60001., wordt het UDP-bereik ergens tussen de telefoon en de server geblokkeerd. Als een verbinding meldt dat mosh-server niet is gevonden, ontbreekt het pakket op de server of ontbreekt het in de login-PATH. Installeer het pakket of geef het rechtstreeks op met mosh --server=/usr/bin/mosh-server you@server.

mosh weigert ook te starten wanneer de login-locale niet UTF-8 is. Het meldt dat met mosh-server needs a UTF-8 native locale to run.. Corrigeer de locale op de server, niet op de telefoon.

locale
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8

mosh doet twee dingen niet. In het README staat dat mosh geen X-forwarding of niet-interactief gebruik van SSH ondersteunt, waaronder port forwarding. Voor het bekijken van een webapp die Claude Code zojuist heeft gestart, is daarom nog steeds gewoon ssh -L 8080:127.0.0.1:8080 you@server nodig. Daarnaast synchroniseert mosh alleen het zichtbare scherm en heeft het geen eigen scrollback. Die tweede beperking vormt hier geen probleem, omdat tmux de scrollback bijhoudt: met Ctrl-b en vervolgens [ opent u de kopieermodus, waarna u met slepen of de pijltoetsen door de uitvoer kunt scrollen. Met q verlaat u de kopieermodus.

Een telefoonscherm bruikbaar maken

Vier regels in ~/.tmux.conf op de server doen het meeste werk:

set -g mouse on
set -g status-position top
set -g default-terminal "tmux-256color"
set -g history-limit 20000

mouse on verandert slepen met aanraking in scrollen en een tik in het selecteren van een paneel of venster. Daarmee vervangt u de meeste prefix-toetsen die lastig te typen zijn. status-position top verplaatst de tmux-statusregel van de onderrand, waar het schermtoetsenbord en de suggestiebalk deze bedekken. default-terminal is belangrijk omdat tmux anders een screen-terminal aan Claude Code doorgeeft. Kleuren en kadertekens worden dan slechter weergegeven dan nodig. Als tmux daarna niet start met missing or unsuitable terminal: tmux-256color, ontbreekt de terminfo-vermelding: sudo apt install ncurses-term.

Leer vier toetsen. Daarna werkt de rest prettig.

  • Esc onderbreekt Claude tijdens een antwoord en behoudt het werk dat al is uitgevoerd. Dit is dus de toets die u het dichtst bij uw duim wilt hebben.
  • Ctrl+C onderbreekt een actieve bewerking ook. Bij een inactieve prompt wist de eerste druk de invoer en sluit de tweede druk Claude Code af. Dit is dus het grovere middel.
  • Esc twee keer wist een conceptprompt. Bij een lege prompt opent deze toets in plaats daarvan het menu voor terugspoelen.
  • Typ voor een prompt over meerdere regels \ en druk daarna op Enter. Deze vorm werkt in elke terminal. Shift+Enter werkt van nature alleen in een korte lijst desktopterminals. De mobiele clients staan daar niet bij.

Gebruik geen gesplitste panelen. Een telefoon in staande stand is ongeveer 40 kolommen breed. Een verticale splitsing laat dan 20 kolommen per paneel over, waardoor elke diff in onleesbare tekst omloopt. Gebruik in plaats daarvan tmux-vensters: Ctrl-b c maakt een venster en Ctrl-b n gaat naar het volgende. Draai de telefoon een kwartslag wanneer u een diff goed moet lezen.

Een lange sessie op een klein scherm is vooral een contextprobleem. Daarom is de contextvenstergrootte van Claude Code beheren het lezen waard voordat u een volledige werkdag vanuit een trein probeert te werken.

Beveilig het systeem: alleen sleutels, geen wachtwoorden

De telefoon bevat nu een sleutel voor een machine die uw code bewerkt en opdrachten uitvoert. Schakel wachtwoordauthenticatie uit. Een drop-inbestand is veiliger dan sshd_config rechtstreeks bewerken, omdat Ubuntu's sshd_config bovenaan /etc/ssh/sshd_config.d/*.conf opneemt en de eerste gevonden waarde voor een instelling wordt gebruikt.

sudo tee /etc/ssh/sshd_config.d/99-phone.conf >/dev/null <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
EOF
sudo sshd -t && sudo systemctl reload ssh

sshd -t parseert de configuratie en geeft niets weer als deze geldig is. Sla deze stap niet over: door één typefout mislukt sshd bij het opnieuw laden. Houd uw huidige sessie open en test vanaf een tweede verbinding voordat u iets sluit. Met een verkeerde sleutel krijgt u anders Permission denied (publickey). en is er, met uitgeschakelde wachtwoorden, geen terugvaloptie. De herstelroute is dan de console van uw provider.

Geef elk apparaat een eigen sleutel. Als u de telefoon kwijtraakt, hoeft u slechts één regel uit ~/.ssh/authorized_keys te verwijderen en blijft uw laptop werken. Met één gedeelde sleutel moet u de sleutel op elk apparaat dat u bezit wijzigen.

Als u SSH op Ubuntu 24.04 naar een andere poort verplaatst, moet u weten dat de listener bij ssh.socket hoort. Een Port-regel op zichzelf wijzigt niets. Voer sudo systemctl edit ssh.socket uit, maak de standaardwaarde leeg met een lege ListenStream= en stel uw poort op de volgende regel in. SSH op een VPS beveiligen behandelt dit en de rest van het aanvalsoppervlak.

fail2ban voor SSH voegt weinig beveiliging toe zodra wachtwoorden zijn uitgeschakeld, omdat een geraden wachtwoord helemaal niet kan worden geaccepteerd. Het zorgt wel voor rustigere logboeken, waardoor een echte inlogpoging gemakkelijk opvalt.

De sterkere optie is om SSH buiten het openbare internet te houden. Plaats de server achter een WireGuard-VPN die u zelf host, activeer de tunnel op de telefoon wanneer dat nodig is en geef sshd alleen op de tunnel een ListenAddress. mosh werkt over de tunnel, omdat beide zijden UDP gebruiken. Eén aandachtspunt: de tunnel voegt pakketoverhead toe. Als grote overdrachten vastlopen, verlaagt u de MTU (maximum transmission unit) in de WireGuard-configuratie van de telefoon.

Tot slot nog één punt over deze werkwijze. Op een telefoon keurt u toestemmingsprompts goed op een scherm waarop telkens slechts enkele regels van een diff worden weergegeven. Dat is een reden om de beveiligingsmaatregelen te behouden, niet om ze uit te schakelen. Claude Code veilig uitvoeren op een VPS behandelt de gebruikers- en mapbeperkingen die u moet instellen voordat een touchscreen uw belangrijkste toegangsmethode wordt.

Wanneer u opnieuw verbinding maakt en er iets mis is

tmux attach die no server running on /tmp/tmux-1000/default afdrukt, betekent dat de tmux-server verdwenen is. Dat betekent vrijwel altijd dat de machine opnieuw is opgestart. Controleer dit met uptime. Kernelupdates uit automatische beveiligingsupdates starten de machine opnieuw op. Na een herstart heeft de machine geen tmux-sessie meer. Ga er daarom van uit dat u elke Claude Code-uitvoering opnieuw kunt starten.

can't find session: claude is iets anders. De tmux-server draait, maar die naam bestaat niet. tmux ls toont wat er wel bestaat.

Als u verbinding maakt en een gewone shell-prompt ziet waar Claude Code eerder draaide, is het proces beëindigd zonder dat de sessie eindigde. Controleer dmesg -T | tail op een regel zoals Out of memory: Killed process 4821 (claude). Dat gebeurt bij een machine die niet aan de vereiste van 4 GB voldoet tijdens een grote bewerking. Als zo'n regel ontbreekt, is Claude Code zelf afgesloten. De scrollback van de shell boven de prompt bevat dan de reden.

Een venster dat klein terugkomt, met ongebruikte ruimte eromheen, betekent dat twee clients met verschillende afmetingen zijn verbonden. tmux maakt een venster zo groot als de kleinste verbonden client. Uw laptop houdt de sessie nog steeds 200 kolommen breed, terwijl de telefoon om 40 kolommen vraagt. Koppel de andere clients los wanneer u verbinding maakt: tmux attach -d -t claude.

FAQ

Kan ik Claude Code op de telefoon zelf uitvoeren in plaats van op een VPS?

Nee. De ondersteunde platforms vanaf juli 2026 zijn macOS, Windows, Ubuntu 20.04 of nieuwer, Debian 10 of nieuwer en Alpine 3.19 of nieuwer, met 4 GB RAM of meer. Android en iOS staan niet op die lijst. Een telefoon laat apps bovendien in de slaapstand gaan en wijzigt voortdurend van netwerkadres. Dat is ongeschikt voor een langdurige agentuitvoering. Voer het uit op een server en gebruik de telefoon als scherm.

Blijft de sessie actief als ik de app sluit of het signaal verlies?

Ja. Twee afzonderlijke onderdelen zorgen daarvoor. tmux houdt het proces op de server actief, zodat er niets stopt wanneer de verbinding wordt verbroken. mosh houdt de verbinding zelf actief bij een adreswijziging. Als u van wifi naar mobiele data overschakelt, hoeft u daardoor niet opnieuw verbinding te maken. Met gewone SSH en zonder tmux zorgt een verbroken verbinding voor SIGHUP en stopt Claude Code midden in de taak.

Waarom maakt mosh verbinding en wordt er daarna niets weergegeven?

Als het aanmelden lukt en de verbinding daarna blijft hangen met Nothing received from server on UDP port 60001., is UDP 60000 tot 61000 niet geopend. Voeg dit bereik toe in ufw en voeg het ook toe in de netwerkfirewall van uw provider. Op de meeste beheerpanelen is dat een afzonderlijke instelling. Als mosh in plaats daarvan meldt dat mosh-server niet is gevonden, ontbreekt het pakket op de server: sudo apt install mosh.

Hoe onderbreek ik Claude Code met een toetsenbord zonder Esc-toets?

Voeg een toetsenrij toe. Termux configureert er een met extra-keys in ~/.termux/termux.properties. Termius en Blink leveren beide een rij die u in de instellingen kunt bewerken. Esc onderbreekt een actieve respons en behoudt het werk dat al is uitgevoerd. Ctrl+C onderbreekt ook, maar als u dit tweemaal indrukt bij een inactieve prompt, wordt Claude Code afgesloten. Gebruik daarom eerst Esc.

Is SSH openstellen voor het internet hiervoor voldoende veilig?

Als wachtwoordverificatie is uitgeschakeld, kan alleen een cryptografische sleutel waarmee authenticatie mogelijk is toegang geven. Die sleutel verlaat uw apparaten niet. Dat is een aanvaardbaar risico voor een machine die u opnieuw kunt opbouwen. Geef elk apparaat een eigen sleutel, zodat een verloren telefoon u slechts 1 regel in authorized_keys kost. Als u liever helemaal niet op een openbare poort antwoordt, plaatst u de machine achter WireGuard en laat u sshd luisteren op het tunneladres.