MBXHub Changelog
The bridge to everything else.
v0.5.2.1 — Men at Work
Refinements
- Immersive NP: Blur Fill — Immersive now-playing mode shows the full album artwork (no cropping) with a blurred, saturated version of the same image filling any letterbox gaps. Works with all aspect ratios — square, portrait, and landscape art all display correctly.
- Observability — Timing instrumentation on hot code paths. REST requests over 200ms auto-promote to Info level. Client-side search render and track-change timing in browser console.
- ES5 Compatibility — Fixed search on older browsers that don’t support ES2020 optional chaining syntax.
- MusicBee API v58 — REST and RPC endpoints for expression evaluation (
/library/evaluate), placeholder artwork (/library/no-artwork), and peak/RMS metering (/nowplaying/peak). Returns 501 on older MusicBee builds.
- Volume Gesture Setting — New
dashboardLayout.disableVolumeGesture setting. Vertical swipe on artwork for volume control is now off by default to avoid conflicts with page scroll. Track skip gestures (horizontal swipe) unaffected.
- Pinch Zoom —
theme.disablePinchZoomLock unlocks native pinch-to-zoom on mobile. Also available as a toggle in the theme drawer.
v0.5.2.0 — Version Upgrade
MusicBee API v58 Support
- MusicBee API v58 — Updated plugin interface to API revision 58. Adds delegate definitions for
MB_Evaluate, Library_GetNoArtworkUrl, and NowPlaying_GetPeak. Gracefully absent on older builds.
- Browse: Tracks Tab — New search-driven Tracks tab in the library browser. Type to search tracks via
/library/search with debounced server queries and AbortController cancellation. Full track UI with play, queue next/last, listen-here, and playlist buttons.
- Browse: Video Play/Queue — Video items in both the Videos tab and search results now have play, queue next, and queue last buttons. Previously videos rendered as name-only list items with no actions.
v0.5.1.9 — Dashboard Layout Level-Up
Dashboard Now Playing Display Modes Options
- Split NP Style — Two-column grid: album art left, metadata right. Configurable column ratio (40–70%) via
mbxh_split_ratio localStorage key.
- Immersive NP Style — Full-bleed album art with gradient-scrim metadata overlay. Progressive reveal: chrome fades in on hover/touch, fades out after configurable delay (1–10s via
mbxh_immersive_fade).
- Compact NP Style — Tighter padding, smaller artwork and text for dense dashboards.
- NP Style Picker — Header button cycles through all 6 styles (Full, Compact, Horizontal, No Art, Split, Immersive). Per-device preference stored in localStorage.
- Charm Button Sizes — Configurable charm button size via
charmBar.buttonSize setting: S (32px), M (40px, default), L (52px).
- Progress Bar Thickness — Configurable via
dashboardLayout.progressBarSize: S (4px), M (6px, default), L (10px).
- Startup Diagnostics — Log now captures version+build epoch, Windows version, plugin path, settings path, port/remote/autoQ config, .NET runtime, and mood source (MetaServer or local file) on every startup.
- Settings Page — Dashboard layout now rendered as interactive checkbox list with reorder arrows (was two separate text fields for order and hidden).
- Dashboard Search — New
search section — full library search from the dashboard. Fuzzy album matching (client-side, instant) + server-side track search with AbortController. Filter tabs (All/Albums/Tracks), inline action card (play, queue next, queue last, explore), keyboard navigation (/ to activate, arrows, Enter=play, Shift+Enter=queue), search history in localStorage. Configurable bar size via searchBarSize.
v0.5.1.8 — Crate Full of Albums
Albums Artwork Explorer
- Media Endpoint —
/media/* — browse and serve images and videos from configured folders. Rotation, categories, seeking. Disable via disableMedia.
- Projector Charm — slideshow and video player at
/pages/media. Image crossfade, video transport controls, folder browser, configurable timer. Hidden by default.
- Explore Page (v3) —
/pages/explore.html — art-first album browser. Full-bleed artwork fills the viewport. Progressive reveal chrome fades in on interaction, fades out after 5 seconds. Gallery mode with crossfade transitions, fan art integration, and artist photo gallery. Edge gestures: top touch opens search, swipe up opens tracklist, tap enters gallery, double-tap plays. Transport controls (play/pause, skip, volume wheel). Source filters (All, 1mo, 3mo, 12mo, Unheard), diacritic-normalized search, enhanced album filter, PDF booklet viewing. Hidden by default in charm bar.
- Album Discovery Endpoints —
GET /library/albums/unheard (albums where all tracks have playCount=0), GET /library/albums/with-pdf (albums containing PDF booklets). Both support ?offset=&limit=.
- Artwork & PDF Endpoints —
GET /library/file/{url}/artwork-count probes embedded artwork images (up to 20, cached). GET /library/file/{url}/pdf serves PDF booklets from album folders. GET /library/file/{url}/has-pdf checks existence.
- Fan Art API — Two new endpoints for browsing folder images alongside album art.
GET /library/file/{url}/fan-art lists all images in an album's folder (Discogs scans, booklet pages, promo photos). GET /library/fan-art/{path} serves them. Excludes thumbnail artifacts and WMP cache files. Results cached per-session.
v0.5.1.7 — Remote Control Made Easy
SMTC anywhere, scanner delegation, and multi-machine polish
- SMTC Link Charm — Dashboard charm discovers MBXHub endpoints on the network and lets you switch which one the Shell’s SMTC bridges to. Tap to re-target your Windows media controls at any machine. Preferred address list with SSDP fallback replaces manual host/port config.
- Playlist Enumeration Fix —
GET /playlists was truncated. All playlists now returned correctly.
- Mixer: Network Speaker Section — network speaker scan/connect controls collapsed into an expandable section at the bottom. Local faders stay top-level.
- Preferred Remote Scanner — set
scan.remoteUrl in mbxhub-shell.json to forward scan requests to a dedicated scanner via POST /meta/scan. Host disables local scanning (scan.enabled: false), remote does the work. Results flow back via PeerSync.
- Scan Configuration UI — Local scanning toggle in autoq.html MetaServer section and SettingsForm. Discovered remote scanners listed with status. Shell config managed via
GET/PUT /meta/config endpoints.
v0.5.1.6 — Mood Data Everywhere
How I learned to stop worrying and reuse the original scan
- MetaServer — REST API in MBXHub.exe (Shell) for mood and fingerprint data backed by MBXU SQLite. Replaces the
mbxmoods.json flat file. Import existing data via POST /meta/import, query features via GET /meta/features, ingest new scan results via POST /meta/ingest. Runs on port metaPort (default: REST port + 1).
- Distributed Scanning — any machine with truedat can scan local files and POST results to the central MetaServer. Identity matching (hash → audioMd5 → metadataKey) resolves tracks across machines.
truedat --meta-server <url> for batch scanning.
- Scan Distribution — scan requests now broadcast
ScanEnqueue WebSocket events. The Shell's ScanWorker picks up work and posts results to MetaServer.
- Plugin Dual-Mode — MoodEstimator queries MetaServer on cache miss, falls back to
mbxmoods.json when MetaServer is unavailable. Background cache fill, periodic health re-check.
- MetaServer Peer Sync — MetaServer instances discover each other via SSDP and exchange mood/feature data automatically. Pull-based with delta exports (
GET /meta/export?since=), zero-config via SSDP discovery. Trigger manually with POST /meta/sync, check status with GET /meta/sync/status.
- Remote Scanning — host broadcasts UNC share paths in
ScanEnqueue WebSocket events. Remote Shell instances (scanners) open files via UNC share, run Essentia analysis, and deliver features back via PeerSync. Scanner requires zero path configuration — host owns the mapping. Configure syncLibraryPath and syncSharePath in mbxhub.json.
v0.5.1.5 — Mobile Gestures
Touch-friendly controls and gesture navigation for mobile dashboard experience
- Mobile Gestures — touch gesture controls wherever now-playing artwork is shown. Swipe artwork left/right for next/previous track, up/down for volume ±10%. In the Now Playing charm stacked layout, container swipe left/right switches panels (Now Playing → Queue → Lyrics).
/mixer/volume Endpoint — GET/PUT routes to the active default fader (player or device). All gesture volume controls use this single endpoint.
- Library Stats — artist count uses
/library/artists (was album-artists). /library/albums supports ?albumArtist= filter.
v0.5.1.4 — Player Browse More
Consolidated browse with player for consistent experience and code simplification
- Player Browse — the library browser is now used with the player for a consistent experience and code simplification. Theme and color choices sync across both views.
- Auto Mood Scan — unanalyzed tracks are automatically queued for Essentia analysis when played. Shell hosts background worker, results hot-load into mood cache. Self-disabling if Truedat not found.
- Scan Status —
GET /scan/status reports mood cache stats (total, Essentia, fallback counts).
- Browse Art Sizing — resizable album art thumbnails in the library browser via slider control. Size persisted across sessions.
- Unified Theme System — two-slot HSL color model persisted to
mbxhub.json. One theme config drives dashboard, player, browse, now playing, and mixer. GET/PUT /system/theme REST endpoints with partial update support. ThemeChanged WebSocket event for live sync across all pages.
- Browse & Search Improvements — album tab filter now matches artist name, not just album name. Artist drilldown returns broader results.
- AutoQ Track Info —
GET /autoq/track-mood now includes file URL and album fields for scan integration.
- Status Page — live dashboard with library stats, AutoQ state, mood cache, and feature flags. Correct album count (groups by album artist), mood cache display fixed.
- On-Demand Mood Scanning —
POST /scan/track enqueues a single track or full album for Essentia analysis. AutoQ tuning console shows Scan Track and Scan Album buttons when the current track uses fallback estimation. No autoScan setting required.
- Truedat Discovery — Shell automatically finds truedat.exe in the MusicBee Library folder. Fixed ScanEnqueue priority deserialization.
v0.5.1.3 — Improvements
Fun and frustration-free
- Audio Output Enumeration — new
GET /devices/audio/outputs endpoint lists all active Windows audio render devices via Core Audio (name, id, isDefault).
- Dashboard Charm Persistence — player actions no longer reset inline charm windows. Browse scroll position, drilldown state, and search are preserved across play, next, rate, love, and all other dashboard controls. Resizable inline browse window with height persisted across sessions.
- Remote SMTC — use the Windows Media control panel to remotely control a MusicBee instance on another machine. Run
MBXHub.exe --install on the remote machine, then edit mbxhub-shell.json to point at the MusicBee host. Media keys, play/pause, skip, and artwork all work across the network.
v0.5.1.2 — Mixer
Multi-fader volume control and network audio
- Default Fader — configurable default fader for quick-access controls — dashboard volume slider and keyboard shortcuts target the selected fader.
- Windows Audio Device Volume — control the system audio output device volume directly from MBXHub.
- Network Speaker Integration — Devialet Phantom support with volume control and endpoint management via REST API.
- Endpoint Source Selection — switch audio input sources on network endpoints from the Mixer charm.
- Auto-Discovery — mDNS-based discovery of network audio endpoints on the local network.
v0.5.1.0 — Taste & Discovery
Explore your library through the lens of your listening
- Taste Explorer API —
GET /autoq/taste-explorer discovers tracks adjacent to the current taste profile, grouped by genre/artist/mood. GET /autoq/similar finds tracks similar to a seed track. TasteChanged WebSocket event broadcasts profile updates.
- DJ Taste Tab — new “Taste” search tab in the DJ page showing taste-model-driven suggestions grouped by genre, artist, or mood. Similar (~) button on every track for seed-based drill-down. Vibe Filter toggle re-ranks search results by the current taste profile.
- Dashboard Connection Indicator — header shows server name with connection dot inline after the MBXHub logo. Green when WebSocket connected, dims when disconnected. Server name from discovery settings.
- Mixer Charm — expandable charm for remote audio output device switching. Lists MusicBee output devices, switch with a tap. Inline volume controls (shift-click for fine ±1). Standalone page at
/pages/mixer.html.
- Library Browser: Album Artist & Collapsible Albums — Artists tab toggles between Artist and Album Artist mode (defaults to Album Artist). Artist drilldown shows collapsible album rows with artwork, year, and track count — expand to reveal tracks. Sort drilldown albums A-Z (honoring Sort-As overrides), Newest First, or Oldest First. Search results group albums as collapsible rows. New endpoints:
GET /library/album-artists, GET /library/albums/by-artist. New ?albumArtist= filter and year-asc sort on /library/files.
- Library Browser: Album Grid Enhancements — Album cards show year and track count in subtitle. Play/queue buttons (Now, Next, Last) overlay on album artwork on hover. Sort albums from the header: A–Z, Recently Added (date added to library), Newest (release year), Oldest (release year), or Random Shuffle.
/library/albums/detailed now returns year and dateAdded per album.
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)
- Dashboard Degraded Browser Support — comprehensive
var()/clamp() fallbacks, :focus-visible fallback, emoji detection with text substitution, ES5-compatible JS, form-based volume controls for no-JS mode
- 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
- Influence thumbs (hidden when AutoQ disabled), 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 AutoQ track selection
- Target by Genre or Artist metadata
- Negative influences (
--) hard exclude matching tracks from shuffle
- Dashboard thumbs up/down buttons (only shown when AutoQ enabled)
- 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
- AutoQ - TrueShuffle and banlist management
- Shuffle endpoints:
/shuffle/status, /shuffle/reset, /shuffle/played, /shuffle/remaining
- Banlist endpoints:
/banlist, POST /banlist, DELETE /banlist/{url}
- 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