前言:從一個不在電腦前的念頭開始
我沒有打算把手機變成生產力工具。一開始的場景其實很單純:某天晚上躺著的時候,突然想到早上那個部署失敗的問題,八成是 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 的工作不會中斷。你回來的時候,它已經把事情做完了,等你看結果。
十分鐘建立你的第一個 Mobile AI Coding 環境
假設你已經有一台 EC2(或任何 Linux 主機),Tailscale 也裝好了,從零到能用手機派工作的最小步驟如下。
第一步,把公鑰裝進主機:
# 在手機 Termius 產生 key pair 後,把公鑰加到主機
echo "<你的公鑰>" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys第二步,從手機連線並建立持久終端:
ssh ec2-user@dev-box
# 建立 named session,AI agent 在這個 session 裡跑
tmux new -s omp
# 分離 session:Ctrl+B 再按 D
# 之後隨時從任何設備接回
tmux attach -t omp第三步,在 session 裡啟動你的 AI agent(我用的是 OMP),把工作目錄切到專案,讓它常駐。
這樣的組合有一個重要的保證:tmux 保證的是 session 不會因為 SSH 斷線而消失。你關掉 Termius、地鐵進隧道、手機沒電,session 和裡面的程序都還在主機上跑。但它不是萬能的,agent 停下來等你確認授權、程式自己崩潰、或主機重啟,這些情況你還是要回來處理。tmux 給你的是「斷線不失聯」,不是「全自動駕駛」。
安全模型:三層防護,而不是一句口號
談這套架構的安全,最忌諱的是一句「用了 Tailscale 就沒有攻擊面」就帶過。真實的安全模型是三層,每層的責任不同。
第一層:網路存取
Tailscale 把開發機的 SSH 收進 tailnet,不對公網開 port。這和開一個 port 給 SSH、然後用 fail2ban 擋暴力嘗試,是完全不同的威脅模型。前者是攻擊面直接消失,後者是攻擊面一直在,只是努力擋。
但「沒有公網攻擊面」不等於「零風險」。設備被入侵、tailnet 的 ACL 設定過鬆、或者你自己把存取權給了不該給的人,都會讓這層失效。Tailscale 的 ACL 可以進一步限制「哪些設備連哪些 port」,建議至少把手機到開發機的存取範圍縮到只剩 SSH。
第二層:SSH 認證
關閉密碼登入、每台設備一把獨立 key、定期盤點 authorized_keys,這些是基本功。
補充一個多數教學不會提的選項:Tailscale SSH。它用 tailnet 的身分管理取代 SSH key,連線授權直接由 Tailscale ACL 控制,好處是 key 輪替和撤銷不用再管理 authorized_keys。缺點是綁定 Tailscale 生態。我目前用的是傳統 SSH key 加 Tailscale 網路的組合,兩種都成立,看你想要多少管理面集中在單一服務。
第三層:Agent 權限
這是最容易被忽略的一層。AI agent 跑在你的使用者帳號下,它能做的事就是帳號能做的事。所以:
- agent 在專案目錄啟動,不代表它被限制在專案之內。它能不能碰家目錄的其他檔案、能不能裝全域套件,取決於作業系統權限,而不是 agent 的善意。
- 更穩的做法是控制 Git 權限(deploy key 而非個人 token)、定期 review agent 的 commit、重要操作保留人工確認。
- agent 執行不可信指令的風險是真實存在的:prompt injection 或 agent 的誤判,可能讓它跑出你沒預期的命令。這層的防線是 review,不是信任。
好的安全,不是加更多的鎖,而是留更少的門。三層各自的門變少,整體的暴露面才會真的縮小。
配置實錄:踩過的坑比功能清單更有用
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 在 tmux session 裡繼續跑,跑測試、修錯誤、重試、部署,這些它自己會處理。你鎖上手機,繼續過你的生活。
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 | 免費(Personal 計畫,100 台設備內) |
| Termius | 免費版足夠(SSH + snippet;雲端同步與 SFTP 是付費功能) |
| AWS EC2 | 看你的 workload;跑 AI agent 對話與日常開發的小型 instance,每月幾美元到幾十美元(注意開機時數與 EBS 儲存) |
| OMP | 開源工具,本身免費;LLM API 用量另計 |
相比之下,遠端桌面方案要做到同樣體驗,通常需要一台持續開機的高規格機器加付費遠端軟體。這套架構的機器規格可以壓得很低,因為重度運算在 agent 的 LLM 端,不在你的主機上。
如果要做成完全體,我會怎麼演進?
目前的架構已經可以支撐日常開發,但如果往完全體走,我心裡有幾個演進方向。
第一個是通知回路。現在的流程是想起來再看,如果 agent 在完成任務,或遇到需要決策的岔路時,能主動推播到手機,例如 Telegram 或通知類服務,非同步委派就能再往前一步。連想起來看都不需要,需要你的時候它會找你。
第二個是語音輸入。手機上打字終究是摩擦,如果語音輸入可以直接變成 agent 的指令,例如 iOS 捷徑接語音轉文字再接 SSH 執行,通勤時用講的就能派工作。
第三個是多機 mesh。Tailscale 的 tailnet 天然支援多台設備,如果開發機不止一台,桌上型、筆電、NAS 各一台,agent 可以根據任務性質選擇在哪台機器執行。重的 build 丟桌上型,日常修改在筆電。
第四個是任務佇列的視覺化。現在的想起來再看依賴記憶,如果把 agent 的任務狀態變成一個隨時可查的清單頁,執行中、已完成、需要決策,委派的粒度就能更細。
結語:電腦變成一個地址,而不是一張桌子
回頭看這套架構,它用的每一個工具都不是新的。Tailscale 是成熟商業產品,Termius 是老牌 SSH 客戶端,tmux 的歷史比很多讀者的年紀都大。真正新的,是長駐 AI agent 讓這個組合產生了質變。
以前遠端連回開發機,你面對的是一個終端機,所有事情都要自己動手。現在面對的是一個懂你專案的工程師,所有事情只要講清楚就好。
開發者的工作場所,正在從一張桌子變成一個地址。桌子意味著你必須人在那裡,地址意味著你隨時可以連上去。當寫程式的場所從實體限制變成網路座標,剩下的問題就只有一個:你想在什麼時候、什麼地方,解決什麼問題。
而這個問題的答案,應該由你自己決定,而不是由那張桌子決定。













