1.A white screen
I build blusco, an app for reading Bluesky. The next version, blusco ∅, opened to a white screen. It stayed white for a while. The current blusco shows posts in an instant. Same person, same accounts to read. Only ∅ made you wait.
Using it, I felt the wait was like Nostr. On Nostr, posts sit on many separate servers, and the app collects and sorts them itself. I traced the cause. It was the same shape. This article explains the cause and the system I built to fix it: the crystal radio model.
2.Telephone and radio
∅ keeps a list of people you choose to read. Mine has 36. Every time ∅ opened, it asked each of the 36, one by one: "Anything new?" That is 36 phone calls. Until everyone answers, the app cannot know which posts to show or in what order. The white screen was that wait.
Radio works differently. A station broadcasts once. The cost stays the same no matter how many people listen. The listener's only job: tune in.
With phone calls, 36 people means at least 36 questions. You cannot know whether someone posted unless you ask. Fewer calls require a different shape. The radio shape.
3.A house and a pair of eyes
Bluesky splits into three roles.
- PDS: the house where posts live. Each post sits in its author's PDS.
- Relay: collects new posts from every house and sends them out as one stream. The stream is called the firehose. Everything rushes through it at once.
- AppView: stores the whole stream, sorts it, and shows it to each person. Timelines and like counts are made here.
Anyone can run a house. An AppView stores everyone's posts, so it needs large equipment. Most people read through the AppView run by Bluesky the company. You own your house. You rent your eyes.
On April 16, 2026, Bluesky went down for over 13 hours after an attack. Leaflet, a blog that stores posts directly in each house, stayed readable. The houses were fine. The eyes stopped.
4.The crystal radio
A crystal radio has no battery. The radio wave itself powers it. No station fee either. Tune to a frequency and you hear only that signal.
Bluesky's radio wave is the firehose. Jetstream is a relay that makes it easy to receive. Ask Jetstream for "only these people," and only their posts flow to you. You name them by their DIDs, an ID number every account has. That is tuning.
A weir works the same way. A weir is a fish trap built across a river. You do not watch the whole river. You keep only the fish that swim into the trap.
This shape reads without an AppView. It costs nothing. Your own phone or computer does the receiving. No server that collects everyone's posts sits in between.
5.Four parts
- ShelfThe timeline from last time, kept on your phone. Like a half-read newspaper left on a shelf: pick it up and you start where you were. Shown first on open. The originals live in each house, so losing the shelf loses nothing.
- WellPicture a village where every house has its own well. From each chosen person's well, draw only the water that is new. The app does the drawing. It sends out 36 runners at once, one to each well. Each runner goes to a different well, so they never queue at one counter the way they do at the dam.
- WeirWhile the app is open, receive the chosen people's new posts from Jetstream. A new post arrives about one second after it is written.
- DamThe AppView. Like a dam, it holds back the whole river. Used only to find new people and to see who replied.
The well comes from an earlier essay (The Fifth Path). A village with wells needs no river. When the river stops, the wells still hold water. Finding strangers needs the dam. To hear people you already know, draw from their wells.
6.Ask the author, or ask everyone
"What did this person write?" is easy. Ask the author's house and you get the answer.
"Who replied to this post?" is hard. Replies live in the repliers' houses. Answering takes a server (the AppView) that visits every house and collects them first.
The blusco timeline shows posts written by the people you chose. Asking their houses gets all of them. Like counts need everyone, and blusco never shows counts. So the path to the first screen no longer runs through the dam.
7.Measurements
I measured each path from a Mac, with my 36 chosen people.
| Path | Until all 36 arrive |
|---|---|
| Dam: AppView, one person at a time, 6 in parallel | 2.2–2.5 s |
| Well: each PDS directly, all at once | 1.1–1.9 s |
| Weir: replay from 1 hour ago | 1.8 s |
| Weir: replay from 12 hours ago | 10 s |
| Weir: replay from 24 hours ago | 35 s |
The weir slows down the further back it replays. To catch up on the time the app was closed, the well is faster. The weir's job is the time the app stays open.
8.The order on open
The numbers set the order.
- Show the timeline from the shelf. Zero seconds.
- Ask the well for posts newer than the shelf. Fetch the contents of unknown posts only. On iPhone this took 1.1–1.8 seconds.
- Connect the weir. Replay from two minutes back, so no post falls between the well and the weir.
- On close, cut the weir and put the current timeline on the shelf. Back within 30 minutes: replay through the weir. Longer: ask the well again.
The white screen is gone. Last time's timeline appears the moment you open. New posts join in about a second. Then, while you stay, new posts appear each time one of your people writes. The difference from the phone calls? Nothing to wait for.
9.What it cannot do
A crystal radio cannot hear everything.
- A list that collects posts by word (say, every post that says "spaghetti") must choose from every post. That is too much for a phone, so it uses AppView search. This stays the dam's job.
- Someone else's custom feed (a stream of posts they picked) is what their server chose. It cannot be rebuilt, so you must ask for it.
- The weir's signal comes from the Relay. If the Relay stops, the weir stops. The well remains.
- Jetstream replay reached 36 hours back on the relay I measured.
- Reading the contents of each post still relies on the AppView. Showing posts from the shelf and the well alone comes next.
10.Pirate radio
In Bluesky's early days, invited people talked on one shared frequency. No station. No license. A pirate radio. Then the crowd grew, and a big station appeared.
The crystal radio model is not a return to those days. It is a choice made with full knowledge that the big station exists: pick your own frequency. You do not need the whole spectrum. The voices you chose are enough.
Next, I plan to build a pirate radio that runs on AT Protocol, the rules Bluesky runs on. Write records in a shape you define, and they ride the same airwave. Listeners only tune in. Opening a station takes no license and no big equipment. What voices will we hear then?
Sources
- From Data Sovereignty to Viewpoint Sovereignty (2026-03-23). First used the weir and crystal radio images.
- The Fifth Path: Pull, Don't Push (2026-03-24). The well: a village with wells needs no river.
- AppView-less Does Not Mean Decentralized (2026-04-17). The April 16 outage, and why "who replied?" needs a server that collects every house.
- tangled.org/moja.blue/crystal-radio. The spec and reference code, for builders.