Skip to main content

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.

  • Self-hosted
  • Your music
  • Any model, or none
  • MIT licensed
Hear a station
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. The running order.

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

Fig. 03 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 three 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. Facts and claims.

Fig. 04 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 four 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. Characters.

It can also give the hour to something that is not records: a podcast it carries, a book or column it reads out, or a phone-in it produces for itself, where a caller and the host trade turns and each turn is its own model call in its own voice. A guest can drop by the studio the same way, and a show's co-hosts can banter.

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

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. What is on air, Skip, Stop and your opinion of the record playing also come as keys, on an Elgato Stream Deck.

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

    The programme

    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. Above it, a weekly timetable of blocks, each with its own brief and its own presenters, guest hosts who sit in now and then, and specials for the dates that matter.

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

    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.

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

    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.

  4. Why it is quiet
    Check-up: whether the station is on air and why, what needs somebody, and the loops that keep it running.
    04

    Why it is quiet

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

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
  • Rhapsode
  • ElevenLabs
  • 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

Your library

It plays your music, not its own.

deadair holds no catalogue. It programmes what your provider already gives you, and it grants you no rights to broadcast any of it.

  • Spotify
  • YouTube Music
  • Pandora
  • Apple Music
  • Navidrome
  • Any Subsonic server
  • Jellyfin
  • Emby
  • Plex

Run it

One container, one port.

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.

curl -fsSL https://deadair.radio/install.sh | sh

On any machine with Docker and the Compose plugin, that asks where to put the station, which tag, which port and the address you will type to reach it, then starts it and checks it came up. On Unraid it is an app in Community Applications instead. Before you install says what to have ready.

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 a release such as deadair/deadair:full-0.50 to track releases only. The quick start takes the first one from nothing to on air, and the install guide covers every choice it makes for you.

Listeners get /live.mp3, with Opus, AAC, FLAC and HLS when you turn them on, so anything that plays an internet radio stream plays the station. There are also apps: Android on Google Play, and iPhone and macOS built from source. Listening.

Develop

Build on it.

A plugin

Music sources, facts, charts, voices, models and news are all plugins, and yours loads beside the bundled sixteen without rebuilding anything. Plain npm, against the published SDK. Your first plugin.

The API

Every station serves the same HTTP API, and the console and all three listener apps are built on it. A key from Settings, Sign-in and security drives the desk from your own code, a keypad or a home-automation hub. Build on the API.

The station itself

A pnpm monorepo, a Koa API and a React console, with the audio chain in containers beside it. From clone to a station running on your machine is one page. Setting up a checkout.

Hardware

The desk on keys: what is on air with its cover, Skip, a Stop that asks twice, and a heart on the record playing. Get it on the Elgato Marketplace, or read what it does.

Put a station on the air. One container, your music, and a presenter who never goes quiet.