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.

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.

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.

Breaks

A model cannot make it go quiet

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

True, or nothing

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

Presenters that accumulate

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

It knows what it is playing

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

It says why it is quiet

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.

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. 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)

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.