Multi-account AI radio control center

Open-source-first radio manager with real D1-ready CRUD foundation

This control center now supports live D1-backed APIs when the database binding is present, fallback demo mode when not, open-source VPS deployment files, and a built-in Google-level reviewer workflow for hard QA.

Open-source coverage87%
Station statusready_for_vps
Data sourced1

Autonomous progress

  • D1 schema, seed, and real read/write APIs added
  • Fallback mode kept for local demo without Cloudflare secrets
  • Open-source Hetzner deployment pack extended
  • Reviewer prompt integrated into the QA workflow

Open-source picks

  1. AzuraCast + Icecast + Liquidsoap + FFmpeg for radio runtime
  2. Cloudflare D1 for structured app persistence
  3. Provider-ready schema for future Authentik or Keycloak integration
  4. Custom Hono dashboard instead of heavy admin frameworks

Station

Name
My Radio Core
Vibe
Urban / Caribbean / Live energy
Status
ready_for_vps

Database plan

Entities are mapped into D1 and can now be created through POST endpoints once the D1 binding is live.

usersteamsstationssocial_accountsstream_targetsschedules

Testing mode

Use the reviewer prompt after every major feature before rollout or deployment.

Auth + team permission foundation

Current operator: Primary Owner (owner@example.com). The app now exposes a session snapshot, team-members API, and a YouTube OAuth scaffold that becomes live as soon as secrets are added.

Session mode: . Signed cookie active: no.

station:readstation:updateschedule:readschedule:createschedule:updateaccount:readaccount:createaccount:oauth:connecttarget:readtarget:createasset:readteam:readteam:manage

YouTube OAuth scaffold

Provider
youtube
Status
waiting for secrets
Callback path
/api/oauth/youtube/callback
Redirect URI
https://aingel-radio-dashboard.pages.dev/api/oauth/youtube/callback

Start route: /api/oauth/youtube/start

Create social account

Create stream target

Social accounts

3 planned / connected
Youselfyoutube@myradioplanned
Youselftiktok@myradio.liveplanned
Friend Afriendfacebookfriend.station.pageneeds_oauth

Stream targets

2 outputs prepared
Main YouTube 24/7 streamyoutube24_7draft
Twitch simulcasttwitchsimulcastdraft

Schedule blueprint

3 programmed blocks
Morning playlist rotationplaylist_rotation06:00–12:00active
AI DJ midday segmentai_dj12:00–12:15active
Commercial blockads13:00–13:05active

Team members

2 collaborators
Primary Ownerowner@example.comowner
Friend Onefriend1@example.commember

Assets

2 registered
Brand sponsor spotcommercialexternal
Station ID Jinglejingleexternal

Automation blocks

Open-source-first radio workflow

Auto DJ playlist rotation

Liquidsoap + AzuraCast

open-sourceready

Commercial insertion

AzuraCast scheduler

open-sourceready

AI DJ voice segments

Piper / Coqui / optional premium TTS

mostly open-sourceplanned

24/7 social restream

FFmpeg on Hetzner VPS

open-source + VPSready_for_server_secret

API routes

/api/health /api/auth/login-demo (POST) /api/station (GET, PATCH) /api/social-accounts (GET, POST, PATCH/:id, DELETE/:id) /api/stream-targets (GET, POST, PATCH/:id, DELETE/:id) /api/schedules (GET, POST, PATCH/:id, DELETE/:id) /api/assets (GET, PATCH/:id, DELETE/:id) /api/auth/session /api/team-members (GET, POST, PATCH/:id, DELETE/:id) /api/oauth/providers /api/oauth/youtube/start /api/oauth/youtube/exchange (POST) /api/oauth/youtube/callback /api/oauth/oidc/start /api/oauth/oidc/callback /api/secrets/blueprint /api/vps/sync-plan /api/automation /api/blueprint /api/database/plan /api/testing/reviewer-prompt

Files added for next phase

migrations/0001_initial_schema.sql seed.sql deploy/hetzner/install_radio_stack.sh deploy/hetzner/docker-compose.azuracast.yml deploy/hetzner/ffmpeg-restream-example.sh docs/google_play_reviewer_prompt.md docs/open_source_workflow.md