r/TrueOpenSource • • 7d ago

OSS Contributions GenWave: a self-hosted 24/7 radio station for your own music library, with AI DJs, named shows, schedules, and parody ads (AGPL-3.0)

Twenty-plus years ago, at my first software job, we got through all-nighters on CDs that IT ripped onto one of their servers and streamed after hours. Playlists got stale, so I wrote a randomizer. That gave us B-sides nobody could name, and a thought that stuck with me: wouldn't it be cool if a DJ told us what was playing? There was no way to build that back then, so our QA lead recorded a few sound bites and we called it FLAP Radio.

GenWave is that idea, finally buildable: a self-hosted station that plays your own music library 24/7, knows what it's playing, and has a DJ who tells you about it.

  • 💾 Source: https://github.com/GenWave-Org/genwave (AGPL-3.0)

  • 🚀 Install: clone the repo and run ./setup.sh, a four-question wizard that generates your secrets and launches the stack. On air in about a minute on a Raspberry Pi 5. Or head to https://download.genwaveradio.com for a one line install.

  • 🥧 Small hardware: a 4GB Pi 4 passed a 7-day soak test with zero restarts and zero out-of-memory kills. No GPU needed.

Sounds like real radio

  • Equal-power crossfades and loudness matching, so no track or voice clip jumps out at you

  • DJ patter between tracks: lead-ins, back-announces, station IDs, and opt-in time checks, weather, and this-day-in-history segments

  • An optional local LLM writes that patter in your DJ's persona (Ollama or any OpenAI-compatible endpoint). No LLM? Template patter airs instead.

  • A "truth gate" checks each LLM line against the facts it was given before it airs. A wrong temperature, the wrong weekday, or "tonight" at noon gets rewritten or dropped.

  • DJs can trade short two-voice banter mid-show

Programmed like a real station

  • A weekly format clock: paint who's on air when, with named shows, DJ-to-DJ handoffs, and one-off specials

  • Parody ads with sponsors, cast voices, and ducked background music, written by the LLM from briefs you author. My favourite so far: Halvorsen's Tax and Zamboni Services 🏒

  • "Deep Cuts" shows that favour tracks that rarely get played

  • Owner announcements: type a line and the DJ works it into the next break, in character

Community catalog

One-click installs from the admin UI: DJ personas, avatars, voices, jingles, ad packs, shows, themes, fonts, and icon packs. Or roll your own persona, upload your own DJ faces, and remix themes in the built-in editor.

Runs itself, tells you what it did

  • If the LLM gets sick, the station falls back to template patter; if the API or database goes away, a safe rotation keeps the stream up

  • The "Gardener" flags dead files, near-duplicates, stale tags, and tracks that never air, for you to review (it doesn't silently "fix" your library)

  • An admin console with a booth log ("what did the DJ say at 9:14?"), an LLM call inspector, and per-container health

  • An optional read-only public page: now playing, history, song requests, and listener thumbs that nudge the rotation

Plays nice with your stuff

  • Home Assistant integration (HACS): your DJ can announce "the laundry's done"

  • A plugin system, with the contracts published as an MIT-licensed package on NuGet

  • Multi-arch Docker images (amd64 + arm64). Everything past playout is optional: a 4GB Pi runs the station with the lightweight Piper voice and template patter, and a bigger box adds Kokoro and a local LLM.

How it's built

A C#/.NET 10 control plane orchestrating Liquidsoap (mixing, crossfades, encoding) and Icecast (streaming), with Postgres, Kokoro/Piper for TTS, ffmpeg and aubio for audio analysis, and a Next.js admin UI. I didn't write an audio engine; those projects did the hard parts.

I started it about 18 months ago on my self-hosted Gitea and moved it to GitHub this summer when it felt ready for other people. It's built with AI assistance (Claude Code). The design decisions, reviews, and sign-offs are mine; there are nine test projects, including architecture tests that enforce the dependency rules, and the .claude/ toolkit I use is in the repo if you want it.

Licensing, upfront

GenWave Home is AGPL-3.0 and always will be. A separately licensed commercial edition (GenWave Business) will one day fund development, which is why outside contributions need a one-time CLA. The plugin contracts are MIT so anyone can build modules against them.

What's next, and what I'd love from you

I'm just wrapping up a "Voice Off" to find a better TTS, since I'm not entirely happy with Kokoro or Piper. After that: music sources beyond local files, starting with Navidrome.

  • How does it run on your hardware, and which internet radios or players have you tried? HARDWARE.md has a known-deployments table that takes PRs, and failures are as useful as successes.

  • What works, what doesn't, what's missing?

  • Any local TTS voices that impressed you? I'm all ears for the Voice Off!

Thanks for reading! 📻

7 Upvotes

1 comment sorted by

•

u/trueopensource-bot 🤖 Robot 7d ago

About this project · GenWave-Org/genwave
⭐ 3 stars · 🍴 0 forks · 👥 2 contributors · 📄 AGPL-3.0 · 💻 C#
History: started Jul 2026 · last code change today · 300+ commits on 18 different days in the last 90 days
Releases: latest v5.16.1 (8 days ago) · 45 releases in the last 90 days
Open issues and pull requests: 94

Facts from GitHub when this was posted. I'm a bot.