Claude Code sa Phone Gamit ang VPS at tmux
Hindi mobile app ang Claude Code: tumatakbo ito sa VPS sa loob ng tmux. Alamin ang SSH keys, mosh para sa putol-putol na data, at keyboard fixes sa phone.
Claude Code mula sa phone: kung paano ito aktuwal na gumagana
Ang Claude Code mula sa phone ay hindi isang mobile app. Tumatakbo ang Claude Code sa isang VPS (virtual private server), sa loob ng isang tmux session na nananatiling bukas. Nagbubukas ang phone mo ng SSH (secure shell) connection papunta sa session na iyon habang nakikita mo ito. Kapag isinara mo ang app, patuloy na gumagana ang agent dahil hindi kailanman tumatakbo ang process sa phone.
Iyan ang buong disenyo. Sinususpinde ng operating system ng phone ang isang app ilang segundo matapos kang lumipat dito, kaya humihinto ang anumang mahabang 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 tumatakbo ang process sa server at ipinapakita lamang ng phone ang screen.
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 ang Claude Code mismo. Sa phone, isang terminal app lamang ang kailangan, kasama ang key row na madali mong maa-access.
Mga kailangan mo sa VPS
Sapat na ang maliit na Ubuntu 24.04 box para sa mga bahagi tungkol sa SSH at tmux. Mas mataas ang kailangan ng Claude Code. Ayon sa official requirements noong July 2026, kailangan nito ng Ubuntu 20.04 o mas bago sa x64 o ARM64 processor, na may 4 GB o higit pang RAM. Nai-install ito sa 1 GB plan, pero mawawala ang process sa kernel kapag may 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 kasama ang Claude Code sa libreng Claude.ai plan.
I-set up ang box gamit ang regular 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 madali ang mga SSH change 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 gaya ng 2.1.211 (Claude Code). Kung command not found ang i-print nito, wala pa sa PATH mo ang directory na iyon: mag-log out, mag-log in muli, at pagkatapos ay mag-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 ka na ngayon nang isang beses mula sa laptop, bago ka umasa sa phone. Patakbuhin ang claude sa isang project directory at sundin ang login prompt. Hihilingin ng flow na magbukas ka ng URL sa browser at ibalik ang isang code sa terminal. Mabagal gawin ito kapag nagpapalit-palit ng dalawang app sa screen ng phone. Gawin ito nang isang beses gamit ang aktuwal na keyboard, at mananatili sa server ang credentials.
Simulan ang Claude Code sa loob ng tmux para hindi ito mapatay ng naputol na connection
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 phone sa bulsa. Magpapatuloy na tumakbo ang pane.
tmux ls
tmux attach -t claudeNagpi-print ang tmux ls ng isang linya para sa bawat session, gaya ng claude: 1 windows (created Thu Jul 30 09:14:02 2026). Ibinabalik ka ng tmux attach -t claude sa eksaktong pinanggalingan mo, kasama ang hindi pa tapos na edit.
Gumagana ito dahil nagpapatakbo ang tmux ng sarili nitong server process, at ang shell at Claude Code ay mga child process ng server na iyon sa halip na ng sshd. Kapag natapos ang SSH connection, ipinapadala ng kernel ang hangup signal, SIGHUP, sa mga process na nakakabit sa connection na iyon, at hindi kabilang dito ang tmux server. Kung walang tmux, ang parehong pag-lock ng screen na pumuputol sa connection ay magpapahinto sa Claude Code habang nasa gitna ito ng tool call. Mas malalim na tinatalakay sa Pagpapatakbo ng Claude Code sa VPS sa loob ng tmux ang layout ng session.
Patakbuhin ang tmux sa server, hindi sa phone. Kapag nag-type ka ng tmux sa loob ng session na nakakabit ka na, ipi-print nito ang sessions should be nested with care, unset $TMUX to force, at kapag pinilit mo ito, magkakaroon ka ng dalawang prefix key na nag-aagawan.
Attach automatically on every login
Typing the attach command on a touch keyboard gets old. Put this at the end of ~/.profile on the server:
if command -v tmux >/dev/null 2>&1 && [ -z "$TMUX" ] && [ -t 1 ]; then
exec tmux new-session -A -s claude
finew-session -A -s claude attaches to the session named claude if it exists and creates it if it does not, so one command covers both cases. exec replaces the login shell with tmux, so leaving tmux closes the connection instead of dropping you at a bare prompt. When you need a plain shell, skip the file: ssh you@server -t "bash --noprofile".
Put it in ~/.profile and not in ~/.bashrc. ~/.bashrc also runs for non-interactive sessions, so file transfers break: scp and sftp read the unexpected output as protocol data and fail with Received message too long. ~/.profile runs for login shells only, which is what an interactive SSH session is.
~/.profile is also where Ubuntu adds ~/.local/bin to PATH. If claude works right after login but a shell inside tmux says command not found, that ordering is the reason, so start tmux from a login shell as above rather than from a script that skips the profile.
iOS: Termius o Blink Shell
Parehong sumusuporta sa SSH at mosh ang dalawang app, at parehong nag-iimbak ng mga key sa app. Ang pagkakaiba 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 sa Keys section ay makakagawa ka ng key pair.
Form-driven ang Termius. Punan ang host entry, pagkatapos ay palitan ang host mula SSH patungong Mosh sa host details. May sarili itong mosh implementation at sumusuporta sa mosh 1.3.0 at mas bago, kaya kailangan pa ring naka-install ang mosh package sa server.
I-generate ang key sa loob ng app sa parehong sitwasyon, at huwag kailanman mag-copy ng existing private key papunta sa phone. Ipinapakita ng app ang public half, na siyang iisang line na idinaragdag mo sa ~/.ssh/authorized_keys sa server. Sinasaklaw ng Mga SSH key bawat device at kung paano bawiin ang isa ang naming at revoke step. Mas mahalaga ito para 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 bukas na shell sa server mo habang nananatiling gising ang screen.
Android: Termux
pkg upgrade
pkg install openssh mosh
ssh-keygen -t ed25519 -C "pixel"
cat ~/.ssh/id_ed25519.pubNasa sariling repository ng Termux ang OpenSSH at mosh, kaya gumagana ang ssh, ssh-keygen, at mosh tulad ng sa desktop. Idagdag ang naka-print na public key line 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 line 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, magagamit din ang monospace TrueType font na inilagay sa ~/.termux/font.ttf.
Maaaring ihinto ng Android ang Termux kapag nasa background ito. Dito, reconnect lang ang kailangan. Nasa server ang session at ang agent.
Bakit nagfe-freeze ang terminal kapag lumalabas ako sa sakop ng Wi-Fi, at ano ang inaayos ng mosh?
Ang SSH connection ay isang TCP (transmission control protocol) connection, at nakikilala ang TCP connection gamit ang dalawang address at dalawang port. Kapag lumabas ka sa sakop ng Wi-Fi, bagong address mula sa mobile network ang nakukuha ng phone, kaya wala nang katugmang connection ang lumang connection sa alinmang panig. Walang notification para rito. Hindi na lang tumutugon ang terminal hanggang sumuko ang TCP, at saka magpi-print ang ssh ng client_loop: send disconnect: Broken pipe. Para agad patayin ang nag-freeze na session, pindutin ang Enter, kasunod 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. Dahil dito, ang session ay nakikilala gamit ang key na iyon at hindi gamit ang iyong address. Kapag nagbago ang address, nagpapatuloy lang ang session. Lokal ding ine-echo ng mosh ang tina-type mo at nire-repaint ang screen kapag hindi ito tugma sa 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 statusNasa Pagbubukas ng mga port gamit ang ufw ang iba pang bahagi ng firewall configuration. Kung may hiwalay na network firewall ang provider mo sa control panel nito, idagdag din doon ang parehong range. Hindi maaapektuhan ng ufw rule ang filter na nasa harap ng machine.
Dalawang mosh failure ang karaniwan. Kapag matagumpay ang login pero pagkatapos ay nagha-hang at ipinapakita ang Nothing received from server on UDP port 60001., ibig sabihin ay may humaharang sa UDP range sa pagitan ng phone at server. Kapag iniulat ng 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.
Tumatanggi ring tumakbo ang mosh kapag hindi UTF-8 ang login locale, at ipinapakita nito ang mensaheng ito: 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 gamit ng SSH, kabilang ang port forwarding. Kaya para i-preview ang web app na kakasimula lang ng Claude Code, kailangan pa rin ang plain ssh -L 8080:127.0.0.1:8080 you@server. Sini-synchronize rin nito ang nakikitang screen lamang, kaya wala itong sariling scrollback. Walang epekto rito ang ikalawang limitasyong iyon dahil pinapanatili ng tmux ang scrollback: ang Ctrl-b at pagkatapos ay [ ay pumapasok sa copy mode, nag-i-scroll ang drag o arrow keys, at lumalabas ang q.
Gawing magagamit ang screen ng phone
Apat na linya sa ~/.tmux.conf sa server ang gumagawa ng karamihan ng kailangan:
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. Dahil dito, napapalitan nito ang karamihan ng prefix key na mahirap i-type. Inililipat ng status-position top ang tmux status line mula sa pinakailalim, kung saan natatakpan ito ng on-screen keyboard at suggestion bar nito. Mahalaga ang default-terminal dahil kung hindi, isang screen terminal ang ina-announce ng tmux kay 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 komportable ang iba.
- Ini-interrupt ng
Escsi Claude habang bumubuo pa ng response at pinananatili ang nagawa na, kaya ito ang key na pinakamalapit dapat sa iyong hinlalaki. - Ini-interrupt din ng
Ctrl+Cang kasalukuyang operation. Kapag idle ang prompt, inaalis ng unang pagpindot ang input at isinasara ng pangalawang pagpindot ang Claude Code, kaya mas marahas itong tool. - Kapag dalawang beses pinindot ang
Esc, nililinis nito 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 Enter. Gumagana ang paraang ito sa bawat terminal. Native lamang ang Shift+Enter sa maikling listahan ng mga desktop terminal, at wala rito ang mobile client.
Iwasan ang split pane. Humigit-kumulang 40 column ang lapad ng phone kapag portrait, kaya 20 column na lang ang natitira sa bawat pane sa vertical split. Dahil dito, nagwa-wrap ang bawat diff at nagiging magulong basahin. Gumamit na lang ng tmux window: gumagawa ang Ctrl-b c ng isa, at inililipat ka ng Ctrl-b n sa kasunod. Kung magkaroon ang pangalawang window ng sarili nitong Claude Code session, maaaring direktang magpasa ng trabaho ang dalawang session sa isa’t isa sa halip na ikaw ang kumopya ng text sa pagitan ng mga window gamit ang touchscreen. Ihiga ang phone kapag kailangan mong basahin nang maayos ang diff.
Mahalagang sadyang itakda kung gaano karaming text ang lalabas sa screen na iyon, dahil binabago ng output style ang system prompt sa likod ng bawat reply at mas kaunting screenful ang kailangang i-scroll kapag mas maikli ito sa phone.
Ang mahabang session sa maliit na screen ay karaniwang problema sa context, kaya sulit basahin ang pamamahala sa Claude Code context window bago subukang magpatakbo ng buong araw ng trabaho mula sa tren.
Higpitan ang seguridad: keys lang, walang passwords
May hawak na ngayong key ang phone para sa isang 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 kasama sa 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 pini-print kapag valid ito. Kapag nilaktawan mo ito, maaaring maging dahilan ang isang typo para mag-fail ang sshd sa reload. Panatilihing bukas ang kasalukuyan mong session at mag-test mula sa pangalawang connection bago ka magsara ng kahit ano, dahil ang maling key ay magbibigay ng Permission denied (publickey). at, kapag naka-off ang passwords, wala nang fallback. Ang recovery path sa puntong iyon ay ang console ng provider mo.
Bigyan ng sariling key ang bawat device. Kapag nawala ang phone, ibig sabihin ay isang linya lang ang buburahin mula sa ~/.ssh/authorized_keys, at patuloy na gagana ang laptop mo. Kapag iisa ang shared key, 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 ang listener ay pagmamay-ari ng ssh.socket, kaya walang mababago kung Port line lang ang ilalagay mo. Patakbuhin ang sudo systemctl edit ssh.socket, i-clear ang default gamit ang isang blangkong ListenStream=, pagkatapos ay itakda ang port mo sa susunod na linya. Sinasaklaw ng Pag-harden ng SSH sa isang VPS ang prosesong iyon at ang iba pang bahagi ng attack surface.
Kaunti lang ang idinaragdag na seguridad ng fail2ban para sa SSH kapag naka-off na ang passwords, dahil hindi talaga matatanggap ang nahulaang password. Ang idinaragdag nito ay mas tahimik na logs, kaya mas madaling mapansin ang tunay na pagtatangkang mag-login.
Mas matibay na option ang panatilihing hindi exposed ang SSH sa public internet. Ilagay ang server sa likod ng WireGuard VPN na ikaw mismo ang nagho-host, i-up ang tunnel sa phone kapag kailangan, at bigyan ang sshd ng ListenAddress na para lamang sa tunnel. Gumagana ang mosh sa tunnel dahil UDP ang ginagamit ng magkabilang panig. Isang caveat: nagdaragdag ng packet overhead ang tunnel, kaya kung nagha-hang ang malalaking transfer, babaan ang MTU (maximum transmission unit) sa WireGuard config ng phone.
Isa pang punto tungkol sa ganitong workflow. Sa phone, ina-approve mo ang permission prompts sa screen na ilang linya lang ng diff ang ipinapakita 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 mo ng pag-access.
Kapag may problema sa muling pag-attach
Ang pag-print ng tmux attach no server running on /tmp/tmux-1000/default ay nangangahulugang wala na ang tmux server. Halos palaging ibig sabihin nito ay nag-reboot ang machine. Suriin gamit ang uptime. Ang mga kernel update mula sa automatic security updates ay nagre-reboot ng box. Kapag nag-reboot ang box, wala nang tmux session. Kaya ituring ang anumang Claude Code run bilang isang bagay na maaari mong i-restart.
Iba ang can't find session: claude. Tumatakbo ang tmux server, pero wala roon ang pangalang iyon. Ipinapakita ng tmux ls kung ano ang mga session na mayroon.
Kung mag-attach ka at plain shell prompt ang makita mo kung saan dating tumatakbo ang Claude Code, natapos ang process nang hindi natatapos ang session. Tingnan ang dmesg -T | tail para sa linyang gaya ng Out of memory: Killed process 4821 (claude). Ito ang nangyayari sa isang box na mas mababa sa 4 GB requirement habang may malaking edit. Kapag walang ganitong linya, kusang nag-exit ang Claude Code. Nasa scrollback ng shell sa itaas ng prompt ang dahilan.
Kung maliit ang window pagbalik nito at may bakanteng space sa paligid, nangangahulugang may dalawang client na naka-attach na magkaiba ang size. Sini-size ng tmux ang window ayon sa pinakamaliit na client na naka-attach. Hawak pa rin ng laptop mo ang session sa lapad na 200 columns habang 40 columns naman ang hinihingi ng phone. I-detach ang iba habang nag-a-attach ka: tmux attach -d -t claude.
FAQ
Maaari ko bang patakbuhin ang Claude Code mismo sa phone sa halip na sa VPS?
Hindi. Ang mga supported platform hanggang 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. Hindi kasama sa listahang iyon ang Android at iOS. Isinasailalim din ng phone sa sleep ang mga app nito at patuloy nitong binabago ang network address, na hindi kayang tiisin ng matagal na agent run. Patakbuhin ito sa server at gamitin ang phone bilang display.
Magpapatuloy 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 process sa server, kaya walang namamatay kapag naputol ang connection. Pinananatili naman ng mosh na aktibo ang mismong connection kapag nagbago ang address, kaya hindi na kailangang kumonekta ulit kapag lumipat mula wifi patungong mobile data. Sa plain SSH na walang tmux, nagpapadala ang naputol na connection ng SIGHUP at tumitigil ang Claude Code sa kalagitnaan ng task.
Bakit kumokonekta ang mosh pero walang ipinapakita?
Ang login na matagumpay pero 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 provider mo, na hiwalay na control sa karamihan ng panel. Kung sa halip ay mag-ulat ang 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 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, pero kapag pinindot ito nang dalawang beses sa idle prompt, lumalabas sa Claude Code, kaya Esc muna ang gamitin.
Sapat ba ang seguridad ng pagbubukas ng SSH sa internet para dito?
Kapag naka-off ang password authentication, ang tanging credential na maaaring magtagumpay ay isang key na hindi umaalis sa mga device mo. Makatuwirang risk ito para sa machine na maaari mong i-rebuild. Gumamit ng sariling key para sa bawat device para ang pagkawala ng isang phone ay isang linya lamang sa authorized_keys ang kailangang alisin. Kung ayaw mong tumanggap ng connection sa public port, ilagay ang box sa likod ng WireGuard at ipalisten ang sshd sa tunnel address.