Files
qbz/ROADMAP.md
T
vicrodh ac35875351 docs: update roadmap and readme for casting completion
- 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
2026-01-12 11:13:45 -06:00

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 (ReinitDevice command)
  • 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_settings table with custom_artwork_path, sort_by, sort_order, hidden, position
  • playlist_stats table with play_count, last_played_at
  • Backend commands: playlist_get_settings, playlist_set_artwork, playlist_get_stats, etc.
  • get_playlist_suggestions command 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 sinks for PipeWire device info
  • Notifications: notify_rust with reqwest::blocking for 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:

  1. Session Persistence - Done
  2. Device Select / Passthrough - Done
  3. Tray Icon - Done
  4. MiniPlayer - Done
  5. Network Casting (Chromecast & DLNA) - Done
  6. Playlist Management - Done

Deferred to v1.1+:

  • AirPlay/RAOP streaming (blocked on Rust library availability)