コンテンツにスキップ

ホスト型 Andon:どこからでもボードを

Andon は ローカルファーストで、永久に無料でセルフホストできます — これが既定のままで、何も共有しません。 このガイドが扱うのは、オプションでオプトイン式の ホストモードです。暗号文だけを中継し、エージェントの内容を 読み取れない(コンテンツブラインドな)中継を通じて、どこからでもボードを見て(スマホに通知を受け取り)ましょう。

他の人と共有するために中継をデプロイしますか?deploy-relay.md を参照してください。


  • すべてのステータスイベントは、送信される前に あなたのマシン上でエンドツーエンドに暗号化 されます。
  • 中継 はその 暗号文 を保存・転送するだけで、鍵を持つことはありません — 中継に見えるのは大まかな ルーティング情報だけです(どのボードか、ハッシュ化されたセッション ID、working/waiting/done/error/idle、タイミング)。
  • セルフホストと 同じボード を開きます。復号は あなたのブラウザ 内で、リンクの #fragment に含まれる鍵を 使って行われます(鍵はサーバーに送られません)。Service Worker も同じ方法でスマホのプッシュ通知を復号します。
  • ローカルの andon serve は不要 です — フックの通常の送信経路が、封印されたコピーも一緒に転送します。

使い方は 2 通りあります:

中継を動かす人使える人
A. 自分の中継あなた(自分が管理するマシン上の andon relayあなただけ
B. 共有中継運用者が、1 つの公開 HTTPS URL で多くの人 — それぞれが 同じ URL の下で、自分専用の隔離されたボードを持ちます

どちらも同じコードで、B は A を公開しただけです。マルチテナント を参照してください。


Terminal window
# 1) Run a relay (yours), or skip this and use a shared relay URL someone gives you
andon relay # listens on :8788 (see deploy-relay.md for HTTPS/public use)
# 2) Opt in — generates a key that NEVER leaves your machine, prints your board link
andon hosted setup http://127.0.0.1:8788
# → prints: http://127.0.0.1:8788/b/<board-id>#k=<key>
# 3) Open that link in a browser. Done — your agents now show up there.

andon hosted setup はまず、中継が何を見られて何を見られないかを正確に示し、[y/N] を尋ねます (既定は No)。有効にすると、Claude Code / Codex のすべてのステータスが(封印された状態で)中継にも転送されます。

ボードリンクはパスワードのように扱ってください#k=… の部分が あなたの復号鍵そのもの です。スクリーンショットを 撮ってチャットに貼らないでください。パスワードマネージャーに保存しましょう。(または、ターミナルに表示される QR をスキャンすれば、コピー&ペーストなしでペアリングできます。)


  • 同じコンピューター上で: http://127.0.0.1:<port>/b/<board-id>#k=<key> を開きます。localhost / 127.0.0.1 は セキュアコンテキストなので、ブラウザ内での復号は素の HTTP でも動作します。
  • スマホ/別のデバイスで: 中継が HTTPS でアクセスできる必要があります(ブラウザは復号とプッシュ通知に セキュアコンテキストを要求します)。簡単な方法が 2 つあります:
    • Tailscale(すでに使っているもの):tailscale serve --bg <relay-port>https://<machine>.<tailnet>.ts.net のアドレスが得られます。スマホで https://…ts.net/b/<board-id>#k=<key> を開きます。
    • 本物のドメイン + 証明書(共有中継の場合)— deploy-relay.md を参照してください。
  1. スマホでボードリンクを HTTPS 経由で開きます。
  2. iPhone: 共有 → ホーム画面に追加(iOS はインストール済みの PWA からの Web Push のみ許可します)。その後、 ホーム画面から開きます。Android/Chrome: 通常のタブから動作します。「ホーム画面に追加」は任意です。
  3. 通知を有効化 をタップ → 通知を許可します。エージェントが最初に あなたの対応を必要とした とき、または 行き詰まった ときに、ボードを閉じていてスマホがロックされていても、通知が届きます。通知のテキストは あなたのスマホ上 で復号され、中継がそれを見ることはありません。

Terminal window
andon hosted status # is hosted on? which relay + board id
andon hosted pair # re-print your board link — add a device, or recover a lost link
andon hosted off # stop forwarding — your agents go back to local-only
andon verify <relay-url> # check the relay serves the exact open-source code (see below)

オンとオフの切り替えは自由です。off はローカルの設定(~/.andon/hosted.json)を削除するだけです。


中継が見えるもの/見えないもの

Section titled “中継が見えるもの/見えないもの”
読み取れないあなたのプロンプト、コード、プロジェクト名、タイトル、メッセージ、レバレッジの集計
見えるあなたがアクティブであることと、おおよその時刻(イベントごとのタイミング)、セッション数、あなたの IP、暗号文サイズの区分
できるイベントを遅延/保留する、または 過去に実際にあった プッシュ通知の 1 つを再表示する(すでに解決済みのセッションに対する古い「対応が必要」) — ただし 新しいコンテンツを捏造することはできず、それを読むこともできません

セルフホストは 何も 共有せず、既定のままです。ホストモードは、利便性とメタデータのトレードオフを率直に示したものです。


「信頼するだけでなく、検証できる」(透明性)

Section titled “「信頼するだけでなく、検証できる」(透明性)”

Web ボードのコードは 中継から配信される ため、「侵害されても読めない」という完全な保証が成り立つのは、 インストール済みのアプリの場合だけです。Web ボード については、正直な主張は 「あなたに こっそり バックドアを仕掛けることはできない」 というものです:

Terminal window
andon verify https://relay.example.com

これは、中継が実際に配信しているボードと Service Worker を取得してハッシュ化し、あなた自身の オープンソースのコピーのバイト列と比較します。一致 すれば、中継は監査済みのコードをそのまま配信している — 鍵を盗む隠し細工はない、ということです。同じバージョンで 不一致 が続く場合は、改変されたコードを配信している ということです。鍵を預けてはいけません。中継は GET /version で自身のハッシュも宣言します。


マルチテナント — 1 つの URL、複数のボード

Section titled “マルチテナント — 1 つの URL、複数のボード”

中継は 設計上マルチテナント です:1 つのプロセスが多くのボードを配信し、入り口はユーザーごとの サブドメインではなく 単一の URL です。

https://relay.example.com (one URL = the shared entry)
├── /b/<A's board-id>#k=<A's key> only A's key decrypts it
├── /b/<B's board-id>#k=<B's key> only B's key decrypts it
└── /b/<C's board-id>#k=<C's key> only C's key decrypts it
the relay holds only ciphertext for all of them

全員が andon hosted setup https://relay.example.com を実行し、それぞれがその 1 つの URL の下で 256 ビットの推測不可能な ボード ID を取得します。隔離は 2 層構成で、テストされています:

  • 誰も他人を読めない: ボードごとの鍵 K。中継は暗号文のみを保存します(コンテンツブラインド)。
  • 誰も他人に書き込めない: ボード ID は読み取りの権限です。書き込みには、そのボード自身の取り込みトークンが 必要です(B のボードに対する A のトークン → 401)。

アップグレード(インストール済みの PWA)

Section titled “アップグレード(インストール済みの PWA)”

自動です — アプリストアも、再ペアリングも不要。

  • ボードの HTML は no-store で配信され、何もキャッシュしないため、起動するたびに最新版が読み込まれます。
  • Service Worker は自動更新されます(ブラウザは再起動・ナビゲーション・約 24 時間ごとに /sw.js を再チェックします。 skipWaiting() を呼ぶので、新しいバージョンがすぐに引き継ぎます)。
  • K は、サーバーではなく あなたのデバイス上のブラウザの IndexedDB に保存され、更新後も残ります → ペアリングは維持されます。PWA を再起動するだけで最新版になります。

(新しい デバイス は一度だけペアリングが必要です — そのデバイスの IndexedDB にはまだ K がありません。)


  • ボードリンク(#k=…)をなくした? それは中継上にはありません — 中継はあなたの鍵を一度も持っていません。 リンクは、andon hosted setup を実行したマシン上にあります:そこで andon hosted pair を実行すると完全なリンクが 再表示されます(または ~/.andon/hosted.json を読んで、relayUrl + /b/ + boardId + #k= + key をつなげます)。 一度も ペアリングしていないデバイスは、中継からリンクを復元できません — そのマシンに戻ってリンクを取得し、新しい デバイスで一度開いてください。
  • 「再ペアリング — この端末でボードのリンクをもう一度開いてください」 このデバイスには鍵がありません(新しい デバイス、ストレージのクリア、または #k が取り除かれたホーム画面からの起動)。完全なボードリンク(#k=… 付き)を もう一度開いてください。鍵が再キャッシュされます。
  • ボードは読み込まれるが、すべて空白/復号されない。 おそらく #k=… の部分 なし のリンクを開いています (# で切り詰めるツールがあります)。リンク 全体 をコピーし直してください。
  • 古いカードが消えない。 カードは、エージェントが done/gone を送信したとき、または 6 時間の TTL 経過後に 消えます。終了したセッションは通常は自動的に片付きます。停止した/テスト用のセッションは、TTL まで残ります。
  • スマホにプッシュ通知が来ない。 プッシュ通知には HTTPS が必要です(そのため 127.0.0.1 経由のボードは プッシュしません)。iPhone ではまずボードを ホーム画面に追加 する必要があり、さらに 通知を有効化 を タップして通知を許可する必要があります。
  • すべて停止: andon hosted off(転送を停止)と、自分の中継を動かしていた場合は lsof -ti tcp:<port> | xargs kill