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.
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 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:
- 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
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.
| Term | What it means in RadioButler |
|---|---|
| Customer / Account | Your 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. |
| Voice | The technical text-to-speech voice (from ElevenLabs) that turns written text into spoken audio. A presenter "uses" a voice. |
| AI (machine) model | The 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. |
| Source | Where raw information comes from: an RSS feed, a web page to scrape, or an e-mail inbox. Sources deliver the articles the AI rewrites. |
| Request | A saved "ask" that filters sources by keywords/topics and tells the AI how to turn the result into a finished news item or feature. |
| News | A single finished, broadcast-ready news story (text + audio). "Local news" is the regional variant. |
| Feature | A longer recurring AI segment (story, business report, "day in history", etc.) with its own schedule. |
| Radio Program | The 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. |
| Scheduler | The weekly calendar grid where you assign Program Schedules to days and hours. |
| Music Box | A defined "pool" of music — a set of rules (genre, popularity, mood, tempo, language…) that selects which songs may play. |
| Block | A timed audio element that must appear at a precise moment (e.g. a top-of-hour time signal or sponsored slot). |
| Jingle | A short station audio ident inserted automatically between elements. |
| Campaign / Spot | Advertising: a campaign groups adverts ("spots") with run dates, hours and weighting. |
| Streaming provider | An output server (e.g. Icecast, DAB+) that receives the finished live audio. |
| Bed | Background 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.
| Value | What it does |
|---|---|
| Cue-in | The 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 next | How 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-out | The 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. |
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.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.Getting started: register & log in
Registration (the public home page)
On the public site 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.
| Field | What to enter |
|---|---|
| Company | Your company or organisation name (the billing entity). Required. |
| Name of your radio station | The on-air name of your first station, e.g. "The Rock Radio". Required. |
| Music Genre | One favourite genre to start with (drop-down). You add more, finer genres later. Required. |
| Language | The 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 hour | Checkbox — switch on to get an automatic world-news bulletin at the top of every hour. |
| Country weather after the news | Checkbox — adds a national weather forecast after the news (can be narrowed to a city/region later). |
| Traffic around your ZIP code | Checkbox — adds live traffic reports around your postcode (radius adjustable later). |
| First name / Last name | Your name as the account contact. Required. |
| Address line 1 / 2, City, Zip | Postal 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. |
| Country | Country 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 eMail | Your login e-mail address, entered twice so typos are caught. Required and must match. |
| Password / Confirm password | Your 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.
| Field | What to enter |
|---|---|
| Your username | The e-mail address you registered with. |
| password | Your 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. |
The navigation menu
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.
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.
| Section | What it shows / does |
|---|---|
| Your radio stations | Every station on your account, each clickable to open its settings. Add radio station opens a blank station form (see Radio stations). |
| Your presenter | Your on-air presenter personas. Add presenter opens the presenter editor (see Presenters). |
| Your AI machine models | The AI language models you've registered. Add AI machine model opens the model editor (see AI Models). |
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.
Identity
| Field | Meaning |
|---|---|
| Name | The station's name, used on air and across the system. |
| Country | Country the station operates in (drop-down). Affects available content/services. If missing, e-mail addcountry@radiobutler.com. |
| Standard language | Default language for generated text and speech. Individual programs can override it. |
| Location ZIP code | The 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 / Longitude | The station's coordinates. Filled in automatically from the ZIP code — you only set them by hand if the lookup can't find your location. |
DAB+ (digital radio broadcasting)
| Field | Meaning |
|---|---|
| DAB+ Id | Your station identifier on the DAB+ digital-radio platform (only if you broadcast via DAB+). |
| DAB+ Token | The access token/key that authorises uploads to that DAB+ service. |
Music & replay behaviour
| Field | Meaning |
|---|---|
| Uses MusicBox | Decides 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. Off — no 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 song | Percentage 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 song | Percentage 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 jingles | Minimum minutes that must pass before another jingle is allowed. |
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:
- 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.
- The moderation plays.
- 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.
- 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.
Incoming call auto-check
| Field | Meaning |
|---|---|
| Autocheck incoming calls | Checkbox. If on, AI automatically reviews phone-in calls for suitability before they can be broadcast. |
| Minimum messages in call | A call must contain at least this many exchanged messages to count as usable. |
| Check call prompt | The 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 model | Which 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:
| Placeholder | Replaced 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. |
| Field | Meaning |
|---|---|
| Music request e-mail subject | The 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.
| Field | Meaning |
|---|---|
| Facebook machine model | AI model that writes the Facebook posts. |
| Facebook PageId | The numeric ID of your Facebook page. |
| Facebook AccessToken | The access token that authorises posting to that page. |
| Default facebook prompt | Standard instruction telling the AI how to write each post. |
| Facebook Message Footer | Fixed text appended to every post (e.g. hashtags, station tagline). |
| Facebook Message Image Url | Default image shown with posts. |
| Facebook keywords | Words 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 template | URL of a fixed background image every news post is built on. Empty means each post gets its own generated AI image, as before. |
| Facebook logo | URL 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.
| Track | When it fires | What goes out |
|---|---|---|
| 1 — Relevance | The 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 — Keywords | The 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.
| Point | What it means |
|---|---|
| Where it goes | Facebook image template under Manage radio. A full URL to a publicly reachable image. |
| Size | Anything. 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 picture | The headline is drawn on top. A template that already carries words ends up with two layers of type. |
| No dark bar either | The 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 headlines | The type shrinks until the headline fits three lines. Only something genuinely extreme is cut off, with an ellipsis. |
| Cost | None. The picture is composed on the station's own machine, so the image price of a social media post does not apply. |
| The logo | Set 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 fails | Unreachable 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.
| Field | Meaning |
|---|---|
| Sum compressor | Checkbox to switch the compressor on for the whole output. |
| Threshold (db) | Level above which the compressor starts reducing volume. |
| Ratio 1:x | How 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). |
News & weather (station defaults)
These defaults apply when a program doesn't specify its own news settings.
| Field | Meaning |
|---|---|
| Radio wants news / weather | Master switch: does this station produce news/weather at all. |
| Default news request 1/2/3 & count | Up 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 presenter | Which presenter reads the news by default. |
| News Bed | Upload 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 Seperator | Upload a short audio sting played between individual news items. |
| News Seperator StartNext (seconds) | Timing of the next item relative to the separator. |
| Default news prompt | Standard AI instruction for writing news bulletins. |
| Max tokens / temperature | Gone 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 news | How many stories the station's Additional news bulletin contains — the x most relevant ones. Default 2. |
| Min / Max words in news | Allowed 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.
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.
| Field | Meaning |
|---|---|
| Opener | Upload 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
| Field | Meaning |
|---|---|
| Default local news presenter | Presenter who reads local news. |
| Local News Bed / StartNext | Background audio for local news and when speech begins over it. |
| Default local news prompt | AI instruction for local-news writing. |
| Count local news in programs | Default 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.
How it is built
Where the data comes from
| Source | When it is used |
|---|---|
| The live weather service | The 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 url | Fill 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 forecast | Stations 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. |
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
| Field | Meaning |
|---|---|
| Default weather presenter | Who 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 code | The place the forecast is about. The postcode is what turns into coordinates. |
| Weather url | Optional: 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 prompt | How 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.
The filters, in order
| Filter | What it does |
|---|---|
| Duplicates | The 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 delay | Your 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 roadworks | Anything 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 closures | A closure that is not long-term goes on air even without a jam. |
| Order and cut | Your 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.
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.
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.
From data to audio
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.
The fields
These are the station's defaults. A Radio Program can override them for its own hour — prompt, radius, presenter, how many reports.
| Field | Meaning |
|---|---|
| Traffic default AI Model | The AI that writes the announcement. Without it no traffic is produced at all. |
| Default traffic presenter | Who reads it. |
| Traffic Bed / StartNext | The 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 Key | The live-traffic data. As soon as a HERE key is present it is used, with flow and incidents as described above. |
| TomTom API Key | The 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 / longitude | The 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 roads | The 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 traffics | How many reports the announcement may contain at most. Left at 0, three are used. |
| Traffic default prompt | How 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 prompt | What to say when there is nothing to report. |
| How to get traffic | Read-only help describing the manual call/download URLs to trigger and fetch a traffic announcement on demand. |
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.
| Field | Meaning |
|---|---|
| Music expert AI Model | The 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. |
Feature length limits
| Field | Meaning |
|---|---|
| Words in features | Target word count for feature segments. |
| Max source words | Hard cap on how much source text is fed to the AI (controls cost/length). |
Advertising defaults
| Field | Meaning |
|---|---|
| Ad seperator | Upload a sting played before/after the advertising block. |
| Ad position | Where 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 spots | Maximum adverts per break. |
Activation & saving
| Field | Meaning |
|---|---|
| Active | Checkbox — whether the station is live/producing. Untick to pause it. |
| Save changes | Stores all settings on this page. |
| Delete radio station | Permanently removes the station and its requests, presenters, songs etc. |
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.
| Field | Meaning |
|---|---|
| Name | The presenter's full name (used internally and possibly on air). |
| Nick name | Short/on-air name the presenter is referred to by. |
| Radio | Which station this presenter belongs to. |
| Language | The language this presenter speaks. |
| Gender | The presenter's voice gender (helps the AI write fitting wording). |
| Voice | The text-to-speech Voice used to speak this presenter's lines. |
| ElevenLabs VoiceAgent ID | Links 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 speed | Fine-tune the pitch (higher/lower) and talking speed of the voice. |
| Character / Description | A 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 Hellos | A 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 / Picture | A photo/avatar of the presenter (e.g. for the web player). |
| Test text + Test audio | Type a sample sentence and press Test to hear how this presenter/voice sounds. |
| Active | Whether 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:
| Group | Fields & meaning |
|---|---|
| EQ | Loudness / Bass / Treble — basic tone controls for the voice. |
| Compressor | Attack (ms) / Ratio (1:x) / Threshold (db) — evens out the voice's volume (same idea as the station sum compressor). |
| Normalizer | Brings the voice to a consistent target level. |
| Button | Action |
|---|---|
| Save changes | Stores the presenter. |
| Refresh / Refresh radio presenter | Reloads/re-syncs the presenter's data (e.g. after changing the linked voice/agent). |
| Delete radio presenter | Removes this presenter. |
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.)
| Field | Meaning |
|---|---|
| Name | A label for this voice in your list. |
| First name | The human first name associated with the voice. |
| Description | Notes about how the voice sounds (e.g. "deep male, calm"). |
| Gender | Voice gender. |
| Language | Language the voice is intended for. |
| Provider | The TTS model/version. Only ElevenLabs models are offered (v1 / v2 / v2.5 Turbo / v3); Google is no longer used. |
| Voice provided by / Voice char currency | Attribution and the currency used for this voice's character pricing. |
| External ID (ElevenLabs only) | The voice's ID inside ElevenLabs. |
| Default API Bearer | The API key/token used to call the provider for this voice. |
| Only for radio | Restrict the voice to a specific station. |
| Picture path / Path sound example | Optional image and a sample-audio file path to preview the voice. |
| Char net price / 1000 chars & currency | The 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 speed | How fast the voice talks. |
| Save changes / Delete voice | Store or remove this voice. |
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.
| Field | Meaning & 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. |
| Name | Your 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 Bearer | Your 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 message | A 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. |
| Effort | How 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 streaming | Whether 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 model | Store or remove this entry. Deleting cannot be undone, and any screen still pointing at it will lose its model. |
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.
| Field | Meaning & effect |
|---|---|
| Radio | Which station this player streams and shows "now playing" for. Switching it loads that station's player settings. |
| Player language | The language of the player's own interface wording (buttons, "now playing", "up next" …). |
| Radio Player URL | The direct link to your hosted player — share it as-is, or open it to preview your changes. |
| Title / Your radio name | The station name shown prominently in the player. |
| Text Color | The colour of the player's text (e.g. #ffffff or a CSS colour name). |
| Path main image | A 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 programs | If 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 Favicon | A link (URL) to the small icon shown in the browser tab when the player is opened on its own. |
| Footer text color / Footer background color | The colours of the player's footer bar. |
| Footer HTML | Your own HTML placed in the footer area (e.g. social links or a tagline). |
| Imprint HTML | Your 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 player | Store or remove this player configuration. Deleting cannot be undone. |
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).
| Music Wish field | Meaning |
|---|---|
| Artist | The performer the listener wants to hear. |
| Song | The specific track requested. |
| First name | The listener's first name — used when the greeting is read out. |
| City (Wohnort) | Where the listener is from. |
| Contact address for the listener. | |
| Greeting (max 250) | A short, friendly message to friends, family or colleagues — capped at 250 characters. |
| Send wish | Submits the request; it is queued and normally played within a few minutes. |
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:
| Endpoint (GET) | Parameters | Returns / behaviour |
|---|---|---|
| search-artists.ashx | query (≥ 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.ashx | song (≥ 2 chars) and/or artistId, plus radioId | Up 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.ashx | radioid, 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.ashx | radioid, songid, wishedby, wishedbyemail, greetingtext | Records the wish. Responds { "message": "Ok" } on success, otherwise { "message": "Error" } or an HTTP 400 with an { "error": "…" } message. |
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.How the song search works (in detail)
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 in | How it works |
|---|---|
| Artist first | The 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 directly | The 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:
| Filter (applied in this order) | What it means |
|---|---|
| Real audio file | The 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 / artist | The 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 banned | Anything 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 optional | If 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 10 | Up 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 key | Why |
|---|---|
| 1 · Recent popularity | Tracks 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 length | Song 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 · Alphabetical | Finally, ties are broken by song title (A→Z) so the order is stable and predictable. |
When a song counts as “in your MusicBox”
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:
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.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
| Rule | Detail |
|---|---|
| Known, active station | The radioid must belong to an existing, active radio — otherwise { "error": "Unknown radio" }. |
| Known song | The 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 length | The greeting is capped at 250 characters; longer text is rejected. |
| Availability & bans | Only 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:
| Stage | What happens |
|---|---|
| ① Submit checks | Instant, 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. |
| ③ Playout | When 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-mail | Once 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. |
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 need | Detail |
|---|---|
| Base URL | https://www.radiobutler.com/ — keep the trailing slash. |
| Your radio id | The 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. |
| HTTPS | Serve 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 parameters | Returns |
|---|---|---|
| search-artists.ashx | query (≥2), radioId | [{ Id, Name }] |
| search-songs.ashx | song (≥2) and/or artistId, radioId | [{ Id, SongName, ArtistId, ArtistName, Duration }] |
| wishasong.ashx | radioid, songid, wishedby, wishedbyemail, greetingtext | { "message": "Ok" } · { "message": "Error" } · HTTP 400 { "error": "…" } |
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" }
}
}
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.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.
| Element | Meaning |
|---|---|
| Customer / radio drop-down | At the top: pick which station's week you are looking at. |
| Week header | Shows the week being displayed; navigation lets you move to other weeks. |
| Top row (days) | The days of the week as columns. |
| + (add) button | Top-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 hour | Click the program name in a block to open and edit that hour's Radio Program. |
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.
| Element | Meaning |
|---|---|
| List of templates | Each row is a Program Schedule; click its name to open and edit it. |
| Add program schedule | Creates 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. |
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".
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).Identity & timing
| Field | Meaning |
|---|---|
| Name | Template name (e.g. "Weekday Morning Show"). |
| Radio | Station the template belongs to. |
| Language | Language for this template's content. |
| Days | Checkboxes Mon–Sun: which weekdays the template runs on. |
| Start hour / End hour | The hour range each chosen day this template covers. |
| Repeat allowed | Whether the same generated content may repeat across runs. |
| MusicBox | Which Music Box supplies the music for these hours. |
| Source | Default content source for the hour. |
Presenters & AI requests
| Field | Meaning |
|---|---|
| Standard presenter 1–4 | Up to four presenters who host these hours (the system will pair them). |
| Standard AI Request 1–5 | Up 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 |
|---|---|
| … presenter | Who reads this content type. |
| … AI model | Which AI writes it. |
| … prompt | The writing instruction. |
| … count | How many items (news/local news). |
| Max tokens / temperature | Gone 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. |
| … greetings | Intro 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
| Field | Meaning |
|---|---|
| Opener AI model / AI prompt | How the hour's spoken intro is written. |
| Opener Bed / Min Length / StartNext | The 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 prompt | How 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 Outro | Tease what's coming next hour at the end. See The Outro. |
| Include top feature in Opener | Promote the best feature at the start. |
| Default music expert AI model | The 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 moderations | Light-hearted presenter chatter: which AI writes it, the instruction, and how many per hour. |
| Moderation music only probability | The 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 found | Fallback to song talk when no other moderation applies. |
| Count features / Count wishes / Count allowed incoming calls | How 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).
What it says
If you leave Outro AI prompt empty, RadioButler writes the outro itself, in the tone of the presenter's Character:
| Situation | What the presenter does |
|---|---|
| The same presenter also hosts the next hour | No goodbye. They briefly point out that the news are coming up, plus a little friendly small talk. |
| A different presenter takes over | A 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 on | The 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:
| Placeholder | Is 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. |
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.| Button | Action |
|---|---|
| Save changes | Stores the template. |
| Copy | Duplicates the template as a starting point for a new one. |
| Delete radio program | Removes this template. |
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.
Identity & timing
| Field | Meaning |
|---|---|
| Name | Name of this program. |
| Description | Free notes about the program. |
| Date | The calendar day it airs. |
| Start hour / End hour | The hour(s) it occupies that day. |
| Radio | Station it belongs to. |
| Language | Language for this program. |
| MusicBox | Music pool used this hour. |
| Source | Content source for the hour (or "--- no source ---"). |
Presenters & AI requests
| Field | Meaning |
|---|---|
| Presenter 1–4 | The presenters hosting this hour. |
| AI Request 1–5 | The 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 model | Who reads it and which AI writes it. |
| News prompt | Writing instruction for this hour's news. |
| Max tokens / temperature | Gone 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 greetings | Intro phrases for the news. |
| News audio path | Where 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 path | The weather segment's full configuration. |
| Traffic AI Model / presenter / prompt | The traffic segment's configuration for this hour. Set here, it overrides the station default — see Traffic. |
| Roads / Max traffics | The 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 path | Storage paths for the produced audio. |
Opener, Outro, Music expert & moderation
| Field | Meaning |
|---|---|
| Opener AI model / AI prompt / Bed / Min Length / StartNext / audio path | The hour's spoken intro and its background audio settings. |
| Outro AI model / AI prompt / audio path | The 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 Opener | Tease next hour / promote best feature. |
| Music expert AI model / audio path | The 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 moderations | Casual presenter chatter configuration. |
| Moderation music only probability | The 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 found | Fallback song talk. |
| Count features / Count listener wishes / Count allowed incoming calls / Count fun moderations | How 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.
| Button | Action |
|---|---|
| Save changes | Stores this program. |
| Delete radio program | Removes this hour's program. |
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.
Editing a single news item (news.aspx)
| Field | Meaning |
|---|---|
| Title | The original headline of the story. |
| Changed Title | Your edited headline; used on air instead of the original if filled. |
| Description / Changed description | The story's summary and your edited version. |
| Details link | URL to the full original article. |
| Image link | URL of an image for the story. |
| Original text | The raw text as collected from the source. |
| RSS text | The text as it arrived from the RSS feed. |
| News text | The AI-rewritten, broadcast-ready news version (this is what gets spoken). |
| Feature text | A longer "feature" rewrite of the same story, if produced. |
| Save changes / Delete news | Store your edits or remove the story. |
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).
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.
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.
| Type | Who uses it |
|---|---|
| News & feature | The everyday workhorse. Fills the main news bulletin (via the station's Default news requests) and supplies the presenter's moderations between the songs. |
| Additional news | The short extra bulletin between the hours — see Additional news blocks. Every request of this type feeds that one bulletin. |
| Feature only | Longer pieces between the music, never part of the news bulletin. |
| Local news & feature | The same, for the regional bulletin. |
| Event | What'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. |
| Joke | Light 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.
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.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.
When each stage runs
| Stage | Runs when… |
|---|---|
| Shorten | More 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. |
| Combine | A 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.”
The fields
Basics
| Field | Meaning |
|---|---|
| Name | A label for the request (e.g. “World news”, “Local Helgoland”). |
| Radio | Station this request belongs to. “All radios” makes it available to every station of the account. |
| Language / Country | Target language and country for the produced content. |
| Request type | Decides who comes looking for it — see Request type above. |
| Active | Switched off, the request is invisible to everything. Nothing else changes. |
| Default AI Model | The 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
| Field | Meaning |
|---|---|
| Keywords | The 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 topics | Topics you never want to hear. A story whose topic contains one of these is dropped, however relevant it scored. |
| Check topics | Have 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. |
| Sources | Which 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 ahead | Only 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 request | Another 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
| Field | Meaning |
|---|---|
| Result max words | How long a single story may be. The trigger for the shorten stage. |
| Shorten text AI Model / prompt | The shorten stage. Left empty, nothing is shortened — see Shorten & Combine. |
| Combine results AI Model / prompt | The combine stage. The prompt is the switch: fill it in and the stories become one piece; leave it empty and they stay separate. |
Extras
| Field | Meaning |
|---|---|
| Create image | Also generate an image for the story (for Facebook and the website). |
| Facebook Min Relevance | Post 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 request | Store or remove the request. |
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.
Identity & fetching
| Field | Meaning |
|---|---|
| Name | Internal source name. |
| Non admin name | The name normal (non-admin) users see. |
| Type | The kind of source (RSS, web scrape, e-mail, …). |
| Url | The web address of the feed/page. |
| Active | Whether the source is in use. |
| Refresh rate (minutes) | How often to re-fetch the source. |
| Encoding | Character encoding of the source (e.g. UTF-8) so special characters read correctly. |
| eMail account | If the source is an inbox: which e-mail account to read. |
| Delete after / before, Latest search start / end, Result expected in, Latest result | Housekeeping & 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.
| Field | Meaning |
|---|---|
| Splitter | The marker/tag that separates one article from the next. |
| PubDate tag | Tag holding each article's publish date. |
| PubTitle tag | Tag holding the headline. |
| PubLink tag | Tag holding the link to the full article. |
| PubDescription tag | Tag holding the summary/description. |
| TextIn tag | Tag holding the main body text. |
| Other tags to copy | Any 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 guid | Generate 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 Path | If the source is produced as an RSS file, its file and path. |
Cleaning the text
| Field | Meaning |
|---|---|
| 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 count | Reject items that are too short to be real articles. |
| Auto delete phrases | Phrases automatically stripped from the text (e.g. "Read more", cookie notices). |
| Text infront result | Fixed 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.
| Group | Fields |
|---|---|
| Headline | Headline AI Model, Headline prompt, Headline change type (how aggressively to rewrite the title). |
| News | News AI Model, News prompt — produces the spoken news version. |
| Feature | Text AI Model, Text prompt — produces a longer feature version. |
| Description | Description AI Model plus the matching prompt. |
| Auto prompts | Auto headline / Auto text / Auto description prompt — used for fully automatic processing without manual review. |
| Button | Action |
|---|---|
| Test GetData | Runs the source now and shows what it would fetch — invaluable when setting up tag mappings. |
| Save changes | Stores the source. |
| Delete all news | Clears the stored articles collected from this source. |
| Delete source | Removes the source entirely. |
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.
| Element | Meaning |
|---|---|
| Radio drop-down | Choose which station you're selecting news for. |
| Program | Shows 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. |
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).
Header & AI
| Field | Meaning |
|---|---|
| Status | Read-only production state of this feature (e.g. NEW → produced). |
| Radio | Station the feature belongs to (changing it reloads matching options). |
| Language | Language of the feature. |
| AI Model | The AI model that writes the feature. |
| Title | The feature's title (required). |
| Instruction | The main brief telling the AI what to produce. |
| History depth | How many previous editions the AI should "remember" to avoid repeating itself. |
Content source
| Field | Meaning |
|---|---|
| Story Text | Optional 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 Request | Which Request supplies the source news when no Story Text is given. |
| Count News | How many news items to draw in. |
When it runs
| Field | Meaning |
|---|---|
| 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 hour | At which minute past the hour it is generated. |
Shape & sound
| Field | Meaning |
|---|---|
| Length (seconds) Min – Max | Target duration range of the finished audio. |
| Words per segment Min – Max | How long each spoken segment should be. |
| Sound effects (SFX) | Checkbox to include sound effects. |
| SFX count Min – Max | How 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 Key | Optional key just for this feature (empty = use system default). |
| Presenter | Checkbox list of presenters. If none chosen, the AI auto-picks from the station's contributors. |
| Button | Action |
|---|---|
| Save | Stores the feature. |
| Reset to NEW | Sets the status back to NEW so it will be produced again. |
| Delete | Removes the feature. |
| Cancel | Leaves without saving. |
When editing an existing feature, a Quick Access URL and a Productions history (past generated episodes) may also appear below the buttons.
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.
StartTimeis the exact second inside the hour,Precisionthe 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.
Block (the container)
| Field | Meaning |
|---|---|
| Blocktype | What 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 block per language/country) that apply when you haven't defined your own. |
| Name | A name for the block. |
| Language | Language the block applies to (lets one block target only one language). |
| Country | Country the block applies to ("--- all ---" = every country). |
| Radio | Station the block belongs to. |
| Valid from / Valid until | Date 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 overview | A 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 BlockItem | Adds another audio item to this block; a complete item row is built dynamically on the page (see below). |
| Save Block | Stores the block and all its items. |
| Delete Complete Block | Removes 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.
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:
| Field | Meaning |
|---|---|
| Name | A label for this item. |
| Order No | The position of this item within the block — the items play in this order. |
| Probability | The 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 until | Date range in which this item may be used. |
| File type | Where the audio comes from:
|
| File upload / Download URL | The 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 request | Only for File type News request (AI): which Request the stories are taken from. |
| News | Only for File type News request (AI): how many stories are taken — the x most relevant ones — and combined into a single text. Default 3. |
| Speaker | Only for File type News request (AI): who reads it. Left empty, the news presenter of the Radio Program of that hour is used. |
| Cue In | Entry point into the item's audio (skip the first N seconds). See Bed timing. |
| Start Next | When 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 Out | Length of the fade-out at the item's end. |
| Cue Out | The 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.
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
| Step | What happens |
|---|---|
| Ranking | Every 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. |
| Repetition | Topics that were just on air are skipped, if the Request has topic checking switched on. |
| Too short | A story whose original text has fewer words than the station's Min words news is dropped and never tried again. |
| Rewriting | Each 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-over | If 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. |
| Voice | The news presenter of the coming hour's Radio Program reads it; if that hour has none, the station's default news presenter does. |
| Cost | Each 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
| Step | What to do |
|---|---|
| 0. How many stories | On the Radio station page, set Count news in additional news (default 2). This applies to the station's bulletin as a whole. |
| 1. The Request | Create (or take) a Request, set its type to Additional news, give it its sources, keywords and an AI model. |
| 2. The block | Blocktype 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. |
: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 | Event | |
|---|---|---|
| Which Request | Not chosen — every Request of the type “Additional news” lands in one pool | Chosen on the item |
| How many stories | Set once per station (Count news in additional news, default 2) | Set on the item, so each block can differ (default 3) |
| How they are read | One after another, whoosh in between | Woven by the AI into one coherent text |
| Bed / outro | Bed yes, no outro | Bed and outro |
| Several per station | One 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.
How to set one up
| Step | What to do |
|---|---|
| 1. The block | Blocktype 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. Save | Saving always throws the produced file away, so the block is rendered again — with your changes — for its next airing. |
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.
| Field | What to put in |
|---|---|
| File type | Stream. |
| Download URL | The 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 Out | The 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 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.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.
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
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>
| Tag | What it must carry |
|---|---|
| pubDate | The 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. |
| title | Short and speakable. It is read out. |
| content:encoded | The 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. |
| description | The 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. |
| link | Where the event is described in full. Optional — but if you set it, it must point at a page that actually exists. |
| guid | A 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. |
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.
| Field | Set it to |
|---|---|
| Type | XML. |
| URL | The 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 tag | The 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 tag | The matching tags of your feed, normally <title>, <description>, <link>. Note that PubDescription is not what feeds the AI — that is Text in tag, above. |
| Active | Ticked. An inactive source is never read. |
| Refresh rate | How 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.
| Field | Set it to |
|---|---|
| Request type | Event. This is what switches on everything else on this page. |
| Max age | 0. 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 ahead | How far to look. 1 = today only, 2 = today and tomorrow, 0 = no limit. For a daily “what's on tonight” slot, use 1. |
| Combine prompt | The instruction that turns several events into one flowing text. Without it there is no segment — see below. |
| Combine AI model | The model that writes that text. It bills to whoever owns it, so use your own. |
| Keywords / Check topics | Optional. 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”.
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.
| Step | What to do |
|---|---|
| The block | Blocktype 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 bed | Order 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 content | Order 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 outro | Order No 3, file type Static file. Optional. |
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.
| Symptom | Where to look |
|---|---|
| The Request finds nothing, though the calendar is full | The 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 on | The 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 announced | The 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 announced | Max age is not 0. Any other value reaches backwards. |
| Events from next month turn up in a “tonight” slot | Event days ahead is 0 (no limit). Set it to 1. |
| The events are chosen, but no audio appears | The Request has no combine prompt or no combine AI model. |
| The feed exists on disk but nothing is ever imported | The Source's URL points nowhere public. Writing the file is not publishing it. |
| The block is skipped even though the slot is still ahead | It already aired earlier in the same hour. Once per hour is the limit. |
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.
| Field | Meaning |
|---|---|
| Jingle Name | A name for the jingle. |
| File Path | The audio file for the jingle. |
| Total duration | The jingle's length (seconds). |
| StartNext | When 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. |
| Save | Adds/updates the jingle. |
| Actions (in list) | Per-row edit/delete controls for existing jingles. |
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.
The fields
| Field | Meaning |
|---|---|
| Name | For your own overview; the listener never hears it. Something you will still recognise in six months — “Weather bed Autohaus Müller, summer campaign”. |
| Used for | Weather, Traffic, News or Opener — where the bed is played. Each element has its own pool of beds; they never mix. |
| Radio | The station this bed belongs to. Beds are never shared between stations; upload it once per station. |
| Sponsor | A 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 file | The 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 length | Opener 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 duration | The full length of the file in seconds, used to fade the bed out cleanly. |
| Active from / Active until | Optional 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 weight | normal / 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. |
| Save | Adds 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.
07. Same for weather and traffic, same for the opener that opens the 7 o'clock hour.Two consequences worth knowing:
| Situation | What happens |
|---|---|
| The log shows an earlier time than the air time | Normal. 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 time | Days 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 hour | Chance each time |
|---|---|
| One bed | 100% — a single scheduled bed is a guarantee. |
| Two beds, both normal | 50% / 50% |
| normal + heavy | 25% / 75% (weights 1 and 3) |
| normal + heavy + very heavy | 11% / 33% / 56% (weights 1, 3 and 5) |
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?
| Cell | Means |
|---|---|
| A name, green | Exactly one bed covers that hour. Guaranteed, no rotation. |
| A count like “2x”, amber | Several beds share the hour and rotate. Hover the cell to see which ones. |
| A dash | No scheduled bed. The default bed from the Radio station page applies — which is perfectly fine, and for most stations most of the week. |
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.
Which bed wins
For each element the chain is the same, and the first step that produces something wins:
| Step | What is checked |
|---|---|
| 1. A scheduled bed on this page | Active, 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 bed | For openers: the Opener Bed on the Program Schedule / Radio Program. For traffic: the bed on the hour's traffic entry. |
| 3. The station default | The single upload on the Radio station page — News Bed, Weather Bed, Traffic Bed, Opener. |
| 4. The built-in standard | The standard bed of the station's language, or a system bed. An element is never dropped merely because a bed is missing. |
When a bed doesn't air
Work down the list; in practice it is almost always one of the first three.
| Check | What to look for |
|---|---|
| Days and hours | An 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 hour | Remember 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 window | Active 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 kind | A bed set to News will never turn up under the weather. Check Used for. |
| The file | If 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 station | Beds belong to one station. If you run several, check the station selector at the top of the page. |
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 / control | Meaning |
|---|---|
| Search (Artist or song) | Type to filter the log by artist or title, then press Search. |
| Program | The program during which the song played. |
| Artist / Song | Performer and title. |
| Genre | The song's genre. |
| Started / Ended | Time the song started and finished. |
| Type | The kind of entry (song, jingle, etc.). |
| Block song | Ban this exact song from future play. |
| Block artist | Ban everything by this artist. |
| Banned songs / artists (link) | Opens the Banned songs list to review/undo bans. |
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).
| Field | Meaning |
|---|---|
| Sub-Genre | Choose the sub-genre the uploaded songs belong to, so they're filed correctly. |
| File upload | Select your .zip of songs. |
| Upload and extract | Uploads the archive and unpacks/catalogues the songs. |
| Status | Shows progress and the result of the upload. |
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).
Basics
| Field | Meaning |
|---|---|
| Radio | Station the box belongs to. |
| Name / Description | Label and notes for the box. |
| Age groups | Target 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".
100 to waive that limit every time, or 0 to enforce it strictly.| Field | Meaning |
|---|---|
| Minimum relevance | A song needs at least this music-history relevance score (0–100) to be included. 0 = don't filter by relevance. |
| Minimum / Maximum popularity | The allowed popularity band (0–100): a song's popularity must be ≥ minimum and ≤ maximum. |
| Minimum / Maximum complexity | The 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 Remixes | If off, remix versions are excluded; if on, they may be selected. |
| Take unknown | If 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
| Field | Meaning |
|---|---|
| Slow / Medium / Fast / Very fast songs | The 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:
| List | Meaning |
|---|---|
| Song speeds | Specific tempo characteristics to include. |
| Song moods | Desired moods (happy, melancholic, energetic…). |
| Lyric themes | Subject matter of the lyrics. |
| Energy Levels | Desired energy of the tracks. |
| Genres | The genres/sub-genres the box draws from. |
| Button | Action |
|---|---|
| Speichern (Save) | Stores the Music Box. |
| Löschen (Delete) | Removes the box. |
| Abbrechen (Cancel) | Leaves without saving. |
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."
| Column | Meaning |
|---|---|
| MusicBox | The box being analysed. |
| Genres | Genres the box uses. |
| Pool (genre) | How many songs exist in those genres at all. |
| After hard filters | Songs remaining after the strict, non-negotiable rules. |
| Strict (~85% case) | Typical pool size under normal strict matching. |
| + Relax relevance / popularity / complexity | How the pool grows as each constraint is loosened. |
| Universe (max.) | The absolute maximum number of candidate songs. |
| Played 90d / Plays 90d | How many of the box's songs were played in the last 90 days, and the total number of plays. |
| Rating | An 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.
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.
| Column | Meaning |
|---|---|
| Artist (/ Song) | The banned artist, or artist + title for a banned song. |
| banned | When the ban was set. |
| Remove ban | Un-blocks the song/artist so it can play again. |
If nothing is blocked you'll see "No banned songs found." / "No banned artists found."
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.
| Field | Meaning |
|---|---|
| Radio | Which station's audio this output carries. |
| Name | A label for this streaming output. |
| Radio Program on | The program/source feeding this stream. |
| Type | The streaming server type (e.g. Icecast). |
| Hostname or IP | Address of the streaming server. |
| Port | Network port the server listens on. |
| Mountpoint | The path on the server this stream is published at (e.g. /live). |
| Username / Password | Credentials to push audio to the server. |
| Codec | Audio format used (e.g. MP3, AAC). |
| Bitrate | Streaming quality in kbps (higher = better quality, more bandwidth). |
| Metadata Format | How "now playing" info is sent to the server. |
| Stream Name / Stream Description | Public title and description shown in directories/players. |
| Public Stream URL | The address listeners use. |
| Genre | Genre tag advertised for the stream. |
| Is active | Whether this output is currently streaming. |
| Save / Delete / Cancel | Store, remove, or discard changes. |
MasterStreamer / RadioStreamer background programs read these settings and push the audio to the server. You configure them here — you never run them yourself.Podcasts
RadioButler can also produce podcast episodes automatically from your news/requests. The menu lists your podcasts; clicking one opens its editor.
| Field | Meaning |
|---|---|
| Name / Description | Title and description of the podcast. |
| Radio | Station the podcast belongs to. |
| Days | Weekdays a new episode is produced. |
| Create time | The time of day the episode is generated. |
| Podcast AI model | AI model that writes the episode script. |
| Podcast Request | Which Request supplies the content. |
| Count news | How many news items to include. |
| Podcast prompt | The writing instruction for the episode. |
| Max tokens / temperature | Gone 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 2 | The voice(s) hosting the podcast (two enable a dialogue). |
| Podcast Intro (and bed) | Opening audio/music bed. |
| Podcast Outro | Closing audio. |
| Speech start (seconds) | When speaking begins over the intro bed. |
| Save changes / Delete podcast | Store or remove the podcast. |
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.
Mailbox connection
| Field | Meaning |
|---|---|
| Your Name of the EMail Account | A label you recognise this account by. |
| Radio | Station this mailbox feeds. |
| Active | Whether the account is being checked. |
| Hostname | The incoming mail server (IMAP host). |
| Port | Mail server port. |
| UserName / Password | Mailbox login credentials. |
| Use SSL | Connect securely (encrypted). |
| CheckInterval (seconds) | How often to check for new mail. |
| Allow EMail Addresses | A 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
| Field | Meaning |
|---|---|
| Source / Request | The Source and Request used to turn the e-mail into a news item. |
| Speaker | Which presenter reads the resulting content. |
| AI machine model | AI model used to rewrite the e-mail. |
| Prompt | Instruction telling the AI how to convert the mail. |
| Max tokens / temperature | Gone 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 bed | Background audio used when the item airs as breaking news. |
| Startnext | When speech starts over that bed. |
| Save changes / Delete eMailAccount | Store or remove the account. |
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.)
| Column | Meaning |
|---|---|
| Date | When the call happened (click to open the summary/transcript). |
| Radio | Station that received the call. |
| Speaker | The presenter/agent that handled it. |
| Duration | Length of the call. |
| Messages | Number of message exchanges in the call. |
| Song requested | Any song the caller asked for. |
| Original audio | The raw recording. |
| Edited audio | The cleaned/trimmed version for air. |
| Broadcasted | Whether it has been aired. |
| Checked | Whether it has been reviewed/approved. |
| Löschen (Delete) | Removes the call record. |
If there are none you'll see "No calls".
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.
Campaign editor (campaign.aspx)
| Field | Meaning |
|---|---|
| Campaign name | A label for the campaign. |
| Play from / Play until | The start and end dates the campaign is live. |
| Weight | Priority/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 spot | Adds a new advert to the campaign (opens the spot editor). |
| Save changes / Delete campaign | Store or remove the campaign. |
Spot editor (spot.aspx)
| Field | Meaning |
|---|---|
| Spot name | Name of the individual advert. |
| Spot description | Notes about the advert (and where its audio is managed). |
| Save changes / Delete spot | Store or remove the spot. |
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.
| Element | Meaning |
|---|---|
| Actual balance | Your current remaining credit. |
| Transactions | A list of all movements — top-ups (e.g. via PayPal) and charges for produced content. Click one to open its detail (transaction.aspx). |
Customer profile
Your own account/company details — the billing contact behind the login. Reached from account-related links.
| Field | Meaning |
|---|---|
| Company name / Name | Your company/organisation name. |
| First name / Last name | The contact person's name. |
| Address line 1 / Address line 2 | Street address. |
| City / Zip / Country | Town, postcode and country. |
| Your login/contact e-mail address. | |
| Reset password | Change your account password. |
| Save changes | Stores your profile. |
| Delete your account | Closes your account. |
Admin & test tools
Administrator accounts see a few extra items used for setup and troubleshooting. Normal users can ignore this chapter.
| Tool | Purpose |
|---|---|
| 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 pages | Several 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. |
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.)
| Category | Examples & what they do (triggered by website settings) |
|---|---|
| News collectors | Dozens of fetchers such as GetAINews, GetWDRNews, GetSpiegelOnline, GetIcelandNews, GetBusinessNews, GetGamingNews, regional and Schlager feeds, etc. They read the Sources and Requests you define. |
| Weather & traffic | CreateAIWeather, GetCountryWeather, GetTomTomTraffic, GetBingTraffic, GetTraffic — fed by the weather/traffic fields on the Radio station page. |
| AI content producers | CreateAIFeatures, CreateAIAudioNews, CreateAILocalNews, CreateAIPodcasts, DayInRockHistory, GetHoroscope — produce the Features, news and Podcasts you configure. |
| Streaming | MasterStreamer, RadioStreamer, SingleRadioStreamer, Stream2IceCast, CheckAndRestartIceCastAndMasterStreamer — send the live audio to the Streaming providers and keep them running. |
| Music management | GetAndCopyMusic, InsertMusicFromExternSource, HandleUnhandledSongs, CheckForMissingSongs, DeleteDuplicates, PlayListCreator, MusicExpert — build and maintain the library and Music Boxes. |
| Voice / speech & calls | SpeechMaster, Text2Speech, ElevenLabs, GetElevenLabsConversations — turn text into audio and fetch call transcripts. |
| E-mail, listeners & billing | ReadEMails/EMailCollector (feed eMail accounts), GetActualListeners/ListenerInfos (audience stats), Invoicer (billing), BuildProgramFromSchedule (turns your templates into hourly programs). |
…Test… projects (e.g. RadioStreamerTest2…11). These are developer experiments and have no role in day-to-day operation.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. |
| Genres | Manage Genres and Sub-Genres and the links between them (the heart of how music is organised). |
| Login / Logout | Sign in to your archive account; sign out. |
Search (artists & songs)
The Archive's home page is a search over the whole library. You can search by artist and/or song title, optionally including file matches, then act on the results.
| Field / control | Meaning |
|---|---|
| Artist | Search text for the artist name. |
| Song | Search text for the song title. |
| Search files | Also include matches found in the stored audio files, not just the database entries. |
| Results (artists & songs) | Two lists; each entry links to its Song details or Artist details page. |
| Combine artist checkbox | Tick several artists, then Combine Artists to merge duplicate artist entries into one (e.g. spelling variants). |
| Combine song checkbox | Tick several songs, then Combine Songs to merge duplicate recordings of the same song. |
| Delete song | Removes a song from the archive. |
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.
| Level | What it is |
|---|---|
| Genre | A 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-Genre | A 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
| Control | Meaning |
|---|---|
| Genre drop-down | Pick 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. |
| Edit | Opens the same dialog for the selected Genre. |
| Genre dialog — Genre Name | The Genre's name. |
| Genre dialog — Radio | Tie it to one station, or "--- All radios ---" for a global genre. |
| Genre dialog — Save / Delete | Store 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).
| Field | Meaning |
|---|---|
| Sub-Genre Name | The name of the new Sub-Genre (required). |
| Allow Day from / Month | Start of the seasonal window (day and month) in which this Sub-Genre may be used. |
| Allow Until Day / Month | End of the seasonal window. Leave the window empty for an all-year Sub-Genre. |
| Add | Creates 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.
| Element | Meaning |
|---|---|
| Checkbox per Sub-Genre | Tick the Sub-Genres that should belong to the selected Genre. |
| Bold name | A 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). |
| Save | Stores 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.
| Action | Meaning |
|---|---|
| Songs list | Every song currently tagged with this Sub-Genre. |
| Update Sub-Genre (name) | Rename the Sub-Genre. |
| Delete Sub-Genre | Removes the Sub-Genre. |
| Combine Sub-Genre | Merge 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. |
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 / area | Meaning |
|---|---|
| Play on Radio Station | Pick one of your stations to (test-)play or add the song there. |
| Main Language | The song's language (used by Music Box language-mix rules). |
| Song description / Song information | Free-text notes and gathered information about the song. |
| Popular for age groups | Which listener age bands the song suits (5-15, 15-25, 25-35, 35-65, 65+) — matches the Music Box age groups. |
| Song moods | Checkboxes 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 themes | Checkboxes 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 Levels | Low / 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 / Ramp1 | The 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 features | Imported analysis such as tempo, danceability, energy, valence, loudness, etc. (read-mostly) that inform tagging. |
| Recommendations | Related songs; you can add or delete recommendations. |
| Chart positions | The song's chart history per country. |
| Played infos | Where/when the song has been played. |
| Anecdotes | Background stories about the song/artist (per language) the presenter can use on air. |
| Add to playlist / Update song | Add the song to a station's playlist, or save your changes. |
Artist details
The record of one artist: their information, their songs, and "anecdotes" the presenter can tell on air.
| Field / area | Meaning |
|---|---|
| Artist information | Editable details/biography of the artist (Update Artist saves changes). |
| Songs | All songs by this artist, each linking to its Song details. |
| Anecdotes | Short 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. |
Legal / Impressum
The legal notice (Impressum), terms & conditions and privacy information. Operator:
| Detail | Value |
|---|---|
| Company | DigitalAnna UG (haftungsbeschränkt) |
| Address | Prof. Heincke Str. 31, D-27498 Helgoland, Germany |
| General contact | info@radiobutler.com |
| Customer support | support@radiobutler.com |
Screens and fields reflect the current build; minor wording may differ as the product evolves.