- Mark DLNA/Chromecast casting as complete in ROADMAP - Note AirPlay as deferred (no Rust RAOP library) - Add Network Casting section to README features - Add cast/ module to project structure - Update v1.0 launch status: all 6 items complete
6.6 KiB
QBZ Launch Roadmap
Last updated: 2026-01-12
Overview
6-point roadmap for QBZ v1.0 launch - a native Qobuz client for Linux.
1. Session Persistence
Status: Completed
Description: Remember playback state, queue, and position when restarting the app.
Implemented Features:
- SQLite-based session storage (~/.local/share/qbz-nix/session.db)
- Position saved every 5 seconds during playback (debounced)
- Full session save every 30 seconds during playback
- Immediate save on pause
- Volume changes persisted immediately
- Shuffle/repeat mode changes persisted immediately
- Queue and current track restored on login
- Playback position restored accurately
Fixed Issues (2026-01-12):
- Fixed race condition in beforeunload (async save might not complete)
- Enabled debouncedSavePosition() which was imported but never called
- Added periodic full session save during playback
- Position now saved frequently enough that app crash loses max 5-30 seconds
2. Device Select / Passthrough / Exclusivity Wiring
Status: Completed
Description: Full audio device management with exclusive mode and DAC passthrough.
Implemented Features:
- Device selection from PipeWire sinks
- Pretty device names from PipeWire descriptions
- Exclusive mode toggle
- DAC passthrough for external devices
- Proper device release when disabling exclusive mode
- Audio device reinitialization (
ReinitDevicecommand) - AudioOutputBadges showing DAC/EXC status
- Volume display in device tooltip
3. Tray Icon
Status: Completed
Description: System tray icon with playback controls and quick actions.
Implemented Features:
- System tray icon with app icon
- Play/Pause from tray menu
- Next/Previous track from tray menu
- Show/Hide window toggle
- Left-click toggles window visibility
- Double-click shows and focuses window
- Right-click shows context menu
- Quit option in tray menu
Not Implemented (optional):
- Dynamic tooltip with current track info
- Quick access to settings
- Minimize to tray on window close (currently just hides)
4. MiniPlayer
Status: Completed
Description: Compact floating player window for minimal screen usage.
Implemented Features:
- Compact 340x90 floating window
- Draggable (no decorations)
- Always-on-top toggle (pin button)
- Play/Pause, Next/Previous controls
- Album art, track title, artist display
- Progress bar
- State sync from main window via events
- Toggle via NowPlayingBar button (PictureInPicture icon)
Technical:
- Route:
/miniplayer - Service:
src/lib/services/miniplayerService.ts - Uses Tauri WebviewWindow for secondary window
- Events:
miniplayer:track,miniplayer:playback
5. Network Casting (Chromecast & DLNA)
Status: Completed
Description: Stream to network devices via Chromecast and DLNA/UPnP.
Implemented Features:
- Chromecast device discovery (mDNS)
- Chromecast streaming via media server
- DLNA/UPnP device discovery (SSDP)
- DLNA AVTransport SOAP implementation (SetAVTransportURI, Play, Pause, Stop, Seek)
- DLNA RenderingControl for volume
- DIDL-Lite metadata for track info
- Unified CastPicker UI with protocol tabs
- CastStore for state management across protocols
- Connected device banner with disconnect button
- Automatic casting when connected (playbackService integration)
Not Implemented (Deferred):
- AirPlay/RAOP streaming - No viable Rust RAOP library exists. See qbz-nix-docs/AIRPLAY_IMPLEMENTATION_STATUS.md for research findings and future options.
6. Playlist Management
Status: Completed
Description: Full playlist management with CRUD, statistics, and enhanced UI.
Implemented Features:
Import (100% complete):
- Import from Spotify, Apple Music, Tidal, Deezer
- Track matching via ISRC + fuzzy matching algorithm
- Progress log UI during import
- Auto-create Qobuz playlist with matched tracks
- Rate limiting and API chunk size handling
Database & Backend (100% complete):
playlist_settingstable with custom_artwork_path, sort_by, sort_order, hidden, positionplaylist_statstable with play_count, last_played_at- Backend commands:
playlist_get_settings,playlist_set_artwork,playlist_get_stats, etc. get_playlist_suggestionscommand for ML-based track suggestions
UI Components (100% complete):
- PlaylistCollage component (2x2 grid layout)
- Custom artwork selection per playlist
- Sort menu in sidebar (dropdown with submenu)
- PlaylistDetailView with collage header
- Stats display (play count)
- Filter dropdown (All/Visible/Hidden) in PlaylistManagerView
- Drag-to-reorder playlists in PlaylistManagerView
- Grid view toggle (list vs mosaic) in PlaylistManagerView
- PlaylistEditModal (PlaylistModal handles edit name/description/visibility/delete)
ML Suggestions (Removed):
- Removed due to lack of similarity algorithm (suggested unrelated tracks)
Recent Fixes (This Session):
- Fixed custom artwork not loading (asset:// URL conversion)
- Fixed settings state persisting between playlists
- Fixed sort submenu closing too fast
- Fixed z-index for all menus/tooltips (10000+)
- Added hi-res logo variants (grayscale version in use)
Additional Completed Features
UI/UX:
- Enhanced notifications with album artwork
- Quality info in notifications (Hi-Res / CD Quality badges)
- 3-line notification format (Title, Artist • Album, Quality)
- Window drag region fix for TitleBar
- Hi-res logo variants (gold, gray, blue, mono SVGs)
- Sidebar tooltip system with lazy loading
- Fixed scrollbar spacing in main content
Performance:
- Removed unnecessary PipeWire polling (was every 10s)
- Artwork caching with MD5 hash filenames
Technical Notes
- Stack: Tauri 2.0, Rust backend, Svelte 5 (runes) frontend
- Audio: rodio/cpal with PipeWire/ALSA integration
- Commands:
pactl list sinksfor PipeWire device info - Notifications:
notify_rustwithreqwest::blockingfor artwork download - Icons: Hi-res logo at
/static/hi-res-gray.svg(grayscale version)
v1.0 Launch Status
All 6 roadmap items are now COMPLETE:
- Session Persistence - Done
- Device Select / Passthrough - Done
- Tray Icon - Done
- MiniPlayer - Done
- Network Casting (Chromecast & DLNA) - Done
- Playlist Management - Done
Deferred to v1.1+:
- AirPlay/RAOP streaming (blocked on Rust library availability)