Stack maison

tmux, mosh et Tailscale : la stack maison pour vos agents de code sur téléphone

La façon classique d'utiliser Claude Code ou Codex depuis un téléphone : une app de terminal, un réseau privé, une connexion qui survit aux changements de réseau, et une session qui survit à tout le reste. Chaque brique est gratuite et bien connue. Voici l'installation avec les commandes exactes, et un regard honnête sur ce qui devient pénible.

tmux, mosh et Tailscale : la stack maison pour vos agents de code sur téléphone

En bref

Installez Tailscale sur le serveur et sur votre téléphone, puis activez tailscale set --ssh pour que le serveur ne soit joignable que par votre tailnet privé. Faites tourner l'agent dans tmux new -A -s main pour qu'il survive à votre connexion. Ajoutez set -g allow-passthrough on et les lignes extended-keys à ~/.tmux.conf pour Claude Code. Connectez-vous avec mosh (mosh dev@server -- tmux new -A -s main) depuis Blink, Termius ou Termux. Ça marche bien. Ses points faibles : une TUI plein écran sur un petit écran, et pas de notifications push à moins d'ajouter des hooks.

Si vous avez cherché comment utiliser Claude Code depuis un téléphone, vous avez sans doute croisé cette stack dans une douzaine d'articles de blog. C'est parce qu'elle fonctionne. Tailscale donne à votre téléphone un chemin privé et chiffré vers le serveur, sans port ouvert. mosh garde la connexion en vie quand vous passez du Wi-Fi à la 4G ou verrouillez le téléphone. tmux garde l'agent en marche quand la connexion finit par tomber. Voici comment assembler correctement les trois.

La stack

CoucheOutilCe qu'il résoutÀ ignorer si…
RéseauTailscale (Tailscale SSH)Joindre le serveur en privé, même derrière un NAT ; pas de port SSH public ; accès adossé au SSOLe serveur a déjà un SSH public durci et cela vous convient
TransportmoshSurvit aux changements de réseau, à la veille et au mauvais signal ; l'écho local masque la latenceVous ne vous connectez que depuis un réseau stable
SessiontmuxL'agent continue de tourner quand vous vous déconnectez ; plusieurs fenêtres par projetJamais. C'est la couche qui compte le plus.
ClientBlink, Termius, Termux…Un terminal sur le téléphone—

Configurer tmux

Installez-le et lancez une session nommée à laquelle vous pourrez vous rattacher de n'importe où :

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

-A fait fonctionner la même commande la première fois comme toutes les suivantes, ce qui en fait un bon candidat à enregistrer comme snippet dans l'app de terminal de votre téléphone. Donnez ensuite à tmux les réglages dont les agents ont besoin. La documentation de configuration du terminal d'Anthropic indique que dans tmux, Maj+Entrée envoie le message au lieu d'ajouter un saut de ligne, et que les notifications n'atteignent jamais le terminal extérieur, sauf si vous ajoutez ces lignes :

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

Appliquez-les avec tmux source-file ~/.tmux.conf. Même avec les touches étendues, beaucoup de claviers de téléphone ne savent pas du tout envoyer Maj+Entrée. Claude Code accepte aussi Ctrl+J, ou \ suivi d'Entrée, pour un saut de ligne, et les deux fonctionnent dans n'importe quel terminal.

Utilisez une fenêtre tmux par projet ou par agent. Ctrl-b c ouvre une nouvelle fenêtre et Ctrl-b n passe à la suivante. Pour plusieurs sessions sur le même dépôt, donnez à chacune son propre worktree git. Le guide 24 h/24 traite de cela et de ce qui se passe au redémarrage. Les sessions tmux ne survivent pas à un redémarrage.

mosh ou ssh

SSH classique repose sur une seule connexion TCP. Quand votre téléphone change de réseau, ou qu'iOS suspend l'app un moment, cette connexion meurt, et vous vous reconnectez puis vous rattachez. mosh se connecte via SSH, lance mosh-server sur le serveur, puis bascule sur son propre protocole UDP, qui tient bon à travers les changements d'IP et la veille. Il affiche aussi votre saisie en local, si bien qu'une liaison à 200 ms paraît réactive.

# 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 utilise les ports UDP 60000–61000. Sur une IP publique, il faudrait les ouvrir dans votre pare-feu, par exemple avec sudo ufw allow 60000:61000/udp plus le pare-feu de votre hébergeur cloud. Via Tailscale, le trafic reste dans le tailnet, donc aucun port public n'est nécessaire. Une limite : mosh ne synchronise que l'écran visible, donc pas d'historique de défilement via mosh lui-même. La documentation de mosh recommande tmux ou screen pour l'historique, une raison de plus de faire tourner les deux.

Tailscale SSH

Tailscale place votre serveur et votre téléphone sur un réseau WireGuard privé (un tailnet). Tailscale SSH va plus loin : Tailscale gère l'authentification SSH avec votre identité sur le tailnet, si bien que vous ne distribuez plus du tout de clés 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

D'après la documentation de Tailscale, tailscale set --ssh fait prendre en charge le port 22 par tailscaled pour le trafic qui vient de votre tailnet. N'importe quel client SSH classique se connecte alors avec ssh dev@my-server, en utilisant le nom MagicDNS de la machine. Quelques détails :

  • Le mode check. La politique par défaut utilise "action": "check", donc on vous demande de vous réauthentifier dans un navigateur de temps en temps. Une URL de connexion qui apparaît dans le terminal est normale.
  • Les plateformes serveur. Linux est entièrement pris en charge. Sur macOS, seul le build CLI open source tailscale + tailscaled peut servir de serveur Tailscale SSH : un Mac mini avec l'app de l'App Store doit donc utiliser le SSH classique via le tailnet.
  • Fermez le port public. Une fois que vous avez confirmé pouvoir joindre la machine via le tailnet, fermez le port 22 public dans le pare-feu de votre hébergeur. Faites-le dans cet ordre, avec une seconde session ouverte, pour ne pas vous enfermer dehors.

Sur le téléphone, installez l'app Tailscale, connectez-vous au même tailnet et laissez-la connectée. Votre app de terminal joint alors my-server comme s'il était sur votre réseau local.

Les clients iOS et Android

ClientPlateformesmoshRemarques
Blink ShelliPhone, iPadOuiConçu autour de mosh ; excellente prise en charge des claviers physiques sur iPad. $19.99/an après un essai de deux semaines, selon blink.sh.
TermiusiOS, Android, ordinateurOuiL'offre gratuite Starter inclut SSH et mosh ; la synchronisation entre appareils est dans Pro ($10/mois en annuel, selon termius.com/pricing)
TermuxAndroidOui (pkg install openssh mosh)Un environnement Linux complet sur le téléphone ; gratuit et open source
JuiceSSHAndroidOuiListé comme client mosh sur mosh.org

Quel que soit le client choisi, configurez une rangée de touches supplémentaire avec Échap, Ctrl, Tab et les flèches. Claude Code utilise Échap pour interrompre et Maj+Tab pour faire défiler les modes d'autorisation, et aucune des deux n'existe sur un clavier de téléphone standard.

Là où ça coince

La stack est fiable. La friction, c'est tout ce qui entoure la fiabilité.

  • Une TUI de bureau sur un écran de 6 pouces. Claude Code, Codex et agy sont conçus pour 100 colonnes et plus. Sur un téléphone, vous lisez des diffs repliés, faites défiler la sortie des outils au pouce et cherchez la ligne de saisie.
  • Pas de notifications push. Quand l'agent termine ou a besoin d'une validation, rien ne vous prévient à moins d'ajouter un hook. Le terminal ne vous notifie que lorsque l'app est au premier plan. Notre guide pour valider les demandes depuis votre téléphone présente les hooks ntfy que l'on greffe à la stack.
  • Des validations noyées dans l'historique. Une demande d'autorisation, c'est quelques lignes dans un panneau chargé. Si vous revenez une heure plus tard, il faut la retrouver, la lire et y répondre avec les flèches.
  • Le problème de l'arrière-plan. iOS suspend les apps de terminal peu après que vous les avez quittées. mosh se rétablit à votre retour, mais l'app ne peut pas surveiller la session pour vous en arrière-plan.
  • Le copier-coller. Sélectionner du texte à travers tmux, mosh et un terminal de téléphone est pénible. Les longues URL, comme les liens de connexion, sont le pire cas.
  • Plusieurs serveurs, plusieurs agents. Chaque nouvelle machine, c'est un nœud Tailscale de plus, une entrée d'hôte de plus et une disposition tmux de plus à retenir.

Rien de tout cela n'est une raison d'éviter la stack. Elle est gratuite, fonctionne avec tous les agents, et vous maîtrisez chaque brique. C'est une raison de savoir à quoi vous vous engagez. Notre comparatif des apps de terminal SSH et de Maude détaille ce compromis.

Ou utiliser une app conçue pour ça

Maude remplace les couches client et session pour le travail avec les agents. Un petit daemon sur le serveur possède les sessions, qui continuent donc de tourner sans tmux, et l'app les affiche sous forme de chat, avec des cartes d'outils, des diffs, des notifications push avec Autoriser/Refuser et une boîte de réception. Vous pouvez garder Tailscale : Maude fonctionne avec les serveurs sur tailnet et sur réseau local, car le serveur se connecte lui-même au relais de Maude, avec SSH en solution de repli. Et quand vous avez besoin d'un shell, chaque session a un vrai terminal. Cela fonctionne avec Claude Code, Codex, OpenCode, Grok Build et Antigravity.

Questions fréquentes

tmux ou screen pour Claude Code ?
Les deux gardent une session en vie, mais tmux est le meilleur choix : Anthropic documente les réglages tmux dont Claude Code a besoin (allow-passthrough et extended-keys), il se découpe et se scripte plus facilement, et la plupart des guides de terminal sur téléphone le supposent.
mosh est-il encore nécessaire avec Tailscale ?
Ils résolvent des problèmes différents. Tailscale vous donne une adresse privée stable et aucun port ouvert ; votre connexion SSH par-dessus tombe quand même quand le téléphone change de réseau ou se met en veille un moment. mosh y survit. Si vous vous connectez surtout depuis un Wi-Fi stable, SSH via Tailscale plus tmux suffit.
Quel est le meilleur terminal iOS pour Claude Code ?
Blink Shell est l'option la plus orientée mosh sur iPhone et iPad, et Termius est le plus simple pour démarrer (offre gratuite, multiplateforme). Les deux fonctionnent avec Tailscale. Quel que soit votre choix, configurez une rangée de touches supplémentaire pour Échap, Ctrl et Maj+Tab.
Dois-je ouvrir des ports pour mosh ?
Sur une IP publique, oui : UDP 60000–61000. Sur un tailnet Tailscale, non — le trafic circule dans le tailnet et rien n'a besoin d'être exposé sur Internet.
Tailscale SSH fonctionne-t-il sur un serveur Mac mini ?
Seulement avec le build CLI open source tailscale/tailscaled sur macOS, selon la documentation de Tailscale. Avec l'app standard, utilisez plutôt le serveur SSH normal du Mac via le tailnet.

Oubliez la TUI sur votre téléphone

Gardez votre serveur et votre tailnet, remplacez le terminal par une app conçue pour les agents. iOS et Android.

Download Maude on the App Store Get Maude on Google Play