RadioButler — User Manual

AI-generated content for your radio station, podcast or online news portal — news, local news, weather, traffic, features, music moderation and full audio streams, produced automatically and delivered just before they go on air.

Automated radio content AI news & features Music scheduling Text-to-speech voices Streaming & podcasts
🌐 Languages: This wiki is being built in five languages (English, Deutsch, Français, Español, Íslenska). The English version is ready now; the other languages can be switched on from the language bar once their translation is added.

What is RadioButler?

RadioButler is a web application made by DigitalAnna UG (based on the island of Helgoland, Germany) that lets you run a modern radio station almost entirely with automatically produced content. Instead of recording every news bulletin, weather report or presenter link yourself, you describe what you want — topics, voices, timing, music style — and RadioButler writes the texts with Artificial Intelligence (AI), turns them into spoken audio with realistic text-to-speech voices, mixes in music, jingles and adverts, and assembles a ready-to-broadcast program for every hour of the day.

You can use as much or as little of it as you like. Some stations only buy single news bulletins as audio files; others let RadioButler build and stream a complete 24/7 station — music, presenter chat, hourly world news, local news, weather, traffic, listener call-ins and advertising included.

What it can do, in plain words

  • News & local news: collects articles from sources you choose (RSS feeds, websites, e-mails), rewrites them into broadcast-ready bulletins with AI, and speaks them in the voice you pick.
  • Weather & traffic: generates spoken weather forecasts for your area and live traffic reports within a chosen radius of your station.
  • Features & stories: longer AI-written segments (e.g. "this day in rock history", business news, horoscopes) on a schedule.
  • Music: manages your music library, sorts songs into "Music Boxes" by genre/mood/popularity, builds playlists, and can have the presenter talk about the songs.
  • Presenters & voices: create on-air presenter personas, each tied to a realistic ElevenLabs AI voice, with their own style and audio processing.
  • Programs & scheduling: design what every hour sounds like (a "Radio Program"), save reusable templates ("Program Schedules"), and place them on a weekly calendar (the "Scheduler").
  • Jingles, blocks & adverts: insert station jingles, timed audio blocks and advertising campaigns automatically.
  • Streaming & podcasts: send the finished audio to streaming servers (e.g. Icecast/DAB+) and produce podcast episodes.
  • Listener calls: take phone-in calls handled by AI agents, transcribe and review them, and broadcast the good ones.
  • Radio player & billing: an embeddable web player for your website, plus a pay-as-you-go account you top up via PayPal.
How the money works (pay-as-you-go) You only pay for what you order. Indicative list prices are: news / local news ≈ €0.04 each, feature ≈ €0.06, traffic ≈ €0.08, weather ≈ €0.05, opener/outro ≈ €0.01 each — plus the text-to-speech cost (ElevenLabs ≈ €0.25 / 1000 characters) plus VAT. You load credit onto your RadioButler account and the cost of each produced item is deducted automatically.

How to read this manual

The manual follows the menu you see after logging in, from top to bottom, and adds the detail/sub-pages that open when you click an item in a list. Every screen has its own chapter, and inside each chapter every field, checkbox, drop-down and button is explained in a table — even the obvious ones — so that someone who has never used the program can follow along.

Useful symbols used throughout:

  • Menu › Item shows where to find a screen in the left navigation of RadioButler.
  • The Field name column in tables matches the label you see on screen.
  • Blue note = background information.
  • Green tip = practical advice.
  • Orange warning = be careful, this can delete data or cost money.

Table of contents

Basics

Core concepts & glossary

RadioButler uses a handful of recurring building blocks. Understanding these makes every later screen much easier. They fit together like this: a Radio station has Presenters (who each use a Voice), pulls text from Sources via Requests to create News and Features, plays music organised in Music Boxes, and broadcasts it all according to Radio Programs placed on the Scheduler.

TermWhat it means in RadioButler
Customer / AccountYour company login. One account can own several radio stations and holds the credit balance that pays for produced content.
Radio station (Radio)One station you operate. Almost every setting (voices, news defaults, weather location, music, streaming) belongs to a specific radio station.
Presenter (Anchor / Moderator)An on-air personality. Each presenter is linked to a Voice and has a name, style/character, greetings and audio processing. Presenters read the news, features and music chat.
VoiceThe technical text-to-speech voice (from ElevenLabs) that turns written text into spoken audio. A presenter "uses" a voice.
AI (machine) modelThe Large Language Model that writes the texts (e.g. an OpenAI/Gemini/DeepSeek-style model). You register models with their API key and pick which one writes news, features, etc.
SourceWhere raw information comes from: an RSS feed, a web page to scrape, or an e-mail inbox. Sources deliver the articles the AI rewrites.
RequestA saved "ask" that filters sources by keywords/topics and tells the AI how to turn the result into a finished news item or feature.
NewsA single finished, broadcast-ready news story (text + audio). "Local news" is the regional variant.
FeatureA longer recurring AI segment (story, business report, "day in history", etc.) with its own schedule.
Radio ProgramThe recipe for a single hour (or hour range) on a given date: which news, weather, traffic, music, presenters, openers and outros it contains.
Program Schedule (template)A reusable Radio Program blueprint for recurring hours (e.g. "weekday morning show"), placed on the weekly Scheduler so programs are generated automatically.
SchedulerThe weekly calendar grid where you assign Program Schedules to days and hours.
Music BoxA defined "pool" of music — a set of rules (genre, popularity, mood, tempo, language…) that selects which songs may play.
BlockA timed audio element that must appear at a precise moment (e.g. a top-of-hour time signal or sponsored slot).
JingleA short station audio ident inserted automatically between elements.
Campaign / SpotAdvertising: a campaign groups adverts ("spots") with run dates, hours and weighting.
Streaming providerAn output server (e.g. Icecast, DAB+) that receives the finished live audio.
BedBackground music/audio that plays under spoken content (e.g. a "news bed"). Its three timing values are explained in Bed timing below. A station can hold several beds per element and schedule them by weekday and hour — see Beds.

Bed timing: Cue-in, Start next & Fade-out

A bed is background audio that plays under spoken content (news, weather, traffic, a feature, an opener…). These three timing values — which appear in many places across the app — control exactly how the voice sits on the bed. All are in seconds and may use decimals; some accept negative values.

ValueWhat it does
Cue-inThe entry point into the bed file. The bed is fast-forwarded by this many seconds, so the first Cue-in seconds of the file are skipped — handy to jump past the bed's own intro and land on the part that should sit under the voice. A value of 0 (or less) plays the bed from its very beginning.
Start nextHow long the bed plays alone before the next element (the voice) comes in. The voice is delayed by this amount, giving the bed an intro of Start next seconds; the total length becomes Start next + voice length. More generally it is the moment — measured from the start of the current element — at which the next element begins (and, together with Fade-out, where the current one starts fading).
Fade-outThe length of the fade at the end. The bed fades out over its last Fade-out seconds (the fade starts at total length − Fade-out), so it overlaps the tail of the voice and dies away smoothly.
Cue-in · Start next · Fade-out on a bed Cue-in (skipped) bed plays… Fade-out voice (spoken content) voice enters Start next — bed alone first Cue-in skips the start of the bed file; Start next is how long the bed runs alone before the voice; Fade-out is the gentle ending under the voice's tail. A negative Start next is measured from the end instead — e.g. "−5" means the voice always enters 5 s before the bed ends.
The same three values appear on every bed across the app — openers, news, weather, features — and always mean exactly this.
Negative values (important): a negative Start next is measured from the END of the audio, not from the start. A positive value is "this many seconds after the start"; a negative value is "this many seconds before the end". Example: on a 30-second element, Start next = 25 and Start next = -5 both make the next element begin at the 25-second mark — but the negative form keeps working unchanged even if the audio's length varies, so the next element always comes in 5 seconds before the end (a constant 5-second overlap/crossfade). This is the easiest way to say "start the next item N seconds before this one ends" without knowing its exact length.
About the background programs: Behind the website runs a large collection of small helper programs (news collectors like GetWDRNews, weather/traffic fetchers, the MasterStreamer/RadioStreamer, AI producers such as CreateAIFeatures, CreateAIPodcasts, music importers, and so on). You never operate these directly — the switches and fields on the website tell them what to do. This manual mentions them only where it helps explain what a button actually triggers.
Basics

Getting started: register & log in

Registration (the public home page)

On the public site index.aspx the "Start your radio here" form creates your account and first station in a few minutes. You can refine everything later, so don't worry about getting every choice perfect now.

FieldWhat to enter
CompanyYour company or organisation name (the billing entity). Required.
Name of your radio stationThe on-air name of your first station, e.g. "The Rock Radio". Required.
Music GenreOne favourite genre to start with (drop-down). You add more, finer genres later. Required.
LanguageThe main language of the station (also the language news and presenters use). If yours is missing, e-mail support and they add it. Required.
World news at the beginning of each hourCheckbox — switch on to get an automatic world-news bulletin at the top of every hour.
Country weather after the newsCheckbox — adds a national weather forecast after the news (can be narrowed to a city/region later).
Traffic around your ZIP codeCheckbox — adds live traffic reports around your postcode (radius adjustable later).
First name / Last nameYour name as the account contact. Required.
Address line 1 / 2, City, ZipPostal address of the billing company. The ZIP/postcode and country are also used to set your station's local time and to centre weather and traffic — there is no separate timezone field.
CountryCountry of your station — used to check service availability and (with the ZIP) to derive local time and weather/traffic. If missing, e-mail to request it. Required.
eMail / Confirm eMailYour login e-mail address, entered twice so typos are caught. Required and must match.
Password / Confirm passwordYour login password, entered twice. Required and must match.
I agree with your terms…Checkbox confirming the terms & conditions and privacy statement. Required to register.
Register (button)Creates the account. If something is missing, a pop-up lists exactly what to fix.

The same home page also contains an About, Workflow, Pricing, Who we are and Contact section (with a contact form: Your name, Your email, Subject, Message → Send message). These are informational and don't require an account.

Logging in

The login box sits at the bottom of the left sidebar on the public pages.

FieldWhat to enter
Your usernameThe e-mail address you registered with.
passwordYour account password (hidden as you type).
Login (button)Signs you in and opens the Overview dashboard.
forgot password?Starts the password-reset process by e-mail.
Not registered yet?Jumps to the registration form.
Session timeout: For security the session ends after a period of inactivity. If you see a "Session Timeout" message, simply log in again — your saved data is untouched.

After login the left sidebar shows the full menu. Items appear roughly in the order you'd set a station up: from Overview down through content, music, voices, billing and Logout. Some items (such as Test getdata) are only visible to administrator accounts. The chapters of this manual follow this same order.

Menu › Overview

Overview (dashboard)

The Overview is the first screen after login and a launch pad for the three things every station needs. It lists what you already have and gives an "Add…" link for each.

SectionWhat it shows / does
Your radio stationsEvery station on your account, each clickable to open its settings. Add radio station opens a blank station form (see Radio stations).
Your presenterYour on-air presenter personas. Add presenter opens the presenter editor (see Presenters).
Your AI machine modelsThe AI language models you've registered. Add AI machine model opens the model editor (see AI Models).
Suggested order for a new station: 1) add at least one AI model, 2) add a Voice and a Presenter, 3) open your Radio station settings, 4) set up Sources & Requests, 5) build a Program Schedule and place it on the Scheduler.
Set up a new station in five steps 1 AI model 2 Voice + Presenter 3 Radio settings 4 Sources & Requests 5 Schedule on the grid
Work top-down: a writer (AI model) and a voice first, then the station, its content sources, and finally the weekly schedule that puts it all on air.
Menu › Overview › (a radio station) — page radio.aspx

Radio stations

This is the master settings page for one station. You can run several stations under one account — each one has its own settings on this page. It is long because almost everything the station does — how it speaks, what news/weather/traffic it makes, how loud it is, how it advertises — is configured here. You reach it by clicking a station on the Overview, or via Add radio station. Settings are grouped between horizontal divider lines; each group is explained below. At the very bottom, Save changes stores everything and Delete radio station removes the station and all its data.

Your Radio Stations settings what you choose on this page News & local spoken bulletins Weather spoken forecast Traffic live road news Music & presenter songs · talk · jingles Ads & loudness spots · final polish Your finished broadcast assembled automatically, hour by hour
Your settings feed five areas of the station; everything is then assembled automatically into the broadcast you hear.

Identity

FieldMeaning
NameThe station's name, used on air and across the system.
CountryCountry the station operates in (drop-down). Affects available content/services. If missing, e-mail addcountry@radiobutler.com.
Standard languageDefault language for generated text and speech. Individual programs can override it.
Location ZIP codeThe postal/ZIP code of the station's location. On save, RadioButler looks up the coordinates from this and the country, and from those it sets the station's local broadcast time, the default weather location and the traffic centre.
Latitude / LongitudeThe station's coordinates. Filled in automatically from the ZIP code — you only set them by hand if the lookup can't find your location.
Time zone is automatic. The station broadcasts on the local time of its location, derived from the coordinates above — including automatic daylight-saving changes. There is no manual time-zone setting.

DAB+ (digital radio broadcasting)

FieldMeaning
DAB+ IdYour station identifier on the DAB+ digital-radio platform (only if you broadcast via DAB+).
DAB+ TokenThe access token/key that authorises uploads to that DAB+ service.

Music & replay behaviour

FieldMeaning
Uses MusicBoxDecides what kind of station you run. On — RadioButler also chooses the music (from your Music Boxes, the rule-based pools) and delivers a complete, ready-to-air stream: music, presenter, news and everything in between. Offno music is selected at all; RadioButler only produces the content elements (news, local news, weather, traffic, features …) and you insert them into your own playout system. For stations that just want the content, not a finished stream. (With it off, the three "Replay songs" fields don't apply.)
Music talk probability — After the songPercentage chance that, within a moderation, the presenter mentions the song that was just played. It does not decide whether there is a moderation — only whether the just-played track is referred to.
Music talk probability — Before the songPercentage chance that, within a moderation, the presenter announces/teases the song coming up next. Again, it only controls whether the upcoming track is mentioned, not whether a moderation happens.
Replay songs (Relevance > 70)Minimum hours before a highly-relevant/popular song may repeat.
Replay songs (Relevance > 50)Minimum hours before a medium-relevance song may repeat.
Replay songs (Relevance < 50)Minimum hours before a low-relevance song may repeat.
Min time between jinglesMinimum minutes that must pass before another jingle is allowed.
May this song play now? More important song short rest time (Replay > 70) Medium importance medium rest time (Replay > 50) Less important song long rest time (Replay < 50) Has it rested long enough? Yes → can play rested longest = picked first No → held back played too recently
Each importance tier has its own “rest time”. A song can only return once it has rested at least that long.
♪ Song After-song talk names the song just played Moderation the main talk Before-song talk names the upcoming song ♪ Song (+ maybe the artist) (+ maybe the artist) Each short mention is optional — its “Music talk probability” is a percentage chance that it is added. It only decides whether the song gets named, not whether the presenter speaks at all.
Between two songs the presenter block is built as: after-song talk → main moderation → before-song talk.

How a moderation blends two songs together

This is one of the core features that makes the station sound like real radio: the presenter doesn't talk in silence between songs — the talk is woven into the music so it never stops dead. The same mechanism is used for the hourly opener. It works in four steps:

  1. The current song reaches its Start next point and begins fading out. The presenter's moderation starts right there — over the fading tail of the song.
  2. The moderation plays.
  3. The next song starts underneath at a lower volume (not silent). Its instrumental intro — the part before its Ramp1, where the vocals begin — runs under the end of the moderation, timed so the vocals come in exactly when the moderation finishes.
  4. A music bed fills any remaining room. If the moderation is longer than that intro (longer than Ramp1), the earlier part would be empty — so a music bed (the bed you upload) plays under the moderation and fades out just as the next song arrives; the song starts into the fading bed. If the moderation is short and the intro (Ramp1) long, there is no room and no bed is used.
Song A Start next → fade out; moderation starts moderation ends = Song B vocals (Ramp1) Music Presenter Music bed Song A Song B intro (lower volume) Song B — vocals Moderation (presenter) music bed (only if there is room) fades out — Song B starts into it long Ramp1 + short moderation → no room → no bed Song B's intro ends exactly as the moderation ends
Song A fades out at its Start next and the moderation starts over its fading tail. The next song begins at a lower volume into the fading music bed; its instrumental intro runs under the moderation so the vocals land exactly when the talk ends. The bed only appears when the moderation is longer than the intro (Ramp1).

Incoming call auto-check

FieldMeaning
Autocheck incoming callsCheckbox. If on, AI automatically reviews phone-in calls for suitability before they can be broadcast.
Minimum messages in callA call must contain at least this many exchanged messages to count as usable.
Check call promptThe instruction given to the AI when judging a call. As the hint says: tell the AI to answer ONLY with a 0 if your "reject" criteria are found in the text.
Check call machine modelWhich registered AI model performs the call check.

Music Wish responses (e-mail to the listener)

When a listener sends a Music Wish from your player, RadioButler decides whether the song will be played and then e-mails the listener the outcome. These three fields define that e-mail — one subject line and two body texts (one for "yes", one for "no"). If you leave them blank, a built-in default text in the station's language is used instead. The full decision process is described under How to → Music Request.

All three may contain placeholders that are filled in automatically:

PlaceholderReplaced with
{Artist}The artist the listener asked for.
{Song}The song the listener asked for.
{Name}The listener's name.
{day dd.mm.yyyy}The relevant date. The part after day is a date format you can change — any common format works (e.g. {day dd.mm.yyyy}, {day yyyy-MM-dd}).
{time}The relevant time.
FieldMeaning
Music request e-mail subjectThe subject line of the e-mail the listener receives.
Music request response (success)The message body sent when the song will be played — e.g. "Hi {Name}, we'll play {Song} by {Artist} on {day dd.mm.yyyy} at around {time}."
Music request response (fail)The message body sent when the song will not be played (e.g. it doesn't fit the format).

Facebook auto-posting

Lets the station automatically publish posts (e.g. about what's playing or breaking news) to a Facebook page.

FieldMeaning
Facebook machine modelAI model that writes the Facebook posts.
Facebook PageIdThe numeric ID of your Facebook page.
Facebook AccessTokenThe access token that authorises posting to that page.
Default facebook promptStandard instruction telling the AI how to write each post.
Facebook Message FooterFixed text appended to every post (e.g. hashtags, station tagline).
Facebook Message Image UrlDefault image shown with posts.
Facebook keywordsWords that get a story onto the page even when its relevance is too low. Separated by a pipe: Helgoland|Düne|Hafen. Case does not matter and a keyword matches inside longer words too, so "Helgoland" also catches "Helgoländer". Empty means the relevance alone decides.
Facebook image templateURL of a fixed background image every news post is built on. Empty means each post gets its own generated AI image, as before.
Facebook logoURL of your station logo, placed in the top left corner of the template. Best as a PNG with a transparent background. Empty means the station name is written above the headline instead.

Two tracks to Facebook

A news story can reach your page two ways, and they never overlap — each story is posted once.

TrackWhen it firesWhat goes out
1 — RelevanceThe story scores above the Facebook Min Relevance of its news request.The full post: two to four paragraphs, image depending on Create image in the request.
2 — KeywordsThe story scores below that threshold, but one of the station's Facebook keywords appears in its headline or text.A short teaser: one or two sentences, at most 400 characters, always with a generated image.

Keywords apply to news only — never to events, weather, traffic or tides. They also need a page id, an access token and a Facebook machine model to be filled in above. Set Facebook Min Relevance to 0 and track 1 is off while the keywords keep working; leave Facebook keywords empty and only the relevance decides. Posting happens once an hour, so a story typically appears within the hour rather than instantly.

Be sparing with the keywords: a word as common as your own town name puts nearly every local story on the page.

The image template

Instead of generating a fresh AI picture for every post, you can give the station one fixed background. RADIOButler loads it, darkens the lower half and writes the headline of the story onto it in white, with the station name above in orange. The body of the post stays as it is — the image carries the headline, the text carries the story.

PointWhat it means
Where it goesFacebook image template under Manage radio. A full URL to a publicly reachable image.
SizeAnything. It is cropped centrally to 1200 × 630, the Facebook link format, so keep the important part of the motif away from the edges.
No text in the pictureThe headline is drawn on top. A template that already carries words ends up with two layers of type.
No dark bar eitherThe darkening is applied automatically, so white type stays readable even on a bright summer photo. Bake it into the image as well and the bottom turns muddy.
Long headlinesThe type shrinks until the headline fits three lines. Only something genuinely extreme is cut off, with an ellipsis.
CostNone. The picture is composed on the station's own machine, so the image price of a social media post does not apply.
The logoSet Facebook logo as well and it is placed top left, scaled into a box of 380 × 96 keeping its proportions. Use a PNG with a transparent background. When a logo is present the orange station name above the headline is dropped — the same name twice on one picture reads as a mistake.
If it failsUnreachable URL or a broken file, and the post falls back to the AI image rather than going out without a picture. A logo that cannot be fetched is simply left out; the post still goes.

The template applies to both tracks above — relevance posts and keyword posts look the same in the timeline, which is rather the point.

Sum compressor (loudness processing on the final mix)

A dynamics compressor evens out volume so the station sounds consistent and "loud" like commercial radio. These are standard audio-engineering parameters.

FieldMeaning
Sum compressorCheckbox to switch the compressor on for the whole output.
Threshold (db)Level above which the compressor starts reducing volume.
Ratio 1:xHow strongly volume above the threshold is reduced (e.g. 1:4).
Attack (ms)How quickly it reacts when sound gets loud.
Release (ms)How quickly it stops compressing when sound gets quiet again.
MakeUp (db)Volume added back after compression to restore overall loudness.
Knee (db)How gradually compression eases in around the threshold (a "soft knee" sounds smoother).
the mixed hour (music + voice + ads) Loudness control evens out the volume sent to your listeners
The loudness control is the final step, just before the sound reaches your listeners.

News & weather (station defaults)

These defaults apply when a program doesn't specify its own news settings.

FieldMeaning
Radio wants news / weatherMaster switch: does this station produce news/weather at all.
Default news request 1/2/3 & countUp to three default news Requests and how many items to take from each. The counts also decide how long the main bulletin is — it holds as many stories as the three counts add up to. There is no separate "how many news" setting any more.
Default news presenterWhich presenter reads the news by default.
News BedUpload a background-music file that plays under the news. This is the station's default news bed: it applies in every hour that no scheduled bed on the Beds page covers.
NewsBed StartNext (seconds)How many seconds into the bed the spoken news begins.
News SeperatorUpload a short audio sting played between individual news items.
News Seperator StartNext (seconds)Timing of the next item relative to the separator.
Default news promptStandard AI instruction for writing news bulletins.
Max tokens / temperatureGone since August 2026. Current models ignore temperature, and max tokens was only ever a length cap — on ChatGPT and DeepSeek neither value was even sent. The one control that still matters, how hard the model thinks, now lives on the model entry as Effort; see AI models.
Count news in additional newsHow many stories the station's Additional news bulletin contains — the x most relevant ones. Default 2.
Min / Max words in newsAllowed word-count range per news item.

How a bed's timing works (News / Weather / Opener beds)

Every bed uses the same three values to control how the voice sits on the background music. Important: the Cue-in is removed first, and Start next is then measured from where the Cue-in ends — i.e. from the first moment of the bed that listeners actually hear.

cut off Cue-in (skipped — never heard) background music (the bed you actually hear) bed starts here the spoken voice Start next — counted from the end of Cue-in; the bed plays alone, then the voice enters Fade-out: the bed fades over its last seconds
Cue-in is cut from the front first; Start next is then measured from that point until the voice enters; Fade-out fades the bed at the end. A negative “Start next” is measured from the end instead.

Opener (hourly intro)

The opener is the spoken intro that starts each hour. It blends into the first song of the hour exactly like a moderation (see “How a moderation blends two songs together” above): the first song's instrumental intro runs quietly under the end of the opener, and a music bed fills any gap.

FieldMeaning
OpenerUpload the opener background/jingle bed. This is the station's default opener bed — a scheduled bed on the Beds page takes precedence for the hours it covers.
Opener Min Length (seconds)Guarantees the opener is actually heard. If the first song has a very long instrumental intro (a long Ramp1), the song could otherwise start so early that the opener is barely — or not at all — played. This sets a floor: the opener always plays for at least this long before the first song's vocals take over, so the hour never opens without it.
Opener StartNext (seconds)When the spoken opener starts over the bed.

Local news

FieldMeaning
Default local news presenterPresenter who reads local news.
Local News Bed / StartNextBackground audio for local news and when speech begins over it.
Default local news promptAI instruction for local-news writing.
Count local news in programsDefault number of local-news items per program.

Weather

The forecast is prepared at about 35 minutes past the hour and goes on air in the hour that follows. It is not a data dump read aloud: live measurements are turned into a short spoken forecast by the AI, translated into your station's language, spoken by your weather presenter, and laid over a bed.

The one thing that makes a forecast credible

A listener is looking out of the window while you speak. If you tell them it is sunny and it has just clouded over, they stop believing you — so the forecast is built around two facts, not one: what it is doing now, and what it is about to do in the next few hours.

A real afternoon in Schaffhausen 100 % 0 % clouds 10:00 11:00 12:00 13:00 14:00 15:00 16:00 13:00 — 2 % clouds 14:00 — 100 % clouds Reading only “right now” “Blue skies over Schaffhausen!” — said at 13:35, heard at 14:00, under a closed grey lid. Reading the trend as well “Still bright — but it clouds over during the afternoon.” The listener is warned, not contradicted.
The AI is given the current conditions, the next seven hours and three days — and is told the report airs about an hour after the measurements. A change on the way is announced, not missed.
No clock times, ever The forecast never states a time (“rain from 14:00”) — it uses times of day. The hour it airs in is not the hour it was written in, and a station that names a clock time will sooner or later name the wrong one.

How it is built

Your location postcode → coordinates Live measurements now · next hours · 3 days in local time The AI writes it short, spoken, no numbers-salad Your language translated once Spoken by your presenter Nothing is done twice A forecast that was fetched for a nearby location and is still fresh enough is re-used. The translation into a language is kept, and so is the spoken version per presenter — so a second station in the same town costs neither a new lookup nor a new recording. A station with its own weather prompt always fetches fresh: the cache knows the place and the age, but not your wording. The finished file Weather bed — runs underneath, fades out at the end Hand-over from the news The forecast
From coordinates to a spoken forecast — with every expensive step cached, so a second station in the same place costs nothing extra.

Where the data comes from

SourceWhen it is used
The live weather serviceThe normal case. One lookup for your coordinates gives the current conditions, the next hours and three days — in the local time of the place, so nothing has to be converted and nothing can be misread. No key, no setup: it just works once the station has a postcode.
Weather urlFill this in and the forecast is taken from your page instead. For stations that have their own meteorologist, a harbour forecast, or anything a generic service cannot know (tides, water temperature, sea state).
National forecastStations set to take national content get the country's forecast instead of a local one — condensed from the national broadcaster's teletext every four hours, and shared by every station using it.
Several places, one station A station can have more than one weather location. The forecast then rotates through them, so a regional station covering several towns does not always talk about the same one.

The hand-over from the news

If the Radio Program has “Use news greeting in weather” switched on, the weather presenter does not simply start talking — they take over from the news presenter by name: “Thanks, Thore. The weather in Helgoland …”

Three of these hand-overs are written and recorded once per combination of news presenter, weather presenter, language and place, and then re-used and varied. They cost nothing per broadcast, and they are what makes two AI voices sound like two people in one studio.

The fields

FieldMeaning
Default weather presenterWho reads the forecast. A program can override it for its hour. Without a presenter no forecast is produced — and you get an e-mail saying so.
Weather location name / zip codeThe place the forecast is about. The postcode is what turns into coordinates.
Weather urlOptional: take the forecast from your own page instead of the live service.
Max weather age (hours)How old a forecast may be before fresh data is fetched. 1 is the sensible value. It used to be fixed at four hours — the segment was re-recorded every hour, but the data was not, so at six in the evening listeners heard the sky of two in the afternoon.
Weather Bed (Active + upload)The station's default bed for the forecast. Untick Active for a dry read — note that this switches off the default bed only, not a bed you scheduled on the Beds page. Left empty, the standard bed of your language is used.
Weather Bed StartNext (seconds)The second at which the voice sets in over the bed.
Default weather promptHow the forecast should be written. Left empty, a built-in prompt is used: current weather, the rest of today, tomorrow, a glance at the day after; wind in plain words rather than numbers; temperatures rounded; no place names; no clock times. Set your own and the station always fetches fresh data — the cache cannot know your wording.

Upload Weather to an FTP server (optional)

If you also publish the weather audio to your own server: Active switch plus Host, UserName, Password, RootPath (target folder) and Port.

Traffic

The traffic report is produced fresh, on demand: when the news are over, the station asks for one and waits (at most two minutes) until it is ready. It is written by the AI from live data and read by your traffic presenter over a bed.

What decides whether something gets reported

This is the part that changed most, and it is worth understanding — it is the difference between a station people believe and one they switch off.

Two live sources are queried around your centre point:

  • Incidents — what is reported: roadworks, closures, accidents.
  • Flow — what is measured: how fast the traffic on each stretch is actually moving, and how much time that costs compared to a free road.

The flow leads, the incidents explain. A stretch is only reported when it is measurably jammed. The nearest incident then supplies the reason. If none is found, the jam is reported without a reason — no cause is ever invented.

Reporting everything that is “reported” does not work Incidents alone Vaduz, a real morning: 35 reports, 16 of them “closed” — and the traffic was flowing perfectly. Most of them were roadworks that had been standing there since March. The station read out the same three closures, hour after hour, month after month. Flow first, incident as the reason Only what is measurably standing goes on air — plus closures that are genuinely new. A roadworks site that has been there for months is only news while it actually holds people up — and then at most once a day. How an item is built FLOW “this stretch is jammed” measured, with a delay INCIDENT nearby “…because of roadworks” only if one is close by One report road · area · delay · cause + new closures even without a jam — that IS the news No cause is ever invented. If the flow says a road is standing but no incident is near, the jam is reported without a reason — rather than guessing an accident.
Only measurable congestion — and genuinely new closures — go on air. Long-standing roadworks are reported while they actually hold people up, and then at most once a day.

The filters, in order

FilterWhat it does
DuplicatesThe provider reports the same roadworks once per direction of travel. Same description, same length = the same disruption; it is only kept once.
Really jammed?A stretch counts as congested from a jam factor of 4 (of 10) and a measurable loss of time. Everything below that is normal traffic.
Minimum delayYour Minimum delay (seconds) is applied to the measured loss of time. Closures are exempt — a closed road is news even when nobody is stuck in it yet.
Long-standing roadworksAnything running for more than 7 days counts as long-term. It only airs while it is actually causing a jam, and then not again for 20 hours.
New closuresA closure that is not long-term goes on air even without a jam.
Order and cutYour preferred roads first, then new closures, then the longest measured delay. The list is cut to Max traffics.

Your roads first

Not every jam matters equally to your listeners. The commuter routes of your area do — and if something is happening on one of them, it should be the first thing they hear, even when a bigger jam sits somewhere they never drive.

That is what Default roads is for. List the roads that matter (A 27 | B 71 | Hauptstrasse). Anything found on one of them is named first.

A preferred road does not skip the filters It is a matter of order, not of privilege. If nothing is happening on your motorway — or the delay there is below your Minimum delay — it is not mentioned at all. A preferred road without a jam is not a traffic report, it is filler.

When there is not enough to say

Some mornings the roads around you are simply clear. Rather than let the bulletin fall short, the search then looks further out.

Radius max — the safety net for a quiet morning Radius — 15 km only 1 report, but 3 are wanted Radius max — 40 km 3 reports — the bulletin is full The wider look only happens when the normal radius falls short — never otherwise.
If the normal radius does not yield as many reports as you asked for, the search widens once to Radius max — and the same filters apply out there.

All the filters still apply in the wider ring, so nothing gets in that would not have been broadcast anyway — you simply get to hear about the motorway thirty kilometres out instead of half a bulletin of silence. Leave Radius max at 0 (or below the normal radius) and nothing widens.

Street names The provider almost never delivers a road number, so the street is looked up from the coordinates — in the language of your station, and cached, so the same jam does not cost a lookup every hour.

From data to audio

The news end the station asks for traffic Live data flow + incidents, filtered The AI writes it one announcement, not a list Spoken On air The finished file Traffic bed — runs underneath, fades out at the end Greeting The traffic announcement Traffic bed “StartNext” — the voice sets in here If the greeting cannot be produced, the announcement still airs — without it. It is never swapped for “no traffic reports”.
The report is produced on demand, mixed over the traffic bed behind a greeting, and handed straight to the stream.

The AI is given the items as data, together with strict rules: never read a field name out loud, never invent a cause, and only mention extra travel time when a delay was actually measured. It must not fill a gap by saying that the roads are clear — if there is nothing to say about a point, it says nothing.

Found nothing at all? Then your No traffic found prompt is used instead, and the station says so.

Nothing broken ever goes on air Before the announcement is broadcast, its file is checked: does it exist, does it have content, does it have a length? A traffic report that failed to produce is skipped and the music simply carries on. And if the production fails, the station is told immediately instead of waiting out the full two minutes.

The fields

These are the station's defaults. A Radio Program can override them for its own hour — prompt, radius, presenter, how many reports.

FieldMeaning
Traffic default AI ModelThe AI that writes the announcement. Without it no traffic is produced at all.
Default traffic presenterWho reads it.
Traffic Bed / StartNextThe station's default bed for the report, and the second at which the voice sets in. A scheduled bed on the Beds page takes precedence for the hours it covers. Left empty, the station default bed is used, and failing that a standard bed — the report is never dropped just because a bed is missing.
Here.com API KeyThe live-traffic data. As soon as a HERE key is present it is used, with flow and incidents as described above.
TomTom API KeyThe older provider, used only when no HERE key is set. It has no flow data, so the filters above cannot work there.
Radius center latitude / longitudeThe centre point traffic is gathered around. Must be set — without it no report is produced.
Radius (km)How far around that centre to look.
Radius max (km)The safety net: if the normal radius does not produce as many reports as Max traffics asks for, the search widens to this radius once. 0 (or anything below the normal radius) = no widening.
Minimum delay (seconds)How much time a jam has to cost before it is worth mentioning. Applies to the measured delay; closures are exempt. Preferred roads are not exempt.
Default roadsThe roads that matter to your listeners, separated by | — e.g. A 27 | B 71 | Hauptstrasse. Anything happening on one of them is named first. It does not get in without a jam.
Max trafficsHow many reports the announcement may contain at most. Left at 0, three are used.
Traffic default promptHow the announcement should be written. Left empty, a built-in prompt is used which spells out numbers, addresses the listener personally, and names motorways in the usual radio form (“A twenty-seven, Bremen towards Cuxhaven”).
No traffic found promptWhat to say when there is nothing to report.
How to get trafficRead-only help describing the manual call/download URLs to trigger and fetch a traffic announcement on demand.
Fields without effect The min/max seconds fields are left over from the old TomTom-only days and are not read any more. Use Minimum delay instead — it works on the measured loss of time.

Spoken moderations

This is the station's default AI model for everything the presenter says around the music: the short links before and after a song ("That was …", "Next up is …"), the longer music expert story about a song or an artist, and the moderation wrapped around an urgent message. The field is called Music expert AI Model for historical reasons — it is not limited to the music expert segment any more.

FieldMeaning
Music expert AI ModelThe AI that writes the spoken links. Set it to give this station its own model — a cheaper one for a station that talks a lot, a stronger one where the links matter. --- no AI moderation --- leaves it unset and lets the fallback below decide.
Which model actually gets used The model is looked up in three steps and the first one that is set wins: the Radio Program of the hour, then this station default, then your account's default AI model. Leaving all three empty is the only way to end up with no spoken moderations at all.

Feature length limits

FieldMeaning
Words in featuresTarget word count for feature segments.
Max source wordsHard cap on how much source text is fed to the AI (controls cost/length).

Advertising defaults

FieldMeaning
Ad seperatorUpload a sting played before/after the advertising block.
Ad positionWhere ads run: None, Just before news, or Just before local news.
Default spot times (Minutes)Used only when Ad position = None: the minutes-past-the-hour to play ads, separated by a pipe |.
Max spotsMaximum adverts per break.
Ad break News …music… …music continues… Example: “Just before news” places the ad break right ahead of the news (up to Max spots).
The ad position anchors the break to the news; with “None”, fixed minutes after the hour are used instead.

Activation & saving

FieldMeaning
ActiveCheckbox — whether the station is live/producing. Untick to pause it.
Save changesStores all settings on this page.
Delete radio stationPermanently removes the station and its requests, presenters, songs etc.
No undo: Deleting a station erases all its data — requests, moderators, songs and more. A confirmation pop-up appears first; there is no way to recover afterwards.
Overview › Add presenter — page anchor.aspx

Presenters (Anchors / Moderators)

A presenter is the on-air personality that reads your content. Each presenter is bound to one text-to-speech Voice and carries its own name, character, greetings and audio processing, so different shows can sound like different people. A presenter comes together in three stages — what they say, how they sound, and a final polish — before it reaches the air.

1 · What they say the AI writes the lines, shaped by Character & Gender 2 · How they sound the Voice speaks it (pitch · speed) 3 · Final polish Compressor · EQ · Normalizer On air
A presenter = personality (how the text is written) + a voice (how it's spoken) + sound processing (how it's polished).
FieldMeaning
NameThe presenter's full name (used internally and possibly on air).
Nick nameShort/on-air name the presenter is referred to by.
RadioWhich station this presenter belongs to.
LanguageThe language this presenter speaks.
GenderThe presenter's voice gender (helps the AI write fitting wording).
VoiceThe text-to-speech Voice used to speak this presenter's lines.
ElevenLabs VoiceAgent IDLinks this presenter to an ElevenLabs conversational agent that can talk live with listeners who phone in; their recorded calls are matched back to this presenter.
Voice pitch / Voice speedFine-tune the pitch (higher/lower) and talking speed of the voice.
Character / DescriptionA free-text personality brief (e.g. "warm, witty, speaks casually"). It is fed straight into the AI prompt that writes this presenter's spoken lines, so a distinct character actually makes them talk differently — most noticeable when two presenters chat together in the same hour.
News HellosA set of opening greetings (one per line) used to open the news; one is picked at random each time so intros vary. Leave it empty and RadioButler fills it automatically with generated greetings (translated into the presenter's language when needed).
Image / PictureA photo/avatar of the presenter (e.g. for the web player).
Test text + Test audioType a sample sentence and press Test to hear how this presenter/voice sounds.
ActiveWhether the presenter is available for use.

Audio processing (EQ / Compressor / Normalizer)

This is the “final polish” stage. After the voice has spoken the text, each of these is applied to this presenter's voice audio (only the ones you switch on), so every presenter sits well in the mix and sounds consistent:

GroupFields & meaning
EQLoudness / Bass / Treble — basic tone controls for the voice.
CompressorAttack (ms) / Ratio (1:x) / Threshold (db) — evens out the voice's volume (same idea as the station sum compressor).
NormalizerBrings the voice to a consistent target level.
spoken voice Compressor EQ Normalizer ready for air
The chain runs in this order: each presenter's voice goes through their own compressor, then EQ, then normalizer (whichever are switched on) before going to air.
ButtonAction
Save changesStores the presenter.
Refresh / Refresh radio presenterReloads/re-syncs the presenter's data (e.g. after changing the linked voice/agent).
Delete radio presenterRemoves this presenter.
Menu › Voices — pages voices.aspx / voice.aspx

Voices

Voices lists every text-to-speech voice available to your account; clicking one opens its editor (voice.aspx). A voice is the raw "vocal cords" — a presenter then uses it to actually speak. Voices run on ElevenLabs, and a handful of ElevenLabs dials shape how each voice sounds (the same text can sound calm and steady or lively and expressive depending on these). (Google voices are no longer used.)

The ElevenLabs voice dials Stability more expressive more consistent / steady Similarity boost looser closer to the source voice Style natural more stylised / exaggerated Speaker boost off on — more clarity/presence Plus Voice speed: how fast the voice talks. These settings are sent to ElevenLabs every time this voice speaks.
The four ElevenLabs dials (plus speed) shape the character of the voice — from steady and faithful to lively and stylised.
FieldMeaning
NameA label for this voice in your list.
First nameThe human first name associated with the voice.
DescriptionNotes about how the voice sounds (e.g. "deep male, calm").
GenderVoice gender.
LanguageLanguage the voice is intended for.
ProviderThe TTS model/version. Only ElevenLabs models are offered (v1 / v2 / v2.5 Turbo / v3); Google is no longer used.
Voice provided by / Voice char currencyAttribution and the currency used for this voice's character pricing.
External ID (ElevenLabs only)The voice's ID inside ElevenLabs.
Default API BearerThe API key/token used to call the provider for this voice.
Only for radioRestrict the voice to a specific station.
Picture path / Path sound exampleOptional image and a sample-audio file path to preview the voice.
Char net price / 1000 chars & currencyThe cost per 1000 characters spoken with this voice (drives your billing).
Stability (ElevenLabs only)How consistent vs. expressive the voice is (lower = more emotional variation).
Similarity boost (ElevenLabs only)How closely it sticks to the original voice's timbre.
Style (ElevenLabs only)Amount of stylistic exaggeration.
Speaker boost (ElevenLabs only)Enhances clarity/presence of the speaker.
Voice speedHow fast the voice talks.
Save changes / Delete voiceStore or remove this voice.
A voice's price feeds the pay-as-you-go cost: each produced item is billed by characters spoken × this voice's price, on top of the content fee.
Menu › (Admin) / Overview › Add AI machine model — page aimodels.aspx

AI Models (machine models)

An AI model is a registered connection to a Large Language Model — a GPT, Gemini or DeepSeek model — that writes the words: news scripts, weather, presenter greetings and outros, traffic, music-expert talk, even replies to listener calls. You set one up once here, give it a name, and then pick that name on every screen that asks for an "AI model". Crucially, a model only produces text — a Voice later turns that text into audio.

Each entry combines three things: a base model (which underlying model/version, picked from the dropdown — this drives capability and the per-token price), your own API key for that provider, and a system message that frames every request. The same base model can exist several times with different keys, names or system messages — for example a "factual news" entry and a "playful banter" entry built on the same GPT model.

How an AI model is used Your AI model base model + your API key + system message Picked on a screen News · Weather Hello/Bye · Calls Music expert · Fun A program asks it + your prompt + the effort you set on the model Reply = text a Voice (TTS) speaks it → on air The model only writes text. The prompt is set on the page that uses the model (News, Weather, the program, …); how hard it thinks — Effort — belongs to the model entry, here. Background programs like GetAINews, CreateAIWeather, CreateAIAudioNews and the moderation engine are the ones that actually call the model.
An AI model is registered once, then selected wherever text needs writing; a background program calls it with a task-specific prompt, and the reply is handed to a Voice.
FieldMeaning & effect
AI Models (dropdown)The base model/version this entry runs on (e.g. a GPT, Gemini or DeepSeek model). Determines capability and the per-token price you're billed at.
NameYour own label for this entry — this is what appears in the "AI model" dropdowns all over RadioButler, so name it for its job (e.g. "GPT-4o news").
API BearerYour own secret API key for the provider, used to authorise — and bill — every request to your own account. Leave it empty to use RadioButler's default key instead; usage is then billed according to your subscription plan.
System messageA base instruction prepended to every request to this model, before any task prompt — it sets the overall behaviour and tone. Leave it empty if you don't want a base instruction.
EffortHow hard this model should think before it answers — minimal, low, medium or high. This replaced the old temperature and max-tokens boxes on the task pages in August 2026, because current models either ignore those or treat them as a plain length cap. minimal suits one-liners such as song links or short traffic notes; high pays off for longer features, news you want properly weighed, or bedtime stories. Every entry starts on medium. Mind the invoice: the thinking is billed as output, so a talkative station feels the step from low to high. Because the setting belongs to the entry and not to the underlying model, you can keep one entry on high for features and a second one on low for song links — both pointing at the same model.
Use streamingWhether the provider streams the answer back token-by-token. Best left off — only switch it on if you run into trouble generating texts.
Save changes / Delete ai modelStore or remove this entry. Deleting cannot be undone, and any screen still pointing at it will lose its model.
Think of an AI model here as the writer, and a Voice as the speaker. You choose which writer to use per task (news, weather, greetings, calls…) on those task pages; how hard that writer thinks is set once here, per entry, via Effort.
Menu › Radio Player — page radioplayer.aspx

Radio Player

The Radio Player is a ready-made web player that RadioButler hosts for you. Visitors press play to hear your live stream and see what's on right now — the current song's cover art, your station name, the current and upcoming shows (each with its presenters' photos), and a song-request form so listeners can wish for a track. You don't build it: you pick a station, style it here, then copy a one-line snippet into your own website. Everything on this page is about look and wording — there is no audio processing here. A live example is radiohelgoland.de.

Two outputs come back to you at the bottom: the Radio Player URL (a direct link to the hosted player you can share as-is) and the Example HTML snippet (an <iframe> you paste into your site to embed the player inline). Style changes you save here apply to both immediately.

Anatomy of the player — what each setting controls cover art / placeholder 1 Your Radio Name 2 ▶ now playing: Artist — Song On now & up next 17:00 · current show 18:00 · next show 3 © Your Station · imprint 4 5 1 Artwork — Path main image. When a song has no cover, the No-song images show instead. 2 Title — your radio name, drawn in your chosen Text color. 3 Current & next shows — with presenter photos; shown only if "Show next programs" is on. 4 Footer bar — Footer text & background color, plus your Footer HTML. 5 Imprint — the legal text from Imprint HTML. Across all of it: Player language sets the interface wording, and Favicon is the little browser-tab icon.
Every field on this page maps to one visible part of the player. Nothing here touches the audio — only how the player looks and reads.
FieldMeaning & effect
RadioWhich station this player streams and shows "now playing" for. Switching it loads that station's player settings.
Player languageThe language of the player's own interface wording (buttons, "now playing", "up next" …).
Radio Player URLThe direct link to your hosted player — share it as-is, or open it to preview your changes.
Title / Your radio nameThe station name shown prominently in the player.
Text ColorThe colour of the player's text (e.g. #ffffff or a CSS colour name).
Path main imageA link (URL) to your main logo/artwork shown at the top of the player.
Small no known song image / No known song image (background)Two images you upload here; shown in place of cover art whenever the current song has no artwork (small = inline, background = full-area).
Show next programsIf ticked, the player shows the current show and the next ones from the schedule — each with its presenters' photos, title and time; if not, that block is hidden.
Path FaviconA link (URL) to the small icon shown in the browser tab when the player is opened on its own.
Footer text color / Footer background colorThe colours of the player's footer bar.
Footer HTMLYour own HTML placed in the footer area (e.g. social links or a tagline).
Imprint HTMLYour own HTML for the legal/imprint text reachable from inside the player.
Example HTML to integrate…A copy-ready <iframe> snippet — paste it into your website to embed the player inline.
Save changes / Delete radio playerStore or remove this player configuration. Deleting cannot be undone.
Style it once, paste the snippet once. After that the player updates itself live — current song, cover art and (if enabled) the next programs all follow your station automatically.

The Music Wish form

Built into the player is a Music Wish (Musikwunsch) form: a listener can ask for a specific track and add a short greeting to friends or family. The wish is queued automatically and, when it fits the format, is usually played within a few minutes — no manual step needed. Greetings are meant to stay positive and friendly. After the decision, the listener is e-mailed the outcome; the subject and the "yes"/"no" wording are set on the Radio station page (Music Wish responses).

What the listener fills in Artist Song First name City Email Greeting 0/250 Artist & Song — the track the listener wants to hear. First name & City — who the wish is from (read out with the greeting). Email — so you can reach the listener if needed. Greeting — a short message, max 250 characters. Submit → queued automatically, usually aired within minutes.
The Music Wish form lets listeners request a song and send a greeting; wishes flow into the station automatically.
Music Wish fieldMeaning
ArtistThe performer the listener wants to hear.
SongThe specific track requested.
First nameThe listener's first name — used when the greeting is read out.
City (Wohnort)Where the listener is from.
EmailContact address for the listener.
Greeting (max 250)A short, friendly message to friends, family or colleagues — capped at 250 characters.
Send wishSubmits the request; it is queued and normally played within a few minutes.
The technical details of how a wish reaches the station (the API the player calls) are described under How to → Music Request.
How to

How to

Practical how-tos and the technical detail behind certain features. More topics will be added here over time.

Music Request — how a song wish reaches the air

What happens after a listener submits a wish on the player: the API the player calls, the automatic review of the greeting, the playout, and the e-mail the listener receives.

The API behind the form

The Music Wish form is pure client-side JavaScript that talks to a small set of public HTTP handlers (.ashx) on the RadioButler server (e.g. https://www.radiobutler.com/). All of them are simple GET requests and send the CORS header Access-Control-Allow-Origin: *, which is what lets the player work when it is embedded on your own website (a different domain). Each station is identified by its radio id (a GUID), which is baked into the player. The flow has three steps — two look-ups while the listener types, and one submit:

The wish, step by step (browser ⇄ server) Player (browser JS) RadioButler server (.ashx) ① listener types an artist GET search-artists.ashx?query=…&radioId=… artists [ { Id, Name } ] ② listener types a song GET search-songs.ashx?song=…&artistId=…&radioId=… songs [ { Id, SongName, ArtistName, … } ] → selectedSongId ③ listener presses "Send" GET wishasong.ashx?radioid=…&songid=…&wishedby=…&wishedbyemail=…&greetingtext=… { "message": "Ok" } (or "Error") later — after the play/skip decision: e-mail to the listener (success / fail template)
Two autocomplete look-ups resolve the exact song id; the submit posts that id plus the listener's details. Everything is public GET + CORS, so the player runs on any site.
Endpoint (GET)ParametersReturns / behaviour
search-artists.ashxquery (≥ 2 chars), radioId (recommended)Up to 10 artists as [{ Id, Name }]. Only artists that have at least one playable song (a real audio file, non-remix) are returned, and any artist on this station's ban list is excluded. Ordered by recent popularity.
search-songs.ashxsong (≥ 2 chars) and/or artistId, plus radioIdUp to 10 songs as [{ Id, SongName, ArtistId, ArtistName, Duration }]. Only songs with an actual audio file are listed, and songs (or whole artists) on the station's ban list are filtered out. With artistId and no song text it lists that artist's songs.
wishsonglist.ashxradioid, artist and/or song, optional paging songsFrom/songsTo (page size 1–25)An alternative, full-text (FREETEXT) search returning richer rows [{ SongId, SongName, ArtistName, SongInfos, Duration, ArtistInfo }], with the same availability and ban-list filtering. Used where a paged list with artist/song info is wanted.
wishasong.ashxradioid, songid, wishedby, wishedbyemail, greetingtextRecords the wish. Responds { "message": "Ok" } on success, otherwise { "message": "Error" } or an HTTP 400 with an { "error": "…" } message.
How the fields map. The form shows separate first name and city (Wohnort) boxes, but the API has only one wishedby parameter and the data model stores no city of its own. The player therefore joins them into one string before sending — wishedby = "FirstName aus City" (e.g. "Anna aus Hamburg"). That combined string is exactly what the {Name} placeholder in your Music Wish response e-mails is replaced with.

While the listener types, the player runs two autocomplete look-ups against the handlers above — search-artists.ashx as they type an artist, and search-songs.ashx as they type a title. Each returns at most 10 suggestions. The whole point of the search is that a listener can only ever pick a track your station can actually play right now: it applies the same availability, ban-list and (optionally) MusicBox rules that the playout itself uses. So a wish is never “lost” because it was impossible to fulfil — impossible tracks simply never appear.

Two ways inHow it works
Artist firstThe listener types an artist name; search-artists.ashx suggests matching artists that have at least one playable track. Picking one hands its artistId to the song search, which then lists only that artist's songs (even before a title is typed).
Song directlyThe listener types a title (≥ 2 characters) and search-songs.ashx searches titles across the whole library — optionally narrowed to the chosen artistId.

The filter funnel. Every candidate passes the same chain of filters before it can appear as a suggestion. Each step only ever removes tracks — so the list gets shorter and more relevant, never longer:

How the search narrows the candidates The whole music library Has a real audio file (CloudPath) and a title Matches what the listener typed (title ≥ 2 chars · / chosen artist) Not on the station's ban list (song or whole artist) If “MusicBox Songs Only”: in this station's MusicBox Ranked → top 10 shown to the listener
The search fetches up to 200 matches from the database, applies these filters, then ranks them and returns only the best ten. The blue MusicBox step is skipped unless the station has that option switched on.
Filter (applied in this order)What it means
Real audio fileThe track must have a stored audio file (a non-empty CloudPath) and a non-empty title. Catalogue entries without a usable file are never offered.
Matches the text / artistThe title must contain the typed text (SongName LIKE '%…%') and/or the row must belong to the chosen artistId. The artist search additionally requires a real, non-remix song to exist for that artist.
Not bannedAnything on this station's Do-not-play list — matched by song or by whole artist — is removed. This step needs the radioId, which the player always sends.
MusicBox Songs Only optionalIf the station has “MusicBox Songs Only” switched on (Radio → Music Request), only tracks that belong to one of the station's MusicBoxes survive — exactly the pool the station would play on its own. See the chain below.
Rank & cap to 10Up to 200 survivors are fetched, then sorted and cut to the best 10 (see “How results are ordered”).

How results are ordered

The survivors are not returned in database order — they are ranked so the most useful suggestions come first, then the list is cut to ten:

Sort keyWhy
1 · Recent popularityTracks that have been played most on the station recently rise to the top (the server keeps a live in-memory play-count). Familiar, on-format songs are suggested first.
2 · Shortest usable lengthSong search only: among equally popular matches, the shorter version (with a known duration > 0) is preferred — this avoids accidentally offering a 10-minute extended mix.
3 · AlphabeticalFinally, ties are broken by song title (A→Z) so the order is stable and predictable.

When “MusicBox Songs Only” is on, the search (and the wish itself) is limited to the tracks your station's MusicBoxes can draw on. A song is “in your MusicBox” when its own genre tags lead — through the genre pools that build your MusicBoxes — to a MusicBox that belongs to your station:

Does the song belong to your MusicBox? A song in the library Its genre tags (genres on the song) A Genre pool that your station uses One of your MusicBoxes Your station → findable
Technically the join runs ArtistSong → ArtistSongGenreMapping → ArtistSongGenre → GenreSpotifyGenre → Genre → MusicBoxGenre → MusicBox, keeping only MusicBoxes whose RadioId is your station. Only songs that survive this chain are searchable and wishable when the option is on.
Why this matches what actually airs. The search deliberately uses the same genre-pool chain that the automatic music selection (playout) uses to pick songs — not the raw per-box song list, which can contain stale entries. So “what a listener can wish for” always equals “what the station would play anyway”. If a genre is not part of your Genre pools, songs of that genre are invisible to the wish search even if an old mapping still mentions them.
Double-checked on submit. The filter runs during the search, but it is also re-checked server-side when the wish is actually sent: wishasong.ashx re-runs the MusicBox test for the exact songid and refuses the wish (HTTP 400, { "error": "This song is not available for requests." }) if it does not belong to the station's MusicBox. A manipulated request therefore cannot smuggle in an off-list track.

Rules the server enforces

RuleDetail
Known, active stationThe radioid must belong to an existing, active radio — otherwise { "error": "Unknown radio" }.
Known songThe songid must resolve to a real song — otherwise { "error": "Unknown song" }. Because the id comes from the look-ups, it is always an available, non-banned track.
Queue limit (anti-spam)A station may hold at most 10 unplayed wishes at once. While 10 are still waiting, further wishes are refused with { "error": "Too many wishes at this time. Try again later." }. A wish counts as "waiting" until it has been played.
Greeting lengthThe greeting is capped at 250 characters; longer text is rejected.
Availability & bansOnly songs with an actual audio file can be found, and anything on the station's banned songs/artists list is invisible to the search — so a listener can never wish for a track you've blocked or that isn't in the library.

The verification & decision process — is a wish played?

Submitting a wish does not guarantee it airs. Every wish passes through four stages, and can be stopped at the first two:

Will the wish be played? ① Submit checks active · known song ≤10 queued · ≤250 ② Greeting review (AI) checks the wording OK / rejected ③ Playout announcement + the song airs ④ Success e-mail your template, or a default in the radio's language refused / rejected — wish does not air (a rejected greeting also triggers a polite decline e-mail) Only wishes that clear both gates are queued; once one actually airs, the success e-mail goes out.
Two gates decide a wish: the instant submit checks and the AI greeting review. Everything past them is queued, aired, and confirmed by e-mail.
StageWhat happens
① Submit checksInstant, inside wishasong.ashx: the station must be active, the song must be a real, available, non-banned track, no more than 10 wishes may already be waiting, and the greeting must be ≤ 250 characters. Only then is the wish stored in the queue (marked "not yet played").
② Greeting review (AI)A background AI reads the greeting text and rejects it if it contains things that don't belong on air — emergency/police matters, weather or disaster reports, political statements, calls for or talk of violence, harassment or other illegal activity, explicit or vulgar content, advertising, or sensitive personal data about other people. Ordinary greetings (birthdays, weddings, hellos to friends and family) pass. Rejected → the wish is deleted and the listener receives a polite decline e-mail in the station's language. OK → the wish stays eligible.
③ PlayoutWhen the wish is due, the system writes a short on-air announcement that mirrors the tone of the greeting (mentioning the listener's name, where they're from if known, and the requested song), voices it with a presenter, and plays the song.
④ Success e-mailOnce it has actually aired, the listener is e-mailed the good news. If you filled in Music request response (success) on the Radio page, that wording is used (placeholders filled in); otherwise a built-in default is sent, automatically translated into the station's language.
In short: a wish can be stopped at two gates — the instant submit checks (unknown/banned/over-quota/too-long) and the AI greeting review (inappropriate wording). Everything that clears both is queued; when it airs, the listener gets the success e-mail you worded on the Radio page, or a default text in the station's language.

Embed the Music Wish form on your own website

You can put the wish form straight onto your station's website. It talks to the public RadioButler API directly from the visitor's browser — every endpoint sends Access-Control-Allow-Origin: *, so there is no backend, no API key and no CORS proxy to set up. You only need your station's radio id.

What you needDetail
Base URLhttps://www.radiobutler.com/ — keep the trailing slash.
Your radio idThe station GUID already baked into your embedded player (the radioid it uses). If you don't have it to hand, ask us and we'll send it.
HTTPSServe your page over https:// so the browser permits the calls.

The integration is the same three calls described under How the song search works — two autocomplete look-ups and one submit. Quick recap:

Call (GET)Query parametersReturns
search-artists.ashxquery (≥2), radioId[{ Id, Name }]
search-songs.ashxsong (≥2) and/or artistId, radioId[{ Id, SongName, ArtistId, ArtistName, Duration }]
wishasong.ashxradioid, songid, wishedby, wishedbyemail, greetingtext{ "message": "Ok" } · { "message": "Error" } · HTTP 400 { "error": "…" }
Three things to get right. (1) URL-encode every value you place in the query string. (2) wishedby is a single field — the player convention is "first name aus town" (e.g. "Anna aus Hamburg"), and that is exactly what the {Name} placeholder in your Music Wish response e-mails becomes. (3) Only ever send a songid that came from the look-ups — that guarantees an available, non-banned (and, if you enabled it, MusicBox-eligible) track. Greetings must be ≤ 250 characters, and a station holds at most 10 unplayed wishes at a time.

Option A — drop it into your page (recommended)

Because the API is browser-friendly, the whole feature is just HTML plus a little JavaScript. The snippet below searches as the listener types and sends the wish. A complete, styled page with a proper artist + song autocomplete dropdown, greeting counter and status messages is provided separately as musicwish-widget-example.html — set its RADIO_ID and open it in a browser.

<!-- Minimal drop-in: type a song, send a wish. (The full example file adds
     a proper artist+song autocomplete dropdown.) -->
<input id="song" placeholder="Wish a song… (type >=2 chars)">
<button id="send">Send</button>

<script>
const BASE = "https://www.radiobutler.com/";   // trailing slash
const RADIO = "YOUR-RADIO-ID";                  // your station GUID
let songId = null;

// While typing: search and remember the first match (demo — use a dropdown in real life)
document.getElementById("song").addEventListener("input", async e => {
  const q = e.target.value.trim();
  songId = null;
  if (q.length < 2) return;
  const r = await fetch(BASE + "search-songs.ashx?radioId=" + encodeURIComponent(RADIO)
                             + "&song=" + encodeURIComponent(q));
  const list = await r.json();          // [{ Id, SongName, ArtistName, ... }]
  if (list.length) songId = list[0].Id; // pick the first suggestion
});

// On send: post the wish. "wishedby" convention is "<first name> aus <town>".
document.getElementById("send").addEventListener("click", async () => {
  if (!songId) return alert("Type a song first.");
  const u = BASE + "wishasong.ashx?radioid=" + encodeURIComponent(RADIO)
    + "&songid="        + encodeURIComponent(songId)
    + "&wishedby="      + encodeURIComponent("Anna aus Hamburg")
    + "&wishedbyemail=" + encodeURIComponent("anna@example.com")
    + "&greetingtext="  + encodeURIComponent("Hi to all my friends!");
  const r = await fetch(u);
  const d = await r.json();             // { "message": "Ok" } or { "error": "..." }
  alert(d.message === "Ok" ? "Wish sent!" : (d.error || "Could not send."));
});
</script>

Option B — call the API from a backend (Python · Java · C#)

Sometimes you'd rather drive the API from your own server — to test it, to build a custom form that posts to your backend first, or to script wishes. The same GET calls work from any language. Each example searches for a song and then submits a wish.

Python

import requests   # pip install requests

BASE = "https://www.radiobutler.com/"
RADIO_ID = "YOUR-RADIO-ID"

def search_songs(text, artist_id=None):
    params = {"radioId": RADIO_ID, "song": text}
    if artist_id:
        params["artistId"] = artist_id
    r = requests.get(BASE + "search-songs.ashx", params=params, timeout=10)
    return r.json()          # [{ "Id","SongName","ArtistId","ArtistName","Duration" }]

def wish(song_id, wished_by, email="", greeting=""):
    params = {"radioid": RADIO_ID, "songid": song_id,
              "wishedby": wished_by, "wishedbyemail": email, "greetingtext": greeting}
    r = requests.get(BASE + "wishasong.ashx", params=params, timeout=10)
    return r.json()          # { "message": "Ok" }  or  { "error": "..." }

songs = search_songs("viva la vida")
if songs:
    s = songs[0]
    print("Wishing:", s["SongName"], "-", s["ArtistName"])
    print(wish(s["Id"], "Anna aus Hamburg", "anna@example.com", "Hi to all my friends!"))

Java

// Java 11+ (java.net.http). Parsing kept tiny; use Jackson/Gson in production.
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
import java.util.regex.*;

public class MusicWish {
    static final String BASE = "https://www.radiobutler.com/";
    static final String RADIO_ID = "YOUR-RADIO-ID";
    static final HttpClient HTTP = HttpClient.newHttpClient();

    static String enc(String s) { return URLEncoder.encode(s, StandardCharsets.UTF_8); }

    static String get(String url) throws Exception {
        HttpRequest req = HttpRequest.newBuilder(URI.create(url)).GET().build();
        return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
    }

    public static void main(String[] args) throws Exception {
        String json = get(BASE + "search-songs.ashx?radioId=" + enc(RADIO_ID)
                               + "&song=" + enc("viva la vida"));
        Matcher m = Pattern.compile("\"Id\":\"([^\"]+)\",\"SongName\":\"([^\"]+)\"").matcher(json);
        if (m.find()) {
            String songId = m.group(1), name = m.group(2);
            System.out.println("Wishing: " + name);
            String res = get(BASE + "wishasong.ashx?radioid=" + enc(RADIO_ID)
                + "&songid="        + enc(songId)
                + "&wishedby="      + enc("Anna aus Hamburg")
                + "&wishedbyemail=" + enc("anna@example.com")
                + "&greetingtext="  + enc("Hi to all my friends!"));
            System.out.println(res);
        }
    }
}

C#

// .NET (HttpClient + System.Text.Json)
using System;
using System.Net;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

class MusicWish
{
    const string BASE = "https://www.radiobutler.com/";
    const string RADIO_ID = "YOUR-RADIO-ID";
    static readonly HttpClient http = new HttpClient();
    static string Enc(string s) => WebUtility.UrlEncode(s);

    static async Task Main()
    {
        string json = await http.GetStringAsync(
            $"{BASE}search-songs.ashx?radioId={Enc(RADIO_ID)}&song={Enc("viva la vida")}");

        using var doc = JsonDocument.Parse(json);   // [{ "Id","SongName","ArtistName",... }]
        if (doc.RootElement.GetArrayLength() == 0) return;
        var first = doc.RootElement[0];
        string songId = first.GetProperty("Id").GetString();
        Console.WriteLine("Wishing: " + first.GetProperty("SongName").GetString());

        string res = await http.GetStringAsync(
            $"{BASE}wishasong.ashx?radioid={Enc(RADIO_ID)}&songid={Enc(songId)}" +
            $"&wishedby={Enc("Anna aus Hamburg")}&wishedbyemail={Enc("anna@example.com")}" +
            $"&greetingtext={Enc("Hi to all my friends!")}");
        Console.WriteLine(res);                      // { "message": "Ok" }
    }
}
Fastest way to see it live: open musicwish-widget-example.html from your RadioButler repo, set RADIO_ID at the top of its script to your station id, and open the file in a browser — it's a full, styled, working wish form you can restyle and paste into your own site.
Menu › Scheduler — page scheduler.aspx

Scheduler

The Scheduler is the weekly calendar of your station. It shows the seven days across the top and the 24 hours down the side, as a grid. Into each slot you place a Program Schedule (a reusable template), and RadioButler then automatically generates the actual hourly programs from those templates.

The week as a grid — one template fills many slots + add Mon Tue Wed Thu Fri Sat Sun 06–09 · Morning Show Karin Theiler — click the name to edit the hour Weekend Brunch Sven Holm 06:00 07:00 08:00 09:00 10:00 A block's first line is the program name; when it spans more than one hour, the second line shows the presenter. Click the name to edit that hour. The + button (top-left) adds an entry.
Fill the week once with templates; RadioButler turns each covered hour into a real program automatically.
ElementMeaning
Customer / radio drop-downAt the top: pick which station's week you are looking at.
Week headerShows the week being displayed; navigation lets you move to other weeks.
Top row (days)The days of the week as columns.
+ (add) buttonTop-left of the grid — creates a new entry / assigns a Program Schedule to the week.
Program block (a cell or several stacked cells)A program fills one hour or spans several. The first line is the program name (e.g. "0-6 - Durch die Nacht"); when the block is longer than one hour, the second line shows the presenter (e.g. "Karin Theiler").
Editing an hourClick the program name in a block to open and edit that hour's Radio Program.
Think of the Scheduler as a TV guide you fill once. Because it uses templates, a single "weekday morning show" template can cover Mon–Fri 06:00–10:00 in one go.
Menu › Program templates — page programtemplates.aspx

Program templates

This screen lists your Program Schedules — the reusable templates that the Scheduler places into the week. From here you create a new template or open an existing one to edit it (which opens the Program Schedule detail page). A template defines the standard "shape" of an hour so you don't rebuild it every day.

ElementMeaning
List of templatesEach row is a Program Schedule; click its name to open and edit it.
Add program scheduleCreates a fresh template (opens a blank Program Schedule).
Run scheduler 7 days (new only)Generates the next 7 days of programs now, but only for hours that don't already have one — existing programs are left untouched. This is the same job the system runs automatically each night, triggered on demand.
Run scheduler 7 days (refresh existing)The "replace existing" option: it deletes all future programs and rebuilds the next 7 days from the current templates. Use it after changing a template when you want those changes to take effect on days that were already generated.
"Refresh existing" only touches the future. It deletes and regenerates programs whose start time is after the current moment — the hour on air right now and all past hours are never affected. So it's safe to run live: listeners hear no interruption, only upcoming hours are rebuilt.
Program templates › (a template) — page progschedule.aspx

Program Schedule (template detail)

This is where a recurring hour is defined in full. It has the same building blocks as a single Radio Program, but the values here are the standard/defaults used every time the template runs, plus the days and hours it applies to. Many fields are therefore prefixed "Standard" or "Default".

When programs are generated: a background job (BuildProgramFromSchedule) runs on a schedule — typically overnight — and automatically builds the actual hourly programs a configurable number of days ahead (set per station), but only for hours that don't already have a program. So changes you make to a template take effect for days that haven't been generated yet; already-generated days keep their existing programs unless you edit them directly — or unless you press "Run scheduler 7 days (refresh existing)" on the Program templates page, which rebuilds all future hours from the current templates (the hour on air and past hours stay untouched).
From template to aired hour Program Schedule the reusable template (days · hours · defaults) Nightly generator builds N days ahead skips hours already filled BuildProgramFromSchedule Radio Programs one concrete hour per day, editable On air hour by hour Edit a template and only not-yet-generated days change. To change an hour that already exists, edit its Radio Program directly.
Templates are the master copy; the nightly generator stamps out the concrete hours, never overwriting hours that already exist.

Identity & timing

FieldMeaning
NameTemplate name (e.g. "Weekday Morning Show").
RadioStation the template belongs to.
LanguageLanguage for this template's content.
DaysCheckboxes Mon–Sun: which weekdays the template runs on.
Start hour / End hourThe hour range each chosen day this template covers.
Repeat allowedWhether the same generated content may repeat across runs.
MusicBoxWhich Music Box supplies the music for these hours.
SourceDefault content source for the hour.

Presenters & AI requests

FieldMeaning
Standard presenter 1–4Up to four presenters who host these hours (the system will pair them).
Standard AI Request 1–5Up to five default content Requests fed into the hour (news/feature asks).

Standard news / local news / weather / traffic

For each of these four content types the template carries the same set of defaults (identical idea to the station defaults, but specific to this template):

Repeated field (per content type)Meaning
… presenterWho reads this content type.
… AI modelWhich AI writes it.
… promptThe writing instruction.
… countHow many items (news/local news).
Max tokens / temperatureGone since August 2026. Current models ignore temperature, and max tokens was only ever a length cap — on ChatGPT and DeepSeek neither value was even sent. The one control that still matters, how hard the model thinks, now lives on the model entry as Effort; see AI models.
… greetingsIntro phrases for the segment (news/weather).

Traffic additionally has Default roads (the roads to name first) and Default max traffics (how many reports the announcement may contain). Weather/traffic use their own Default … AI model and presenter as listed. See Traffic on the Radio station page.

Opener, Outro & extras

FieldMeaning
Opener AI model / AI promptHow the hour's spoken intro is written.
Opener Bed / Min Length / StartNextThe template's default intro audio (a scheduled bed on the Beds page wins for the hours it covers), the minimum amount of the opener that must play before the next song starts (so a song with a long intro ramp can't push the opener aside — the song is then trimmed at the front so its vocals begin right after the opener text), and when the spoken opener starts over the bed.
Outro AI model / AI promptHow the hour's closing is written. Leave the prompt empty to use the built-in one — see The Outro below.
Include next hour info in OutroTease what's coming next hour at the end. See The Outro.
Include top feature in OpenerPromote the best feature at the start.
Default music expert AI modelThe default AI for the spoken song moderations. It is copied into every Radio Program built from this schedule and is the first entry of the model cascade (program → station → account default). The voice is not chosen here — the moderations are spoken by the presenter who is on air for that hour.
Fun moderations AI model / AI prompt / Count fun moderationsLight-hearted presenter chatter: which AI writes it, the instruction, and how many per hour.
Moderation music only probabilityThe probability (%) that a moderation talks only about the music (the songs) instead of doing a news-/topic-based moderation. When it triggers, the presenter does a music-themed link rather than presenting news; there is still a moderation, just with different content.
Talk about music if no moderation is foundFallback to song talk when no other moderation applies.
Count features / Count wishes / Count allowed incoming callsHow many features, listener song-wishes and call-ins to include.

The Outro — the hour's closing link

The outro is the last presenter link of the hour. It airs over the intro of the final song; after it, nothing but that song plays until the news — no further moderation, no jingle, no local news. If your ads are set to run before the news, the ad break still airs as usual.

An outro is only produced when an Outro AI model is set. It is charged like an opener (≈ €0.01 plus the text-to-speech cost).

When it airs. There is no fixed minute. RadioButler looks for a song that is long enough to carry the hour through to the news, and places the outro directly in front of it. That way the outro is always the last thing you hear before the closing song — never two links back to back at the end of the hour. Because the outro is an extra link on top of the ones you configured, the regular moderations are spread a little tighter so they finish before it.

What it says

If you leave Outro AI prompt empty, RadioButler writes the outro itself, in the tone of the presenter's Character:

SituationWhat the presenter does
The same presenter also hosts the next hourNo goodbye. They briefly point out that the news are coming up, plus a little friendly small talk.
A different presenter takes overA warm goodbye, a pointer to the news, and a hand-over in which the new presenter is named explicitly.
Include next hour info in Outro is onThe outro additionally announces what the next hour will be about. The topic comes from the same source as the opener's topic teaser.

Writing your own prompt

If you fill in Outro AI prompt, that prompt is used exactly as you wrote it — nothing is appended, and none of the behaviour above is added automatically. To get facts into the text, put a placeholder where you want them. Upper/lower case does not matter:

PlaceholderIs replaced by
[MODERATOR]The presenter of this hour.
[NEXTMODERATOR]The presenter of the next hour — empty when it is the same person, so a hand-over sentence cannot run into nothing.
[NEXTHOUR]The hour number the next hour starts at.
[TOPIC]What the next hour is about. Requires Include next hour info in Outro; the topic is only looked up when this placeholder is present.
[SONG]The last song of this hour, the one that plays right after the outro.
[RADIO] · [PROGRAM] · [LANGUAGE]Station name, program name, language.
Example. You are [MODERATOR] on [RADIO]. Your hour is over. Say goodbye warmly, mention that the news are next, and hand over to [NEXTMODERATOR], who is on air from [NEXTHOUR] o'clock. Speak [LANGUAGE], maximum 40 words, spoken text only.
Watch the placeholders you rely on. If your prompt says "hand over to [NEXTMODERATOR]" and the same presenter continues, the placeholder is empty and the sentence makes no sense. Either write the prompt so it works either way, or leave the field empty and let RadioButler handle both cases.
ButtonAction
Save changesStores the template.
CopyDuplicates the template as a starting point for a new one.
Delete radio programRemoves this template.
page radioprogram.aspx

Radio Program (single hour detail)

A Radio Program is one concrete hour on one concrete date — often generated automatically from a Program Schedule, but fully editable by hand. The fields mirror the template, minus the "Standard/Default" wording, because here they are the real values for this specific hour.

A typical hour — what the settings build Opener over bed Song News Song Feature Song Music expert Song Outro :00 :30 :59 Spoken segments (green) are written by an AI model and voiced by a presenter; weather, local news and traffic slot in the same way as News. Moderations can talk about the news/topics or — by the "music only" probability — purely about the songs. Songs come from the hour's Music Box. Exact mix and order vary each hour; this is one representative example.
Every field on this page configures one of these segments — who speaks, what's written, how the opener rides its bed, and how many features, wishes and calls appear.

Identity & timing

FieldMeaning
NameName of this program.
DescriptionFree notes about the program.
DateThe calendar day it airs.
Start hour / End hourThe hour(s) it occupies that day.
RadioStation it belongs to.
LanguageLanguage for this program.
MusicBoxMusic pool used this hour.
SourceContent source for the hour (or "--- no source ---").

Presenters & AI requests

FieldMeaning
Presenter 1–4The presenters hosting this hour.
AI Request 1–5The content Requests that feed this hour.

News, Local news, Weather, Traffic

Each content type has its own block of fields. They behave exactly like the station/template versions:

Field (per type)Meaning
News presenter / News AI modelWho reads it and which AI writes it.
News promptWriting instruction for this hour's news.
Max tokens / temperatureGone since August 2026. Current models ignore temperature, and max tokens was only ever a length cap — on ChatGPT and DeepSeek neither value was even sent. The one control that still matters, how hard the model thinks, now lives on the model entry as Effort; see AI models.
News greetingsIntro phrases for the news.
News audio pathWhere the produced news audio file is stored (read/reference).
Local news … (same set)Same fields for the regional bulletin, incl. Local news count.
Weather presenter / AI model / prompt / greetings / audio pathThe weather segment's full configuration.
Traffic AI Model / presenter / promptThe traffic segment's configuration for this hour. Set here, it overrides the station default — see Traffic.
Roads / Max trafficsThe roads to name first this hour, and how many reports the announcement may contain. Set here, they override the station defaults.
Traffic audio path / Weather audio pathStorage paths for the produced audio.

Opener, Outro, Music expert & moderation

FieldMeaning
Opener AI model / AI prompt / Bed / Min Length / StartNext / audio pathThe hour's spoken intro and its background audio settings.
Outro AI model / AI prompt / audio pathThe hour's closing segment — the last presenter link before the final song. Leave the prompt empty to use the built-in one; if you write your own, it is used exactly as written and you place facts with placeholders such as [NEXTMODERATOR]. Full description: The Outro.
Include next hour info in Outro / Include top feature in OpenerTease next hour / promote best feature.
Music expert AI model / audio pathThe AI that writes this hour's spoken song moderations. Set here it wins over the station default; left empty the station default, and failing that your account default, is used. The moderations are spoken by the presenter who is on air for that hour.
Fun moderations AI model / AI prompt / Count fun moderationsCasual presenter chatter configuration.
Moderation music only probabilityThe probability (%) that a moderation talks only about the music (the songs) instead of a news-/topic-based moderation. When it triggers, the presenter does a music-themed link rather than presenting news.
Talk about music if no moderation is foundFallback song talk.
Count features / Count listener wishes / Count allowed incoming calls / Count fun moderationsHow many of each element this hour includes.

Within the source/news editing area you may also see small helper buttons such as Title / Changed title (edit the headline), Summerize text (have the AI shorten a text) and Count wishes — these act on the individual item you're editing.

ButtonAction
Save changesStores this program.
Delete radio programRemoves this hour's program.
Menu › News — pages newslist.aspx / news.aspx / newsdetails.aspx

News

The News menu (page newslist.aspx, titled "Actual news") shows the current pool of finished news stories the system has gathered and written. Clicking a story opens it for viewing (newsdetails.aspx) or editing (news.aspx), where you can correct the headline or text before it airs.

From source to air — the news pipeline Sources RSS · web scrape · e-mail Request filter (keywords, age) AI rewrite + relevance News pool finished stories (this page) Program news block top by relevance, or hand-picked (Select news) Facebook — if relevance ≥ min, else if a keyword matches
Sources gather raw articles; a Request filters and rewrites them into ranked stories; the best land in a program's news block (or you pick by hand). High-scoring stories can also auto-post to Facebook — and stories below that threshold still do if they mention one of the station's Facebook keywords.

Editing a single news item (news.aspx)

FieldMeaning
TitleThe original headline of the story.
Changed TitleYour edited headline; used on air instead of the original if filled.
Description / Changed descriptionThe story's summary and your edited version.
Details linkURL to the full original article.
Image linkURL of an image for the story.
Original textThe raw text as collected from the source.
RSS textThe text as it arrived from the RSS feed.
News textThe AI-rewritten, broadcast-ready news version (this is what gets spoken).
Feature textA longer "feature" rewrite of the same story, if produced.
Save changes / Delete newsStore your edits or remove the story.
You normally don't need to touch individual stories — the AI handles them. Edit here only to fix a name, correct a fact, or drop a story you don't want on air.
Menu › Requests — pages listrequests.aspx / newsrequest.aspx

Requests

A Request is a saved instruction that turns raw source material into finished content. It says which sources to read, what to look for (keywords/topics), and how the AI should write the result. The Requests menu lists them; clicking one opens the editor (newsrequest.aspx).

A request is a funnel — many articles in, the best out Articles in from your Sources Filter keywords ↑ · ignore ✕ older than max age ✕ AI writes model · prompt Rank relevance Finished item news & feature text Keyword hits push a story up the ranking; ignored topics and too-old articles drop out. If the request finds nothing, its fallback request takes over.
Each request reads chosen sources, keeps what matches, has an AI write it, and ranks the result by relevance — newest and most on-topic first.

How a story is scored

Everything a request does hangs off one number: the relevance of a story. It decides what is aired, in which order, and what is quietly dropped. It is worth knowing how it comes about, because two of the three parts of it are yours to set.

1 — Is this hard news at all? Before anything is scored, the AI asks whether the piece even is a news story: a current event, verifiable facts, some public relevance. An opinion piece, a photo gallery, a PR text, a reader's letter or a background recap gets zero — and is never looked at again. 2 — Then the three parts add up Your keywords the AI rates the story 1–100 against what you said you want 0 … 100 + The source's bonus a source you trust lifts everything it delivers set on the Source + Freshness brand new beats an hour old, an hour old beats yesterday +15 … +2 3 — Age is a hard edge, not a slope +15 +12 +10 +6 +4 +2 dropped just published “Max age for news” Your Max age is cut into six. A story in the freshest sixth carries +15 into the ranking, in the last sixth only +2 — and past it, nothing at all.
Relevance = what the AI thinks of the story against your keywords, plus whatever bonus its source carries, plus a freshness bonus. Past the max age it is not ranked low — it is gone.
A story is only ever scored once per request The rating is kept. The same article is never sent to the AI twice for the same request — which is why a well-chosen keyword list costs you nothing extra, but a vague one costs you the whole hour.
Why a good source is worth more than a good keyword A Source can carry a relevance bonus that lifts everything it delivers, and it can override the max age of the request. A slow, high-quality source that publishes twice a day would otherwise always lose to a fast agency feed — the bonus and the longer age window are what keep it in the game.

Request type — what the request is for

The type is not decoration: it decides which part of the station comes looking for this request. A request nobody asks for produces nothing.

TypeWho uses it
News & featureThe everyday workhorse. Fills the main news bulletin (via the station's Default news requests) and supplies the presenter's moderations between the songs.
Additional newsThe short extra bulletin between the hours — see Additional news blocks. Every request of this type feeds that one bulletin.
Feature onlyLonger pieces between the music, never part of the news bulletin.
Local news & featureThe same, for the regional bulletin.
EventWhat's on. Handled differently on purpose: the “age” of an event is its date, not when it was published — so an event does not get worse for having been announced early. Nearer beats further: today first, then tomorrow, and so on. Anything already past is dropped, never used as filler. How far ahead to look is set with Event days ahead — see below. Ideal together with an Event block. The whole chain — feed, source, request, block — is walked through on the Events page.
JokeLight material for moderations. The hard-news gate does not stand in its way.
No audio (RSS only)Collected and written, but never spoken — for a website or a feed.

Events: how far ahead to look

Max age is of no use here. It limits how far back a story may lie — but an event lies in the future, so every event passes that test, including the one in eight months. That is what Event days ahead is for.

Event days ahead = 2 (today and tomorrow) over dropped today first tomorrow next the day after — next week — in eight months not considered at all 1 = today only · 2 = today and tomorrow · 7 = the coming week · 0 = no limit Inside the window, the nearer event always goes first — so a Friday is named before a Sunday.
Event days ahead is the forward window. Everything outside it — and everything already over — never reaches the ranking.
“Only today's events” Set Event days ahead to 1. Combined with an Event block and a combine prompt you get a daily “what's on tonight” slot that never wanders off into next month.
Events with no time of day Many event sources give only a date, no time. Such an event counts as running for the whole day and is only dropped once the day is over — it is not treated as “past” just because it is past midnight.

Shorten & Combine — several stories, one piece

By default a request produces one item per story: three stories become three separate reads, one after another. That is right for a news bulletin. It is quite wrong for “the three best events this week”, which should sound like one presenter talking, not like a list being read out.

That is what these two stages are for. They are independent — you can use either, both, or neither.

Stage 1 — Shorten (each story on its own) Story A 210 words Story B 60 words Story C 180 words Only what is too long is touched. A and C are cut to your Result max words. B is already short enough and is left alone. Stage 2 — Combine (all of them together, in one go) A B C ONE AI call your Combine result prompt One coherent piece not three items — one Careful: the combine prompt also fires when there is only ONE story. It then works as a final rewrite of that single story. Handy — but if you did not mean that, leave the prompt empty. No combine prompt = no combining. The stories then stay separate items and are read one after another. That is the default, and for a news bulletin it is the right one.
Shorten trims each story that is too long. Combine hands them all to the AI at once and gets back a single, coherent piece.

When each stage runs

StageRuns when…
ShortenMore than one story was taken from this request, and a Shorten text AI Model is set, and the story is longer than Result max words. Each story is shortened on its own. Leave the model empty and nothing is shortened.
CombineA Combine result prompt is filled in (and a Combine results AI Model chosen). Every story taken from this request goes into a single AI call and comes back as one piece — including the case of a single story.

Writing a combine prompt

Tell it what the piece is, how long it may be, and what must not be lost. For a “what's on” slot:

“Turn these event listings into one coherent radio text of at most 150 words. Give the date, the place and the time for each one. Address the listener personally. Do not use a list — write it as if you were telling a friend what is on this week.”

This is what an Event block is built on An Event block takes the x most relevant stories of a request and expects to get one text back. Without a combine prompt it still airs — but the stories are simply read one after another, which is not what you asked for.

The fields

Basics

FieldMeaning
NameA label for the request (e.g. “World news”, “Local Helgoland”).
RadioStation this request belongs to. “All radios” makes it available to every station of the account.
Language / CountryTarget language and country for the produced content.
Request typeDecides who comes looking for it — see Request type above.
ActiveSwitched off, the request is invisible to everything. Nothing else changes.
Default AI ModelThe model that writes the result. Without it the request produces nothing at all — it is the single most common reason for a silent request.

What to include, what to leave out

FieldMeaning
KeywordsThe most important setting on this page. Every story is rated against these — see How a story is scored. Be concrete: “Bundesliga | VfL Wolfsburg | Fußball” gives a usable ranking, “Sport” gives you a shrug. Separate with |.
Ignore topicsTopics you never want to hear. A story whose topic contains one of these is dropped, however relevant it scored.
Check topicsHave the AI work out what each story is about, and use that to spot the same story arriving from two sources. Costs a little; stops you reading the same news twice in one bulletin. Ignore topics only bites when this is on.
SourcesWhich Sources this request reads. A source can carry its own relevance bonus and its own max age — see the note above.
Max age for news (hours)Beyond this a story is not ranked low, it is gone. It also sets the freshness ladder: the window is cut into six, and the freshest sixth carries the biggest bonus. Has no effect on Event requests — an event lies in the future.
Event days aheadOnly for Event requests: how far into the future to look. 1 = today only, 2 = today and tomorrow, 7 = the coming week, 0 = no limit. See Events: how far ahead to look.
Broadcast again (hours)How long before the same story may go on air again for the same station.
Fallback requestAnother request to fall back on when this one finds nothing. Works for news only — not for features, events and so on. And it does not nest: the fallback's own fallback is never consulted, so pick one that finds stories by itself.

How the AI writes it

FieldMeaning
Result max wordsHow long a single story may be. The trigger for the shorten stage.
Shorten text AI Model / promptThe shorten stage. Left empty, nothing is shortened — see Shorten & Combine.
Combine results AI Model / promptThe combine stage. The prompt is the switch: fill it in and the stories become one piece; leave it empty and they stay separate.

Extras

FieldMeaning
Create imageAlso generate an image for the story (for Facebook and the website).
Facebook Min RelevancePost to Facebook automatically, but only from this relevance upwards — the full post of two to four paragraphs. Set it too low and the page fills with filler. Stories below the threshold are not lost: if the station has Facebook keywords filled in under Manage radio, a keyword hit still gets a short post. 0 switches this track off; the keywords keep working.
Save changes / Delete requestStore or remove the request.
Menu › Sources — pages listnewssource.aspx / newssource.aspx

Sources

A Source is where raw information enters RadioButler: an RSS feed, a web page that is scraped, or an e-mail inbox. The Sources menu lists them; the editor (newssource.aspx) is detailed because it must teach the system how to read each particular feed and how to turn it into clean text. You can also test a source right here. There are several built-in sources (e.g. "News of the world", regional feeds); you can add nearly any source, and the team can build custom ones for a small fee.

How a feed is read and cleaned Raw feed / page RSS XML or scraped HTML splitter Tag mapping date · title · link description · body Clean stop words · min length strip junk phrases AI rewrite headline · news · feature text The tag-mapping and cleaning fields below teach RadioButler to read this feed. Test GetData runs it live so you can see exactly what comes out.
A source is set up once: tell it how to split the feed, which tag holds which part, what to throw away, and how the AI should rewrite it.

Identity & fetching

FieldMeaning
NameInternal source name.
Non admin nameThe name normal (non-admin) users see.
TypeThe kind of source (RSS, web scrape, e-mail, …).
UrlThe web address of the feed/page.
ActiveWhether the source is in use.
Refresh rate (minutes)How often to re-fetch the source.
EncodingCharacter encoding of the source (e.g. UTF-8) so special characters read correctly.
eMail accountIf the source is an inbox: which e-mail account to read.
Delete after / before, Latest search start / end, Result expected in, Latest resultHousekeeping & status fields: time windows for searching and the last result/time observed.

Reading the feed (RSS/XML tag mapping)

RSS feeds wrap each article's parts in named "tags". These fields tell RadioButler which tag holds which part, so it can extract the right text.

FieldMeaning
SplitterThe marker/tag that separates one article from the next.
PubDate tagTag holding each article's publish date.
PubTitle tagTag holding the headline.
PubLink tagTag holding the link to the full article.
PubDescription tagTag holding the summary/description.
TextIn tagTag holding the main body text.
Other tags to copyAny extra tags to keep verbatim.
Get details directly / Use source 'as is'Whether to fetch the full article from its link, and whether to use the feed text unchanged.
Create own guidGenerate a unique ID per item when the feed lacks one.
Father (link) / Father (image)Parent/base references used to resolve relative links and images.
RSS File / RSS File PathIf the source is produced as an RSS file, its file and path.

Cleaning the text

FieldMeaning
Stop words (title) / (link) / (text) / (sentence)If these words appear in the respective place, the item (or sentence) is discarded — a filter against junk/ads.
Min paragraph count / Min word countReject items that are too short to be real articles.
Auto delete phrasesPhrases automatically stripped from the text (e.g. "Read more", cookie notices).
Text infront resultFixed text placed before the extracted content.

AI rewriting (headline / news / feature text)

A source can carry its own AI instructions for three outputs. Each has its own model and prompt.

GroupFields
HeadlineHeadline AI Model, Headline prompt, Headline change type (how aggressively to rewrite the title).
NewsNews AI Model, News prompt — produces the spoken news version.
FeatureText AI Model, Text prompt — produces a longer feature version.
DescriptionDescription AI Model plus the matching prompt.
Auto promptsAuto headline / Auto text / Auto description prompt — used for fully automatic processing without manual review.
ButtonAction
Test GetDataRuns the source now and shows what it would fetch — invaluable when setting up tag mappings.
Save changesStores the source.
Delete all newsClears the stored articles collected from this source.
Delete sourceRemoves the source entirely.
Menu › Select news — page selectnews.aspx

Select news

This screen lets you hand-pick which available stories go into a program's news block, instead of letting the system choose automatically. You first choose the station (top drop-down); the page then shows the program and a list of available news with checkboxes.

ElementMeaning
Radio drop-downChoose which station you're selecting news for.
ProgramShows the program the selection applies to.
Available News (checkboxes)Tick the stories you want included.
Select for news (button)Confirms your ticked stories as the program's news.
Menu › Features — pages features.aspx / feature.aspx

Features

Features are longer, recurring AI-produced segments — stories, "this day in history", business round-ups, and so on. The Features menu (features.aspx) lists them in a table (Title, Status, Radio, Created); clicking one opens the editor (feature.aspx).

How a feature is produced Content source Story Text (if filled) — or — top news from a Request AI writes segments length & words limits history depth (no repeats) optional SFX Voiced & dressed presenter voice (TTS) intro/outro music bed (cue-in · start-next · fade) Feature audio at minute X, on the chosen hours & days A feature is produced on its own schedule and dropped into the matching hour — see where it sits in the hour anatomy.
Give a feature a brief and a source; it writes itself on schedule, gets a voice and a music bed, and lands at the minute you chose.

Header & AI

FieldMeaning
StatusRead-only production state of this feature (e.g. NEW → produced).
RadioStation the feature belongs to (changing it reloads matching options).
LanguageLanguage of the feature.
AI ModelThe AI model that writes the feature.
TitleThe feature's title (required).
InstructionThe main brief telling the AI what to produce.
History depthHow many previous editions the AI should "remember" to avoid repeating itself.

Content source

FieldMeaning
Story TextOptional fixed input text. If filled it is used directly; otherwise the top-rated news from the chosen request is used.
Don't reuse news for:Hours during which already-used news won't be reused (0 = always allow reuse).
News RequestWhich Request supplies the source news when no Story Text is given.
Count NewsHow many news items to draw in.

When it runs

FieldMeaning
Hours (+ Select all)Checkboxes 00–23: which hours of the day this feature is produced. "Select all" toggles them together.
Days (+ Select all)Checkboxes for weekdays it runs on.
Minute in hourAt which minute past the hour it is generated.

Shape & sound

FieldMeaning
Length (seconds) Min – MaxTarget duration range of the finished audio.
Words per segment Min – MaxHow long each spoken segment should be.
Sound effects (SFX)Checkbox to include sound effects.
SFX count Min – MaxHow many sound effects (leave empty to auto-calculate).
Intro (upload) + Timing (Cue-in / Start next / Fade-out)An intro music bed plus its three timing values — where to start in the bed file, how long it plays before the speech enters, and its fade-out length. See Bed timing for exactly how these work (negative values allowed).
Outro (upload)Closing music bed.
ElevenLabs API KeyOptional key just for this feature (empty = use system default).
PresenterCheckbox list of presenters. If none chosen, the AI auto-picks from the station's contributors.
ButtonAction
SaveStores the feature.
Reset to NEWSets the status back to NEW so it will be produced again.
DeleteRemoves the feature.
CancelLeaves without saving.

When editing an existing feature, a Quick Access URL and a Productions history (past generated episodes) may also appear below the buttons.

Menu › Blocks — pages block.aspx / blockdetails.aspx

Blocks

A Block is a piece of audio that must appear at a precise, fixed moment — for example a fixed insert tied to the news, a switch to an external live stream, or a station element that always plays at a certain second of the hour. The Blocks menu (block.aspx) lists existing blocks (Name, Type, Language, Radio); clicking one opens the detail editor (blockdetails.aspx). A block is a container: it defines when (type, time, days/hours, validity) and holds one or more BlockItems — the actual audio pieces that play.

Two things decide everything else:

  • The block says WHEN. StartTime is the exact second inside the hour, Precision the tolerance around it. When a block is due, the streamer shortens the running song so the block starts on time.
  • The items say WHAT. They play one after another, in Order No — a bed, then the content, then an outro. Each item's Probability only decides whether that item is part of this airing at all; it is not a lottery that picks a single winner.
1 — The block says WHEN :00 :15 :30 :45 :59 NEWS · :00 (± Precision) EVENT · :20 (StartTime = 1200 s) 2 — The items say WHAT — they all play, in Order No #1 Bed Static file · 100 % #2 Content News request (AI) · 100 % #3 Outro Static file · 100 % Probability is a gate, not a lottery. An item at 30 % is simply left out of 7 airings out of 10 — the remaining items still play, in order.
The block pins the moment; its items play in sequence. Probability decides per item whether it is included this time.
Where the audio is mixed Most blocks are assembled as they go on air: the items are played one after another and only cross-faded into each other. That is why a bed cannot run underneath a spoken item in an ordinary block. Event blocks (see below) are different: they are rendered into one finished file before they air, so there a bed can run under the voice.

Block (the container)

FieldMeaning
BlocktypeWhat kind of block this is — it decides at which point in the hour the block is used. The live streamer regularly asks "is a block of this type due now?" and, if so, plays the block's items at the block's StartTime. Options:
  • News (NEWS) — a fixed element belonging to the main news slot (e.g. a news intro/time-signal that must sit exactly on the news).
  • LocalNews (LOCALNEWS) — the same, but for the regional/local news slot.
  • Additional news (ADDNEWS) — a short extra news bulletin outside the main news: two stories, read one after another over a bed. Also produced before it airs. See Additional news blocks below.
  • External Stream (STREAM) — a slot for material that comes from outside the station: a recording, a podcast episode, or a live relay. What actually arrives is decided by the items (File type Download file or Stream), not by this type.
  • Moderation (MODERATION) — a fixed presenter/moderation insert at a precise time.
  • Event (AI news block) (EVENT) — a produced slot: the block is rendered into one finished file before it airs, so a bed can run under a spoken item. This is the only type that may contain a News request (AI) item. See Event blocks below.
RadioButler also ships global default blocks (e.g. a default NEWS block per language/country) that apply when you haven't defined your own.
NameA name for the block.
LanguageLanguage the block applies to (lets one block target only one language).
CountryCountry the block applies to ("--- all ---" = every country).
RadioStation the block belongs to.
Valid from / Valid untilDate range during which the block is active (outside it the block is ignored).
StartTime (mm:ss)The exact minute:second within the hour the block should play, e.g. 00:00 for the very top of the hour.
Precision (seconds)The tolerance window around StartTime — how far before/after the exact second the block may still be slotted in (so it doesn't cut a song mid-word).
Hours (+ Select all)Checkboxes 00–23: which hours of the day the block runs in.
Days (+ Select all)Which weekdays the block runs on.
Schedule overviewA read-only week grid (24 hour rows × 7 weekday columns) directly below the day selection. It shows every block of the selected radio that is valid today, as a small chip with its start time and (shortened) name — hover a chip for the full title, type, radio and exact slot. The block you are editing is drawn live in orange as you tick hours/days or change the start time, so you see immediately whether you are stacking blocks into one hour and leaving the next one empty. See Schedule overview below.
+ Add BlockItemAdds another audio item to this block; a complete item row is built dynamically on the page (see below).
Save BlockStores the block and all its items.
Delete Complete BlockRemoves the whole block including its items.

Schedule overview — what already runs in which hour

Blocks are easy to pile up: three blocks at 20:00 in the 10–11 hour and nothing at all in 11–12. The Schedule overview on the block page makes that visible before you save. It sits right under the day checkboxes and lists all weekdays and all hours for the radio chosen in the Radio dropdown:

  • One chip per block and slot. Every block that is ticked for that weekday and hour appears in the cell as mm:ss Name, sorted by start time. Long names are cut off — move the mouse over a chip to see the full title, the block type, the radio and the exact slot.
  • Only this radio. The grid shows the blocks whose Radio is the one currently selected in the dropdown. Blocks defined for "All radios" are not shown; switching the dropdown redraws the grid without a page reload.
  • Only what is valid today. Blocks whose Valid from / Valid until range does not include today are left out.
  • Live preview of the block you edit. The current block is drawn in orange and follows every change to its name, start time, hours, days or radio immediately — no need to save first. Today's column is highlighted.
  • Same start time = warning. If two blocks in the same cell share the exact same StartTime, both chips get a red border and the tooltip says so. Move one of them to another second or hour, or give the hour to a different block.
Reading the grid Grey chips are saved blocks, the orange chip is the one you are working on, red-framed chips collide. An empty cell simply means no block of this radio is scheduled there — the regular music program plays.

BlockItem (added dynamically with “+ Add BlockItem”)

Each click on + Add BlockItem inserts a fresh item row on the page. A block can hold several items, and they all play, in Order No order. Each item carries its own probability, validity and hour/day rules, so a block can still vary what it contains. Every item row contains:

FieldMeaning
NameA label for this item.
Order NoThe position of this item within the block — the items play in this order.
ProbabilityThe chance (0–100 %) that this item is included when the block fires. 100 = always. Anything below lets you leave an item out now and then (e.g. a sting only every second time). It does not pick one item instead of the others. Values are clamped to 0–100; 0 is treated as 100.
Use from / Use untilDate range in which this item may be used.
File typeWhere the audio comes from:
  • Static file (STATIC) — a file you upload.
  • Download file (URL) — fetched from an address and played once it has been downloaded. Good for podcast episodes and recordings of a known length.
  • Stream (STREAM) — a live source that is relayed as it arrives, not downloaded first. See Live stream items.
  • News request (AI) (NEWSREQUEST) — the audio is generated: the most relevant news of a request are woven into one text by the AI and spoken. Only works inside an Event block. See Event blocks.
File upload / Download URLThe actual audio: upload a file (Static), or enter the address (Download / Stream). The label next to the upload shows which file is currently stored. Uploads on existing items are allowed too — pick a new file and save to replace it.
News requestOnly for File type News request (AI): which Request the stories are taken from.
NewsOnly for File type News request (AI): how many stories are taken — the x most relevant ones — and combined into a single text. Default 3.
SpeakerOnly for File type News request (AI): who reads it. Left empty, the news presenter of the Radio Program of that hour is used.
Cue InEntry point into the item's audio (skip the first N seconds). See Bed timing.
Start NextWhen the following element begins relative to this item. Positive = that second inside this file (a bed whose opener is 9.4 s long gets StartNext = 9.4, so the voice sets in there and the bed keeps running underneath). Negative = that many seconds before the end. Zero = when this item is over. See Bed timing.
Fade OutLength of the fade-out at the item's end.
Cue OutThe point at which the item is cut off (its effective end). For a Stream item this is the maximum length in seconds — see below.
Hours / Days (+ Select all)Per-item restriction of the hours and weekdays this specific item may play (narrower than the block's own hours/days). If you are not varying items, tick all boxes via “Select all” — an item whose hours/days do not match is silently left out.
Delete (item)Removes just this one item from the block.

Additional news blocks — a short bulletin between the hours

The main news sits at the top of the hour. An Additional news block is the short bulletin in between — typically at half past: a bed comes up, the presenter reads a couple of stories with a whoosh between them, the bed fades out, the music comes back. Radio Vaterland, for example, runs one at :28 every hour. How many stories it contains is set once per station, in Count news in additional news on the Radio station page (default 2).

Like an Event block it is produced before it airs — the stories are picked, rewritten for radio, spoken and mixed with the bed into one file. The block itself only says when; the bed comes from its single BlockItem.

Roughly half an hour before air — the bulletin is produced Every Request of the type “Additional news” all of them form one pool Ranked by relevance older than the request's max age → pushed down The best few as many as the station wants Rewritten for radio, separately Spoken two files What it sounds like — the two stories follow each other Bed — the block's BlockItem. Runs from 0, underneath everything, fades out at the end. Story 1 a greeting can be put in front of it whoosh Story 2 a hand-over to the weather can follow it 0 s Bed's “Start Next” — the voice sets in here Separate stories — not one woven text. If you want the stories combined into a single coherent piece, use an Event block instead.
An Additional news block picks the two most relevant stories from every “Additional news” Request, has them rewritten and spoken, and mixes them over the bed with a whoosh in between.

Where the stories come from

This is the part that surprises people, so it is worth being precise: you do not choose a Request on the block. The block has no field for it. Instead, RadioButler collects every Request of the station's customer whose type is “Additional news”, throws all their stories into one pool, ranks the pool by relevance, and takes the top two.

So you steer the content purely through the Requests:

  • Want a business bulletin at half past? Give that Request the type Additional news — and make sure no other Request of that type exists, or its stories will compete for the same two slots.
  • Want two bulletins with different content at different times? That is not what Additional news is for — a station has one additional bulletin. Use Event blocks instead; there the Request is chosen on the item, so any number of differently sourced slots can exist side by side.

How a story is prepared

StepWhat happens
RankingEvery story of every “Additional news” Request is scored for relevance. A story older than the Request's max age is pushed far down the list, and even further once it is twice that old — so a fresh story beats a stale one even if the stale one is more on topic.
RepetitionTopics that were just on air are skipped, if the Request has topic checking switched on.
Too shortA story whose original text has fewer words than the station's Min words news is dropped and never tried again.
RewritingEach story is rewritten on its own for radio — using the Source's news prompt, or a default one that shortens it to under 80 words and spells out years. The headline is rewritten too.
Greeting & hand-overIf the Radio Program of that hour has “Use listener greeting in news” ticked, a greeting is put in front of the first story. With “Use weather greeting in news”, a hand-over to the weather is appended to the last one.
VoiceThe news presenter of the coming hour's Radio Program reads it; if that hour has none, the station's default news presenter does.
CostEach story is charged at the station's news price against the customer's balance. With an empty balance nothing is produced.

How to set one up

StepWhat to do
0. How many storiesOn the Radio station page, set Count news in additional news (default 2). This applies to the station's bulletin as a whole.
1. The RequestCreate (or take) a Request, set its type to Additional news, give it its sources, keywords and an AI model.
2. The blockBlocktype Additional news. Days, Hours, and StartTime = the minute:second, e.g. 28:00 for half past. Precision of a few minutes is normal here (Radio Vaterland uses 240 seconds) — the bulletin is not a time signal, it just has to land roughly there without cutting a song.
3. The bed+ Add BlockItem, File type Static file, upload the bed. Its Start Next is the second at which the voice comes in — the bed file normally starts with an opener, so this is the length of that opener. Tick all hours and days on the item.
One Additional news block per station — by design A station has one additional bulletin, which can of course run in many hours (Radio Vaterland's runs every hour at :28). Two different Additional news blocks are not intended: there is one bulletin per station, and it is produced once. If you need a second, differently sourced slot, that is what Event blocks are for — there the Request is chosen on the item, so any number of them can live side by side.
Additional news or Event?
Additional newsEvent
Which RequestNot chosen — every Request of the type “Additional news” lands in one poolChosen on the item
How many storiesSet once per station (Count news in additional news, default 2)Set on the item, so each block can differ (default 3)
How they are readOne after another, whoosh in betweenWoven by the AI into one coherent text
Bed / outroBed yes, no outroBed and outro
Several per stationOne bulletin per station (it can run in many hours)As many as you like

Event blocks — a bed, an AI text, an outro

An Event block answers a request like: “every Tuesday at 17:20, give me the three most fitting stories of this Request — not read out one by one, but woven into one coherent piece, with a bed underneath and an outro at the end.”

It differs from every other block in one respect: it is produced about 15 minutes before it airs and mixed into a single finished file. That is what makes a bed under the voice possible — an ordinary block only cross-fades between its items and could never hold a bed underneath a spoken piece.

About 15 minutes before air — the block is produced Request all its stories, ranked by relevance Top 3 already-aired and repeated topics drop out AI combines them one coherent text, not three separate ones Voice the presenter reads it One finished file bed + voice + outro, mixed together What that file sounds like Bed — runs from second 0, underneath everything, fades out at the end The combined AI text, spoken Outro 0 s Bed's “Start Next” — the voice sets in here (e.g. 9.4 s) voice ends → outro No stories → no block. If the Request has nothing to say, the block is simply not aired and the music keeps running. It never goes on air empty.
An event block is produced ahead of time: the best stories of a Request become one AI-written text, are spoken, and are mixed with bed and outro into a single file that airs to the second.

How to set one up

StepWhat to do
1. The blockBlocktype Event (AI news block). Days = the weekday(s), Hours = the hour, StartTime = the minute:second (e.g. 20:00 for 17:20 in the 17 hour), Precision = how far it may slip (60 seconds is a sensible start).
2. The bed+ Add BlockItem, Order No 1, File type Static file, upload the bed. Set Start Next to the second at which the voice should come in — the bed file usually contains the opener, so this is the length of that opener. Optional: leave the bed out entirely, then the voice starts at 0.
3. The content+ Add BlockItem, Order No 2, File type News request (AI). Pick the News request, set News to how many stories should be combined (e.g. 3), and optionally a Speaker.
4. The outro+ Add BlockItem, Order No 3, File type Static file, upload the outro. Optional.
5. SaveSaving always throws the produced file away, so the block is rendered again — with your changes — for its next airing.
The Request has to be prepared for this A News request (AI) item only produces something if its Request has an AI model set. And it only combines the stories if the Request also has a Combine prompt (plus its model) — something like “Turn these event listings into one coherent radio text of at most 150 words. Give date, place and time for each.” Without that prompt the stories are simply read one after another instead of being woven together. A Broadcast again after of e.g. 168 hours keeps the same story from returning next week.
Tip: event listings If the Request's type is EVENT, stories that happen today are pushed to the top, tomorrow's come next, and anything already past drops out. That is exactly what you want for a “what's on this week” slot.

Live stream items — relaying an external source

A BlockItem with File type Stream does not download anything. At the block's time the station connects to the address you gave and relays whatever comes out of it, live — an Icecast or Shoutcast stream, an HLS feed, or simply a file served over http.

The relay — and why the listener hears it about 15 seconds late Your source Icecast · HLS · file Decoded as fast as it arrives The station's buffer always about 15 seconds On air Listener The station always works about 15 seconds ahead of what is on air. A live source cannot be fetched ahead of time — so it is simply fed in as it comes, and the listener hears it with that same delay. Nothing else changes. Three ways back to the music The source ends A podcast or recording runs out — the next song fades in over it. Cue Out is reached The maximum length you set, in seconds. The source gives up Silent or too slow — the station drops it and returns to music. If the source cannot be reached at all when the block is due, the block is skipped before the running song is even shortened — the music simply plays on. No hole on air.
A live source is fed in as it arrives, so it airs with the station's usual ~15 second delay. It ends when the source ends, when Cue Out is reached, or when the source fails.
FieldWhat to put in
File typeStream.
Download URLThe address of the source. Anything an ordinary player can open works: Icecast/Shoutcast (MP3, AAC), an HLS playlist (.m3u8), or a plain audio file over http(s).
Cue OutThe maximum length in seconds. 1800 = stop after 30 minutes at the latest. 0 = no limit — the relay then runs until the source itself ends.
Cue Out = 0 on a source that never ends A real live stream does not stop by itself. With Cue Out = 0 the relay therefore keeps going — and for as long as it does, the station plays nothing else: no news, no adverts, no moderation. That is fine for a podcast or a recording, which end on their own. For a permanent source, set a Cue Out.
An Event block cannot contain a live stream An Event block is mixed into a file before it airs, and a live source cannot be mixed ahead of time. Put Stream items into an External Stream or Moderation block instead.
Menu › Events — the full chain, from the XML feed to the air

Events

An event is something that will happen: a concert on Friday, a guided walk at four, an exhibition that runs all month. RadioButler can turn a calendar into a spoken segment — “Tonight on the island: …” — that airs to the second, every day, with no one touching it.

This page follows one event all the way through: from the line in an XML feed, through the Source and the Request, into an Event block, and out of the speakers. Four pieces have to fit together. If the segment stays silent, one of them is misconfigured — and the table at the end tells you which.

The one rule that governs everything
For an event, the date of the news item is the date of the event — not the day you found it. RadioButler stores that date in the news item's timestamp, and every decision downstream reads it: is this still to come, is it today, how soon is it, should it be dropped. Publish the harvest time instead and every event looks like it is already over. Nothing airs, and nothing tells you why. This is the single most common mistake, so it is worth saying plainly: the feed must publish the event's start time.

The chain

XML feed one item per event, pubDate = event start Source reads the feed, stores each event Request drops what's past, ranks what's near AI combines all of them into one spoken text Block bed + voice + outro, on air What each stage decides Feed & Source — the facts When does it start? (pubDate) What is it? (title + description) Have we seen it before? (guid) Nothing is judged here. Everything is kept. Request — the choosing Already past? → dropped Too far ahead? → not yet Sooner beats later The best few survive. Block — the airing Produced ~15 min beforehand One finished file, mixed Nothing to say → no block The music simply keeps running.
The feed states the facts, the Request chooses, the Block airs. Each stage can only work with what the one before it handed over.

1. The XML feed

Anything that can produce an RSS 2.0 file can feed events into RadioButler — a scraper you write, an export from a town's calendar, a script that reads a newsletter. One item per event on one day. An exhibition that runs for a week is not one item, it is seven — otherwise it can only ever be announced once.

<item>
  <title>Guided dune walk</title>
  <pubDate>Tue, 15 Jul 2026 09:50:00 +0200</pubDate>   <!-- the event STARTS here -->
  <description>Guided dune walk, 9.50, ferry pier</description>
  <content:encoded>Meet at the ferry pier at 9.50. Two hours across the dune with a
       naturalist, who will show you the orchids and the seal bank. Adults 12 euro,
       children free.</content:encoded>                <!-- the text the AI works from -->
  <link>https://example.com/events/dune-walk</link>
  <guid>dune-walk-0715</guid>
</item>
TagWhat it must carry
pubDateThe start of the event, in the future. Not the time you scraped it. This becomes the event's date inside RadioButler and drives every decision that follows.
titleShort and speakable. It is read out.
content:encodedThe text the presenter will work from. Say what it is, where it is, when it is, what it costs. Two or three real sentences here are worth more than any other setting on this page — a bare title gives the AI nothing to write with and the segment turns thin.
Which tag this text is read from is your choice: the Source's Text in tag field decides. <content:encoded> is the usual home for a full text; <description> works just as well if you point Text in tag at it. What matters is that the tag you name there is the tag that actually carries the text.
descriptionThe short summary. Careful: on its own this is not enough. Unless Text in tag names it, the description only fills a display field — the AI never sees it.
linkWhere the event is described in full. Optional — but if you set it, it must point at a page that actually exists.
guidA stable id that is unique per event per day (e.g. dune-walk-0715, dune-walk-0716). This is what stops the same event being stored twice when the feed is read again. Reuse the same guid for two different days and the second day is silently swallowed as a duplicate.
For events, the text must come from the feed
If the Source has no Text in tag, no text is taken from the feed at all. RadioButler then fetches the page behind <link> and reads the text from there instead. For a news feed that is the normal way to work — the link leads to an article, and the article is the text.
An event calendar is different. The link leads to a listing, or to a page that no longer exists, or it carries a date suffix and returns nothing at all. There is no article behind it. So for events: name the tag in “Text in tag”, and put the text in that tag. Do not leave the text to the link.

2. The Source

Create a Source for the feed. Only a few fields matter here, but one of them is the rule from the top of this page, in field form.

FieldSet it to
TypeXML.
URLThe address of the feed. It has to be reachable over http(s) — a path on a disk is not enough, even if the file is sitting right there. A feed that is written but never published is the quietest failure in this whole chain.
PubDate tag<pubDate>. Leave this empty and the event's date is lost — the item is stored with the time it was read, and from that moment on it counts as past.
Text in tagThe tag that carries the descriptive text — normally <content:encoded>, but <description> is equally valid if that is where your feed puts it. This is the field that decides what the AI gets to read, and for an event feed it must be set. (On a news source it is often deliberately left empty, because there the text is fetched from the article behind the link. An event calendar has no such article.)
PubTitle / PubDescription / PubLink tagThe matching tags of your feed, normally <title>, <description>, <link>. Note that PubDescription is not what feeds the AI — that is Text in tag, above.
ActiveTicked. An inactive source is never read.
Refresh rateHow often the feed is fetched, in minutes. Event calendars change slowly — every 60 minutes is plenty.

3. The Request

The Request is where the choosing happens: which events, how far ahead, and in what words. Set Request type to Event — without that, none of the event logic below applies and the Request behaves like an ordinary news query.

FieldSet it to
Request typeEvent. This is what switches on everything else on this page.
Max age0. For an event this means “only what is still to come”. Any other value reaches backwards in time and pulls in events that have already happened.
Event days aheadHow far to look. 1 = today only, 2 = today and tomorrow, 0 = no limit. For a daily “what's on tonight” slot, use 1.
Combine promptThe instruction that turns several events into one flowing text. Without it there is no segment — see below.
Combine AI modelThe model that writes that text. It bills to whoever owns it, so use your own.
Keywords / Check topicsOptional. Events are usually all wanted, so most stations leave the topic check off. Switch it on only if the feed carries things you do not want on air.

Within the window you allow, events are ranked so that sooner beats later: today first, then tomorrow, then the rest. An event does not get worse for having been announced early — its date is what counts, not its age. Anything already past is dropped outright and never used as filler.

The combine prompt

Every chosen event is handed to the AI in one single call, and the combine prompt tells it what to build from them. This is the difference between a list and a segment. A prompt that works tends to say: write one flowing text, not an item-by-item list; give each event what it is, where, and when; take nothing that is not in the material; write numbers and times as words, because this will be spoken and not read; stay under a word limit; and — this one matters — name the time frame explicitly. Left to itself, an AI handed a thin set of events will invent one, and you get a Tuesday segment that opens with “this weekend”.

Say what should happen when there is nothing on. An empty day is a real case, and the prompt should cover it in one sentence (“say that nothing is announced for today”) rather than leave the AI to improvise. Note, though, that if the Request finds no events at all, the block is not aired in the first place — the music simply keeps running.

4. The Block

The Event block is the slot on air. It is produced about fifteen minutes before it is due: the Request is asked, the AI writes, the presenter speaks, and bed, voice and outro are mixed into one finished file. At the appointed second that file plays. Nothing is decided live.

StepWhat to do
The blockBlocktype Event. Days and Hours = when it may run. StartTime = the minute and second within the hour (20:00 means twenty minutes past). Precision = how far it may slip.
The bedOrder No 1, file type Static file. Start Next is the second at which the voice comes in — usually the length of the opener baked into the bed. Leave the bed out and the voice starts at zero.
The contentOrder No 2, file type News request (AI). Pick your event Request, set News count (an upper limit, not a target — three events when you asked for five is fine), and choose the presenter.
The outroOrder No 3, file type Static file. Optional.
Once per hour, at most. A block that has already aired in the current hour will not air again in that hour, even if a later slot would still fit. If you are testing and wondering why the next slot is skipped, that is why.

When nothing airs

The chain fails quietly — that is its worst property. Work down this table in order; the first row is the cause far more often than the rest put together.

SymptomWhere to look
The Request finds nothing, though the calendar is fullThe feed is publishing the harvest time instead of the event's start time. Every event then counts as past and is dropped. Check pubDate in the feed, and check that the Source's PubDate tag is filled in — if it is empty, the date is lost even when the feed is right.
Events are found, but the presenter says there is nothing onThe AI was handed empty texts and reported what it saw. On an event source, Text in tag must name the tag the descriptive text actually sits in — if it is empty, or names a tag the feed does not have, no text ever reaches the AI.
Only the first day of a recurring event is ever announcedThe feed publishes one item for the whole series. Publish one item per day, each with its own date and its own guid.
Past events are being announcedMax age is not 0. Any other value reaches backwards.
Events from next month turn up in a “tonight” slotEvent days ahead is 0 (no limit). Set it to 1.
The events are chosen, but no audio appearsThe Request has no combine prompt or no combine AI model.
The feed exists on disk but nothing is ever importedThe Source's URL points nowhere public. Writing the file is not publishing it.
The block is skipped even though the slot is still aheadIt already aired earlier in the same hour. Once per hour is the limit.
Menu › Jingles — page jingles.aspx

Jingles

Jingles are short station idents (sung names, sound logos) inserted automatically between elements. The page lists your jingles (Name, Description, Path, Actions) and has an Add New Jingle form. How often jingles may play is also limited by "Min time between jingles" on the Radio station page.

FieldMeaning
Jingle NameA name for the jingle.
File PathThe audio file for the jingle.
Total durationThe jingle's length (seconds).
StartNextWhen the following element should begin relative to the jingle (lets the next audio start over the jingle's tail).
Hours 00–23 (checkboxes)Which hours this jingle is allowed in.
Days Mon–Sun (checkboxes)Which weekdays it is allowed on.
SaveAdds/updates the jingle.
Actions (in list)Per-row edit/delete controls for existing jingles.
Menu › Beds — page radiobeds.aspx

Beds

A bed is the background music a spoken element runs over — the news, the weather, the traffic report, the hour opener. For a long time a station had exactly one of each, uploaded on the Radio station page, and it was used around the clock. This page lifts that limit: you can hold as many beds as you like per element and decide, per weekday and per hour, which one is used.

The reason it exists is sponsoring. “The weather is brought to you by Autohaus Müller” is a bed with a claim in it — and a sponsor buys hours, not a whole day. Two sponsors, one for the morning and one for the drive home, are two beds on the same station with different hours ticked.

Your existing bed uploads have not gone away. The single fields on the Radio station and Program Schedule pages are now the default bed: they apply in every hour that no scheduled bed on this page covers. Change nothing here and your station sounds exactly as before.
The sponsor announcement lives in the audio file. RadioButler never speaks it. You upload a bed that already contains the claim — which is how an agency delivers one anyway — and the Sponsor field on this page is only a label for the list, the week grid and the play log. That way what goes on air is exactly the file you approved.

The fields

FieldMeaning
NameFor your own overview; the listener never hears it. Something you will still recognise in six months — “Weather bed Autohaus Müller, summer campaign”.
Used forWeather, Traffic, News or Opener — where the bed is played. Each element has its own pool of beds; they never mix.
RadioThe station this bed belongs to. Beds are never shared between stations; upload it once per station.
SponsorA label only, never spoken. It shows up in the list, in the week grid and in the play log, so you can tell at a glance whose bed is on air and hand a sponsor the numbers at the end of the month.
Audio fileThe bed itself, as an mp3, with the sponsor announcement already mixed in if there is one. Mind the length: the bed has to carry the whole element, or your presenter ends up talking over silence.
Start next (seconds)The second at which the spoken text sets in over the bed — see Bed timing. Give the bed enough intro to be recognised, and not so much that the listener waits.
Min lengthOpener beds only. The minimum time the opener plays on its own before the first song starts underneath it. Left at 0, the value from the program — and failing that from the station — applies as before.
Total durationThe full length of the file in seconds, used to fade the bed out cleanly.
Active from / Active untilOptional campaign window, both dates inclusive. Before it the bed is skipped, after it the bed stops on its own and the default takes over again — nobody has to remember to switch it off when a booking runs out.
Rotation weightnormal / heavy / very heavy. Only matters when several beds share an hour — see Several beds in the same hour.
On air (Active)Untick to park a bed without deleting it. Its play log is kept.
Days Mon–Sun (checkboxes)The weekdays the bed may air on.
Hours 00–23 (checkboxes)The hours the bed may air in, in the station's local time — see Which hour to tick.
SaveAdds or updates the bed. The form refuses to save a bed with no day or no hour ticked, because such a bed would never air.
Actions (in list)Edit or delete. Deleting removes the audio file as well, but keeps the play log — that belongs to the invoice, not to the bed.

Which hour to tick

One rule, and it holds for all four kinds of bed: tick the hour in which the listener hears it. You never have to think about when RadioButler produces the element.

That distinction matters because the production runs ahead of the airtime. Weather, news and traffic for the 7 o'clock hour are written and voiced during the second half of the 6 o'clock hour; the opener is built right around the change of hour, sometimes a minute or two before, sometimes a minute or two after. RadioButler resolves the bed against the hour it goes out in every case.

So the “7 o'clock news” is hour 07. Even though the bulletin is produced at about 06:45 and starts just before the full hour, you tick 07. Same for weather and traffic, same for the opener that opens the 7 o'clock hour.

Two consequences worth knowing:

SituationWhat happens
The log shows an earlier time than the air timeNormal. The station's console log records the moment the bed was picked — around x:45 for an element of hour x+1. The play log in the database records the broadcast hour, on the full hour.
Local time, not server timeDays and hours are always your station's own time, and so is the play log. A station in a different time zone from the server is not shifted.

Several beds in the same hour

Nothing breaks and nothing is dropped: the matching beds rotate at random, weighted. For every single element, RadioButler collects the beds of that kind whose day, hour and date window fit and whose file it can find, and draws one of them.

Beds sharing the hourChance each time
One bed100% — a single scheduled bed is a guarantee.
Two beds, both normal50% / 50%
normal + heavy25% / 75% (weights 1 and 3)
normal + heavy + very heavy11% / 33% / 56% (weights 1, 3 and 5)
The draw has no memory. It is a dice roll, not an alternating order. With two beds on 07:00 the same one can come up five days in a row; over a month the ratio holds, over three days it does not. If you sell exclusivity in an hour, put exactly one bed in it — the week grid will show you a name instead of a count. And a promise like “30 plays this month” is not something a random split can keep on its own.

Each element draws for itself, too. Opener, news, weather and traffic of the same hour are decided independently, so different sponsors inside one hour are the normal case rather than a fault.

Week at a glance

Below the list sits a grid of seven days by twenty-four hours for the selected station and bed type — the current week, in the station's local time, with the campaign windows applied. It answers the one question everybody asks after adding a third bed: what actually runs when?

CellMeans
A name, greenExactly one bed covers that hour. Guaranteed, no rotation.
A count like “2x”, amberSeveral beds share the hour and rotate. Hover the cell to see which ones.
A dashNo scheduled bed. The default bed from the Radio station page applies — which is perfectly fine, and for most stations most of the week.
A bed whose campaign starts next month shows as a dash everywhere this week. That is the grid doing its job, not a mistake.

The play log

Every time a bed is used, RadioButler records it: which bed, which station, which hour, and the sponsor name as it stood at that moment (so renaming the bed later does not rewrite last month's paperwork). The list on this page shows a running total and the count for the current month per bed — enough for the conversation with the sponsor, and the basis for an invoice attachment.

The count for a brand-new bed stays at zero until its first hour comes round. If it stays at zero past that hour, work through When a bed doesn't air.

Which bed wins

For each element the chain is the same, and the first step that produces something wins:

StepWhat is checked
1. A scheduled bed on this pageActive, the right station and kind, day and hour ticked, inside its date window, file present. Several matches rotate by weight. This beats everything below, including a bed set on the hour's own program.
2. The program's bedFor openers: the Opener Bed on the Program Schedule / Radio Program. For traffic: the bed on the hour's traffic entry.
3. The station defaultThe single upload on the Radio station page — News Bed, Weather Bed, Traffic Bed, Opener.
4. The built-in standardThe standard bed of the station's language, or a system bed. An element is never dropped merely because a bed is missing.
Step 1 beating step 2 is deliberate: ticking an hour on this page is an explicit instruction, and a paid sponsor bed should not be quietly overruled by a template. The same goes for the Active tickbox next to Weather Bed on the Radio station page — it switches off the default weather bed, not a bed you scheduled here.

When a bed doesn't air

Work down the list; in practice it is almost always one of the first three.

CheckWhat to look for
Days and hoursAn empty day or hour selection means never, not always. Open the bed and look at the week grid — a row of dashes tells you immediately.
The right hourRemember the rule: the hour you hear it. A bed meant for the 7 o’clock news with 06 ticked runs with the 6 o’clock news instead.
On air & campaign windowActive unticked, or Active from in the future, or Active until already past — each one silently hands the hour back to the default bed.
The right kindA bed set to News will never turn up under the weather. Check Used for.
The fileIf the audio file cannot be found, the bed is skipped for that hour and the default is used; the bed itself is kept and a warning is written to the event log. Play the file with the little player in the list — if it is silent there, it will be silent on air.
The right stationBeds belong to one station. If you run several, check the station selector at the top of the page.
Traffic is produced by a separate worker. If weather, news and openers pick up their new beds but traffic does not, the traffic worker is still running an older build — that is an operations matter, not a setting on this page.
Menu › Playlist — page songsplayed.aspx

Playlist (songs played)

This is the play log: every song the station has played, newest first, with a search box. From here you can also block a song or artist so it never plays again.

Column / controlMeaning
Search (Artist or song)Type to filter the log by artist or title, then press Search.
ProgramThe program during which the song played.
Artist / SongPerformer and title.
GenreThe song's genre.
Started / EndedTime the song started and finished.
TypeThe kind of entry (song, jingle, etc.).
Block songBan this exact song from future play.
Block artistBan everything by this artist.
Banned songs / artists (link)Opens the Banned songs list to review/undo bans.
Menu › Song upload — page songsupload.aspx

Song upload

Adds your own music to the library. You upload a ZIP archive of audio files; RadioButler extracts and catalogues them. Maximum size is 2 GB. Sub-folders inside the ZIP are fine, but do not put ZIP files inside the ZIP (nested archives won't work).

FieldMeaning
Sub-GenreChoose the sub-genre the uploaded songs belong to, so they're filed correctly.
File uploadSelect your .zip of songs.
Upload and extractUploads the archive and unpacks/catalogues the songs.
StatusShows progress and the result of the upload.
To protect the music archive, uploads are only enabled after some paperwork. If you don't see an upload button, contact support.
Menu › Music Boxes — pages musicbox.aspx / musicboxdetail.aspx

Music Boxes

A Music Box is a rule-based pool of songs. Instead of building fixed playlists, you describe the kind of music you want (genre, popularity, mood, tempo, language, complexity…) and the Music Box automatically selects matching songs. The menu (musicbox.aspx) lists your boxes (Name, Description, Age Groups, Radio); clicking one opens the detail editor (musicboxdetail.aspx).

A Music Box picks the next song from rules, not a fixed list Whole library all songs Genre pool weighted % per genre Filters relevance · popularity · complexity bands Mix tempo · language Next song "Allow less/more …" = share of picks where that floor/cap is ignored: ~80% strict (≥ floor) ~20% relaxed e.g. Minimum popularity 60, Allow less 20 → roughly one pick in five drops the floor. Set 100 to waive a limit always, 0 to enforce it strictly.
You describe the music; the box weighs genres, applies the score bands, occasionally relaxes a soft limit, and respects your tempo/language mix to choose each song.

Basics

FieldMeaning
RadioStation the box belongs to.
Name / DescriptionLabel and notes for the box.
Age groupsTarget listener age bands (5-15, 15-25, 25-35, 35-65, 65+) the music should suit.

Selection rules (relevance, popularity, complexity)

Every song carries three scores from 0 to 100:

  • Relevance — how significant the song is in the context of music history (its lasting importance), independent of how well-known it is.
  • Popularity — how popular the song actually became (in parts of the world).
  • Complexity — how musically complex/demanding the song is.

For each score you set a minimum (and, for popularity/complexity, a maximum) that a song must meet to enter the box. A minimum of 0 means "no minimum"; a maximum of 100 means "no maximum".

How "Allow less / more … for" works (important): these are percentages, not absolute amounts. The value is the share of song picks in which the corresponding limit is simply ignored, so the pool is temporarily widened. Example: with Minimum popularity = 60 and Allow less popularity for = 20, roughly 80% of the time only songs with popularity ≥ 60 are eligible, and in the other ~20% the popularity floor is dropped so less-popular songs can also be chosen. Set such a field to 100 to waive that limit every time, or 0 to enforce it strictly.
FieldMeaning
Minimum relevanceA song needs at least this music-history relevance score (0–100) to be included. 0 = don't filter by relevance.
Minimum / Maximum popularityThe allowed popularity band (0–100): a song's popularity must be ≥ minimum and ≤ maximum.
Minimum / Maximum complexityThe allowed complexity band (0–100): a song's complexity must be ≥ minimum and ≤ maximum.
Allow less relevance for% of picks in which the minimum relevance is ignored (lets in less historically relevant songs that often).
Allow less popularity for% of picks in which the minimum popularity is ignored (lets in less popular songs).
Allow more popularity for% of picks in which the maximum popularity is ignored (lets in more popular songs than the cap).
Allow less complexity for% of picks in which the minimum complexity is ignored (lets in simpler songs).
Allow more complexity for% of picks in which the maximum complexity is ignored (lets in more complex songs than the cap).
Allow RemixesIf off, remix versions are excluded; if on, they may be selected.
Take unknownIf on, songs that have no rating yet (relevance/popularity/complexity of 0 or unknown speed) are still allowed in, instead of being filtered out.

Tempo & language mix

FieldMeaning
Slow / Medium / Fast / Very fast songsThe desired share of each tempo band in the rotation.
Songs Language (several rows)The desired percentage mix of song languages. The remainder up to 100% is shared by all languages; using more than 100% total can cause unexpected behaviour.

Character lists

Using the + / buttons you build lists that further shape the box:

ListMeaning
Song speedsSpecific tempo characteristics to include.
Song moodsDesired moods (happy, melancholic, energetic…).
Lyric themesSubject matter of the lyrics.
Energy LevelsDesired energy of the tracks.
GenresThe genres/sub-genres the box draws from.
ButtonAction
Speichern (Save)Stores the Music Box.
Löschen (Delete)Removes the box.
Abbrechen (Cancel)Leaves without saving.
Some buttons on this screen are labelled in German (Speichern = Save, Löschen = Delete, Abbrechen = Cancel) in the current build.
Menu › MusicBox Analysis — pages musicboxdetails.aspx / musicboxsongs.aspx

MusicBox Analysis

This report shows how many songs each Music Box actually yields as its rules get progressively relaxed — so you can see whether a box is too strict (too few songs) or too loose. Pick a station first; if none is chosen you'll see "Please select a radio to see its MusicBoxes."

ColumnMeaning
MusicBoxThe box being analysed.
GenresGenres the box uses.
Pool (genre)How many songs exist in those genres at all.
After hard filtersSongs remaining after the strict, non-negotiable rules.
Strict (~85% case)Typical pool size under normal strict matching.
+ Relax relevance / popularity / complexityHow the pool grows as each constraint is loosened.
Universe (max.)The absolute maximum number of candidate songs.
Played 90d / Plays 90dHow many of the box's songs were played in the last 90 days, and the total number of plays.
RatingAn overall health rating for the box.

Songs in a box (musicboxsongs.aspx)

Lists the individual Artist / Song entries a box currently contains, each with Block song / Block artist controls and a link to the banned list.

Playlist › Banned songs / artists — page bannedsongs.aspx

Banned songs & artists

The list of everything you've blocked. It has two tables — banned songs and banned artists — and lets you lift a ban.

ColumnMeaning
Artist (/ Song)The banned artist, or artist + title for a banned song.
bannedWhen the ban was set.
Remove banUn-blocks the song/artist so it can play again.

If nothing is blocked you'll see "No banned songs found." / "No banned artists found."

Menu › Streaming — pages streaming.aspx / streamingdetail.aspx

Streaming

This is where the finished live audio is sent out to one or more streaming providers (servers that listeners or platforms connect to, such as Icecast or a DAB+ feed). The menu (streaming.aspx, "Streaming Providers") lists configured outputs (Active, Name, URL, Radio, Type); clicking one opens the detail editor.

From finished audio to listeners Your live audio the finished hour MasterStreamer pushes your settings Icecast server DAB+ / other feeds web player & directories Listeners on any device You only fill in each output's address, codec and bitrate here; the background streamer does the pushing. One station can feed several providers at once.
Each streaming output is one destination for your audio; configure them here and the MasterStreamer keeps them fed.
FieldMeaning
RadioWhich station's audio this output carries.
NameA label for this streaming output.
Radio Program onThe program/source feeding this stream.
TypeThe streaming server type (e.g. Icecast).
Hostname or IPAddress of the streaming server.
PortNetwork port the server listens on.
MountpointThe path on the server this stream is published at (e.g. /live).
Username / PasswordCredentials to push audio to the server.
CodecAudio format used (e.g. MP3, AAC).
BitrateStreaming quality in kbps (higher = better quality, more bandwidth).
Metadata FormatHow "now playing" info is sent to the server.
Stream Name / Stream DescriptionPublic title and description shown in directories/players.
Public Stream URLThe address listeners use.
GenreGenre tag advertised for the stream.
Is activeWhether this output is currently streaming.
Save / Delete / CancelStore, remove, or discard changes.
Behind the scenes the MasterStreamer / RadioStreamer background programs read these settings and push the audio to the server. You configure them here — you never run them yourself.
Menu › Podcasts — pages listpodcast.aspx / podcast.aspx

Podcasts

RadioButler can also produce podcast episodes automatically from your news/requests. The menu lists your podcasts; clicking one opens its editor.

How a podcast episode is built Request → news count news items AI writes script prompt · model · temp 1 or 2 presenters two = a dialogue Episode intro/outro bed · on schedule Choose one voice for a monologue or two for a back-and-forth; a new episode is produced automatically on the days and time you set.
Podcasts reuse the same news engine, wrapped as a scheduled episode with one or two hosts and an intro/outro bed.
FieldMeaning
Name / DescriptionTitle and description of the podcast.
RadioStation the podcast belongs to.
DaysWeekdays a new episode is produced.
Create timeThe time of day the episode is generated.
Podcast AI modelAI model that writes the episode script.
Podcast RequestWhich Request supplies the content.
Count newsHow many news items to include.
Podcast promptThe writing instruction for the episode.
Max tokens / temperatureGone since August 2026. Current models ignore temperature, and max tokens was only ever a length cap — on ChatGPT and DeepSeek neither value was even sent. The one control that still matters, how hard the model thinks, now lives on the model entry as Effort; see AI models.
Presenter 1 / Presenter 2The voice(s) hosting the podcast (two enable a dialogue).
Podcast Intro (and bed)Opening audio/music bed.
Podcast OutroClosing audio.
Speech start (seconds)When speaking begins over the intro bed.
Save changes / Delete podcastStore or remove the podcast.
Menu › eMail accounts — pages EMailList.aspx / emailaccount.aspx

eMail accounts

An e-mail account lets RadioButler receive information by e-mail and turn it into on-air content — for example breaking-news alerts or listener submissions sent to a dedicated mailbox. The menu lists your accounts; the editor configures one inbox and how incoming mail is processed.

From inbox to on air Inbox (IMAP) sender whitelist Source + Request turns mail into a news item AI rewrites it prompt · model · voice Breaking-news item spoken over a bed Only mail from whitelisted senders is processed (substring match; an empty whitelist blocks everything). The rest is written and voiced like any other news.
A dedicated mailbox becomes an input channel: trusted senders' mail is rewritten by AI and can air as breaking news.

Mailbox connection

FieldMeaning
Your Name of the EMail AccountA label you recognise this account by.
RadioStation this mailbox feeds.
ActiveWhether the account is being checked.
HostnameThe incoming mail server (IMAP host).
PortMail server port.
UserName / PasswordMailbox login credentials.
Use SSLConnect securely (encrypted).
CheckInterval (seconds)How often to check for new mail.
Allow EMail AddressesA sender whitelist — only mail from matching senders is processed. Enter a comma-separated list (case-insensitive). Matching is by substring, not wildcards: * does not work. You may enter full addresses (news@example.com) or a domain part (@example.com allows the whole domain). An empty field blocks everything (nothing is processed). To allow all senders, enter a fragment every address contains, e.g. @.

Processing incoming mail into content

FieldMeaning
Source / RequestThe Source and Request used to turn the e-mail into a news item.
SpeakerWhich presenter reads the resulting content.
AI machine modelAI model used to rewrite the e-mail.
PromptInstruction telling the AI how to convert the mail.
Max tokens / temperatureGone since August 2026. Current models ignore temperature, and max tokens was only ever a length cap — on ChatGPT and DeepSeek neither value was even sent. The one control that still matters, how hard the model thinks, now lives on the model entry as Effort; see AI models.
Breakingnews bedBackground audio used when the item airs as breaking news.
StartnextWhen speech starts over that bed.
Save changes / Delete eMailAccountStore or remove the account.
Menu › Calls — page calls.aspx

Calls

Incoming calls lists recent listener phone-ins handled by ElevenLabs AI voice agents. Click a date to see a summary and full transcript of the call. You review them here and decide which may be broadcast. (Whether calls are auto-checked first is set on the Radio station page.)

From phone-in to broadcast Listener calls asks / greets / requests AI voice agent ElevenLabs talks live Recorded + transcript you review & approve Edited audio on air if checked / approved This page is the review desk: each call has a raw recording, an edited version and a Checked/Broadcasted state. Optional auto-checking is set on the Radio page.
Calls are answered by an AI voice agent, recorded and transcribed; you decide here which ones reach the air.
ColumnMeaning
DateWhen the call happened (click to open the summary/transcript).
RadioStation that received the call.
SpeakerThe presenter/agent that handled it.
DurationLength of the call.
MessagesNumber of message exchanges in the call.
Song requestedAny song the caller asked for.
Original audioThe raw recording.
Edited audioThe cleaned/trimmed version for air.
BroadcastedWhether it has been aired.
CheckedWhether it has been reviewed/approved.
Löschen (Delete)Removes the call record.

If there are none you'll see "No calls".

Menu › Campaigns — pages listcampaigns.aspx / campaign.aspx / spot.aspx

Campaigns (advertising)

Advertising is organised as Campaigns, each containing one or more Spots (the individual adverts). A campaign defines when and how often its spots run; the station's Ad position / Max spots settings decide where in the hour they land. The menu lists campaigns; clicking one opens the campaign editor.

Campaigns hold spots; the station decides where they land Campaign weight · dates · hours/days Spot A Spot B Spot C The hour :00:59 ad ad Ad positions & max spots come from the Radio page — the campaign only sets when/how often. Weight sets how often a campaign's spots play versus other live campaigns; hours/days and dates gate eligibility.
A campaign is a bundle of spots with timing and weight; the station's ad-position settings decide the actual slots in the hour.

Campaign editor (campaign.aspx)

FieldMeaning
Campaign nameA label for the campaign.
Play from / Play untilThe start and end dates the campaign is live.
WeightPriority/frequency of this campaign relative to others (higher = plays more often).
Hours (00h–23h checkboxes)Which hours of the day the spots may run.
Days (Mon–Sun checkboxes)Which weekdays the spots may run.
Add spotAdds a new advert to the campaign (opens the spot editor).
Save changes / Delete campaignStore or remove the campaign.

Spot editor (spot.aspx)

FieldMeaning
Spot nameName of the individual advert.
Spot descriptionNotes about the advert (and where its audio is managed).
Save changes / Delete spotStore or remove the spot.
Menu › Account — pages account.aspx / transaction.aspx

Account & balance

Your Account page shows your prepaid credit and the history of what you've spent and topped up. RadioButler is pay-as-you-go: each produced item is deducted from this balance.

ElementMeaning
Actual balanceYour current remaining credit.
TransactionsA list of all movements — top-ups (e.g. via PayPal) and charges for produced content. Click one to open its detail (transaction.aspx).
You load credit (any amount) onto the account, typically via PayPal, and start ordering content immediately. Costs are deducted automatically per item as described in the introduction.
page customer.aspx

Customer profile

Your own account/company details — the billing contact behind the login. Reached from account-related links.

FieldMeaning
Company name / NameYour company/organisation name.
First name / Last nameThe contact person's name.
Address line 1 / Address line 2Street address.
City / Zip / CountryTown, postcode and country.
eMailYour login/contact e-mail address.
Reset passwordChange your account password.
Save changesStores your profile.
Delete your accountCloses your account.
Deleting your account is permanent. It removes your login and associated data — a confirmation is required first.
Menu › (Admin) Test getdata, etc.

Admin & test tools

Administrator accounts see a few extra items used for setup and troubleshooting. Normal users can ignore this chapter.

ToolPurpose
Test getdata (testrequestsource.aspx)Runs a source/request on demand and shows the raw data it returns — used to verify a Source is configured correctly. The Get data button triggers the fetch.
AI test dialog (dialog.aspx)A scratch page to try a single AI prompt: pick an AI Model, type a Prompt and some Raw information, and see the result. Handy for tuning prompts before saving them on a real screen.
Test music expert (testmusicexpert.aspx)Tries the "music expert" song-talk generation in isolation.
Internal helper pagesSeveral non-menu URLs exist for the system itself (e.g. runscheduler, getstreamurl, stopstream, streamisactive, checkCall, listenerinfos). These are called automatically by the background programs, not used by hand.
Reference

Background programs (overview only)

RadioButler's website is the control panel; the actual work is done by a large set of small background programs running on the server. You never start or operate these directly — the switches and fields on the website tell them what to do. They are listed here only so you understand what a button on a page actually sets in motion. (Per your request, these are mentioned, not individually documented.)

The website is the control panel — programs do the work The website — your settings (Radio, Templates, Sources, Music Boxes, Streaming …) Newscollectors Weather& traffic AI producersfeatures · podcasts Musicmanagement Voicespeech · calls Streamingpush to providers Your live broadcast → listeners You never start these programs. Every field you set on the website becomes an instruction they carry out automatically, around the clock.
One mental model for the whole system: the website is where you decide things; an army of small background programs turns those decisions into a running radio station.
CategoryExamples & what they do (triggered by website settings)
News collectorsDozens of fetchers such as GetAINews, GetWDRNews, GetSpiegelOnline, GetIcelandNews, GetBusinessNews, GetGamingNews, regional and Schlager feeds, etc. They read the Sources and Requests you define.
Weather & trafficCreateAIWeather, GetCountryWeather, GetTomTomTraffic, GetBingTraffic, GetTraffic — fed by the weather/traffic fields on the Radio station page.
AI content producersCreateAIFeatures, CreateAIAudioNews, CreateAILocalNews, CreateAIPodcasts, DayInRockHistory, GetHoroscope — produce the Features, news and Podcasts you configure.
StreamingMasterStreamer, RadioStreamer, SingleRadioStreamer, Stream2IceCast, CheckAndRestartIceCastAndMasterStreamer — send the live audio to the Streaming providers and keep them running.
Music managementGetAndCopyMusic, InsertMusicFromExternSource, HandleUnhandledSongs, CheckForMissingSongs, DeleteDuplicates, PlayListCreator, MusicExpert — build and maintain the library and Music Boxes.
Voice / speech & callsSpeechMaster, Text2Speech, ElevenLabs, GetElevenLabsConversations — turn text into audio and fetch call transcripts.
E-mail, listeners & billingReadEMails/EMailCollector (feed eMail accounts), GetActualListeners/ListenerInfos (audience stats), Invoicer (billing), BuildProgramFromSchedule (turns your templates into hourly programs).
There are also numerous …Test… projects (e.g. RadioStreamerTest2…11). These are developer experiments and have no role in day-to-day operation.
Music Archive — separate web application

Music Archive — overview

The RadioButler Music Archive is a separate web application (titled "RadioButler music archive") used to curate the central music library: the artists, the songs and all the metadata that the main RadioButler uses to choose music. It is where songs get their genres, moods, energy and other tags — exactly the properties the Music Boxes later filter on. You log in with your account; some actions (e.g. seeing every radio's genres) are reserved for administrators.

Area (top menu)Purpose
Search (Home)Find artists and songs, merge duplicates, and open a song or artist to edit it.
GenresManage Genres and Sub-Genres and the links between them (the heart of how music is organised).
Login / LogoutSign in to your archive account; sign out.
How the Archive connects to your station: Songs are uploaded in the main app (Song upload) under a Sub-Genre. In the Archive those Sub-Genres are bundled into Genres. Your Music Boxes select by Genre, which expands to its Sub-Genres, which resolve to the actual songs. So the Archive's Genre/Sub-Genre structure directly decides what a Music Box can play.
Genre → Sub-Genre → songs: what a Music Box can reach Music Box asks for a Genre Genre a bundle of… Sub-Genre (e.g. "synthpop") Sub-Genre Sub-Genre (seasonal?) Songs tagged by Sub-Genre Song upload tags each song with a Sub-Genre; mapping Sub-Genres into a Genre is what makes those songs reachable. A Sub-Genre's seasonal window can limit it to, e.g., December.
The Archive's job is this chain: tag songs with Sub-Genres, bundle Sub-Genres into Genres, and your Music Boxes pick by Genre.
Music Archive › Genres

Genres & Sub-Genres

This is the most important screen in the Archive. RadioButler organises music on two levels, and this page manages both and the link between them.

LevelWhat it is
GenreA broad, top-level category (e.g. "Rock", "Schlager", "Christmas"). This is the level your Music Boxes choose from. A Genre can be global ("All radios") or tied to one station.
Sub-GenreA fine-grained tag (internally an "ArtistSongGenre", often a Spotify-style genre such as "german pop punk"). Songs are tagged with Sub-Genres, not directly with Genres.

The connection: a Genre is essentially a bundle of Sub-Genres (stored as "GenreSpotifyGenre" links). When a Music Box asks for a Genre, RadioButler expands it to all its mapped Sub-Genres, and from those to the songs carrying those Sub-Genre tags. Mapping the right Sub-Genres into a Genre is therefore what decides which songs a Genre — and any Music Box using it — can play.

Top of the page — choose / add / edit a Genre

ControlMeaning
Genre drop-downPick the Genre you want to work on. Radio-specific genres show as "Name (RadioName)". Selecting one ticks the Sub-Genres currently mapped to it (see below).
+ (Add)Opens the Genre dialog to create a new Genre.
EditOpens the same dialog for the selected Genre.
Genre dialog — Genre NameThe Genre's name.
Genre dialog — RadioTie it to one station, or "--- All radios ---" for a global genre.
Genre dialog — Save / DeleteStore the genre, or delete it. Deleting a Genre also removes all its Sub-Genre links (the songs and Sub-Genres themselves stay).

Add Sub-Genre

Creates a new Sub-Genre. Besides its name, a Sub-Genre can carry a seasonal window — outside that date range songs of this Sub-Genre are not played (this is what powers, e.g., Christmas music only appearing in December; it matches the seasonal rule the song selector applies).

FieldMeaning
Sub-Genre NameThe name of the new Sub-Genre (required).
Allow Day from / MonthStart of the seasonal window (day and month) in which this Sub-Genre may be used.
Allow Until Day / MonthEnd of the seasonal window. Leave the window empty for an all-year Sub-Genre.
AddCreates the Sub-Genre.

Sub-Genres list & mapping

All Sub-Genres are listed as checkboxes. This is where you connect Sub-Genres to the Genre chosen at the top.

ElementMeaning
Checkbox per Sub-GenreTick the Sub-Genres that should belong to the selected Genre.
Bold nameA Sub-Genre shown in bold is not yet mapped to any Genre — a quick way to spot orphaned Sub-Genres that no Genre (and therefore no Music Box) can reach.
Sub-Genre name (link)Opens the list of songs in that Sub-Genre (see below).
SaveStores the ticked Sub-Genres as the mapping for the selected Genre.

Songs in a Sub-Genre / rename / delete / combine

Clicking a Sub-Genre opens its song list, where you can also rename or delete it. A separate "Combine" screen lets you merge Sub-Genres.

ActionMeaning
Songs listEvery song currently tagged with this Sub-Genre.
Update Sub-Genre (name)Rename the Sub-Genre.
Delete Sub-GenreRemoves the Sub-Genre.
Combine Sub-GenreMerge this Sub-Genre into one or more selected other Sub-Genres — used to clean up near-duplicate Spotify genres so songs end up under a single, meaningful Sub-Genre.
Music Archive › Song details

Song details

The full record of one song. Many of these fields are the very properties Music Boxes filter on, so accurate tagging here directly improves music selection. The page also shows play history, recommendations and chart positions.

Field / areaMeaning
Play on Radio StationPick one of your stations to (test-)play or add the song there.
Main LanguageThe song's language (used by Music Box language-mix rules).
Song description / Song informationFree-text notes and gathered information about the song.
Popular for age groupsWhich listener age bands the song suits (5-15, 15-25, 25-35, 35-65, 65+) — matches the Music Box age groups.
Song moodsCheckboxes such as Happy/Joyful, Relaxed/Chill, Nostalgic, Epic/Dramatic, Sad/Melancholy, Romantic/Passionate, Hopeful/Optimistic, Energetic/Pumped-up, Angry/Aggressive, Mysterious/Eerie. These feed the Music Box "Song moods" list.
Lyric themesCheckboxes such as Love & Romance, Party & Celebration, Nature, Empowerment, Conflict & War, Everyday Life, Heartbreak, Social/Politics, Storytelling, Loss & Grief, Fantasy, Spirituality, Friendship, Protest, Self-Reflection, Hope, Travel, Instrumentals. Feeds the Music Box "Lyric themes".
Energy LevelsLow / Medium / High — feeds the Music Box "Energy Levels".
Genres (checkboxes)The Genre(s) this song belongs to (via its Sub-Genres). Connects the song to Genres & Sub-Genres.
Useful as Opener?Whether the song works as a show opener.
Cue In / Cue Out / Fade In / Fade Out / Ramp1The song's playout timing points — where it effectively starts/ends and how it fades. These are the same values the streamer uses for smooth transitions (see Bed timing). Ramp1 is the song's intro length, used to overlap a presenter opener with the song's instrumental intro.
Spotify audio featuresImported analysis such as tempo, danceability, energy, valence, loudness, etc. (read-mostly) that inform tagging.
RecommendationsRelated songs; you can add or delete recommendations.
Chart positionsThe song's chart history per country.
Played infosWhere/when the song has been played.
AnecdotesBackground stories about the song/artist (per language) the presenter can use on air.
Add to playlist / Update songAdd the song to a station's playlist, or save your changes.
Music Archive › Artist details

Artist details

The record of one artist: their information, their songs, and "anecdotes" the presenter can tell on air.

Field / areaMeaning
Artist informationEditable details/biography of the artist (Update Artist saves changes).
SongsAll songs by this artist, each linking to its Song details.
AnecdotesShort background stories about the artist, each with a Language and optionally tied to a specific Song. You can Add, Edit and Delete anecdotes. The presenter can weave these into music moderations.