自宅の Mac mini に外から入ってAI を動かす(ノンエンジニア向け)
自宅の Mac mini に外から入って
AI を動かす(ノンエンジニア向け)
最近はClaudeもOpenAIもデスクトップアプリが便利になってきてますね。
以前はCLIの黒い画面からClaudecodeやCodexを動かす必要があり、ノンエンジニアには少々ハードルが高く感じられましたが、アプリが使いやすくなってきたのでターミナルを開かなくなったと言う方も多いのではないでしょうか?
WEBではなくローカルで動くAIの便利さに慣れれば、当然外出先からも自宅のAIを動かしたいと考えると思います。AIに聞きながらそのTailscaleや環境を整えたものの、アプリを含めLLMは常に進化しているので、外部からAIにアクセスする方法も増え、正直なところ訳がわからんと言う状態に陥ったので、自分用に整理してみました。
最近はClaudeもOpenAIもデスクトップアプリが便利になってきてますね。
以前はCLIの黒い画面からClaudecodeやCodexを動かす必要があり、ノンエンジニアには少々ハードルが高く感じられましたが、アプリが使いやすくなってきたのでターミナルを開かなくなったと言う方も多いのではないでしょうか?
WEBではなくローカルで動くAIの便利さに慣れれば、当然外出先からも自宅のAIを動かしたいと考えると思います。AIに聞きながらそのTailscaleや環境を整えたものの、アプリを含めLLMは常に進化しているので、外部からAIにアクセスする方法も増え、正直なところ訳がわからんと言う状態に陥ったので、自分用に整理してみました。
自分用 / 何度でも読み返す
3つの経路と、混乱の元になる3つの言葉。
——「どの画面から操るか」と「どのマシンが動いているか」は、まったく別の話である。
全10カード/通読およそ25分/1カードずつ読み切れる構成
情報時点:2026年8月(各社とも更新が速い領域。挙動が違ったら末尾の原典を先に見る)
なぜ、毎回わからなくなるのか
2分同じ疑問を何度も持つのは、記憶力の問題ではない。3つの層がひとつの画面に混ざって表示されているためである。まず、これまで繰り返し引っかかってきた点を並べておく。答えは後続のカードで展開する。
| 繰り返し引っかかる問い | 一行の答え | カード |
|---|---|---|
| Web とアプリとローカルの関係が整理できない | すべて「同じセッションを覗く窓」。違うのは実行場所だけ | 02 / 07 |
| iPhone から繋いでいるあれは、結局何なのか | Remote Control。実行は手元のまま、画面だけが遠隔 | 04 |
| Web 版の AI はなぜ手元のファイルを触れないのか | クラウドの隔離環境で動いており、手元と物理的に別だから | 07 |
| 常時起動のマシンを1台持つと何が変わるのか | 「ホスト」を固定できる。ほぼすべての構成が安定する | 06 / 09 |
| プロジェクトとブランチが頭の中で混ざる | プロジェクト=アプリ側の登録、ブランチ=Git の履歴。別物 | 08 |
| ローカル LLM(Ollama)はどこに置かれるのか | 経路A の住人。各社の公式リモートは自社 AI を運ぶ仕組み | 03 |
まず3層に分ける
2分すべての混乱は、次の3つを1本の線として意識すれば解ける。ここを飛ばして機能名を覚えると、必ずまた迷子になる。
- サーフェス(surface)= 見る窓。ターミナル、ブラウザ、デスクトップアプリ、スマホアプリ。ここは何の能力も決めない。
- ホスト(host)= 実際に動いているマシン。手元の Mac mini か、ベンダーのクラウドか。使える機能はここで決まる。
- リポジトリ= 保管場所。Git/GitHub。作業机の上の状態とは別に、正典がここにある。
経路A:Termius + Tailscale + tmux
5分ベンダーの機能に一切依存しない、いちばん素直な経路。手元の Mac mini のターミナルそのものを外から借りる。ローカル LLM を動かしたいなら、実質この経路しかない。
3つの道具は、それぞれ別の問題を解いている
| 道具 | 解いている問題 | これが無いと |
|---|---|---|
| Tailscale | 外出先から自宅の Mac mini に到達する | 自宅ルーターにポートを開ける必要が出る(危険・面倒) |
| Termius | スマホ/iPad から SSH で入る | そもそも端末から接続する手段がない |
| tmux | 接続が切れても作業を生かし続ける | 電波が切れた瞬間、走っていた処理ごと死ぬ |
SSH は、その通路の先にある部屋の鍵。
tmux は、部屋の中の作業台だ。ふつうは部屋を出ると机の上が片付けられてしまう(プロセスが終了する)。tmux を挟むと、机はそのまま残り、翌朝また同じ状態から座れる。
組み立ての骨格
# ── Mac mini 側(1回だけ) ──
# 1. システム設定 > 一般 > 共有 > リモートログイン を ON(= sshd が起動する)
# 2. Tailscale をインストールしてサインイン
# 3. スリープしない設定にする(重要)
sudo pmset -a sleep 0 disablesleep 1
# ── 接続するたび(Termius から) ──
ssh nao@macmini # tailnet 上の MagicDNS 名で届く
# ── 入ったら、まず tmux に入る(ここを飛ばさない) ──
tmux new -s ai # "ai" という名前で新しい作業台を作る
tmux ls # 残っている作業台の一覧
tmux attach -t ai # 既存の作業台に座り直す
# 抜けるときは Ctrl-b → d(デタッチ。中身は動き続ける)
tailscale ssh という便利な機能があるが、Mac 側を「入られる側」にする用途では基本的に使えない。公式ドキュメントでも、SSH サーバーとして動くのは Linux と、オープンソース版 CLI を入れた macOS に限られるとされている[2]。通常の Mac アプリ版はサンドボックスの制約で SSH サーバーが起動しない。結論:Mac mini 側は macOS 標準の「リモートログイン」(=ふつうの OpenSSH)を使い、Tailscale はそこへ到達するための通路としてだけ使う。これで何も困らない。
なぜ tmux を必ず挟むのか
SSH でログインして起動したプロセスは、その接続に紐づいている。電車がトンネルに入って通信が切れれば、走っていたビルドも学習も一緒に落ちる。tmux は接続とプロセスの間に緩衝材を入れる仕組みで、接続が切れても「作業台」はサーバー側に残り続ける。
この点は経路B でも効いてくる。Claude の公式ドキュメントですら、SSH 先のマシンでセッションを維持したいなら tmux か screen の中で起動せよと明記している[3]。tmux は経路A 専用の道具ではなく、全経路の土台である。
ローカル LLM(Ollama)はこの経路の住人
ここが認識のズレやすい点である。Claude や Codex のリモート機能は、それぞれの会社の AI を手元で動かすための仕組みであって、Ollama を外から動かすための仕組みではない。Mac mini の Ollama を外から使いたいなら、選択肢は次の2つに限られる。
- SSH で入って CLI で叩く(
ollama run qwen3)。いちばん単純で、追加のリスクがない。 - tailnet 越しに API ポート(11434)へ繋ぐ。Open WebUI などの GUI を使いたい場合。ただし tailnet の中だけに閉じること。インターネットに直接晒すのは論外である。
経路B①:Claude の4つの方式
4分経路B は SSH を使わない。手元のプロセスが、自分からベンダーのサーバーへ「外向きに」繋ぎに行き、そこで待ち合わせるという設計である。だから自宅ルーターの設定変更が要らない。
| 方式 | きっかけ | Claude が動く場所 | 準備 |
|---|---|---|---|
| Remote Control | すでに走っているセッションを外から操る | 手元 CLI / VS Code | claude remote-control |
| Dispatch | スマホからタスクを投げる | 手元 デスクトップアプリ | スマホとデスクトップの QR ペアリング |
| Claude Code on the web | claude.ai/code で新規タスク | クラウド VM | GitHub 連携 |
| スケジュール実行 | 時刻・曜日のトリガー | CLI / デスクトップ / クラウド | 頻度の設定 |
覚え方はひとつだけでいい。Remote Control = 続ける(continue)/ Dispatch = 始める(create)。
Remote Control の仕組み(3点)
- 通信は外向きだけ。手元のマシンは外部からの接続口を開かない。Claude Code の側から Anthropic の API へ HTTPS で繋ぎ、作業を取りに行く[3]。ルーターの設定は不要。
- 実行とファイルアクセスは手元に残る。ローカルのファイル、MCP サーバー、入れてあるツール、プロジェクト設定はそのまま使える。
@でのファイル名補完も手元のプロジェクトから効く。 - 会話ログはサーバー側にも保存される。端末間の同期と、切断からの復帰のため。実行そのものは手元のままである。
# A. 受け待ち専用のサーバーモード(複数セッションを受けられる)
claude remote-control
claude remote-control --spawn worktree # 新規セッションごとに git worktree を分ける(カード08 参照)
# B. ふつうの対話セッション+外からも触れるようにする
claude --remote-control "Mac mini 作業"
# C. 作業中のセッションを途中から外に出す
/remote-control
Dispatch(ディスパッチ)
スマホからタスクを投げると、手元のデスクトップアプリ側で新しいセッションが起きて処理する仕組み。公式は「スマホからタスクをメッセージすると、Desktop セッションを立ち上げて処理させられる」と説明している[3]。ペアリングは QR コードで1回だけ。
Remote Control が CLI/VS Code をホストにするのに対し、Dispatch はデスクトップアプリをホストにする。両者は別々の入口で、組み合わせて使うものとしては説明されていない。まず「続けたいのか、投げたいのか」で選ぶ。
覚えておくべき制約
- 手元のプロセスが死んだら終わり。ターミナルを閉じる、VS Code を終了する、Mac がスリープする——どれでもセッションは終了する。だから SSH 先で使うなら tmux の中で起動せよと公式に書かれている[3]。
- ネットが約10分切れると、タイムアウトしてプロセスが終了する。再度立ち上げが必要。
- Dispatch はデスクトップアプリが起きていることが前提。ノートの蓋を閉じれば止まる。「クラウド実行」ではなく、あくまでリモコンである。
- API キーでは使えない。claude.ai のアカウントでログインしている必要がある。
経路B②:Codex の二段構え
3分骨格は Claude と同じ(「手元で動かして外から操る」か「最初からクラウド」か)。違いは3点に集約される。
| Claude Code | Codex(ChatGPT) | |
|---|---|---|
| ホストになるもの | CLI プロセス(claude remote-control)/ VS Code 拡張 | デスクトップアプリ(macOS / Windows)。CLI や IDE からは設定できない |
| 接続の単位 | セッション単位。URL や QR はそのセッションを指す | デバイス単位。端末とホストをペアリングし、その中でチャットを選ぶ |
| 別マシン(Mac mini 等) | そのマシン上で直接 claude を起動する必要がある | アプリから SSH ホストのプロジェクトを直接扱える |
| ホスト間の引き継ぎ | --teleport:クラウド → 手元の一方向 | Handoff:ローカル ⇄ リモートホストを双方向(Git 状態ごと)。クラウドへは不可 |
| ホストが止まったら | どちらも接続が切れる。ここは共通の弱点 | |
実務的な差が出るのは「別マシンを使えるか」の行である。常時起動の Mac mini を持っているなら、Codex 側の構成のほうが素直に組める。デスクトップアプリが SSH で Mac mini に入り、スマホはそのデスクトップアプリに繋ぐ、という二段構えになる。
~/.ssh/config に書いたホスト別名から自動検出される。リモート側に codex コマンドが PATH 上にあることが条件。Handoff(ハンドオフ)
チャットと Git の状態を、ローカルと接続済みホストの間で移動させる機能。手元で始めた作業を Mac mini 側の worktree に移し、あとで手元に戻せる。条件がひとつある——移動先のホストにも、同じ Git リポジトリのプロジェクトを保存しておく必要がある。これがカード08 の話に直結する。
つまり——経路B を自宅外から安定して使おうとすると、結局 Tailscale(経路A の道具)が必要になる。この2つは対立する選択肢ではなく、重ねて使うものである。
経路A と B を並べる
2分| 経路A:SSH + Tailscale + tmux | 経路B:各社の公式リモート | |
|---|---|---|
| 操作する対象 | Mac mini のターミナルそのもの | 特定の AI のセッション |
| 動かせるもの | CLI で動くものすべて(Ollama・Docker・自作スクリプト) | その会社の AI のみ |
| 切断への強さ | 強い(tmux が受け止める) | 弱い(約10分でタイムアウト、アプリ終了で消滅) |
| スマホでの操作性 | 低い(黒い画面。外付けキーボード推奨) | 高い(承認ボタン・差分表示・通知) |
| 準備の重さ | 初回は重い(鍵・Tailscale・スリープ設定) | 軽い(コマンド1行 or QR 1回) |
| 仕様変更への耐性 | 高い(20年変わっていない技術) | 低い(研究プレビュー段階の機能が多い) |
| 向いている場面 | 長時間の処理、ローカル LLM、土台づくり | 移動中の確認・承認、思いついたタスクの投げ込み |
優劣ではなく階層である。経路A が「家の基礎工事」、経路B が「家具」。基礎(Tailscale + 常時起動 + tmux)を先に固めておけば、上に載る各社の機能が仕様変更で壊れても、作業自体は止まらない。
WEB・ローカル・アプリの関係
3分ここまで来れば、この問いはもう解けている。WEB もアプリもターミナルも、すべて同じセッションを覗く窓にすぎない。窓の種類で挙動が変わるのではなく、そのセッションがどのマシンで動いているかで使える機能が決まる。
それでも混乱するのは、一覧に混ざって並ぶから
claude.ai/code のセッション一覧には、手元で動いているセッションとクラウドで動いているセッションが区別なく並ぶ。見た目がほぼ同じなのに、中身は次のように違う。
| 実行場所 | 手元のファイル・MCP・ツール | 電源を落とすと | |
|---|---|---|---|
| Remote Control | 手元の Mac | そのまま使える | 止まる |
| Dispatch | 手元の Mac | 使える(許可制) | 止まる |
| web セッション | クラウド VM | 届かない(コミット済みのものだけ) | 動き続ける |
混同しやすいフラグ
--cloud(クラウドで新規実行)と --remote-control(手元で実行しつつ外から見えるようにする)は、名前が似ているが正反対の機能である。さらに --teleport でクラウドセッションを手元に引き取ると、それ以降クラウド側の画面には反映されない。スマホから操作を続けたいなら、引き取ったあとでもう一度 /remote-control が要る。
迷ったときの3つの確認
- 手元にしかない環境(ローカルの DB、社内ネット、ローカル設定の MCP、未コミットのファイル)が必要か? 必要 → Remote Control / Codex の Remote。クラウド環境からは手元の資産は見えない。
- PC を閉じて出かける、あるいは電源を落とす予定か? その予定 → クラウド側(web セッション / Codex cloud)。リモート接続はホストが止まった時点で終わる。
- 常時起動のマシンを1台用意できるか?
できる → それをホストにするのが最も安定。Codex なら SSH ホスト構成、Claude Code ならそのマシンで
claude remote-controlを tmux 内に常駐させる形になる。
プロジェクト ≠ リモートブランチ
4分この2つが混ざるのは、デスクトップアプリが新しいセッションを作るたびに、裏で自動的に作業ディレクトリとブランチを生やしているからである。「プロジェクトを作った」と「ブランチができた」が同時に起きるので、同じ操作に見えてしまう。
5つの言葉を、それぞれの階層に置く
| 言葉 | 正体 | どこに存在するか |
|---|---|---|
| リポジトリ | 変更履歴をまるごと収めた箱。プロジェクトの正典 | Git の世界 |
| ブランチ | 履歴の分岐。main、feature/login など | Git の世界(手元にある) |
| リモートブランチ | GitHub 側にあるブランチの、手元での写し。origin/main のように書く | Git の世界(GitHub の状態を映したもの) |
| worktree | 同じリポジトリに対して複数の作業机を用意する仕組み。机ごとに別のブランチを開ける | ファイルシステム(フォルダ) |
| プロジェクト | アプリ側の登録。「このフォルダで作業する」というブックマークにすぎない | アプリの設定(Git とは無関係) |
ブランチ= その書物の系統。「正本の系統」「改訂試作の系統」と枝分かれしている。
リモートブランチ= 中央図書館(GitHub)にある系統の控え。手元にあるが、勝手に書き換えるものではなく、中央の状態を映しているだけ。
worktree= 書庫の隣に並べた複数の作業机。机ごとに別の系統を広げられるので、片方の作業でもう片方が汚れない。
プロジェクト= 「今日はこの机で作業します」とアプリに貼った付箋。書庫の中身とは何の関係もない。
なぜ混ざるのか
Claude のデスクトップアプリは、Git リポジトリの場合、セッションごとに自動で worktree を切って隔離する。既定の保存先は <プロジェクトの根>/.claude/worktrees/ である[5]。CLI でも claude remote-control --spawn worktree で同じ挙動になる。
つまり「新しいセッションを作る」という1つの操作が、フォルダの複製とブランチの作成を同時に引き起こしている。ここが「プロジェクト=ブランチ」という誤解の発生源である。正しくは:
- セッションを作る → アプリが worktree(机)を用意する → その机に新しいブランチが割り当てられる
- プロジェクトは、その机の場所を指すアプリ側の登録であって、ブランチではない
- だからホストが変われば、プロジェクトの登録も別に必要になる(Git の状態は共有されていても)
この理解が効いてくる場面
- Codex の Handoff。移動先のホストに「同じ Git リポジトリのプロジェクト」を保存していないと、移動先の候補にすら出てこない。リポジトリのサブディレクトリを使っている場合は、両ホストで同じサブディレクトリを登録する必要がある[4]。これは Git の問題ではなく、付箋を貼っていないという問題である。
- クラウドセッションと手元の食い違い。クラウド VM から見えるのは GitHub にコミット済みのものだけ。手元の worktree にある未コミットの変更は、当然そこにはない。
- 「変更が消えた」という錯覚。別のセッション=別の worktree で作業していただけ、というケースが多い。まず
git worktree listとgit branchを見る。
自分の構成として、どう組むか
2分常時起動の Mac mini がある、という前提で最も素直な形は次のとおり。
- 土台:Mac mini を「起きたまま」にし、Tailscale を入れ、リモートログインを有効にする ここが崩れると、上のすべてが崩れる。スリープ設定の確認を最優先にする。
- 常駐:tmux の中で
claude remote-controlを走らせておく ターミナルを閉じてもセッションが生き残る。公式が推奨している唯一の「常駐」の作り方である。 - 日常:スマホ/ブラウザからは、その常駐セッションに繋いで承認と確認をする Remote Control は「続ける」ための機能。投げっぱなしにしたいなら Dispatch かクラウド側を使う。
- ローカル LLM を使うときは、Termius から SSH で入って tmux の別ペインで動かす Ollama は各社のリモート機能の管轄外。経路A でしか触れない。
- PC を落として出かける日は、最初からクラウド側(web セッション/Codex cloud)に投げる 手元のホストが要らない作業か否かを、着手前に判断する習慣をつける。
用語ミニ辞典
2分- セッション/チャット
- 1本の会話とその作業状態。どの画面から見ても、同じものは同じ内容。
- サーフェス(surface)
- セッションを操作する窓。ターミナル、IDE、デスクトップアプリ、ブラウザ、スマホアプリ。実行場所とは無関係。
- ホスト
- 実際にコードを動かしているマシン、またはその常駐プロセス。Claude Code では CLI/VS Code、Codex ではデスクトップアプリ。
- tailnet
- Tailscale が作る自分専用の仮想ネットワーク。参加した機器同士だけが直接届く。
- MagicDNS
- tailnet 内で、IP アドレスの代わりに機器名(
macminiなど)で呼べるようにする仕組み。 - tmux(ターミナルマルチプレクサ)
- 1つのターミナル画面を分割し、かつ接続が切れても残り続けるセッションを作る道具。
Ctrl-b dでデタッチ、tmux attachで復帰。 - Remote Control(Claude)/ Remote(Codex)
- 手元で動いているセッションを、ブラウザやスマホから操作できるようにする機能。
- Dispatch(Claude)
- スマホからタスクを投げ、手元のデスクトップアプリ側でセッションを起こさせる仕組み。
- Teleport(Claude)
- クラウドセッションを手元のターミナルに引き取ること。一方向。
- Handoff(Codex)
- チャットと Git の状態を、ローカルと接続済みホストの間で双方向に移動させること。クラウドへは不可。
- worktree
- 1つの Git リポジトリに対して複数の作業ディレクトリを持たせる仕組み。並行作業でファイルが衝突しなくなる。
NOTES — 脚注と出典
- Tailscale は WireGuard ベースのメッシュ VPN。機器同士を直接つなぐため、中央サーバーを経由しない通信になる(経路が確保できない場合のみ中継サーバーを使う)。ポート開放や固定 IP を必要としないのが最大の利点。
- Tailscale 公式ドキュメント「Tailscale SSH」。SSH サーバーとして動作できるのは Linux 機器と、オープンソース版 CLI(
tailscale+tailscaled)を導入した macOS に限られる。通常の macOS アプリ版(サンドボックス版)では起動しない。
tailscale.com/docs/features/tailscale-ssh - Claude Code 公式ドキュメント「Remote Control」。外向き HTTPS のみで受信ポートを開かないこと、ローカルの MCP・ツール・設定がそのまま使えること、プロセスが終了すればセッションも終わること、SSH 先で維持したいなら tmux か screen の中で起動すること、約10分のネットワーク断でタイムアウトすること、Dispatch との使い分けが記載されている。
code.claude.com/docs/en/remote-control - Codex / ChatGPT 公式ドキュメント「Remote connections」。デスクトップアプリがホストになること、QR によるデバイス単位のペアリング、
~/.ssh/configからの SSH ホスト自動検出、Handoff の前提条件(移動先ホストに同一リポジトリのプロジェクト登録が必要)、および「app-server を公開ネットワークに直接晒さず、VPN かメッシュネットワークを使え」という指針が記載されている。
developers.openai.com/codex/remote-connections - Claude Code 公式ドキュメント「Desktop application」。Git リポジトリではセッションごとに worktree で隔離され、既定の保存先は
<project-root>/.claude/worktrees/。設定で変更可能。
code.claude.com/docs/en/desktop
この分野は各社とも更新が速く、フラグ名・制限値・提供プランは変わり得る。挙動が説明と合わないときは、記憶ではなく上記の原典を先に確認すること。
記載内容の時点:2026年8月。



コメントを送信