/ RELEASE_NOTES
Changelog
A detailed record of every release, improvement, and fix shipped to the brūhi platform.
Changelog
All notable changes to brūhi Studio will be documented in this file.
This project follows Semantic Versioning. All versions below 1.0.0 are pre-release development milestones.
[0.11.0] — Global Stability & Production Reliability
Added
- Global Distribution — New installers for macOS, Windows, and Linux with secure, verified signatures.
- Auto-Updates — Built-in system to ensure you always have the latest stability improvements.
- Professional Driver Support — Native low-latency support for JACK and PipeWire on Linux.
Verified
- 24-Hour Stress Test — Confirmed zero dropouts and absolute stability under full broadcast load.
- Hardware Compatibility — Verified hot-plugging support for audio interfaces and MIDI controllers.
[0.10.0] — Pro Data Management & Soundboard Expansion
Added
- Unified
bruhi.db— single WAL-mode SQLite database replaces all JSON persistence files - Cart Wall tables —
cart_banks+cart_padswith full CRUD; user-created pads supported alongside bundled sounds - Broadcast config profiles — named profiles with save, load, and delete via
broadcast_configstable - Playout log table —
playout_logwith timestamp index; CSV export from SQLite rows - Schedule blocks table —
schedule_blockswith date index; recurring/trigger/condition stored as structured JSON columns
Changed
- Playlists, queue, automation scripts, and smart playlist rules migrated from JSON files to SQLite tables
- One-time non-destructive migration — legacy JSON files imported and renamed to
<name>.migrated PlaylistEnginewrites directly to SQLite — debounced dirty-flag pattern removedAutomationScriptStorewrites directly to SQLite — no background save needed
[0.9.0] — Smart Playlists & Automation Engine
Added
- Smart Playlists — rule-based auto-populating playlists with AND/OR logic groups
- Visual rule builder — field conditions for Title, Artist, Album, Genre, Year, Duration, Days since added
- Rule operators — contains, does not contain, is exactly, is not, greater than, less than, between
- Sort orders — Random, Title A–Z, Artist A–Z, Album A–Z, Shortest first, Longest first, Newest added, Most recent year
- Preview Matches — live evaluation of rules against the SQLite library
- brūhi Script — custom Rust-interpreted scripting language with absolute sandbox (no file/network/system access)
- Hard 5-second timeout per script execution — no infinite loops possible
- Script Editor — code editor with keyword highlighting, run/preview, error panel with line numbers
- Script API —
library,playlist,queue,deck,scheduleobjects with TrackList methods (.shuffle(),.limit(),.sort_by(),.filter()) - Advanced schedule triggers — recurring rules (daily/weekly/monthly/custom), script triggers,
QueueEmptyconditional trigger, block condition guards - Unified playlist list — regular and smart playlists shown together with type icons
- Reusable
Modal.svelte— generic backdrop + dialog component with fade/scale transitions
Changed
- Playlist creation modal now includes a type selector (Regular / Smart)
- Tab-based navigation replaced with a single unified content area
[0.8.0] — Library UI Completion
Added
- Track table — real data from SQLite via
get_library_tracks; sortable columns (title, artist, album, genre, year, duration) - Multi-select — per-row checkboxes with select-all; bulk "Add to Queue" and bulk delete
- Folder scanning — native folder picker via Tauri plugin-dialog; background Rust thread with real-time progress bar
- FTS5 search — full-text search across title, artist, album via SQLite FTS5 index
- Genre sidebar — dynamically populated from
get_library_genres; click-to-filter with active highlight - Library stats bar — live counts for total tracks, total duration, and unique artists
- Library → Queue bridge — Svelte writable store (
pendingQueueTracks) connects Library and Broadcast workspaces
Changed
- Empty state now distinguishes between "no results" and "empty library" with contextual guidance
[0.7.0] — Persistence & State Restoration
Added
- Unified settings store — theme, device selections, and UI preferences persisted to
settings.json - Broadcast queue persistence — snapshot written on every mutation (debounced 500 ms); stale entries filtered on restore
- MIDI mapping persistence — real file I/O to
midi_mappings.json; auto-reconnect to last-used ports on startup - DSP chain auto-persist — master chain saved to
dsp_chain.json; per-mic chains saved independently - Broadcast config persistence — all output configurations saved to
broadcast_config.json - Deck & transport state — loaded tracks, positions, gains, crossfader saved on shutdown to
session_state.json; restored on startup in paused state - Shutdown flush —
AudioEngine::flush_all()performs synchronous writes on window close viaCloseRequestedevent
Fixed
QueueManagerfile-browse dialog now properly syncs to Rust backend instead of mutating local state onlyBroadcastOutputPanel.loadStatus()split into independent calls to prevent silent config swallowing
[0.6.0] — Broadcast Grid Scheduler
Added
- Horizontal broadcast grid — full-month view with 24-hour time axis; one row per calendar day
- Zoom levels — 0.5×, 1×, 2× (default), 4×; snap intervals: 1 m, 5 m (default), 15 m, 30 m
- NOW indicator — red vertical line at current time with live label on today's row
- Schedule blocks — Audio File (blue), Playlist (purple), Live Session (red) with drag, resize, and lock support
- Quick Add — click empty grid area to create a block pre-filled with date and time
- Day Overview modal — stats (total blocks, scheduled hours, available hours) with sorted block list
- Block Detail modal — label, type, lock status, timing, and action buttons (Load to Deck, Queue Playlist, Delete)
- Month navigation — ← / → with "Today" shortcut and "This Month" badge
[0.5.0] — Show Production Tools
Added
- Cart Wall — up to 128 pads across multiple named banks; per-pad colour, category, fade durations; keyboard shortcuts
- MIDI mapping engine — real-time port enumeration, MIDI learn mode, activity LED, persisted mappings
- Per-mic voice DSP — individual
DSPChainper mic slot with 3 built-in presets (Broadcast Voice, Music DJ, Podcast) - Show clock — wall clock, on-air elapsed timer, and segment countdown timer with red flash in final 10 s
- Playout log — timestamped JSONL record of every track played; refresh, CSV export, and clear with confirmation
- Script / cue panel — named cue pages with PageDown/PageUp navigation, auto-save, dirty indicator
- Talkback push-to-talk — configurable input device, MON-bus-only routing, RT-safe
AtomicBoolgate - Segue editor preview — modal with cue waveform canvases and cue offset slider
[0.4.0] — Master DSP Chain
Added
- Pluggable DSP architecture — registry-driven factory system; insert, remove, and reorder effects at runtime
- High-pass filter — configurable cut-off (default 80 Hz) and Q factor
- Low-pass filter — configurable cut-off (default 18 kHz) and Q factor
- 5-band parametric EQ — low shelf, 3 peaking mids, high shelf; ±24 dB per band; Q 0.1–10
- Compressor — feed-forward RMS with soft-knee; threshold, ratio (1:1–20:1), attack/release, make-up gain
- Brick-wall limiter — instantaneous attack peak limiter; configurable ceiling (default −1 dBFS)
- Noise gate — per-channel state machine (Closed → Opening → Open → Holding → Closing)
- Stereo enhancer — mid-side width processor (0.0 = mono, 1.0 = unchanged, 2.0+ = max spread)
- JSON chain config — full chain serialises to JSON; reload without restarting the stream
- Bypass toggle —
set_dsp_enabledfor instant A/B comparison
Changed
- RT-safe
try_lockdesign ensures parameter updates from UI never block the audio callback
[0.3.0] — High-Fidelity Encoders & Output Distribution
Added
- Encoder pipeline — WAV (16-bit/32-bit float), FLAC (level 0–8), MP3 (LAME), Opus (libopus)
- Master mix recording — WAV, FLAC, and generic file recorder (MP3, Opus, Ogg)
- Icecast 2.x output — HTTP/1.0 PUT source client with
Ice-*header negotiation and dynamic metadata - Shoutcast 1.x output — ICY source protocol for legacy servers
- HLS output — fixed-duration segments with atomic
playlist.m3u8updates and rolling window eviction - RTP output — UDP/RTP unicast or multicast per RFC 3550; MTU-aware chunk splitting
- Multi-output fan-out —
BroadcastPipelineencodes once, delivers to N outputs via zero-copyArc<Vec<u8>> - Back-pressure isolation — each output on its own thread with 64-packet bounded channel; slow outputs don't affect others
- Output plugin architecture —
OutputFactory+OutputRegistrywith 11 built-in factories;EncoderFactory+EncoderRegistrywith 5 built-in encoders
[0.2.0] — Playlist & Schedule Automation
Added
- Gapless playlist playback — pre-load next track with configurable overlap and crossfade per transition
- Playback modes — Ordered, Shuffle (Fisher-Yates with skip-protection), Loop (None / Playlist / Single)
- Playlist management — create, rename, duplicate, delete named playlists with full metadata per track
- Broadcast queue — priority-aware queue (Normal / Urgent) with drag-and-drop reorder
- Media library — recursive folder scan with tag extraction (lofty); SQLite-backed FTS5 full-text search
- Library stats — total track count, total duration, unique artists, unique albums
- Schedule automation — clock-time, before-track-end, and playlist-position triggers with 6 action types
- Fire debounce — 150 ms window + 1 s re-fire guard prevents duplicate schedule triggers
[0.1.0] — Core Audio Engine
Added
- Dual-deck player — MP3, FLAC, WAV, OGG, M4A/AAC, AIFF support with independent gain faders (0–150%)
- Professional crossfader — Linear (−6 dB centre) and Equal-Power (−3 dB, constant-loudness) curves
- Master mix — master gain with +10 ms smooth ramp; soft limiter with cubic knee (transparent below 0 dBFS)
- VU metering — peak + RMS per deck (L/R) and master (L/R); IEC 60268-17 standard; ~30 fps push events
- 3 microphone slots — Mic 1, Mic 2, Remote with auto-detection, per-slot gain/mute, 80 Hz HPF, latency trim
- Soundboard — 32 instant-trigger RAM-loaded pads with per-pad gain and loop; manifest-driven
- Monitor output (MON) — feedback-prevention gate; selectable output device; defaults to muted
- PFL / cue headphone bus — dedicated second output stream; per-deck CUE enable; split-cue mode (L=PFL, R=master)
- Device management — enumerate all I/O devices; select main, MON, and PFL independently; hot-switch without restart
- Track queue — drag-and-drop ordering with auto-advance on end-of-track
- Sample rate conversion — broadcast-quality 256-tap windowed-sinc SRC; all files resampled to 48 kHz at load time