Skip to content

Benehiko/tidalt

Repository files navigation

tidalt TUI

tidalt is a Tidal music player for Linux that delivers bit-perfect, lossless audio directly to your DAC — no PipeWire, no PulseAudio, no resampling.

It is built on top of the Tidal API and can run in three ways:

  • Interactive TUI — browse, search, and control playback from the terminal
  • Daemon — headless background process, controlled via the TUI or any MPRIS2 client
  • Client — lightweight TUI that forwards commands to a running daemon over D-Bus

All three modes share the same playback engine. The daemon holds exclusive access to the audio device only while a track is actually playing — releasing it on pause so other applications can use it freely.

100% vibe coded with Claude and Gemini.

Linux only. Requires a Tidal HiFi or HiFi Plus subscription.


Install

Pre-built packages are available on the releases page. The official Docker image is available at benehiko/tidalt — see docs/docker.md for usage.

Arch Linux

sudo pacman -U tidalt-*.pkg.tar.zst

Debian / Ubuntu

sudo dpkg -i tidalt_*.deb
sudo apt-get install -f

Fedora

sudo dnf install tidalt-*.rpm

Build packages locally with Docker

All packages (Arch, Debian, Fedora — amd64 and arm64) can be built locally with a single command using Docker Buildx bake:

# One-time: create a multi-platform builder
docker buildx create --use

# Build all packages (replace VERSION as needed)
docker buildx bake \
  --file docker-bake.hcl \
  --set "*.args.VERSION=3.0.0" \
  --set "*.output=type=local,dest=dist"

Artifacts land in dist/:

dist/
  tidalt-3.0.0-1-x86_64.pkg.tar.zst   # Arch
  tidalt_3.0.0-1_amd64.deb            # Debian / Ubuntu (amd64)
  tidalt_3.0.0-1_arm64.deb            # Debian / Ubuntu (arm64)
  tidalt-3.0.0-1.fc43.x86_64.rpm      # Fedora (amd64)
  tidalt-3.0.0-1.fc43.aarch64.rpm     # Fedora (arm64)

To build a single target: append debian, arch, or fedora to the command.

See docs/installation.md for building packages locally without Docker or installing from source.

Post-install

Register the tidal:// URL handler so clicking "Open in desktop app" on tidal.com opens the track directly in tidalt:

tidalt setup

Optionally install tidalt as a systemd user service (starts at login, no terminal window):

tidalt setup --daemon

On first launch you will be prompted to log in via the Tidal OAuth2 device flow. Your session is saved to the system keychain (or an age-encrypted file at ~/.config/tidalt/secrets) and reused on subsequent runs.


Features

  • Sidebar navigation — a persistent left nav groups every section: Queue (with the hovered track's cover art), Playlists, Favorite Songs / Artists / Albums, Recently Played, Daily Mixes, Search, and Themes
  • Contextual action sheet (o) — from any track, open a popup of actions: play now, play next, add to queue, add to playlist, start radio, go to artist/album, favorite, copy link
  • Command palette (: or Ctrl+P) — fuzzy-run any action or jump to any section
  • Hybrid queue / playlist model — the queue is your live workspace; opening a saved playlist loads it and tracks its origin. The header shows synced, edited — S save, or radio · unsaved — S save, and S saves the queue as a new playlist. Edits never silently change a saved playlist
  • First-class favorites — browse favorite songs, artists, and albums as their own sections
  • Grouped search — results are split into Songs / Artists / Albums; drill into an artist or album from any hit
  • In-app theme picker — eight built-in color schemes (TIDALT, Catppuccin, Tokyo Night, Gruvbox, Nord, Rosé Pine, Dracula, Amber CRT) plus an "Auto — match terminal" option, with live preview as you move the cursor; the choice is persisted
  • Artist view — browse an artist's full discography and play everything, their top tracks, or a single album
  • Song radio — build a queue of similar tracks for any song
  • Shuffle (Fisher-Yates pre-shuffle or random pick)
  • Bit-perfect FLAC playback via direct ALSA hw: — bypasses PipeWire/PulseAudio entirely
  • Auto-negotiates the best PCM format your DAC supports
  • Auto-advances through the queue; respects shuffle mode
  • Volume control and output device selection, both persisted between sessions
  • Session and playback position restored on next launch
  • MPRIS2 registration — media keys and playerctl work without TUI focus
  • Daemon mode — run headless in the background, control via TUI client or playerctl

See docs/ui.md for a full tour of the interface.


Keybindings

In-TUI

The interface has two focus zones: the sidebar (section navigation) and the main pane (the selected section's content). h / l move focus between them.

Key Action
j / k (/) Move the cursor
h / l Move focus between the sidebar and the main pane
Enter Open the section / play the selected track / confirm
o Open the contextual action sheet for the selected track
: / Ctrl+P Open the command palette
/ Jump to Search
Space Pause / resume
/ Seek back / forward 10 seconds
> / < Next / previous track
s Cycle shuffle mode (Off → Shuffle → Random)
r Start a radio queue from the selected track
a Open the artist view for the selected track
f Toggle favorite on the selected track
S Save the current queue as a new playlist
x Remove the selected track from the queue
C Clear the queue
t Cycle the color theme
9 / 0 Volume down / up 5%
c Copy the current track link to the clipboard
d Open the output device selector
Esc Close an overlay / back out of the artist view / refocus the sidebar
q / Ctrl+C Quit

Global shortcuts (MPRIS2)

Daemon mode required. These shortcuts only work when tidalt is running as a background daemon (via tidalt setup --daemon / systemd). A plain tidalt TUI session does not register a persistent MPRIS2 service, so media keys and playerctl will have no effect when the TUI is closed.

When the daemon is running, tidalt registers as an MPRIS2 media player so playback can be controlled from any MPRIS2 client — playerctl, KDE Connect, your desktop environment's media key handler — without a TUI open.

Standard media keys

Many keyboards and desktop environments map dedicated media keys directly to MPRIS2:

Key Action
fn + . Play / pause
fn + , Previous track
fn + / Next track

These are handled by your desktop environment via MPRIS2 — tidalt does not implement any special key capture itself.

Custom bindings (65% keyboards)

On keyboards without dedicated media keys, bind playerctl to custom shortcuts via your desktop environment:

Shortcut Action
Alt+0 Previous track
Alt+- Play / pause
Alt+= Next track

See docs/media-keys.md for full setup instructions.


Supported DACs

Auto-detection scans /proc/asound/cards. Any ALSA-visible device can be selected manually with the d key.

DAC Auto-detected
Hidizs S9 Pro Yes
Hidizs S9 Pro Plus ("Martha") Yes
Focusrite Scarlett Solo Yes
Any ALSA-visible device Manual (d key)

Data & Storage

What Where
OAuth2 session System keychain or ~/.config/tidalt/secrets (age-encrypted)
Volume & device preference ~/.local/share/tidalt/tidal-cache.db
Track metadata cache Same database

Further reading

About

Lossless bit-perfect Linux tidal player

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors