MBXHub Changelog
The bridge to everything else.
v0.5.3.1 — bring it on home
come together
- Hub neighbors — offline page lists other MBXHub instances. Two sources: local (every page load) and the new
GET /system/hub-neighbors served from the Shell's SSDP scan.
- View transitions — cross-fade between shell pages in Chromium browsers.
- Tray Libraries pre-warm — first open is instant instead of a 3s “Searching…”.
- play.html transport metadata fix — was missing on narrow portrait, duplicated on widescreen + Now Playing. Now mode-driven at every width.
- Listen Here on play.html — output toggle in the transport flyout. Speakers (room / MusicBee, the default) or this device's browser (private audio via
/stream/<file>). Play/pause, prev/next, volume, mute, scrubber, and auto-advance all route to the active side. Flipping to browser pauses MB; flipping back resumes. Small 🎧 chip in the transport bar shows the current target. Persisted per-client in localStorage.
- Explore icon cycles album / detail view — same icon on the play.html transport. First click activates explore, subsequent clicks toggle the expanded hero + track-list overlay. Same hook the T / Enter keys have always exposed.
- browse search expanded in iframe — the click-to-expand search icon stays only at phone widths (<700px). At desktop / tablet widths the input is always full-width so you can start typing immediately.
v0.5.3.0 — cmd and search more
- Federated search endpoint — New
GET /search?q=&buckets=&limit=&cursor= runs typed buckets in parallel (tracks / albums / artists / playlists / saved / etc.) with cursor pagination on the tracks bucket, facet counts, and a top-hit response. Backs the Cmd+K palette and any client wanting a single call instead of fanning out. ?dsl=true opt-in routes the query through the new DSL parser.
- Search DSL — Qualifier syntax (
artist:, album:, genre:, year:, rating:, fmt:, range / boolean / grouping operators) on top of the existing strict / substring modes. Opt-in per call via ?dsl=true on /library/search and /search; cheat sheet at GET /library/search/syntax. Default off so existing free-text callers are unaffected.
- Saved searches (CRUD + scheduled evaluation) — Persist a query under a name and have the server re-run it on a schedule.
GET|POST /search/saved, GET|PUT|DELETE /search/saved/{id}, GET /search/saved/{id}/results, POST /search/saved/{id}/run. Backed by mbxhub-search.json next to mbxhub.json. Background SavedSearchScheduler ticks per-saved-search interval, evaluates, diffs against last-match URLs, and broadcasts a new SearchMatched WebSocket event when matches change. Disabled by default; enable via library.searchDsl.savedSearch.enabled. Write/mutation routes honor ApiReadOnlyMode.
- Search history —
GET /search/history?limit=N, POST /search/history (append; empty body clears), DELETE /search/history. Server-side recents log shared by Cmd+K and any other search bar; falls through to client localStorage if the endpoint is missing or 404s. Mutations gated on ApiReadOnlyMode.
- Search-engine state surface —
GET /system/search-index reports the live engine (currently mb) and its index state. FTS5 substrate dropped during the post-decouple harvest; the seam is preserved so a future engine can plug in without touching the call sites.
- Cmd+K command palette on play.html — The keyboard-driven palette that’s lived on the dashboard now drops into
play.html too. Shared cmdk-bootstrap.js loader, same actions (Play/Pause/Skip/Volume, Open Charms / Settings / Mixer / Player / Browse / Explore / ARiA, Start AutoQ radio), same federated search, same recents. Press Ctrl+K from anywhere on play.html.
- Cmd+K palette shows global keyboard shortcuts — Action rows now display the global hotkey alongside (e.g. Play / Pause → Space, Skip → →, Previous → ←, Volume up/down → ↑/↓). The cmdk doesn’t bind these — the host pages already do — the palette is just a discoverable cheat sheet.
- Track comment as lyrics fallback — When
/nowplaying/lyrics has nothing real to return, MBXHub now surfaces the track’s Comment tag in the lyrics panel with a small “from comment” chip above it. Concert setlists, venue notes, and album liner notes show up where lyrics would on nowplaying.html (and therefore on play.html, which embeds it). Configurable via the LyricsFallback settings section (Enabled, MaxDisplayChars, Label); hard-killable via ApiDisableLyricsFallback.
- Installable web app (PWA) — MBXHub ships a Web App Manifest (
/manifest.webmanifest) at root scope so every host page (dashboard, play.html, explore, browse, …) is installable to the home screen / desktop. PWA icon set at /icons/{name} — icon-192.png, icon-512.png, maskable variants, plus the 180px Apple touch icon — generated as MBXHub. Manifest name picks up the host’s display name dynamically (__HOST_NAME__ substitution); start_url is / so launching the icon opens straight to the dashboard.
v0.5.2.9 — Play On
play more more play
- play.html artist typeahead — Type a single letter into the artist column to jump to the first match (1.2s pulse-highlight); type two or more to filter the list down to substring matches. Esc, Backspace-to-empty, or selecting an artist clears. Filter mode is sticky — no idle-clear — so you can read the matches at your own pace.
- play.html parity with player.html — Reactions row in the AutoQ cluster (fire / heart / like / dislike / ban →
/autoq/react), “+ Add To Playlist” dropdown beside love and stars (last-used playlist bubbles to the top with a star marker), ARiA presets dropdown in the overflow flyout (auto-hides if ARiA isn't enabled), influence thumbs (artist + genre) on the right-column now-playing card, global media-key shortcuts (Space = play/pause, ← = prev, → = next), and a 30s position-poll safety net behind the WebSocket. Player.html's add-to-playlist + reactions + ARiA + influences are now fully mirrored on play.html.
- Browser logs go to mbxhub.log — play.html now batches
console.warn/error sites through POST /system/client-log on a 2-second flush (and sendBeacon on pagehide). Same model dashboard already uses; users running Release builds with no devtools open finally see browser-side errors in the file log.
- play.html overflow flyout auto-closes after firing an action — Tablet/phone overflow popover used to linger after clicking a button inside it; now dismisses next-tick except when the click hits a sub-popover trigger (Add To, ARiA), which keep the parent alive while their menus are open.
- play.html artist drawer is sticky in tablet-landscape — In 700-1023 landscape, the slide-over drawer no longer dismisses on click-outside — you can poke around the middle pane without losing your place. Escape, the drawer-toggle button, and picking an artist are the explicit close paths. Phone / portrait-tablet keeps the original click-outside dismiss because the drawer covers most of the viewport there.
- Play charm — New first-class “Play” charm with an outline-triangle icon that opens
/pages/play.html as a webapp surface, mirroring the existing Player / Explore / Browse charm convention.
- Dashboard no longer steals focus on track change —
updateTrack now uses the soft inline-refresh path instead of a full location.reload(). The reload was raising the dashboard tab to foreground on Firefox (and some Chrome configs) every time MusicBee changed tracks, even when the user was reading in another window. Soft path covers the same content delta — rating, love, duration, progress, influence buttons, artwork — without the focus side-effect.
- Shell tray menu — Machines submenu renamed to Libraries; each enumerated peer now offers Show QR code and Show diagnostics alongside Open dashboard / Set as SMTC target, opening
/system/qr and /diag on that specific host.
v0.5.2.8 — Technologic
Harder, Better, Faster, Stronger
- SMTC Bridge target switching — Tray menu lists the local MBXHub plus discovered network peers; click to retarget the SMTC bridge to any of them. Useful when you want the Windows media flyout / lock screen / Bluetooth controls to mirror a different machine's playback.
- Headless tray toggle —
tray.disableTrayIcon: true in mbxhub-shell.json runs the Shell with no tray icon. SMTC bridge still publishes; just no UI.
- Aspect-ratio sizing — Panel and artwork scale together via CSS
aspect-ratio. Pick a ratio, get that ratio.
- New settings for dashboard nowplaying column width, height, and gutter —
ColumnMaxWidth, ColumnGutter, and ImmersiveMaxHeight in mbxhub.json. ImmersiveMaxHeight default bumped 400 → 600.
- ImmersiveArtFit setting — Pick
contain (default; whole album art with blurred-background letterbox) or cover (cropped to fill panel edge-to-edge, no bars).
v0.5.2.7 — Nothing Else Matters
Keeping what matters, removing what doesn’t
- Mood scanning removed from MBXHub — Cut all integrated mood scanning, federation, fleet aggregation, peer-sync, and MetaServer from MBXHub. AutoQ stays first-class, reading a static
mbxmoods.json populated offline by truedat.
- MetaServer endpoints removed — All
/meta/* endpoints removed from the REST surface.
v0.5.2.6 — in progress
A Plethora of Settings and More
Installation profiles — Standalone / Island / Fleet dial drives MetaServer, peer-sync, SSDP, warm-up, fallback, remote-bind. Standalone is the new default. GET/PUT /system/endpoint-type.
- MBXHub.exe tray + auto-launch MusicBee — UI-mode dispatcher (GUI/tray on no-args, CMD on subcommand,
-cli attached). Tray: Open MusicBee, Status, Reconnect, Settings, Start with Windows, Quit. Click from Start menu launches MusicBee.
- Settings — A lot of new and rearranged controls land in both the plugin’s Settings window and the browser settings page. Most changes apply live without restarting MusicBee. Profile-driven defaults make a fresh install behave sensibly out of the box.
API Access — Fleet-routing edits have their own permission now, separate from shuffle controls. New master switch on the Shell to block remote writes to its endpoints.
- Settings UX — Settings form rearranged for clarity. Bandwidth toggles grouped together. AutoQ has a single master on/off that gates the related settings. Tabs run horizontally instead of vertically. The Start Shell button got a clearer label, and the SMTC toggle moved to the API Access tab where it logically belongs.
- NP panel cap —
ImmersiveMaxHeight now honored across zoom variants and the desktop ≥1024 px @media block (was previously stomped by hardcoded ceilings).
- Diagnostics & Performance — New
/diag page with live charts of CPU, memory, threads, and GC for spotting performance issues. Detailed log lines at the most-important decision moments make future spikes easy to trace.
- Configurable transport button — The extra button in the dashboard transport row (used to be hardcoded to Explore) can now be set to open a charm or a page of your choice. Configured in Settings.
v0.5.2.5 — Worker Bee
Beekeeper’s Daughter
- play.html — new player page — Device-adaptive 1/2/3-column view for phone, tablet, and desktop browsers. Incorporates explore, browse, and now-playing surfaces, shaped after the MusicBee 3 default skin. Adapts to device and theme settings.
- Dashboard theme color picker redesign — Native browser color pickers, curated preset swatches, and an intensity (saturation) slider. Reaches pure black, pure white, and true neutral grays; background, surface, text, and accent each get independent hue/saturation/lightness.
v0.5.2.4 — Moodserver
Dynamic Range Computation
- Dynamic Range as a mood feature — Essentia LRA (BS.1770 Loudness Range in LU) now travels alongside BPM/Loudness/etc. into the AutoQ mixer. Arousal weight slider defaults to 0.05. Fallback chain for legacy entries: derive from Loudness/RMS, then genre-default (classical 17, jazz 13, rock 10, metal 6, hip-hop 5), then constant 8.
Distributed Scanning
Scanner Pool with auto-discovered workers — Master Shell's ScannerPool in scan.mode = "auto" builds a round-robin pool from local + every SSDP-discovered peer that advertises the scanner capability (i.e. has truedat.exe installed). Plugin's ScanEnqueue WebSocket events get dispatched across the pool: local scans run in-process, remote dispatches POST /meta/scan with the file's UNC share path so the worker can read it over the network. Failed nodes are marked unhealthy after 3 consecutive failures and probed every 60 s.
UNC share path resolution — Two new settings, SyncLibraryPath (e.g. D:\Music) and SyncSharePath (e.g. \\masterpc\music), let the master compute UNC paths for files when dispatching scans to remote workers. Workers receive the share form, pass it to truedat as the file path, and read the audio over SMB. Without these set, remote dispatch falls back to the local path (only useful if all nodes share a drive letter).
POST /meta/scan on Shell — New endpoint accepts {file, share, priority} and enqueues into the local ScanWorker. Responds 200 {status: "queued", file} immediately; truedat runs and ingests asynchronously. 503 SCANNER_UNAVAILABLE when the node has no truedat installed.
Merge-on-ingest federation — MetaService.IngestAsync used to be first-write-wins: any existing row with non-zero base fields caused the entire incoming observation to be dropped. That meant a peer rescanning with a richer feature set couldn't fill in missing fields. New three-tier strategy: new row → full write; all-zero garbage → full overwrite (recovery); existing with data → merge (base scalars stay first-write-wins to avoid stomping good data, nullable extended fields fill from null, DR upgrades when incoming source rank is strictly higher: essentia-lra > derived-peak-rms > fallback-genre > fallback-none). Federation now actually converges across heterogeneous peer versions.
39 Extended Essentia Features
- Full Essentia output now persisted — truedat used to extract ~15 scalars from Essentia's streaming-extractor-music output and discard the rest. 39 additional scalar features now plumbed end-to-end: loudness dynamics (momentary, short-term, replay-gain), silence profile (20/30/60dB), spectral shape (rolloff, complexity, entropy, kurtosis, skewness, spread, strong-peak, decrease, energy + 4 energy bands), HFC, full Bark/Erb/Mel band stats (crest, flatness, kurtosis, skewness, spread × 3 families), beats-loudness, chords-strength, HPCP crest & entropy. All nullable so legacy rows read as null, never 0. autoq.html Track Mood Data renders all 54 feature rows with — for fields the track lacks.
- truedat re-extract gate — Cache-reuse paths in truedat now check
!DynamicRange.HasValue; tracks from old truedat builds (no LRA) automatically fall through to a fresh Essentia pass on next run, picking up all 39 new fields in the same analysis. Cache copy preserves the full feature set across reruns once captured.
Fleet Dashboard
GET /system/fleet aggregator — Single endpoint on master plugin fans out to local Shell + every knownPeers entry in /meta/sync/status, fetches each node's /meta/health and /meta/stats in parallel (3 s per-node timeout), returns aggregated queue depth, scan status, sync state, DB size. Per-node status field flags up | down | timeout so partial outages don't fail the whole call.
Fleet panel in autoq.html — New table under MetaServer section polls /system/fleet every 5 s while the page is visible. Per-row: name, status dot, tracks, queue depth (highlighted in accent when >0), scan status, last-sync rel-time, last-sync result, DB size. Headline meta line shows N/M nodes up · X tracks · Y queued · updated Zs ago. Pauses on tab hide; manual refresh button.
Per-node worker visibility — Fleet table now surfaces the scan worker's live state per node.
Explore Enhancements
- Discography navigation inside “More Info” — Clicking an album in the related-albums grid of the expanded album view now updates the view in place instead of collapsing it and dropping you back to the top-level stack. Hero, track list, metadata, and image strip re-render for the newly-selected album; the grid’s active marker moves along.
- Arrow-key navigation of the discography grid — Left / Right arrows while the expanded view is open step through the discography grid, scrolling the target card into view and populating the expanded panel with the new album. Works the same way for both solo-artist and compilation contexts (which surface same-title-different-artist rows).
v0.5.2.3 — XL Charms
Whole Lotta Love
- Charm Bar: XL & XXL Sizes — Charm and transport button sizes now cycle S / M / L / XL / XXL (XL = 64px, XXL = 76px). The previous “Large” (52px) was too small for comfortable touch on small high-density panels — XXL lands at ~0.6″ physical, right in the sweet spot.
- Per-Charm Size Overrides — New
charmBar.sizeOverrides dictionary (charm ID → S/M/L/XL/XXL) lets individual charms break from the bar-level size. A single charm class-name override wins via CSS specificity, so you can keep the bar compact while boosting one specific charm.
- Charm Row Breaks — New
charmBar.breakBefore list of charm IDs forces a row break before any named charm. Combined with Per-Charm Size Overrides, the volume mixer can sit on its own row with XL buttons while the rest of the charms stay at M — one-handed tablet use gets easier without blowing up every button.
- NP Text Size Applies to All Styles — The
dashboardLayout.immersiveTextSize setting (S / M / L / XL) now governs metadata text size for every now-playing style, not just immersive. Classes renamed internally from immersive-text-* to np-text-*; the setting name is unchanged for backward compatibility.
- ARiA Action-Menu Charm — ARiA moved out of the toggles row into its own built-in charm (
aria.json). New display: "action-menu" charm mode: single trigger + popover of preset actions. Keyboard-navigable (Arrow nav, Enter activates, Tab/Esc closes), auto-orients above or below the trigger based on viewport position. Presets continue to come from AriaPresets in mbxhub.json; the charm's expand is populated at load time. Respects all charm-bar settings (order, hidden, size, sizeOverrides, breakBefore).
- Adjacent-Token Search (default on) — Multi-word library searches now require the query tokens to match consecutive word prefixes in a single field (title, artist, album, or genre). “St Anger” matches the album St. Anger but no longer pulls in a track whose title contains “Anger” while its album contains “Story.” Single-word queries are unaffected and still use the strict prefix + concat fallback (so “acdc” still finds AC/DC).
- New Setting:
library.disableCrossFieldMatching — Toggles the new adjacency rule. Defaults to true (adjacency required, the new default). Set to false to restore the previous cross-field behavior where tokens could match anywhere across any of the four fields. Ignored when substring search is enabled. Exposed as a checkbox in Settings (Configuration → Library) and picked up by the dashboard settings page; browse.html honors it live from /system/settings.
- Artwork Sizing Fix (zoom@67 + horizontal) — Fixed CSS.
- Explore: Queue-Next Button on Expanded Tracks — Expanded album track rows now show a “Next” button alongside the existing queue-last
+, rendered as a hover overlay.
- player.html 3-Column Transport Fix — Transport, progress, stars, and reactions were squeezed into the artwork-flanked
.meta column on FHD 3-col layouts. Controls are now lifted out to span the full .player width, and they stay visible when the NP card is collapsed.
- Split NP Layout Fix —
.np-style-split rows now include min-width: 0 so square art no longer letterboxes inside a tall column when the metadata panel shrinks.
- Footer: Settings Entry —
/pages/settings.html added to the default dashboardFooterLinks list (disabled by default). Tick it in the plugin Settings dialog to surface it in the dashboard footer.
v0.5.2.2 — Search Party
I Still Haven’t Found What I’m Looking For
- Library Search Word Boundaries — Fixed a regression where library search matched query words as loose substrings, so “St Anger” pulled in every album containing “Stranger.” Server search and browse.html inline/tab-badge filters now match each query word as a prefix of a real word in title/artist/album/genre.
- Album Artist Toggle in Search Results — Fixed: the Album Artist / Artist toggle on the Library Browser Artists tab is now honored when results come from a full-text search.
- New Setting:
library.disableSubstringSearch — Controls library search matching globally. Defaults to true (strict word-boundary, the new behavior). Set to false to restore loose substring matching library-wide. Exposed as a checkbox in the plugin Settings dialog (Configuration → Library) and picked up automatically by the dashboard settings page.
- Per-Call Search Override —
GET /library/search accepts a new ?substring=true|false query parameter that overrides the setting for a single call. The response now includes a mode field ("strict" or "substring") echoing which path was taken so clients can verify.
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