spotatui

LargeModGames·LargeModGames.spotatui

A Spotify client for the terminal written in Rust, powered by Ratatui

spotatui is a terminal-based Spotify client written in Rust. It provides a keyboard-driven interface for controlling Spotify playback, browsing your library, searching for music, and more, all from your terminal. Features include native streaming support, audio visualization, Discord Rich Presence, and media key integration.

winget install --id LargeModGames.spotatui --exact --source winget

Latest 0.42.0·September 8, 2026

Release Notes

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. What's Changed
  • Tokyo Night color scheme by @istipisti113 in #436
  • fix(streaming): preserve external device handoffs by @shilicioo in #438
  • Adaptive theme from cover art by @LargeModGames in #439
  • refactor(core): split app.rs into a src/core/app/ module folder by @LargeModGames in #446
  • feat(visualizer): add cava visualizer by @LargeModGames in #449
  • test: add gui-substrate ratchet counters by @LargeModGames in #450
  • ci: add tui feature and headless leg by @LargeModGames in #451
  • ci: ratchet gates.count against merge-base by @LargeModGames in #454
  • refactor(core): move domain types out of tui by @LargeModGames in #455
  • fix: five small audit fixes by @LargeModGames in #456
  • refactor: split cover art into store and renderer by @LargeModGames in #457
  • readme redesign by @istipisti113 in #435
  • build: switch to published spotatui-librespot crates by @LargeModGames in #458
  • ci: fix event payload code injection by @LargeModGames in #459
  • refactor(core): move console I/O behind an onboarding trait by @LargeModGames in #460
  • refactor: split the crate into a lib and bin shims by @LargeModGames in #462
  • refactor(core): extract the tick driver from the runner by @LargeModGames in #463
  • fix(cli): retry player commands on the saved device by @LargeModGames in #465
  • fix(core): clear api_error instead of latching it by @LargeModGames in #467
  • feat(tui): fuzzy filter for the settings screen by @LargeModGames in #471
  • fix(streaming): restart the first track on Previous by @LargeModGames in #473
  • fix(streaming): queue slot survives track end by @LargeModGames in #474
  • refactor(app): group presentation state in App.view by @LargeModGames in #475
  • refactor(core): shared action vocabulary by @LargeModGames in #476
  • refactor(tui): route global keys through App::apply by @LargeModGames in #477
  • refactor(tui): route list handlers through App::apply by @LargeModGames in #480
  • ci(cd): auto release notes and direct download links by @LargeModGames in #481
  • ci: add Codecov coverage upload by @LargeModGames in #482
  • fix(dj): scratch dir fallback for unwritable home by @LargeModGames in #483
  • refactor(tui): route handler tail through App::apply by @LargeModGames in #484
  • feat(core): typed bootstrap onboarding requests by @LargeModGames in #485
  • refactor(runtime): extract native-streaming startup by @LargeModGames in #486
  • feat(sources): add Qobuz by @LargeModGames in #489
  • fix(core): run without a Spotify session by @LargeModGames in #495
  • refactor(core): rename AddFriendByUserId to AddFriendById by @LargeModGames in #500
  • fix(local): scan nested folders so a two-level music library is browsable by @alessandro-zanni in #499
  • docs: add alessandro-zanni as a contributor for code by @allcontributors[bot] in #501
  • fix(audio): stop two pump freezes, and enable the alternative sources on macOS by @alessandro-zanni in #498
  • fix(nix): bump nixpkgs past the crates.io 403 on crate downloads by @LargeModGames in #502
  • fix(queue): refuse a plugin's repeat while the queue slot owns playback by @LargeModGames in #503
  • feat(tui): offer what the source and session can do by @LargeModGames in #505
  • fix(auth): survive a startup 429 on /me and bind the OAuth listener before the browser opens by @LargeModGames in #506
  • refactor(tui): map every Action to its key surface by @LargeModGames in #508
  • refactor(app): privatize App fields and cursors by @LargeModGames in #509
  • fix(network): keep a 429 backoff off the serial pump by @LargeModGames in #510
  • fix(app): resolve the playing item through the owner by @LargeModGames in #511
  • fix(config): keep a symlinked config.yml, survive read-only by @LargeModGames in #514
  • fix(auth): put your own Spotify app first by @LargeModGames in #516
  • fix(network): gate Spotify transport on the owner by @LargeModGames in #515
  • fix(network): use the Development Mode endpoints by @LargeModGames in #518
  • chore(release): v0.42.0 by @LargeModGames in #520
  • fix(cd): list the .deb assets explicitly so the gui shim is not packaged by @LargeModGames in #521 New Contributors
  • @alessandro-zanni made their first contribution in #499 Full Changelog: v0.41.0...v0.42.0

Installer type: zip

x64—E4546BC577007CD7DD44F19D75274179DD59E11898168D072C55ED46CB302835

Details

Homepage
https://github.com/LargeModGames/spotatui
License
MIT
Publisher
LargeModGames
Support
https://github.com/LargeModGames/spotatui/issues

Tags

climusicratatuirustspotifyterminaltui

Older versions (19)

0.41.0
x64—6A901F4A49EA7B4EAD557E84E208F1442CB9CEFF2BF00B59F54791BD0B4894D3
0.40.3
x64—48F798EEFBB580D501332DD7E52E850E5927F454A22A7FF9599538AA8836DD00
0.40.2
x64—D757D933812E7CD46FAB54F11CA687133D496CAC2DEF078F35387C0B0221C986
0.40.1
x64—3E2BB52A1F03311AC2B471B2562090A453AED2B67A58B7FC8C62F6ED52743C9C
0.40.0
x64—F89A896773E10163ABB119DEEBC0FB6FE3D400BA9706B8370094BD0F51848F82
0.39.1
x64—D2062CA08B69421960267A48E54DA82E82330D76829414C593BF83F94A000492
0.39.0
x64—00466F1350BAFDE859DD4D8A8A41D2FC14A49C67D76B450AA05A130A1F048086
0.38.6
x64—65F76CF17AEB6CD81E887D80B48671EC4C8BFAF32FD252C11F4FB59E059DE8ED
0.38.0
x64—98D3A947C276DD2D89235358AFC368B7503033C8533A4E23AFF44C9397855D92
0.37.3
x64—1F6D3595E7D9B606F0841F136F7618E095D54C1C5FA4B24A72B0D27AC159A244
0.37.2
x64—A4C400E91C3FF622F924FD82F2D550E1B6642E2C0C92A72E0618E3B6B4D764CD
0.37.1
x64—29D45DF633BB252892BC9B95C3B8A40900749286C601A4F852AF8FF3A5F2306C
0.37.0
x64—09E6D862224FD1A577EFE40FF5C16D4AE7852799334F76D634A6B950CCC27DAF
0.36.2
x64—7956D9FFF45491DF9466351F44C9013B98CE412454999E7FA510B381FD8E2782
0.36.1
x64—6E08EDBF79781E3F15263420F44ACCFAD7D4C114E1992066FAE53B317191B63D
0.36.0
x64—93993C7EB19960429BE28FACA697D45957462A7C5B6E0C057A4F4B4D23F58514
0.35.7
x64—E439EEA4EBCCBBD430B4B17903909B486AEA11AD4F682A3A0B020645C422A626
0.35.6
x64—915A4074132E222D5D3B2D44B69062C26C47946FA9845549CCA6A2A066DB76B1
0.35.5
x64—B19FF1C070AFB9805CAAC91A11A5D46C3167B1390A3D1DB7EE6F7F615A212218