Власними силами

tmux, mosh і Tailscale: саморобний стек для агентів для коду на телефоні

Класичний спосіб запускати Claude Code чи Codex з телефона — термінальний застосунок, приватна мережа, підключення, що переживає роумінг, і сесія, що переживає все інше. Кожна частина безкоштовна й добре вивчена. Ось налаштування з точними командами — і чесний погляд на те, де стає боляче.

tmux, mosh і Tailscale: саморобний стек для агентів для коду на телефоні

Коротка відповідь

Встановіть 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 ShelliPhone, iPadТакПобудований навколо mosh; добра підтримка апаратної клавіатури на iPad. $19.99 на рік після двотижневого пробного періоду, за даними blink.sh.
TermiusiOS, Android, комп'ютерТакБезкоштовний рівень Starter включає SSH і mosh; синхронізація між пристроями — у Pro ($10 на місяць при оплаті за рік, за даними termius.com/pricing)
TermuxAndroidТак (pkg install openssh mosh)Повноцінне користувацьке середовище Linux на телефоні; безкоштовно й з відкритим кодом
JuiceSSHAndroidТакЗазначений на 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?
Сесію зберігають обидва, але tmux — кращий вибір: Anthropic документує налаштування tmux, потрібні Claude Code (allow-passthrough і extended-keys), його простіше розділяти й автоматизувати, і більшість посібників із терміналів на телефоні виходять із нього.
Чи потрібен mosh, якщо є Tailscale?
Вони розв'язують різні задачі. Tailscale дає стабільну приватну адресу й відсутність відкритих портів; SSH-підключення поверх нього однаково рветься, коли телефон змінює мережу чи надовго засинає. mosh це переживає. Якщо ви здебільшого підключаєтеся зі стабільного Wi-Fi, вистачить SSH через Tailscale плюс tmux.
Який термінал для iOS найкраще підходить для Claude Code?
Blink Shell — найбільш орієнтований на mosh варіант для iPhone та iPad, а з Termius найпростіше почати (безкоштовний рівень, кросплатформність). Обидва працюють із Tailscale. Хоч що ви оберете, налаштуйте додатковий ряд клавіш для Esc, Ctrl і Shift+Tab.
Чи треба відкривати порти для mosh?
На публічному IP — так: UDP 60000–61000. Через tailnet Tailscale — ні: трафік іде всередині tailnet, і нічого не треба відкривати в інтернет.
Чи працює Tailscale SSH на сервері Mac mini?
Згідно з документацією Tailscale, лише з відкритою збіркою CLI tailscale/tailscaled на macOS. Зі стандартним застосунком використовуйте натомість звичайний SSH-сервер Mac через tailnet.

Обійдіться без TUI на телефоні

Залиште свій сервер і tailnet, а термінал замініть застосунком, створеним для агентів. iOS та Android.

Download Maude on the App Store Get Maude on Google Play