Repository navigation
Install: curl -fsSL https://spotatui.com/install.sh | bash on macOS and Linux, or irm https://spotatui.com/install.ps1 | iex on Windows. Already installed? Run spotatui update --install, or update with your package manager.
Terminal app
| Download | |
|---|---|
| Windows 10/11 | 64-bit .zip |
| macOS | Apple Silicon · Intel |
| Linux | x86_64 · ARM64 (Raspberry Pi 4/5) |
| Debian, Ubuntu | .deb amd64 · .deb arm64 |
Desktop app (preview)
| Download | |
|---|---|
| Windows 10/11 | Installer .exe |
| macOS | Apple Silicon .dmg · Intel .dmg |
| Linux x86_64 | AppImage · .deb · .rpm |
| Linux ARM64 | AppImage · .deb · .rpm |
The Windows installer, the macOS app and the AppImage update themselves. A .deb or .rpm install updates with a new download from this page. Linux needs glibc 2.39 and WebKitGTK 4.1 (Ubuntu 24.04+, Debian 13, Fedora 40+, Arch).
First launch on Windows and macOS
- Windows: the installer is not signed yet, so SmartScreen warns. Click More info, then Run anyway.
- macOS: the app is not notarized, so macOS blocks the first launch. Close the dialog, open System Settings > Privacy & Security, click Open Anyway next to the spotatui message, and confirm.
Both apps play Spotify (Premium), Local Files, Subsonic, Internet Radio, YouTube and Qobuz, plus Apple Music on macOS. YouTube needs yt-dlp (ffmpeg recommended).
Verify a download: checksums.txt has the SHA-256 of every file: sha256sum -c --ignore-missing checksums.txt.
Full changelog · Code signing policy
What's Changed
- feat(gui): click a synced lyric line to seek there by @niukanen1 in #853
- fix(subsonic): percent-encode the username in request URLs by @jadhavgaurav in #855
- feat(playlists): sort playlist tracks by release date (#854) by @2570165831 in #856
- fix(library): refetching the first saved page drops stale later pages by @chiliec in #800
- feat(gui): show an E badge on explicit songs in the track lists by @niukanen1 in #858
- docs(installation): explain cargo features and yt-dlp by @kukirin-ui in #860
- fix(ui): persist list states across renders to retain scroll viewport offset by @Oud-Idk in #859
- fix(streaming): explain a missing ALSA default device by @kukirin-ui in #861
- feat(gui): play the shown songs in a random order from the Shuffle button by @niukanen1 in #864
- ci(triage): triage issues with Claude and repository tools by @LargeModGames in #867
- feat(mobile): add the Android app by @LargeModGames in #866
- feat(gui): search the settings by section, name or description by @niukanen1 in #868
- fix(handler): close audio analysis with
Escby @Oud-Idk in #869 - docs(contributing): link the contributor-list issue by @LargeModGames in #873
- feat(tui): add a dev inspector for frames and keys by @LargeModGames in #870
- feat(i18n): share typed English strings across terminal and GUI by @2570165831 in #865
- fix(playback): stop the playbar jumping back by @LargeModGames in #876
- feat(gui): visualizer behind the player bar by @LargeModGames in #879
- fix(gui): drag the seek and volume bars by @LargeModGames in #880
- feat(i18n): translate sidebar and help into Chinese by @2570165831 in #877
- feat(gui): Welcome page and announcement dialog by @LargeModGames in #881
- fix(tui): Esc dismisses the announcement popup like Enter by @niukanen1 in #883
- feat(i18n): translate behavior settings and shared controls by @2570165831 in #885
- fix(gui): anchor sr-only text so the page cannot scroll past the player bar by @niukanen1 in #886
- fix(tui): clear track-table filter on
Escin addition toqby @Oud-Idk in #875 - feat(i18n): translate keybinding and theme settings by @2570165831 in #887
- feat(gui): color the player-bar visualizer from the cover by @LargeModGames in #888
- feat(gui): follow the OS reduce-motion setting by @niukanen1 in #889
- chore(nix): use hostPlatform predicates and drop unused rec by @arnarg in #897
- chore(ci): bump the actions group with 2 updates by @dependabot[bot] in #894
- chore(deps): bump the rust-minor-updates group with 6 updates by @dependabot[bot] in #895
- chore(deps): bump the desktop group in /desktop with 5 updates by @dependabot[bot] in #896
- feat(i18n): translate dialogs and first-run onboarding by @2570165831 in #898
- feat(tui): use theme-aware glyph for sidebar folder icons (#882) by @montionugera in #893
- test(tui): exercise Escape through the global handler by @WaterWhisperer in #903
- docs(config): document missing behavior settings by @dailyun in #904
- fix(radio): fall back when ICY titles are blank by @WaterWhisperer in #909
- feat(i18n): translate library and playback screens by @2570165831 in #911
- Sort Local Files folder and track names case-insensitively by @niukanen1 in #906
- fix(apple-music): show each playlist's real track count by @2570165831 in #910
- feat: add retro visualizer styles and Gruvbox Cove theme by @OpenR00t in #905
- fix(ui): preserve plugin playbar text for non-Spotify playback by @mvanhorn in #857
- feat(gui): filter playlists in Your Library by @vnic03 in #907
- feat(i18n): translate discovery, social and DJ screens by @2570165831 in #912
- fix(tui): close sort menu and plugin popup on back key (#831) by @RohithPariki in #915
- fix(cli): cycle repeat modes for playback flag by @WaterWhisperer in #916
- docs: add six contributors to the list by @LargeModGames in #920
- fix(library): restore the library order when Saved Albums sorts by Default by @jadhavgaurav in #917
- fix(cli): print the track playback --next/--previous actually jumped to (#884) by @Oud-Idk in #913
- feat(i18n): translate app and startup status messages by @2570165831 in #923
- fix(cli): refuse play --uri with a --queue or --random its URI cannot honor by @jadhavgaurav in #922
- fix(dj): return DJ vibe and now playing when listening history is sparse by @mvanhorn in #926
- fix(settings): add missing keybinding rows by @WaterWhisperer in #927
- feat(i18n): translate source and speaker playback status by @2570165831 in #929
- fix(audio): read the device id instead of its description on macOS by @niukanen1 in #931
- feat(i18n): translate network, history and DJ feedback by @2570165831 in #933
- feat(soloist): play through Spotify Soloist by @LargeModGames in #935
- docs(soloist): add a setup guide by @LargeModGames in #936
- chore(release): v0.47.0 by @LargeModGames in #937
New Contributors
- @kukirin-ui made their first contribution in #860
- @arnarg made their first contribution in #897
- @montionugera made their first contribution in #893
- @OpenR00t made their first contribution in #905
- @mvanhorn made their first contribution in #857
- @vnic03 made their first contribution in #907
Full Changelog: v0.46.0...v0.47.0