Власними силами
tmux, mosh і Tailscale: саморобний стек для агентів для коду на телефоні
Класичний спосіб запускати Claude Code чи Codex з телефона — термінальний застосунок, приватна мережа, підключення, що переживає роумінг, і сесія, що переживає все інше. Кожна частина безкоштовна й добре вивчена. Ось налаштування з точними командами — і чесний погляд на те, де стає боляче.
Коротка відповідь
Встановіть Tailscale на сервер і телефон, потім увімкніть tailscale set --ssh, щоб сервер був доступний лише через вашу приватну tailnet. Запускайте агента всередині tmux new -A -s main, щоб він пережив ваше підключення. Для Claude Code додайте set -g allow-passthrough on і рядки extended-keys до ~/.tmux.conf. Підключайтеся через mosh (mosh dev@server -- tmux new -A -s main) з Blink, Termius чи Termux. Це добре працює. Слабкі місця — повноекранний TUI на малому екрані й відсутність push-сповіщень, якщо не додати хуки.
Якщо ви шукали, як користуватися Claude Code з телефона, то напевно бачили цей стек у десятку статей. Бо він працює. Tailscale дає телефону приватний зашифрований шлях до сервера без відкритих портів. mosh зберігає підключення, коли ви переходите з Wi-Fi на 4G чи блокуєте телефон. tmux не дає агенту зупинитися, коли підключення все ж обривається. Ось як правильно зібрати всі три разом.
Стек
| Рівень | Інструмент | Що розв'язує | Можна пропустити, якщо… |
|---|---|---|---|
| Мережа | Tailscale (Tailscale SSH) | Приватний доступ до сервера навіть за NAT; немає публічного SSH-порту; доступ через SSO | На сервері вже налаштовано захищений публічний SSH, і вас це влаштовує |
| Транспорт | mosh | Переживає роумінг, сон і поганий зв'язок; локальне відлуння приховує затримку | Ви підключаєтеся лише зі стабільної мережі |
| Сесія | tmux | Агент працює далі, коли ви від'єднуєтеся; кілька вікон на проєкт | Ніколи. Це найважливіший рівень. |
| Клієнт | Blink, Termius, Termux… | Термінал на телефоні | — |
Налаштування tmux
Встановіть його й запустіть іменовану сесію, до якої можна під'єднатися звідусіль:
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 та сама команда працює і вперше, і щоразу потім, тож її зручно зберегти сніпетом у термінальному застосунку на телефоні. Потім дайте tmux налаштування, потрібні агентам. Документація Anthropic щодо налаштування термінала каже, що всередині tmux Shift+Enter надсилає повідомлення, а не додає перенесення рядка, і сповіщення ніколи не доходять до зовнішнього термінала, якщо не додати ці рядки:
# ~/.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
Застосуйте їх командою tmux source-file ~/.tmux.conf. Навіть з extended keys багато клавіатур телефонів узагалі не вміють надсилати Shift+Enter. Claude Code також приймає Ctrl+J або \ із наступним Enter для перенесення рядка, і обидва працюють у будь-якому терміналі.
Використовуйте одне вікно tmux на проєкт чи на агента. Ctrl-b c відкриває нове вікно, Ctrl-b n переходить до наступного. Для кількох сесій в одному репозиторії дайте кожній свій git worktree. Про це й про те, що відбувається під час перезавантаження, розповідає посібник із роботи 24/7. Сесії tmux перезавантаження не переживають.
mosh чи ssh
Звичайний SSH працює поверх одного TCP-з'єднання. Коли телефон змінює мережу або iOS на час призупиняє застосунок, це з'єднання помирає, і ви перепідключаєтеся й знову чіпляєтеся до сесії. mosh входить по SSH, запускає mosh-server на сервері, а потім перемикається на власний протокол поверх UDP, що працює далі під час зміни IP і сну. Він також локально показує те, що ви друкуєте, тож навіть канал із затримкою 200 мс відчувається чуйним.
# 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 використовує UDP-порти 60000–61000. На публічному IP їх довелося б відкрити у файрволі, наприклад через sudo ufw allow 60000:61000/udp плюс файрвол вашого хмарного провайдера. Через Tailscale трафік лишається всередині tailnet, тож публічний порт не потрібен. Одне обмеження: mosh синхронізує лише видимий екран, тож прокручування історії через сам mosh немає. Документація mosh для історії радить tmux або screen — ще одна причина запускати обидва.
Tailscale SSH
Tailscale поміщає ваш сервер і телефон у приватну мережу WireGuard (tailnet). Tailscale SSH іде на крок далі: автентифікацію SSH бере на себе Tailscale за вашою ідентичністю в tailnet, тож 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
Згідно з документацією Tailscale, tailscale set --ssh змушує tailscaled перехоплювати порт 22 для трафіку з вашої tailnet. Будь-який звичайний SSH-клієнт потім підключається через ssh dev@my-server, використовуючи ім'я машини в MagicDNS. Деякі деталі:
- Режим check. Політика за замовчуванням використовує
"action": "check", тож час від часу вас проситимуть знову пройти автентифікацію в браузері. Поява посилання для входу в терміналі — нормальна річ. - Серверні платформи. Linux підтримується повністю. На macOS сервером Tailscale SSH може бути лише відкрита збірка CLI
tailscale+tailscaled, тож Mac mini із застосунком з App Store має використовувати звичайний SSH через tailnet. - Закрийте публічний порт. Переконавшись, що до машини можна дістатися через tailnet, закрийте публічний порт 22 у файрволі провайдера. Робіть це саме в такому порядку й із відкритою другою сесією, щоб не замкнути себе ззовні.
На телефоні встановіть застосунок Tailscale, увійдіть у ту саму tailnet і залиште його під'єднаним. Тоді ваш термінальний застосунок діставатиметься до my-server так, ніби він у вашій локальній мережі.
Клієнти для iOS та Android
| Клієнт | Платформи | mosh | Примітки |
|---|---|---|---|
| Blink Shell | iPhone, iPad | Так | Побудований навколо mosh; добра підтримка апаратної клавіатури на iPad. $19.99 на рік після двотижневого пробного періоду, за даними blink.sh. |
| Termius | iOS, Android, комп'ютер | Так | Безкоштовний рівень Starter включає SSH і mosh; синхронізація між пристроями — у Pro ($10 на місяць при оплаті за рік, за даними termius.com/pricing) |
| Termux | Android | Так (pkg install openssh mosh) | Повноцінне користувацьке середовище Linux на телефоні; безкоштовно й з відкритим кодом |
| JuiceSSH | Android | Так | Зазначений на mosh.org як клієнт mosh |
Хоч який клієнт ви оберете, налаштуйте додатковий ряд клавіш з Esc, Ctrl, Tab і стрілками. Claude Code використовує Esc для переривання й Shift+Tab для перемикання режимів дозволів, а ні того, ні того немає на стандартній клавіатурі телефона.
Де все ламається
Стек надійний. Тертя — в усьому, що навколо надійності.
- Настільний TUI на 6-дюймовому екрані. Claude Code, Codex і agy розраховані на 100+ колонок. На телефоні ви читаєте перенесені diff, прокручуєте вивід інструментів великим пальцем і шукаєте рядок введення.
- Немає push-сповіщень. Коли агент закінчує чи чекає підтвердження, ніщо вам про це не повідомить, якщо не додати хук. Термінал сповіщає лише поки застосунок на передньому плані. Про хуки ntfy, які люди прикручують збоку, — у нашому посібнику про підтвердження запитів із телефона.
- Підтвердження тонуть в історії. Запит дозволу — це кілька рядків у завантаженій панелі. Повернувшись за годину, вам доведеться знайти його, прочитати й відповісти стрілками.
- Проблема фону. iOS незабаром призупиняє термінальні застосунки, після того як ви з них виходите. mosh відновлюється, коли ви повертаєтеся, але поки застосунок у фоні, стежити за сесією замість вас він не може.
- Копіювання й вставлення. Виділяти текст через tmux, mosh і термінал на телефоні — мука. Довгі URL, як-от посилання для входу, — найгірший випадок.
- Кілька серверів, кілька агентів. Кожна нова машина — це ще один вузол Tailscale, ще один запис хоста й ще одне компонування tmux, яке треба пам'ятати.
Ніщо з цього не причина уникати стека. Він безкоштовний, працює з будь-яким агентом, і ви контролюєте кожну частину. Це причина знати, на що ви підписуєтеся. Наше порівняння SSH-терміналів і Maude докладно розбирає цей компроміс.
Або скористайтеся застосунком, створеним для цього
Maude замінює рівні клієнта й сесії для роботи з агентами. Невеликий демон на сервері володіє сесіями, тож вони працюють далі без tmux, а застосунок показує їх як чат — із картками інструментів, diff, push-сповіщеннями з «Дозволити/Відхилити» і вхідними. Tailscale можна залишити: Maude працює із серверами в tailnet і локальній мережі, бо сервер сам підключається до ретранслятора Maude, а SSH слугує запасним варіантом. А коли потрібна оболонка, у кожній сесії є справжній термінал. Працює з Claude Code, Codex, OpenCode, Grok Build та Antigravity.
Часті запитання
tmux чи screen для Claude Code?
allow-passthrough і extended-keys), його простіше розділяти й автоматизувати, і більшість посібників із терміналів на телефоні виходять із нього.