Show HN: s@: 静的サイト上の分散型ソーシャルネットワーキング
49日前原文(satproto.org)
概要
sAT Protocolは静的サイトを利用した分散型SNSプロトコル。
ユーザーは自身のドメイン上でデータを暗号化して管理。
サーバーやリレーを介さず、友人間のみで情報共有。
公開鍵認証やフォローリストによる限定的なアクセス制御。
GitHub Pagesなど任意の静的サイトホスティングに対応。
sAT Protocolの概要
- 分散型ソーシャルネットワークプロトコル
- 静的サイトを基盤とした設計
- 各ユーザーが自分のドメインを所有
- データは暗号化JSONとして保存
- サーバーレス構成
- 中央サーバーやリレーサーバーを使用しない
- データは自分のサイトから友人のブラウザへ直接転送
- 限定的なコミュニケーション
- 相互フォロー必須
- インフルエンサー向けではなく、友人同士のやりとりが前提
クイックスタート手順
-
このリポジトリをForkして自分のリポジトリを作成
-
GitHub Pagesをmainブランチから有効化
-
GitHub PagesのURL(例:https://username.github.io/satellite/)にアクセス
-
デフォルトでは/satellite/パスを利用
- 他用途で/satellite/を使っている場合は、ルートにsatproto_root.jsonを配置し、リポジトリ名を指定
{ "sat_root": "my-custom-repo" }
アイデンティティと認証
- ユーザーのアイデンティティはドメイン名
- HTTPS/TLSによる認証
- コンテンツ取得=ドメイン所有者による発信の証明
発見(Discovery)ドキュメント
-
sAT対応サイトは以下のパスで発見用ドキュメントを公開
GET https://{domain}/satellite/satproto.json- プロトコルバージョンと公開鍵を含む
{ "satproto_version": "0.1.0", "public_key": "<base64-encoded X25519 public key>" } -
デフォルトで/satellite/を参照
-
別パスの場合はsatproto_root.jsonで指定
暗号化モデル
- 全データ暗号化:ユーザーとフォローリスト内ユーザーのみ復号可能
- 鍵管理
- X25519鍵ペアを各ユーザーが生成
- 公開鍵は発見ドキュメントで公開
- 秘密鍵はブラウザのlocalStorageに保存
- 投稿データ暗号化
- 256ビットのランダムなコンテンツキーでXChaCha20-Poly1305暗号化
- フォロワーごとに公開鍵で封入したコンテンツキーを保存(libsodium crypto_box_seal利用)
- フォロワー用鍵ファイル:keys/{follower-domain}.json
- セルフキー(keys/_self.json)
- 自分用のコンテンツキーと認証情報を自分の公開鍵で暗号化し保存
- 新端末やストレージ消去後はドメイン名と秘密鍵で復元可能
鍵ローテーション(アンフォロー時)
- アンフォロー時の処理
- 新しいコンテンツキー生成
- すべての投稿を新キーで再暗号化
- 残りのフォロワー分の鍵封入ファイルを再生成
- keys/_self.jsonも更新
- アンフォローされたユーザーは復号不可
復号フロー
- 例:BobがAliceのサイトを閲覧する場合
- Aliceのデータパスを解決(satproto_root.jsonまたは/satellite/)
- keys/bob.example.com.jsonを取得
- Bobの秘密鍵でコンテンツキーを復号
- posts/index.jsonで投稿IDリスト取得
- 各投稿(posts/{id}.json.enc)をコンテンツキーで復号
データ構造
-
投稿
- 各投稿は個別に暗号化ファイルとして保存
- 投稿インデックス(posts/index.json)は平文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桁ランダム(例:20260309T141500Z-a1b2)
-
フォローリスト
- follows/index.jsonに平文JSONで保存
{ "follows": ["bob.example.com", "carol.example.com"] }
フィード集約
- クライアントはフィードを以下の手順で構築
- ユーザーのフォローリストを取得
- 各フォロー先のリポジトリパスを解決
- 各フォロー先の投稿を自分用の鍵で復号
- 全投稿をcreated_at降順でマージ
- 返信(Reply)
- reply_toとreply_to_authorがセットされた投稿
- 返信はフラットスレッドとして元投稿の下に表示
- ネスト返信は非対応(トップレベル投稿へのみ返信可)
- 元投稿が閲覧できない場合、返信も非表示
- フォローしているユーザーの返信のみ表示(スパム防止)
投稿の公開
- クライアントは新規投稿時
- 一意なIDで投稿作成
- コンテンツキーで投稿JSONを暗号化
- posts/{id}.json.encとして静的サイトへアップロード(例:GitHub Contents API)
- posts/index.jsonを更新
- 認証情報はkeys/_self.jsonで暗号化保存
静的サイト構成例
{domain}/satellite/
satproto.json # 発見・プロフィール・公開鍵
posts/
index.json # 投稿IDリスト(平文・新しい順)
{id}.json.enc # 個別暗号化投稿ファイル
follows/
index.json # フォローリスト(平文)
keys/
_self.json # セルフ用鍵封入ファイル
{domain}.json # フォロワー用鍵封入ファイル
FAQ
- これはRSS+PGPですか?
- はい
- AT Protocolのサーバーレス版ですか?
- はい
- スケールしませんか?
- しません(友情も同様)
- “s”は“slow”や“shitty”の略でも?
- もちろん
- セルフホスト可能ですか?
- 可能(CORS有効化が必要)
- 友達にフォローを頼む方法は?
- テキストや直接依頼(友達なら直接話せるはず)
このプロトコルは、小規模・信頼関係ベースのSNSを自分で構築したい人に最適。
サーバーレス・暗号化・相互フォローによる強固なプライバシーとシンプルな運用が特徴。