Self-hosted internet radio
GenWave
Turns your own music library into a real radio station: one shared broadcast stream, loudness-matched so quiet and loud tracks play back even, crossfaded so the silence never happens.
And there's a DJ — one who actually knows what's playing, and tells you about it between the tracks.
Measured 2026-08-19: Raspberry Pi 5 (4 GB), 9,000-track library on NFS — 1:36 to the first note. Fresh VM: 1:10.
One line. On air.
Docker and a music library are the only prerequisites. This clones GenWave at its latest release and hands off to its own setup wizard — no sudo, anywhere in the path.
curl -fsSL https://install.genwaveradio.com/install.sh | bash
Shortens to just curl -fsSL https://install.genwaveradio.com | bash once the redirect rule is in place — it's the identical script either way, and the full path above works today.
Read it first
Piping a stranger's script into a shell is a leap of faith. Don't take it blind — this is loaded live from /install.sh on this same server, so what you read here is exactly what the one-liner above runs. Plain bash, no obfuscation, no sudo.
Loading install.sh…
Couldn't load it inline right now — view install.sh directly.
Look inside
- Live demo — tune in, watch what's on the air, ask the station for a song
- Source on GitHub — AGPL-3.0, every line readable, issues and PRs welcome
Standing on
GenWave is a control plane, not a from-scratch audio engine. It's wired around real infrastructure that did the hard parts first.
-
Liquidsoap
Real-time mixing, crossfade, and encode — the actual audio spine underneath everything GenWave decides to play.
-
Icecast
Fans the mixed stream out to every listener, reliably, at whatever scale the station needs.
-
Kokoro
The primary DJ voice — an open-weight TTS model, rendered locally, no cloud voice API.
-
Piper
A fast, CPU-only local voice — the fallback that keeps a DJ talking on modest hardware.
-
Ollama
Runs the local LLM that writes lead-ins and back-announces when you point GenWave at one — the station airs template patter without it.
-
ffmpeg
Loudness, cue points, energy analysis — the numbers every crossfade decision rests on.
-
aubio
The BPM analysis under the hood, one more measurement the catalog remembers per track.
-
PostgreSQL
The catalog of record — every track, every measurement, every scheduled show.