0.40.0 (2026-07-10)
Features
- admin: booth-log prompt summaries, shadcn scroll areas, segment fire pads (#958) (5897729)
- admin: library search paging, sounds-like search mode, URL-persisted state (#967) (5049787)
- admin: per-call TTS log in the debug panel's TTS routing card (#960) (a24a5c3)
- admin: support multi-file jingle import (#952) (990b035)
- app: web-player parity, sleep timer, Google Cast + AirPlay connectivity (#970) (0b060a3)
- broadcast: configurable Icecast listener cap (ICECAST_MAX_CLIENTS) (#978) (3a56a1b)
- connect: discoverable API — explorer, playground, HTTP MCP (#928) (6ac4b0c)
- dj: add ElevenLabs v3 audio-tag hint to the system prompt (#916) (718f5fa)
- library: manual playlist creation in admin library + Navidrome library-scoping docs (#704) (#953) (aa0f046)
- llm: pool-mode segment path, pick prompt diet, and llm-bench harness (#961) (42ca3ac)
- mix: tail-loudness-shaped exit canvas + boundary-key matching (#972) (69cea9a)
- observatory: WebGL galaxy renderer replaces SVG + canvas maps (#957) (35bcda2)
- personas: system-prompt template library with switching + modal editor (#955) (d1f00c3)
- search: Brave Search API as web-search backend (#623) (#984) (a82a23c)
- shows: multi-value genre/mood/energy/era show filters (#929) (#951) (53e0524)
- stations: add Radio Parra Vergara (#944) (5e06195)
- tools: import track analysis from AudioMuse-AI (#934) (5f81f9a)
- tts: choose which heavy TTS engines load via TTS_HEAVY_ENGINES (#956) (3078d4d)
- tts: expose ElevenLabs voice_settings globally under tts.cloud (#915) (5036bc1)
- tts: operator-editable speech corrections in admin settings (#981) (c34df62)
- web: now-playing UX — up-next tease, clock toggle, off-air state, cover placeholder (#968) (6bd35f6)
Bug Fixes
- address develop→main review findings (leaked reasoning, ElevenLabs, AudioMuse importer) (#954) (bbf1be5)
- analyzer: local backend reports real CLAP/Demucs capability + AIO-aware doctor hints (#983) (f6ec6ad)
- dj: slim the programme-plan capability menu to one line per kind (#950) (26fb586)
- doctor: analyzer heavy-image hints cover non-compose installs (#974) (ae6d476)
- llm: force parallel_tool_calls:false on openai-compatible tool requests (#945) (c2adb64), closes #940
- llm: honour forceNoThink on openai-compatible/locca picker legs (#935) (42f78ee)
- llm: never air truncated reasoning (handoff spoke its own instructions) (#949) (0ddc54f)
- llm: resolve GLM structured-output and thinking-suppression failures (#923) (1434e91)
- picker: tolerate small-model id transcription slips (#939) (#948) (233fea6)
- stations: Brisflix Radio showed offline — url carried a /listen path (#964) (9f8085f)
- tts: apply speech speed locally for openai-compatible cloud TTS (#982) (bb78a0d), closes #942
- tts: normalize display text to spoken form; never air intro fragments (#965) (04c3393)