Repository navigation
v0.45.0
Downloads
- Windows 10/11 (64-bit) → Download spotatui-windows-x86_64.zip
- Linux (Ubuntu, Arch, Fedora, etc.) → Download spotatui-linux-x86_64.tar.gz
- Linux ARM64 (Raspberry Pi 4/5, ARM servers) → Download spotatui-linux-aarch64.tar.gz
- Debian/Ubuntu (amd64) → Download .deb
- Debian/Ubuntu (arm64) → Download .deb
- macOS with Intel CPU → Download spotatui-macos-x86_64.tar.gz
- macOS with Apple Silicon (M1/M2/M3) → Download spotatui-macos-aarch64.tar.gz
Or just run the one-line installer: curl -fsSL https://spotatui.com/install.sh | bash (macOS/Linux) or irm https://spotatui.com/install.ps1 | iex (Windows).
Checksums (.sha256) are optional and only needed if you want to verify the download.
The Linux, macOS, and Windows builds include the extra music sources (Local Files, Subsonic, Internet Radio, YouTube, Qobuz). The YouTube source needs yt-dlp installed (ffmpeg recommended).
To update use "spotatui update --install" or use your package manager of choice.
Desktop app (preview, unsigned)
spotatui in its own window, with the same player, login and settings as the terminal app. The preview plays Spotify (Premium) only. Its installers are added to this release a few minutes after it is published. The Windows installer, the macOS app and the AppImage update themselves from then on; a .deb or .rpm install updates with a new download from this page.
- Windows 10/11 (64-bit) →
spotatui-desktop_*_x64-setup.exe. The installer is not signed, so SmartScreen warns: click More info, then Run anyway. - macOS →
spotatui_*_aarch64.dmg(Apple Silicon) orspotatui_*_x64.dmg(Intel). Drag spotatui to Applications and open it. The app is not notarized, so macOS refuses the first launch: close that dialog, open System Settings > Privacy & Security, click Open Anyway next to the spotatui message, and confirm. - Linux (amd64, arm64) →
.deb(Debian/Ubuntu),.rpm(Fedora) or.AppImage. Needs glibc 2.39 and WebKitGTK 4.1: Ubuntu 24.04+, Debian 13, Fedora 40+, Arch.
What's Changed
- fix: out-of-range color in config.yml stops spotatui from starting. by @Hi-1mYara in #569
- fix(streaming): honor HTTP proxy env vars for the librespot session by @mschmicking in #570
- docs: add mschmicking as a contributor for code by @allcontributors[bot] in #572
- feat(native): park librespot under another source by @LargeModGames in #571
- feat(logging): add a debug mode for bug reports by @mschmicking in #574
- fix(spotify): handle removed endpoints for Development Mode apps by @Oud-Idk in #577
- feat(runtime): refuse a second UI instance by @LargeModGames in #578
- refactor(runtime): share the frontend launch and exit by @LargeModGames in #579
- feat(app): per-domain display revisions by @LargeModGames in #580
- refactor(app): make the display state private by @LargeModGames in #581
- feat(gui): serve a browser frontend over loopback by @LargeModGames in #582
- feat(gui): TypeScript bindings and a placeholder page by @LargeModGames in #583
- feat(gui): answer the first-launch questions in the page by @LargeModGames in #584
- fix(tui): stop narrow table panes from underflowing the column width by @2570165831 in #587
- docs: add 2570165831 as a contributor for code by @allcontributors[bot] in #591
- fix(tui): uppercase Shift + any lowercase letter, not only ASCII by @2570165831 in #588
- fix(config): parse ctrl-- and alt-- keybindings by @zaydmulani09 in #592
- fix(tui): preserve Windows console shift casing by @tayfuryldz in #593
- docs: add tayfuryldz as a contributor for code by @allcontributors[bot] in #616
- docs: add AI contribution rules, split AGENTS.md by @LargeModGames in #617
- test(gui): add Playwright screenshot harness by @LargeModGames in #619
- fix(tui): draw an empty titled table while library sections load by @chiliec in #620
- docs: add chiliec as a contributor for code by @allcontributors[bot] in #625
- ci(gates): hold adoption counters as floors by @LargeModGames in #626
- Fix #605: reject invalid --tick-rate values instead of silently ignoring them by @wanjinhao1 in #618
- docs: add wanjinhao1 as a contributor for code by @allcontributors[bot] in #627
- fix(cli): render format strings in a single pass, show publishers in search by @wanjinhao1 in #623
- ci(gates): cancel superseded floor runs by @LargeModGames in #628
- feat(gui): design tokens, top bar and player bar by @LargeModGames in #629
- feat(gui): Library screen with Liked Songs and playlists by @LargeModGames in #630
- Sort playlists case-insensitively by @niukanen1 in #631
- docs: add niukanen1 as a contributor for code by @allcontributors[bot] in #638
- fix(stats): group Last 10 Days by the local date, not UTC by @2570165831 in #632
- fix(cli): return an error instead of panicking on empty play results by @2570165831 in #633
- fix(settings): clamp number settings to their field's range before saving by @2570165831 in #634
- fix(theme): reject unknown colors instead of turning them black by @2570165831 in #635
- fix(help): stop offering Ctrl+p for moving up and scrolling lyrics by @2570165831 in #636
- ci(triage): turn off DeepSeek thinking mode by @LargeModGames in #639
- docs: list every keybindings config name in docs/keybindings.md by @wanjinhao1 in #624
- feat(library): show Spotify-owned playlists hidden by the Web API by @TrevorSatori in #641
- docs: add TrevorSatori as a contributor for code, and bug by @allcontributors[bot] in #647
- fix(cli): accept
--completions powershell, keeppower-shellas an alias by @2570165831 in #642 - fix(tui): honour rebound paging keys in the Help menu and episode list by @2570165831 in #643
- fix(settings): width-check the Playing Icon like the other fixed-cell icons by @2570165831 in #644
- fix(settings): spell every key like config.yml and check conflicts on all of them by @2570165831 in #645
- fix(stats): keep Spotify artist names with "&", "and" or a comma whole by @2570165831 in #646
- fix(tui): show the rebound key in on-screen hints, not the default by @drakeo338 in #648
- fix(artist): request an artist's albums 10 at a time by @TrevorSatori in #649
- docs(themes): add Tokyo Night, document
preset:, point to theme.rs by @2570165831 in #651 - docs(ai-dj): list the copilot and opencode agent presets by @2570165831 in #652
- fix(help): list the Library unfollow and show follow keys by @2570165831 in #653
- feat(tui): H, M and L jump through the Queue and Stats lists by @2570165831 in #654
- feat(settings): add the repeat track and repeat context icon rows by @2570165831 in #655
- docs: add drakeo338 as a contributor for code by @allcontributors[bot] in #658
- fix(cli): read only the playlist total for play --random by @niukanen1 in #656
- docs(config): correct the example config by @wanjinhao1 in #675
- fix(stats): use the local calendar for This Month and This Year by @uznog in #677
- feat(gui): add the page shell, areas and toasts by @LargeModGames in #679
- feat(gui): add the queue drawer by @LargeModGames in #680
- feat(gui): add the Search screen by @LargeModGames in #681
- feat(gui): add the command palette by @LargeModGames in #682
- feat(gui): add the Stats screen by @LargeModGames in #683
- feat(gui): add the listening party screen by @LargeModGames in #684
- feat(gui): add the Listening Room with lyrics by @LargeModGames in #685
- feat(gui): add the Session screen by @LargeModGames in #686
- feat(gui): add Discover as lists by @LargeModGames in #687
- feat(gui): add the Library health page by @LargeModGames in #688
- fix(gui): stale answers, focus and keys on the screens by @LargeModGames in #689
- fix(gui): open a playlist from the sidebar by @LargeModGames in #690
- chore(gui): ignore the vitest cache under gui/src by @LargeModGames in #692
- fix: drop the App lock before the if-let body (clippy 1.99 block_scrutinee) by @2570165831 in #696
- fix(playlist): sort Ctrl+f results ignoring letter case by @uemrey0 in #695
- fix(subsonic): read the track number from the track key by @niukanen1 in #699
- docs(install): document current packages and automatic updates by @WaterWhisperer in #700
- docs: add uemrey0 as a contributor for code by @allcontributors[bot] in #702
- docs: add WaterWhisperer as a contributor for doc by @allcontributors[bot] in #703
- feat(apple-music): Apple Music on macOS as a remote for the Music app by @2570165831 in #678
- fix(audio-viz): report a capture that cannot open, and open it off the tick (#697) by @2570165831 in #701
- fix(history): keep a dash in recap track titles by @niukanen1 in #705
- fix(tui): place the search cursor from the computed input layout by @WaterWhisperer in #706
- fix(playback): treat a pause with no active device as done by @LargeModGames in #707
- chore: point wiki submodule at a commit that exists upstream by @LargeModGames in #710
- chore(deps): bump undici and wrangler in /worker-relay by @dependabot[bot] in #711
- chore(deps): bump sharp and wrangler in /worker-relay by @dependabot[bot] in #712
- chore(deps): bump source-map-js from 1.2.1 to 1.2.2 in /gui by @dependabot[bot] in #713
- fix(tui): restore focus navigation for content screens by @WaterWhisperer in #709
- fix(streaming): keep playback on the device it was handed off to (#693) by @Wassergeist in #694
- docs: add Wassergeist as a contributor for code, and financial by @allcontributors[bot] in #715
- fix(network): move slow Spotify work off the pump by @LargeModGames in #717
- fix(queue): drop the suspended context when a handoff ends the queue (#708) by @2570165831 in #718
- fix(network): release the playback poll when the auth gate drops it (#563) by @2570165831 in #720
- fix(playback): poll another device at the configured interval by @Wassergeist in #721
- feat: cancel superseded native-queue downloads by @RohithPariki in #524
- docs: add RohithPariki as a contributor for code by @allcontributors[bot] in #723
- feat(albums): show the release year on the artist page and sort saved albums by it (#698) by @2570165831 in #719
- fix(queue): keep an off-screen URI when a decoded source starts (#716) by @2570165831 in #722
- fix(playback): keep the track-end poll when a command lands early in the track by @Wassergeist in #725
- fix(cli): reject an unknown --device name by @devtechedge in #728
- fix(lyrics): drop LRC header tags and read short fractions as milliseconds by @devtechedge in #729
- fix(qobuz): retry a stalled segment sooner by @LargeModGames in #730
- fix(settings): name reserved keys the way config.yml spells them by @niukanen1 in #724
- fix(settings): Esc on the unsaved prompt returns to Settings, Controls names the configured back key by @niukanen1 in #731
- fix(tui): route keys to the open sort menu before global bindings by @niukanen1 in #732
- feat(tables): optional release-year column on song tables (#698) by @2570165831 in #733
- fix(cli): fetch Spotify state only where read by @LargeModGames in #735
- docs: list Apple Music on macOS in README by @LargeModGames in #737
- fix: support alternate sidebar navigation by @Muu79 in #739
- docs: add Muu79 as a contributor for code by @allcontributors[bot] in #746
- fix(settings): add the scroll offset when a click selects a settings row by @drakeo338 in #744
- fix(scripting): serialize empty snapshot fields as nil by @jum-apzn in #740
- docs: add jum-apzn as a contributor for code by @allcontributors[bot] in #745
- docs: document Local Files, Subsonic, and YouTube by @TheCodedKid in #741
- docs: add TheCodedKid as a contributor for doc by @allcontributors[bot] in #747
- fix(gui): daily-use fixes for the browser GUI by @LargeModGames in #749
- perf(app): cache playlist tracks in-memory for instant search and sort by @Oud-Idk in #742
- fix(tui): forward left mouse drags so the playbar scrubs by @Wassergeist in #748
- feat(spotify): drop the Web API and client id by @LargeModGames in #752
- chore(release): v0.44.0 by @LargeModGames in #753
- docs: Linux default build needs ALSA, not PipeWire by @TastyHeadphones in #622
- docs: add TastyHeadphones as a contributor for doc by @allcontributors[bot] in #755
- feat(lyrics): use Spotify lyrics for Spotify tracks by @LargeModGames in #757
- feat(spotify): fetch the audio analysis by @LargeModGames in #758
- feat(tui): bring back the pitch visualizer by @LargeModGames in #759
- fix(queue): resolve the real title of an off-screen track (#716) by @2570165831 in #734
- fix(app): search and sort a playlist again after an add or remove by @theluckystrike in #751
- docs: add theluckystrike as a contributor for code by @allcontributors[bot] in #762
- feat(gui): Spotify-style desktop app by @LargeModGames in #763
- chore(release): v0.45.0 by @LargeModGames in #775
New Contributors
- @mschmicking made their first contribution in #570
- @2570165831 made their first contribution in #587
- @zaydmulani09 made their first contribution in #592
- @tayfuryldz made their first contribution in #593
- @chiliec made their first contribution in #620
- @wanjinhao1 made their first contribution in #618
- @niukanen1 made their first contribution in #631
- @TrevorSatori made their first contribution in #641
- @drakeo338 made their first contribution in #648
- @uznog made their first contribution in #677
- @uemrey0 made their first contribution in #695
- @WaterWhisperer made their first contribution in #700
- @Wassergeist made their first contribution in #694
- @RohithPariki made their first contribution in #524
- @devtechedge made their first contribution in #728
- @Muu79 made their first contribution in #739
- @jum-apzn made their first contribution in #740
- @TheCodedKid made their first contribution in #741
- @TastyHeadphones made their first contribution in #622
- @theluckystrike made their first contribution in #751
Full Changelog: v0.43.0...v0.45.0