Minimalist music player with minimal dependencies, focusing on speed and a keyboard-centric TUI.
- π΅ Folder-based browsing - No library management, just browse your music folders
- β¨οΈ Vim-inspired keybindings - Efficient keyboard-centric interface
- π Fuzzy search - Quickly find tracks with fuzzy matching
- π Queue management - Build and manage your playback queue
- πΎ Playlist support - Create and manage M3U playlists
- π Load from text files - Import playlists from "artist - song" format files
- π¨ Minimal TUI - Clean interface with multiple tabs (Browser, Now Playing, Playlists)
- βοΈ Configuration file - Customize settings via TOML config
- π Minimal dependencies - Fast and lightweight
- πΆ Multiple format support - MP3, FLAC, OGG Vorbis, Opus, WAV, M4A, AAC, ALAC
- π§ Last.fm scrobbling - Optional support for scrobbling to Last.fm
- πΌοΈ Album art display - Shows embedded and external cover art in the player tab
cargo build --releaseThe binary will be available at target/release/impulse.
For Nix users, you can build and run directly:
# Run directly
nix run github:dbeley/impulse
# Build and install
nix build github:dbeley/impulse
./result/bin/impulse
# Enter development shell
nix developAdd to your NixOS configuration:
{
inputs.impulse.url = "github:dbeley/impulse";
# In your configuration.nix or home.nix:
programs.impulse.enable = true;
# Or in your home-manager configuration
home.packages = [ inputs.impulse.packages.${pkgs.system}.default ];
}impulse
# Load playlist from text file
impulse --load-playlist songs.txtOn first run, a default configuration file will be created at ~/.config/impulse/impulse.conf.
Playlists (including saved queues) default to ~/.local/share/impulse/playlists.
Load songs from a text file with "artist - song" format (one per line):
impulse --load-playlist <file.txt>Example file format:
Swans - Blind
Willie ColΓ³n - Oh, que sera?
Aphex Twin - #19
Songs are matched against your music library and added to the queue. See LOAD_PLAYLIST.md for details.
Tab/Shift+Tab- Switch between tabsq- Quit application?- Show help messageSpace- Play/Pause current trackn- Next trackP- Previous track>/<- Next/previous track (alternative ton/P)r- Toggle random mode (plays queue in random order)s- Stop playback/- Start search mode:- Command mode
j/β- Move downk/β- Move upg- Go to first itemG- Go to last iteml/β/Enter- Enter directory or add file to queueh/β- Go to parent directorya- Add current file to queueA- Add all files in current directory to queue
j/β- Move downk/β- Move upg- Go to first trackG- Go to last trackEnter- Jump to selected trackd/Backspace/Delete- Remove selected trackK- Move selected track upJ- Move selected track downS- Save queue as a playlist in the default folderc- Clear queue
/- Enter search mode, type a query, and press Enter to show an overlay of matching audio files (each entry shows the file name and its folder).j/β/k/β- Navigate search results in the overlay.Enter- Browse to the highlighted fileβs folder and select it in the browser.Esc- Close the search overlay without changing folders.
+/=- Increase volume-- Decrease volume- Displays current track metadata, progress, and album artwork
j/β- Move downk/β- Move upl/Enter- Add playlist to queuer- Reload playlists
Edit ~/.config/impulse/impulse.conf:
music_dir = "/home/user/Music"
playlist_dir = "/home/user/.local/share/impulse/playlists"
volume = 0.5See impulse.conf.example for a complete example configuration.
Impulse supports scrobbling your listening history to Last.fm. To enable this feature:
-
Obtain Last.fm API credentials:
- Create an API account at https://www.last.fm/api/account/create
- You'll receive an API key and API secret
-
Configure Impulse: Add the following to your
~/.config/impulse/impulse.conf:[lastfm] enabled = true api_key = "your_lastfm_api_key" api_secret = "your_lastfm_api_secret" session_key = "" # keep it empty, it will be populated on first start
Type : to enter command mode. Available commands:
:quitor:q- Quit the application:save- Save current configuration:save-queue <name>- Save the current queue as a playlist (stored in the default playlist folder):vol <0-100>or:volume <0-100>- Set volume (e.g.,:vol 75)
Impulse supports all major audio formats through the Symphonia audio decoding library:
- MP3 - MPEG-1/2 Layer 3
- FLAC - Free Lossless Audio Codec
- OGG Vorbis - Ogg container with Vorbis codec
- Opus - Opus codec (via symphonia-adapter-libopus)
- WAV - Waveform Audio File Format (PCM, ADPCM)
- M4A - MPEG-4 Audio (AAC in MP4 container)
- AAC - Advanced Audio Coding
- ALAC - Apple Lossless Audio Codec
Note: Opus support requires cmake and libopus system libraries. When using the Nix development environment, these dependencies are automatically provided. For non-Nix installations, you'll need to install cmake and libopus-dev on your system.
Impulse displays album artwork in the Now Playing tab. It supports:
- Embedded cover art: Extracted from audio file metadata (ID3v2, Vorbis comments, etc.)
- External cover art: Automatically finds cover images in the same directory as the audio file
- Common filenames:
cover.jpg,folder.jpg,album.jpg,front.jpg,albumart.jpg(and.pngvariants) - Also searches for any
.jpg,.jpeg,.png,.gif, or.webpfiles in the directory
- Common filenames:
- Supports various image formats through the terminal's image protocol (iTerm2, Kitty, etc.)
- Rust 1.85 or later (or Nix with flakes enabled)
- ALSA development libraries (Linux)
- Ubuntu/Debian:
sudo apt-get install libasound2-dev - Fedora:
sudo dnf install alsa-lib-devel - Arch:
sudo pacman -S alsa-lib - NixOS: Automatically provided in the dev shell
- Ubuntu/Debian:
Note: This project uses Rust Edition 2024, which requires Rust 1.85+. If you're using an older version, you can temporarily change edition = "2024" to edition = "2021" in Cargo.toml.
# Enter the development shell
nix develop
# All dependencies and tools are automatically available
cargo build
cargo test
cargo clippyInstall Rust and the required system dependencies, then:
cargo build