- Fix French text leaked into en.json (actions.radio.startArtistRadio)
- Fix capitalized key "Mono" -> "mono" in en/es/fr (matched source code)
- Translate missing refreshMetadata in es.json
- Translate missing showActiveAlbums in fr.json
- Fix typo "Artistas anterior" -> "Artistas anteriores" in es.json
- Add all new PR #226 keys to de.json and pt.json
cc
Track 504/server errors and show orange warning triangle in
NowPlayingBar when Qobuz is having issues. Auto-clears after
10 minutes without errors. Shows status in Settings too.
cc
- Add Gentoo/OpenRC and Void/runit to distro selector
- All systemctl commands now adapt to selected distro init system
- Verify step warns user to close wizard before testing
- Status/restart/rollback commands are distro-aware
cc
Tabular view comparing saved vs runtime settings for audio,
graphics, and environment variables. Collapsible sections with
match/mismatch indicators and export to clipboard.
cc
Three bugs prevented offline mode from working after V2 migration:
1. activate_offline_session used user_id=0 (empty profile) instead of
the last known user_id, so the user's library/settings were invisible
2. setManualOffline was called BEFORE activate_offline_session, but it
requires the offline store to be initialized (which happens during
session activation). Reordered: activate session first, then set
manual offline.
3. LoginView called setManualOffline directly instead of delegating to
the parent's handleStartOffline which has the correct order.
Also added "noPreviousSession" i18n message for users who never logged
in — they need to create a profile first before offline mode works.
cc
MusicBrainz is a one-way pull — QBZ fetches public data but never
sends user data back. Added this clarification to the help text in
all 5 locales and to the wiki Integrations page.
cc
Exclusive Mode, DAC Passthrough, and Force Bit-Perfect now have (?)
help icons that show detailed explanations on hover:
- What backend each setting requires (ALSA Direct vs PipeWire)
- What PipeWire properties they affect (clock.force-rate, quantum)
- How they relate to each other (dependency chain)
- What happens without them (resampling to default rate)
i18n help texts added to all 5 locales.
cc
Separates playlists into two sub-tabs:
- Favorites: playlists marked with the heart icon (local QBZ feature)
- Following: playlists subscribed on Qobuz (owner.id != current user)
The Following tab shows playlists from getUserPlaylists where the
owner is not the current user, matching Qobuz's subscription model.
i18n keys added to all 5 locales.
cc
Discovered undocumented Qobuz API endpoints from bundle analysis:
- POST /playlist/subscribe { playlist_id }
- POST /playlist/unsubscribe { playlist_id }
This is the native "follow playlist" feature that syncs across all
Qobuz clients, separate from QBZ's existing "Copy to Library" (local
copy) and "Favorite" (local flag) features.
Added:
- subscribe_playlist/unsubscribe_playlist in both qbz-qobuz and legacy client
- v2_qobuz_subscribe_playlist / v2_qobuz_unsubscribe_playlist commands
- Bookmark toggle button in PlaylistDetailView (next to Copy button)
- i18n keys in all 5 locales
cc
With ALSA Direct hw: there is no software mixer — volume must be
controlled at the DAC/hardware level. Software volume attenuation
would reduce bit depth and defeat the purpose of bit-perfect playback.
Backend: v2_set_volume forces volume to 1.0 when backend=Alsa+plugin=Hw
Frontend: volume slider disabled (grayed out at 100%), mute/step buttons
hidden, handleVolumeChange and handleToggleMute return early.
Settings callbacks notify +page.svelte when backend/plugin changes to
update the lock state in real-time.
i18n: volumeLockedHw tooltip added to all 5 locales.
cc
Developer Mode: toggle to show/hide QConnect dev panel button in
the player bar (hidden by default, persisted in localStorage).
Integrations: editable device name input for Qobuz Connect with
default "Qbz - {hostname}". Backend commands v2_qconnect_get/set
_device_name and v2_get_hostname. Custom name is used during the
WS bootstrap handshake.
cc
Place QConnect badge as direct child of badges-group with 3px gap
matching DAC/EXC spacing. Two-row vertical layout: icon on top,
Qobuz/Connect text below. Wire props from +page.svelte to both
NowPlayingBar instances. Add qconnect i18n keys to de/fr/pt locales.
cc
3D terrain-style frequency visualization using stacked spectrum lines
with perspective. Uses viz:spectral (190 bands) for high-resolution
terrain, with quadratic curve smoothing and black occlusion fill for
depth. Track info displayed bottom-right matching other panels.
Nav buttons get 8px padding on the edge side (matching folder spacing).
New opt-out toggle to hide window control buttons (min/max/close) for
window manager users who want the titlebar for nav and search only.
Opt-in setting (off by default) that moves Discover, Favorites, and
Local Library from the sidebar to the custom titlebar. Includes
dropdown menus for Discover and Favorites sub-items. Navigation
button position defaults to opposite of window controls but is
user-configurable. Items are hidden from sidebar when shown in
titlebar.
Show a friendly message instead of a generic API error when
the user has no recent listening history to seed suggestions.
Adds insufficientHistory i18n key to all 4 locales.
Closes#158
Update follow-artist-card and artist-card CSS to match HomeView's Discover
card style (210px, bg-secondary, border, 12px radius, 140px image, hover).
Add "Qobuz Radio Station" subtitle to spotlight radio card.
Spotlight section now shows a horizontal scroll row with nav arrows:
- TOP TRACKS card: white bg, black text, loads all top tracks to queue
- RADIO card: homologated to Radio Stations style with color extraction
- Playlist cards: from artist's Qobuz playlists (if any)
- Up to 6 album cards from artist releases (albums, live, EPs)
Removes the old track list and standalone radio card layout.
Create ForYouTab.svelte component with:
- Your Mixes (DailyQ, WeeklyQ, FavQ, TopQ)
- Radio Stations from recent albums with shadow overlay
- Continue Listening tracks
- Recently Played albums
- Your Top Artists
- Favorite Albums
Add i18n keys for all For You sections in 4 locales.
Wire ForYouTab into HomeView replacing placeholder.
Add tab button group inline with greeting header. Existing home content
shows only on Home tab. Editor's Picks and For You tabs have placeholders.
i18n keys added to all 4 locales.
Resolve city to top-level subdivision at metadata time so the artist
sidebar shows "United Kingdom, England" instead of "United Kingdom,
Brixton". Label changed from "Born in"/"Founded in" to "From" to
match the broader regional context of scene discovery.
The browse API returns ALL artists from an area alphabetically with no
genre filtering. For LA that's 15K+ random artists. Now we search
tag:"thrash metal" AND beginarea:"Los Angeles" for each genre, giving
genre-relevant results directly from MusicBrainz.
Also adds dynamic loading messages that cycle through discovery steps
and temporarily disables all scene/validation caching for tuning.
Shows Founded/Born date and Founded in/Born in location from
MusicBrainz metadata. Location is a clickable link that will
navigate to the artistsByLocation scene discovery view.
Metadata fetched in parallel with relationships, cached 30 days.
Section hidden when MusicBrainz is disabled. Translations added
for en, es, de, fr.
Add dismissal system for "You May Also Like" discovery artists. Dismissals
are scoped to the genre tag used for the search, so dismissing AC/DC from
electronic recommendations won't affect metal recommendations.
- New discovery_dismissals table in reco DB (tag + normalized artist name)
- v2_dismiss_discovery_artist command persists dismissal per tag
- Discovery pipeline filters dismissed artists for both primary and secondary tags
- Backend returns 8 results (frontend shows 6, keeps 2 reserves)
- Thumbs-down button appears on hover, instantly replaces with reserve
- Returns primaryTag in DiscoveryResponse for frontend dismiss context
Replace toast notification with a proper modal dialog when the
performance watchdog degrades background mode. Modal includes a
"Don't show again" checkbox that persists to localStorage.
Threshold: < 15 FPS sustained for 5 seconds (after 3s warmup).
User can always re-enable effects from Settings > Appearance.
Display similarity score next to each discovery artist name. Update
DiscoveryArtist interface with similarityPercent field. Add i18n keys
for youMayAlsoLike section and sidebar layout improvements.
Add artist grouping option for Label Releases view and remove
expensive loadAllAlbums() call. Use v2_get_label_page for richer
label image data. Add groupByArtist i18n keys to all 4 locales.
- Replace generic icon with circular label logo (matches LabelView)
- Fix double close button in search: single X that clears and closes
- Add sort options: newest, oldest, title A-Z/Z-A, artist A-Z
- Add Hi-Res filter toggle
- Load all albums automatically when sorting/filtering
- i18n: add labelReleases keys to all 4 locales
- Search bar now replaces title area instead of floating separately
API analysis: Qobuz label endpoints have no server-side sort/filter
params, so all sorting and filtering is done client-side after
paginated fetch.
Gapless now works on all backends, so the UI constraints that disabled
it for DAC Passthrough and ALSA Direct are removed. Only streaming-only
mode still disables gapless (no cache available). Removed experimental
badge. Cleaned up unused i18n keys.
Embeds quality in album folder name instead of subfolder, so each
quality variant appears as a separate album in the local library.
Adds download error toast and fixes format labels to bracket notation.
Closes#116
Replace binary blur toggle with a 3-option dropdown. Full mode uses
the existing WebGL2 shader, Lite mode renders a pre-blurred static
image animated with CSS transforms (compositor-driven, immune to
Wayland frame callback stutter), and Off mode shows a solid color.
Includes config migration from disableBlurBackground to backgroundMode,
updated composition profiles, and i18n for all 4 locales.
Closes#127
Detect when QBZ runs inside a Snap sandbox (via SNAP env var) and show
a one-time welcome modal with required plug connection commands. Adds a
Snap Sandbox section in Settings with copyable commands, mirroring the
existing Flatpak pattern.
Backend: snap.rs module, DB table snap_welcome_shown, V2 commands.
Frontend: updatesService, +page.svelte modal queue, SettingsView section.
Allow users to cancel an in-progress album download. The current track
finishes but no further tracks are started. A cancel button appears in
the progress bar during download, and a cancelled state shows how many
tracks completed. Closes#133.
Add Shift+M toggle shortcut for mini player mode (main and mini window).
Add 1-5 number keys for surface switching (micro/compact/artwork/queue/lyrics)
in mini player context. Add playback shortcuts (Space, Ctrl+Arrow) to mini
player window. Fix X button to close app (or hide to tray) instead of
duplicating the Expand button behavior. Closes#134.
Group immersive-related settings under a new "Immersive" subsection
at the bottom of Settings > Appearance, in order:
1. Immersive Default View
2. Composition (collapsible)
3. Disable Blur Background
4. Animation Frame Rate (collapsible)
Also fix chevron alignment in collapsible sections to be right-aligned
(justify-content: space-between) and clean up unused CSS classes.
- Replace raw checkbox with Toggle component for blur background
- Use composition-subsection class for FPS section (adds top border)
- Use composition-title class for consistent 14px font size
- Move desc to section-note inside expanded content
- Add summary key for inline collapsed text
- Shorten title from "Immersive Animation Frame Rate" to
"Animation Frame Rate"
Add gskRenderer and disableBlurBackground fields to CompositionProfile.
Update existing profiles: Xwayland Performance now disables blur.
Add new Max Performance profile (Cairo software renderer + blur off)
for maximum compatibility on stutter-affected systems.
Profile matching and apply logic now includes all new fields.
Part of #127.
When enabled, replaces the expensive blurred album artwork background
with a solid dark color extracted from the artwork at tiny resolution.
Significantly reduces GPU load and fixes stutter on affected systems.
Setting is stored in localStorage (same as FPS settings) and applies
on next immersive mode entry.
Part of #127.
Add gsk_renderer field to graphics settings DB with UI dropdown
(Auto/GL/NGL/Vulkan/Cairo). Value is read at startup and set as
GSK_RENDERER env var. Env var override takes precedence. Also
included in --reset-graphics and reset now restores hw_accel to true.
Part of #127.
When QBZ adjusts quality for device compatibility (e.g. requesting
Hi-Res instead of Ultra Hi-Res because the DAC doesn't support
176.4kHz), show a blue info tooltip instead of the yellow "Resampled
by system" warning. The new message clarifies that playback is
bit-perfect with no resampling — QBZ simply requested a compatible
quality from the source.
Two distinct tooltip cases:
- Yellow: "Resampled by system" (PipeWire/system is resampling)
- Blue: "Quality adjusted for device compatibility" (QBZ chose lower
quality, hardware plays natively)