Releases: LargeModGames/spotatui
Release list
v0.40.2
Fixed
- Liked icons now show reliably everywhere: Album tracklists, artist pages, Recently Played, Discover lists, and recommendations now fetch the liked state of their tracks when opened, so the liked marker no longer appears only for songs played or searched this session. Artist pages also fetch saved-album and followed-artist state for their heart markers. In addition, liked-state lookups are now batched at Spotify's documented 40-URI limit instead of 50, fixing a
400 Bad Request "Too many uris"error that silently blanked the icons for any playlist or album longer than 40 tracks (#118). - Native idle recovery no longer repeats forever: When Spotify reports no active playback after a stale native session, spotatui still tries to restore the local device automatically. It now stops after two recovery attempts for the same idle session instead of sending
transfer(None)andactivate()every few seconds (#311). - Album tracklists no longer cut off at 50 songs: Opening an album now pages through the full Spotify tracklist instead of stopping at the API's 50-track page limit, whether the album is opened from search results, an artist's discography, a track's context, or the saved-albums library (#324).
cargo install spotatuibuilds again: A fresh dependency resolve pulled invergen 9.1.0, which breaks librespot's build script (two incompatiblevergen-libversions in the graph, error E0277). A constraint-only pin keepsvergenbelow 9.1 until librespot ships a fix; the README now also recommendscargo install --locked(#350).ssaves tracks in search results: Pressingson a highlighted track in the Songs search block now toggles its saved/liked state, matching the track-table binding shown in the help menu. Search results also fetch the liked state of listed tracks, so already-liked songs show the liked marker and toggle correctly (#348).- MPRIS controls survive native-player recovery: Linux MPRIS events now look up the active native streaming player when they arrive, rather than retaining the instance created at startup. Media controls therefore continue to work after spotatui recreates its native player during streaming recovery (#356).
- Unmapped high function keys no longer crash the TUI:
F13throughF24now safely map to the unknown-key fallback instead of panicking, which protects spotatui from extended function keys emitted by global hotkeys (#332).
Added
- Lua scripting API v5: A major expansion of the plugin API. Plugins can now read library data asynchronously (
get_playlists,get_queue,get_search_results,get_saved_tracks/albums/shows,get_recently_played,get_devices,get_lyrics, all with the(data, err)callback convention), drive far more of the app (set_repeat/cycle_repeat,transfer_playback,play_uri/play_context,add_to_queue, playlist create/edit, save/follow actions), schedule work withset_timeout/set_interval/cancel_timer, persist state in a per-plugin JSON store (storage_get/set/remove/keys), navigate (navigate/back/current_route), read the user config (config()), react to new events (shuffle_change,repeat_change,device_change,search_results,route_change), and register full custom screens with paragraph/list/gauge widgets and per-key callbacks (register_screen,set_screen,show_screen,close_screen). Seedocs/scripting.mdand the newexamples/plugins/queue-browser.lua. - In-app listening stats and recap flow: The Library now includes a Stats screen with selectable 7-day, 30-day, monthly, yearly, and all-time views of total plays/listening time, top tracks/artists/albums, recent daily activity, plus current and longest listening streaks. Press the configurable recap key (
Rby default) to generate a shareable HTML card for the active period; the app can also offer a monthly recap on first launch of a new month (disable it withbehavior.enable_monthly_recap_prompt). Listening history now syncs individual completed songs to spotatui.com whenbehavior.sync_tokenis configured, while retaining unsynced records locally for later retry. - Playlist folders in the add-to-playlist picker: The
w"Add Track To Playlist" dialog now shows your Spotify playlist folders and navigates them like the sidebar:Enteron a 📁 row opens the folder, the←row goes back, andEnteron a playlist adds the track. Only editable (owned or collaborative) playlists are offered, and the "Playlist Folders First" setting orders the dialog too. If folder data is unavailable (librespot rootlist fetch fails, or a build without native streaming), the dialog falls back to the previous flat list. - Global customization: Nearly every part of the UI is now configurable via
config.ymland the Settings screen. Pick the screen that opens at launch (startup_route: home, recently played, podcasts, discover, artists, or saved albums — fetched on startup so it arrives populated) and a default sort order per screen (default_sort_playlist_tracks/_saved_albums/_saved_artists/_recently_played, asfieldorfield:desc). Rearrange the layout withsidebar_position: left|right|hidden(hidden auto-reveals while the sidebar has focus) andplaybar_position: bottom|top, and tune the responsive breakpoints (small_terminal_width/_height). New icon fields (progress-gauge fill, sort arrows, episode-played marker, active-source dot, list cursor) join the existing ones in a new Icons Settings tab, with one-column width validation where table alignment depends on it. The playbar buttons can be relabeled (behavior.playbar_control_labels, hitboxes resize automatically), the playbar status line and window title are format templates (format:section with{state},{device},{volume}, … placeholders), and every table's columns can be reordered, removed, renamed, and resized (tables:section). Timing constants are exposed too: status-message duration (status_message_ttl_percent), playback poll interval, table scroll padding, and like-animation length. Invalid values never brick the app — structural config errors log a warning and fall back to the built-in default. Documented indocs/configuration.mdwith a full commented example atexamples/config.example.yml. - Native cross-source play queue: Press
zon any track to add it to a native queue that plays across sources (Spotify, Local Files, Subsonic, and YouTube in one FIFO; internet radio is excluded since a live stream is not a finite track). Queued tracks play before the underlying playlist/album context, then that context resumes where it left off. Open the queue withShift+Q: remove the selected item withx(rebindable viaremove_from_queue, defaultx), reorder it withJ/K, or pressEnterto skip ahead and play it now. The Queue screen also previews what resumes from the underlying context once the queue drains. The queue survives restarts (persisted inlast_session.yml). Spotify tracks queue through native (librespot) streaming; when you are controlling an external Spotify Connect device instead,zkeeps the previous Web-API "add to Spotify's queue" behavior (#206). - Terminal (ANSI) theme preset: A new theme preset built entirely from the terminal's own ANSI palette colors instead of hardcoded RGB, so terminal-theming tools like pywal recolor spotatui live, without a restart (#336).
- Playlist Folders First setting: A new
behavior.group_folders_firsttoggle (Settings → "Playlist Folders First") lists your Spotify playlist folders at the top of the Playlists tab, above playlists, keeping each group's existing order. Off by default. Handy because folders keep their creation date and otherwise sink to the bottom of the recency-sorted list. - GitHub profile now-playing widget: With a spotatui.com account you can now embed a live "now playing" card in your GitHub profile README (
), enabled from the spotatui.com dashboard by picking a public username and turning the widget on. To power it, the now-playing cloud sync (requiresbehavior.sync_token) now includes the album, cover-art URL, track duration and progress, play/pause state, and a LIVE flag for internet radio; it also pushes immediately on pause/resume and seeks, keeps heartbeating while paused so the card shows "paused" instead of going offline, and clears your status as soon as playback stops rather than only on exit.
Changed
- Documentation refresh: Reworked the README around spotatui as a multi-source terminal music player, with a shorter quickstart, source overview, feature summary, and updated
cargo install --lockedguidance. The configuration and scripting documentation now cover the expanded customization and Lua APIs.
Internal
- Dependency maintenance: Updated the Rust dependency set, including
rodio0.22,symphonia0.6,lofty0.24,mlua0.12,md-50.11, and theclap_complete/open/tempfilerollup. - CI maintenance: Documentation table-of-contents updates now open a pull request instead of attempting to push directly to protected
main.
Downloads
- On Windows 10/11 (64-bit) →
spotatui-windows-x86_64.zip - On Linux (Ubuntu, Arch, Fedora, etc.) →
spotatui-linux-x86_64.tar.gz - On macOS with Intel CPU →
spotatui-macos-x86_64.tar.gz - On **macOS with Apple Silicon (M1/M2/M3...
v0.40.1
chore(release): bump version to 0.40.1 and update changelog
Downloads
- On Windows 10/11 (64-bit) →
spotatui-windows-x86_64.zip - On Linux (Ubuntu, Arch, Fedora, etc.) →
spotatui-linux-x86_64.tar.gz - On macOS with Intel CPU →
spotatui-macos-x86_64.tar.gz - On macOS with Apple Silicon (M1/M2/M3) →
spotatui-macos-aarch64.tar.gz
Checksums (.sha256) are optional and only needed if you want to verify the download.
The Linux and Windows builds include the extra music sources (Local Files, Subsonic, Internet Radio, YouTube). The YouTube source needs yt-dlp installed (ffmpeg recommended).
To update use "spotatui update --install" or use your package manager of choice.
Full Changelog: v0.40.0...v0.40.1
v0.40.0
Merge branch 'main' of github.com:LargeModGames/spotatui
Downloads
- On Windows 10/11 (64-bit) →
spotatui-windows-x86_64.zip - On Linux (Ubuntu, Arch, Fedora, etc.) →
spotatui-linux-x86_64.tar.gz - On macOS with Intel CPU →
spotatui-macos-x86_64.tar.gz - On macOS with Apple Silicon (M1/M2/M3) →
spotatui-macos-aarch64.tar.gz
Checksums (.sha256) are optional and only needed if you want to verify the download.
The Linux and Windows builds include the extra music sources (Local Files, Subsonic, Internet Radio, YouTube). The YouTube source needs yt-dlp installed (ffmpeg recommended).
To update use "spotatui update --install" or use your package manager of choice.
What's Changed
- fix: self-update silently failing with 403 since v0.38.5 by @LargeModGames in #303
- chore(deps): bump the rust-minor-updates group with 4 updates by @dependabot[bot] in #305
- chore(deps): bump vergen-gitcl from 1.0.8 to 10.0.0 by @dependabot[bot] in #306
- chore(deps): bump vergen-lib from 9.1.0 to 10.0.0 by @dependabot[bot] in #307
- Add configurable movement keys by @tahminator in #304
- docs: add tahminator as a contributor for code by @allcontributors[bot] in #310
- fix native startup device activation and idle playbar state by @shilicioo in #308
- feat: add setting to disable media key controls (#309) by @LargeModGames in #312
- chore(deps): bump esbuild and wrangler in /worker-relay by @dependabot[bot] in #313
- chore(deps): bump undici and wrangler in /worker-relay by @dependabot[bot] in #314
- Fix silent native streaming (Spotify CDN HTTP 530) by @LargeModGames in #315
- chore(ci): bump actions/checkout from 6 to 7 in the actions group by @dependabot[bot] in #316
- chore(deps): bump the rust-minor-updates group across 1 directory with 5 updates by @dependabot[bot] in #325
- fix(mpris): implement volume Set and sync Volume property to D-Bus by @Ritze03 in #328
- docs: add Ritze03 as a contributor for code, and bug by @allcontributors[bot] in #330
- Multi-source playback: Local Files, Subsonic, Internet Radio, and YouTube by @LargeModGames in #329
New Contributors
- @tahminator made their first contribution in #304
- @Ritze03 made their first contribution in #328
Full Changelog: v0.39.1...v0.40.0
v0.39.1
chore(release): bump version to 0.39.1 and update changelog
Downloads
- On Windows 10/11 (64-bit) →
spotatui-windows-x86_64.zip - On Linux (Ubuntu, Arch, Fedora, etc.) →
spotatui-linux-x86_64.tar.gz - On macOS with Intel CPU →
spotatui-macos-x86_64.tar.gz - On macOS with Apple Silicon (M1/M2/M3) →
spotatui-macos-aarch64.tar.gz
Checksums (.sha256) are optional and only needed if you want to verify the download.
To update use "spotatui update --install" or use your package manager of choice.
Full Changelog: v0.39.0...v0.39.1
v0.39.0
chore: update supported versions in SECURITY.md for version 0.39
Downloads
- On Windows 10/11 (64-bit) →
spotatui-windows-x86_64.zip - On Linux (Ubuntu, Arch, Fedora, etc.) →
spotatui-linux-x86_64.tar.gz - On macOS with Intel CPU →
spotatui-macos-x86_64.tar.gz - On macOS with Apple Silicon (M1/M2/M3) →
spotatui-macos-aarch64.tar.gz
Checksums (.sha256) are optional and only needed if you want to verify the download.
To update use "spotatui update --install" or use your package manager of choice.
What's Changed
- chore(deps): bump the rust-minor-updates group with 2 updates by @dependabot[bot] in #283
- chore(deps): bump sha2 from 0.10.9 to 0.11.0 by @dependabot[bot] in #284
- chore(deps): bump tar from 0.4.45 to 0.4.46 by @dependabot[bot] in #286
- fix(streaming): keep playback on native device, surface failures (#282) by @LargeModGames in #287
- chore(deps): bump the rust-minor-updates group with 4 updates by @dependabot[bot] in #289
- Add playbar click-to-seek, fix search focus and cover art handling by @LargeModGames in #290
- fix spotatui native device and selector behavior by @shilicioo in #293
- System Media Tansport Controls Integration for Windows by @rlpratyoosh in #291
- fix: scroll settings list to keep selection in view by @LargeModGames in #294
- Fix stale native playback routing after streaming recovery by @shilicioo in #298
- Fix ghost spotatui Connect devices accumulating by @LargeModGames in #299
- Add Lua plugin scripting by @LargeModGames in #302
Full Changelog: v0.38.6...v0.39.0
v0.38.6
chore: update version to v0.38.6 and enhance Spotify API request handling
Downloads
- On Windows 10/11 (64-bit) →
spotatui-windows-x86_64.zip - On Linux (Ubuntu, Arch, Fedora, etc.) →
spotatui-linux-x86_64.tar.gz - On macOS with Intel CPU →
spotatui-macos-x86_64.tar.gz - On macOS with Apple Silicon (M1/M2/M3) →
spotatui-macos-aarch64.tar.gz
Checksums (.sha256) are optional and only needed if you want to verify the download.
To update use "spotatui update --install" or use your package manager of choice.
Full Changelog: v0.38.5...v0.38.6
v0.38.5
chore: update version to v0.38.5
Downloads
- On Windows 10/11 (64-bit) →
spotatui-windows-x86_64.zip - On Linux (Ubuntu, Arch, Fedora, etc.) →
spotatui-linux-x86_64.tar.gz - On macOS with Intel CPU →
spotatui-macos-x86_64.tar.gz - On macOS with Apple Silicon (M1/M2/M3) →
spotatui-macos-aarch64.tar.gz
Checksums (.sha256) are optional and only needed if you want to verify the download.
To update use "spotatui update --install" or use your package manager of choice.
What's Changed
- Refactor auth token refresh and retry handling by @shilicioo in #276
- Feat/playlist track search by @LargeModGames in #277
- feat: add miniplayer mode by @LargeModGames in #278
- Feat/friends by @LargeModGames in #279
- security: harden token cache permissions and verify self-update checksums by @LargeModGames in #280
Full Changelog: v0.38.4...v0.38.5
v0.38.4
chore: update version to 0.38.4 and finalize changelog for release
Downloads
- On Windows 10/11 (64-bit) →
spotatui-windows-x86_64.zip - On Linux (Ubuntu, Arch, Fedora, etc.) →
spotatui-linux-x86_64.tar.gz - On macOS with Intel CPU →
spotatui-macos-x86_64.tar.gz - On macOS with Apple Silicon (M1/M2/M3) →
spotatui-macos-aarch64.tar.gz
Checksums (.sha256) are optional and only needed if you want to verify the download.
To update use "spotatui update --install" or use your package manager of choice.
What's Changed
- fix #254: keep native recovery from reclaiming transferred playback by @LargeModGames in #269
- chore(deps): bump the rust-minor-updates group with 2 updates by @dependabot[bot] in #271
- docs: add LordMZTE as a contributor for platform by @allcontributors[bot] in #272
- Feat/listening history recap by @LargeModGames in #275
Full Changelog: v0.38.3...v0.38.4
v0.38.3
chore: bump version to 0.38.3 and update changelog
Downloads
- On Windows 10/11 (64-bit) →
spotatui-windows-x86_64.zip - On Linux (Ubuntu, Arch, Fedora, etc.) →
spotatui-linux-x86_64.tar.gz - On macOS with Intel CPU →
spotatui-macos-x86_64.tar.gz - On macOS with Apple Silicon (M1/M2/M3) →
spotatui-macos-aarch64.tar.gz
Checksums (.sha256) are optional and only needed if you want to verify the download.
To update use "spotatui update --install" or use your package manager of choice.
What's Changed
- chore(deps): bump the rust-minor-updates group with 2 updates by @dependabot[bot] in #244
- chore(deps): bump ratatui-image from 10.0.8 to 11.0.1 by @dependabot[bot] in #245
- fix: handle mouse input on content tables fixes #249 by @LargeModGames in #250
- fix: require second clikc for song mouse selection. Closes #258 by @LargeModGames in #261
- chore(deps): bump the rust-minor-updates group with 5 updates by @dependabot[bot] in #259
- chore(deps): bump pipewire from 0.9.2 to 0.10.0 by @dependabot[bot] in #260
- fix: add configurable playbar cover art sizing. Fixes #253 by @LargeModGames in #263
- fix: make continue startup behavious passive. Fixes #254 by @LargeModGames in #264
- fix token refresh handling by @shilicioo in #257
- feat: add continuous playlist and liked songs scrolling by @LargeModGames in #265
- Adaptive tick rate. Fixes #252 by @LargeModGames in #267
- feat: show current track in terminal title (#262) by @LargeModGames in #268
Full Changelog: v0.38.2...v0.38.3
v0.38.2
chore: update version to 0.38.2 and update changelog for new features and fixes
Downloads
- On Windows 10/11 (64-bit) →
spotatui-windows-x86_64.zip - On Linux (Ubuntu, Arch, Fedora, etc.) →
spotatui-linux-x86_64.tar.gz - On macOS with Intel CPU →
spotatui-macos-x86_64.tar.gz - On macOS with Apple Silicon (M1/M2/M3) →
spotatui-macos-aarch64.tar.gz
Checksums (.sha256) are optional and only needed if you want to verify the download.
To update use "spotatui update --install" or use your package manager of choice.
What's Changed
- Fix: Themes preset editing and persistence and display of theme item values by @Moaht in #232
- docs: add Moaht as a contributor for code by @allcontributors[bot] in #235
- fix: make flake build on macOS (aarch64-darwin) by @shimmerjs in #233
- chore(deps): bump mpris-server from 0.9.0 to 0.10.0 by @dependabot[bot] in #227
- chore(deps): bump the rust-minor-updates group with 5 updates by @dependabot[bot] in #226
- chore(deps): bump the rust-minor-updates group with 4 updates by @dependabot[bot] in #236
- refactor: split runtime out of main.rs and fix native playback metadata (#218) by @LargeModGames in #237
- Fix UI freeze by @rlpratyoosh in #239
- docs: add rlpratyoosh as a contributor for code, and bug by @allcontributors[bot] in #240
- Feat: Prevent sleep/hibernate/suspend state during playback by @Moaht in #242
New Contributors
- @Moaht made their first contribution in #232
- @shimmerjs made their first contribution in #233
- @rlpratyoosh made their first contribution in #239
Full Changelog: v0.38.1...v0.38.2