A terminal UI music player built on tornade-core. Full feature parity with the macOS GUI: navigate your library, control playback, manage playlists and queue, all from the terminal.
- Albums grid with inline artwork (Kitty, Sixel, iTerm2; halfblocks fallback - see Image Rendering)
- Library views: Tracks, Albums, Artists, Genres, Playlists, Queue, Search
- Detail views: album tracklist, artist albums, genre tracks, playlist editor
- Player bar: artwork, transport controls, progress bar, volume, shuffle and repeat indicators
- Queue management: add, remove, reorder, clear, play from position
- Playlist management: create, rename, delete, add/remove tracks, reorder, import M3U
- Global search across tracks, albums, and artists
- Per-view filter: press
/in any list to narrow results in real time - Command mode: press
:to run commands with autocompletion - Track ratings: press
0-5to set star rating; displayed in all track lists - Tag editing: press
eto edit title, artist, album, album artist, year, genre and track number for one track, or album-level fields across a multi-track selection; written to the file and database - Online metadata & artwork: fetch MusicBrainz suggestions (
Ctrl+F) and manage cover art (Ctrl+I: set from file, fetch online, remove) - Multi-select: press
vto select multiple tracks and add/remove them to/from playlists in bulk (duplicate-safe) - Hardware media keys: play/pause, next, previous on macOS, Windows, and Linux, with now-playing info published to the OS
- Library scanning with progress view
- Mouse support: sidebar, track list, queue, and player controls
- Built with ratatui
- Rust 1.85+ (edition 2024)
- Terminal: any modern terminal; inline artwork requires Kitty, Ghostty, iTerm2, or WezTerm
- Minimum terminal size: 80x24
git clone https://github.com/tornade-player/tornade-tui.git
cd tornade-tui
cargo build --release
./target/release/tornade-tui| Key | Action |
|---|---|
1 |
Tracks view |
2 |
Albums view |
3 |
Artists view |
4 |
Genres view |
5 |
Search view |
Tab |
Switch panel focus (cycles search sections in Search view) |
j / ↓ |
Move down |
k / ↑ |
Move up |
Enter |
Open detail / play |
q / Esc |
Back / quit |
? |
Help overlay |
| Key | Action |
|---|---|
Space |
Play / Pause |
n |
Next track |
N |
Previous track |
] |
Seek +10s |
[ |
Seek -10s |
+ |
Volume up |
- |
Volume down |
S |
Toggle shuffle |
R |
Cycle repeat (Off / All / One) |
| Key | Action |
|---|---|
s |
Scan folder (opens path prompt) |
0-5 |
Rate selected track |
/ |
Toggle inline filter |
a |
Add selected track to queue |
A |
Add selected track to a playlist |
| Key | Action |
|---|---|
J |
Move track down |
K |
Move track up |
x |
Remove track (with confirmation) |
X |
Clear queue (with confirmation) |
| Key | Action |
|---|---|
c |
Create playlist |
r |
Rename playlist |
d |
Delete playlist (with confirmation) |
i |
Import M3U file |
Press : to open the command bar. Press Tab to autocomplete, Esc to cancel.
| Command | Description |
|---|---|
:scan <path> |
Scan a folder and add it to the library |
:cleanup |
Check for inaccessible sources |
:rate <0-5> |
Rate the selected track |
:queue add |
Add selected track to queue |
:queue clear |
Clear the queue |
:playlist create <name> |
Create a new playlist |
:playlist delete <name> |
Delete a playlist |
:playlist add <name> |
Add selected track to a playlist |
:seek <mm:ss> |
Seek to position |
:help |
Show help overlay |
Album and artist artwork is displayed inline using ratatui-image.
TUI thumbnails: at startup and after each scan, a background thread generates 128x128 JPEG (quality 45) thumbnails in ~/.config/tornade/assets/tui/{albums,artists}/. This reduces memory and CPU usage vs loading full-size artwork (~13x smaller files).
Protocol detection: ratatui-image auto-detects the best image protocol for your terminal (Kitty, Sixel, iTerm2, or halfblocks fallback).
ratatui-image v10 detects Sixel on Ghostty, but Sixel rendering fails. Kitty protocol also fails because v10 uses Unicode placeholders (U=1), which Ghostty does not support.
Current workaround: tornade-tui forces halfblocks on Ghostty (lower resolution, but functional). This is detected via TERM_PROGRAM=ghostty.
Upstream tracking:
- ratatui-image: needs direct Kitty placement mode (without
U=1) as alternative - Ghostty: needs Unicode placeholder support for Kitty graphics protocol
If a future version of ratatui-image or Ghostty resolves this, remove the Ghostty override in src/main.rs.
- tornade-core - Rust audio core library (MIT)
- tornade-gui - Native GUI apps for macOS, Windows, Linux (proprietary)
Contributions are welcome! See CONTRIBUTING.md for guidelines.
MIT - see LICENSE for details.