1.白い画面
わたしは blusco という、Bluesky を読むためのアプリを作っている。その次の版の blusco ∅ は、開くとしばらく画面が白いままだった。いまの blusco なら一瞬で投稿が出る。読んでいる人も、読む相手も同じなのに、∅ だけが待たされた。
使ってみて、この待たされ方は Nostr に似ていると感じた。Nostr は、投稿があちこちのサーバーに分かれて置かれていて、アプリがそれを自分で集めて並べる SNS だ。原因を調べると、たしかに同じ形だった。この記事では、その原因と、直すために作った仕組みを書く。仕組みの名前は鉱石ラヂオモデルだ。
2.電話とラジオ
∅ には、読む相手を自分で選んでおくリストがある。わたしのリストには36人いる。∅ は開くたびに、その36人の一人ひとりに「新しい投稿はあるか」と聞いて回っていた。電話を36回かけるのと同じだ。全員が答えるまで、どの投稿をどの順に並べるかが決まらない。白い画面は、その待ち時間だ。
ラジオは違う。局が一度流せば、聞く人が何人いても流す手間は同じだ。聞く側の仕事は、周波数を合わせることだけだ。
電話の形のままでは、相手が36人なら少なくとも36回聞くことになる。聞かなかった相手に新しい投稿があるかどうかは、聞かないかぎりわからないからな。かける回数を減らすには、ラジオの形に変えるほかない。
3.家と目
Bluesky の裏側は、大きく3つの持ち場に分かれている。
- PDS:投稿をしまっておく家だ。投稿は、書いた人の家にある
- Relay:全員の家から新しい投稿を集めて、1本の流れにして流す係だ。この流れは firehose(消防のホース)と呼ばれる。全部の投稿が勢いよく流れてくるからな
- AppView:流れてきた投稿を全部ためて、並べ替えて、一人ひとりに見せる係だ。タイムラインもいいねの数も、ここで作られる
家は誰でも持てる。だが AppView は、全員の投稿をためるので大きな設備が要る。いま Bluesky を読んでいる人のほとんどは、Bluesky の会社の AppView を通しているだろう。家は自分のものだが、目は借り物だ。
2026年4月16日に、Bluesky は攻撃を受けて13時間以上止まった。そのあいだも、投稿を家(PDS)に直接置く Leaflet というブログは読めた。家が無事なら読める物がある。止まったのは目のほうだったのだろう。
4.鉱石ラヂオ
鉱石ラヂオは電池を持たない。鳴らす力は電波そのものだ。局に払う料金もない。周波数を合わせれば、その電波だけが聞こえる。
Bluesky の電波は firehose だ。これを誰でも受け取りやすくした Jetstream という中継がある。Jetstream に「この人たちの投稿だけ」と頼むと、その人たちの投稿だけが流れてくる。頼むときに渡すのは、一人ひとりに付いている番号(DID)だ。周波数を合わせるのと同じだ。
川に仕掛ける梁(やな)も同じ働きをする。梁は、魚を捕るために川の流れの中に組む仕掛けだ。川の全部を見る必要はない。流れてきた魚のうち、仕掛けにかかった物だけを取る。
この形なら、AppView に頼らずに読める。お金もかからない。受け取るのは自分のスマホやパソコンで、あいだに全員の投稿を集めるサーバーを通さないからな。
5.4つの部品
鉱石ラヂオモデルは、4つの部品でできている。どれも、身近な物にたとえた名前を付けた。
- 棚前回開いたときのタイムラインを、スマホの中にとっておく。読みかけの新聞を棚に置いておけば、次に手に取ったとき前のページから読めるのと同じだ。開いたらまずこれを出す。投稿の元はそれぞれの家にあるので、消えても困らない
- 井戸家ごとに井戸がある村を思い浮かべてくれ。読む相手の家の井戸から、新しくたまった分だけをくんでくる。くみに行くのはアプリだ。アプリは36軒の井戸へ、使いを同時に出す。使いはそれぞれ別の井戸へ行くので、ダムの窓口のように1か所に並んで待つことがない
- 梁アプリを開いているあいだ、読む相手の新しい投稿を Jetstream から受け取る。書かれて1秒ほどで届く
- ダムAppView のことだ。川の水を全部ためるダムに似ているからな。人を探すときと、誰が返事をくれたかを調べるときにだけ使う
井戸の考え方は、前に書いた文章(The Fifth Path)から来ている。井戸のある村には川が要らない。川の水が止まっても、井戸には水がたまっている。知らない人を探すにはダムが要るが、知っている人の声を聞くだけなら、その人の井戸からくめばいい。
6.書いた人に聞くか、全員に聞くか
「この人は何を書いたか」を調べるのはかんたんだ。書いた人の家に聞けば答えが返る。
「この投稿に誰が返事をしたか」を調べるのはむずかしい。返事は、返事をした人の家にしまわれているからだ。全員の家を見て回って集めておくサーバー(AppView)がないと、答えが出ない。
blusco のタイムラインに並ぶのは、自分で選んだ相手が書いた投稿だ。だから、書いた人の家に聞けば全部そろう。いいねの数は全員に聞かないとわからないが、blusco はもともと数を出さない。だからタイムラインを出すまでの道から、ダムを外せた。
7.測った数字
読む相手36人で、それぞれのやり方の速さを Mac から測った。
| やり方 | 36人分がそろうまで |
|---|---|
| ダム:AppView に1人ずつ聞く(同時に6人まで) | 2.2〜2.5秒 |
| 井戸:家に直接、全員同時に聞く | 1.1〜1.9秒 |
| 梁:1時間前の分からさかのぼって受け取る | 1.8秒 |
| 梁:12時間前の分から | 10秒 |
| 梁:24時間前の分から | 35秒 |
梁は、さかのぼる時間が長いほど遅くなる。アプリを閉じていたあいだの分を取り戻すなら、井戸のほうがいい。梁の出番は、開いているあいだだ。
8.開くときの順番
測った数字から、順番を決めた。
- 棚にとっておいたタイムラインを出す。0秒だ
- 井戸で、棚より新しい投稿を聞く。まだ手元にない投稿だけ、中身を読む。iPhone では1.1〜1.8秒で届いた
- 梁をつなぐ。2分前の分からさかのぼって受け取り、井戸と梁のあいだで投稿がもれないようにする
- アプリを閉じたら梁を切って、そのときのタイムラインを棚にしまう。30分以内に開き直したら、梁で閉じていたあいだの分を受け取る。それより長ければ、井戸から聞き直す
白い画面はなくなった。開いた瞬間に前回のタイムラインが出て、1秒あまりで新しい投稿が足される。あとは開いているあいだ、読む相手が書くたびに新しい投稿が増えていく。電話をかけていたころと比べて、どこが違うか? 待つものがないことだ。
9.できないこと
鉱石ラヂオにも聞けない物がある。
- 言葉で探すリスト(たとえば「ナポリタン」と書いた投稿を集める)は、全部の投稿の中から選ばないといけない。量が多すぎてスマホでは受け取りきれないので、AppView の検索に頼る。ここはダムの仕事だ
- 他人が作ったフィード(おすすめの投稿を集めた流れ)は、その人のサーバーが選んだ結果だ。自分では作り直せないので、聞きに行くしかない
- 梁の電波は Relay から来る。Relay が止まれば梁も止まる。そのときは井戸が残る
- Jetstream でさかのぼれるのは、測ったところでは36時間前までだった
- 投稿の中身を読むところは、まだ AppView に頼っている。棚と井戸だけで投稿を出せるようにするのは、これからだ
10.海賊ラジオ
Bluesky の初めのころは、招待された人だけが使えた。同じ周波数に集まった人たちが、局も許可もないまま話していた。海賊ラジオのようなものだった。人が増えて、大きな局ができた。
鉱石ラヂオモデルは、昔に戻る話ではない。大きな局があることを知ったうえで、自分の周波数を選ぶ話だ。全部の電波を聞く必要はない。自分で選んだ相手の声が届けば、それで足りると思う。
わたしは次に、AT Protocol(Bluesky を動かしている決まり)の上で動く海賊ラジオを作るつもりだ。自分で決めた形のデータを書けば、それも同じ電波に乗る。聞く人は周波数を合わせるだけでいい。局を開くのに、許可も大きな設備も要らないだろう。そのとき聞こえてくるのは、どんな声だろうか。
出典
- From Data Sovereignty to Viewpoint Sovereignty(2026-03-23)。梁と鉱石ラヂオのたとえを最初に出した文章だ
- The Fifth Path: Pull, Don't Push(2026-03-24)。井戸のある村には川が要らない、という井戸の考え方を書いた文章だ
- AppView-less Does Not Mean Decentralized(2026-04-17)。4月16日の障害と、「誰が返事をしたか」は全員の家を集めるサーバーがないとわからない、という話だ
- tangled.org/moja.blue/crystal-radio。作る人向けの仕様と、手本のコードだ