MANUAL · 15
Seven things that get asked over and over — not because they're broken, but because the name doesn't tell you what's underneath. What each one is, what changes when you move it, and where the control lives.
PERSONA TONE
Every persona carries three dials from 0 to 10 — Humour, Local Colour and Warmth. They look like faders, but nothing scales smoothly as you drag them. Each one resolves to a band: 0–3 is low, 4–6 is neutral, 7–10 is high. Only a band away from neutral changes anything, so 4, 5 and 6 are the same setting — and so are 7 and 10.
That’s on purpose. A model can’t hear the difference between a 6 and a 7 in a raw “7 out of 10” instruction, so rather than fake a precision that isn’t there, the dial picks one of two style directions.
| Dial | Turned down | Turned up |
|---|---|---|
| Humour | Plays it straight; wit stays rare and understated. | Leans into dry, playful wit; an aside or a wink is welcome. |
| Local Colour | Keeps it universal; skips local references and place-specific colour. | Leans on the local setting — the town, the weather, the hour — as texture. |
| Warmth | Keeps a cool, dry distance; lets the music carry the warmth. | Warm and earnest; speaks to the listener like a friend. |
Local Colour is the one people ask about. It governs how much the DJ reaches for where and when you are— your town, today’s weather, the hour — as raw material. Turned up, links open with the drizzle outside. Turned down, the same DJ could be broadcasting from anywhere.
It doesn’t add facts: the place, the weather and the clock reach the DJ either way, and the dial only decides whether it leans on them. It can’t invent a second location either — exactly one place name reaches any script, the on-air location under Settings → Station. A persona left at the defaults writes exactly what it wrote before the dials existed. Find them under Personas→ Behaviour.
CHOOSING THE NEXT TRACK
Both end in the same place — one track, handed to the queue — and both run inside a session and get logged. What differs is who does the searching.
With the candidate pool, the station does. It merges up to sixteen sources into one shortlist — mood matches, sonically similar tracks, embedding neighbours, the current show’s genres and playlists, starred and frequently-played, recently added, listener favourites, a wildcard and a little pure random — de-duplicates, applies the recency and artist filters, caps it, and asks the model once: pick one of these. One round-trip per track, bounded tokens, and it works happily on a small local model because there’s no tool loop to get lost in. The catch is that the model can only choose from what the pool already found.
With the agent— the default — the model drives. It gets about eighteen discovery tools (similar songs, tracks like this one, search by sound, search by lyrics, by mood, by energy, by genre, deep cuts, recently added, tracks toward a journey) and searches the library itself across the session’s memory before committing. Richer, more coherent across a run, and more expensive: several round-trips per track, and it needs a model that is genuinely good at multi-step tool calling with a context window of at least 16,384. Most “the DJ stopped without choosing” reports are that requirement not being met.
Start on Agent if you’re on a cloud model or a 12B-class local one. Drop to Candidate pool if picks are slow, if the DJ keeps re-picking, or if you’re on a 9B-class model. Nothing is lost either way: the station still picks, still writes links, still honours requests. The agent already falls back to the pool on a timeout, so a slot is never dropped.
Two behaviours hold whichever you run. Variety is enforced after the choice, not inside the search— the discovery tools carry no artist filter on purpose, because filtering inside them gutted the similarity pool on smaller libraries; instead a pick that repeats a recent artist triggers a re-pick. And the daily token budget degrades in tiers: past the soft threshold the station drops to the pool and mutes optional segments; at the cap it stops calling the model at all and coasts on the fallback playlist. The music never stops. The switch is under Settings → LLM → Agentic picker; the model side is on Models & Tokens.
TWO KINDS OF GROUPING
They sound like alternatives. They’re layers — and a show can use playlists.
| Playlist | Show | |
|---|---|---|
| What it is | A named set of tracks | A block of programming on the schedule |
| Lives in | Navidrome | The station’s own schedule |
| Has a time | No | Yes — that’s the point |
| Has a persona, theme, topic | No | Yes |
A playlist is just tracks. Build one by hand in Navidrome, or describe what you want (“late-night driving, mostly instrumental, ninety minutes”) and let the playlist builder assemble it from the same mood, vector and similarity machinery the DJ picks with, then order it into an energy arc.
A show is an hour or more with an identity: which persona is on the mic, which skin the player wears, what the show is about, and a set of music filters — moods, genres, eras, energies, vocals. The DJ still picks every track live; the show narrows what it may pick from.
Where they meet: a show can be anchored to one or more playlists. Anchored on its own makes the playlists the show’s dominant source while leaving the DJ free to reach outside for a better fit. Anchored with strict on makes them the show’s entire universe, and everything off-playlist is dropped before the DJ ever sees it.
If a show pins playlists that no longer resolve — deleted and recreated in Navidrome, so the id moved — the anchor is ignored and the station says so in the log, including that the strict toggle had no effect. The show still airs; it just airs unanchored. Re-select the playlists in the show editor to fix it. Rule of thumb: recurring identity at a fixed hour is a show; a set of tracks you want to reach for is a playlist; “this hour, only these tracks” is a show anchored to a playlist with strict on.
DISK FOR SEAMS
A stem-blend transition mixes two tracks by instrument rather than fading two finished mixes together: the outgoing drums duck out under the incoming bass, and the vocals clear before the new vocal enters. Doing that needs the four separated stems — drums, bass, other, vocals — for both sides of the seam.
Separating them takes far longer than the gap between two songs, so it can’t happen at the seam. The analyzer does it during acoustic analysis instead, keeping the first forty seconds and the last twenty of each track. A transition is then a fast mix of files already on disk.
Which makes the trade a simple one: the cost is disk, and only disk. The separation is paid for during analysis whether you keep the output or not. Budget 13–25 MB per track; the default 15 GB budget holds somewhere between six hundred and twelve hundred of them. Once you’re over, a sweep evicts the tracks with the least to gain from a blend first — the ones the station never plays, and the ones whose analysis found no beat grid to align a seam on.
A blend needs stems on both tracks of a pair. With half your library cached, far fewer than half your seams will blend — most fall back to a plain crossfade, which isn’t a failure, just the ordinary behaviour. So the reason to raise the budget is coverage of pairs, not coverage of tracks. DJ Doc says this outright, with the track count your current budget actually holds.
Small library? Raise the budget until it covers the lot and let the analysis pass backfill. Tens of thousands of tracks? The budget will always bind, and blends land wherever the cache happens to be warm. Short on disk? Turn the cache off — every seam becomes a crossfade and nothing else changes. The dial is under Settings → Transitions.
TWO LOCKS, ONE PASSWORD
These get confused because turning either one on asks for the same station password. They are independent, and only one of them actually stops anyone listening.
The private player swaps the public pages for a password prompt. It hides the interface. The now-playing endpoints stay public — the player and the admin dash need them — and anyone who knows the stream address can still tune in. It applies live, with no restart.
The stream password turns on listener authentication at Icecast itself, on every mount. That is the real boundary: without the password, there is no audio. Turning it on or off needs a mixer restart; changing the password applies live.
The private player is a curtain. The stream password is a lock. Most people who want a private station want both, so that one prompt unlocks the page and the audio together.
A third thing is often mistaken for these two: HTTP Basic Auth applied in front of the whole station at your own reverse proxy. That isn’t a SUB/WAVE feature and it behaves differently, particularly for the mobile apps. Both locks live under Settings → Station → Privacy; tuning in from VLC, Sonos, hardware radios and the apps once a password is on is covered on Listen With.
THE SHAPE OF THE DAY
The station divides the day into eight named periods, on fixed wall-clock hours in your station’s timezone.
| Period | Hours |
|---|---|
early-morning | 05:00 – 09:00 |
morning | 09:00 – 12:00 |
midday | 12:00 – 14:00 |
afternoon | 14:00 – 17:00 |
drive-time | 17:00 – 19:00 |
evening | 19:00 – 22:00 |
late-evening | 22:00 – 01:00 |
after-hours | 01:00 – 05:00 |
These boundaries are not derived from sunrise or sunset, and they aren’t configurable. Which reads oddly above about 55° north or south, where “evening” is full daylight in June and pitch dark in December.
It’s a deliberate trade. A daypart is a programming idea — drive-time means the end of the working day, which is five o’clock whatever the sky is doing — and it has to be predictable, because the schedule, the mood plan and the show grid are all built against named hours. Boundaries that drifted three hours across the year would quietly move your shows with them.
What is sun-aware is the DJ’s description of the world outside. The station reads whether the sun is currently up at your coordinates and puts that on the prompt, which is what stops it describing dusk two hours after dark in December, or “the last of the light” at nine in the evening in June. That runs off real solar position, so it’s right at any latitude.
So the lever at high latitude isn’t moving the boundary, it’s retuning what happens inside it: each period’s mood is yours to set, under Moods → Moments. Give a Nordic summer evening a brighter mood than the default wind-down and let the sun-aware flag keep the DJ’s language honest. Two nudges sit on top of the table and aren’t editable: the small hours pull the speaking pace down whatever period the hour formally belongs to, and commute windows push it up. A show with a pinned energy overrides both.
LISTENER SIGNAL
There are two hearts and they aren’t the same signal. The listener heart on the player is one like per apparent listener per airing— the same song aired again later can be liked again. Listeners have no accounts, so “apparent listener” is a one-way hash of the address; the raw address is never stored and everyone behind one router shares a key. It’s lightweight de-duplication, not identity. The operator heart in the admin library is something else: curation, not a taste snapshot.
By default a like changes nothing about rotation. It’s recorded, it shows up in stats, and the track gets starred in Navidrome if you’ve left that on. The DJ never hears about it.
Influence is opt-in, under Settings → Likes. Turned on, the most-liked tracks become one more source feeding the candidate pool, capped like every other source — a weighted preference, never a lock, so the crowd can steer the pool without taking it over. Out of the box that means the ten most-liked tracks of the last thirty days; both numbers are yours to change, and a window of zero means all time.
An operator heart never expires from that window. A listener like ageing out is a taste snapshot going stale, which is right. An operator like ageing out would be the DJ forgetting curation you set by hand, which isn’t.
Clearing them: from any row in the admin library, un-heart removes your own heart and leaves listener likes alone, while clear likes removes both. If yours was the last like standing and Navidrome starring is on, the track is unstarred there too.