つくる · フレームワーク
Fedify
ActivityPub サーバーを作るための TypeScript フレームワーク。連合まわりの面倒を引き受けてくれます。
なぜ存在するか
現場の ActivityPub には、署名の仕組みが四つある——HTTP リクエスト用に二つ、ドキュメント用に二つ。JSON はサーバーごとに形を変え、配達は順不同で届き、仕様書のどこにも書かれていないサーバー固有の癖まである。fedify は、その面倒をまるごと引き受けて、扱いやすい既定値に変えてくれる。著者自身が書いたフィールドガイドが、その痛みの正体を教えてくれる: Why ActivityPub is hard。
こんな人に
- TypeScript か JavaScript で、新しく連合アプリをつくる人 — fedify の本領がいちばん出るところ。Ghost、Hollo、Hackers' Pub が本番で動かしている。
- すでにあるアプリを、連合対応にしたい人 — Express、 Hono、Next.js、SvelteKit ほか、十以上のフレームワーク統合がある。
- JSON-LD を手で書くのに疲れた人 — 型つきの語彙だけでも、採用する価値がある。
- 他の言語で実装している人 — 出力が決定的だから、バイト単位で一致する模範解答になる。
いいところ
- 連合の中核はまるごと、ひとつのオプションオブジェクト——Hollo ではおよそ二十数行で書かれている。
- inbox は、ひとつのルーティングテーブル——ハンドラーが動く前に、署名はもう検証済み。
- actor は、データベースの一件の参照——WebFinger、 NodeInfo、鍵の公開までついてくる。
- フォロワー全員への配達は、呼び出しひとつ——fan-out、リトライ、順序保証も込み。
道のり
連合は段階を追って育つ。ひとつ確かめてから、次へ進める——見つかる → フォローされる → 話す → 聞く → やり取りする → 一人前になる。最初の三段階は薄く、四段階目に本当の仕事がある。
ロードマップ六つの段階とチェックポイント、そして道がどこまで続くか心にとめておくこと
- 永続化は、あなたの仕事 — fedify は何も保存しない。リモートの actor や投稿を写し取るのが、本当の仕事になる。
- ポリシーも、あなたの仕事 — フォローを受け入れるか、モデレーション、削除をどう扱うか。
- 鋭い落とし穴もある — 不変な語彙、
Objectの名前被り、クロスオリジンの再取得、二種類の鍵。
運用
- web と worker、プロセスを分ける。
- 安全装置は、外さない。
- デバッグは CLI で、lint はエディタで。
あわせて読みたい
Why ActivityPub is hard
fedify が引き受けてくれる面倒の正体を、著者自身が書いたフィールドガイド
コードを読む
一晩かけて読む価値がある、本番稼働中の fedify コードベース
fedify を使って、fedify を卒業した話
fedify を本番で使い、そして卒業するまでの記録