- 静的ウェブサイトを利用した分散型ソーシャルネットワーキングプロトコルで、各ユーザーが自分のデータを直接所有・管理する構造
- すべてのデータは暗号化された JSON ストアに保管され、ブラウザクライアントがフィードを集約し、投稿を公開
- サーバーやリレーなしで、友人同士のウェブサイトとブラウザ間の直接通信で動作
- ユーザーのドメイン名がそのままアイデンティティとなり、HTTPS/TLS を通じて認証
- 単純な構造で自己主権型ソーシャルネットワークを実現し、個人間の信頼に基づく交流に焦点
sAT Protocol 概要
s@ は静的サイトベースの分散型ソーシャルネットワーキングプロトコルで、各ユーザーが自分のウェブサイトにデータを保存
- すべてのデータは暗号化された JSON ファイルの形で保存され、ブラウザクライアントがこれを読み取って投稿の公開とフィード集約を実行
- 中央サーバーやリレーなしで動作し、データはユーザーのサイトから友人のブラウザへ直接移動
- 相互フォロー関係がなければ投稿のやり取りはできず、インフルエンサー中心の構造を排除
- プロトコルは GitHub Pages など特定のホスティングサービスに依存しない
アイデンティティ (Identity)
- ユーザーのドメイン名がアイデンティティの役割を果たす
- HTTPS/TLS によって、そのドメイン所有者がコンテンツを公開したことを認証
ディスカバリー (Discovery)
暗号化モデル (Encryption Model)
- すべてのユーザーデータは暗号化された JSON ストアに保存され、ユーザー本人とフォロワーだけが復号可能
- X25519 キーペアを使って公開鍵を
profile.json に公開し、秘密鍵はブラウザの localStorage に保存
- 投稿データはXChaCha20-Poly1305で暗号化され、コンテンツキーはフォロワーごとに
libsodium の crypto_box_seal で暗号化
keys/_self.json ファイルにはユーザーのコンテンツキーと公開用シークレット情報が含まれ、本人のみ復号可能
鍵ローテーションとアンフォロー
- アンフォロー時には新しいコンテンツキーを生成し、すべての投稿を再暗号化
- 残っているフォロワー向けに新しい鍵エンベロープを生成し、
keys/_self.json を更新
- アンフォローされたユーザーは以後投稿を復号できない
復号フロー
- 訪問者が友人のサイトを訪れると、自分の秘密鍵で
keys/{follower-domain}.json を復号してコンテンツキーを取得
- その後
posts/index.json と個別投稿 (posts/{id}.json.enc) を取得して復号
データ構造 (Data Schema)
- 各投稿は個別に暗号化されたファイルとして保存され、
posts/index.json には投稿 ID が新しい順に並ぶ
- 投稿オブジェクトの例:
{
"id": "20260309T141500Z-a1b2",
"author": "alice.com",
"created_at": "2026-03-09T14:15:00Z",
"text": "Hello, decentralized world!",
"reply_to": null,
"reply_to_author": null
}
- 投稿 ID は ISO8601 UTC タイムスタンプと 4 桁のランダムハッシュで構成
フォローリスト (Follow List)
フィード集約 (Feed Aggregation)
- クライアントはフォローリストを読み、各フォロー先の投稿を復号して時系列フィードを構成
- 投稿は
created_at 基準の降順でソート
返信 (Reply)
- 返信は
reply_to と reply_to_author フィールドが設定された投稿
- ネストされた返信はサポートせず、最上位投稿にのみ直接返信可能
- 元の投稿を見られない場合(未フォロー状態など)、返信は表示されない
公開 (Publishing)
- 新規投稿を作成 → コンテンツキーで暗号化 → 静的サイトへアップロード →
posts/index.json を更新
- アップロードには GitHub Contents API などを利用可能
- 公開用シークレット情報は
keys/_self.json に暗号化して保存
静的サイト構造の例
{domain}/satellite/
profile.json # 公開鍵およびプロフィール
posts/
index.json # 投稿 ID 一覧
{id}.json.enc # 暗号化された投稿
follows/
index.json # フォロー一覧
keys/
_self.json # コンテンツキーおよび認証情報
{domain}.json # フォロワーごとのコンテンツキー
FAQ
- 「RSS + 暗号化?」 → はい
- 「AT Protocol から firehose をなくした版?」 → はい
- 「スケーラブルか?」 → いいえ(「友情もスケールしない」)
- 「s は slow/shitty の略?」 → はい
- 「セルフホスト可能?」 → はい、ただし CORS の有効化が必要
1件のコメント
Hacker Newsのコメント
このプロジェクトも、多くのオルタナティブなソーシャル/セルフホスト型ネットワークが抱える問題を同じように抱えているように感じる
暗号化中心の設計は確かに格好いいが、新しい端末に乗り換えたときに友人のフォローを復元しにくく、X25519鍵ペアのような概念も一般の人には理解しづらい
自分は、単純にID・パスワードベースでサーバーが暗号化を代行する構造のほうが現実的だと思う
こういうアプローチこそ、非技術ユーザーでも使えて、ビッグテックの代替になり得る方向だと思う
ただし家族や友人には自分が代わりに設定してあげる必要があるかもしれない。それでも、自分だけのWebサイトを持てるようになればかなり気に入ると思う
実際には、静的ブログをBlueSkyに統合するアイデアと見ることができる。
BlueSkyのアイデンティティを活用したり、静的サイトジェネレーターのプラグインで認証情報を自動取得する形に改善できそうだ
関連記事 を参照
ブラウザのlocalStorageに秘密鍵を保存するという点に驚いた
ブラウザ設定の初期化や再インストールでデータが消え、バックアップもしづらく、マルウェアからのアクセスは容易だ
結局、鍵を失えばフィードも永久に失われるので、ユーザー離れにつながる危険が大きい
URL.createObjectURL(localStorage.getItem(...))のような簡単なコードでファイル保存を促せるもちろん鍵を失えばアクセス不能になるが、2FAや暗号資産ウォレットの利用者も同様の責任を負っているので、完全に不可能という話ではない
/satellite/パスの代わりに/.well-known/を使ってはどうかという提案Well-known URI 標準を参照している
.well-knownはホスト全体向けなので、ストリーム単位には不適切だと主張している。複数ディレクトリに分けておくほうがよいという見方だ.well-known/の提案は真剣に検討する価値があると思うすでにIANA登録標準として広く使われており、セキュリティや発見のためのファイルがここに置かれている
/satellite/satproto.jsonではなく/.well-known/satproto.jsonに置けば衝突も避けられ、プロトコルのエンドポイントであることも明確になる.well-knownはホスト単位なので、アカウントごとに複数ディレクトリを置きたい場合には適さないという反論もあるソーシャルネットワークのプロトコルは、技術そのもののためではなくユーザーに直接的な利益を与える必要がある
BitTorrentのように、人々が単純に「必要だから」参加するようになってこそネットワーク効果が生まれる
データ管理や共有のしやすさから出発するアプローチが現実的だと思う
LemmyやPixelfedはコンテンツが少なく、「何も起きていない場所」のように感じた
Signalも同様に単なるメッセージング用途なので、「スクロールする理由」がない
結局、継続的に訪れてもらうにはコンテンツとFOMO(見逃すことへの恐れ) が必要だ
本当に分散化されたソーシャル/E2EEメッセンジャーを作るなら、Discordのように各サーバーが実際に独立してホストされる構造が必要だ
アカウントはNostrのようなプロトコルで管理し、Yggdrasil Network上で動かしてIPv4/6やDNSへの依存を減らすべきだ
HTTPSでトラフィックを包み、NAT越えを自動化すれば、誰でもサーバーを運用できる
そうした構造になってこそ、ビッグテックや政府の統制から逃れられる
サーバーが消えてもデータはエッジに残り、ユーザーのブラウザがホストの役割を担うこともできる
ephemeral-p2p-project を参照
各デバイスがサーバーとして動作し、WebRTCで完全なP2Pメッセージングを実現している
インターネットがなくても無線接続でデータ交換が可能だ
以前にはFOAFや Pingback のような完全分散型ソーシャルの試みがあった
IndieWeb Wikiは、このような個人Webベースのソーシャル技術を探るうえで良い資料なので勧めたい
「sAT Protocolは静的サイトベースの分散型ソーシャルネットワーク」という説明を読みながら、眉がどんどん上がっていくグラフを描きたくなった
ただし暗号文が公開で列挙可能なので、量子コンピュータ時代には危険かもしれない
小規模ネットワークには適しているが、鍵配布やローテーションの問題から大規模への拡張は難しい
ユーザーの立場からすると、これが何をするサービスなのかから説明が必要だと感じる
fork、パス、JSON、暗号化といった技術用語ばかりで、実際の利用シナリオが見えてこない
MastodonやSignalでは満たせない領域なので、これで実験してみる価値はある
こういう分散型ネットワークの実験を見ると本当に興味深い
たとえ構造的な問題が多くても、新しい組み合わせを学べるのが楽しい
ただ、フォロー/アンフォローのたびにサイト全体を再暗号化・再ビルドしなければならないのはあまりにも面倒だ
さらに、フォローしないとコメントが見えない構造はスケーラビリティを大きく制限する
それでも、RSS・ActivityPub・静的サイトの混合という点は魅力的だ
静的サイトで動的な友達リストのアクセス制御を実装しようとする試みは矛盾しているが面白い
結局、愛憎が同時に湧くような構造だ。それでも、こうした試みは歓迎したいし感謝している