Skip to content

SR–J03 · Field Notes · Aug 2026 · 6 min read

Designing a World of Listening

Building Spinn Radio: what it takes to turn a community catalog of tens of thousands of live stations into a globe you can wander — first paint, stream reliability, metadata read off the wire, and light that answers to the sound.

Shaji Rizvi

Editorial illustration — a desk globe ringed by signal arcs beside a vintage radio, one station glowing yellow
SR–J03 · illustration

Spinn Radio began with a discomfort about grids. Every listening product I opened arranged the world's radio as rows of cards — recommendation shelves, indistinguishable from a video app or a food-delivery app. But radio is the most geographic medium we have. A station is somewhere; it is somebody's morning in a specific city. So the first design decision of Spinn was almost embarrassingly literal: put the stations where they are. The interface is a globe — NASA's Blue Marble imagery by day, city lights after dark — and listening becomes an act of travel. These are field notes from building it.

What follows is deliberately concrete. The romantic version of the product — spin the earth, land somewhere unexpected, hear it live — only works because of a stack of unromantic decisions underneath: an honest relationship with a community catalog, a first-paint budget, a proxy that babysits fragile streams, and a parser that reads song titles off the wire byte by byte.

Honest numbers

First, whose stations are these? Spinn streams from Radio Browser, a community-maintained public directory of internet radio. On the day I checked while writing this, that directory held 62,518 stations across 241 countries and territories. Shorthand like 'fifty thousand stations, two hundred countries' is therefore true and conservative — but the numbers describe the reachable catalog, not a proprietary database, and I think products in this space should say so plainly. The community built and maintains that directory. We build on it.

Our own layer sits on top: an index of roughly thirty thousand of the highest-value stations, scored and tiered in our database, plus a directory restricted to streams that have actually been verified healthy. A community catalog at this scale is glorious and messy — duplicates, dead links, mislabeled streams — and the difference between a demo and a product is mostly what you do about the mess. Nothing dates a product faster than a number its own data cannot defend; we would rather publish the floor than argue for the ceiling.

The first-paint problem

A globe with sixty-odd thousand pins is not a rendering problem; it is a patience problem. Nobody waits for a world to download. Our answer is a seed: exactly 1,200 top geo-tagged stations, precomputed into a static file and cached by the service worker, so the first frame of the globe is already populated before any API has answered. The rest of the world streams in behind it. The seed is a curation artifact as much as a performance one — choosing which 1,200 places represent the world on first load is an editorial act, and we generate it from station scores, not from taste on the day.

The globe itself exists three times over: one renderer built on MapLibre's globe projection with the Blue Marble tiles, one on three-globe, one on cobe. Keeping three implementations behind one interface began as an evaluation tactic and stayed as a resilience feature — devices differ enormously in what they can draw, and a listening product should degrade toward simpler light, not toward failure. The app senses what class of device it is running on and scales visual quality to match: the same globe, drawn to the machine's means.

Making the stream trustworthy

Internet radio streams fail in every way a stream can fail: playlists that point at other playlists, servers that take seconds to say hello, formats a browser only half-supports. Early on, the time between tapping a station and hearing sound was the product's worst number, and no interface polish compensates for it. The fix was a proxy that does the boring work in advance: it resolves playlist indirection, and it has a warm-up mode — the interface calls it the moment a station looks likely, so the upstream connection is already open before the listener commits. Add liveness probes, a stream resolver, an outbound allowlist and HLS support for the stations that need it, and 'tap, then sound' becomes something you can rely on.

Behind the proxy sits a two-layer cache — one in the process, one in Redis — that will serve a slightly stale answer while it refreshes, so a thousand identical questions about a country's stations collapse into a single trip upstream. Radio is live; its directory does not have to be.

None of this is glamorous engineering. All of it is the product. A world of listening in which half the doors are stuck is not a world; it is a brochure.

Reading the wire

Live radio's metadata arrives interleaved with the audio itself — the old ICY convention, in which the stream periodically injects a small block announcing what is playing. Spinn's now-playing pipeline is a hand-written streaming parser for that convention, including the tedious case where a metadata block is split across chunk boundaries and has to be carried between reads.

I mention the carry buffer because of what it buys. The moment a song changes in a studio somewhere, the interface can know, and everything downstream — the toast that names the new track, the cards about the artist — hangs off that one honest signal. Live metadata is the difference between playing a stream and listening to a station.

Light that listens

The globe reacts to sound, and the house rule is that the reaction must be real. The audio pipeline exposes actual analysis — energy bands from sub-bass to treble, plus a waveform — and that data drives the playing station's glow on the globe and the small spectrum in the player bar. Nothing pulses on a timer. If the visuals move, the music moved them.

On top of this sit five scene moods — Cosmic, Aurora, Neon, Night Lights, Minimal — because a product people leave on for hours is closer to a lamp than to a dashboard, and a lamp should suit the room. Minimal exists for the same reason the reduced-motion preference is honored throughout: the right amount of spectacle is sometimes none.

Cards, cooldowns and the right to be quiet

Long-form listening invites a temptation: the screen is just sitting there, so fill it. We built the opposite — an orchestrator that schedules ambient cards over the globe (weather at the station's location, station insights, artist notes, world clocks, a ticker of local culture: thirty distinct types in all) under strict cooldowns and priorities. It decides what may appear and, more importantly, what must wait. Arrival is protected: when you land somewhere new, the system holds its tongue and lets the place introduce itself.

The scheduler is the editorial voice of the product. An interface for hours-long listening earns attention the way good radio hosts do — by mostly not talking.

What a listening world owes its listeners

Spinn runs in production on the web today, with Android and iOS builds alongside it, and it is still being built. But the lessons feel settled enough to write down. Be honest about whose catalog you stand on. Spend your cleverness below the waterline — indexes, seeds, proxies, parsers — so the surface can stay simple. Make every moving pixel answer to the sound. And treat restraint as a feature with an implementation, not a sentiment: cooldowns, arrival holds, a Minimal mode, a parser that tells the truth about what is playing.

A grid shows you what a platform wants you to want. A globe just shows you the world — on the honest condition that someone did the work to make the world load. That work is the product.