MastodonやMisskeyが、それぞれ別々に設置されている違うプログラムなのに、お互いに繋がることができる仕組みは、主に『ActivityPub』という通信規約(プロトコル)によって実現されています。
ActivityPubでは、私たち一人一人のアカウントをActorと呼びます。
Actorは、別のActorと、「フォローしたい」「いいよ」というやりとりをします。
投稿に対して「好き!」って反応したり、新しいノートを「作ったよ」、ノートをみんなに「アナウンス」します(ブースト・リノート)
これらのやりとりの語彙があらかじめ定義されています。
先程の例の順番でいうと、Follow, Accept, Like, Create, Announce というActivityとして定義されています。
Activityは、何を対象とするかを伴っていて、Actorを対象とするときもあれば、投稿(短い文章)を表す表現であるNoteや、「フォローしたい」というリクエストを許可したり、送った側が取り消すために、「フォローしたい」というActivityそのものを対象として指定することもあります。
このあたりの約束ごとが共通化されているため、それに従うことで、お互いのやりとりが可能になっています。
Actorは、それぞれがinboxというActivityを受け入れる窓口を持っていて、他のActorから送られてきたActivityを処理します。
また、自分が送ったActivityをoutboxに保持しています(ずっと溜まっていきます)。
フォローしているActorのコレクション following も持っています。
フォローされているActorのコレクション followers も持っています。
これは、フォローを要求して、それが受け入れられた時に、お互いがコレクションに追加することで、その状態を維持します。
新しい投稿(Note)をCreateした時、つまり新規投稿時には、followersコレクションのActorのinboxに対してActivityを送ります。
そうすると、フォロワーのActorは、inboxに届いたActivityを処理して、フォロー相手の投稿が読めるようになります。
Activityを発行したActorが、フォロワーに対してそれを送信することで、お互いが繋がるネットワークが実現されています。
以上は、ActivityPubの枠内で行われる仕組みについて説明したものですが、
サーバーはinboxに送られてきた新しい投稿が公開してもいいものだと判断したときに、
連合タイムラインという特別な仕組みを用意していて、そこでみんながみられるようにしたり、
同じサーバーのActorが発行した新規投稿のActivityを使って、ローカルタイムラインという仕組みを実現したり、
いろいろとActivityPubの仕組みには存在しない付加機能を提供しています。
サーバーはActorのコレクションを持っているので、他のActorを探す機能を提供することができます。
投稿のハッシュタグをコレクションして、ハッシュタグで投稿を一覧する機能を持たせたりもしています。
ActivityPubにはハッシュタグの共通の表現は用意されていますが、それをどう使うかについては定義されていません。
そのあたりは、ActivityPubで通信する個々のサーバーにより定義され、実装されています。
このActivityPubの規格外の部分は、各実装同士がお互いの機能を理解して、互換性をとる努力をすることで、相互のやりとりを実現しています。
かなり自由だけど、それなりに大変な世界です。