MBXHub Changelog
The bridge to everything else.
v0.5.0.9 — Under the Hood
Faster everywhere, no trade-offs
- Playlist Folder Grouping — playlists in the player browse panel and search results are grouped by folder
- Root playlists listed first, then sorted folder groups with uppercase headers
- Items show leaf name only (folder prefix shown in group header)
- Matches dashboard playlist picker ordering
- Filtering hides empty groups
- Track Metadata Cache — ConcurrentDictionary with TTL eviction, invalidated on track change events. Queue listings with 100+ tracks hit cache instead of 1500 API calls
- WebSocket Serialize-Once Broadcast — events serialized to bytes once and sent to all clients, not per-client
- Router Fast Path — kiosk/party mode checks skipped when disabled, regex routes matched in single pass instead of two
- Scoring Engine — diversity penalty pre-computed maps (O(1) per candidate), single-pass filter chain, TTL-based metadata eviction, ThreadLocal RNG
- Startup & Lifecycle — lazy handler initialization, lock-free rate limiter cleanup, immutable WebSocket subscriptions, bounded log queue (10K cap)
- Live Settings Page (
settings.html) — Firefox about:config-style editor for dashboard, AutoQ, and shuffle settings with search, category filters, and inline editing
v0.5.0.8 — Search & Queue
Search smarter, play everywhere
- Library Browser (
browse.html) — standalone browse-and-queue webapp
- Seven tabs: Albums, Artists, Genres, Playlists, Podcasts, Radio, Moods — drilldown + breadcrumbs
- Live search with grouped results across all categories
- Album card grid with lazy-loaded artwork
- Play Now / Queue Next / Queue Last / Add to Playlist
- Batch selection via long-press, playlist picker overlay
- Light/dark theme, dashboard charm integration
- Diacritic-Aware Search — “bjork” finds Björk, “cafe” finds Café — fuzzy bigram scoring and accent-insensitive matching in Browser, Player, Guest, and the REST API
- Responsive Player — three layouts, zero compromise: mobile tab bar (single-column, swipe between NP/Browse/Queue), tablet portrait (2-column browse+player grid), desktop landscape (full 3-column with resizable panels)
- Guest Page Refresh — all 7 browse tabs, fuzzy search with diacritics, mood/podcast drilldown
- Queue Batch Add —
POST /queue/add accepts urls array for multi-track queuing
- Playlist Create with Files —
POST /playlists accepts files array to create and populate in one step
- Sort by Track Number —
?sort=track for disc/track order (CUE-aware)
- Mood Browse —
GET /autoq/moods/browse returns tracks scored by mood similarity
- Player & Now Playing Charms — charm manifests + home button on standalone pages
- Upgrade Housekeeping — stale pages detected and updated automatically on startup; legacy plugins removed
v0.5.0.7 — AutoQ Tuning
Smarter moods, transparent confidence
- Genre-Aware Weight Adjustment - Per-genre multipliers adapt mood estimation to each genre’s acoustic norms
- 8 built-in genre profiles: Electronic, Metal, Jazz, Classical, Hip-Hop, Folk, R&B, Pop/Rock (reference)
- 14 multipliers per profile (8 arousal, 6 valence) — weights are scaled then renormalized so total stays constant
- BPM downweighted for EDM (uniformly high), chord changes upweighted for jazz, brightness boosted for metal
- Genre matching: exact tag match first, then first-word fallback (e.g. “Progressive Rock” → Rock)
- Custom profiles via
autoQ.genreProfiles in mbxhub.json — override or extend built-in profiles
- Toggle:
useGenreAdjustment (on by default), controllable from Tuning Console
- Confidence Scoring - Every mood estimate now carries a confidence score (0–1)
- Formula:
confidence = sourceBase × channelProximity
- Source bases: Essentia (0.9), fallback+genre (0.45), fallback-only (0.2) — all tunable
- Channel proximity: how close the V/A point lands to its nearest mood channel (1.0 = dead center)
- Color-coded badges on Dashboard, Player, and Tuning Console (green/yellow/red)
- Confidence gate: mood tags only written when confidence ≥
confidenceMinForTag (0.3)
- REST API:
confidence, confidenceLabel, genreProfile in GET /autoq/track-mood
- Mood Combo Labels - Multi-channel mood descriptions
- Tracks near channel boundaries get composite labels (e.g. “Upbeat + Energetic”)
moodLabel and moodMatches array in API responses
- Tunable via
moodComboMaxResults (3) and moodComboMinScore (0.85)
v0.5.0.6 — Play Here
Your music, your device
- Audio Streaming Endpoint -
GET /stream/{path} — serve any library file over HTTP with full seek support
- Phone, tablet, laptop — open the player, tap Play Here, and the music comes out of that device
- Perfect for podcasts: listen at your desk while MusicBee manages the library on another machine
- HTTP Range support (
206 Partial Content) — seek anywhere instantly
- Library-gated: only files in MusicBee can be streamed. Path traversal and extension whitelist enforced.
- Formats: mp3, flac, m4a, ogg, wav, opus, aac, aiff (browser codec support varies)
- Kill switch:
disableStreaming setting, off by default
- Listen Here 🎧 - Per-track streaming button in player.html
- 🎧 button on every track, album, podcast episode, and radio station in search results
- One tap starts local playback — no mode toggle needed
- Full transport sync: play/pause, next/prev, seek bar, volume all drive the local
<audio> element
- Client-side queue: play now, queue next, queue last from search, albums, playlists
- CUE track offset support — seeks to correct position, shows track-relative progress, auto-advances at track end
- Buffering/error feedback, auto-advance on error, “Streaming locally ×” indicator to exit
- Respects
/system/features — 🎧 buttons hidden when streaming disabled server-side
- Radio Stations - Browse and play radio in the player
- New Radio tab in the player browse panel — lists all stations from MusicBee’s Radio node
GET /radio/stations endpoint — returns station name and URL
- Play on MusicBee or Listen Here directly in the browser
v0.5.0.5 — Phantom
Your speakers, one tap away
- Phantom Webapp - Full Devialet Phantom control at
/pages/phantom.html
- Transport, volume slider, mute, source switching — all from the dashboard or standalone
- Dynamic source enumeration with friendly name mapping (Spotify, AirPlay, Optical, Roon…)
- Namespace-aware: systems, devices, and groups all supported
- Auto-polls every 22s for now-playing updates
- Zero dependencies, single HTML file, works offline on LAN
- Charm Manifest System - Drop-in JSON manifests for custom dashboard controls
- Three action tiers: HTTP (LAN device APIs), Exec (local CLI tools), Webapp (embedded pages)
- Manifests seeded on first run from embedded resources
- Charm bar renders in the dashboard with configurable order and visibility
- Cross-origin actions auto-routed through the device proxy — manifest authors don’t deal with CORS
v0.5.0.4 — Podcasts
Your subscriptions, everywhere
- Podcast REST API - Full access to MusicBee’s podcast subscriptions over the network
GET /podcasts — list subscriptions with title, genre, description, download counts
GET /podcasts/{id}/episodes — episode list with dates, duration, play/download status
GET /podcasts/{id}/artwork — subscription artwork
- Aggregated views (Recent, Unplayed) attribute episodes back to their parent podcast
- Pairs naturally with Play Here — stream a podcast episode directly to your phone
v0.5.0.3 — Charms & Device Proxy
The dashboard becomes a control surface
- Device Proxy -
POST /api/proxy — generic HTTP proxy for controlling LAN devices from the browser
- Forwards requests to any private-IP device (speakers, receivers, home automation)
- Bypasses browser CORS restrictions that block direct LAN device access
- Safety: only proxies to RFC 1918 private IPs, never to the public internet
- 5-second timeout, passthrough error responses
- Charm Bar - Extensible action strip on the dashboard
- Compact icons that fire actions on tap — one button per device control
- Expand menus for multi-option charms (volume +/−/mute, source picker)
- Webapp charms embed rich UI inline (Phantom control page, future device panels)
- JSON manifest format: drop a file, get a button — no code, no rebuild
v0.5.0.2 - 2026-02-14
Added
- mDNS/DNS-SD Discovery - MBXHub now advertises via Bonjour/zero-conf alongside SSDP and WS-Discovery
- Uses Windows native
DnsServiceRegister API (Win10 1809+, graceful fallback on older)
- Registered as
MBXHub (Name)._http._tcp.local with TXT records
- Visible via
dns-sd -B _http._tcp or Bonjour Browser
- Configurable Discovery Name - New
discoveryName setting replaces cryptic hash identifiers
- Friendly name pattern:
MBXHub (Name) across SSDP, WS-Discovery, and mDNS
- Empty = machine name (e.g. “MBXHub (PANDABOX)”)
- Settings UI text field on General tab, configurable via
PUT /system/settings
- Host Identity -
GET /system/version now returns host field; player status bar shows “Connected to {host}” instead of generic “Connected to MBXHub”
- RemoteApp - Publish MusicBee as a Windows RemoteApp over RDP
- New MBXR library for Windows RemoteApp registry configuration
GET /remoteapp/status — check edition, RDP enabled, configured state
GET /remoteapp/rdp — download .rdp file with audio-optimized defaults and query param overrides
- Shell CLI:
MBXHub.exe remoteapp setup|remove|status|rdp with auto-elevation
- Dashboard footer RDP download link (visible when RemoteApp enabled)
- Settings:
remoteAppEnabled, remoteAppApiDisabled (General and API Access tabs)
- Detects Windows edition (Pro/Enterprise/Server required) and RDP enabled state
- File Info Badge - Dashboard now-playing shows codec and sample rate/bitrate (e.g. “FLAC 96kHz”). Hi-res icon appears when sample rate exceeds CD quality (44.1kHz). Controlled by
hideFileInfo setting.
- Dashboard Footer Links - Customizable footer links
- New
dashboardFooterLinks setting: array of {label, url, enabled} objects
- Default links: Player, Pages, QR (disabled), RDP, API
- Settings UI: reorder, add, remove, and toggle visibility in Dashboard tab
- Add dialog discovers pages from the pages folder
- Conditional visibility: QR requires REST, RDP requires RemoteApp
- Footer is a dashboard layout section (
footer) — hide/show via dashboardLayout
v0.5.0.1 - 2026-02-11
Added
- MBXHub.exe - Standalone Shell for Windows SMTC notifications, firewall configuration, and system identity
- Windows media transport controls (play/pause/next/prev from taskbar, lock screen, Bluetooth)
- Registered App User Model ID (
HALRAD.MBXHub) for proper Windows notification identity
- Auto-reconnect with configurable retry — survives MusicBee restarts
- Single-instance enforcement with existing-instance activation
- Enabled/disabled via the MBXHub plugin settings — plugin manages the Shell lifecycle
- Built-in firewall CLI:
MBXHub.exe firewall add|remove|check|status|open (replaces standalone firebug.exe)
- AutoQ Pick Mode - Choose how AutoQ selects tracks: Off, Favorites, Weighted, or Random
- Queue Diversity Enforcement - Hard artist and genre quotas prevent same-artist or same-genre streaks in the queue
- Reaction Vibes - Reactions automatically create influences: fire/heart boost the artist, like boosts the genre, dislike/ban reduce them
- DJ Activity Feed - Reactions now appear in the party activity feed in real-time alongside requests and votes
- Artwork Folder Fallback - Album art discovery from folder images when embedded artwork is missing
- Mood Channel Editor - Visual editor in the AutoQ Tuning Console for customizing mood channels
- 2D scatter plot showing all channels in valence/arousal space
- Editable table with name, emoji, arousal, and valence for each channel
- Add, remove, and reset-to-defaults controls
moodChannels now included in GET/PUT /autoq/settings
- WS-Discovery - MBXHub now appears automatically in the Windows Explorer Network folder
- Hello/Bye/ProbeMatch on UDP 3702 alongside existing SSDP on UDP 1900
- Metadata exchange at
POST /wsd provides "Device webpage" link to dashboard
- Same
discoveryEnabled setting controls both SSDP and WS-Discovery
- Mood Estimation Retuning - Improved default mood classification accuracy
- Intense channel moved to (a=0.85, v=0.25) to prevent center-space vacuum effect
- Valence weight for mode increased (0.35) — major-key tracks get stronger valence lift
- Dissonance weight reduced (0.20) — less penalty for harmonically complex music
- Mode score for major keys increased (0.85) — better major/minor discrimination
v0.4.9 - 2026-02-03
Added
- AutoQ - Vibe-based automatic track selection for parties
- Learns from party reactions and influences to queue tracks
- Uses MusicBee's Similar Artists API to discover related music
- Configurable scoring weights and thresholds
- REST API:
/autoq/status, /autoq/start, /autoq/stop, /autoq/vibe-list
GET/PUT /autoq/settings - Read/write all tunable parameters at runtime
- Tuning Console (
/pages/autoq.html) - Mixer-style UI with vertical faders for estimation weights, horizontal sliders for scoring/behavior, live stats
- Tiered Reactions - Now playing reactions with different score weights
- Fire (+3), Heart (+2), Like (+1), Dislike (-1), Ban (-100)
POST /autoq/react - Submit reaction with nickname attribution
GET /autoq/reactions - Reaction history with optional track filter
- Floating Reactions - Teams-style emoji animations on Display page
- Reactions float up with smooth animations
- Respects
prefers-reduced-motion for accessibility
- Leaderboard - Party stats page showing guest engagement
- Top guests by reactions and requests
- Top tracks by score
- Reaction breakdown (fire, heart, like, dislike, ban)
GET /autoq/stats for custom UIs
- New page:
/pages/partymode/leaderboard.html
- Similar Artists Integration - AutoQ expansion via MusicBee
- Configurable similarity threshold (default 0.5)
- Bonus score for tracks by similar artists
- Mood Channels API -
GET /autoq/moods and POST /autoq/mood for mood-based track selection
- 10 default channels (Energetic, Dance, Intense, Upbeat, Morning, Chill, Mellow, Night, Emotional, Relax)
- Custom channels via
autoQ.moodChannels in mbxhub.json
- Estimation Settings - All AutoQ normalization parameters now tunable via
autoQ.estimation in mbxhub.json. See AutoQ Configuration for details.
- MetadataChanged WebSocket Event - Dashboard updates when rating/love changes in MusicBee UI
- Player Add To Playlist - Dropdown to add current track to any playlist
- Mood Tag Writing - Write mood labels to MusicBee custom tags
- Only writes for Essentia-analyzed tracks (real audio analysis, not BPM/rating fallback)
- Configurable target field via
autoQ.moodTagField (e.g. "Custom1")
POST /autoq/retag-moods - Bulk retag all analyzed tracks
- Tag format:
"😌 Chill" (emoji + channel name)
- Panel Mood Display - MBXHub panel shows current track's mood
- Mood label displayed for Essentia-analyzed tracks only
- Adaptive layout: single row (wide) or two rows (narrow)
- QR Code Sharing - Scan-to-connect from any page
GET /system/qr - General-purpose QR code endpoint (accepts ?url= override)
- Dashboard header QR button; party-aware (shows guest join URL when party active)
- Guest page QR button for viral guest-to-guest sharing
- DJ page Guest + DJ QR buttons for inviting from the booth
- Configurable:
disableGuestQr / disableHostQr in Party Mode settings
- Dashboard Layout Settings - Configurable panel order, visibility, and collapse grouping
- Dashboard tab in settings with drag-order and visibility checkboxes
- Collapse threshold groups less-used sections behind an expand toggle
- CUE Track Resolution - Centralized per-track metadata for CUE-backed audio files
- All surfaces (REST, dashboard, WebSocket, now-playing) show correct CUE track info
- Position-based track lookup from parsed CUE sheets
- Encoding detection: BOM, UTF-8 validation, Windows-1252 fallback
- Optional CueSharp.dll soft dependency for enhanced parsing
- Cache avoids re-parsing on every request
- Full logging via
[CUE] logger category
Changed
- Display page now shows floating reaction animations
- Reaction system integrated with AutoQ scoring
- Dashboard theme toggle collapsed to single cycling button (light → dark → midnight)
- Dashboard XSS hardening: theme whitelist validation, emoji/icon escaping
v0.4.8 - 2026-02-01
Added
- Dashboard Playlist Selector - Play any playlist directly from the dashboard
- Dropdown selector with all playlists (alphabetically sorted)
- Play button to queue and start playlist
- Located above ARiA section
- Dashboard Player Link - Quick link to player.html in dashboard footer
- Disabled when API docs are hidden
- Footer now shows: Player | API | refresh | version
- Server-side Sorting - Library endpoints support
?sort= parameter
- Options:
alpha (default), artist, album, title, date, name
- Applies to:
/library/files, /library/artists, /library/albums, /library/genres, /library/search
Changed
- Pagination Limit Increased - Maximum limit raised from 500 to 10000
- Allows fetching complete libraries in single requests
- Default limit remains 50 for efficiency
- player.html Updates
- Removed artificial 100-item limit on browse/search results
- Removed 50-item limit on playlist list
- Removed 100-item limit on track rendering (3 places)
- Track fetching limit increased from 100 to 5000
- All albums now visible including CUE-based albums at end of list
- Album Search - Removed 20-album limit in SearchAlbumTracks
v0.4.7 - 2026-01-30
Added
- PartyMode - Web-based party music system for group listening
- Guest Page (
/pages/partymode/guest.html) - Browse library and request songs
- Album, Artist, Genre, Playlist browsing with search
- Queue songs with one tap - requests attributed to nickname
- See Up Next queue (5 tracks)
- Vibes voting (thumbs up/down) on now playing and queued tracks
- DJ Page (
/pages/partymode/dj.html) - Full queue control
- Full playback controls (play/pause, prev/next, volume, seek)
- Drag-and-drop queue reordering
- See guest requests with attribution
- Guest Vibes panel showing current influences
- Display Page (
/pages/partymode/display.html) - TV-friendly display
- Large artwork with glow effect
- Live scrolling lyrics
- Request feed showing joins and song requests
- QR code overlay for easy guest access
- Current Vibes panel
- Join Page (
/pages/partymode/index.html) - PIN entry with nickname
- PartyMode API Endpoints
GET /partymode/status - Check if party is active
POST /partymode/start - Start party with PIN
POST /partymode/stop - End party session
GET /partymode/validate - Validate PIN and register join
POST /partymode/verify-dj - Verify DJ PIN for DJ page access
POST /partymode/vote - Submit vote with attribution (persisted in feed)
POST /partymode/request - Submit song request with attribution
GET /partymode/requests - Get recent requests
GET /partymode/feed - Get feed (joins, requests, votes, reactions)
GET /partymode/qr - Generate QR code image
GET /partymode/role - Get caller's role (host/dj/guest)
- QR Code Generation - Server-side QR codes via QRCoder library
- API Access Control - Granular read-only mode for REST API
- Master read-only toggle disables all write operations
- Granular controls: Player, Queue, Library, Playlists
- PartyMode endpoints exempt (always functional)
- Returns 403 with
READ_ONLY error when blocked
- Configurable in MBXHub Settings panel
v0.4.6.1 - 2026-01-28
Added
- llms.txt - AI-friendly API documentation at
/llms.txt
- Complete API cheat sheet with all endpoints
- Anatomy of a Player - UI regions mapped to APIs
- Sample code patterns (seek bar, shuffle toggle, playlists, etc.)
- Usage rules and gotchas
- Further reading guide to other docs
- Spec: llmstxt.org
v0.4.6 - 2026-01-28
Added
- Static Pages Server - Serve custom HTML pages from a configurable directory
- Routes:
/pages/, /pages/{filename}
- Serves HTML, CSS, JS, images, fonts with correct Content-Type
- Configurable via
pagesPath in settings (default: %APPDATA%\MusicBee\MBXHub\pages\)
- Falls back to embedded resources if files not found on disk
- Extracts default pages on first run (won't overwrite customizations)
- Embedded Player Page - Desktop 3-column player UI at
/pages/player.html
- Now Playing with artwork, live WebSocket updates
- Player controls: play/pause, prev/next, shuffle (Off/Shuffle/DJ cycle), repeat, volume, seek
- Browse: Artists, Albums, Genres, Playlists tabs with search
- Queue: Now/Next/Last buttons for tracks, albums, playlists
- Influencer thumbs (hidden when MBXQ unavailable), ARiA presets, Love/Ban, Lyrics
- Responsive layout for desktop and mobile
- Index Page - Landing page at
/pages/index.html
v0.4.5 - 2026-01-19
Added
- Influence System - Pandora-style thumbs up/down for shuffle preferences (MBXQueue)
- Target by Genre or Artist metadata
- Negative influences (
--) hard exclude matching tracks from shuffle
- Dashboard thumbs up/down buttons (only shown when MBXQueue connected)
- REST API:
GET/POST /influences, DELETE /influences/{target}/{value}, POST /influences/clear
- Network Discovery (SSDP/UPnP) - MBXHub advertises itself on the local network
- SSDP server announces presence via multicast (239.255.255.250:1900)
- UPnP device description at
/device.xml
- Clients can find MBXHub automatically
- Rate-limited M-SEARCH responses (security)
- Firewall Configuration UI - Settings form includes firewall management with Check/Add/Remove/Open/Script buttons (delegates to
MBXHub.exe firewall)
- Web Dashboard - Full-featured browser-based remote control
- Live WebSocket updates (progress bar, track info, play state)
- Shuffle/AutoDJ three-state toggle (Off, Shuffle, AutoDJ)
- Repeat mode toggle (cycles off → all → one)
- ARiA preset buttons (collapsible section)
- Single Port - WebSocket now uses same port as REST (no separate 8081)
- ARiA Presets - Named automation scripts for quick execution
- Remote Exit & Restart -
POST /app/exit gracefully closes MusicBee, POST /app/restart schedules a restart via Task Scheduler (enable in settings)
- Dashboard Controls - Toggle buttons (Off/Shuffle/AutoDJ/Repeat) fully interactive
- Repeat Mode - Clickable cycle through off → all → one
v0.4.2 - 2026-01-18
Added
- ARiA Input Simulation - Remote keyboard/mouse control for PC wake scenarios
/aria/status - Check if ARiA is enabled
/aria/wake - Quick wake: move mouse + send Shift key
/aria/send-keys - Send keyboard input (SendKeys format)
/aria/mouse/move - Move mouse (absolute or relative)
/aria/mouse/click - Mouse click (left, right, middle)
- Security: ARiA disabled by default, returns 403 when disabled
v0.4.0 - 2026-01-13
Added
- WebSocket Events - Real-time event streaming for player state changes
- TrackChanged, PlayStateChanged, VolumeChanged, PositionChanged
- QueueChanged, ShuffleChanged, RepeatChanged events
- Subscribe/unsubscribe to specific event types
- WebSocket test page at
/test/websocket with editable URL
- MBXQueue Integration - Smart shuffle and queue management
- Shuffle endpoints:
/shuffle/next, /shuffle/fill, /shuffle/status, /shuffle/config
- Banlist endpoints:
/banlist, /banlist/add, /banlist/remove
- Library Sync (MBXS) - Multi-device library synchronization
- Sync status, config, and control endpoints
- Device discovery and pairing
- Conflict resolution
- Settings Form Improvements
- Remote connection configuration dialog
- Developer mode unlock (7-click easter egg)
- API docs link in settings panel
- API Documentation Updates
- Added WebSocket section explaining events vs REST
- Added Shuffle, Banlist, Sync sections
- Expanded metadata fields (Rating, RatingLove, etc.)
Changed
- HTML docs at
/docs now cover 120+ endpoints
v0.3.2 - 2026-01-11
Security
- CORS restrictions: only localhost and local network IPs allowed
- Request body size limits: 1MB max to prevent DoS attacks
- Content-Type validation for JSON endpoints
- Improved error handling: no stack trace leakage to clients
Added
- Full API specification document
- Complete MusicBee API coverage via RPC (~100 methods)
v0.3.1 - 2026-01-10
Added
- Full MusicBee plugin API coverage via REST
- AutoDj endpoints (start, stop, status)
- Audio processing endpoints (equalizer, DSP, crossfade, replay gain)
- Artist pictures (full size and thumbnails)
- RPC mode for direct API access (
POST /rpc/{method})
- 74 total REST endpoints
v0.3.0 - 2026-01-09
Added
- Extended IMusicBeeApi interface (~30 new methods)
- NowPlayingHandlers, QueueHandlers, LibraryHandlers, PlaylistHandlers
- SystemHandlers (settings get/set)
- Dynamic route handling with path parameters
- 54 REST endpoints (100% SPEC coverage)
v0.2.0 - 2026-01-08
Added
- MusicBee plugin entry point
- HttpListener-based REST server
- Basic player control endpoints (play, pause, stop, next, prev)
- Volume, position, shuffle, repeat endpoints
- Now playing endpoint
- CORS support for web clients
v0.1.0 - 2026-01-07
Added
- Core interfaces (IModule, IMusicBeeApi)
- HubSettings configuration
- Module stubs (REST, MBRC, WebSocket)
- Project structure