Change dbus_name from "qbz" to "com.blitzfc.qbz" so the MPRIS name
matches the appid pattern. This eliminates the need for the explicit
--own-name permission as Flatpak allows apps to own names under their
appid namespace automatically.
cc
- Change 4-cover layout from 2x2 to 3 small left + 1 large right
- Always use track artwork collage instead of low-res API image
- Upscale images to 600px for better quality
cc
- Remove border from volume step buttons (no circles in player)
- Remove separator between volume and queue button
- Make playlist search input taller using negative margins
- Auto-expand folders with matching results during search
- Hide folders without matches during search
cc
- Add +/- buttons to volume control for 5% increments
- Reduce SongCard min-width from 508px to 436px
- Add playlist search in sidebar header with expandable input
- Add translations for new features in all 4 locales
cc
- Desktop entry file
- AppStream metainfo with screenshots
- Screenshot images for Flathub listing
These files are required by Flathub reviewers to be in upstream.
- Change trigger from release:published to workflow_run on release-linux
- Only run if the triggering workflow succeeded
- Increase timeout to 30 minutes for aarch64 build to complete
- Extract version from workflow's head branch (the tag)
- Add Hardware Acceleration toggle to Composition section
- Move Force DMA-BUF toggle from Developer Mode to Composition
- Add i18n keys for new composition toggles (en, es, de, fr)
These settings logically belong together since they both control
GPU rendering behavior. Hardware Acceleration is the broad switch
that enables GPU; Force DMA-BUF controls the specific buffer-sharing
mechanism with the compositor.
The localStorage->backend sync only ran when useSystemTitleBar was true,
so toggling it OFF never persisted to the database. On restart, the
backend read the old 'true' value and created the window with system
decorations, while the UI showed 'false' from localStorage.
Now syncs the value unconditionally on init.
The $effect watching outputStatus.is_playing would call loadStatus(),
which updates outputStatus, triggering the effect again. This caused
~30 calls per second when hovering over the audio badges.
Removed the problematic $effect - mouseenter handler and 1s polling
for hardware status are sufficient.
Only capture log/info levels in dev builds or when verbose mode is
explicitly enabled in Developer Mode. Always capture error/warn for
bug tracking. Reduces GC/CPU overhead in production builds.
Adds toggle in Settings > Developer Mode to enable verbose capture
when debugging production issues.
Apply disposed flag pattern to prevent listener leaks when component
unmounts before async listen() calls complete.
+page.svelte:
- Add disposed flag for tray/media control listeners
- Check disposed after each await listen(), cleanup immediately if true
- Set disposed=true at start of cleanup function
offlineCacheState.ts:
- Add listenersDisposed flag
- Check flag after each listener registration
- Cleanup any registered listeners if disposed during async sequence
- Set flag in stopOfflineCacheEventListeners()
This prevents memory leaks during HMR and fast navigation.
QueuePanel:
- Add vertical ... icon to the right of track duration
- Context menu with 3 options:
- Remove from Queue (calls backend remove_from_queue)
- Add to Playlist (reuses existing playlist modal)
- Show Track Info (reuses existing track info modal)
- Menu shows on button click, closes on click outside
+page.svelte:
- Add handlers: handleRemoveFromQueue, handleQueueTrackAddToPlaylist,
handleQueueTrackInfo
- Wire up new QueuePanel props
i18n: Add toast messages for remove from queue (all 4 locales)
Backend:
- Add static atomics to track graphics startup state
- Add set_startup_graphics_state() called from main.rs
- Add get_graphics_startup_status command for frontend
Frontend (SettingsView):
- Query graphics startup status on mount
- Show prominent red warning in Composition section when
using fallback graphics settings
- Display recovery command (qbz --reset-graphics)
i18n: Add fallbackWarning/fallbackDesc to all 4 locales
This helps users understand when graphics settings failed to
load and may be causing performance degradation.
When graphics settings fail to load from DB:
- Logs warning to stderr (visible in terminal)
- Logs to startup log with recovery instructions
- Tracks fallback state for potential UI exposure
- Adds summary log of graphics config at startup
Helps users diagnose performance degradation caused by
silent graphics settings failures.
- Hide MiniPlayer button in NowPlayingBar when not provided
- Comment out miniplayer IPC emissions in player state subscriber
- Removes unnecessary IPC overhead during playback
MiniPlayer needs significant work before re-enabling.
Removes vinyl from the focus mode tab options while keeping the
VinylPanel component intact for potential future use. Users can
now choose from coverflow, static, visualizer, lyrics, and queue.
Resets all graphics/composition settings to defaults:
- force_x11: false
- gdk_scale: auto
- gdk_dpi_scale: auto
- force_dmabuf: false
Use when QBZ crashes on startup due to bad graphics config.
cc
Replace the misleading Hardware Acceleration toggle (which was a no-op
since v1.1.12 reverted to env-var-only control) and the standalone
Force X11 toggle with a collapsible "Composition" subsection that:
- Groups all GPU/rendering settings in one place
- Shows help text explaining what the section controls
- Includes a crash recovery warning with terminal command
- Keeps Force X11 toggle (functional, writes to DB)
- Adds GDK_SCALE and GDK_DPI_SCALE inputs (shown when Force X11 on)
- Lists all env var overrides with descriptions
- Translated in all 4 locales (en, es, de, fr)
Shows effective rendering state after all env var decisions:
- FULL: compositing GPU + DMA-BUF GPU
- partial: which subsystems are on CPU vs GPU
- OFF: software rendering via llvmpipe
cc
Reverts the aggressive GPU disabling introduced in v1.1.10/11 that
caused severe UI lag for all users. The previous approach disabled
WEBKIT_DISABLE_DMABUF_RENDERER globally (not just NVIDIA) because
hardware_accel defaulted to false.
New behavior (matches v1.1.9 targeted mitigations):
- X11 non-NVIDIA: nothing disabled (full GPU acceleration)
- X11 + NVIDIA: only DMA-BUF disabled
- Wayland: compositing + DMA-BUF disabled (prevents EGL crashes)
- Wayland + force_x11: runs as X11 (XWayland)
- VM: software rendering via llvmpipe
Improvement over v1.1.9: DMA-BUF now disabled for ALL Wayland GPUs
(not just NVIDIA), which prevents the Intel Arc EGL crash from #59.
All settings bypassable via env vars:
- QBZ_HARDWARE_ACCEL=0 disables all GPU rendering (nuclear opt-out)
- QBZ_HARDWARE_ACCEL=1 bypasses all safety (full GPU everywhere)
- QBZ_FORCE_X11=1 forces XWayland backend
- QBZ_FORCE_DMABUF=1 / QBZ_DISABLE_DMABUF=1 fine-grained DMA-BUF
- QBZ_SOFTWARE_RENDER=1 forces Mesa llvmpipe
Also adds GDK_SCALE and GDK_DPI_SCALE DB persistence for XWayland
scaling (workaround from #67).
cc
The CREATE TABLE included force_x11 column but INSERT OR IGNORE
also referenced it, so on existing DBs (without the column) the
entire execute_batch failed before reaching the ALTER TABLE
migration. Keep original schema in CREATE/INSERT, let ALTER add
the new column.
Add a toggle in Settings > Appearance to force X11 (XWayland) backend
on Wayland sessions. Persisted in graphics_settings.db, env var
QBZ_FORCE_X11=1|0 overrides for crash recovery. Also fixes the
display server log to report effective GDK backend instead of
session type.
The "Display server" log message was checking WAYLAND_DISPLAY env var
before GDK_BACKEND selection, so GDK_BACKEND=x11 still showed
"Display server: Wayland". Now logs AFTER selection and reports
the effective backend (including "X11 (XWayland)" when forcing x11
on a Wayland session).
Volume was saved to per-user localStorage but loaded from unscoped key
before login set the userId. Added resyncPersistedVolume() called after
login to re-read from the correct scoped key.
Close/minimize to tray read settings once at startup from the flat-path
DB, but user changes were saved to per-user DB after login. Changed
close-to-tray to read dynamically from state, and minimize-to-tray to
re-fetch before each action.
This release brings stability improvements, including fixes for UI freezes, EGL crashes, and playlist loading performance.
It introduces gapless playback, volume normalization, Plex integration, and enhanced discover browsing.
Core22 ships SQLite 3.37 but rusqlite needs 3.38+ for
sqlite3_error_offset. The RUSTFLAGS -L flags cause the linker
to find the system libsqlite3.a before the bundled one.