Stack DIY
tmux, mosh, dan Tailscale: stack DIY untuk agen coding di ponsel
Cara klasik menjalankan Claude Code atau Codex dari ponsel adalah aplikasi terminal, jaringan privat, koneksi yang tahan saat berpindah jaringan, dan sesi yang tahan terhadap semua hal lainnya. Setiap bagiannya gratis dan sudah dikenal luas. Berikut setup-nya dengan perintah yang persis, dan pandangan jujur tentang bagian yang merepotkan.
Jawaban singkat
Pasang Tailscale di server dan ponsel, lalu aktifkan tailscale set --ssh agar server hanya bisa dijangkau lewat tailnet privat Anda. Jalankan agen di dalam tmux new -A -s main agar tetap hidup setelah koneksi putus. Tambahkan set -g allow-passthrough on dan baris extended-keys ke ~/.tmux.conf untuk Claude Code. Sambungkan dengan mosh (mosh dev@server -- tmux new -A -s main) dari Blink, Termius, atau Termux. Cara ini berjalan baik. Titik lemahnya adalah TUI layar penuh di layar kecil dan tidak ada notifikasi push kecuali Anda menambahkan hook.
Jika Anda pernah mencari cara memakai Claude Code dari ponsel, kemungkinan Anda sudah melihat stack ini di belasan postingan blog. Itu karena memang berhasil. Tailscale memberi ponsel Anda jalur privat dan terenkripsi ke server tanpa port terbuka. mosh menjaga koneksi tetap hidup saat Anda berpindah dari Wi-Fi ke 4G atau mengunci ponsel. tmux menjaga agen tetap berjalan saat koneksinya benar-benar putus. Berikut cara menggabungkan ketiganya dengan benar.
Stack-nya
| Lapisan | Tool | Masalah yang diselesaikan | Lewati jika… |
|---|---|---|---|
| Jaringan | Tailscale (Tailscale SSH) | Menjangkau server secara privat, bahkan di balik NAT; tanpa port SSH publik; akses berbasis SSO | Server sudah punya SSH publik yang diamankan dan Anda puas dengannya |
| Transport | mosh | Tahan saat berpindah jaringan, sleep, dan sinyal buruk; local echo menyembunyikan latensi | Anda hanya tersambung dari jaringan yang stabil |
| Sesi | tmux | Agen tetap berjalan saat Anda terputus; beberapa window per proyek | Jangan pernah. Inilah lapisan yang paling penting. |
| Klien | Blink, Termius, Termux… | Terminal di ponsel | — |
Setup tmux
Pasang dan mulai sesi bernama yang bisa Anda sambungkan kembali dari mana saja:
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 membuat perintah yang sama berfungsi pertama kali dan setiap kali sesudahnya, jadi cocok disimpan sebagai snippet di aplikasi terminal ponsel Anda. Lalu beri tmux pengaturan yang dibutuhkan agen. Dokumentasi konfigurasi terminal Anthropic menyebut bahwa di dalam tmux, Shift+Enter malah mengirim pesan alih-alih menambah baris baru, dan notifikasi tidak pernah sampai ke terminal luar, kecuali Anda menambahkan baris-baris ini:
# ~/.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
Terapkan dengan tmux source-file ~/.tmux.conf. Bahkan dengan extended keys, banyak keyboard ponsel sama sekali tidak bisa mengirim Shift+Enter. Claude Code juga menerima Ctrl+J, atau \ diikuti Enter, untuk baris baru, dan keduanya berfungsi di terminal mana pun.
Gunakan satu window tmux per proyek atau per agen. Ctrl-b c membuka window baru dan Ctrl-b n pindah ke window berikutnya. Untuk beberapa sesi di repositori yang sama, beri masing-masing git worktree sendiri. Panduan 24/7 membahas hal itu dan apa yang terjadi saat reboot. Sesi tmux tidak bertahan setelah reboot.
mosh vs ssh
SSH biasa berjalan di atas satu koneksi TCP. Saat ponsel Anda berganti jaringan, atau iOS menangguhkan aplikasinya cukup lama, koneksi itu mati, dan Anda harus tersambung serta attach ulang. mosh login lewat SSH, menjalankan mosh-server di server, lalu beralih ke protokol UDP-nya sendiri, yang tetap berjalan meski IP berubah atau perangkat sleep. mosh juga menampilkan ketikan Anda secara lokal, jadi koneksi 200 ms tetap terasa responsif.
# 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 memakai port UDP 60000–61000. Lewat IP publik, Anda harus membukanya di firewall, misalnya dengan sudo ufw allow 60000:61000/udp plus firewall dari penyedia cloud Anda. Lewat Tailscale, trafiknya tetap di dalam tailnet, jadi tidak perlu port publik. Satu batasan: mosh hanya menyinkronkan layar yang terlihat, jadi tidak ada scrollback lewat mosh itu sendiri. Dokumentasi mosh sendiri menyarankan tmux atau screen untuk riwayat, satu alasan lagi untuk menjalankan keduanya.
Tailscale SSH
Tailscale menaruh server dan ponsel Anda di jaringan WireGuard privat (sebuah tailnet). Tailscale SSH melangkah lebih jauh: Tailscale menangani autentikasi SSH dengan identitas tailnet Anda, jadi Anda sama sekali tidak perlu membagikan kunci 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
Menurut dokumentasi Tailscale, tailscale set --ssh membuat tailscaled mengambil alih port 22 untuk trafik dari tailnet Anda. Klien SSH biasa mana pun lalu tersambung dengan ssh dev@my-server, memakai nama MagicDNS mesinnya. Beberapa detail:
- Check mode. Kebijakan default memakai
"action": "check", jadi sesekali Anda diminta autentikasi ulang di browser. URL login yang muncul di terminal itu wajar. - Platform server. Linux didukung penuh. Di macOS, hanya build CLI open-source
tailscale+tailscaledyang bisa menjadi server Tailscale SSH, jadi Mac mini dengan aplikasi dari App Store sebaiknya memakai SSH biasa lewat tailnet. - Tutup port publiknya. Setelah Anda memastikan server bisa dijangkau lewat tailnet, tutup port 22 publik di firewall penyedia Anda. Lakukan dalam urutan itu, dengan sesi kedua tetap terbuka, agar Anda tidak terkunci di luar.
Di ponsel, pasang aplikasi Tailscale, masuk ke tailnet yang sama, dan biarkan tetap tersambung. Aplikasi terminal Anda lalu menjangkau my-server seolah-olah ada di jaringan lokal Anda.
Klien iOS dan Android
| Klien | Platform | mosh | Catatan |
|---|---|---|---|
| Blink Shell | iPhone, iPad | Ya | Dibangun di sekitar mosh; dukungan keyboard fisik yang kuat di iPad. $19.99/tahun setelah uji coba dua minggu, menurut blink.sh. |
| Termius | iOS, Android, desktop | Ya | Tier Starter gratis sudah termasuk SSH dan mosh; sinkronisasi antar perangkat ada di Pro ($10/bulan ditagih tahunan, menurut termius.com/pricing) |
| Termux | Android | Ya (pkg install openssh mosh) | Userland Linux lengkap di ponsel; gratis dan open source |
| JuiceSSH | Android | Ya | Tercantum sebagai klien mosh di mosh.org |
Klien apa pun yang Anda pilih, siapkan baris tombol tambahan berisi Esc, Ctrl, Tab, dan panah. Claude Code memakai Esc untuk menginterupsi dan Shift+Tab untuk berganti mode izin, dan keduanya tidak ada di keyboard ponsel bawaan.
Di mana ia bermasalah
Stack-nya andal. Gesekannya ada di semua hal di sekitar keandalan itu.
- TUI desktop di layar 6 inci. Claude Code, Codex, dan agy dibuat untuk 100+ kolom. Di ponsel, Anda membaca diff yang terlipat, menggulir output tool dengan jempol, dan mencari-cari baris input.
- Tidak ada notifikasi push. Saat agen selesai atau butuh persetujuan, tidak ada yang memberi tahu Anda kecuali Anda menambahkan hook. Terminal hanya memberi notifikasi saat aplikasinya sedang di depan. Panduan menyetujui permintaan dari ponsel kami membahas hook ntfy yang biasa ditambahkan orang.
- Persetujuan terkubur di scrollback. Permintaan izin hanyalah beberapa baris di pane yang ramai. Jika Anda kembali setelah sejam, Anda harus mencarinya, membacanya, dan menjawabnya dengan tombol panah.
- Masalah background. iOS menangguhkan aplikasi terminal tak lama setelah Anda meninggalkannya. mosh pulih saat Anda kembali, tetapi aplikasinya tidak bisa memantau sesi untuk Anda selama berada di background.
- Salin dan tempel. Memilih teks melintasi tmux, mosh, dan terminal ponsel itu menyiksa. URL panjang, seperti link login, adalah kasus terburuknya.
- Beberapa server, beberapa agen. Setiap server baru berarti satu node Tailscale lagi, satu entri host lagi, dan satu tata letak tmux lagi yang harus diingat.
Semua ini bukan alasan untuk menghindari stack ini. Gratis, berfungsi dengan semua agen, dan Anda mengendalikan setiap bagiannya. Ini alasan untuk tahu apa yang Anda pilih. Perbandingan aplikasi terminal SSH dan Maude kami membahas kompromi ini secara rinci.
Atau pakai aplikasi yang dibuat untuk ini
Maude menggantikan lapisan klien dan sesi untuk pekerjaan agen. Daemon kecil di server memegang sesi, jadi sesi tetap berjalan tanpa tmux, dan aplikasinya menampilkannya sebagai chat, dengan kartu tool, diff, notifikasi push dengan Izinkan/Tolak, dan kotak masuk. Anda bisa tetap memakai Tailscale: Maude berfungsi dengan server di tailnet dan LAN karena server yang menghubungi relay Maude, dengan SSH sebagai cadangan. Dan saat Anda butuh shell, setiap sesi punya terminal sungguhan. Maude berfungsi dengan Claude Code, Codex, OpenCode, Grok Build, dan Antigravity.
Pertanyaan yang sering diajukan
tmux atau screen untuk Claude Code?
allow-passthrough dan extended-keys), tmux lebih mudah dipecah dan di-script, dan sebagian besar panduan terminal ponsel mengasumsikan tmux.