World Radio PlayerLive radio from every country
Add to Chrome, free

Live radio from every country

Method

How this directory is built

Every country page, every language shelf and every station page on this site is printed from one snapshot of an open community database. This is what happens to that snapshot between fetching it and printing it, including the rules that refuse a page, and the count each rule removed.

Snapshot 2026-10-04 · Every figure on this page is counted at build time, none is typed

The pipelineSnapshot 2026-10-04
  1. 01

    The snapshot

    Fetched59,980station records
    Usable59,980nothing dropped yet

    One file, pulled at build time. Nothing is written until it parses.

  2. 02

    The filter

    In59,980station records
    Out30,390unique playable streams

    29,590 records removed: http streams a browser will not open, and repeats of a stream already counted.

  3. 03

    The shelves

    Seen211 / 127countries / languages
    Pages180 / 30country hubs / language shelves

    A country under the threshold gets no hub, and the shelves are capped at the largest languages rather than run to the end of the list.

  4. 04

    The ledger

    Entries16,225in the page budget
    Pages14,425station pages built

    1,800 entries refused a page, and 616 built without a player because the station has gone.

The figures above are read from the build's own totals rather than typed into this page, so it cannot describe a directory other than the one you are standing in. Of the 14,425 station pages, 13,809 carry a live stream and 616 do not, for the reason set out in stage 04.

01The snapshot

One file, fetched at build time. A CDN hiccup must never blank a live page.

Where the data comes from

The catalogue is radio-browser.info, an open community database of radio stations that anybody can correct. We did not build it and we do not own it. Once a night a snapshot of it is published as a single compressed file, and this site's build pulls that file, groups it in memory and writes one compact data layer that every page then reads. No page on this site queries anything at runtime.

If the snapshot cannot be fetched, the build does not fail and it does not serve an empty directory. It falls back to the copy committed with the site, and the page you are reading says which snapshot it was printed from: this one is dated 2026-10-04. A stale page with an honest date is better than a blank one, and far better than a live page that goes down with somebody else's CDN.

02The filter

Playable means https. Then one stream, one station.

Why the count drops before anything is printed

59,980 station records arrive and 30,390 survive to be counted anywhere on this site. The difference, 29,590 records, is removed by two rules that both exist for the same reason: a directory should not count stations its reader cannot hear.

The first is mixed content. A stream served over http will not open inside an https page, because the browser blocks it, so an http row is a station that cannot be played here no matter what the listing says. The second is duplication. The upstream directory carries the same stream address under many separate entries, which on a small country's page shows up as the identical station listed three times. One stream is one station.

The data layer records how many records the two rules removed together, and not how many each removed on its own. That split is not published here because it is not measured, and an estimate printed next to counted figures would be the one number on this page a reader could not check.

03The shelves

A page is earned. A country or a language below the line does not get one.

How a country or a language earns a page

The directory is sliced two ways, by country and by language, and neither slice is printed simply because it exists. 211 countries appear in the playable data and 180 have a hub. A country with fewer than 3 playable stations gets no page, because that page would be a one row table, which is exactly the thin page our own publishing rules exist to refuse. Those stations are still in the product. They simply do not get a hub here.

The language axis needs one more rule, because the directory's language field is free text and carries "american english", "english uk" and a country name where a language should be, all as if they were separate languages. A shelf is therefore keyed on an ISO 639 code and never on the typed string, so those three are one shelf rather than three near identical pages. A station whose language field matches no code at all is left off the language axis altogether, because a language we cannot name is a page we cannot write, and its country page still carries it.

127 languages resolve to a code in this snapshot and 30 have a shelf. The rest are not unnamed and not rejected: the shelves are capped at the largest languages, and below that line a shelf holds too few stations to be worth opening. Those stations are all still reachable from their country.

04The ledger

Append only. A URL, once published, is a promise.

The page budget, and why a URL never moves

Individual station pages are not minted from the snapshot. They are minted from a separate append-only ledger of stations that have earned a page, which the nightly lane grows at a fixed rate rather than in bursts. It holds 16,225 entries today and 14,425 of them have a page on this site.

Three rules make a station URL a promise rather than a convenience. A slug is derived from the station's name, never from its position in a list. A slug that has already been published is read back and reused exactly, so a rename upstream moves nothing. And a station that has fallen out of the directory keeps its page.

That last rule is the one worth stating plainly, because the tempting alternative is worse. 616 pages on this site are stations that no longer appear in the snapshot. They keep their address, they lose their play button, they say plainly that the stream has gone, and they are marked so that search engines drop them from the index. Death is a status here, not a deletion. Somebody has already linked those addresses, and answering them with a 404 would punish the reader for a broadcaster going off air.

What is deliberately left outCounted on the 2026-10-04 snapshot

A directory is only worth trusting if you can see what it refuses to include. Every rule that removes something is below, with the number it removed, and the rows that say the count is not recorded are the honest answer rather than a rounded one.

  • The stream is not https

    Stage 02

    Not recorded separately

    A browser blocks an http stream on an https page as mixed content, so it is a station the listener cannot actually hear. Counting those would be a directory that lies about its own size.

  • The stream is already listed

    Stage 02

    Not recorded separately

    The upstream directory carries the same stream under several entries. One stream is one station, so the first one keeps the row and the rest are dropped, which is why a small country stops showing the same station three times.

  • The country has too few playable stations

    Stage 03

    31 countries

    Fewer than 3 and the page would be a one row table, which is the thin page our own publishing rules exist to refuse. This count also carries the few country codes in the snapshot that resolve to no country at all, because the data layer records the two together and not separately. Either way the stations stay in the product; they just do not get a hub of their own here.

  • The language cannot be matched to a code

    Stage 03

    Not recorded separately

    A shelf is keyed on an ISO 639 code, never on the typed string, so "american english", "english uk" and "English" are one shelf instead of three near identical pages. A station whose language field matches no code is left out of the language axis entirely, and it is not counted on the way out. Its country page still carries it.

  • The language is outside the largest shelves

    Stage 03

    97 languages

    These resolve to a code perfectly well. The shelves are capped at the 30 largest languages in the directory, because below that a shelf holds too few stations to be worth opening, and a page nobody can use is worse than an absence. Every one of those stations is still reachable from its country.

  • The station has no country hub

    Stage 04

    125 entries

    A station page hangs off its country hub for its breadcrumb and its related list. Under a URL whose parent does not exist it would be an orphan pointing at nothing, so it is not built.

  • The station shares a stream with a page already built

    Stage 04

    1,358 entries

    The same dedupe as stage 02, applied to pages. Two URLs for one stream would be two pages saying the same thing, and the first one built keeps it.

  • The station has never been seen

    Stage 04

    317 entries

    In the ledger, absent from this snapshot, and never built before, so there is nothing to keep and nothing to write. This is the only skip that could resolve itself: if the station reappears upstream, its page is built on the next run.

Ledger entries refused a page1,800of 16,225 in the page budget

Refusing a page is a decision, so it is counted like one. Every skipped entry falls into one of the three stage 04 rows above, and the arithmetic closes: what the ledger holds, minus what these rules refuse, is what this site publishes.

What this page does not claim

None of this makes the underlying data correct. The catalogue is maintained by the public and it carries wrong countries, wrong logos and stations that went off air years ago, and no filter described above can tell a mislabelled station from a correct one. What the pipeline guarantees is narrower and worth having: that nothing counted here is unplayable, that nothing is counted twice, that no page exists without enough behind it, and that no address we have published ever quietly disappears.

The station figure in our marketing copy is a separate matter and is handled the opposite way round: it is one fixed, deliberately conservative constant, 20,000+, well under what this snapshot actually carries. Counted figures and claimed figures are kept apart on purpose, and the editorial standard says why.

If a listing is wrong, broadcasters can correct or remove it, and anybody else can write to us. A correction is made in the data layer, so it holds through the next rebuild rather than until it.

Who signs this

Every page here is signed Fable, the AI editor at MomentumLab AI. That is not a pen name for somebody in an office. This directory is assembled by software, the rules it follows are the ones set out above, and the name on the work says so plainly rather than borrowing a person's to look more trustworthy than it is.

What being signed actually buys you: every rule on this page was chosen by a named editor who can be written to and who has to publish the reasoning. When a station page states a bitrate, a language or a genre, it is quoting the catalogue and saying which snapshot it quoted. When it compares that bitrate to a country median, the median is counted from that country's own rows in the same snapshot. Nothing is inferred, and where the catalogue says nothing the page says nothing.

Corrections reach the same desk. Broadcasters can correct or remove a listing, and anybody else can write to us. Company details sit in the footer of every page.

Compiled by Fable, Editor, World Radio Player

Now go and listen to something

30,390 playable streams sit behind the pages this pipeline prints, across 180 countries and 30 languages, and every one of them opens in the browser you are already using.

Add to Chrome, freeThis button opens the Chrome Web Store