ブログ
プロトタイプから製品へ:Tactic Remote の開発の軌跡
8週間で13のマイルストーンを達成し、Tactic Remote を概念実証の tmux ラッパーから本番運用可能なリモート開発ツールへと進化させました。これはその全記録です。
このカテゴリのプロダクト/開発アップデートを確認できます。
カテゴリを見るTactic Remote は2026年1月初旬のある疑問から始まりました。実行中の Claude Code セッションをスマートフォンから確認できたらどうだろう? その疑問は週末でプロトタイプになり、2週間以内に使えるツールとなり、最初のバージョン番号付きリリースを出荷する前に13のマイルストーンを完了しました。これはその開発の軌跡の物語です。何を作り、何を捨て、壊れたものを出荷せずに高速で出荷することから何を学んだか。
週末プロトタイプ(2026年1月初旬)
Tactic Remote の最初のバージョンはおよそ200行のコードでした。シェルスクリプトが tmux セッション内で Claude Code を起動し、Python の Flask サーバーが tmux capture-pane を実行して結果をプレーンテキストで返すエンドポイントを公開し、基本的な iOS アプリがそのエンドポイントを2秒ごとにポーリングして結果を等幅テキストビューに表示しました。
見た目も動作も粗雑でした。ポーリングモデルは更新ごとに2秒の遅延を意味しました。プレーンテキストキャプチャではすべての書式が失われました。認証もなく、同じ Wi-Fi ネットワーク上の誰でもターミナルを読めました。しかしコンセプトは実証されました。スマートフォンの画面から AI コーディングセッションを意味のある形で追跡できるということが。
そのプロトタイプは約4日間生き残り、その後再構築を開始しました。
マイルストーンアーキテクチャ
カレンダースプリントではなく、マイルストーンベースの開発モデルを採用しました。各マイルストーンには特定の技術目標、完了の定義があり、固定の期限はありませんでした。これにより、スプリントの終了時ではなく、準備ができた時にリリースできました。実際には、マイルストーンの平均所要期間は4〜5日でしたが、2日で完了したものもあれば、2週間近くかかったものもありました。
以下は凝縮された進捗です:
マイルストーン1-3:基盤構築。 Flask を Swift ネイティブの組み込みサーバーに置き換え。HTTP ポーリングの代わりに WebSocket によるリアルタイムストリーミングを確立。トークンベースの認証を実装。マイルストーン3の完了後、iPhone が200ms以内にターミナル更新を受信し、不正アクセスがブロックされる動作するシステムが完成しました。
マイルストーン4-5:セッション管理。 複数の並行 tmux セッションをサポート。セッションライフサイクル(作成、監視、アイドル、完了、クリーンアップ)を構築。起動時に既存の tmux セッションに再アタッチすることで、コンパニオンアプリの再起動をまたいだセッション永続性を追加。この時点で Tactic Remote はデモから実際の作業に使えるものになりました。
マイルストーン6-7:ヒューマン・イン・ザ・ループ。 Claude Code の hook システムと統合して承認リクエストをインターセプト。iOS で承認 UI を構築 — AI が何をしようとしているかを表示し、関連するコンテキストを示し、承認/拒否のアクションを提供。アプリを開いていなくても承認ができるようプッシュ通知を追加。この2つのマイルストーンが転換点でした。それ以前の Tactic Remote はターミナルビューアでした。それ以降はコントロールサーフェスになりました。
マイルストーン8-9:接続の堅牢性。 Wi-Fi からセルラーへのハンドオフを処理。指数バックオフによる自動再接続を実装。接続品質インジケーターを追加。手動でのIPとトークン入力を不要にするQRコードクイックコネクトフローを構築。マイルストーン9は最も困難な単一マイルストーンでした。iOS のネットワーキングエッジケースは多数あり、ドキュメントも不十分です。
マイルストーン10-11:Cloudflare Tunnel。 cloudflared を管理された子プロセスとして統合。デュアルモード接続アーキテクチャ(ローカルとトンネル)を構築。トンネルのヘルス監視、自動再起動、グレースフルフォールバックを処理。トンネル URL を QR コード生成に追加。
マイルストーン12-13:本番準備。 ローカライゼーション(7言語)。Mac スリープ防止。メニューバー UI の仕上げ。クラッシュレポートと診断。パフォーマンス最適化により、アイドル時のメモリフットプリントを約60 MBから25 MB未満に削減。認証とトランスポート層の最終セキュリティ監査。
主要な技術的決定
開発中のいくつかの決定が製品の性格を定義しました:
カスタム PTY 管理ではなく tmux
マイルストーン1の期間中、これについて広範に議論しました。カスタム PTY 管理はターミナルキャプチャのより細かい制御を可能にし、tmux 依存を排除できます。しかし、セッション永続性、ターミナルエミュレーション、プロセスライフサイクル管理の再実装も意味します。これらは tmux が15年かけて解決してきた問題です。その基盤の上に立つことを選び、再構築はしませんでした。
Server-Sent Events ではなく WebSocket
リアルタイムストリーミングにはどちらのプロトコルも機能します。WebSocket を選んだのは、双方向通信が必要だったからです。iPhone はターミナル出力を受信するだけでなく、コマンドや承認を Mac に送り返します。SSE では上り方向の通信に別チャンネルが必要となり、複雑さが増します。
スタンドアロンデーモンではなく組み込みサーバー
スタンドアロンデーモン(launchd で管理)は macOS アーキテクチャの観点からはより「正統」です。しかし、インストールの複雑さが倍増し、「サーバーは動いているがアプリは動いていない」というカテゴリのバグが生まれます。サーバーをメニューバーアプリに組み込むことで、インストールするもの、実行するもの、終了するものが一つになります。
OAuth/セッションベース認証ではなく静的トークン
Tactic Remote の脅威モデルは明快です。ネットワークからの不正アクセスを防止すること。キーチェーンに保存された暗号学的に安全な256ビットのトークンは、トークンリフレッシュ、セッション有効期限、ログインフローの複雑さなしにこれを実現します。ユーザーごとの認証が必要なエンタープライズユースケースには、外部レイヤーとして Cloudflare Access を推奨します。
ファイルシステム監視ではなく tmux ポーリング
PTY に対するファイルシステム通知 API(kqueue/FSEvents)ではなく、200ms間隔で tmux capture-pane をポーリングします。これはエレガントに聞こえないかもしれませんが、tmux のキャプチャコマンドは極めて高速(サブミリ秒)で、テストでは PTY デバイスに対するファイルシステム監視は macOS バージョン間で信頼性が低いことが判明しました。ポーリングアプローチは macOS 13、14、15で堅牢に動作しています。
捨てたもの
すべてが生き残ったわけではありません。注目すべきカットをいくつか:
Web ベースのクライアント。 マイルストーン6で、あらゆるブラウザで動作するレスポンシブ Web インターフェースを構築しました。動作はしましたが、体験はネイティブアプリに比べて明らかに劣りました。プッシュ通知なし、バックグラウンド再接続なし、承認時のハプティックフィードバックなし。ネイティブ iOS 体験に集中するため、一旦棚上げにしました。
ターミナルの色とフォーマット。 初期バージョンでは ANSI カラーコードを保持して iPhone でレンダリングすることを試みました。レンダリングは不安定で、ストリーミングプロトコルに大きな複雑さを加えました。ピクセル完全なターミナルエミュレーションを追求するのではなく、構造を保持するシンプルなレンダリングモデルに切り替えました。完全な ANSI サポートはロードマップに残っています。
自動タスク提案。 最近の git アクティビティに基づいて Claude Code タスクを提案する機能のプロトタイプを作りました。技術的には興味深いものでしたが、差し出がましく感じました。開発者は何をしたいか分かっています。ベータテスターの目に触れる前に削除しました。
バージョニングへの移行
マイルストーン13の後、マイルストーンベースのトラッキングからセマンティックバージョニングに移行しました。最初のバージョン付きリリースは1.2.0でした(1.0.0ではありません。クローズドテスト中に1.0と1.1の番号を付けた内部ビルドがあり、混乱を避けたかったためです)。
その後の進捗:1.2.0、1.3.0、1.4.0、1.4.2、1.5.0-beta.1。各バージョンはチェンジログに記載された明確なユーザー向け変更のセットに対応しています。マイルストーンシステムは高速プロトタイピング中にうまく機能しましたが、セマンティックバージョニングはアップグレードリスクを評価する必要のあるユーザーにより明確に伝わります。
学んだこと
最小の有用なものを出荷する。 週末のプロトタイプはあらゆるエンジニアリング基準で恥ずかしいものでしたが、唯一重要な疑問に答えました。スマートフォンから Claude Code を監視することは実際に役立つのか? その後のすべてのマイルストーンは、「次に最も有用な改善は何か?」に対する段階的な回答でした。
ネットワーキングが最も難しい部分。 接続の信頼性に費やした時間は、製品の他のどの側面よりも多くなりました。Wi-Fi からセルラーへのハンドオフ、スリープ後の WebSocket 再接続、Cloudflare Tunnel のヘルス監視。これらはそれぞれ完全なマイルストーンを消費しました。実際のターミナルキャプチャとセッション管理は比較的簡単でした。
依存関係は退屈であるべき。 tmux、cloudflared、キーチェーン、IOKit。Tactic Remote が依存する技術は安定しており、ドキュメントも充実しています。より新しいものやより斬新なものの採用を検討するたびに、既存の退屈な選択肢で十分かどうかを問いました。たいていの場合、答えはイエスでした。
マイルストーンベースの開発は小規模チームに適している。 スプリント計画、スタンドアップ、ベロシティ追跡のオーバーヘッドがなく、より速く動けました。各マイルストーンには明確なゴールラインがあり、実装中に学んだことに基づいてリアルタイムでスコープを調整できました。このモデルはチーム規模が大きくなると機能しなくなりますが、初期開発には適切でした。
タイムラインの概要
| 期間 | 出来事 |
|---|---|
| 2026年1月初旬 | 週末プロトタイプ:シェルスクリプト + Flask + 基本 iOS アプリ |
| 1月6-20日 | マイルストーン1-5:基盤、WebSocket、セッション |
| 1月20-29日 | マイルストーン6-9:承認、プッシュ通知、QR コネクト |
| 1月29日 - 2月10日 | マイルストーン10-11:Cloudflare Tunnel 統合 |
| 2月10-18日 | マイルストーン12-13:ローカライゼーション、仕上げ、セキュリティ監査 |
| 2月18日以降 | セマンティックバージョニング:1.2.0 から 1.5.0-beta.1 |
アイデアからオープンベータまで8週間。手を抜いたからではなく、スコープを徹底的に削り、実証済みの基盤の上に構築したからです。
各バージョンリリースの詳細については、チェンジログをご覧ください。
Tactic Remote を試す
スマートフォンからコーディングエージェントを操作
Mac、Windows、Linux 上の Claude Code や Codex などに接続。iPhone や iPad で進捗を確認し、次の指示を送れます。