T3 CodeをVPSで常駐させる:スマホからtailnet経由で使う手順
T3 Code 0.1.7をVPSの専用ユーザーで常駐させ、Tailscale HTTPS経由でスマホやノートPCからペアリングする手順です。初期値がFull accessである点の対策、日本語化、WSL、Orcaとの違いも扱います。
T3 Codeとは何か、なぜVPSに置くのか
T3 CodeをVPSで動かすと、エージェントとリポジトリは常時稼働のサーバーに置いたまま、ノートPCやスマホは画面としてだけ使えます。T3 Codeは、READMEが「agent harness control surface」と呼ぶツールです。Claude Code、Codex、Cursor、Grok Build、OpenCode、Google Antigravity、fxを、ひとつのGUIからまとめて操作できます。ライセンスはMITです。FAQによると、T3 Code自体に支払う方法はありません。使うのは、すでに契約している各エージェントのサブスクリプションです。
READMEは「We are very very early in this project. Expect bugs.」とはっきり書いています。なのでこのガイドではバージョンを固定します。2026年11月8日時点で、npmのt3パッケージのlatestタグは0.1.7、nightlyタグは0.1.8-nightly.20261108.4367です。GitHubのv0.1.7リリースは11月4日付けで、Latestになっています。
サーバーに置く理由は単純です。ノートPCを閉じると、ローカルのエージェントは止まります。VPSなら作業は続き、スマホから進み具合を確認して、次の指示を送れます。FAQも、VPSを含めてT3 Codeが動くマシンならどこでもエージェントを動かせると書いています。
この構成には注意点があります。新しいスレッドは、初期値で承認なしにコマンドを実行します。だから後半の安全対策の章が、この記事でいちばん大事な部分です。
全体の構成
作るものは次のとおりです。
- VPS上の専用ユーザー
t3。sudo権限は持たせません。 - そのユーザーのsystemdユーザーサービスとして動くT3 Codeサーバー。待ち受けは127.0.0.1だけです。
- Tailscale Serveによる、tailnet内だけのHTTPS入口。
- 端末ごとに発行する、一回限りのペアリングリンク。
公開インターネットに開くポートはありません。T3 Codeを外から見られるのは、同じtailnetに参加した自分の端末だけです。
始める前に:スナップショットと専用ユーザー
まず、VPS事業者の管理画面でスナップショットを取ってください。エージェントがFull accessで誤ったコマンドを実行しても、スナップショットがあれば数分で元に戻せます。
次に、T3 Code専用のユーザーを作ります。ここではUbuntu 24.04を前提にします。
sudo adduser --disabled-password --gecos "" t3
sudo loginctl enable-linger t3--disabled-passwordなので、このユーザーはパスワードでログインできません。sudoグループにも入れません。エージェントはこのユーザーの権限で動くので、エージェントが壊せる範囲はこのユーザーのホームディレクトリまでになります。
enable-lingerは、ログアウトしていてもこのユーザーのsystemdユーザーサービスを動かし続ける設定です。T3 Codeの公式ドキュメントは、Linuxでのバックグラウンド動作にsystemdユーザーサービスが必要だと書いています。また、SSHを閉じるとサービスが止まる場合の対処としてsudo loginctl enable-linger "$(id -un)"を挙げています。今回は管理者が先にlingerを有効にしておきます。
rootでは動かさないでください。公式ドキュメントによると、rootでT3 Codeを動かすと、別のインストールと別のConnect IDが作られます。さらにリモートのブラウザ機能では、サーバーがrootだとChromeのサンドボックスが起動しません。
専用ユーザーに切り替える
sudo -iu t3
export XDG_RUNTIME_DIR=/run/user/$(id -u)sudo -iuで切り替えただけでは、systemctl --userが使うXDG_RUNTIME_DIRが設定されないことがあります。設定されていないと、後でsystemctl --userが「Failed to connect to bus」のようなエラーで失敗します。lingerが有効なら/run/user/<UID>はすでに存在するので、2行目でそれを指定します。
t3ユーザーにSSH鍵を登録して、直接SSHでログインする方法でもかまいません。その場合、通常はこの環境変数は自動で設定されます。
バージョンを固定してインストールする
公式に勧められているインストール方法は、インストールスクリプトです。READMEとinstall.mdによると、npx t3@latestはインストールせずに一度だけ試すための方法で、install.mdはこれにNode.jsが必要だと書いています。常駐させるなら、公式のインストールスクリプトを使います。
curl -fsSL https://t3.codes/install.sh | T3CODE_VERSION=0.1.7 sh
ls -l ~/.local/bin/t3T3CODE_VERSIONは、shの側に渡す必要があります。curlの前に書くと、スクリプトにはこの値が届きません。値は0.1.7のように先頭にvを付けずに書きます。スクリプトがダウンロードURLを組み立てるときに、自分でvを付けるからです。
ls -lの結果では、~/.local/bin/t3が~/.t3/runtime/versions/0.1.7/t3へのシンボリックリンクになっているはずです。リンク先が別のバージョンなら、固定はうまくいっていません。
t3: command not foundと出る場合は、~/.local/binがPATHに入っていません。インストーラーは追加すべき行を表示するので、その行を~/.profileに書いてください。
npmのt3@0.1.7パッケージ自体は、小さなランチャーです。必要なのはNode 20.11以上で、実行するとGitHub Releaseからこのプラットフォーム用の実行ファイルをダウンロードします。どちらの方法でも、VPSからGitHubへの外向き通信が必要です。
エージェントを入れてログインする
T3 Codeは画面であって、エージェント本体ではありません。スレッドを始める前に、少なくとも1つのプロバイダーをインストールして、ログインしておく必要があります。T3 Codeを先に起動して、プロバイダーを後から設定することもできます。
プロバイダーのCLIはt3ユーザーでインストールし、t3ユーザーでログインします。理由は、T3 Codeがサーバー側の設定を使うからです。Claudeのドキュメントには、T3 CodeはClaude Code自身のログインと設定を使うと書かれています。リモート接続では、接続先サーバーのClaude設定が使われます。ログインはそのマシン上で行うので、スマホから使う場合も、ログインはスマホではなくVPS側で行います。
サブスクリプションでログインするかAPIキーを使うかは、Claude Codeのログイン方式、サブスクリプションとAPIキーの違いで説明しています。ここでは繰り返しません。プロンプトキャッシュの持続時間も方式で変わります。T3 Codeのドキュメントでは、Claudeのサブスクリプションなら約1時間、APIキーやBedrock、Vertexなら5分です。
Codexの場合は、t3ユーザーでcodex loginを実行します。画面に表示されるURLをブラウザで開いてサインインします。リモートでのサインインが自動で戻ってこない場合は、最後に表示されるlocalhostページのURLをまるごと、T3 Codeのサインイン欄に貼り付けます。
バックグラウンドサービスとして登録する
t3 service install
t3 service status
systemctl --user status t3code.servicet3 service statusは、サービスが動いているか、自動起動が有効か、ログアウト後も動き続けられるかを表示します。ログの場所も分かります。systemctl --user statusでactive (running)と出れば、サービスは正常に動いています。
新しくインストールしたサービスは、このマシンの中からしか接続を受け付けません。公式ドキュメントの表現では「A new service answers only on this machine」です。管理者ユーザーでsudo ss -tlnpを実行して、T3 Codeのプロセスが127.0.0.1でだけ待ち受けていることを確認してください。ポート番号は環境で変わるので、記事の例をそのまま信じず、t3 service statusで確認します。
t3 up --lanや、T3CODE_LAN=trueは使いません。これを使うと、ローカルネットワークとTailscaleのアドレスで待ち受けるようになります。VPSの「ローカルネットワーク」は、事業者の内部ネットワークです。ドキュメントによると、そうして開いたホストを守るのはペアリングコードだけです。
Tailscale Serveでtailnet内だけに公開する
VPSとスマホ、ノートPCを同じtailnetに参加させます。Tailscaleクライアントのインストール手順は、Tailscale公式のダウンロードページを見てください。ServeとFunnelの違いはTailscale ServeとFunnelの違いで詳しく説明しています。要点は、Serveはtailnet内だけで使え、Funnelはインターネットに公開する機能だということです。ここではServeだけを使います。
Tailscaleのドキュメントには、Serveを使うにはtailnetでHTTPS証明書を有効にする必要があると書かれています。管理コンソールのDNS設定で、HTTPS証明書を有効にしてください。
t3ユーザーはroot権限を持たないので、tailscaledを操作する権限を与えます。これは管理者ユーザーで実行します。
sudo tailscale set --operator=t3Tailscaleのドキュメントによると、operatorはServeとFunnelのポート転送先を管理できます。ファイルやディレクトリ、Unixソケットの公開には、引き続きrootが必要です。T3 Codeが使うのはポート転送なので、これで足ります。
次に、t3ユーザーに戻って、動いているサーバーに対してTailscale経由のペアリングリンクを作ります。
t3 pair --tailscaleリンクはhttps://machine.tailnet.ts.net/のような形のアドレスになります。pair --tailscaleが作ったマッピングは、再起動後も残ります。既定のポートが使用中なら、--tailscale-serve-portで別のポートを選びます。サービスを使わず、手元で一度だけ試すならt3 serve --tailscale-serveでも起動できます。このコマンドはTailscale HTTPS付きでサーバーを起動します。
pair --tailscaleが権限エラーで失敗する場合、たいていoperatorの設定がまだです。それ以外のエラーなら、t3 pair --helpとTailscaleのドキュメントを確認してください。
スマホとノートPCをペアリングする
ドキュメントの手順は、QRコードをスマホで読み取るか、ペアリングURLを受け取る側のアプリの「Add environment」に貼り付ける、というものです。ターミナルにQRコードが表示されるかはバージョンによって違う可能性があるので、表示されなければURLを貼り付けてください。
ペアリングリンクは一回限りで、端末ごとに新しいリンクを作ります。一度つないだ端末は、元のリンクがなくても再接続できます。ドキュメントは、ペアリングURLと認可コードをパスワードと同じように扱うよう求めています。チャットやメモアプリに貼り付けたままにしないでください。
--scopeを付けずに作ったペアリングトークンには、アクセスやT3 Connectの管理を含むすべての権限が付きます。閲覧用の端末なら、権限を絞ります。
t3 pair --tailscale --scope orchestration:read --scope relay:readこの組み合わせ方はドキュメントのnpx t3 pair --scope ...の例を元にしています。--tailscaleと--scopeを一緒に使えるかは、t3 pair --helpで確認してください。
接続済みのセッションは、ヘッドレスのサーバー上で一覧表示して取り消せます。
t3 auth session list
t3 auth session revoke <id>スマホをなくしたら、まずこのコマンドでその端末のセッションを取り消します。その後、Tailscaleの管理コンソールからその端末を削除します。
スマホから操作する方法そのものは、スマホからClaude Codeを操作する方法で比較しています。tmuxとSSHで十分な人もいます。その場合はVPS上のtmuxでClaude Codeを動かす構成の方がシンプルです。
初期値のFull accessが意味すること
T3 Codeのpermission-modes.mdによると、新しいスレッドの初期値はFull accessです。Full accessでは、コマンドの実行もファイルの編集も、承認の確認なしに行われます。ほかのモードは、コマンドとファイル変更のたびに承認を求めるSupervised、Auto-accept edits、Autoです。
変更する場所は、Settings → Threads → New threads → Permissionsです。プロジェクトごとに、環境の既定値を上書きすることもできます。プロバイダー側の設定でFull accessでも確認が出ることがあります。たとえばClaudeは、自身の設定で権限バイパスが無効になっていれば承認を求めます。このドキュメントはmainブランチのもので、0.1.7のタグとは照合していません。インストールしたバージョンのSettings画面で、実際の初期値を確認してください。
VPSでFull accessを使うと、エージェントは確認なしでt3ユーザーができることをすべてできます。そのため、次の5つを守ります。
- 専用ユーザーで動かし、sudo権限を与えない。エージェントが
rm -rfを実行しても、消えるのはこのユーザーのファイルまでです。 - 本番の秘密情報を置かない。本番データベースのパスワードや、クラウドのrootキーをこのVPSに置くと、エージェントが読めてしまいます。プロンプトインジェクションを含むREADMEを1つ読んだだけで、それが外に送られる可能性があります。
- 作業前にスナップショットを取る。壊れたら戻すだけで済みます。
- 入口はtailnetだけにする。T3 Codeのポートを、ファイアウォールでインターネットに開けないでください。
- よく知らないリポジトリでは、スレッドをSupervisedにする。
5つ目について補足します。「公開ポートを開けない」というのは、このサイトの推奨です。T3 Codeのドキュメントにある警告ではありません。ドキュメントが書いているのは、ネットワークに開いたホストを守るのはペアリングコードだけだ、ということです。そこから、公開ポートにすべきではないと判断しています。エージェント用VPS全体の守り方はVPSでClaude Codeを安全に動かす方法に、使い捨て環境の作り方はコーディングエージェントを使い捨てVMで動かすにまとめています。
アップデートとバージョン固定の関係
t3 updateは最新のリリースに更新します。バックグラウンドサービスは、今のリリースチャネルのままです。固定した0.1.7のサービスも、更新するとstableの最新版に進みます。サイドバーの更新ボタンを押した場合も同じです。
古いリリースに戻す操作は、リモートからはできません。そのマシン上でt3 update --channel stable --allow-downgradeを実行します。サービスの更新に失敗した場合は、前のバージョンに戻ることがあります。
安定させたいなら、更新ボタンは押さず、スナップショットを取ってからt3 updateを手で実行します。そのあとt3 service statusで状態を確認してください。
T3 Connectという別の道と、tailnetだけの構成で失うもの
T3 Connectは、ルーターのポート転送なしで別の端末からホストに届く仕組みです。T3のアカウントでサインインし、ホスト上のcloudflaredトンネルがCloudflareのポート7844へ外向きに接続します。TCPとUDPの両方を使います。1アカウントで連携できるマシンは3台までで、スマホやブラウザは数に入りません。T3 Chatの有料プランなら、Proで10台、Premierで100台に増えます。FAQには「T3 Connect is free too, for now.」とあります。2026年11月8日時点で、T3 Connectは現在無料です。ただし、この先も無料とは書かれていません。
この記事でT3 Connectを使わないのは、通信がCloudflareとT3アカウントを経由するからです。tailnetだけの構成では、それがありません。代わりに失うものが1つあります。スマホへのプッシュ通知です。ドキュメントによると、バックグラウンドでの通知にはT3 Connectが必要で、直接接続やTailscale接続だけでは通知は届きません。エージェントの作業が終わったかは、自分でアプリを開いて確認することになります。
逆に、Tailscale ServeのHTTPSには利点があります。ブラウザでの音声入力は、HTTPSかlocalhostの上でしか動きません。ts.netのHTTPSアドレスなら、スマホのブラウザからも音声入力を使えます。
テレメトリを止める
T3 Codeは、使っているプロバイダー、モデル、推論の強さ、権限モード、ハッシュ化したIDといった基本的な利用イベントをingest.t3.codesに送ります。プロンプト、応答、ファイルの中身、認証トークンは送られません。サーバー側で止めるには、~/.t3/service.envに1行足してサービスを再起動します。
echo 'T3CODE_TELEMETRY_ENABLED=false' >> ~/.t3/service.env
chmod 600 ~/.t3/service.env
t3 service restartこの設定で止まるのは、サーバーの利用イベントとリレーのトレースです。モバイルのリレートレースには別のスイッチがありません。ブラウザのWebアプリは、サーバーのこの環境変数を見ません。
うまくいかないとき
SSHを閉じるとサービスが止まる。 lingerが無効です。管理者ユーザーでsudo loginctl enable-linger t3を実行してから、t3 service statusで「ログアウト後も動き続けられる」と表示されるか確認します。
systemctl --userがバスに接続できないと言う。 sudo -iuで切り替えたときにXDG_RUNTIME_DIRが設定されていません。export XDG_RUNTIME_DIR=/run/user/$(id -u)を実行してから、もう一度試します。
ペアリングしたのにスレッドを始められない。 そのサーバー上でプロバイダーがログインしていません。スマホでログインしても意味はありません。t3ユーザーでVPSにログインし、プロバイダーのCLIでサインインします。
エージェントのメモリ使用でサーバーが固まる。 Linuxではt3 service protectを実行すると、エージェントが大量のメモリを使ってもサーバーが応答し続けるよう保護されます。元に戻すにはt3 service protect --undoです。
FAQ
T3 Codeの画面は日本語化できますか?
2026年11月8日時点では、できません。T3 CodeのUIは英語だけで提供されています。翻訳のプルリクエストはいくつか開いていますが、どれもマージされていません。いちばん進んでいる#31313で追加される言語も、English、Español、中文(简体)だけで、日本語は含まれていません。ドキュメントにある言語設定は、音声入力の認識言語だけです。日本語の音声入力は、この設定をAutoにすれば自動で判定されます。インストールしたバージョンのSettingsも確認してください。
T3 CodeはWSLで動きますか?
動きます。FAQには、WindowsユーザーはWSLの中でエージェントを動かせると書かれています。Settings → Sharing & accessでWSLのディストリビューションを選び、プロバイダーのCLIはそのディストリビューションの中にインストールします。T3 Codeのサーバー部分は、T3 Codeが自動でそこに入れます。アプリ更新後の最初の起動は、遅くなることがあります。
T3 CodeとOrcaは何が違いますか?
Orca(stablyai/orca)は、複数のコーディングエージェントを並列で動かすデスクトップアプリです。エージェントごとに専用のgit worktreeを使います。こちらもMITライセンスで、デスクトップアプリとモバイルアプリがあり、リモートのOrcaサーバーやSSHホストでも作業できます。このサイトでの比較としては、Orcaは並列worktreeの管理役、T3 Codeは各エージェントのハーネスをひとつの画面から操作する道具、と整理できます。OrcaのUIが日本語に対応しているかは、READMEには書かれていません。
T3 Codeは無料ですか?
T3 Code自体は無料で、MITライセンスのオープンソースです。FAQには、T3 Codeに支払う方法はないと書かれています。料金がかかるのは、Claude CodeやCodexなど、各エージェントのサブスクリプションかAPI利用料です。T3 Connectも2026年11月8日時点で無料ですが、FAQは「for now」と書いているので、将来も無料だとは限りません。
Full accessのままVPSで使っても大丈夫ですか?
条件付きです。新しいスレッドの初期値はFull accessで、承認なしにコマンドと編集を実行します。sudoのない専用ユーザーで動かし、本番の秘密情報を置かず、スナップショットを取り、tailnetだけから接続できるようにしているなら、壊れるのはそのユーザーの作業領域までです。どれか1つでも欠けるなら、Settings → Threads → New threads → PermissionsをSupervisedに変えてください。