A local-first, customizable terminal music player.
Your music. Your terminal. Your layout.
hum is an open-source music player for people who keep their own local music
libraries. It is a terminal application: a keyboard-driven TUI meant to run in a
real terminal, not a desktop or web application styled to look like one.
You point hum at one or more directories, such as ~/Music, and it builds a
local library from the files it finds. It reads metadata, groups tracks into
albums and artists, and keeps a searchable index and a local listening history.
hum does not take ownership of your files. It does not move, rename, or
reorganize anything on disk. The original files stay exactly where you put them,
and the local database holds only the index and metadata, never copies of the
audio.
There are no accounts, no cloud sync, and no streaming back end. Music files in, music out.
Most music players fall into one of two groups: streaming clients tied to a
commercial service, or graphical library managers that want to manage your files
for you. hum is neither.
It is built around a few priorities:
- Local ownership. Your library is your files and a local index. Nothing leaves your machine.
- Keyboard-first interaction. The interface is designed to be driven from the keyboard, in the terminal you already live in.
- Customization. The layout is meant to be configured and rearranged by the user, not fixed by the application.
- Terminal-native behavior. Dense, predictable, and fast, following the conventions of good Unix tools.
- High-quality local playback. A native audio pipeline rather than a wrapper around an external media player.
hum is not a streaming service, a social network, or a cloud platform. It is
not an account-based or subscription product. It is not an Electron or web
application, and it does not depend on any commercial streaming platform.
The initial project is focused entirely on local music libraries.
None of the following is implemented yet. This section describes the intended product, not its current state.
- A TUI organized around familiar concepts: Now Playing, Library, Albums, Artists, Tracks, Playlists, Queue, Search, and listening history.
- Library scanning of user-configured directories, with metadata parsing and automatic grouping into artists, albums, and tracks.
- A native audio engine for local playback of common formats.
- Album artwork rendering in terminals that support image protocols, with a text-based fallback where they do not.
- A configurable layout system with splits, panes, and widgets.
- User-defined themes and keybindings.
- Configuration hot reload, so saving a config file updates the running interface without a restart.
These are draft defaults for discussion. They are not a stable interface and may change.
j / k navigate
h / l seek
space play / pause
n next
p previous
/ search
6 queue
? help
q quit
Esc back
Customization is a defining goal of the project. The intent is that a user can
open a configuration file and make hum their own, in the spirit of tools like
tmux, Neovim, or a tiling window manager.
Internally, the interface is planned as a tree of layout nodes rather than a hardcoded screen. That tree is what a configuration file describes: how the window is split, which widgets live in which panes, their relative sizes, the active theme, and the keybindings.
The configuration format has not been finalized and is intentionally left
undefined here. See docs/configuration.md and
docs/layout-system.md.
hum is a terminal application, but album artwork still matters. Where the
terminal supports it, hum aims to render real cover images; where it does not,
it falls back to a Unicode-based representation.
Artwork is expected to come from embedded metadata or from files in the album
directory, such as cover.jpg, folder.jpg, or front.jpg.
Support for terminal image protocols (for example the Kitty graphics protocol,
Sixel, and iTerm2-style images) is planned, not implemented. Details are in
docs/artwork.md.
The intended implementation language is Rust. The planned stack:
| Area | Direction |
|---|---|
| TUI | Ratatui |
| Terminal I/O | Crossterm |
| Audio output | CPAL |
| Audio decoding | Symphonia |
| Resampling | Rubato |
| Metadata | Lofty |
| Local index | SQLite (via rusqlite) |
| Artwork | image + ratatui-image |
| File watching | notify |
This is a plan, not a status report. Decisions and rationale live in
docs/architecture.md and
docs/audio-engine.md.
hum is planned as a modular monolith shipped as a single native executable. It
may use a Cargo workspace internally to keep clear boundaries between the core,
audio, library, configuration, UI, and platform layers, but these are internal
modules, not services.
There is no backend, no web server, and no container requirement.
Two rules shape the design:
- The UI does not know how to play music.
- The audio engine does not know that a TUI exists.
Audio decoding and resampling happen away from the real-time audio callback,
which is kept minimal. See docs/architecture.md and
docs/audio-engine.md.
hum is in the planning and specification phase. There is no application code
yet.
The current work is designing and documenting the project before implementation
begins. The files under docs/ are the specification from which
implementation work will later be derived. There are no releases, versions, or
installation instructions at this stage.
Start with docs/README.md. Individual topics:
docs/vision.md— goals and scopedocs/architecture.md— system designdocs/audio-engine.md— playback pipelinedocs/library.md— scanning and indexingdocs/artwork.md— album art and terminal imagesdocs/tui.md— interface conceptsdocs/layout-system.md— the layout treedocs/configuration.md— configuration modeldocs/keybindings.md— key handlingdocs/filesystem.md— paths and file layoutdocs/platform-support.md— target platformsdocs/testing.md— testing approachdocs/distribution.md— packaging and releasesdocs/development.md— working onhumdocs/roadmap.md— planned direction
Platform priority is Linux first, macOS second, Windows later. None of these is
supported yet; see docs/platform-support.md.
The project is still being specified, so the most useful contributions right now
are discussion and review of the documents under docs/. Development
setup and conventions will be described in
docs/development.md.
See LICENSE.