前言:從一個不在電腦前的念頭開始
我沒有打算把手機變成生產力工具。一開始的場景其實很單純:某天晚上躺著的時候,突然想到早上那個部署失敗的問題,八成是 build 環境的 Node 版本不對。要起床開電腦驗證嗎?還是先記在備忘錄,明天再說?
那天晚上,我掏出手機、打開 SSH、講了一句話。三分鐘後,AI agent 已經把 build log 撈出來、比對完 Node 版本、改好設定檔,然後 push 觸發了重新部署。我鎖上手機繼續躺著,十分鐘後再看一眼,部署成功了。
這套架構不是什麼新發明,它只是三個成熟工具的組合:Tailscale 負責把手機和開發機放進同一個私有網路,Termius 負責在手機上提供一個像樣的 SSH 終端,然後一台跑著 AI agent 的開發機負責把自然語言變成 commit。
這篇文章想記錄的,是這個組合在實際使用之後的樣子:它怎麼配置、工作模式有什麼質變、踩過哪些地雷,還有,哪一種工作真的適合這樣做,哪一種不適合。
為什麼不是遠端桌面?我想要的是「派工作」,而不是「盯螢幕」
談到手機上寫程式,多數人的第一反應是遠端桌面,把手機螢幕當成桌面的延伸。
我自己試過幾次之後就放棄了。實務上有幾個很實在的痛點:手機螢幕上操作桌面解析度,字小到必須不斷縮放平移,一個 session 下來眼睛非常累;觸控操作滑鼠游標的精準度,做什麼都慢半拍;連線稍微不穩,畫面就開始卡頓。
而最根本的問題是,遠端桌面是把你的人送到電腦前,但你的開發工作,本來就不需要人在電腦前。
SSH 加上 AI agent 的思路完全不同。你不需要看到桌面,因為 agent 替你坐在電腦前。你要做的只有三件事:把問題講清楚、確認它理解的方向對不對、驗收結果。
我要的不是把手機變成小螢幕,而是把工作留在它該在的地方,把結果送到我手上。這不只是工具的差別,而是模型的差別。
對「想處理的是事情本身,而不是操作介面」的開發者來說,這個思路幾乎是為這個場景量身打造。
架構:三件套的分工

整套架構拆開來看,每個角色的職責都非常單一。
第一件是 Tailscale,負責網路層。它是一個基於 WireGuard 的 mesh VPN,最大的特色是零配置,手機和開發機各裝一個 client、登入同一個帳號,兩台設備就自動在同一個私有網路裡互相可見。不需要開 port、不需要設定防火牆規則、不需要處理動態 IP。它的 MagicDNS 甚至讓你不用記 IP,直接用設備名稱就可以連線。
我的開發機是一台 AWS EC2,上面跑著日常的開發環境。Tailscale 裝好之後,從手機連線就是一行指令的事,不需要碰 Security Group,也不需要擔心彈性 IP 換了之後連線斷掉。
第二件是 Termius,負責終端層。手機上的 SSH 客戶端選擇不多,Termius 的價值在於:連線設定雲端同步、字型與配色可以調到長時間閱讀不累、snippet 功能讓常用的長指令變成一鍵執行。SSH 在手機上最大的摩擦就是輸入,snippet 把「連上之後的第一個動作」壓縮成一次點擊。
第三件,也是整個架構的靈魂,是一台長駐的 AI agent。它跑在開發機上,讀得到專案的程式碼,可以執行命令、跑測試、commit、push、看部署結果。手機 SSH 連上去,用自然語言下指令,它就開工。
關鍵在於,它的對話狀態是主機保留的。手機 SSH 斷線了、App 切到背景了、你人先去忙別的了,agent 的工作不會中斷。你回來的時候,它已經把事情做完了,等你看結果。
配置實錄:踩過的坑比功能清單更有用

SSH key:每台設備一把,用不到就撤
把公鑰放進 EC2 的 authorized_keys 是基本動作,但真正重要的是 key 的管理策略。我建議每台設備一把獨立的 key,手機一把、平板一把,任何一台設備不見了,只需要單獨撤銷那一把,不影響其他設備。authorized_keys 裡躺著的 key 也值得定期盤點,用不到的就移除,不要讓幾年前的舊 key 一直留著。
MagicDNS:名字比 IP 好記
Tailscale 的 MagicDNS 打開之後,SSH 指令可以直接用設備名稱:
ssh ec2-user@dev-box不用記 100.x.x.x 這種 Tailscale 位址,也不用擔心 EC2 的公 IP 換了之後要改設定。聽起來是小事,但在手機上少打一串字,摩擦就少一分。
開發環境的地雷:真實案例
這套架構本身的配置很簡單,真正會卡住人的,反而是開發機本來就有的環境問題。平時坐在電腦前,這些問題當場就解了,懶得記錄。改成手機遠端之後,每個地雷都變成一次完整的 debug 流程。
我自己踩過的三個真實案例:本機的 Homebrew yarn(1.22)讀不懂 yarn 4 的 lockfile patch 協議,yarn install 直接炸;Cloudflare Pages 的 build 環境 Node 版本和本地不一致,部署連續失敗三次;SQLite 的 datetime('now') 回傳 UTC 而不是本地時間,害我把早上七點半的部署記成昨夜十二點。
這些坑的共同點是,它們都不是遠端架構特有的問題,而是本來就會遇到的工程問題。差別在於,解決它們的地方是手機上的一段對話。AI agent 撈 log、比對版本、改設定、驗證,這條鏈它自己跑完,我只需要確認方向。
工作模式:非同步委派的四個節奏

這套架構真正改變的,不是「在哪裡寫程式」,而是你和 AI 之間的分工模式。
剛開始使用的時候,多數人會本能地進入盯著看的模式:下一個指令、看它跑、等它完成、看結果、再下一個指令。這種模式在手機上特別痛苦,你要一直保持連線、一直滑螢幕看進度,等於把手機當成一個很小的螢幕在用。
真正的質變來自於切換成非同步委派。實務上我把它拆成四個節奏。
1. 下指令就走
指令講清楚,確認 agent 理解的方向對,然後就可以關掉 Termius。AI agent 在背景跑,跑測試、修錯誤、重試、部署,這些它自己會處理。你鎖上手機,繼續過你的生活。
2. 回來驗收
半小時後想起來,打開手機瀏覽器輸入你的網址,部署已經上線,測試全綠。這個驗收的動作在手機上反而意外地順手,因為你驗收的本來就是訪客看到的樣子,而不是開發工具裡的狀態。
3. 修方向
結果不對的時候,對話紀錄裡有完整的執行過程,agent 做了什麼、卡在哪裡、它嘗試過什麼。你只需要指出方向,例如這個改法不對,換另一種方式,它就從斷點接著跑。
4. 失敗也是交付物的一部分
如果 agent 嘗試了幾次還是失敗,那次的失敗紀錄本身就是有價值的:錯誤訊息、嘗試過的路徑、卡住的點。拿著這些資訊,不管是自己上手,還是換個方式描述給 agent,都比從零開始快。
一天之內,這種工作模式可以完成的量相當具體。一個跑了八年的部落格,從 Astro 5 升級到 7.4.2,跨了兩個 major;完整遷移搜尋系統;把兩個伺服器端點改造靜態化;清掉三十多個死元件;測試從 32 個補到 79 個。然後在部署失敗三次之後,靠著 agent 自己用 API 撈 Cloudflare build log 定位問題,第四次成功上線。
這中間的每一次「下指令」,花費的時間都在一分鐘以內。
邊界:手機做不了的事,與它意外擅長的事
誠實地說,這套架構有它的邊界。
適合的是文本為主的工作:修 bug、補測試、重構、寫文件、調整設定、部署與驗證、呼叫 API 除錯。這些工作佔日常開發的大宗,而且它們的結果驗證都可以用文字呈現,在手機上完全沒有障礙。
不適合的是需要精細視覺判斷的工作:像素級的 UI 微調、動畫節奏的調校、複雜版面的響應式調整。手機螢幕上看不出細節差異,硬做只會來回鬼打牆。
但即使是視覺類的工作,閉環裡的部署驗證依然可以在手機上完成。先讓 agent 把改動部署到預覽環境,手機看效果,然後說第二個區塊的間距再放大一點。視覺判斷在人,機械執行在 agent,這條界線畫清楚,手機的定位就清楚了。
意外擅長的還有一件小事:行動選單按鈕的 bug。一個八年來按了沒反應的老問題,就是在手機上重現、確認,然後叫 agent 修掉的。手機上發現的問題,手機上解決,這個閉環本身就有種完整的感覺。
安全模型:不暴露公網的前提下隨時可達
這套架構的安全模型建立在兩層之上。
第一層是 Tailscale 的私有網路。開發機不暴露任何 port 到公網,SSH 只在 tailnet 裡可達,外部掃描器根本看不到你的機器存在。這和開一個 port 給 SSH、然後用 fail2ban 擋暴力嘗試,是完全不同的威脅模型。前者是根本沒有攻擊面,後者是攻擊面一直在,只是努力擋。
第二層是 SSH key 認證。關閉密碼登入、每台設備一把獨立 key、定期盤點 authorized_keys。AI agent 的權限邊界也要想清楚,它跑在你的使用者帳號下,能做的事就是你帳號能做的事,所以專案目錄之外的操作,預設就是它碰不到的。
好的安全,不是加更多的鎖,而是留更少的門。這句話放在 Tailscale 加 SSH 的組合上,比放在任何一個 port forwarding 方案上都成立。
如果要做成完全體,我會怎麼演進?
目前的架構已經可以支撐日常開發,但如果往完全體走,我心裡有幾個演進方向。
第一個是通知回路。現在的流程是想起來再看,如果 agent 在完成任務,或遇到需要決策的岔路時,能主動推播到手機,例如 Telegram 或通知類服務,非同步委派就能再往前一步。連想起來看都不需要,需要你的時候它會找你。
第二個是語音輸入。手機上打字終究是摩擦,如果語音輸入可以直接變成 agent 的指令,例如 iOS 捷徑接語音轉文字再接 SSH 執行,通勤時用講的就能派工作。
第三個是多機 mesh。Tailscale 的 tailnet 天然支援多台設備,如果開發機不止一台,桌上型、筆電、NAS 各一台,agent 可以根據任務性質選擇在哪台機器執行。重的 build 丟桌上型,日常修改在筆電。
第四個是任務佇列的視覺化。現在的想起來再看依賴記憶,如果把 agent 的任務狀態變成一個隨時可查的清單頁,執行中、已完成、需要決策,委派的粒度就能更細。
結語:電腦變成一個地址,而不是一張桌子
回頭看這套架構,它用的每一個工具都不是新的。Tailscale 是成熟商業產品,Termius 是老牌 SSH 客戶端,tmux 的歷史比很多讀者的年紀都大。真正新的,是長駐 AI agent 讓這個組合產生了質變。
以前遠端連回開發機,你面對的是一個終端機,所有事情都要自己動手。現在面對的是一個懂你專案的工程師,所有事情只要講清楚就好。
開發者的工作場所,正在從一張桌子變成一個地址。桌子意味著你必須人在那裡,地址意味著你隨時可以連上去。當寫程式的場所從實體限制變成網路座標,剩下的問題就只有一個:你想在什麼時候、什麼地方,解決什麼問題。
而這個問題的答案,應該由你自己決定,而不是由那張桌子決定。














