Claude Code sa Phone Gamit ang VPS at tmux
Alamin kung paano patakbuhin ang Claude Code sa VPS gamit ang tmux, SSH keys, mosh para sa putol-putol na mobile data, at tamang phone keyboard.
Claude Code mula sa phone: kung paano talaga ito gumagana
Ang Claude Code mula sa phone ay hindi isang mobile app. Gumagana ang Claude Code sa isang VPS (virtual private server), sa loob ng isang tmux session na nananatiling bukas. Kumokonekta ang phone mo sa session na iyon sa pamamagitan ng SSH (secure shell) habang nakabukas ito sa screen. Kapag isinara mo ang app, patuloy na gumagana ang agent dahil hindi kailanman tumatakbo ang proseso sa phone.
Iyan ang buong disenyo. Sinususpinde ng operating system ng phone ang app ilang segundo matapos kang lumipat dito, kaya humihinto ang anumang matagal na job na sinimulan sa phone. Nagkakaroon din ito ng bagong network address tuwing lumilipat ka mula wifi papunta sa mobile data. Nawawala ang dalawang problemang ito kapag sa server tumatakbo ang proseso at screen lang ang ipinapakita ng phone.
Apat na bagay ang kailangan mo sa server: tmux para panatilihin ang session, SSH keys para makapasok, mosh para sa mga pagbabago sa network, at Claude Code mismo. Sa phone, kailangan mo ng isang terminal app na may key row na maaabot mo.
Mga kailangan mo sa VPS
Sapat na ang isang maliit na Ubuntu 24.04 box para sa mga bahagi tungkol sa SSH at tmux. Mas mataas ang kailangan ng Claude Code. Ang mga opisyal na requirement noong July 2026 ay Ubuntu 20.04 o mas bago sa x64 o ARM64 processor, na may 4 GB o higit pang RAM. Naii-install ito sa 1 GB plan, ngunit nawawala ang process sa kernel kapag mataas ang load. Kailangan din ng Claude Code ng bayad na Claude account (Pro, Max, Team o Enterprise) o Console account na may API access, dahil hindi ito kasama sa libreng Claude.ai plan.
I-set up ang box gamit ang ordinaryong user na may sudo, hindi bilang root. Kung bago ang server, gawin muna ang mga hakbang sa unang sampung minuto sa bagong VPS, dahil mas madaling gawin ang mga pagbabago sa SSH sa gabay na ito kapag mayroon nang user at firewall.
sudo apt update && sudo apt install -y tmux mosh
curl -fsSL https://claude.ai/install.sh | bash
claude --versionInilalagay ng installer ang binary sa ~/.local/bin/claude, at nagpi-print ang claude --version ng linyang tulad ng 2.1.211 (Claude Code). Kung magpi-print ito ng command not found, wala pa sa iyong PATH ang directory na iyon: mag-log out, mag-log in muli, pagkatapos ay magsagawa ng check gamit ang command -v claude. Nagpi-print ang claude doctor ng diagnostics para sa installation at settings nang hindi nagsisimula ng session.
Mag-log in nang isang beses ngayon mula sa laptop, bago ka umasa sa phone. Patakbuhin ang claude sa isang project directory at sundin ang login prompt. Hihilingin sa iyo ng proseso na magbukas ng URL sa browser at ibalik ang isang code sa terminal. Mabagal gawin ito sa phone dahil kailangan mong magpalipat-lipat sa dalawang app. Gawin ito nang isang beses gamit ang aktuwal na keyboard, at mananatili ang credentials sa server.
Simulan ang Claude Code sa loob ng tmux para hindi ito mapatigil kapag naputol ang koneksyon
tmux new -s claude
cd ~/projects/api
claudeMag-detach gamit ang Ctrl-b at pagkatapos ay d. Ipi-print ng tmux ang [detached (from session claude)] at ibabalik ka sa shell. Maaari mo nang isara ang app, mawalan ng signal, o ilagay ang telepono sa iyong bulsa. Magpapatuloy na tumakbo ang pane.
tmux ls
tmux attach -t claudeAng tmux ls ay nagpi-print ng isang linya para sa bawat session, gaya ng claude: 1 windows (created Thu Jul 30 09:14:02 2026). Ibabalik ka ng tmux attach -t claude sa eksaktong lugar kung saan ka huminto, kasama ang hindi pa tapos na pag-edit.
Gumagana ito dahil nagpapatakbo ang tmux ng sarili nitong server process. Anak ng server na iyon ang iyong shell at ang Claude Code, hindi ng sshd. Kapag natapos ang SSH connection, ipinapadala ng kernel ang hangup signal na SIGHUP sa mga prosesong nakakabit sa connection na iyon. Hindi kabilang dito ang tmux server. Kung walang tmux, ihihinto ng parehong screen lock na pumuputol sa iyong koneksyon ang Claude Code habang nasa kalagitnaan ito ng tool call. Ipinapaliwanag nang mas detalyado ng Pagpapatakbo ng Claude Code sa isang VPS sa loob ng tmux ang layout ng session.
Patakbuhin ang tmux sa server, hindi sa telepono. Kapag nag-type ka ng tmux sa loob ng session kung saan nakakonekta ka na, ipi-print nito ang sessions should be nested with care, unset $TMUX to force. Kapag pinilit mo itong patakbuhin, magkakaroon ka ng dalawang prefix key na kailangang pagpilian.
Awtomatikong mag-attach sa bawat login
Nakasanayan nang nakakapagod i-type ang attach command gamit ang touch keyboard. Idagdag ito sa dulo ng ~/.profile sa server:
if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
exec tmux new-session -A -s claude
fiIna-attach ng new-session -A -s claude ang sarili nito sa session na pinangalanang claude kung mayroon ito, at ginagawa ito kung wala pa, kaya isang command lang ang sumasaklaw sa parehong sitwasyon. Pinapalitan ng exec ang login shell ng tmux, kaya kapag lumabas ka sa tmux, isinasara ang connection sa halip na ibalik ka sa walang laman na prompt. Kapag kailangan mo ng plain shell, laktawan ang file: ssh you@server -t "bash --noprofile".
Ilagay ito sa ~/.profile, hindi sa ~/.bashrc. Tumatakbo rin ang ~/.bashrc para sa mga non-interactive session, kaya nasisira ang file transfers: binabasa ng scp at sftp ang hindi inaasahang output bilang protocol data at nagfa-fail na may Received message too long. Tumatakbo lang ang ~/.profile para sa login shells, na siyang uri ng interactive SSH session.
Dito rin idinaragdag ng Ubuntu ang ~/.local/bin sa PATH gamit ang ~/.profile. Kung gumagana ang claude kaagad pagkatapos ng login ngunit sinasabi ng shell sa loob ng tmux na command not found, iyon ang dahilan ng pagkakasunod-sunod. Kaya simulan ang tmux mula sa login shell gaya sa itaas, sa halip na mula sa script na lumalaktaw sa profile.
iOS: Termius o Blink Shell
Parehong gumagamit ang dalawang app ng SSH at mosh, at parehong nag-iimbak ng mga key sa app. Ang kaibahan ay nasa interface.
Command-driven ang Blink Shell. Sa prompt nito, i-type ang ssh you@server o mosh you@server, gamit ang parehong syntax ng desktop terminal. Buksan ang settings sa pag-type ng config, at gumawa ng key pair sa seksyong Keys.
Form-driven ang Termius. Punan ang host entry, pagkatapos ay palitan ang host mula SSH tungo sa Mosh sa mga detalye ng host. May sarili itong mosh implementation at sinusuportahan ang mosh 1.3.0 at mas bago, kaya kailangan pa ring naka-install sa server ang mosh package.
Sa parehong app, gawin ang key sa loob mismo ng app, at huwag kailanman kumopya ng umiiral na private key papunta sa phone. Ipinapakita ng app ang public half, na siyang iisang linyang idinaragdag mo sa ~/.ssh/authorized_keys sa server. Sinasaklaw ng Mga SSH key bawat device at kung paano bawiin ang mga ito ang pagbibigay ng pangalan at proseso ng pagbawi, na mas mahalaga sa phone kaysa sa laptop.
I-on ang sariling biometric o passcode lock ng terminal app. Kung wala nito, ang naka-unlock na phone ay nagbibigay ng bukas na shell sa server mo habang gising ang screen.
Android: Termux
pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pubAng Termux ay naglalaman ng OpenSSH at mosh sa sarili nitong repository, kaya gumagana ang ssh, ssh-keygen at mosh tulad ng sa desktop. Idagdag ang naka-print na linya ng public key sa ~/.ssh/authorized_keys sa server, pagkatapos ay kumonekta gamit ang mosh you@server.
Walang Esc key at Ctrl key ang on-screen keyboard ng Android, at kailangan ng Claude Code ang dalawang ito. Maaaring magpakita ang Termux ng sarili nitong key row. Maglagay ng isang linya sa ~/.termux/termux.properties:
extra-keys = [['ESC','|','/','HOME','UP','END','PGUP'],['TAB','CTRL','ALT','LEFT','DOWN','RIGHT','PGDN']]Pagkatapos, patakbuhin ang termux-reload-settings at lilitaw ang row sa itaas ng keyboard. Sa parehong reload, makikita rin ang monospace TrueType font na inilagay sa ~/.termux/font.ttf.
Maaaring ihinto ng Android ang Termux kapag tumatakbo ito sa background, ngunit dito, reconnect lang ang kailangan. Nasa server ang session at ang agent.
Bakit nagfa-freeze ang terminal kapag lumalabas ako sa wifi range, at ano ang inaayos ng mosh?
Ang SSH connection ay isang TCP (transmission control protocol) connection, at kinikilala ang TCP connection gamit ang parehong address at parehong port. Kapag lumabas ka sa wifi range, nakakakuha ang phone ng bagong address mula sa mobile network, kaya wala nang katumbas na connection ang lumang connection sa magkabilang panig. Walang nag-aabiso tungkol dito. Tumitigil lang sa pagtugon ang terminal hanggang sa tuluyang sumuko ang TCP, at pagkatapos ay ipinapakita ng ssh ang client_loop: send disconnect: Broken pipe. Para agad tapusin ang nag-freeze na session, pindutin ang Enter, pagkatapos ang ~, at pagkatapos ang ..
Inaalis ng mosh (mobile shell) ang ganitong failure mode. Isang beses nitong ginagamit ang SSH para mag-login at magsimula ng mosh-server process, binabasa ang UDP (user datagram protocol) port na pinili ng server, at isinasara ang SSH connection. Pagkatapos nito, nagpapalitan ang dalawang panig ng UDP datagrams na authenticated gamit ang shared session key, kaya ang session ay kinikilala gamit ang key na iyon at hindi gamit ang iyong address. Kapag nagbago ang address, nagpapatuloy lang ang session. Lokal ding ipinapakita ng mosh ang iyong tina-type at nire-repaint ang screen kapag iba ang ipinapadala ng server. Kaya nananatili itong magagamit kahit mabagal ang mobile link.
Gumagamit ang mosh ng UDP port sa pagitan ng 60000 at 61000, kaya buksan ang range na iyon:
sudo ufw allow 60000:61000/udp
sudo ufw statusAng Pagbubukas ng mga port gamit ang ufw ang naglalaman ng iba pang bahagi ng firewall configuration. Kung may hiwalay na network firewall ang iyong provider sa control panel nito, idagdag din doon ang parehong range. Hindi maaapektuhan ng ufw rule ang filter na nasa harap ng machine.
Karaniwan ang dalawang mosh failure. Kapag nagtagumpay ang login ngunit pagkatapos ay nag-hang at ipinakita ang Nothing received from server on UDP port 60001., may humaharang sa UDP range sa pagitan ng phone at server. Kapag nag-ulat ang connection na hindi nakita ang mosh-server, nawawala ang package sa server o wala ito sa login PATH. I-install ito, o direktang tukuyin ito gamit ang mosh --server=/usr/bin/mosh-server you@server.
Hindi rin tumatakbo ang mosh kapag hindi UTF-8 ang login locale, at ipinapaalam nito iyon: mosh-server needs a UTF-8 native locale to run. Ayusin ang locale sa server, hindi sa phone.
locale
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8May dalawang bagay na hindi ginagawa ng mosh. Ayon sa README nito, hindi sinusuportahan ng mosh ang X forwarding o ang mga non-interactive na paggamit ng SSH, kabilang ang port forwarding. Kaya para i-preview ang web app na kasisimula lang ng Claude Code, plain ssh -L 8080:127.0.0.1:8080 you@server pa rin ang kailangan. Nagsi-synchronize rin ito ng nakikitang screen lamang, kaya wala itong sariling scrollback. Walang epekto ang limitasyong ito rito dahil pinapanatili ng tmux ang scrollback: Ctrl-b pagkatapos ay [ para pumasok sa copy mode, mag-scroll gamit ang drag o arrow keys, at pindutin ang q para lumabas.
Gawing magagamit ang screen ng telepono
Apat na linya sa ~/.tmux.conf sa server ang gumagawa ng karamihan ng trabaho:
set -g mouse on
set -g status-position top
set -g default-terminal "tmux-256color"
set -g history-limit 20000Ginagawang scroll ng mouse on ang pag-drag sa touch screen at ginagawang pagpili ng pane o window ang pag-tap. Pinapalitan nito ang karamihan ng prefix key na mahirap i-type. Inililipat ng status-position top ang tmux status line mula sa ibabang gilid, kung saan natatakpan ito ng on-screen keyboard at suggestion bar nito. Mahalaga ang default-terminal dahil kung wala ito, ipinapakilala ng tmux ang isang screen terminal sa Claude Code. Dahil dito, mas hindi maayos ang mga kulay at box drawing kaysa kinakailangan. Kung tumanggi namang magsimula ang tmux gamit ang missing or unsuitable terminal: tmux-256color, nawawala ang terminfo entry: sudo apt install ncurses-term.
Apat na key lang ang kailangang matutuhan para maging maginhawa ang iba.
- Ini-interrupt ng
Escang Claude habang bumubuo ito ng sagot at pinapanatili ang nagawa na. Ito ang key na dapat pinakamalapit sa iyong hinlalaki. - Ini-interrupt din ng
Ctrl+Cang kasalukuyang operation. Sa idle prompt, nililinis ng unang pagpindot ang input, at lumalabas sa Claude Code ang ikalawang pagpindot. Kaya mas marahas itong tool. - Dalawang beses pindutin ang
Escpara linisin ang draft prompt. Kapag walang laman ang prompt, binubuksan naman nito ang rewind menu. - Para sa multi-line prompt, i-type ang
\at pagkatapos ay pindutin ang Enter. Gumagana ang paraang ito sa bawat terminal. Native lang ang Shift+Enter sa maikling listahan ng desktop terminal, at wala rito ang mga mobile client.
Iwasan ang split pane. Ang telepono kapag portrait ay humigit-kumulang 40 column ang lapad. Kaya nag-iiwan ang vertical split ng 20 column bawat pane, at nagiging magulong balot ng linya ang bawat diff. Sa halip, gumamit ng tmux window: gumagawa ng isa ang Ctrl-b c at lumilipat sa susunod ang Ctrl-b n. Itagilid ang telepono kapag kailangan mong basahin nang maayos ang diff.
Kadalasang problema sa context ang mahabang session sa maliit na screen. Kaya mainam basahin ang pamamahala sa context window ng Claude Code bago subukang magtrabaho nang buong araw habang nasa tren.
I-lock down: keys lang, walang passwords
May hawak na ngayong key ang phone para sa machine na nag-e-edit ng code mo at nagpapatakbo ng commands. I-off ang password authentication. Mas ligtas ang drop-in file kaysa direktang mag-edit ng sshd_config, dahil isinasama ng Ubuntu's sshd_config ang /etc/ssh/sshd_config.d/*.conf sa itaas, at ginagamit ang unang value na makita para sa isang setting.
sudo tee /etc/ssh/sshd_config.d/99-phone.conf >/dev/null <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
EOF
sudo sshd -t && sudo systemctl reload sshPino-parse ng sshd -t ang config at walang ipinapakitang output kapag valid ito. Kapag nilaktawan mo ito, isang typo lang ang dahilan para mabigo ang sshd sa reload. Panatilihing bukas ang kasalukuyan mong session at mag-test mula sa pangalawang connection bago ka magsara ng anuman, dahil ang maling key ay magbibigay sa iyo ng Permission denied (publickey). at, kapag naka-off ang passwords, walang fallback. Ang recovery path sa puntong iyon ay ang console ng provider mo.
Bigyan ng sarili nitong key ang bawat device. Kapag nawala ang phone, isang linya lang ang tatanggalin mo mula sa ~/.ssh/authorized_keys, at patuloy na gagana ang laptop mo. Kapag iisang shared key ang gamit, kailangan mong palitan ang key sa bawat device na pagmamay-ari mo.
Kung ililipat mo ang SSH sa ibang port sa Ubuntu 24.04, tandaan na nasa ssh.socket ang listener, kaya walang epekto ang Port line kapag mag-isa ito. Patakbuhin ang sudo systemctl edit ssh.socket, i-clear ang default gamit ang walang-lamang ListenStream=, pagkatapos ay itakda ang port mo sa susunod na linya. Sinasaklaw ng Pagpapatibay ng SSH sa isang VPS iyon at ang iba pang bahagi ng attack surface.
Kaunti lang ang idinadagdag na seguridad ng fail2ban para sa SSH kapag naka-off ang passwords, dahil hindi talaga matatanggap ang nahulaang password. Ang idinadagdag nito ay mas tahimik na logs, kaya madaling mapansin ang totoong pagtatangkang mag-login.
Ang mas matibay na opsyon ay panatilihing hindi naa-access ng public internet ang SSH. Ilagay ang server sa likod ng WireGuard VPN na ikaw mismo ang nagho-host, i-on ang tunnel sa phone kapag kailangan, at bigyan ang sshd ng ListenAddress sa tunnel lang. Gumagana ang mosh sa tunnel dahil UDP ang gamit ng magkabilang panig. Isang paalala: nagdaragdag ng packet overhead ang tunnel, kaya kung humihinto ang malalaking transfer, babaan ang MTU (maximum transmission unit) sa WireGuard config ng phone.
Huling punto tungkol sa ganitong paraan ng pagtatrabaho. Mula sa phone, inaaprubahan mo ang mga permission prompt sa screen na ilang linya lang ng diff ang ipinapakita sa bawat pagkakataon. Dahilan ito para panatilihin ang mga guardrail, hindi para i-off ang mga ito. Sinasaklaw ng Ligtas na pagpapatakbo ng Claude Code sa isang VPS ang mga limitasyon sa user at directory na dapat itakda bago maging touchscreen ang pangunahing paraan ng pag-access mo.
When you reattach and something is wrong
tmux attach printing no server running on /tmp/tmux-1000/default means the tmux server is gone, which nearly always means the machine rebooted. Check with uptime. Kernel updates from automatic security updates reboot the box, and a rebooted box has no tmux session, so treat any Claude Code run as something you can restart.
can't find session: claude is different. The tmux server is running but that name is not there. tmux ls shows what does exist.
If you attach and find a plain shell prompt where Claude Code used to be, the process ended without the session ending. Look at dmesg -T | tail for a line like Out of memory: Killed process 4821 (claude), which is what a box below the 4 GB requirement does during a large edit. No such line means Claude Code exited on its own, and the shell's scrollback above the prompt holds the reason.
A window that comes back tiny, with unused space around it, means two clients are attached at different sizes, because tmux sizes a window to fit the smallest attached client. Your laptop is still holding the session at 200 columns wide while the phone asks for 40. Detach the others as you attach: tmux attach -d -t claude.
FAQ
Maaari ko bang patakbuhin ang Claude Code sa mismong phone sa halip na sa isang VPS?
Hindi. Ang mga suportadong platform noong July 2026 ay macOS, Windows, Ubuntu 20.04 o mas bago, Debian 10 o mas bago, at Alpine 3.19 o mas bago, na may 4 GB o higit pang RAM. Wala sa listahang iyon ang Android at iOS. Pinapatulog din ng phone ang mga app nito at palaging binabago ang network address, na hindi kayang tiisin ng mahabang agent run. Patakbuhin ito sa isang server at gamitin ang phone bilang display.
Mananatili ba ang session kung isasara ko ang app o mawawalan ako ng signal?
Oo, at dalawang magkahiwalay na bahagi ang gumagawa nito. Pinananatili ng tmux na tumatakbo ang proseso sa server, kaya walang namamatay kapag naputol ang koneksyon. Pinananatili naman ng mosh ang mismong koneksyon kahit magbago ang address, kaya ang paglipat mula wifi patungo sa mobile data ay hindi man lang nangangailangan ng reconnect. Kapag plain SSH ang gamit at walang tmux, nagpapadala ang naputol na koneksyon ng SIGHUP at humihinto ang Claude Code sa kalagitnaan ng task.
Bakit kumokonekta ang mosh pero walang ipinapakita?
Ang login na matagumpay ngunit pagkatapos ay nagha-hang na may Nothing received from server on UDP port 60001. ay nangangahulugang hindi bukas ang UDP 60000 hanggang 61000. Idagdag ang range sa ufw, at idagdag din ito sa network firewall ng iyong provider, na hiwalay na control sa karamihan ng mga panel. Kung iniulat naman ng mosh na hindi nakita ang mosh-server, nawawala ang package sa server: sudo apt install mosh.
Paano ko maaantala ang Claude Code gamit ang keyboard na walang Esc key?
Magdagdag ng key row. Kino-configure ito ng Termux gamit ang extra-keys sa ~/.termux/termux.properties, at parehong may kasamang row ang Termius at Blink na maaari mong i-edit sa settings. Inaantala ng Esc ang kasalukuyang response at pinananatili ang natapos nang trabaho. Umaantala rin ang Ctrl+C, ngunit kapag pinindot ito nang dalawang beses habang idle ang prompt, lumalabas sa Claude Code. Kaya Esc muna ang gamitin.
Ligtas na ba para dito ang pagbubukas ng SSH sa internet?
Kapag naka-off ang password authentication, ang tanging credential na maaaring magtagumpay ay isang key na hindi umaalis sa iyong mga device. Makatuwirang panganib ito para sa isang machine na maaari mong i-rebuild. Gumamit ng hiwalay na key para sa bawat device upang ang pagkawala ng phone ay isang linya lamang sa authorized_keys ang kailangang alisin. Kung mas gusto mong hindi tumanggap ng koneksyon sa public port, ilagay ang machine sa likod ng WireGuard at paganahin ang sshd na makinig sa tunnel address.