UI rework: Spotify-style shell, unified Playlists, Recordings, plugin UI #32
Labels
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
SBDeveloper/medley#32
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #13 (this spec reorders the remaining #13 work, see "Further Notes"). Slices are tracked under Tickets at the end.
Problem Statement
The app's UI is feature-driven, not user-friendly. Navigation is a row of text tabs (search, library, playlists, queue, settings). Playlists and Source Playlists live on two different pages, even though the listener only thinks "my playlists". The Queue is a flat list with up/down buttons. There is no persistent place for playlists, no big player view, and no search that is always at hand. The listener expects what Spotify or Deezer clients give: a bottom player, a playlist sidebar, a top navigation bar, a big player view and a real Queue.
The remaining #13 features (Radio, plugin UI views, lyrics, offline management, Recordings) also need a home in that shell. Building them in the old UI would mean building them twice.
Solution
Rework the UI into a conventional desktop music-app shell, shaped around this app's own idea: one Library across many Sources.
+creates a Playlist.Delivery is in four phases: A headless core, B shell slices, C plugins, D Windows/macOS and fuzzy matching. The app keeps working after every slice.
User Stories
Shell and navigation
/and Ctrl+K shortcuts to focus the search box, so that muscle memory keeps working.Sidebar and Playlists
+button to create a Playlist, so that I do not need a separate page.Player bar and big player
Queue
Track rows and Recordings
⋯button and a right-click menu on every Track with play next, add to queue, add to Playlist, favourite, go to album, go to artist and make offline, so that all actions are one place.Radio
Plugins and plugin UI
Offline and settings
Quality and migration
Implementation Decisions
Delivery phases (each slice keeps the app working; one child issue per slice,
Part ofthis spec, with blocked-by notes):Shell
⋯button and a right-click open one shared Track menu. Tracks drag onto sidebar Playlists.+to create, a right-click menu for rename and delete.Queue (core)
manual,contextorradio. The Queue stores the context it was started from (label and reference, e.g. a Playlist or album).radio. A Source without continuation appends nothing and playback ends cleanly. Autoplay is a setting with a toggle in the Queue panel.Playlists (core)
Recordings (core)
TrackRef, Playlists, the Queue and Favourites are unchanged. Ungrouping is a deletion.Plugin UI (phase C)
Docs
GLOSSARY.md: remove Source Playlist, redefine Playlist, add the linked-Playlist term, add Queue origin and context to Queue. ADRs: one for linked Playlists, one for declarative Plugin UI.Testing Decisions
Corepublic API, as integration tests under the existing core tests, using the fake Source plugin and the null audio output. Covers: Queue origin and context rules; Radio append, off switch and clean end; linked Playlists (write-through, remote sync, anchored extras, unlinked Playlists, existing data loading); Recordings (ISRC grouping, ranking, pin, fallback, ungroup); Plugin install, consent and lifecycle; and the declarative UI tree a Plugin returns and its event round-trips.ui/src/libwith vitest, following the existing shortcuts tests. Only logic extracted into plain functions: router and history stack, sidebar Source filtering, Queue section grouping, drag-reorder index math, persisted layout state. No component or DOM tests.shortcuts.test.ts.Out of Scope
Further Notes
Reordering of #13: Offline Tracks (item 1) and MPRIS/media keys/notifications (item 5) are done. The remaining items move as follows. Radio becomes A2. Track matching (item 8) becomes A4 (ISRC only now). The Public plugin API (item 3) is split into C1 (install flow) and C2 (UI API). The Plugin registry (item 4) follows C1. Social integrations (item 6) follow C1, with lyrics moved to C3. Windows/macOS (item 7) moves to D. #13's task list and delivery order are updated to match when child issues are created.
Terminology: the glossary currently defines Source Playlist as holding only one Source's Tracks. That no longer holds once a Playlist can link to a Source and carry Tracks from others. The glossary and an ADR must be updated before slice A3 starts.
Interaction to watch: Offline Tracks in linked Playlists, since app-side Tracks of other Sources can be offline too. Offline marking works per Track and so is unaffected, but "make Playlist offline" must cover all Tracks in the Playlist regardless of Source.
Tickets
Status 2026-10-08: all phases (A to D) are done, including #28 Windows/macOS, #30 fuzzy matching and #22 plugin registry.
New tickets for this spec:
Existing #13 tickets this spec reshapes (bodies updated):
radioand old-UI toggle)Verified in code: every item is delivered (#22, #28, #30 closed, code and tests present). Closing.