Plan: AI radio broadcast pipeline (shipper + streamer + VPS bundle) #2

Closed
opened 2026-09-30 22:01:05 +02:00 by hermes · 0 comments
Owner

Goal

Listen to the AI-generated radio on an old MP3 internet stereo. Generator creates songs + playlist; files live on a streaming VPS; icecast serves the stream; now-playing goes to MQTT.

Architecture (decided in grill-me session)

  • Generator (anywhere, LLM+ComfyUI configurable): writes songs, builds rolling playlist
  • shipper (Go, generator machine): library -> newest-biased playlist -> FLAC->MP3 (ID3-tagged for stereo display) -> scp to VPS (playlist last)
  • streamer (Go, VPS): plays shipped files into icecast mount as one endless stream; MQTT now-playing per track; survives generator sleeping
  • VPS bundle: icecast (HTTP :8000) + Caddy (auto HTTPS) + streamer, docker compose
  • Config: .env only, no webui. Go wherever possible, zero third-party Go deps.

Definition of done

  • Domain: playlist policy (newest-bias, disliked filter) unit-tested
  • Infra: m3u writer (sanitized), icecast SOURCE client, MQTT 3.1.1 client - wire-tested
  • App: library loader, ffmpeg transcode, scp ship
  • cmd/shipper + cmd/streamer binaries
  • E2E against fake icecast + fake MQTT (tests/fakes.py): handshake OK, 151KB streamed, titles published
  • VPS bundle: docker-compose.yml, Dockerfile.streamer, icecast.xml, Caddyfile, .env.vps.example
  • Multilevel docs: README, docs/architecture.md, docs/config.md, docs/stereo-setup.md, vps/DEPLOY.md
  • Deployed to the user's VPS (user deploys; see next issue)
  • Real generator library shipped end-to-end (needs generator running)

SUPERSEDED — canonical repo is now frank/ai-radio-two. Mirrored there as issue #2 (see frank/ai-radio-two#4-#1).

## Goal Listen to the AI-generated radio on an old MP3 internet stereo. Generator creates songs + playlist; files live on a streaming VPS; icecast serves the stream; now-playing goes to MQTT. ## Architecture (decided in grill-me session) - **Generator** (anywhere, LLM+ComfyUI configurable): writes songs, builds rolling playlist - **shipper** (Go, generator machine): library -> newest-biased playlist -> FLAC->MP3 (ID3-tagged for stereo display) -> scp to VPS (playlist last) - **streamer** (Go, VPS): plays shipped files into icecast mount as one endless stream; MQTT now-playing per track; survives generator sleeping - **VPS bundle**: icecast (HTTP :8000) + Caddy (auto HTTPS) + streamer, docker compose - Config: `.env` only, no webui. Go wherever possible, zero third-party Go deps. ## Definition of done - [x] Domain: playlist policy (newest-bias, disliked filter) unit-tested - [x] Infra: m3u writer (sanitized), icecast SOURCE client, MQTT 3.1.1 client - wire-tested - [x] App: library loader, ffmpeg transcode, scp ship - [x] cmd/shipper + cmd/streamer binaries - [x] E2E against fake icecast + fake MQTT (tests/fakes.py): handshake OK, 151KB streamed, titles published - [x] VPS bundle: docker-compose.yml, Dockerfile.streamer, icecast.xml, Caddyfile, .env.vps.example - [x] Multilevel docs: README, docs/architecture.md, docs/config.md, docs/stereo-setup.md, vps/DEPLOY.md - [ ] Deployed to the user's VPS (user deploys; see next issue) - [ ] Real generator library shipped end-to-end (needs generator running) --- **SUPERSEDED** — canonical repo is now [frank/ai-radio-two](https://git.obahan.xyz/frank/ai-radio-two). Mirrored there as issue #2 (see frank/ai-radio-two#4-#1).
hermes added the architecturedone labels 2026-09-30 22:01:05 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: hermes/radio-go#2