一覧に戻る

ブログ

Tactic Remoteのアーキテクチャ:分散型コーディングプラットフォームの構築

Macを唯一の真実の源として維持しながら、iPhone上のすべてのインタラクションを即座に感じさせるシステムをどのように設計したか。

公開日 タグ: engineering / architecture / deep-dive
ブログ

このカテゴリのプロダクト/開発アップデートを確認できます。

カテゴリを見る

リモート開発プラットフォームの構築は、紙の上ではシンプルに聞こえます:1台のマシンでコードを実行し、別のマシンで表示する。実際には、エンジニアリングの課題は深いところにあります。レイテンシーの1ミリ秒ごとに信頼が損なわれます。接続が切れるたびに作業を失うリスクがあります。セキュリティの手抜きは災害を招きます。

この記事では、Tactic Remoteのアーキテクチャ — 私たちが下した決定、受け入れたトレードオフ、技術的方向性を導く原則 — を解説します。

コアの問題

開発者はClaude CodeのようなAIアシストコーディングツールへの依存を強めていますが、これらのツールはデスクトップターミナルに縛られています。デスクから離れると、AIアシスタントが何をしているか見えなくなります。Tactic Remoteはこれを解決するために存在します:Macが実行エンジンのままで、iPhoneがファーストクラスのコントロールサーフェスになります。

課題は、不格好なリモートデスクトップセッションではなく、シームレスに感じさせることです。

レイヤー化されたアーキテクチャ

Tactic Remoteは、それぞれ明確な責任境界を持つ4つの異なるレイヤーで構築されています:

レイヤー1:実行エンジン(Mac)

基盤にあるのは、tmuxセッション内でClaude Codeを実行するMacです。tmuxを意図的に選択しました — プロセスの永続性、セッションの多重化、プログラマティックなターミナル制御のためのよく理解されたインターフェースを提供するからです。Macコンパニオンアプリはtmuxのライフサイクルを管理し、セッションの健全性を監視し、上流のコンシューマー向けに軽量なHTTP APIを公開します。

このレイヤーでの主要な設計判断:

  • プロセス分離:各Claude Codeセッションは独自のtmuxウィンドウで実行され、プロジェクト間のクロスコンタミネーションを防止します。
  • 状態の永続性:tmuxセッションはアプリの再起動、ネットワーク断、さらにはシステムスリープサイクルを生き延びます。
  • 最小フットプリント:コンパニオンアプリはアイドル時にCPUとメモリのオーバーヘッドをほとんど追加しません。

レイヤー2:トランスポートレイヤー

MacとiPhoneの間にトランスポートがあります — 直接のローカルネットワーク接続、またはリモートアクセス用のCloudflare Tunnelです。

ローカルモードはデバイス検出にmDNS/Bonjourを、データ転送に直接HTTPを使用します。良好なネットワークでは10ms未満のラウンドトリップタイムとなり、ターミナルストリーミングが瞬時に感じられます。

Cloudflare TunnelモードはCloudflareのエッジネットワーク経由でトラフィックをルーティングします。レイテンシーが追加されますが(通常30〜80ms)、どこからでもアクセスできます — カフェ、通勤電車、世界中から。Mac側ではCloudflareのcloudflaredデーモンを活用し、アウトバウンド専用接続を確立するため、ファイアウォールでポートを開く必要がありません。

┌─────────────┐         ┌──────────────────┐         ┌─────────────┐
│   iPhone    │◄───────►│  Transport Layer  │◄───────►│     Mac     │
│  (Control)  │   HTTP  │  Local / CF Edge  │   HTTP  │ (Execution) │
└─────────────┘         └──────────────────┘         └─────────────┘

レイヤー3:セッションマネージャー

セッションマネージャーは運用の頭脳です。Mac上で実行され、アクティブなtmuxセッションのレジストリを維持し、その状態(アイドル、実行中、入力待ち)を追跡し、再接続の複雑なオーケストレーションを処理します。

iPhoneがネットワーク中断後に再接続すると、セッションマネージャーはミリ秒単位でいくつかの質問に答える必要があります:

  1. 切断前にどのセッションがアクティブだったか?
  2. ギャップ中にターミナル出力が蓄積されたか?
  3. 機密操作に対するユーザー承認を待っているセッションはあるか?
  4. 各Claude Codeインスタンスの現在のプロセス状態は何か?

これをイベントソーシング(状態遷移を不変のイベントとして記録)とスナップショットキャッシング(迅速な復元のためにターミナルバッファ状態を定期的にキャプチャ)の組み合わせで解決しています。

レイヤー4:モバイルインターフェース

iPhoneアプリは意図的にターミナルエミュレーターではありません。スマートフォンの画面にフルターミナルを詰め込むと、ひどいユーザー体験になるという早期の判断を下しました。代わりに、モバイルレイヤーは以下を提供します:

  • 会話ビュー:Claudeの推論と出力を読みやすい形式で表示。
  • ターミナルピーク:必要な時に生のターミナル出力にすばやくアクセス。
  • 承認コントロール:人間の確認が必要な操作のワンタップ承認/却下。
  • 通知ブリッジ:タスク完了と承認リクエストのプッシュ通知。

レジリエンスパターン

現実のネットワークは信頼できません。電話はエレベーターで電波を失います。部屋を移動するとWi-Fiが切れます。私たちのレジリエンス戦略は3つの原則に基づいています:

切断は正常と想定する。 すべてのコンポーネントは、ネットワーク分断中に独立して機能するように設計されています。Macは実行を継続します。iPhoneは最後の既知の状態をキャッシュします。再接続は完全な再起動ではなく、状態調整プロトコルをトリガーします。

作業を決して失わない。 ターミナル出力は設定可能な保持期間でMac側にバッファリングされます。iPhoneが1時間オフラインでも、再接続すると起こったことがすべて表示されます。

目に見える形で失敗する。 何か問題が起きた時、ユーザーは永遠に解決しないスピナーではなく、正直なエラーメッセージを見ます。数秒以内に現実を反映する接続状態インジケーターに大きく投資しました。

セキュリティ・バイ・デザイン

AI生成コードをリモートで実行することは、重大なセキュリティ上の問題を提起します。セキュリティモデルの詳細はセキュリティモデルドキュメントで説明していますが、アーキテクチャ上のハイライトは以下の通りです:

  • ゼロトラストトランスポート:すべての通信は暗号化されます。ローカル(TLS)でもトンネル(Cloudflareの暗号化レイヤー)でも。
  • 承認ゲート:機密操作(ファイル書き込み、シェルコマンド、ネットワークアクセス)は実行前にモバイルでの明示的な承認が必要です。
  • クラウド依存なし:コードがMacから出ることはありません。Tactic Remoteはコントロールプレーンであり、データプレーンではありません。

次のステップ

アーキテクチャに完成はありません。マルチMacサポート(1台のiPhoneから複数の開発マシンに接続)、コラボレーティブセッション(複数のチームメンバーが同じClaude Code実行を監視)、より深いIDE統合に積極的に取り組んでいます。これらのそれぞれが、構築した信頼性を損なうことなくアーキテクチャを拡張する必要があります。

分散型開発ツールを構築している方にとって、この概要が有用であることを願っています。そして、このアーキテクチャを直接体験したい方は、こちらから始めてください。

Tactic Remote を試す

スマートフォンからコーディングエージェントを操作

Mac、Windows、Linux 上の Claude Code や Codex などに接続。iPhone や iPad で進捗を確認し、次の指示を送れます。