タイトルの通り、新しい分散/連合型SNSを開発している。
ソフトウェアの名前は"Pulsate"*1(パルセート と読む)で、プログラムは以下のrepositoryにある。
github.com
注意:
残念ながら後述する通りまだかなり荒削りな状態であり、プロダクション運用できる状態ではない。
この記事の内容は基本的に私の考えていることをダンプしたものであり、プロジェクトの公式見解ではないことに注意されたい。
これは何
Pulsateは
- ActivityPubに対応する
- 短文投稿型で
- 絵文字リアクションが利用可能で
- 引用が可能な
- サーバー側実装
である。
Mastodon のような思想を持ち、misskey のような機能セットを提供し、それでいてどのソフトウェアとも関係のない独立した実装だ。
機能の名前は基本的にmisskeyと同じ*2。
投稿: ノート
再投稿: リノート
引用再投稿: 引用リノート
技術スタックとしては:
- プログラミング言語: TypeScript
- HTTPサーバーライブラリ: Hono
- KVS: Valkey(Redisのフォーク)
- データベース: Postgres
を採用している。
このプロジェクトでは新しい技術を取り入れつつ他の部分では多少枯れた技術も採用していくつもりだ。
1/17 補足:
PulsateではバックエンドでもTypeScriptを採用している。理由は:
- 発起人(7人いました)の中で全員が共通して書ける言語がTypeScriptしかなかった
- TypeScriptでバックエンドを書いていた人が多かったためそれでも問題がなかった
というような感じです。開発開始後も何回か言語を変更するか?といった検討がなされたことがありましたが、すでに書かれているコードを放棄するよりは継続開発した方が良いだろうといった結論になり、結局TypeScriptを採用し続けているというわけです。
補足終わり
フロントエンドは?となるかもしれないが、Pulsate は標準のフロントエンドを同梱しない。Pulsate 向けのフロントエンドは同じ団体(Pulsate Project)が開発する別ソフトウェア扱い*3で、Caramel (カラメル)という別の名前が付いている。
現在時点でのCaramelの技術スタックは:
という感じになっている。Remixの雲行きが怪しくなってきているので別のスタックに切り替えることを検討している。
Caramelは"とりあえず使い物になる"レベルの実装しかしていない最小かつ最軽量なフロントエンドであるため、恐ろしくシンプルで消極的なUIである。
Cramelのスクリーンショット
(表示内容はあくまでテストデータであることに注意)
ほとんどCSSは書かれいていないし、リアクションは👍の1種類しかつけることができず誰がつけたのかも知ることができない。あとはフォローもできない。
ただ単に(フロントエンド側が)未実装なのもあるが、バックエンドで実装される全ての機能に対応するつもりがないのは事実だ。
もし"なんだこのけしからんフロントエンドは!"と思う人がこの記事を読む人の中にいるなら、この記事を一番下まで読んでぜひ私たちと一緒にこのけしからんソフトウェアを改善して、Fediverseの世界をもっと良くしよう。
Pulsate関連ソフトウェアのライセンスはApache2.0で、他ソフトウェアで広く採用されているAGPLは採用していない。
理由としてはAGPLは 厳格なコピーレフト型ライセンス であり、フォークの開発者にかかる手間が多いためライセンス違反が発生する可能性がほかと比べて高く、それに対する対処などが複雑になると考えたから と、単に開発開始時にApache2.0ライセンスが一番合っているだろうと判断したからだ。
(注: この類のSNSは一般的には"分散型SNS"と表記することが圧倒的に多いが、この記事では後述する理由によってあえてこう表記する)
目指すもの
公式サイトに書いてあるプロジェクトが目指すものはこんな感じだ:
1. 高いパフォーマンス
Pulsateの開発開始時に"最も解決したいこと"であったものの一つ。
他実装では"大量のユーザーの投稿や操作をどうさばくか"が重要視されるのに対し、Pulsateでは"そこまで多くない投稿や操作をいかに効率よく処理するか"を重要視していくつもりだ。
分散/連合型SNSの統計をとっている FediIndex (https://fedi.wrm.sr/) によると、ユーザー数100人以下のインスタンスが93.23%と大半を占めている。

ほとんどのインスタンスは非常に小規模であるので、何千何万というレベルの同時接続に耐えることが可能な大掛かりな仕組みよりも運営にかかるコストを削減したり、維持に必要な操作を自動で行ったりできる仕組みを導入したほうが効果があると考えている。
Pulsateは中小規模(〜1000人)のインスタンスをメインタゲートに絞って開発していく予定だ。
2. ユーザー中心の設計
分散/連合型のSNSをあまり使ったことがない人にとって、リモート/ローカルの概念やフォローの方法を理解するのは相当に難しいことだと思う。
Pulsateは技術者や分散/連合型SNSを使ってきたユーザーだけではなく、標準的なSNSのユーザーやあまり短文投稿系のSNSに触れてこなかったユーザーもターゲットにしたいと考えている。
そのために、シンプルかつ直観的に使いやすい(フロントエンドの)デザインであるとか、極力難しい単語(技術用語)を排除するなどの対応を行っていくつもりだ。
3. 開発者向けのサポートや網羅的なドキュメントの用意
PulsateではDiscordに開発者同士、ユーザー同士がコミュニケーションできるようなコミュニティーサーバーを設けている。もちろん開発に関連する(ほぼ)全ての会話はここでオープンな形で行われている。
コミュニティーサーバーは以下からアクセスできる。
discord.com
Pulsateの開発チームにはオープンソースであるのなら開発方針や開発の様子は基本的にオープンにしていくべきという考えがあり、それの一環としてこのようなコミュニティーを設けている。
こうすることで、
- ユーザーからのフィードバック/ユーザーインタビュー が容易になる
- ユーザーや外部の開発者が今何を考えているのかということがわかりやすくなる
- プロジェクト全体の透明性を上げられる
といったメリットがあると考えている。
また、内部のアーキテクチャ/設計ドキュメントなどのPulsate自体の開発ドキュメントを完全にオープンにする。具体的にどのようなドキュメントを書き、どのように活用するかは決まっていないが、外部コントリビューターの確保やプログラムの維持管理に活かせると考えている。
かなり荒削りで不完全ではあるが*4、すでに一部のモデルの仕様が公開されている。
spec.pulsate.dev
さらに、様々なプログラミング言語向けのAPIクライアントライブラリを公式提供する予定だ。Pulsateは他のSNSとAPIの互換性がないため、Botやアプリの開発を行うためにはAPIクライアントを自作する必要が出てきてしまう。
他のSNSではそういった場合でも公式でライブラリが提供される事例はほぼ無いが、Pulsateではいくらかの需要の大きいプログラミング言語向けのライブラリを公式で提供する予定だ。
すでにAPIドキュメントと全てのエンドポイントの型はOpenAPI Spec(OpenAIではない)方式でコードから自動生成されているので、公式提供されないプログラミング言語向けのライブラリも手書きすることなく自動で生成できる。
4. 他実装との高い相互運用性(互換性)
この記事では"分散型SNS"という表記をせず"分散/連合型SNS"と表記しているが、これには理由がある。
個人的に分散 と 連合 は指す意味が違うと考えているからだ。
おおむねこんな感じに理解している:
分散: 大きいSNS(インスタンスのこともある)を複数に分け、ユーザーを散らす
連合: 複数の(種類の違うこともある)独立したSNSを繋いで1つにする
"分散型SNS"と表記すると単にユーザーやインスタンスがバラバラになる印象が大きくなると考えていて、そのために"連合型"という 複数のものがつながる という意味の言葉を採用している。
Pulsateのプロジェクト全体の標語(キャッチコピー)は「繋がりを"再定義する"」だが、ここで言うところの 繋がり にはユーザー同士の関係だけでなくインスタンス/サービス/ソフトウェア同士のつながりも含まれている。
Pulsateは歴史的経緯*5からActivityPubに関連した処理をSNSの基本機能(ログインや投稿、フォローなど)から完全に独立させる形で設計している。
アプローチはmisskeyのそれとほとんど同じで、先に最低限独立したSNSとして使えるようにしてからActivityPubに関連する機能を実装していく という形式を取っている。
とはいっても、連合に対する考え方はmisskeyとほぼ真逆である。
misskeyは「あくまで連合(分散)は従」であり、基本機能を最優先として連合に対して消極的である*6*7。
一方Pulsateは「連合は重要な概念であり、既存のSNSとの互換性を保ちどのインスタンスにいてもシームレスに繋がり続けることができること」を重要視する。
このようなスタンスを"連合志向"と言う。Pulsateは連合志向な独立実装である。
具体的には:
- Pulsateは基本的に連合しない機能はリリースしない
- 基本的にどのインスタンスでも相互に利用可能とし、インスタンスの内側に閉じない機能設計をする
- misskeyの"連合なし"公開範囲や(連合しない)チャンネルは実装予定がない
- 通報やモデレーション機能などは除く
- ローカルタイムラインは無い
- 連合するチャンネルをローカルタイムラインのようにして、別のインスタンスのローカルタイムラインを(そのインスタンスから)見たり投稿したりできると良いなとは思っている
- 大昔(公式インスタンスであった時代)のmisskey.ioはローカルタイムラインを時間封鎖していた時期があり、misskey開発者もローカルタイムラインには問題が多く(少なくとも公式のインスタンスでは)有効にするべきではないという趣旨の記事を書いていたりする*8
前述した通りPulsateはApache2.0ライセンスで配布されている。コードがオープンでも開発がオープンでないこともあるが、Pulsateの開発はオープンに行われている。
独立性に関してはPulsateの開発チーム(pulsate-dev)とPulsateに関連する全てを管理するPulsate Projectは完全に非営利かつ独立であり続ける。(Pulsateを利用した)巨大インスタンスの運営団体や法人の傘下に入ることはないし、そうした組織から意思決定に干渉されることもない。意思決定に重要なのはあくまでユーザー本位、分散/連合型SNSとしてどうあるべきかということだけだ。
コントリビューターや利用者の数が増え、プロジェクト規模が大きくなった際には透明性の高いガバナンスの導入を計画している。私が今考えている主な取り組みは以下の通り:
- 開発を計画している機能リストは全て公開する
- 全ての意思決定は議事録を含め全て公開する
- プロジェクトに関連する全てのプログラムはオープンソースライセンス下で公開する
- プロジェクトが使用する/受け取る資金は金額、使用用途を含めて公開する
簡単なレポートの形で数ヶ月おきに最近の進捗などを公開するところから初めていくつもりだ。
現在時点の目標:
現在時点で考えている目標はこのような感じにしている。
長期的(今後5年間で達成したい)目標:
- 定期的なリリース(おおむね3ヶ月おき)
- Pulsateを利用したインスタンスの総ユーザー数: 500人以上
- インスタンス数: 25以上
- 総ユーザーに対しての(準)公式インスタンスのシェア率: 30%以下
- コントリビューター(貢献者)数: 50人以上
- 継続的財政支援者数: 10人以上
短期的(おおむねこの1年〜2年で達成したい)目標
- v1のリリース
- コントリビューター数: 20人
- 総ユーザー数: 100人
あまり具体的ではないし、目標も高いのか低いのかよくわからないが、とりあえず私個人としてはこれくらいの目標でいこうと思っている。
宣伝: 私たちと一緒にPulsate/Caramelを開発しませんか
現状、Pulsate Projectは他のプロジェクトに比べてかなり小規模だ。アクティブに活動しているプログラマーは実質私1人で、PulsateもCaramelもどちらも私が書いている。
もう1人アーキテクト/レビュワー兼プロダクトオーナー(最終的意思決定者)がいるが、やはり開発者の人手が足りない。
注: 現在私ともう一人の開発者は卒業研究が佳境に入っており、(私は)2月中旬ごろまでそこまでプログラムをかけない状態になっている。
基本機能(ノート、リノート、リスト、フォロー、タイムライン)についてはPulsateで実装済みではあるものの、その大部分がCaramelで利用できない状態だ。
そんな状態ではあるが、プログラム自体は腐らずに保たれている。
misskeyのコードについてコントリビューターが嘆いていたのを見ていたのでかなり丁寧にソフトウェア設計を行っており、単体テストもほぼ全てのロジックについて書かれている*9。
ActivityPub関連の実装はまだほとんど行われていないが、既存の処理を適切に呼び出せば実装はできる状態にはなっている。
また、JSON-LD(ActivityPubのサーバー間通信で使われるJSONに似たフォーマット)からJSONとの相互変換や、かなり実装が難しいとされるリクエストの署名の処理周りは、最近ActivityPub実装自作の世界で注目を集めている Fedify を利用するつもりだ。
github.com
もともとはDeno向けに書かれたようだが、Web標準APIを利用しているためPulsateが使っているNodeでも利用可能なので非常に助かる。
こうした便利なライブラリを利用することで開発にかかる手間を減らすことができ、結果的にユーザーに価値を提供し続けることのできる力を生み出すことができるのではないかと考える。
さて、見出しの通りPulsate/Caramelの開発に参加しませんか。
(開発以外にもアイデアを提供したり、コミュニティーサーバーで発言したりするなどの貢献方法がある。)
プロジェクトや開発に興味があるという方はコミュニティーサーバーにぜひ。
discord.gg
ソースコードを読んで全体の様子を見てみたいという場合は GH: pulsate-dev/pulsate にコードがある。
github.com
あまり発言はないがFediverseにもアカウントがある。
mi.growthers.dev
TwitterかFediverseで #pulsate をつけて投稿していただければ(筆者が)何かしら反応する。
(Fediverseの方はnotestockをお使いならばすぐ反応できると思う)
ActivityPubに関連したアプリケーションを書いてみたい人、
つくりたいものが特にないがWebアプリ開発がしたい学生(今まで開発に関わった人は全員学生)、
"misskey 連合 つらい うんざりザリガニ" *10 という感じの人は Pulsate Project にぴったりな人*11だと勝手に思う。
まとめ
- Pulsate/Caramelという"連合志向"な分散/連合型SNSを開発している
- おもにユーザー数1000人以下のインスタンスで使われることを想定している
- ユーザー中心の(UI)設計をする予定
- ソフトウェア自体のドキュメントを整備し公開する
- 高い相互運用性を維持し、どのインスタンスにアカウントがあってもシームレスに繋がれる状態を目指す
- プロジェクト規模が拡大したら透明性の高いガバナンスの導入を行う
以上だ。
Fediverseの世界がより良いものになることを願って。