AI Radio DJ Control Panel

BS Net Trading AI Agent Services

Dashboard Overview

Live Shows
0
Scheduled Shows
0
Available Presenters
15
Scripts Generated
0
πŸ“‘
Station Control
Impact Digital Radio β€” Live Status
Refreshing…
OFFLINE
Liquidsoap: β€”
Checking… β–Ό
Service Health
β™ͺ Now Playing
β€”
πŸ“… Current Show
β€”
⚠️
Suspend Broadcast?
This will stop Liquidsoap immediately.
The live stream will go silent for all listeners.

Are you sure?

Quick Actions

✨
Generate Script
Create presenter voiceover
πŸ“…
Create Show
Schedule a new program
πŸ‘₯
Manage Presenters
View all AI characters

Your AI Presenters (15 Total)

Track Weight Manager

β€”
β˜…β˜…β˜… Hot (weight 1)
β€”
β˜…β˜… Mid (weight 2)
β€”
β˜… Archive (weight 3)
Title Artist Weight Change
Loading tracks...

Live Control Panel

SYSTEM ONLINE

πŸ“» NOW ON AIR

00:00:00

⏭️ UP NEXT

πŸ“ˆ TODAY'S STATS

Shows Aired
0
Scripts Used
0
Active Listeners
0
Uptime
00:00:00

⚑ QUICK ACTIONS

πŸ“‹ ACTIVITY LOG

Dashboardβ€ΊAI Presenters

AI Presenters (15 Agents)

Dashboardβ€ΊCreate New Presenter

Create New Presenter

Basic Information

Voice Settings

Character Profile

Dashboardβ€ΊSchedule

Show Schedule

Dashboardβ€ΊScript Generator

πŸ“ Script Builder

πŸ“„ Script Preview

πŸ“

No script generated yet

βš–οΈ Compliance

βš–οΈ

Generate script first

Dashboardβ€ΊVoice Output Manager

Voice Output Manager

Total Generated
0
Processing
0
Ready to Export
0
Failed
0
Dashboardβ€ΊPrompt Engine

Prompt Engine

⚑ LIVE MODE β€” Scripts generated by Claude AI

πŸ“‘ Layer 1 β€” Station DNA

GLOBAL

This block applies to every script generated on Impact Digital Radio.

🎭 Layer 2 β€” Character Sheet

PER PRESENTER

Auto-assembled from each presenter's profile.

Select a presenter to load their character sheet...

πŸ”— Composed Prompt Preview

πŸ”—Select a presenter and script type in the Script Builder to see the full composed prompt here.

πŸ“¦ Demo Script Output Log

Demo outputs will appear here as scripts are generated

πŸ“’ Live Widget Messages

Add up to 10 messages. Each fades in for 20 seconds on the homepage widget. Choose a colour per message.

Dashboardβ€ΊSettings

System Settings

Checking services...
πŸ›‘οΈ Backend Proxy
🧠 AI Script Engine
πŸŽ™οΈ ElevenLabs TTS
☁️ Azure TTS
πŸ—„οΈ DynamoDB
πŸ—ΊοΈ Voice ID Mapping

πŸ›‘οΈ Backend Proxy

All secrets live exclusively on your AWS backend. This frontend never sees or transmits them.

πŸ”’
Architecture: Your proxy server fetches secrets at runtime from AWS Secrets Manager.
🌐 Proxy Base URL
Not connected
πŸ”‘ Frontend Auth Token
JWT Β· short-lived Β· auto-refresh
πŸ“‹ Proxy Endpoints
POST/proxy/ai/generateClaude script gen
POST/proxy/tts/elevenlabsElevenLabs render
POST/proxy/tts/azureAzure TTS render
GET/proxy/db/character/:idSingle character
GET/proxy/db/charactersFull sync
GET/proxy/healthLiveness check

🧠 AI Script Engine

The Anthropic API key never leaves your backend. Requests route through /proxy/ai/generate.

πŸ€– Model & Budget
Demo mode

πŸŽ™οΈ ElevenLabs TTS

Handles voice rendering for 11 presenters. API key stays on backend.

πŸŽ›οΈ Quality & Format
Not tested

☁️ Azure Cognitive TTS

Handles voice rendering for 5 presenters: Abby, Jody, Angie, Cindy, Tony.

πŸŽ›οΈ Region & Format
Not tested

πŸ—„οΈ DynamoDB

Stores backstories and character records. AWS credentials stay on the backend.

πŸ“¦ Table & Region
Not tested

πŸ—ΊοΈ Voice ID Mapping

Maps each presenter to their voice ID on ElevenLabs or Azure.

πŸŽ™οΈ ElevenLabs β€” 11 Presenters
☁️ Azure TTS β€” 5 Presenters

Create New Show

Hold Ctrl/Cmd to select multiple days

0 / 300

Impact Digital Radio
Staff Portal

AI DJ Control Panel

Authorised staff only. Enter your staff password to continue.

Redirecting to homepage in
30
seconds
πŸ”’ Secure Β· Impact Digital Radio Staff Portal
Dashboardβ€ΊAuto Script Generator
🎡 Upcoming Tracks
🎡

Select a show and click Load Tracks

πŸ“ Generated Scripts
πŸ“

Scripts appear here once generated

πŸ“‹ Activity Log
Waiting…
Dashboardβ€ΊBulk Script Generator

πŸŽ™ Bulk Auto Script Generator

Configuration

Scripts are generated in one Claude batch call for uniqueness, then each is TTS'd and saved directly to the show's auto-scripts/ folder. The state file is cleared so Liquidsoap picks them up immediately.

Live Progress

Waiting to start…

πŸ“£ Advertising Sales

Register new advertising clients and view all signed agreements.

πŸ‘€ Sales Staff
🏒 Client Details
πŸ“¦ Package Selection
πŸ₯‡
Gold
Β£400
100 advertisements
πŸ₯ˆ
Silver
Β£300
70 advertisements
πŸ₯‰
Bronze
Β£225
50 advertisements
πŸŽ™ Ad Production Details
✍️ Agreement
I confirm that the client has agreed to the advertising terms and conditions of Impact Digital Radio, that the information above is accurate, and that I am authorised to submit this agreement on behalf of the station.
Submission sends an automatic notification to william@impactdigitalradio.com and saves a record to the database.

All Advertising Clients

# Date Business Contact Package Total Payment Status
Loading…
πŸ‘€ Sales Staff
🏒 Sponsor Business Details
πŸ“¦ Sponsorship Package

Select one or more show slots. Enter the number of weeks for each. Then choose your booking duration below for the applicable discount.

πŸŒ…
Morning Show
Β£100 / week
Peak breakfast & mid-morning audience
weeks
β˜€οΈ
Afternoon Show
Β£50 / week
Daytime audience
weeks
πŸŒ™
Evening Show
Β£30 / week
Evening audience
weeks
⏱ Booking Duration
πŸ’° Live Pricing
Weekly rate Β£0.00 / week
Γ— 1 week(s) = Β£0.00
Total Β£0.00
πŸŽ™ Sponsorship Details
✍️ Agreement
I confirm that the sponsor has agreed to the programme sponsorship terms and conditions of Impact Digital Radio, that the information above is accurate, and that I am authorised to submit this agreement on behalf of the station.
Submission sends an automatic notification to william@impactdigitalradio.com and saves a record to the database.

All Programme Sponsorship Bookings

# Date Business Slots Booked Weeks Discount Total Payment Status
Loading…

🎬 Commercial Ad Playout

Manage advertiser spots, track campaign performance, and view proof-of-play reports.

β€”
Active Spots
β€”
Plays Today
β€”
Plays This Week
β€”
Peak Plays Today
β€”
Off-Peak Today
Package Breakdown β€” Today
Spot NameAdvertiserPackageCampaign TodayThis WeekTotalLast PlayedActions
Loading…
All registered advertisers.
CompanyContactEmailPhoneSpotsStatusActions
Loading…
Upload a Commercial Spot
🎡
Click to select MP3 or drag and drop here
0 words
Voice & Generate
DateDayTime (BST)Time BandCampaign WeekDuration
Select an advertiser and spot above.

Edit the rules for each advertising package. Changes take effect immediately.

Add Advertiser
Edit Spot Name
Edit Campaign Dates

🧾 Invoicing

Branded VAT invoices for advertisers β€” draft, review, send, and track payment.

Invoice #AdvertiserTotalStatusIssue DateDue DateActions
Loading…

Invoice

IMPACT
DIGITAL RADIO
SCOTLAND'S COMMERCIAL AI RADIO STATION
INVOICE
Description Weeks Aired Unit Price Total
Subtotal (ex. VAT):Β£0.00
VAT:Β£0.00
Total:Β£0.00

Create New Invoice

Description Weeks Aired Unit Price Total

Company Details (Invoice Letterhead)

πŸ“§ Comms Centre

Manage email templates, compose AI-assisted campaigns, maintain your contact list, and review sent emails.

Email templates with AI-fillable placeholders.
NameCategorySubjectCreatedActions
Loading…

Step 1 β€” Choose Template

Completed, filled-in emails saved for quick retrieval.
NameBased OnSavedActions
Loading…
NameEmailGroupNotesActions
Loading…
Showing last 200 emails, 20 per page.
Date/TimeTemplateSubjectRecipientsGroups
Loading…
Dashboard β€Ί Social Media Manager

πŸ“± Social Media Manager

Post to Facebook, Instagram, X and LinkedIn β€” compose, schedule and track.

Target Platforms

Only connected platforms will accept posts. Disconnected platforms will fail.

Post Content
0 / 280 for Twitter
✨ AI Content Generator
Scheduled Posts

Loading…

Post History
Date / TimePlatformStatusContentLink
Loading…
𝐟
Facebook
Not connected

How to get a Facebook Page Access Token

  1. Go to developers.facebook.com β†’ My Apps β†’ Create App (Business type)
  2. Add the Pages product, then use Graph API Explorer
  3. Select your app, click Generate Access Token, choose your page
  4. Grant permissions: pages_manage_posts, pages_read_engagement
  5. Exchange for a long-lived token via: GET /oauth/access_token?grant_type=fb_exchange_token&…
  6. Your Page ID is in your page's About section or via Graph API GET /me?fields=id
πŸ“·
Instagram
Not connected

⚠️ Instagram feed posts require an image URL. Text-only posts are not supported by the API.

How to get Instagram API credentials

  1. Instagram must be a Business or Creator account linked to a Facebook Page
  2. In Graph API Explorer, get your Facebook Page token (same as above)
  3. Find your IG Business Account ID: GET /{page-id}?fields=instagram_business_account
  4. Use that ID and the same Page Access Token for the fields above
𝕏
X / Twitter
Not connected

How to get Twitter / X API credentials

  1. Go to developer.twitter.com β†’ Developer Portal β†’ Projects & Apps
  2. Create a new app, set App permissions to Read and Write
  3. Under Keys and Tokens: copy API Key and API Key Secret
  4. Click Generate Access Token and Secret β€” copy both values
  5. Ensure the account that generated the tokens is the one you want to post from
in
LinkedIn
Not connected

How to get LinkedIn API credentials

  1. Go to developer.linkedin.com β†’ My Apps β†’ Create App
  2. Under Products, request access to: Share on LinkedIn, Sign In with LinkedIn
  3. Under Auth tab, generate an OAuth 2.0 token with scopes: w_member_social
  4. Get your Person URN via: GET https://api.linkedin.com/v2/me β€” use the id field
  5. Paste the Access Token and Person URN (as User ID) into the fields above
🎡
TikTok
Not connected

⚠️ TikTok feed posts require an image or video URL. Text-only posts are not supported by the TikTok API.

How to get TikTok API credentials

  1. Go to developers.tiktok.com and create a developer account
  2. Create a new app and request the Content Posting API product
  3. API access requires approval β€” apply early as it can take several days
  4. Once approved, generate an Access Token with scopes: video.publish, video.upload
  5. Get your open_id from the /v2/user/info/ endpoint after OAuth
  6. Paste the Access Token and open_id (as User ID) into the fields above
Dashboard β€Ί Live Context

🌐 Live Context Engine

Real-time contextual scripts generated from live weather, On This Day, and local event data.

βš™οΈ Engine Settings

Configure when and how often the Live Context Engine generates scripts.

Live Context Engine
OFF
Engine is disabled β€” no live context scripts will be generated
Scripts Per Show
Number of live context scripts generated per show. Set to 0 to pause without disabling the engine.
Active Shows
Select which shows will receive live context scripts. All shows are unchecked by default.
Loading shows…

Test Output

Loading…

Fetching recent engine runs…

Engine Details

Module
live_context_engine.js
AI Model
deepseek/deepseek-chat
TTS
Google Cloud Neural2
Context Sources
Weather Β· On This Day Β· Events
Log File
live_context_log.json
Status
βœ“ Isolated test mode
Dashboard β€Ί Producer

πŸŽ› Producer

Editorial brief engine β€” generates fresh, live, context-aware talking points for each opted-in show's next presenter section, so listeners hear something new instead of the same auto-script pool repeating. Phase 1 (guidance-only): briefs are for review here only β€” nothing is auto-published to air.

βš™οΈ Mission & Editorial Rules

Station-wide tone guidance applied to every brief Producer generates.

Content scope β€” always enforced, not editable here (2026-07-25): Producer never references specific track/artist names or "just played"/"coming up next" track content β€” real measured delivery delay averages ~15 minutes, so any track-specific claim would likely be stale or wrong by the time it airs; that stays exclusively the track-join system's job. Producer never mentions commercials, advertisers, sponsors, or promotional campaigns in any form. Discover [Town] editorial features ARE allowed and encouraged. Favored material: upcoming shows/times, live-context facts, day-of-week/time-of-day framing, mood/tone direction β€” anything that stays true regardless of the exact minute it airs.
πŸ›‘ Station-wide kill switch
Stops Producer generating briefs for ANY show, regardless of per-show assignment.

πŸ“‹ Decision Policies β€” Per Show

Responsibility type: editorial_brief. A show with no assignment is completely untouched by Producer (zero behaviour change). Lookback controls how far back Producer looks for recent tracks/content/requests to avoid repeating; max/hour caps brief generation cost per show. ⚠️ Auto-Clear runs the full pipeline (brief β†’ script β†’ audio β†’ live) with no human click β€” only selectable once Enabled is on. Session cap hard-limits how many scripts can be generated per show per scheduled instance (resets when the show next airs) β€” applies whether or not Auto-Clear is on.

Loading shows…

🧠 Recent Briefs

Last 20 briefs across all shows, newest first, with the full state snapshot Producer was given when it generated each one.

Loading briefs…

πŸ“ Generated Scripts

Scripts generated from a brief via "πŸ“ Generate Script" above. Text only until approved β€” no audio is generated and nothing reaches Content Review until you click Approve. Rejecting discards the text with no cost incurred.

Loading generated scripts…
πŸ”„ Track Join Refresh β€” Global Settings
Enable automatic refresh
Joins per show (global)
2
Track-join intros generated per show per run
Refresh interval (global, days)
1
How many days between refreshes per show
Max TTS calls per run
10
⚠ Hard safety cap β€” run aborts if total calls would exceed this
Last run: β€”
πŸ“‹ Show Selection
Show Presenter Voice Enable Joins Override Interval Override (days) Last Refreshed Tracks Used Run
Loading…
Dashboard β€Ί Live Playout Monitor

πŸ“Ί Live Playout Monitor

Last 50 segments β€” auto-refreshes every 10 seconds. Music tracks cannot be deleted.

Loading…
Time (BST) Presenter Type Name Actions
Loading…
Dashboard β€Ί Remote DJ Connect

πŸŽ™ Remote DJ Connect

Broadcast live to Impact Digital Radio from any location using your own software.

Not connected

πŸ”Œ Connection Credentials

Enter these details into your streaming software. All connections must use MP3 format at 128 kbps or higher.

🌐 Server Address radio.impactdigitalradio.com
πŸ”’ Port 8010
πŸ“‚ Mount Point /remotedj
πŸ”‘ Source Password β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’β€’
🎡 Stream Format MP3 128kbps or higher

πŸ“– Software Setup Guide

Use any Icecast-compatible broadcasting software. Enter the credentials above exactly as shown. All three apps below are free or offer free tiers.

πŸ”Š BUTT β€” Broadcast Using This Tool Free Β· Windows / Mac / Linux
1. Open BUTT β†’ click Settings β†’ Main tab β†’ ADD server
2. Type: Icecast  |  Server: radio.impactdigitalradio.com  |  Port: 8010
3. Password: [your source password]  |  IceCast mountpoint: /remotedj
4. Audio tab β†’ Format: MP3 β†’ Bitrate: 128 or higher
5. Click ADD to save. Press the play button in the main window to go live.
πŸŽ› Mixxx Free Β· Windows / Mac / Linux
1. Open Mixxx β†’ Preferences β†’ Live Broadcasting
2. Type: Icecast2  |  Host: radio.impactdigitalradio.com  |  Port: 8010
3. Mount: /remotedj  |  Login: source  |  Password: [your source password]
4. Encoding: MP3 β†’ Bitrate: 128 kbps or higher
5. Click OK. Enable broadcasting from the toolbar microphone icon.
πŸ“» SAM Broadcaster Windows
1. In SAM β†’ Tools β†’ Encoders β†’ click + to add encoder
2. Type: Icecast 2  |  Server IP: radio.impactdigitalradio.com  |  Port: 8010
3. Password: [your source password]  |  Mount Point: /remotedj
4. Format: MP3 β†’ Bitrate: 128 kbps or higher
5. Click OK then double-click the encoder row to connect.

πŸ“‘ Connection Status

βš™οΈ
Not connected
Waiting for a source client to connect to /remotedj.
This updates automatically within a few seconds of a DJ connecting or disconnecting.
Dashboard β€Ί Content Review

🎧 Content Review

0
files shown
0 staged

Staged files awaiting human approval. Pass moves the file to the live rotation. Fail deletes it permanently. On first load, orphaned files are detected and moved into staging automatically.

Loading…
Show / Folder Presenter Type Status Filename Actions
Loading…
Dashboard β€Ί Discover

πŸ“ Discover [Town]

Editorial local-flavour features for Glasgow, Paisley, and Greenock & Port Glasgow β€” bars, restaurants, theatres and local businesses. No advertiser relationship, entirely separate from Promos and the Commercial Ad System. Own approval queue below, not mixed into Content Review.

Generate Discover Script
Reuses the same Exact Custom voicing pipeline as the Bulk Auto Script Generator β€” verbatim text, ElevenLabs TTS, two-pass loudnorm. Saved to the Discover approval queue (own queue, not Content Review) tagged with the town you select here.
Live Progress
Waiting to start…
Discover Approval Queue
PresenterTownStatusFilenameActions
Loading…
Today's Progress vs. Daily Minimum
Loading…
Per-File Play History & Retirement
PresenterTownStatusPlaysLast PlayedPlays Until Retirement
Loading…
Rotation Settings
Equal across all three towns (no town favoured). Starting value: 3/day β€” edit freely.
Retired files move to discover/archive/ and stop being picked β€” they are not deleted.
Dashboard β€Ί File Browser

πŸ“ File Browser

Browse every audio file tied to a presenter/show (Auto Scripts, Phone Caller Joins, Track Joins) β€” or toggle "Other" for content with no presenter/show (Promos, Idents, Commercials). Delete is immediate, no confirmation, same as Bulk Scripts / Phone Callers / Content Review.

Select a presenter/show, or choose "Other".
Filename Presenter / Show Category Status Size / Date Actions
Select a presenter/show, or choose "Other".

πŸ“¬ Listener Requests Queue

Auto-Mode: OFF
β†Ί Refresh
β€”Today
β€”Pending
β€”Approved
β€”Scripted
β€”Played
β€”
Time Listener Request Source Sanitisation Status Actions
Loading…
Dashboardβ€ΊPhone Callers

πŸ“ž Phone Callers

Configuration

Phone Drop saves to phone-callers/ staged for review/publish. Phone Request Join saves straight to the selected show's track-joins/ folder, live immediately β€” same as existing track-joins.

Live Progress

Waiting to start…

Library

Loading…