Roadmap — future enhancements
Possibilities, not commitments. Grouped by area, roughly ordered by how much they unlock versus how much they cost. Anything here can be adopted, reshaped, or dropped.
How to read this
- Unlocks — what the work makes possible beyond itself.
- Depends on — what must land first.
- Risk — the honest reason it might not happen.
Server
Auth + TLS (v2 flagship)
Token-based auth (per-client long-lived tokens, generated server-side) and TLS termination (self-signed by default, user-supplied certs supported). Unlocks everything below marked "internet". Depends on: nothing architectural — the API is already stateless. Risk: v1's trusted-LAN posture cannot be incrementally patched; this needs a full security review (rate limiting, token scopes, header hygiene), not a flag flip.
Internet-safe remote access
Reverse-proxy documentation (Caddy/nginx recipes), optional Tailscale/WireGuard notes. Depends on: auth + TLS. Risk: support burden for network topologies; keep it docs-first.
Server-computed loudness metadata
R128 integrated loudness measured at scan time (or as a background job), stored on the track record, served to clients. Deletes the client's double-bandwidth pre-scan and enables instant normalization. Depends on: a schema migration + a measurement worker (can reuse the transcode pipeline's DSD decimator for DSD sources). Risk: scan-time cost on huge libraries — make it a backfill job, not a scan blocker.
Stronger catalog identity
MusicBrainz/Discogs external IDs alongside the (title, album-artist) heuristic; prefer the ID when present. Depends on: an ID acquisition path (scan-time lookup is network-dependent — likely a manual/assisted flow). Risk: wrong IDs are worse than no IDs; needs a user-verification UX.
Smart playlists / saved searches
Rule-based playlists (genre, year, rating, "added in the last month") evaluated server-side, exposed through the existing playlist API shape. Depends on: nothing. Risk: rule-language scope creep — keep it to the 13-ish predicates users actually need.
Multi-user (later v2)
Per-user queues, play counts, ratings, and permissions on top of auth. Depends on: auth + TLS. Risk: fundamentally changes the single-household simplicity; only if real demand appears.
Container image + service files
Docker image, systemd unit, launchd plist. Depends on: nothing. Risk: none, just maintenance.
Audio engine & formats
PCM exclusive-mode toggle
WASAPI exclusive / CoreAudio hog-mode for PCM (not just DoP), user-toggled per device. Depends on: Mac validation of the existing hog-mode code (it's the same mechanism). Risk: exclusive mode steals the device — needs careful acquire/release UX.
Output-device selection
Actually route PCM to a chosen device instead of the system default; rebuild the sink on selection. The v1 device list is already informational. Depends on: nothing. Risk: device hot-plug handling.
Automatic DSD story per device
Probe the output device once, remember "this DAC does DoP at 176.4 kHz", and pick native vs convert automatically instead of a global setting. Depends on: Mac validation of dop_status. Risk: flaky USB DACs lying about capabilities — needs a manual override regardless.
Higher-quality DSD→PCM options
Selectable decimation quality (e.g. wider FIR, higher intermediate rate) for users who convert but want better than the fast default. Depends on: nothing — the decimator is parameterized. Risk: benchmark to prove audibility; don't ship knobs without evidence.
VST3/AU plugin hosting (research spike)
Host user plugins in the DSP chain. The chain API has a node-insertion shape reserved for this. Depends on: a hosting crate maturing (none is production-ready in Rust today) or writing one. Risk: high — this is a spike, not a plan; sandboxing and crash isolation are real problems.
Crossfade (optional)
User-toggled, off by default — the v1 stance is gapless-only. Depends on: nothing architectural. Risk: interacts with the ?next= gapless chain; keep it client-side and simple.
Desktop client
iOS / Android shells (v2)
Tauri 2 mobile targets reusing kahawai-player-core untouched, with platform audio sinks (background playback, lock-screen/now-playing controls). Depends on: kahawai-player-core purity rule holding (it does). Risk: mobile background-audio and store policies, not engine work.
Offline downloads
Download ?format=opus renditions (or originals) for offline queues; server already serves the right rendition. Depends on: mobile shells (desktop offline is less valuable). Risk: storage management UX.
Artwork disk cache
Content-addressed LRU cache keyed by the artwork hash the server already provides — the invalidation story is free because the key is the content. Depends on: nothing. Risk: none; straightforward.
Honest buffer metric
Expose the engine's ring fill level + in-flight HTTP state as a real buffered-range readout (v1 honestly shows none). Depends on: plumbing two numbers through the state event. Risk: none.
Remote control
One client drives playback on another (phone as remote for the desktop). Depends on: auth + TLS (never on the trusted-LAN v1). Risk: discovery/pairing UX.
Library management views
Recently added, most played (needs play-count tracking — server), ratings, tag editing (server writes tags? conflicts with the read-only scanner philosophy — would need a deliberate design exception). Depends on: decisions, mostly. Risk: scope creep into "music manager" territory; the philosophy doc is the guardrail.
Explicitly not on the roadmap
- Streaming-service integration (Spotify/Apple Music/Tidal) — contradicts "your library, your machine".
- Social features, scrobbling-as-a-service, analytics, telemetry.
- Cloud sync of any kind.
- DRM or protected-content playback — v1 decision, stands.
- SACD ISO extraction/decoding, in any form — see SACD Extraction.
Suggested sequencing if v2 happens
- Mac validation + signing (close out v1 properly).
- Server-computed loudness (deletes a real daily cost) + artwork disk cache (small, satisfying).
- Auth + TLS with a real security review.
- PCM exclusive toggle, device selection.
- Mobile shells + offline.
- Everything else as demand dictates.