Release history
A modern Music Player Daemon based on Rockbox firmware releases
All releases
33 shown
Fixed DSP compressor divide‑by‑zero crash, startup hangs caused by O(N²) FTS5 backfill and SQLite migration stalls, and audible silence gap at track start on Linux.
Full changelog
[2026.05.09]
Fixed
- DSP compressor divide-by-zero crash on x86_64 (
SIGFPEinget_att_rls_coeff) — addedrelease > 0guard incompressor_update()mirroring the existingattack > 0guard; ARM64 silently returned 0 on integer divide-by-zero while x86_64 faulted; also added function-level guards inget_att_rls_coeffandget_lpf_coefffor zerorc/fs/rc_unitsparameters, and an earlyfs <= 0return incompressor_updatefor uninitialised output frequency - Startup hang on second+ launch — FTS5 backfill
WHERE NOT EXISTS (SELECT 1 FROM fts_table f WHERE f.id = t.id)forced an O(N) full scan per row (O(N²) total) becauseidisUNINDEXEDin FTS5; replaced all four backfill INSERTs with an uncorrelatedWHERE NOT EXISTS (SELECT 1 FROM fts_table)which SQLite short-circuits at the first row (O(1) for non-empty tables) - Library startup blocked indefinitely on repeated runs — SQLx hangs when re-executing
CREATE VIRTUAL TABLE IF NOT EXISTSon an existing FTS5 virtual table; fixed by checkingsqlite_masterbefore the migration and skipping it entirely iftrack_ftsalready exists; same guard added fordedupe_genres(checksUNIQUEconstraint ongenretable) - FTS5 and
dedupe_genresmigrations ran in slow DELETE journal mode —PRAGMA journal_mode=WALwas set only after all migrations; moved toSqliteConnectOptions::journal_mode(Wal)so WAL is active from the first connection - FTS5 index migration moved to a background
tokio::spawntask so startup is non-blocking;dedupe_genres(schema DDL) remains synchronous with an O(1) skip guard - cpal PCM sink: audible silence gap at the start of every track on Linux —
sink_dma_start()previously stored the first chunk inpcm_data/pcm_sizeand then calledpthread_create, leaving the ring empty for the 1–5 ms thread-creation window; fixed by pushing the first chunk synchronously viapcm_cpal_push()before spawning the writer thread so the ring is pre-filled whenrunning=trueis set; the writer thread now picks up from chunk 2 onwards; also added!r.runningearly-exit to the f32 cpal callback (mirrors the existing i16 guard) and reset resampler state (cur_valid = false,phase = 0) inpcm_cpal_start()to prevent interpolation artefacts from the tail of the previous track
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.05.06...2026.05.09
- Headless host target using `cpal` PCM sink for any OS audio backend (ALSA, CoreAudio, WASAPI, JACK) — build via `scripts/build-headless.sh`
- Genres API with gRPC, GraphQL, REST, and CLI endpoints plus bundled SQL deduplication migration
- Disc/track number support in Expo mobile album view (`TrackList` component renders disc‑section headers)
Full changelog
[2026.05.05]
Added
- Headless host target and
cpalPCM sink (audio_output = "cpal") — runs Rockbox without SDL on any OS audio backend (ALSA, CoreAudio, WASAPI, JACK) via CPAL; build withscripts/build-headless.sh; documented inHEADLESS.md - Genres API — gRPC, GraphQL, REST, and CLI endpoints to list genres, fetch tracks by genre, and add genre-based smart playlist rules; genre deduplication SQL migration bundled
- Disc/track number support in the Expo mobile album view —
TrackListcomponent sorts by (disc, track) and renders disc-section headers for multi-disc releases;proto track_number/disc_numberfields mapped through to the UI - Pull-to-refresh / rescan in the Expo library tab
Changed
- CI workflows, macOS build scripts, Dockerfile, and
install.shstreamlined — significant reduction in duplication and overall build time - Android
cdyliboption now available in thetools/configureinteractive menu
Fixed
- M4A/AAC files decode silently in
CODECS_STATICbuilds — dead-write elimination inlibm4a/demux.cwas optimizing away box-parsing reads; replaced with live-return readers (stream_read_uint*+stream_skip) - macOS linker:
Security.frameworkexplicitly linked inzig/build.zigto resolve missing symbol errors when using macOS Security APIs - Expo mobile app re-establishes gRPC subscriptions when the app returns to the foreground (
reconnectEpochbump +reapplyServerUrl())
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.05.03...2026.05.05
- Debian and RPM packages now declare XKB/XCB build dependencies: libxkbcommon-dev, libxkbcommon-x11-dev, libxcb1-dev, libxcb-render0-dev, libxcb-shape0-dev, libxcb-xfixes0-dev; update install instructions accordingly
- GPUI titlebar drag areas now use `window.start_window_move()` on mouse down, fixing window dragging on Linux/X11
- Linux-specific minimize/maximize/close buttons added to GPUI titlebar (macOS/Windows retain native traffic‑light controls)
- Mintlify documentation site under `mintlify/` with Linden theme, regenerated OpenAPI spec and CardGroup architecture diagrams
Full changelog
[2026.05.03]
Added
- Mintlify documentation site under
mintlify/with the Linden theme; OpenAPI spec regenerated and ASCII architecture diagrams replaced withCardGroupcomponents - Linux-specific window controls (minimize / maximize / close) in the GPUI titlebar — macOS/Windows continue to use native traffic-light controls
Changed
- GPUI titlebar drag areas now call
window.start_window_move()from anon_mouse_downhandler instead of relying onWindowControlArea::Drag, fixing window dragging on Linux/X11 - Debian and RPM packages now declare XKB/XCB build dependencies (
libxkbcommon-dev,libxkbcommon-x11-dev,libxcb1-dev,libxcb-render0-dev,libxcb-shape0-dev,libxcb-xfixes0-dev); README updated with the matching install instructions - Debian package version bumped to
2026.05.03
Fixed
- GPUI app no longer fails to build on Linux:
souvlakiis now a non-Linux-only dependency andNowPlayingManagerships a no-op Linux stub, since the OS media-control APIs souvlaki targets are not available there
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.05.02...2026.05.03
- New SDKs for Python, Ruby, Elixir, Gleam, and Clojure with comprehensive examples
- TypeScript SDK expanded to include 15 runnable examples, Bluetooth API (`api/bluetooth.ts`), `getVolume`/`VolumeInfo` endpoints on `api/sound.ts`, and type additions `browse.displayName` & `album.copyrightMessage`
Full changelog
[2026.05.02]
Added
- New SDKs for controlling rockboxd from Python, Ruby, Elixir, Gleam, and Clojure (
sdk/python/,sdk/ruby/,sdk/elixir/,sdk/gleam/,sdk/clojure/) — each ships with examples covering playback, queue, library search, saved/smart playlists, volume/EQ, browse, devices, Bluetooth, and plugins - TypeScript SDK gains 15 runnable examples (
sdk/typescript/examples/) plus a Bluetooth API (api/bluetooth.ts) and agetVolume/VolumeInfoendpoint onapi/sound.ts - TS SDK types extended with
browse.displayNameandalbum.copyrightMessage
Fixed
- HTTP/remote tracks now hydrate
Mp3Entrymetadata (title, artist, album, duration, etc.) from the DBTrackrecord in the playlist handlers when Rockbox cannot read tags locally - GPUI Library page: text truncation and unexpected overflow on likes and track rows resolved by adding
min_w_0/flex_shrink_0to the flex containers
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.05.01...2026.05.02
- Raise `RLIMIT_NOFILE` to 4096 on Unix at startup to support large music libraries.
- Shared Tokio runtimes for controls and MPD servers now use `OnceLock` to avoid nested‑runtime panics.
- Migrated HTTP server (`crates/server`) from custom layer to Actix‑web; handler signatures changed to use `web::Data`, `web::Path`, `web::Query` and return `actix_web::Result`.
- Bluetooth button in GPUI mini-player opens device picker and fetches paired devices when Bluetooth is available.
- Cover URLs now follow active server via `get_covers_base()` instead of hardcoded base URL.
Full changelog
[2026.05.01]
Added
- Bluetooth button in the GPUI mini-player — shown when Bluetooth is available; opens the device picker and fetches paired devices on toggle
- Cover URLs in GPUI now follow the active server via
get_covers_base()instead of the hardcodedhttp://localhost:6062/covers/base
Changed
- HTTP server (
crates/server) migrated from a custom request/response layer to Actix-web — handlers now acceptweb::Data,web::Path, andweb::Queryand returnactix_web::Result<HttpResponse>; blocking C FFI work is offloaded toweb::block - Tokio runtimes for the controls and MPD servers are now shared via
OnceLockinstead of being created per-thread, reducing overhead and avoiding nested-runtime panics RLIMIT_NOFILEis raised to 4 096 at startup on Unix to accommodate large music libraries
Fixed
- Audio
stopandpauseare now non-blocking — they useaudio_queue_postso they can safely be called from any OS thread;audio_hard_stoppostsQ_AUDIO_STOPwithdata=2and the audio thread freesaudiobuf_handleitself, preventing cross-thread frees - Blocking C FFI calls in playlist handlers run on
web::blockthreads to avoid starving Actix worker threads and prevent nested tokio/reqwest blocking contexts - Live metadata lookups are skipped for HTTP tracks; Rockbox's own UPnP renderers are excluded from the UPnP device list
- Bluetooth availability check uses
fetchGlobalStatus()(gRPCGetGlobalStatus) instead ofgetDevices()to avoid spuriousUNIMPLEMENTEDerrors on probe - Bluetooth availability is now polled in a background task and updated via
std::sync::mpscto avoid cross-runtime waker issues when bridging Tokio → GPUI observe_globalregistrations in GPUI now call.detach()instead of silently dropping the subscription handle- RFC3339 datetime migration — a SQL migration normalises
NULL/blank andYYYY-MM-DD HH:MM:SStimestamps in the library database to RFC3339 so SQLxDateTime<Utc>decoding no longer fails - Favourites queries now use
INNER JOINand filter out empty-string IDs, excluding bogus entries from results - mDNS scanning now prefers IPv4 addresses (192.168 → 10 → others) and selects the best non-loopback/link-local address so multiple records for the same host coalesce correctly
println!/eprintln!diagnostics incrates/controlsandcrates/mpdreplaced withtracing::error!- macOS app listens for server-change notifications and restarts streaming, re-fetches settings, device state, and Bluetooth state on server switch
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.31...2026.05.01
Fixed mDNS device ID persistence across daemon restarts.
Full changelog
[2026.04.31]
Fixed
- mDNS device ID is now persisted across restarts — a 64-bit hex ID is generated once and cached in
~/.config/rockbox.org/device-id, so the registered mDNS service name remains stable between daemon restarts instead of changing on every launch
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.30...2026.04.31
- Bluetooth device support in GPUI and web UIs for pairing/connecting/disconnecting
- mDNS-based server discovery with runtime switching via Server Picker UI without restart
- UPnP album art caching through `album_art_uri` and concurrent metadata persistence
Full changelog
[2026.04.30]
Added
- Bluetooth device support in the GPUI and web UIs — list paired/discovered devices, connect and disconnect directly from the device picker
- mDNS-based server discovery and runtime server switching —
scan_mdns()in the daemon registers itself via mDNS; the GPUI app and macOS app gain a Server Picker UI that enumerates nearbyrockboxdinstances and switches without restart; a notification triggers one-shot syncs to re-run on server change - UPnP album art saved for remote tracks —
album_art_uriis returned from UPnP directory listings;save_audio_metadatadownloads and caches the cover when no embedded art is present; remote metadata is persisted concurrently (semaphore-limited) without blocking C/FFI copyright_messagefield on theAlbumGraphQL type, displayed inAlbumDetailsalongside a formatted release date- Typesense bundled in the Docker image — the Dockerfile now pulls the typesense image and copies
typesense-serverinto the final image
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.29...2026.04.30
- Renamed `BluetoothService` gRPC method `Connect` to `ConnectDevice`
- Added rockbox CLI commands for Bluetooth speaker management (`bluetooth scan`, `bluetooth devices`, `bluetooth connect <id>`, `bluetooth disconnect <id>`)
- Bluetooth GraphQL resolvers now call `rockbox-bluetooth` directly, removing an extra round‑trip on Linux
Full changelog
[2026.04.29-2]
Added
- Bluetooth speaker management commands in the
rockboxCLI (bluetooth scan,bluetooth devices,bluetooth connect <address>,bluetooth disconnect <address>) — Linux only, talks to a runningrockboxdvia gRPC - Bluetooth GraphQL resolvers (
bluetoothDevicesquery,bluetoothScan/bluetoothConnect/bluetoothDisconnectmutations) now callrockbox-bluetoothdirectly instead of going through the HTTP server — eliminates an extra round-trip on Linux
Fixed
BluetoothServicegRPC RPC renamed fromConnecttoConnectDeviceto avoid a name collision with tonic's auto-generated transportconnectconstructor, which caused a compile error (duplicate definitions with name connect)
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.29-1...2026.04.29-2
Fixed macOS app file navigation and device picker display issues.
Full changelog
Fixed
- macOS app Files view: navigating from the root into Music no longer yields an empty list —
.taskID now encodes both mode and path so a mode change with a nil path correctly triggers a reload - macOS app device picker: now lists all output devices (including the current one, marked with a checkmark) instead of only non-current devices; added
snapcasticon/colour entry - macOS app device picker: no longer shows a loading spinner on open when devices were already preloaded at startup —
refresh()only setsisLoadingwhen the device list is empty
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.29...2026.04.29-1
- UPnP/DLNA device browsing integration in Files view with queue and play capabilities
Full changelog
[2026.04.29]
Added
- UPnP device browsing in the Files view — queue and play tracks directly from any UPnP/DLNA media server on the local network
Fixed
- HTTP stream (
netstream) no longer permanently breaks after a failed seek:seek_to()now only replaces the active response on success, so a failed Range request leaves the stream readable at the current position - Small forward seeks (≤ 128 KB) in HTTP streams are now satisfied by skipping bytes in the existing response body instead of issuing a new Range request, avoiding unnecessary round-trips during codec metadata parsing
- Buffering:
TYPE_ID3handles for remote tracks that fail to open now sendBUFFER_EVENT_FINISHEDwith an emptymp3entryinstead of silently never postingQ_AUDIO_FINISH_LOAD_TRACK, which caused the track-loading chain to stall on playlist restore with many queued UPnP tracks - Web UI Files view: Music and UPnP Devices row icons no longer disappear on hover — CSS selector changed from descendant (
) to direct-child (>) combinator so the.no-playguard is respected
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.28...2026.04.29
- Real-time PCM loudness normalizer (`normalize_volume = true` in `settings.toml`) with RMS-based AGC applied across all PCM sinks
- `GET /player/volume` REST endpoint returning `{ volume, min, max }`
- `volume` GraphQL query and `useGetVolumeQuery` hook providing live current volume with range
Full changelog
[2026.04.28-1]
Added
- Real-time PCM loudness normalizer (
normalize_volume = trueinsettings.toml) — RMS-based AGC with asymmetric attack/release, similar to Spotify's "Normalize Volume"; applied across all PCM sinks (SDL, FIFO, AirPlay, Squeezelite, UPnP, Chromecast, Snapcast TCP) GET /player/volumeREST endpoint returning{ volume, min, max }volumeGraphQL query returning live current volume with min/max rangeuseGetVolumeQueryGraphQL hook in the web UIget_current_volume()gRPC client helper in the GPUI app
Fixed
- Volume slider in GPUI mini-player now responds to mouse clicks (replaced plain
divwithSeekBarcomponent) - Volume slider in web UI now uses correct 0–100 range with explicit
min/maxon the MUI Slider globalSettings.volumein GraphQL now returns the live current volume viarb::sound::current(0)instead of a hardcoded0VOLUME_MIN_DBconstant in GPUI corrected from-74to-80(SDL target range)- Volume in GPUI loads the live value at startup via
SoundCurrentgRPC instead of the stale saved setting adjust_volumenow has audible effect on all non-SDL PCM sinks (FIFO, AirPlay, Squeezelite, UPnP, Chromecast, Snapcast TCP) — SW volume scaling (pcm_copy_buffer) was not being applied in any of these sinks
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.28...2026.04.28-1
- Add Snapcast TCP PCM sink with stream metadata
Full changelog
What's Changed
- Add Snapcast TCP PCM sink and stream metadata by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/159
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.27...2026.04.28
Routine maintenance release for A modern Music Player Daemon based on Rockbox firmware.
Changelog
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.27-1...2026.04.27-2
Routine maintenance release for A modern Music Player Daemon based on Rockbox firmware.
Changelog
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.27...2026.04.27-1
- UPnP/DLNA media server and sink
- Chromecast WAV header accuracy improvements, art caching, Content-Length enforcement
- Device picker UI with Squeezelite client support
Full changelog
What's Changed
- Add UPnP/DLNA media server and sink by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/152
- Enhance Chromecast WAV header accuracy and art caching by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/153
- Enforce Content-Length for Chromecast WAV and add documentation by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/154
- Add Chromecast section to README by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/155
- Add device picker UI and Squeezelite client support by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/156
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.25...2026.04.27
- Saved playlists support
- Smart playlists support
Full changelog
What's Changed
- Add saved and smart playlists support by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/148
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.24...2026.04.25
Routine maintenance release for A modern Music Player Daemon based on Rockbox firmware.
Changelog
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.23...2026.04.24
- Multi-room AirPlay support with receiver management
- GPUI desktop GUI crate
Full changelog
What's Changed
- Add multi-room AirPlay support with receiver management by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/145
- Add GPUI desktop GUI crate by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/146
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.22...2026.04.23
- Tracing support and FIFO PCM sink functionality added
- AirPlay output sink with rockbox-airplay crate added
- Squeezelite PCM sink with Slim protocol support added
Full changelog
What's Changed
- Add tracing support and FIFO PCM sink functionality by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/141
- Add AirPlay output sink and rockbox-airplay crate by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/142
- Add Squeezelite PCM sink with Slim protocol support by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/143
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.20...2026.04.22
Routine maintenance release for A modern Music Player Daemon based on Rockbox firmware.
Changelog
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2026.04.19...2026.04.20
- Added HTTP(S) network stream playback to Rockbox Desktop.
- Integrated Typesense server and updated Zig build configuration (Zig 0.16).
Full changelog
What's Changed
- Add HTTP(S) network stream playback to Rockbox Desktop by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/135
- Integrate Typesense server and update Zig build configuration (Zig 0.16) by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/136
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2025.12.27...2026.04.19
Routine maintenance release for A modern Music Player Daemon based on Rockbox firmware.
Changelog
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2025.12.25...2025.12.27
- Native macOS application
- System media controls integration (play/pause via keyboard)
- Optimized performance for macOS
Full changelog
What's New
- Native macOS application
- System media controls integration (play/pause with keyboard keys)
- Optimized performance for macOS
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2025.12.24...2025.12.25
Routine maintenance release for A modern Music Player Daemon based on Rockbox firmware.
Changelog
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2025.12.23...2025.12.24
- Support for media controls on macOS
- New SwiftUI application for macOS
Full changelog
What's Changed
- feat: add support for media controls on macos by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/131
- feat: Add SwiftUI app for macos by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/132
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2025.12.06...2025.12.23
Routine maintenance release for A modern Music Player Daemon based on Rockbox firmware.
Changelog
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2025.07.19...2025.12.06
- Removed `volume` from `UserSettings` bindings
Full changelog
What's Changed
- chore: upgrade to zig 0.14 by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/124
- build.zig: add itoa_buf.c to build.zig by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/125
- fix(sys): update SystemStatus bindings, add volume by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/126
- fix(sys): update UserSettings bindings, remove volume by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/127
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2025.07.17...2025.07.19
- [rocksky] control rockbox remotely with rocksky web ui (websocket)
Full changelog
What's Changed
- [rocksky] control rockbox remotely with rocksky web ui (websocket) by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/120
- fix(webui): fix incorrect album art url by @tsirysndr in https://github.com/tsirysndr/rockbox-zig/pull/122
Full Changelog: https://github.com/tsirysndr/rockbox-zig/compare/2025.02.16...2025.07.17