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.
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
| Couche | Outil | Ce qu'il résout | À ignorer si… |
|---|---|---|---|
| Réseau | Tailscale (Tailscale SSH) | Joindre le serveur en privé, même derrière un NAT ; pas de port SSH public ; accès adossé au SSO | Le serveur a déjà un SSH public durci et cela vous convient |
| Transport | mosh | Survit aux changements de réseau, à la veille et au mauvais signal ; l'écho local masque la latence | Vous ne vous connectez que depuis un réseau stable |
| Session | tmux | L'agent continue de tourner quand vous vous déconnectez ; plusieurs fenêtres par projet | Jamais. C'est la couche qui compte le plus. |
| Client | Blink, 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+tailscaledpeut 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
| Client | Plateformes | mosh | Remarques |
|---|---|---|---|
| Blink Shell | iPhone, iPad | Oui | Conç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. |
| Termius | iOS, Android, ordinateur | Oui | L'offre gratuite Starter inclut SSH et mosh ; la synchronisation entre appareils est dans Pro ($10/mois en annuel, selon termius.com/pricing) |
| Termux | Android | Oui (pkg install openssh mosh) | Un environnement Linux complet sur le téléphone ; gratuit et open source |
| JuiceSSH | Android | Oui | Listé 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 ?
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.