Convert every overlay (search, keymap, themes, devices, queue, track
info, lyrics, jump, load-URL, online search, provider search, provider
browser, file browser, playlist manager) from a centered modal into a
compact inline panel that replaces the playlist: a header line, a body
filling the same playlist region, and the help line. The now-playing,
visualizer, and controls chrome stays live above, matching the Ctrl+V
visualizer picker, and opening an overlay no longer shifts the layout
height.
A single activeOverlay() describes each overlay's header/help/body once
(method expressions, so no per-render Model copy), and all overlays share
the playlist row budget via effectivePlaylistVisible(). Removes the old
centered-modal renderers, per-overlay chrome builders, and the
measureChrome/measureOverlayVisible/centerOverlay scaffolding.
Add TestInlineOverlaysFitTerminal to guard against vertical overflow
across overlays and terminal sizes.
Re-runs the cohesion heuristic as tracks are added or queued so headers adapt to playlist growth, while preserving the user's ctrl+h preference via a manual override flag. The Add path uses running counters so the cost stays O(k) per call instead of O(N) per Add.
Release / build (amd64, darwin, macos-latest) (push) Has been cancelled
Release / build (amd64, linux, ubuntu-latest) (push) Has been cancelled
Release / build (amd64, windows, windows-latest) (push) Has been cancelled
Release / build (arm64, darwin, macos-latest) (push) Has been cancelled
Release / build (arm64, linux, ubuntu-latest) (push) Has been cancelled
Release / release (push) Has been cancelled
Release / update-homebrew (push) Has been cancelled
* Implement stateful windowed scrolling for all overlays
* Add Ctrl+X support to toggle expanded height in all overlays
* Remove ctrl+k helpkey from Search Overlay so it is consistent with others
* Remove now-unused stateless scrollStart helper
* Re-clamp queue scroll after movement or deletion
* Fix unreachable ctrl+x handler in provider search
* Fix device picker list scroll wrap for empty lists
The heuristic ran on every Add path (including each YTDL batch of 20
tracks), which scaled O(N^2) on incremental loads and silently
overrode the user's Ctrl+H toggle whenever a track was queued. Recompute
only on Replace and on first population; preserve the user's choice
otherwise.
Also dedupe the " · Album" suffix logic into a small helper, and pull
the cohesion ratio into a named constant.
* Implement sticky album headers and hide redundant album suffixes
* Add blank album separator when album ends and next track lacks album info
* Add keybind 'H' to toggle album headers
* Centralize album grouping and header logic
* Change 'toggle headers' keybind from H to ctrl+h
* Use modern Go iterators for playlist rendering and album grouping
* Support ctrl+h to toggle album headers in playlist manager and provider browser
* Add cohesion heuristic to auto-toggle album headers
Provider playlists pane:
- Mark the currently loaded playlist with a ▶ prefix and active style
- Group rows under section headers when providers populate Section;
Spotify now buckets playlists into Library / Your playlists / Followed
- Refresh with Ctrl+R; status message confirms
- Empty state names the provider and offers a remediation hint
- Show 'Name · 12 tracks · 1h 23m' on rows when data is available
Provider browser overlay (N):
- Right-aligned per-track durations and a 'N tracks · 47:22' subtitle
- Move the / filter input under the title (matches keymap overlay)
- Cursor wraps top↔bottom on every screen
- Clearer help labels: Play from here / Queue this / Replace queue / Append all
Cross-cutting:
- Replace 'Loading X...' text with a time-driven braille-dot spinner
used everywhere a list is loading
- Quick-switch (S/N/P/J/Y/L/R) now works from inside the nav browser
and the playlist manager, not just the main pane
Release / build (amd64, darwin, macos-latest) (push) Has been cancelled
Release / build (amd64, linux, ubuntu-latest) (push) Has been cancelled
Release / build (amd64, windows, windows-latest) (push) Has been cancelled
Release / build (arm64, darwin, macos-latest) (push) Has been cancelled
Release / build (arm64, linux, ubuntu-latest) (push) Has been cancelled
Release / release (push) Has been cancelled
Release / update-homebrew (push) Has been cancelled
- Implement provider.Searcher on each: Subsonic search3 for Navidrome,
/Items?searchTerm for Jellyfin, in-memory scan for Local playlists
- Wire Ctrl+F into the focusProvider key dispatcher and the Navidrome
browser overlay so it works wherever the user is browsing
- Add S / L / R provider-switch shortcuts to focusProvider (matched J / N)
- Reorder overlay key dispatch so the search overlay claims keys above
the nav browser
- Rename the search overlay title from "Spotify Search" to plain "Search"
- Tweak ColorKeyBG to use Accent instead of FG
* fix(playlist): skip unavailable Spotify tracks during playback
Mark Spotify tracks as unplayable when the API reports restrictions,
skip them in next/prev/activate playback flows, and surface their
state in the playlist UI.
Add coverage for playlist navigation and playback behavior around
unavailable tracks.
* fixes and whatnot
Release / build (amd64, darwin, macos-latest) (push) Has been cancelled
Release / build (amd64, linux, ubuntu-latest) (push) Has been cancelled
Release / build (amd64, windows, windows-latest) (push) Has been cancelled
Release / build (arm64, darwin, macos-latest) (push) Has been cancelled
Release / build (arm64, linux, ubuntu-latest) (push) Has been cancelled
Release / release (push) Has been cancelled
Release / update-homebrew (push) Has been cancelled
* feat: support media controller on mac
* fix(notifications): publish current playback state when media notifier attaches
* fix(darwin): lock startup to the Cocoa main thread
* refactor: cleanup and simplify
* missed cleanup