QBZ is a free and open source (FOSS) high-fidelity streaming client for Linux with native playback. It is a real desktop application, not a web wrapper, so it can use DAC passthrough, switch sample rates per track, and deliver bit-perfect audio.
- This application uses the Qobuz API but is not certified by Qobuz.
- Qobuz is a trademark of Qobuz. QBZ is not affiliated with, endorsed by, or certified by Qobuz.
- The offline library is a temporary playback cache for listening without an internet connection while you have a valid subscription. You do not receive a license to keep or redistribute the content. If your subscription becomes invalid, QBZ will remove all cached content after 3 days.
- Credentials may be stored in your system keyring if you have a keyring configured.
- Qobuz Terms of Service: https://www.qobuz.com/us-en/legal/terms
Browsers cap audio output around 48 kHz, while Qobuz streams up to 192 kHz. QBZ uses a native playback pipeline with direct device control, exclusive mode, and no forced resampling so your system and DAC receive the original resolution, with caching and system integrations that wrappers cannot provide.
# Using yay
yay -S qbz-bin
# Using paru
paru -S qbz-binsudo snap install qbz-playerPost-install plug connections for audio backends:
sudo snap connect qbz-player:alsa
sudo snap connect qbz-player:pulseaudio
sudo snap connect qbz-player:pipewireOptional: external drives and network mounts
sudo snap connect qbz-player:removable-media# Download from releases
flatpak install ./QBZ.flatpakDue to Flatpak sandbox restrictions, PipeWire backend cannot guarantee bit-perfect playback. The sandbox prevents QBZ from controlling the PipeWire daemon's sample rate configuration.
For bit-perfect audio in Flatpak:
- Use ALSA Direct backend in Settings > Audio > Audio Backend
- Select your DAC from the device list
- Enable DAC Passthrough
For full PipeWire bit-perfect support:
- Install via native packages (.deb, .rpm) or build from source
The app will display a warning in Settings when this limitation affects your configuration.
If your music library is on a NAS or network mount, grant filesystem access:
# CIFS/Samba mount
flatpak override --user --filesystem=/mnt/nas com.blitzfc.qbz
# SSHFS mount
flatpak override --user --filesystem=/home/$USER/music-nas com.blitzfc.qbz
# Custom mount point
flatpak override --user --filesystem=/path/to/music com.blitzfc.qbzThis permission persists across reboots and updates.
Download the latest release from the Releases page.
chmod +x QBZ.AppImage
./QBZ.AppImageDownload the .deb from Releases.
sudo apt install ./qbz_*.debRequires glibc 2.38+ (Ubuntu 24.04+, Debian 13+, Mint 22+). Older releases like Ubuntu 22.04 or Pop!_OS 22.04 ship glibc 2.35 and won't work -- use Flatpak, Snap, or AppImage instead.
Download the .rpm from Releases.
sudo dnf install ./qbz-*.rpmRequires glibc 2.38+ (Fedora 39+, openSUSE Tumbleweed, RHEL 10+). For older releases, use Flatpak, Snap, or AppImage instead.
Note: Pre-built binaries include all API integrations (Last.fm, Discogs, Spotify, Apple Music, Tidal, Deezer) ready to use. If you build from source, you'll need to provide your own API keys.
- Bit-perfect playback with DAC passthrough and per-track sample rate switching (44.1 kHz to 192 kHz).
- Four audio backends: PipeWire, ALSA, ALSA Direct (hw: bypass), and PulseAudio.
- DAC Setup Wizard for guided bit-perfect configuration.
- Native decoding for FLAC, MP3, AAC, ALAC, WavPack, Ogg Vorbis, and Opus via Symphonia.
- Quality selection with automatic fallback across Qobuz tiers.
- Per-device output selection with exclusive mode.
- Gapless playback with precise position tracking.
- Loudness normalization (EBU R128) with ReplayGain support.
- Two-level audio cache: L1 in-memory (400 MB) with L2 disk spillover (800 MB) and next-track prefetching.
- Queue management with shuffle, repeat (track/queue/off), and history navigation.
- Favorites and playlists from your Qobuz account.
- Local library: directory scanning, metadata extraction with lofty, CUE sheet parsing, and SQLite indexing.
- Grid and list views with search, A-Z index, and grouping by artist or album.
- Multi-disc album grouping with disc headers.
- Local artwork detection (folder and embedded) with Discogs fallback.
- Tag editor: edit metadata (title, artist, album, genre, year) with sidecar storage that preserves original files.
- Virtualized lists for smooth scrolling across large libraries.
- Import public playlists from Spotify, Apple Music, Tidal, and Deezer into your Qobuz library.
- Automatic track matching with fuzzy search.
- Batch import with progress tracking.
- Chromecast device discovery and streaming.
- DLNA/UPnP device discovery and streaming (AVTransport SOAP).
- Unified cast picker with protocol selection.
- Seamless playback handoff to network devices.
- MPRIS media controls and media key support.
- Last.fm scrobbling and now-playing updates.
- ListenBrainz scrobbling with offline queue and listen history sync.
- MusicBrainz artist enrichment, musician credits, recording relationships, and album personnel.
- Discogs artwork fetching for local library.
- Desktop notifications for track changes.
- Shareable Qobuz URLs and universal SongLink links (Odesli).
- Full-screen expanded player with tabbed panel system.
- 14 visualization panels: spectrum analyzer, oscilloscope, spectrogram, energy bands, Lissajous curves, transient pulse, vinyl animation, coverflow, and more.
- Synchronized lyrics with line-by-line display and mini view.
- Queue, track info, playback history, and suggestions panels.
- 26 built-in themes (Dark, OLED, Nord, Dracula, Tokyo Night, Catppuccin Mocha, Breeze, Adwaita, and more).
- Auto-theme: generate themes dynamically from your DE color scheme, wallpaper, or a custom image (experimental).
- Native KDE title bar on Plasma Wayland via KWin window rules.
- Focus mode for distraction-free listening.
- Mini player mode.
- Musician pages: explore performers, composers, and producers with their discography and roles.
- Label pages: browse record label catalogs.
- Album credits: detailed personnel and recording credits from MusicBrainz.
- Image lightbox with full-screen artwork viewing.
- Custom artist images: right-click any artist to set a custom image.
- Configurable keyboard shortcuts.
- UI zoom from 80% to 200%.
- 5 font choices including system font.
- 4 languages: English, Spanish, German, and French.
- Home page with personalized sections: recent albums, continue listening, top artists, favorites, and weekly suggestions.
- Genre filtering with 3-level hierarchy.
- Artist similarity engine using vector embeddings for radio and suggestions.
- Playlist suggestions based on artist similarity.
- Dynamic suggestions with seed-based recommendations.
- Offline mode detection with automatic reconnection.
- Offline playback cache for previously streamed content.
- ListenBrainz and Last.fm offline queuing with automatic sync.
- Built-in HTTP API for LAN remote control.
- Self-signed TLS with auto-generated certificates.
- Audio device selection and quality preferences.
- API keys configuration for self-hosted builds.
- Theme and appearance options with live preview.
- System tray with minimize-to-tray and configurable behavior.
- Update notifications with What's New changelogs.
- Graphics composition settings for GPU/Wayland troubleshooting.
| Layer | Technology |
|---|---|
| Desktop shell | Rust + Tauri 2.0 |
| Frontend | SvelteKit + Svelte 5 (runes) + TypeScript + Vite |
| Audio decoding | Symphonia (all codecs) via vendored rodio |
| Audio backends | PipeWire, ALSA (via alsa-rs), ALSA Direct (hw:), PulseAudio |
| Networking | reqwest (rustls-tls), axum (local API server) |
| Database | rusqlite (bundled SQLite, WAL mode) |
| Local library | walkdir + lofty (metadata) + image (thumbnails) |
| Desktop integration | souvlaki (MPRIS), notify-rust, keyring |
| Casting | rust_cast (Chromecast), rupnp (DLNA/UPnP), mdns-sd (AirPlay) |
| Internationalization | svelte-i18n (4 locales) |
| Icons | lucide-svelte |
The Rust backend is organized into independent crates for modularity:
crates/
qbz-models/ Shared domain types (Track, Album, Artist, etc.)
qbz-audio/ Audio backends, loudness analysis, device management
qbz-player/ Playback engine, streaming, queue control
qbz-qobuz/ Qobuz API client and authentication
qbz-core/ Orchestrator coordinating player, audio, and API
qbz-library/ Local library scanning, metadata, thumbnails
qbz-integrations/ Last.fm, ListenBrainz, MusicBrainz, Discogs
qbz-cache/ L1 memory + L2 disk audio caching
qbz-cast/ Chromecast, DLNA/UPnP, AirPlay casting
qbz/
├── src/ Frontend (SvelteKit + Svelte 5)
│ ├── lib/
│ │ ├── components/ 120+ Svelte components
│ │ │ ├── views/ 20+ view components (Home, Search, Settings, etc.)
│ │ │ └── immersive/ Immersive player panels and visualizers
│ │ ├── stores/ 40+ state stores (Svelte 5 runes)
│ │ ├── services/ Backend integration services
│ │ ├── i18n/locales/ en, es, de, fr translations
│ │ ├── app/ Bootstrap and initialization
│ │ └── utils/ Helpers (zoom, keyboard, sanitize, etc.)
│ └── routes/ SvelteKit routes (main + miniplayer)
├── src-tauri/
│ ├── src/
│ │ ├── auto_theme/ Dynamic theme generation from DE/wallpaper
│ │ ├── audio/ Audio backend re-exports
│ │ ├── config/ 13 settings modules
│ │ ├── commands_v2.rs V2 command handlers (active API surface)
│ │ ├── core_bridge.rs Bridge to multi-crate architecture
│ │ └── ... 30+ feature modules
│ ├── vendor/
│ │ ├── rodio/ Vendored audio playback (f32 pipeline)
│ │ └── cpal/ Vendored audio device library
│ └── Cargo.toml
├── crates/ 9 independent Rust crates (see above)
├── packaging/
│ ├── aur/ Arch Linux PKGBUILD
│ └── flatpak/ Flatpak manifest and metainfo
├── scripts/ Build, dev, and CI helper scripts
├── .github/workflows/ CI/CD (Linux x86_64, aarch64, Flatpak, AUR)
└── snapcraft.yaml Snap package definition
- Rust (latest stable)
- Node.js 20+
- Linux with audio support (PipeWire, ALSA, or PulseAudio)
Debian/Ubuntu:
sudo apt install libwebkit2gtk-4.1-dev libgtk-3-dev libasound2-dev \
libappindicator3-dev librsvg2-dev libssl-dev pkg-configFedora:
sudo dnf install webkit2gtk4.1-devel gtk3-devel alsa-lib-devel \
libappindicator-gtk3-devel librsvg2-devel openssl-devel pkg-configArch Linux:
sudo pacman -S webkit2gtk-4.1 gtk3 alsa-lib libappindicator-gtk3 \
librsvg openssl pkg-config# Clone the repository
git clone https://github.com/vicrodh/qbz.git
cd qbz
# Install frontend dependencies
npm install
# Run in development mode
npm run tauri dev
# Build for production (generates DEB, RPM, and AppImage)
npm run tauri buildAPI keys are only required when you build QBZ yourself. The app runs without them, but the corresponding features will be disabled.
API keys and integrations (optional)
When building from source, you need to provide your own API keys. Copy the example environment file:
cp .env.example .envEdit .env with your API keys, then use the development script that properly loads them:
# Use this command for development with API keys
npm run dev:tauriImportant: API keys are embedded at compile-time using Rust's option_env!() macro. The .env file must be loaded into your shell environment before compilation. The npm run dev:tauri script does this automatically. If you prefer manual control:
# Load .env into current shell (once per terminal session)
set -a
source .env
set +a
# Now run dev
npm run tauri dev- Go to Last.fm API Account
- Create a new application
- Add to
.env:
LAST_FM_API_KEY=your_api_key
LAST_FM_API_SHARED_SECRET=your_shared_secret- Go to Discogs Developer Settings
- Create a new application
- Add to
.env:
DISCOGS_API_CLIENT_KEY=your_consumer_key
DISCOGS_API_CLIENT_SECRET=your_consumer_secret- Go to Spotify Developer Dashboard
- Create a new application
- Add to
.env:
SPOTIFY_API_CLIENT_ID=your_client_id
SPOTIFY_API_CLIENT_SECRET=your_client_secret- Go to Tidal Developer Portal
- Create a new application
- Add to
.env:
TIDAL_API_CLIENT_ID=your_client_id
TIDAL_API_CLIENT_SECRET=your_client_secretNote: All integrations are optional. The application will work without them, but the corresponding features will be disabled.
If you've used QBZ before version 1.1.6, your data was stored under qbz-nix directories. The application now uses unified qbz paths. To migrate your existing data:
# Migrate cache (offline library, artwork, etc.)
mv ~/.cache/qbz-nix ~/.cache/qbz
# Migrate config (credentials)
mv ~/.config/qbz-nix ~/.config/qbz
# Migrate data (library database, settings)
mv ~/.local/share/qbz-nix ~/.local/share/qbzIf you run both development and production builds, they now share the same data directories.
Seekbar Performance with Hi-Res Audio
- When using ALSA Direct or PipeWire DAC Passthrough with high sample rates (>96kHz), seeking can take 10-20 seconds
- This is due to the decoder needing to decode all samples from the start to the seek position
- Workaround: Use prev/next track buttons for instant navigation
- Future: Byte-level seeking will be implemented in a future release to fix this
First Sample Rate Change
- The first large sample rate change (e.g., 88.2kHz to 44.1kHz) may have a brief delay as the hardware stabilizes
- Subsequent changes of the same type are smooth
- This is normal hardware behavior and not a bug
ALSA Direct Mode (hw: devices)
- Provides bit-perfect playback by bypassing all software mixing
- Exclusive access: Other applications cannot play audio simultaneously
- Hardware volume control is experimental and may not work with all DACs
- If hardware mixer fails, use your DAC/amplifier's physical volume control
PipeWire DAC Passthrough
- Requires PipeWire configuration for automatic sample rate switching
- Use the in-app Settings wizard for guided setup
- Flatpak users: PipeWire bit-perfect can work if PipeWire is configured correctly. If it does not, use ALSA Direct.
QBZ uses WebKit for rendering. Some hardware/driver combinations may cause crashes or poor performance. Settings are available in Settings > Appearance > Composition.
If QBZ crashes on startup after changing graphics settings:
# Nuclear option: reset ALL graphics settings to defaults
qbz --reset-graphics
# Alternative: disable GPU rendering for this session only
QBZ_HARDWARE_ACCEL=0 qbzThe --reset-graphics flag resets force_x11, gdk_scale, gdk_dpi_scale, and force_dmabuf to their defaults, then exits. Start QBZ normally afterwards.
Set these before launching QBZ to override settings:
| Variable | Effect | When to use |
|---|---|---|
QBZ_HARDWARE_ACCEL=0 |
Disable all GPU rendering | Crashes on startup, severe UI glitches |
QBZ_HARDWARE_ACCEL=1 |
Force full GPU (bypass safety) | Only if you know your GPU works perfectly |
QBZ_FORCE_X11=1 |
Use XWayland instead of Wayland | NVIDIA crashes on Wayland, protocol errors |
QBZ_SOFTWARE_RENDER=1 |
Force Mesa llvmpipe | VMs, headless servers, broken GPU drivers |
QBZ_DISABLE_DMABUF=1 |
Disable DMA-BUF renderer | Intel Arc EGL crashes, NVIDIA Error 71 |
QBZ_FORCE_DMABUF=1 |
Force DMA-BUF renderer | Testing only, may crash |
NVIDIA on Wayland (crashes, protocol errors, black screen)
QBZ_FORCE_X11=1 qbzOr enable "Force X11 backend" in Settings > Appearance > Composition.
Intel Arc GPU (EGL crashes, "Could not create default EGL display")
QBZ_DISABLE_DMABUF=1 qbzVirtual machines or containers
QBZ_SOFTWARE_RENDER=1 qbzSevere UI lag or freezing
QBZ_HARDWARE_ACCEL=0 qbzXWayland scaling issues (blurry UI)
After enabling Force X11, configure scaling in Settings > Appearance > Composition:
- GDK_SCALE: Integer scaling (1, 2)
- GDK_DPI_SCALE: Fractional scaling (0.5, 1, 1.5, 2)
- X11 sessions: Full GPU acceleration, nothing disabled
- Wayland sessions: Compositing mode disabled (prevents protocol errors), DMA-BUF disabled for all GPUs (prevents EGL crashes)
- NVIDIA on X11: Only DMA-BUF disabled
All settings require a restart to take effect.
QBZ is MIT-licensed and fully open source. No telemetry, no lock-in, and no hidden services. Just a clean, transparent player built for Linux audio fans.
Contributions are welcome. Please read CONTRIBUTING.md before submitting issues or pull requests.
MIT
