Skip to main content

Self-hosted AI radio

An AI radio station you run yourself.

It picks the records, writes what the presenter says between them, speaks it in that presenter’s voice, and streams the result. One mount, one running order, and everybody hears the same thing at the same moment.

  • Self-hosted
  • Your music
  • Any model, or none
  • MIT licensed
Fig. 01 The Desk, on air
The Desk: the record on air with its playhead, one thing that needs the operator, and the running order below.

A radio station, not a playlist.

There is no per-listener shuffle and no skip button. What is on is what is on, and the station decides. You run it from a desk, and everybody else hears it.

Part one · The running order

One thing owns what plays next.

Not a queue that gets topped up. A forward lineup several hours deep that you can see and edit, where every record and every break carries its own state. The console, the schedule and the model all ask one part of the station to change it, and that part is the only thing that writes it. So an edit made at 3pm is still true at 3.05.

Tell it what you want in a sentence, “rap like snoop dog”, and it programmes the next hours to that brief. Ask it why the record on air is on air and it will say. Nothing is committed to air until its audio is on the machine, so the stream never waits on a download.

Fig. 02 The running order, several hours deep
The Desk: the record on air with its playhead, one thing that needs the operator, and the running order below.

Part two · The programme

Which hour is which.

The format clock is what the station says inside an hour, whatever it is playing: the weather at five past, the news at half past. A band takes the first boundary at or after its time, so nothing is ever cut off mid-record.

Above it, a weekly timetable of blocks, each with its own brief and its own presenter, and a sustaining setting for whatever nobody scheduled. A station with no schedule at all is an ordinary station: it keeps playing what you put on until you put something else on.

Fig. 03 The format clock
Programme, Today: the format clock, a dial with a weather band at five past and news at half past.

Part three · The presenter

A model cannot make it go quiet.

The presenter talks between records using a local or hosted model when one is configured. When there is none, when it is slow, or when what it wrote failed a check, the station falls back on its own phrasings. That floor cannot fail, which is the whole design.

Every attempt is kept, the declined ones too, with the reason. One here was turned down because the model said “tonight” at seven in the morning, which a listener hears immediately and the station cannot take back.

Fig. 04 Every break written, and every one declined
What it said: every break written and every one declined, each with its writer and, for a declined one, the reason.

Part four · The facts

True, or nothing.

Every fact the presenter mentions about a record is a stored claim with the sentence of source prose behind it. A claim with no source cannot be written down at all. The alternative is a presenter saying something specific, checkable and untrue in exactly the voice it uses for things that are true.

It also knows what the record sounds like. A measurement sidecar decodes each one for its cue points and its loudness, so the silence at its head and tail is trimmed before the player ever sees it.

Fig. 05 One record, and what the station knows about it
One record in the library: where its copies come from, its cue points and loudness, when it has played, and what is known about it.

Part five · The characters

Presenters that accumulate.

Who is presenting is a character with a voice, a diction, how much rope it is given and how brief it is. It keeps a notebook of what it has said and the traits it is growing into, and a set of stories it can tell on air.

A show can hand the hour to a different character, and you can rehearse one over an hour of records before it goes on air.

Fig. 06 The roster
Voice, Characters: who is presenting now, and the roster of hosts with their styles and voices.

Part five, continued · Phone-ins

It can take a call.

A phone-in is a produced block in the middle of a broadcast. A caller and the host trade turns, each turn its own model call in its own voice, and the whole thing is joined into one piece of audio before it airs.

Nothing is made while you wait. It goes into the running order once every beat has been spoken.

Fig. 07 Phone-ins the station wrote for itself
Voice, Productions: phone-ins the station wrote for itself, each with its state, its length and its cast.

Part six · The check-up

It says why it is quiet.

Eleven ordered checks over one snapshot answer “why is nothing playing” with a single verdict, and the answer is written to the station’s own log. So “why was it silent at three in the morning” is a question with an answer.

The mount is leased, not held. A crashed station takes itself off the air within seconds rather than leaving a bed playing to nobody’s plan. By default it airs only while somebody is listening, and the console says so rather than reporting a fault.

Fig. 08 The machinery, in one place
Check-up: whether the station is on air and why, what needs somebody, and the loops that keep it running.

The console

The rest of the desk.

A broadcast desk rather than a player. It deliberately does not play the station: the listeners have the mount. It is what you open to see what is going out, what is coming up, and what needs you.

  1. The library
    The library: how many records are ready to air, and every track with its state and the station’s rating.
    01

    The library

    Every record the station has taken in, how many are ready to air right now, and what it thinks of each one. A thumb down on a record, an album or an artist is a veto no lineup can turn off.

  2. The plugins
    The plugins: a card per plugin with what it brings, whether it is running, and its settings.
    02

    The plugins

    Where the music, the facts, the weather, the voices and the model come from. Each says what it will talk to, and anything more it asks for waits for you.

  3. What happened
    The activity feed: what aired, what was written and spoken, and every break that fell through, newest first.
    03

    What happened

    What aired, what was written and spoken, and every break that fell through to the floor and why, newest first.

  4. Which model does which job
    Settings, Words: which model writes the breaks, which one chooses the records, and which one reads.
    04

    Which model does which job

    Writing a break and programming an hour are different sizes of task, so each has its own model. Leave them empty and the station still talks.

Three ways to read it.

The same desk in each of the console’s themes. The tally stays red in every one.

Carbon
The Desk: the record on air with its playhead, one thing that needs the operator, and the running order below.
Studio White
The same Desk in the Studio White theme: paper, ink and a serif masthead.
Neon Transmitter
The same Desk in the Neon Transmitter theme: neon yellow and cyan on teal-black.

The stack

Bring your own model. Bring your own voice.

The words and the voice are separate choices, and both are yours. Change either in Settings and the next break uses it, with no restart. A station with no model at all still talks.

The words

Any model can present.

As many providers at once as you add, each job on whichever suits it. Break-writing on a hosted model and reading on a local one is one setting each.

  • Ollama
  • vLLM
  • OpenAI
  • Groq
  • Mistral
  • OpenRouter
  • Anthropic
  • Gemini
  • Any OpenAI-compatible server

The voice

And any voice can read it.

Every character carries its own voice. Chatterbox reads from a reference clip rather than a named preset.

  • Kokoro
  • Chatterbox
  • Any OpenAI-compatible speech server

What it knows

Facts, news and the weather.

Where the claims come from, what the bulletins are written from, and what it is like outside.

  • MusicBrainz
  • Last.fm
  • Wikipedia
  • RSS
  • SearXNG
  • Brave Search
  • Tavily
  • Open-Meteo
  • US National Weather Service
  • OpenWeatherMap

How it fits together

Nothing in the station decodes, mixes or encodes audio. The mixing chain and the stream server run beside it, and the station drives them over HTTP.

                  your provider                    a model             a voice
              (Spotify / Navidrome)             (local or hosted)   (Kokoro / Chatterbox)
                       │                               │                    │
                       └───────────── plugins ─────────┴────────────────────┘
                                         │
    ┌────────────────────────────────────┴─────────────────────────────────┐
    │  the station (Node)                                                  │
    │    director ── one running order, and the only thing that writes it  │
    │    render   ── words, then audio, one state per stage                │
    │    playout  ── hands records over, one at a time, and holds a lease  │
    └────────────────────────────────────┬─────────────────────────────────┘
                                         │  HTTP
                  ┌──────────────────────┼──────────────────────┐
             Liquidsoap              PostgreSQL              analysis
          (mixing, on air)        (everything kept)      (cue points, loudness)
                  │
               Icecast ──────────────►  /live.mp3  (plus Opus/AAC/FLAC and HLS, opt-in)

Your library

It plays your music, not its own.

deadair holds no catalogue. It programmes what your provider already gives you, a Spotify account or a Subsonic server such as Navidrome, and it grants you no rights to broadcast any of it.

  • Spotify
  • Navidrome
  • Any Subsonic server

Run it

One container holds the station, its console, the audio chain, the stream server and the measurement sidecar. One port carries all of it, so whatever you already put in front of a port carries the station too.

deadair/deadair:full
Brings
A voice, PostgreSQL and Redis
You bring
Nothing. Start here on an empty machine.
deadair/deadair:latest
Brings
A voice
You bring
PostgreSQL and Redis you already keep backups of.
deadair/deadair:slim
Brings
The station alone
You bring
PostgreSQL, Redis and a speech server, ideally on a GPU.

Images are linux/amd64. The tags above follow main; pin deadair/deadair:0.1 to track releases only. The install guide covers the two secrets to generate first and the first-boot order.

Listen.

The mount

/live.mp3, with Opus, AAC, FLAC and HLS when you turn them on. Anything that plays an internet radio stream plays the station.

Android

Background playback and lock-screen controls. Signed in as the operator, it is the station’s remote as well. Build it from source.

macOS

A listener with a real player and the operator’s desk in one window, on Apple Silicon. Build it from source.

Put a station on the air.

One container, your music, and a presenter who never goes quiet.