- Create Playlist flow: Added an in-app create-playlist screen with name entry, track search, selected-track management, and playlist creation through the Spotify API (#193).
- Global like/unlike hotkey: Added a configurable global keybinding (
Fby default) to like or unlike the currently playing track from any screen, complementing the existing context-specificskey. - Mouse input disable mode: Added
behavior.disable_mouse_inputssupport for users who want to run spotatui without mouse interactions enabled (#200).
- Fullscreen playbar resizing:
LyricsViewandCoverArtViewnow honor the existing playbar height setting, so the lower player can be resized or fully hidden with the same keybindings used on the main screen (fixes #208). - Settings UI simplification: Simplified settings screen block handling as part of the mouse-input disable work (#200).
- PKCE refresh-token persistence: Fixed refreshed auth tokens being written without preserving an existing refresh token, which could cause spotatui to require re-login after every reboot (#217).
- Startup auth cache recovery: Fixed startup behavior around failed token-cache loading and prevented in-memory
refresh_token = Nonestates from replacing a valid cached refresh token. - Followed Artists list appears empty: Fixed Artists view in Library to correctly display followed artists (#220; fixes #219).
- Hidden fullscreen cover-art centering: Fixed the fullscreen cover art image rendering slightly off-center when the playbar was completely hidden.
- Create Playlist results controls: Improved keyboard focus and tab controls in the create-playlist search results and selected-track panes.
- Volume display glitch on rapid changes: Fixed the volume percentage briefly reverting to an old value after the user changed it, especially noticeable when spamming volume up/down. The UI now always shows the user's intended volume until Spotify's API confirms it matches.
- Dependency maintenance: Bumped
tui-bar-graph,self_update, grouped Rust minor dependencies,rustls-webpki, andopenssl(#197, #204, #205, #213, #224, #225). - CI maintenance: Bumped
softprops/action-gh-releasefrom2to3in the Actions dependency group (#212). - Lint/format cleanup: Fixed clippy errors and rustfmt issues after the post-
v0.38.0changes (#222).
- Expanded add-to-playlist flows: Added
wadd-to-playlist support from search song results, artist top tracks, and recently played, limited the picker to editable playlists, and refresh the open playlist table after a successful add (#168). - Fullscreen Cover Art View: Added a dedicated
CoverArtViewwith its own route, handler, UI, help entry, and configurable keybinding when thecover-artfeature is enabled (#186). - MPRIS on Linux without native streaming: Added MPRIS availability and full playback/metadata state sync for Linux builds even when spotatui is controlling an external Spotify device instead of the native streaming backend (#172).
- Basic View renamed to Lyrics View: Renamed the former fullscreen
BasicViewtoLyricsView, keptbasic_viewas a config alias for backward compatibility, and split full-screen artwork into the new Cover Art view (#186). - Nix flake packaging/version handling: Refreshed
flake.nixand simplified release-version handling for Nix packaging (#149, #161).
- Liked Songs playback/paging drift: Fixed saved-track playback starting the wrong song, prevented rows from reordering while pages load, stabilized background prefetch around the current page, and made liked hearts render immediately when opening Liked Songs (#163; fixes #139).
- Playlist paging/cache stability: Fixed playlist tracks duplicating or shuffling while additional pages load, made next/previous navigation target adjacent page offsets instead of sparse cache indexes, and ensured playlist sort/fetch actions target the open playlist table instead of stale sidebar selection state (#163).
- Recommendations playback targeting: Fixed recommendation results so Enter and queue actions use the currently visible selected track list instead of stale cached recommendation state (#151).
- OAuth callback/auth retry handling: Fixed malformed callback requests and browser preflight noise triggering repeated auth prompts at startup, and tightened streaming OAuth retry behavior so only auth failures force a fresh credential retry (#176; fixes #170).
- Spotify 5xx playback polling: Temporary Spotify
502/503/504errors during playback polling now show a retry status message and recover automatically instead of surfacing as a hard failure (#178). - External-device/native playback recovery: Fixed playlist playback on external devices always starting from track 1, and added recovery for native streaming sessions that could stop after the connection dropped or went stale (#177; fixes #162 and #156).
- Audio backend panic reporting: Expanded the panic hook to recognize recoverable PortAudio and Rodio backend failures and show clearer error messaging (#184).
- Playlist page-boundary scrolling: Fixed playlist and track-table scrolling that could briefly render only a single visible row when crossing a page boundary (#185).
- Dependency maintenance: Bumped
self_update,tokio,tokio-tungstenite(twice),quinn-proto,rustls-webpki,tar, andworker-relay'sundici/wranglerdependencies (#153, #154, #155, #158, #175, #182, #183, #188). - Rust minor dependency rollup: Updated the grouped Rust minor dependency set, including
clap,clap_complete,image,openssl, andopenssl-sys(#164). - rspotify 0.16 migration: Upgraded
rspotifyfrom0.14.0to0.16.0and applied the follow-on compatibility updates across CLI, network, metadata, playback, and UI code (#187).
- Void Linux installation guide: Added README installation steps for Void Linux via the
Blackhole-vlrepository (#171).
- Startup Playback Behavior Setting: Added
behavior.startup_behaviorwithContinue,Play, andPauseoptions, plus a new Settings UI cycle control so startup playback state can be configured without editing YAML (#146). - Mouse Playbar Controls: Added clickable playbar controls for previous, play/pause, next, shuffle, repeat, like, and volume in both the main layout and Basic View, including hitbox handling for resized playbars (#147).
- Force Previous Track Action: Added a dedicated force-previous command and configurable keybinding (
Pby default) that always skips to the previous track instead of restarting the current one first (#141). - Auto-Update Controls: Added startup auto-update controls via
behavior.disable_auto_update,behavior.auto_update_delay, and the--no-updateCLI flag. Delayed installs now persist pending state and announce when an update will be applied.
- Settings Editing Model: Settings now support fixed-option cycle values directly in the list UI, enabling one-step editing for items like startup playback behavior.
- Update Flow Messaging: Automatic update checks now distinguish between immediate installs, delayed pending installs, and skipped startup checks instead of always updating right away.
- Linux Release Features: Updated the Linux CD build to include the
mprisfeature again so release binaries keep desktop media-control integration working (fixes #150). - Shift Keybinding Normalization: Normalized kitty-protocol
Shift+letterinput so uppercase bindings like the new defaultPaction are recognized reliably across terminals.
- Silent Auto-Update on Launch: Replaced the in-app update prompt with a silent, automatic update mechanism (#140). The app now checks for, downloads, and installs updates automatically at startup and restarts itself if an update is applied. The update check can be skipped by setting the
SPOTATUI_SKIP_UPDATEenvironment variable.
- In-App Update Prompt: Removed all UI, navigation, and logic related to the previous interactive update prompt (
UpdatePromptstate, handlers, and popup) (#140).
- macOS Build Feature Missing: Fixed missing
macos-mediafeature flag in CD workflow for macOS runners, preventing native media controls from working correctly.
- Resizable Sidebar and Playbar: Added user-configurable layout dimensions with runtime keyboard shortcuts (#138).
- New config options:
behavior.sidebar_width_percent,behavior.playbar_height_rows,behavior.library_height_percent. - Keyboard shortcuts to resize at runtime:
{/}(sidebar width),(/)(playbar height),|(library/playlists split). - New
src/core/layout.rsmodule with layout constraint utilities and tests. - Help menu updated to document all new layout adjustment shortcuts.
- New config options:
- Listening Party Mode (Host/Join): Added an in-app listening party flow with a relay-backed session model, including host/join states, party status in the playbar, and a dedicated party popup (
Ctrl+pby default). - Party Guest Name and Room Code UX: Added required guest name input and 6-character code entry for joining parties, plus host-side guest list and control-mode display.
- Queue View Route: Added a dedicated queue screen with selectable entries and a configurable keybinding to open it (
Qby default). - Relay Subproject for Party Sync: Added
worker-relay/Cloudflare Worker + Durable Object implementation for room creation, join routing, websocket relaying, and basic rate limiting. - Config and Keybinding Extensions: Added
behavior.relay_server_url,behavior.stop_after_current_track,keys.show_queue, andkeys.listening_partyconfiguration support.
- Token Refresh State Handling: Authentication refresh now updates in-memory expiry tracking after successful token refresh to avoid repeated refresh dispatch loops.
- Main Loop Network Polling: Tokio network loop now interleaves IO event handling with periodic party-message processing.
- macOS Now Playing Album Artwork: macOS Control Center / Now Playing now correctly shows album and episode cover art (#136).
- Stop-After-Current-Track Behavior: Native streaming playback now correctly pauses after a natural track transition when
stop_after_current_trackis enabled, instead of auto-continuing. - PortAudio Device-Switch Recovery (macOS/AirPods): Added recovery for recoverable PortAudio backend panics when the output device changes (for example, AirPods connect/switch events), reducing playback interruptions and preventing app crashes.
- Mac Tahoe 26.2 Build Failure (macOS Media Activation Policy): Fixed a macOS Tahoe 26.2 build break by correcting Objective-C FFI types for
NSApplication setActivationPolicy:(BOOLreturn andNSIntegerargument). - Settings Shortcut Reliability on macOS Terminals: Added terminal keyboard-capability detection and runtime fallback handling for
Ctrl+,when terminal/tmux stacks drop punctuation modifiers; spotatui now applies a session fallback toAlt+,, prompts before persisting toconfig.yml, and displays effective shortcuts in Help/Settings UI.
- Mouse Support Across the TUI: Added click/scroll interactions throughout the interface for navigation and settings adjustments.
- Unsaved Settings Confirmation Prompt: Added a confirmation flow when leaving settings with unsaved edits.
- Exit Confirmation Dialog: Added a quit prompt to prevent accidental exits.
- Pookie Pink Theme Preset: Added a new built-in
Pookie Pinktheme preset and improved selection highlight visibility. - Animated Home Banner Gradient: Added animation to the home banner gradient.
- Remote Announcements and Free-Account Messaging: Added remote announcement support and in-app messaging for free-account playback limitations.
- New Logging System: Added a centralized runtime logging pipeline and session log files in
/tmp/spotatui_logs/spotatuilog{PID}for diagnostics (#102). - Playbar Cover Art Rendering (Optional): Added optional cover art rendering next to the currently playing song/episode title via the
cover-artfeature flag andratatui-imageintegration (#111). - Cover Art Settings Controls: Added behavior toggles to enable/disable artwork rendering and force rendering on terminals without full image support (
behavior.draw_cover_art,behavior.draw_cover_art_forced) (#111). - Nix Flake Support: Added
flake.nixfor flake-based NixOS/Nix installs, includingnix run/nix developworkflow documentation (#117).
- Architecture Refactor: Reorganized the codebase into
core,infra, andtuimodules, including network layer extraction for maintainability. - Announcement Fetching Controls: Refactored announcement fetching to support environment-variable overrides and improved error handling.
- Documentation Updates: Updated README content, including playback limitations for free Spotify accounts and Homebrew installation instructions for macOS.
- Playback Device Auto-Selection: Fixed auto-select behavior for the
spotatuiplayback device. - Rapid Skip Playbar Desync: Fixed playbar state not updating correctly when skipping tracks rapidly.
- Like Action 400 Errors: Fixed
400 Bad Requestfailures when liking songs. - macOS Media Integration Regressions: Fixed macOS media support regressions in TUI handlers.
- Global Song Counter Reliability: Fixed issues affecting global song counter updates.
- macOS Media Keys and Now Playing Reliability: Fixed media-key handling and Control Center integration by wiring required macOS app/run-loop behavior and publishing now-playing metadata so spotatui responds to play/pause/next/previous correctly (#120).
- Dependency Maintenance: Bumped Rust minor dependency updates (#104) and refreshed
Cargo.lock. - Code Quality/Formatting: Fixed clippy warnings and applied rustfmt cleanups (#106).
- Nix Release Automation: Updated release workflow to sync
flake.nixpackage version fromCargo.tomlduring releases (#117). - Dependency Maintenance (Follow-up): Bumped
clapto4.5.60andanyhowto1.0.102(#115).
- Vesper Theme Preset: Added a new built-in
Vespertheme preset (#98). - Playlist Track Management Actions: Added flows to add tracks to playlists from track-table contexts and quick-add the currently playing track from anywhere (
W) (#99). - Playlist Track Removal Dialog: Added remove-from-playlist action (
xin playlist track tables) with a confirmation dialog and vim-styleh/lconfirmation navigation (#99).
- Deterministic Duplicate Removal in Playlists: Removing a track now targets only the selected occurrence by position instead of broadly deleting matching duplicates; when mutation payload safety cannot be guaranteed (for local/unavailable rows), spotatui now reports a clear status error instead of mutating the wrong rows (#99).
- Recurring Spirc Startup Failures with Cached Streaming Credentials: If Spirc initialization fails or times out while using cached streaming credentials, spotatui now clears stale
streaming_cache/credentials.json, requests fresh streaming OAuth credentials, and retries initialization once before falling back.
- Expired Token Startup Loop: Startup now validates cached auth tokens and forces a clean re-auth only when the cache is stale/invalid, preventing repeated
status code 400 Bad Requestfailures on launch. - Recurring 401 Error Modal: Direct Spotify API calls now refresh the access token on
401 Unauthorizedand retry, preventing the error screen from immediately reappearing after dismissal when a token expires mid-session. - Windows Compilation Regression: Fixed the Windows build break introduced in
0.36.0(#97).
- First-Run Auth Mode Selection: New users now choose between two setup paths during
client.ymlcreation: (1) use the shared ncspot client ID, or (2) use ncspot with a user-provided fallback client ID. - Automatic OAuth Client Fallback: If authentication or profile verification fails with the primary client ID, spotatui now retries automatically with
fallback_client_idwhen configured. - Client-Specific Token Caches: OAuth tokens are now stored per client ID to avoid collisions when switching between primary and fallback credentials.
- Spotify API Compatibility Layer: Added a raw request/normalization path for Spotify's February 2026 payload changes so responses can still map into existing models.
- Auth Reconfiguration Command: Added
--reconfigure-authto rerun client authentication setup without deleting config files. - One-Time Auth Migration Prompt: Existing users are prompted once to update authentication setup after config format changes.
- Authentication Flow Migrated to PKCE: spotatui now authenticates with
AuthCodePkceSpotifyfor better compatibility with current Spotify client-ID-based flows. - Setup Prompt Order: On first launch, global song counter opt-in is now prompted after client-ID setup (option 1/2), matching the onboarding sequence.
- ncspot Redirect URI Handling: The shared ncspot client path now uses its expected redirect URI and callback port (
http://127.0.0.1:8989/login). - Help Text and Migration Copy: Updated
--helpand startup migration wording to reflect the new authentication/configuration flow.
- Spotify Feb 2026 Breaking API Changes: Resolved multiple regressions for newly created/restricted apps, including missing-field deserialization failures (
tracks,track,followers,external_ids,available_markets, and related shape changes). - Discover Reliability: Reworked Discover top tracks/artists mix loading to avoid removed endpoints and to degrade gracefully when recommendation endpoints are unavailable.
- Library/Follow Endpoint Migration: Updated save/follow checks and mutations to use the new
/me/libraryand/me/library/containsstyle flows for tracks, albums, shows, artists, and playlists. - Startup/Discover 429 Handling: Added Spotify rate-limit retries with
Retry-Aftersupport, global API pacing, and non-fatal UI handling for transient 429 responses. - Excess Startup API Pressure: Reduced repeated liked-state checks on playback polling so idle startup no longer spams containment checks.
- Random Playback Poll Network Failures: Transient request-send/network errors during playback polling now auto-retry with status messaging instead of forcing the blocking error modal.
- Playlist Folder Navigation: Playlist folders from your Spotify library are now displayed as a navigable hierarchy in the UI, with optimized background fetching and immediate folder structure rendering (#92)
- Seek Was Completely Unusable: Rapid seeking (
</>keys) would freeze the player, corrupt audio, cause looping glitches, and require Ctrl+C to kill. Fixed by throttling native seeks to 50ms and API seeks to 200ms, queueing pending seeks, and ignoring stale position events after seeking (thanks @El-Mundos - #86) - MPRIS Position Tracking and Seeking: Fixed relative seek calculation (was treating offset as absolute position), added
SetPositionsupport for widgets using absolute positioning, and emitSeekedsignals so external clients update their displays (thanks @El-Mundos - #85) - MPRIS Shuffle and Loop Support: MPRIS now advertises shuffle and loop status capabilities so desktop media controls and
playerctlcan toggle shuffle and repeat modes bidirectionally (thanks @El-Mundos - #86) - Progress Reset on Resume: Resuming playback on external devices no longer briefly flashes 0:00 before the API returns the real position (thanks @El-Mundos - #86)
- Seek Timing Bug: Fixed a timing issue where queued API seeks didn't start the position-ignore window, causing the UI to jump back to stale positions during rapid seeks (thanks @El-Mundos - #86)
- Help Menu Closing App: Dismissing the help menu no longer closes the entire application; it is now handled as a proper route (thanks @dpnova - #89)
- Playlist Folder Refresh Races: Guarded against background refresh races and unified playlist resolution logic to prevent inconsistent folder state (#92)
- Dependency Updates: Updated
clapto 4.5.57 andanyhowto 1.0.101 (#90)
- MPRIS Album Art Metadata (Linux): MPRIS metadata now includes artwork URLs so desktop media controls can show album covers.
- Automated Homebrew Publishing: Added a
publish-homebrewrelease job to update the Homebrew tap formula on tagged releases. - Config Directory .gitignore: Automatically creates a
.gitignorein~/.config/spotatui/to protect sensitive files (client.yml,streaming_cache/credentials.json) from being accidentally committed when users sync their dotfiles.
- Slim Build Compilation: Fixed feature gating and conditional imports so builds without
streamingcompile cleanly. - Update Check Arc Cloning: Corrected
Arccloning in the async update check task. - AUR PKGBUILD Checksum Updates: Reworked checksum replacement using
awkand added validation checks to prevent malformed PKGBUILD updates in release workflows. - macOS Streaming Audio Backend: Defaulted
librespot-playbacktoportaudio-backendon macOS to avoid pipe-sink fallback issues. - Reqwest Dependency Resolution: Made
reqwestmandatory to prevent missing-dependency build failures (fixes #73).
- Dependency Updates: Updated
discord-rich-presenceto 1.1.0,clapto 4.5.56,timeto 0.3.47, andbytesto 1.11.1. - Project Metadata and Docs: Updated installation docs (Homebrew and Winget), funding metadata, and contributor acknowledgements.
- Settings Keybindings: Add customizable keybindings for settings actions.
- Playback Controls Responsiveness: Improve responsiveness of playback controls while streaming.
- Discord Rich Presence: Show track info, album art, and a GitHub callout in Discord; enabled by default with a built-in application ID and optional overrides via config/env.
- AUR Binary Package:
spotatui-binis now automatically published alongside releases for faster installation on Arch Linux.
- Playbar Status Messages: Added transient status messages in the playbar, used to notify when the saved playback device is unavailable and spotatui falls back to native streaming.
- Startup Playback Device Selection: Restored automatic selection of the last used playback device on startup, with graceful fallback to the native device when it is missing.
- Native Device Activation Latency: Made Spotify Connect activation non-blocking and reduced delays during device selection/playback.
- Home Screen Rendering: Cached the home banner gradient and changelog parsing to reduce per-frame work.
- Changelog Styling: Changelog section headers now use theme colors for a softer, theme-consistent look.
- Native Track Metadata: Store a preformatted artist display string for faster playbar updates.
- UI Render Loop: Cache terminal size per tick to avoid repeated backend queries.
- CLI Playback Crash: Fixed crash when using
spotatui playback --likeor--dislikeCLI commands (#50)- Root cause: Incorrect type access on clap
ArgGroupcaused type mismatch panic - Other
playbackflags (--shuffle,--repeat) were also affected
- Root cause: Incorrect type access on clap
- Audio Visualization: Real-time audio visualization with multiple display styles (requires
audio-vizoraudio-viz-cpalfeature)- Equalizer Mode: Uses
tui-equalizerwith half-block bars and brightness effect - Bar Graph Mode: Uses
tui-bar-graphwith full-height vertical bars - Visualizer style can be configured in
config.ymlunderbehavior.visualizer_style - Supports custom color gradients via
colorgradintegration - Dynamic frequency analysis displays while audio is playing
- Equalizer Mode: Uses
- tui-equalizer Integration: Added Josh McKinney's
tui-equalizerwidget for modern audio visualization - tui-bar-graph Integration: Added Josh McKinney's
tui-bar-graphwidget for alternative visualization style - Dynamic Theme Gradients: The home banner now features a dynamic, animated gradient that adapts to your current theme's colors
- Heart Burst Animation: Added a "heart burst" animation when liking a track for better visual feedback
- Upgraded to Ratatui 0.30: Major framework upgrade from Ratatui 0.26 to 0.30
- Replaced deprecated
Frame::size()withFrame::area()across all UI components - Updated
Appsize field to useratatui::layout::Size - Refactored terminal initialization and main event loop for new Frame API
- Replaced deprecated
- Upgraded to Crossterm 0.29: Updated from Crossterm 0.27 to 0.29 for improved terminal handling
- Modernized UI Aesthetics: Refactored UI rendering for cleaner, more modern appearance
- Audio Capture Lifecycle: Refactored lazy audio capture initialization for better resource management
- Unified Border Styles: Standardized all UI borders (Home, Search, Playbar, Lists) to use
Roundedcorners for a more modern and consistent look
- Added comprehensive
docs/RATATUI_0.30_CONVERSION.mddocumenting the upgrade process - Updated audio-viz feature flags to include new visualization dependencies
- Improved audio analysis widget architecture for better extensibility
- Sorting for Playlists, Albums, and Artists: Press
,to open a sort menu with multiple options- Playlist Tracks: Sort by Name, Date Added, Artist, Album, or Duration
- Saved Albums: Sort by Name, Date Added, or Artist
- Saved Artists: Sort by Name
- Quick keyboard shortcuts: lowercase letter for ascending (e.g.,
nfor Name), uppercase for descending (N) - Full playlist sorting fetches all tracks for proper cross-page sorting
- Track Repeat Mode: Fixed track repeat not working with native streaming player
- Previously, selecting "Track" repeat mode only updated the UI but continued playing the next song
- Now properly sends repeat commands to the librespot Spirc player
- Correctly cycles through Off --> Context --> Track --> Off repeat modes
- Discover: Top Tracks: View your 50 most-listened songs with time range selection
- Uses
[/]keys to cycle time range: 4 weeks, 6 months, All time - Full track table with playback, queue, and navigation support
- Uses
- Discover: Top Artists Mix: A shuffled playlist from your top 5 artists
- Fetches top tracks from each of your favorite artists
- Creates a unique mix every time you load it
- Loading Indicators: Shows "Loading..." while fetching Discover playlists
- Track Counts: Displays number of tracks loaded in the Discover menu
- Gruvbox Light Theme: Added a new warm light theme preset for better readability in bright environments
- Made for You API Error: Silenced JSON parsing error caused by Spotify's November 2024 API changes that restrict access to algorithmic playlists for apps without extended mode access
- Previously showed cryptic
json parse error: invalid type: null, expected struct SimplifiedPlaylisterror - Now gracefully handles the API restriction without showing an error
- Previously showed cryptic
- Theme Background Colors: Added full support for theme background colors
- Fixed issue where light themes appeared dark due to terminal background fallback
- UI widgets now strictly respect the theme's background set in
config.yml
- Renamed "Made For You" to "Discover": The Library's first option is now called "Discover" with a new UI for personalized music features
- Crash Log on Panic: When spotatui panics, it now writes a crash log to
~/.config/spotatui/spotatui_panic.logto help debug hard-to-reproduce issues (setSPOTATUI_PAUSE_ON_PANIC=1on Windows to keep the terminal open after a panic). - macOS Now Playing Integration: Native media key support on macOS via Apple's
MPRemoteCommandCenterAPI (requires native streaming). - Streaming Debug Overrides: Added
SPOTATUI_STREAMING_AUDIO_BACKENDandSPOTATUI_STREAMING_AUDIO_DEVICEenvironment variables to help debug native streaming audio output issues.
- Playlist Track Selection with Shuffle: Fixed selecting a specific track in a playlist sometimes starting playback from the first track and desyncing the shuffle indicator/state.
- Spirc Initialization Hangs/Crashes: Added a startup timeout for native streaming (Spirc) initialization so spotatui can fall back to API-based playback instead of hanging indefinitely (configurable via
SPOTATUI_STREAMING_INIT_TIMEOUT_SECS).
- Catppuccin Mocha Theme Preset: Added the popular Catppuccin Mocha Lavender color scheme as a new built-in theme preset (thanks @MysteriousWolf - PR #19)
- Nix Support: Added Nix derivation and build instructions for Nix users (thanks @copeison - PR #16)
- Basic Nix derivation for building spotatui
- Documentation for Nix-based installation
- ALSA Warnings and Lock Contention: Fixed ALSA warnings and lock contention issues that could cause freezing when viewing liked songs (thanks @rawcode1337 - PR #18, fixes #17)
- External Device Playback Controls: Fixed play/pause, skip, and volume controls not working when using the native Spotify app as the active playback device (fixes #14)
- Silent Crash During Streaming Init: Panics during Spotify Connect (Spirc) initialization no longer exit silently in release builds, and are handled by falling back to API-based playback control (fixes #15, untested).
- Persistent Playback Device: Saves the last used playback device (for example,
spotatuiorspotifyd) and re-selects it automatically on the next startup so playback resumes on the same device.
- macOS SIGSEGV Crash on Startup: Fixed segmentation fault when launching spotatui on macOS with Bluetooth audio devices connected
- Switched from rodio to portaudio audio backend for macOS builds
- Portaudio provides better compatibility with macOS CoreAudio and Bluetooth devices (AirPods, etc.)
- Pre-built macOS binaries now use portaudio backend by default
- Fixes crash during "Initializing Spirc" on macOS Sequoia and later
-
MPRIS D-Bus Integration (Linux): Desktop media control support for Linux users
- Control spotatui via media keys (play/pause, next, previous)
- Compatible with
playerctlcommand-line tool - Desktop environment integration (GNOME, KDE media widgets)
- Track metadata exposed (title, artist, album, duration)
- Playback status and volume synced to D-Bus
- Requires native streaming feature (enabled by default on Linux)
-
Multi-Page Playback Support: Enhanced playback functionality for large playlists and saved tracks
- Play seamlessly across all loaded pages, not just the current page
- Automatically calculates correct track offset across multiple pages
- Supports both saved tracks (Liked Songs) and playlists
-
Background Prefetching: Intelligent prefetching system for improved performance
- Automatically loads additional tracks in the background when viewing playlists or saved tracks
- Prefetches up to 500 tracks (~10 pages) for seamless playback
- Non-blocking implementation - prefetching runs in separate async tasks
- Prefetched tracks are immediately available for playback without delay
-
First Song Playback Delay: Fixed 5-10 second delay when playing the first song after startup
- Root cause: Prefetch operations were blocking the network thread, preventing playback events from being processed
- Fix: Converted prefetch operations to spawn as independent async tasks using
tokio::spawn() - Result: Playback starts instantly while prefetching happens in the background
-
Track Skip Metadata Sync: Implemented retry mechanism for track skip operations
- Ensures Spotify API returns updated track metadata after skipping
- Prevents showing stale track information in the UI
- Improves reliability of track transitions
- Smaller Binary Size: Added Ratatui-recommended release optimizations, reducing binary size by ~62% (26MB → 9.9MB)
- Enabled Link-Time Optimization (LTO)
- Single codegen unit for better optimization
- Strip debug symbols
- Optimized for size (
opt-level = "s") - Thanks to zamazan4ik for the suggestion in Issue #5!
-
Next Track Skip Shows Stale Progress: Fixed bug where skipping to the next track with native streaming would show stale progress from the previous song and appear paused
- Root cause:
get_current_playback()was preserving the old track'sis_playingstate (oftenfalseduring transition), which overwrote the new track's correct state from the Spotify API - Fix: Only preserve volume, shuffle, and repeat states when native streaming is active -
is_playingnow comes from the API response or player events - Result: Playbar correctly shows "Playing" and reset progress when skipping tracks
- Root cause:
-
Shuffle Not Actually Enabling with Native Streaming: Shuffle preference is now sent to librespot on startup and when toggling, with device activation to ensure it applies; UI and saved config stay in sync so shuffle really plays shuffled.
-
Playbar Shows Old Track After Skip: Fixed delay where playbar would briefly show the previous song's name/artist after skipping
- Root cause:
native_track_info(instant track info from native player) was unconditionally cleared when API response arrived, even if API returned stale data for the old track - Fix: Only clear
native_track_infowhen API track name matches the native player's track - Result: Playbar immediately shows the new track's name from native player, only switching to API data when it catches up
- Root cause:
- Artist View from Search: Fixed issue where selecting an artist from search results would show a 404 error instead of loading the artist view
- Root cause: The deprecated
related-artistsSpotify API endpoint was returning 404, blocking the entire artist view from loading - Fix: Made related artists fetch optional - artist view now loads successfully with albums and top tracks even if related artists endpoint fails
- Related artists section will be empty when the endpoint is unavailable, but core artist information displays correctly
- Root cause: The deprecated
- Persistent Volume: Volume changes are saved immediately to
config.ymland restored on startup so your level sticks between sessions - Persistent Shuffle: Shuffle state is now saved and reapplied on launch, including when using native streaming, so you restart right where you left off
- (thanks u/Ratox for the ideas)
-
Program Hanging on Exit: Fixed issue where pressing "q" to exit the TUI would close the interface but leave the program running in the background
- Root cause: Network thread continued running because the IO channel sender was never dropped, keeping the channel open indefinitely
- Fix: Added
close_io_channel()method that explicitly drops the sender when exiting, allowing the network thread to terminate gracefully - Result: Program now exits cleanly without requiring an additional Ctrl+C
-
Butter-Smooth Playbar Updates: Completely rewrote playbar progress calculation for silky-smooth updates
- Previously: Progress jumped every 5 seconds when the Spotify API was polled, causing visible stuttering
- Now: Smooth incremental updates every tick (16ms by default, configurable via
tick_rate_milliseconds) - How it works:
- On each tick, progress increments by the tick rate when playing
- Resyncs with Spotify API every 5 seconds to prevent drift
- Responds to API updates within 300ms for instant feedback on play/pause/seek
- Result: Progress bar now flows smoothly like a native music player, not in 5-second jumps
- Optimized code paths to reduce CPU usage and unnecessary calculations
-
First Song Pause Bug: Fixed issue where pausing the first song after startup required pressing pause twice
- Root cause:
is_playingstate wasn't immediately updated totruewhen starting playback, stayingfalseuntil API poll completed - Fix: Now immediately sets
is_playing = truewhenStartPlaybacksucceeds, matching the behavior of resume playback - Result: Pause button works correctly on first press, even immediately after selecting a song
- Root cause:
-
Instant Track Skip with Native Streaming: When using native streaming, skipping tracks (n/p keys) now updates the playbar instantly
- Previously, the UI waited for the Spotify API response before updating, causing a noticeable delay where you'd hear the new song while the playbar still showed the old song
- Now uses the native player's
next()/prev()methods via the Spirc controller for immediate skip - Added
NativeTrackInfo- extracts track name, artists, and duration from librespot'sTrackChangedevent for instant playbar display - The playbar now shows native player info immediately, then seamlessly transitions to full API data when it arrives
-
Real-Time Playbar Progress: The progress bar now updates every second instead of every 5 seconds when using native streaming
- Enabled
position_update_intervalin librespot's PlayerConfig to receive periodicPositionChangedevents - Added
is_streaming_activeflag to disable API-based progress calculation when native streaming is active - Progress bar time now shows accurate, real-time playback position (0:01, 0:02, 0:03...) instead of jumping in 5-second increments
- Enabled
- Critical: UI Freeze on Rapid Pause/Play: Fixed terminal freeze that occurred when rapidly pressing pause/play
- Root cause:
handle_player_eventsused blockinglock().awaitfor every player event, creating a lock convoy with the main UI loop - Fix: Changed to non-blocking
try_lock()- if lock is busy, skip the update (UI catches up on next tick)
- Root cause:
- Playbar Not Updating: Fixed playbar only updating every 5 seconds instead of in real-time
- Root cause:
get_current_playback()incorrectly overwrote API'sis_playingstate with stale local state - Fix:
is_playingis no longer preserved locally - it now comes from API responses and player events
- Root cause:
- Audio Visualization Now Works on
cargo install: Addedaudio-viz-cpalto default features so audio visualization works out of the box when installing viacargo install spotatui- Previously, only pre-built binaries had audio visualization enabled
- Uses cross-platform
cpallibrary for Windows, macOS, and Linux support
- Volume Persistence: Volume setting now persists across application restarts (thanks to Reddit user u/Ratox for the suggestion!)
- Saved in
config.ymlunderbehavior.volume_percent - Applied automatically when native streaming starts
- Saved in
- Updated README with detailed audio visualization platform support table:
- Windows: Works out of the box (WASAPI loopback)
- Linux: Works out of the box (PipeWire/PulseAudio monitor)
- macOS: Requires virtual audio device (BlackHole or Loopback)
- In-App Settings Screen: Press
Alt-,to open a new settings UI for customizing spotatui without editing config files- Behavior Settings: Adjust seek duration, volume increment, tick rate, icons, and toggle options
- Keybindings: View current keybindings (editing coming in future release)
- Theme Presets: Choose from 7 built-in themes with instant preview
- Theme Presets: Added 6 new color schemes in addition to the default:
- Spotify - Official Spotify green (#1DB954) theme
- Dracula - Popular dark purple/pink theme
- Nord - Arctic, bluish color palette
- Solarized Dark - Classic dark theme
- Monokai - Vibrant colors on dark background
- Gruvbox - Warm retro groove colors
- Configuration Persistence: Settings changes are saved immediately to
config.yml- no restart required
- Updated README with In-App Settings documentation and theme preset table
- Updated bug report template with terminal-specific fields (OS, Terminal, Version) instead of browser/smartphone fields
- Native Streaming Optimizations: When using native streaming, seek/pause/volume changes now happen instantly without API round-trips
- Reduced API Delays: Lowered playback control delays (seek: 1000ms → 200ms, next/prev: 250ms → 100ms) for snappier response
- Added Settings keybinding (
Alt-,) to the help menu
- Cross-Terminal Color Compatibility: Use explicit RGB values instead of named ANSI colors throughout the UI for consistent rendering across terminals (fixes display issues on Kitty, Alacritty, etc.)
- Audio visualization bar colors
- Lyrics display (active/inactive lines)
- Changelog section headers (Added/Fixed/Changed/etc.)
- Streaming Player Events: Improved player event handling to avoid deadlocks by releasing mutex locks before dispatching IO events
- Settings Route Handling: Added missing
RouteId::Settingscase in navigation handler to prevent unexpected behavior
- Native Spotify Streaming (Experimental): spotatui can now play audio directly! No more need for spotifyd or an external Spotify client
- "spotatui" appears as a Spotify Connect device in your device list
- Control playback from the TUI, phone, or any other Spotify client
- Powered by librespot for native audio
- New
streamingfeature flag (enabled by default) - Requires separate OAuth flow with redirect URI
http://127.0.0.1:8989/login
- Updated README with Native Streaming documentation and setup instructions
- Added second redirect URI requirement for Spotify app configuration
- Lyrics in Basic View: Introduced lyrics support in the basic view mode (press
Bto toggle)
- Network Layer: Implement network layer for Spotify API interactions and I/O event handling
- Improved Playlist Scrolling: Increased playlist fetch batch size to 50 for smoother scrolling performance
- UI Lag on Skip: Fixed issue where UI showed the old song for a few seconds after skipping by adding a small delay for state propagation
- Fix audio visualization UI rendering on Windows (replaced emoji icons with ASCII alternatives)
- Remove debug output that was bleeding into TUI display on Windows
- Unskippable Update Prompt: When a new version is available, users are shown a mandatory modal that must be acknowledged before using the app
- Displays current and latest version with update instructions
- Press Enter, Esc, q, or Space to dismiss
- Replaces the old auto-dismissing notification banner
- Audio Visualization Improvements:
- Added noise gate to filter out background noise when no audio is playing
- Boosted high frequency bands (Air, Ultra) for better visibility
- Added gradient colors to spectrum bars based on bar height (green → yellow → orange → red)
- Real-time Audio Visualization: Press
vto see a live spectrum analyzer visualization- Native PipeWire integration on Linux for seamless audio capture without playback interference
- FFT-based frequency analysis with 12 frequency bands (Sub to Ultra)
- Smooth 60 FPS animation with pleasing visual aesthetics
- Automatic sink monitor detection on Linux via PipeWire
- No longer depends on Spotify's deprecated Audio Analysis API
- Added
audio-vizfeature flag (enabled by default on Linux) - Added
pipewireandrealfftdependencies for audio processing
- Default tick rate changed from 250ms to 16ms (~60 FPS) for smoother UI
- Audio visualization UI shows cleaner status with just "🎵 Capturing audio" and peak level
- PipeWire development libraries required for audio visualization:
- Debian/Ubuntu:
libpipewire-0.3-dev libspa-0.2-dev - Arch Linux:
pipewire - Fedora:
pipewire-devel
- Debian/Ubuntu:
- Global Song Counter: Anonymous telemetry feature tracking total songs played by all users worldwide
- Completely anonymous - no personal information, song names, or listening history collected
- Opt-in by default with clear privacy notice and easy opt-out via config
- Real-time counter displayed in README badge
- Powered by Cloudflare Workers for free, globally-distributed edge computing
- Rate-limited to prevent abuse (60-second cooldown per IP)
- Can be disabled by setting
enable_global_song_count: falsein config.yml - Startup prompt for existing users to opt-in or opt-out
- Added
reqwestdependency withrustls-tlsfor telemetry HTTP requests - Added
telemetryfeature flag (enabled by default) - Updated README with privacy notice and global counter badge
- Improved changelog display in home screen with styled markdown rendering (colored headers, bullet points, section-specific colors)
- Fix duplicate key events on Windows by filtering for
KeyEventKind::Pressonly
- Rebranded: Project renamed from
spotify-tuitospotatui - Config Directory: Changed config path from
~/.config/spt/to~/.config/spotatui/ - Construct Spotify config immutably in auth flow
- Update window title handling
- Simplify Option handling and unify key-event flows across handlers
- Small correctness, arithmetic and parsing improvements in CLI, app, and banner
- Use typed
id()keys for HashSet operations and simplify collections - Minor rendering and text updates, default ColumnId and ID checks in UI
- Add
spotatui updatecommand for self-updating from GitHub releases - Add automatic update check on startup with notification banner (auto-dismisses after 15 seconds)
- Add comprehensive Copilot instructions documentation (
.github/copilot-instructions.md) - Updated GitHub Actions workflow for automated cross-platform releases
- Upgrade
clapfrom 2.33.3 to 4.5 to remove unmaintainedattydependency (GHSA-g98v-hv3f-hcfr) - Add
clap_complete4.5 for shell completion generation
- Enhance track navigation: load previous tracks when at the start and clamp selected index after loading new tracks
- Handlers Migration Complete: All handlers now use typed IDs (
PlaylistId,PlayableId,PlayContextId) - Refactor track_table to use typed PlaylistId/PlayContextId and simplify logic
- Update artist handler to use PlayableId for playback/queue and recommendations
- Convert album_tracks handler to typed PlayContextId/PlayableId
- Fix input key event pattern matches to account for new
KeyEventfields in crossterm - Fix shuffle behavior: temporarily disable shuffle when playing a specific track to preserve selection
- Fix search handling: avoid passing market parameter incorrectly and handle null playlists
- Fix playback: play selected track directly within context and reorder URIs for correct first-track playback
- Fix track table: load next page of playlist tracks when navigating past last item
- Clone market when calling spotify.search to preserve ownership
- Minor compile-time fixes (app/event/main/redirect/config imports)
- Add manual token cache with load/save helpers for authentication persistence
- Document deprecated Spotify endpoints and silence deprecation warnings
- Remove unused
futuresdependency - Remove Debug derive from
IoEventin network module
- Network Layer Migration: Complete migration to typed IDs for all network API calls
- Network: adapt search API signature and map search results to typed IDs
- Network: migrate manual pagination for playlists, albums, saved tracks
- Network: migrate saved-shows and show/episode endpoints
- Network: rename follow/unfollow playlist/artist APIs to new method names
- Network: update recommendations/seed handling and PlayableId mapping
- Migrate playlist and recently_played handlers to typed IDs
- Fix device volume handling: safely handle optional
volume_percentfield - Fix clipboard helpers: use typed IDs and bail gracefully when data is missing
- Fix user country retrieval with defensive error handling
- Fix mutable borrow issues for current route handling
- App: migrate playback progress/duration to rspotify 0.12 Duration fields
- Add
chronodependency for time handling - App: use typed TrackId when requesting audio analysis
- App: convert recommendation seed id handling to typed IDs
- App: switch follow/unfollow and saved-album flows to typed IDs (into_static)
- Forked: Project forked and maintained by LargeModGames
- Major Dependency Update:
- Migrated from
tuitoratatui(v0.26) for UI rendering - Upgraded
rspotifyto v0.13 with new authentication API (AuthCodeSpotify) - Updated all dependencies to latest compatible versions
- Migrated from
- Typed ID System: Begin migration to rspotify's typed ID system (
TrackId,PlaylistId,PlayableId,PlayContextId) - Duration Handling: Switch from legacy duration fields to rspotify 0.12+
Duration/TimeDeltatypes - UI Frame API: Update all ratatui draw helpers to use
Frame<'_>parameter style - Migrate Spotify authentication and network layer to new rspotify API (AuthCodeSpotify)
- App: switch to rspotify idtypes and convert app dispatches to typed IDs
- CLI: normalize to typed IDs, remove lifetime param, handle optional device IDs and duration conversions
- Network: adopt rspotify idtypes for IoEvent payloads
- Handlers/track_table: use typed IDs/PlayableId and context IDs for playback/queue
- Add futures dependency for network stream handling & device API
- Handle invalid Client ID/Secret #668
- Fix default liked, shuffle, etc. icons to be more recognizable symbols #702
- Replace black and white default colors with reset #742
- Add ability to seek from the CLI #692
- Replace
clipboardwitharboard#691 - Implement some episode table functions #698
- Change
--likethat toggled the liked-state to explicit--likeand--dislikeflags #717 - Add to config:
enforce_wide_search_barto make search bar bigger #738 - Add Daily Drive to Made For You lists search #743
- Fix app crash when pressing Enter before a screen has loaded #599
- Make layout more responsive to large/small screens #502
- Fix use of incorrect playlist index when playing from an associated track table #632
- Fix flickering help menu in small screens #638
- Optimize seek #640
- Fix centering of basic_view #664
- Implement next/previous page behavior for the Artists table #604
- Show saved albums when getting an artist #612
- Transfer playback when changing device #408
- Search using Spotify share URLs and URIs like the desktop client #623
- Make the liked icon configurable #659
- Add CLI for controlling Spotify #645
- Implement Podcasts Library page #650
- Show ♥ next to album name in saved list #540
- Fix to be able to follow an artist in search result view #565
- Don't add analysis view to stack if already in it #580
- Add additional line of help to show that 'w' can be used to save/like an album #548
- Add handling Home and End buttons in user input #550
- Add
playbar_progress_textto user config and upgrade tui lib #564 - Add basic playbar support for podcasts #563
- Add 'enable_text_emphasis' behavior config option #573
- Add next/prev page, jump to start/end to user config #566
- Add possibility to queue a song #567
- Add user-configurable header styling #583
- Show active keybindings in Help #585
- Full Podcast support #581
- Fix typo in help menu #485
- Add save album on album view #506
- Add feature to like a song from basic view #507
- Enable Unix and Linux shortcut keys in the input #511
- Add album artist field to full album view #519
- Handle track saving in non-album contexts (eg. playlist/Made for you). #525
- Move pagination instructions to top of help menu #442
- Add user configuration toggle for the loading indicator #447
- Add support for saving an album and following an artist in artist view #445
- Use the
▶glyph to indicate the currently playing song #472 - Jump to play context (if available) - default binding is
o#474
- Add more readline shortcuts to the search input #425
- Fix crash when opening playlist #398
- Fix crash when there are no artists avaliable #388
- Correctly handle playlist unfollowing #399
- Allow specifying alternative config file path #391
- List artists names in the album view #393
- Add confirmation modal for delete playlist action #402
- Artist name in songs block #365 (fixes regression)
- Add basic view key binding to help menu
- Show if search results are liked/followed #342
- Show currently playing track in song search menu and play through the searched tracks #343
- Add a "basic view" that only shows the playbar. Press
Bto get there #344 - Show currently playing top track #347
- Press shift-s (
S) to pick a random song on track-lists #339
- Prevent search when there is no input #351
- Fix empty UI when pressing escape in the device and analysis views #315
- Fix slow and frozen UI by implementing an asynchronous runtime for network events #322. This fixes issues #24, #92, #207 and #218. Read more here.
- Add experimental audio visualizer (press
vto navigate to it). The feature uses the audio analysis data from Spotify and animates the pitch information. - Display Artist layout when searching an artist url #298
- Add pagination to the help menu #302
- Add high-middle-low navigation (
H,M,Lrespectively) for jumping around lists #234. - Play every known song with
e#228 - Search album by url: paste a spotify album link into the search input to go to that album #281
- Implement 'Made For You' section of Library #278
- Add user theme configuration #284
- Allow user to define the volume increment #288
- Fix crash on small terminals #231
- Don't error if failed to open clipboard #217
- Fix scrolling beyond the end of pagination. #216
- Add copy album url functionality #226
- Allow user to configure the port for the Spotify auth Redirect URI #204
- Add play recommendations for song/artist on pressing 'r' #200
- Added continuous deployment for Windows #222
- Change behavior of previous button (
p) to mimic behavior in official Spotify client. When the track is more than three seconds in, pressing previous will restart the track. When less than three seconds it will jump to previous. #219
- Add support for adding an album and following a playlist. NOTE: that this will require the user to grant more permissions #172
- Add shortcuts to jump to the start or the end of a playlist #167
- Make seeking amount configurable #168
- Added pagination to user playlists #150
- Add ability to delete a saved album (hover over the album you wish to delete and press
D) #152 - Add support for following/unfollowing artists #155
- Add hotkey to copy url of currently playing track (default binding is
c)#156
- Refine Spotify result limits, which should fit your current terminal size. Most notably this will increase the number of results from a search #154
- Navigation from "Liked Songs" #151
- App hang upon trying to authenticate with Spotify on FreeBSD #148
- Showing "Release Date" in saved albums table #162
- Showing "Length" in library -> recently played table #164
- Typo: "AlbumTracks" -> "Albums" #165
- Janky volume control #166
- Volume bug that would prevent volumes of 0 and 100 #170
- Playing a wrong track in playlist #173
- Add custom keybindings feature. Check the README for an example configuration #112
- Fix panic when seeking beyond track boundaries #124
- Add scrolling to library album list. Can now use
ctrl+d/uto scroll between result pages #128 - Fix showing wrong album in library album view - #130
- Fix scrolling in table views #135
- Use space more efficiently in small terminals #143
- Improve onboarding: auto fill the redirect url #98
- Indicate if a track is "liked" in Recently Played, Album tracks and song list views using "♥" - #103
- Add ability to toggle the saved state of a track: pressing
son an already saved track will unsave it. #104 - Add collaborative playlists scope. You'll need to reauthenticate due to this change. #115
- Add Ctrl-f and Ctrl-b emacs style keybindings for left and right motion. #114
- Fix app crash when pressing
enter,qand thendown. #109 - Fix trying to save a track in the album view #119
- Fix UI saved indicator when toggling saved track #119
- Implement library "Artists" view - #67 thanks @svenvNL. NOTE that this adds an additional scope (
user-follow-read), so you'll be prompted to grant this new permissions when you upgrade. - Fix searching with non-english characters - #30. Thanks to @fangyi-zhou
- Remove hardcoded country (was always set to UK). We now fetch the user to get their country. #68. Thanks to @svenvNL
- Save currently playing track - the playbar is now selectable/hoverable #80
- Lay foundation for showing if a track is saved. You can now see if the currently playing track is saved (indicated by ♥)
- Start a web server on localhost to display a simple webpage for the Redirect URI. Should hopefully improve the onboarding experience.
- Add ability to skip to tracks using
nfor next andpfor previous - thanks to @samcal - Implement seek functionality - you can now use
<to seek backwards 5 seconds and>to go forwards 5 seconds - The event
Awill jump to the album list of the first artist in the track's artists list - closing #45 - Add volume controls - use
-to decrease and+to increase volume in 10% increments. Closes #57
- Keep format of highlighted track when it is playing - #44 thanks to @jfaltis
- Search input bug: Fix "out-of-bounds" crash when pressing left too many times #63
- Search input bug: Fix issue that backspace always deleted the end of input, not where the cursor was #33
- Add
Ctrl-rto cycle repeat mode (@baxtea) - Refresh token when token expires (@fangyi-zhou)
- Upgrade
rspotifyto fix #39 (@epwalsh)
- Fix duplicate albums showing in artist discographies (@baxtea)
- Slightly better error message with some debug tips when tracks fail to play
- Can now install
spotify-tuiusingbrew reinstall Rigellute/tap/spotify-tuiandcargo install spotify-tui🎉 - Credentials (auth token, chosen device, and CLIENT_ID & CLIENT_SECRET) are now all stored in the same place (
${HOME}/.config/spotify-tui/client.yml), which closes this issue
- Improved onboarding experience
- On first startup instructions will (hopefully) guide the user on how to get setup
- General navigation improvements
- Improved search input: it should now behave how one would expect
- Add
Ctrl-d/ufor scrolling up and down through result pages (currently only implemented for "Liked Songs") - Minor theme improvements
- Make tables responsive
- Implement resume playback feature
- Add saved albums table
- Show which track is currently playing within a table or list
- Add
aevent to jump to currently playing track's album - Add
sevent to save a track from within the "Recently Played" view (eventually this should be everywhere) - Add
Ctrl-sto toggle shuffle - Add the following journey: search -> select artist and see their albums -> select album -> go to album and play tracks
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.