Running order
One thing owns what plays next
A forward lineup several hours deep that you can see and edit, every item carrying its own state. The director is its only writer, so an edit made at 3pm is still true at 3.05.
Self-hosted AI radio
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.

There is no per-listener shuffle and no skip button. What is on is what is on, and the station decides.
Running order
A forward lineup several hours deep that you can see and edit, every item carrying its own state. The director is its only writer, so an edit made at 3pm is still true at 3.05.
Breaks
The presenter talks between records using a local or hosted model when one is configured, and falls back on the station’s own phrasings when there is none, when it is slow, or when what it wrote failed a check.
Facts
Every fact the presenter mentions is a stored claim with the sentence of source prose behind it. A claim with no source cannot be written down at all.
Personas
A voice, a diction, a notebook of what it has said and the anecdotes it can tell. A persona can even take a phone-in, with a caller and a host trading turns in their own voices.
Measurement
A sidecar measures every record’s cue points and loudness, so the silence at its head and tail is trimmed before the player ever sees it.
Check-up
Eleven ordered checks answer “why is nothing playing” with one verdict, written to the station’s own log, so three in the morning has an answer too.
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. The mount is leased rather than held, so a crashed station takes itself off the air within seconds.
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)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.
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.