近期有不少科技創作者開始分享這種做法:把 Claude 跑在一台永不關機的 Mac mini 上,搭配 Telegram 遠端下指令,讓 AI 助理真正 24 小時待命。
其中架構整理最清楚的,來自 X 上的 Nick Spisak。他展示了如何用 Claude Code 內建的 Channels 功能取代 OpenClaw,整套設定官方說法是 15 分鐘。
一般人用 Claude 的方式,是打開瀏覽器或 App 直接對話;這個方法則是把 Claude 跑在一台永不關機的 Mac mini 上,接管你的本地檔案與工具,然後透過 Telegram 接受遠端指令。
為什麼這個架構有效?
Claude Code Channels 本質上是一個訊息橋接層:Telegram 接收你的指令,轉給正在 Mac mini 上持續運行的 Claude 工作階段(session),Claude 用你的真實本地資料完成任務,再把結果送回 Telegram。
這套架構能運作的關鍵有兩個。
第一,Mac mini 不會睡眠,Claude 的 session 能保持常駐。Channels 沒有訊息佇列,Claude 不在線時傳過去的訊息直接消失,不會等到下次再送。筆電合蓋就會斷線,Mac mini 不會。
第二,Syncthing 讓兩台機器共享相同的 Skills、指令與設定,不需要在 Mac mini 上重新建置所有配置。
核心步驟
第一步:讓 Mac mini 永不入睡
進入「系統設定」→「能源」,將 Mac mini 設為永不睡眠。這是整個架構的地基,後面所有步驟都建立在機器保持清醒的前提上。
第二步:用 Syncthing 同步兩台機器的設定檔
Syncthing 是一套開放原始碼的點對點同步工具,2013 年上線至今被數萬名開發者使用,資料不經過任何雲端伺服器,直接在同一區域網路的兩台機器間傳輸,費用為零。
在 Mac mini 與筆電上分別執行:
brew install syncthing
brew services start syncthing
開啟瀏覽器前往 localhost:8384,兩台機器互相加入對方的裝置 ID,再選擇要同步的資料夾。
需要同步的資料夾:
~/.claude/skills/
~/.claude/commands/
~/.claude/settings.json
你的知識庫(Obsidian vault、參考文件等)
MCP 工具設定
絕對不能同步的檔案:
在 Syncthing 介面中,每個同步資料夾都可以設定「忽略清單」,也就是 .stignore 檔案。做法是在 Syncthing 的網頁介面(localhost:8384)點進對應的資料夾,選擇「Edit Ignores」,把以下內容貼入儲存即可,不需要自己手動建立檔案。
提醒:請在「第一次同步之前」就先把忽略清單設好,再按下同步。否則第一次 full sync 已經把不該同步的東西推過去,再改 .stignore 就只是「以後不要再犯同樣的錯」,救不了已經混在一起的紀錄。
settings.local.json ← 各機器獨立的覆寫設定
history.jsonl ← 各機器獨立的對話紀錄
projects/ ← Claude 用絕對路徑追蹤專案,不同機器路徑不同會衝突
node_modules/
.git/
.env
有一個細節要特別強調:Claude Code 用「完整絕對路徑」追蹤專案。如果筆電的路徑是 /Users/nick/Projects/,Mac mini 是 /Users/admin/Projects/,Claude 會認為是兩個不同的專案。
解法:兩台機器使用相同的使用者名稱。
第三步:在 Mac mini 安裝並設定 Telegram Bot
確認 Bun 已安裝(在終端機輸入 bun --version,如果報錯先執行安裝):
curl -fsSL https://bun.sh/install | bash
接著在 Telegram 找 @BotFather,傳送 /newbot,依指示完成後複製取得的 Token。
回到 Mac mini 的 Claude Code,依序執行:
/plugin install telegram@claude-plugins-official
/reload-plugins
/telegram:configure <貼上你的 Token>
以下指令用來啟動附帶 Channels 的 Claude:
claude --channels plugin:telegram@claude-plugins-official
啟動後,在 Telegram 對你的 Bot 傳送任意訊息,Bot 會回覆一組配對碼。回到 Claude Code 輸入:
/telegram:access pair <配對碼>
/telegram:access policy allowlist
最後一行是鎖定權限,避免陌生人也能操控你的機器。
第四步:建立自動重啟機制,讓 Claude 真正跑好跑滿
Claude 可能因為各種原因中斷,需要一個定期重啟的機制讓它保持穩定。原文使用 macOS 的 LaunchAgent 而非 cron,原因是 cron 運行在精簡環境中,無法存取登入憑證,而 Claude Code 需要使用者認證;LaunchAgent 跑在使用者工作階段內,能拿到正確的認證。
需要說明的是,這套機制提供的是「定時重啟」,不是「崩潰偵測後立即恢復」。LaunchAgent 會在開機時啟動一次、每天凌晨 4 點重啟一次,但如果 Claude 在下午 2 點意外中斷,不會自動拉起來,要等到凌晨 4 點才恢復。對大多數非緊急任務來說這已足夠,但若有時效性較高的工作流程,部署前請將這點納入考量。
第四步 A:建立重啟腳本
mkdir -p ~/.claude/scripts
nano ~/.claude/scripts/claude-channels-restart.sh
將以下內容貼入:
#!/bin/zsh
# 確保 PATH 在 LaunchAgent 環境下也找得到 tmux、claude 等工具
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
# 關閉現有的 Claude session,從乾淨狀態重新啟動
# (tmux 是「背景終端機」,讓程式在你不看的時候繼續執行)
# (2>/dev/null 的意思是:如果沒有 session 可關閉,不要顯示錯誤)
tmux kill-session -t claude-channels 2>/dev/null
# 等待 2 秒讓清理完成
sleep 2
# 開啟新的背景終端機工作階段
# -d = 在背景啟動,-s = 命名為 "claude-channels",-c = 從 Projects 資料夾開始
tmux new-session -d -s claude-channels -c ~/Projects
# 清除一個會讓 Claude 誤以為自己已在執行的環境變數
tmux send-keys -t claude-channels "unset CLAUDECODE" Enter
# 啟動 Claude Code 並連接 Telegram
tmux send-keys -t claude-channels "claude --channels plugin:telegram@claude-plugins-official" Enter
# 等待 20 秒讓 Claude 完全啟動
sleep 20
# 告訴 Claude 開始監聽你的訊息
tmux send-keys -t claude-channels "Resume monitoring. Check channels for any messages." Enter
儲存後(Ctrl+X、Y、Enter),賦予執行權限:
chmod +x ~/.claude/scripts/claude-channels-restart.sh
第四步 B:建立 LaunchAgent
nano ~/Library/LaunchAgents/com.claude.channels.plist
貼入以下設定:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.claude.channels</string>
<key>ProgramArguments</key>
<array>
<string>/bin/zsh</string>
<string>-c</string>
<string>~/.claude/scripts/claude-channels-restart.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>4</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>StandardOutPath</key>
<string>/tmp/claude-channels.log</string>
<key>StandardErrorPath</key>
<string>/tmp/claude-channels.log</string>
</dict>
</plist>
儲存後啟用:
launchctl load ~/Library/LaunchAgents/com.claude.channels.plist
RunAtLoad 讓 Claude 在開機時自動啟動;StartCalendarInterval 設定每天凌晨 4 點自動重啟清空 session。
第四步 C:驗證是否正常運作
launchctl list | grep claude
若看到 com.claude.channels,代表 LaunchAgent 已正確載入。接著在 Telegram 傳訊息給 Bot,確認有回應。
測試手動重啟流程:
tmux kill-session -t claude-channels
~/.claude/scripts/claude-channels-restart.sh
手動刪除 session 再執行重啟腳本,確認整個流程跑得通。這也是 Claude 意外中斷時你可以立刻手動呼叫的恢復指令。
這套架構的前提條件
這個設定有幾個限制需要誠實說明。
第一,你需要一台實體桌機或常時開機的機器,Mac mini 或任何不睡眠的 macOS 機器皆可,但這意味著一筆額外硬體成本或持續的電費支出。
第二,Channels 目前處於 research preview 階段,需要 Claude Code v2.1.80 以上版本,且必須登入 claude.ai 帳號才能使用。執行前請先確認版本:claude --version。
第三,整套流程涉及終端機指令、tmux、LaunchAgent,技術門檻不算低。若你從未接觸過 launchctl 或 tmux,需要預留時間排查問題。
第四,Syncthing 的同步設定若出錯(特別是誤把 projects/ 或 history.jsonl 同步進去),會讓 Claude 在兩台機器上產生路徑衝突或混用對話紀錄。.stignore 的設定必須在第一次同步前就確認正確。
工具不決定效果,常駐才決定效果
OpenClaw 做的事,Claude Channels 現在內建了。差別只在你的架構夠不夠穩,例如機器會不會睡、session 會不會斷、崩潰了有沒有人把它叫回來。
最後要說的是,本文整理自 Nick Spisak 的公開分享,編輯過程中已逐一核對指令語法,但不同的 macOS 版本、Claude Code 版本、網路環境,都可能讓某個步驟的行為跟這裡寫的不一樣。
建議動手前,先備份現有的 Claude 設定,遇到問題優先查官方文件或原文討論串。套一句投資圈的名言:Do your own research(DYOR)。
資料來源:Nick Spisak(@NickSpisak_)
本文初稿為 AI 編撰,整理・編輯/李先泰
