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
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.
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.
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.
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.
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.
The programme 01The 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.
The library 02The 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.
The plugins 03The 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.
Why it is quiet 04Why 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.
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.