Music player for Omarchy & Linux, with GUI & TUI
- π§ Supported services: Apple Music by @chriopter, Tidal by @keylimesoda, Spotify by @sean-imus. Details
- β GUI and TUI: press g to switch while music keeps playing
- π΅ Library, playlists, favorites and search as you type
- π§ Home and Explore: recommendations, charts, artists and radio
- π¬ Music video previews in the GUI
- π Coverwall, Waves and thirteen audio visualizers
- β¨οΈ Keyboard and mouse controls
- π§ Desktop theme, media keys and bar widget
curl -fsSL https://github.com/chriopter/brumm/releases/latest/download/install.sh | bashMusic-video previews need Qt 6 Multimedia. The installer adds
qt6-multimedia on Omarchy and Arch Linux; install your distribution's
Qt 6 Multimedia QML package on other Linux systems.
| TUI | GUI |
|---|---|
![]() |
![]() |
| Explore | Visualizer |
![]() |
![]() |
Press ? in brumm for the full shortcut list.
| Action | Shortcut |
|---|---|
| Play or open the selection | Enter |
| Pause or resume | Space |
| Switch between GUI and TUI | g |
| Filter or search | / |
| Connect or switch music services | Ctrl + O |
| Switch player view and large visualizer (GUI) | f |
| Cycle cover, embedded visualizer and large view (TUI) | f |
| Close the interface, keep music playing | Shift + Q |
| Quit brumm and stop the music | q |
While filtering, press Tab to search the entire service.
More player shortcuts
| Action | Shortcut |
|---|---|
| Switch section | 1β9 |
| Show Now Playing and the queue | c |
| Open options | o |
| Next track | n |
| Previous track | p |
| Preview the selection | Hold Space |
| Like the selection | * |
| Dislike the selection | d |
| Add to the library | i |
| Add to a playlist | Shift + P |
| Start radio from the song or artist | Shift + R |
Available actions depend on the music service.
Visualizer shortcuts
| Action | GUI | TUI |
|---|---|---|
| Choose a style | v | v |
| Next style | Tab | Tab |
| Previous style | Shift + Tab | Shift + Tab |
| Toggle automatic style changes | a | a |
| Toggle auto-hide controls | x | x |
| Change frame rate | Ctrl + F | Shift + F |
| Toggle fullscreen | Shift + F | Uses the terminal window |
| Leave the visualizer | Esc | Esc |
In the TUI, choose a style with v, the footerβs Visualizers button, or Options β Visualizer. Click a style or press Enter to keep it. The first entry, Cover, returns to the album artwork. Visualizer selection, large view and shared settings stay in sync between the GUI and TUI.
The GUI starts with Coverwall over Waves. The style picker also offers Waves on its own and Coverflow. Each style can fill the player area, the window or the screen. In the player view, each scene fills the window. Its main subject stays in the free area beside the list and above the controls.
Now Playing opens at the current song. Scroll up for listening history, which loads older songs as needed; scroll down for the queue. History is kept per service account from the time this version starts recording it.
Desktop shortcut
Enable Super + Shift + M to open brumm:
brumm keys onRun brumm keys off to restore the previous music-key behavior.
Choose your services on first start. Open Music Services in the menu under Options, or press Ctrl + O, to add or switch a connection later.
π§ Apple Music by @chriopter
Requires an Apple Music subscription. Connect through Music Services (Ctrl+o).
Includes radio, Replay and playlist folders. Playlist deletion and renaming, lyrics and lossless playback are not available in brumm.
π§ Tidal by @keylimesoda
Requires a Tidal subscription. Connect through Music Services (Ctrl+o) and complete the device sign-in.
Includes library, search, favorites and playlist creation. Advanced playlist edits, Replay, folders, radio, autoplay and video previews are not available.
π§ Spotify by @sean-imus
Requires Spotify Premium and your own
developer app with
Web API and Web Playback SDK enabled. Register
http://127.0.0.1:7777/spotify/callback as the redirect URI, then connect
through Music Services (Ctrl+o) using the Client ID.
No client secret is needed.
Radio, Explore, Replay, folders, autoplay and previews are not available. The visualizer has no access to Spotify's audio spectrum. If another account signs in, add it under User Management in your app's dashboard. Development-mode access follows Spotify's quota rules.
Home shows recent music and top tracks/artists. Followed playlists can play as a whole; only owned or collaborative playlists expose individual tracks. Search returns up to ten results per kind.
Connect services and switch interfaces
One service is active at a time. Switching services stops its playback, keeps its sign-in and saves its queue. Returning to a service restores its queue paused. Accounts and libraries stay separate.
Press g to switch between GUI and TUI without interrupting playback.
The visualizer keeps its selected style. Run brumm, use the launcher or click
the bar widget to reopen the last interface.
Browse, search and inspect music
Navigation and available actions follow the selected service. Now Playing shows the queue; / filters the current view and Tab switches to searching the service.
Apple Music includes Favorites, Replay and playlist folders on Home, plus charts, genres, countries and music videos in Explore. Search also supports stations, curators, activities and record labels. Artist pages include top songs, videos and releases.
Press Ctrl + i for item details, or use the GUI context menu.
Where the service supplies them, details include composers, classical metadata,
ISRC/UPC identifiers and editorial notes. Apple lookup accepts ISRC, UPC and
typed IDs such as songs:123; albums:456.
Apple Music video previews play in the GUI with Qt Multimedia. Full videos open in Apple Music; the TUI opens the video link. Audio-format metadata describes the catalog entry and does not enable lossless or Atmos playback.
Updates and verified installation
Press U when an update is offered, or run brumm update.
The installer and updater use the latest stable release. Development builds
do not update themselves from GitHub.
Releases are signed with Ed25519 and builds have GitHub attestations. To verify the installer before running it:
curl -fsSLO https://github.com/chriopter/brumm/releases/latest/download/install.sh
gh attestation verify install.sh -R chriopter/brumm && bash install.sh+--------------------------------------------------------+
| brumm daemon - Rust / Tokio |
| systemd background service |
| |
| Providers: Apple Music / Tidal / Spotify |
| Library / queue / sign-in / options |
+--+-----------------------------------------------------+
|
+-- playback --> Engine: Chrome / Widevine
| MusicKit JS / Tidal SDK / Spotify SDK
|
+-- socket ----> TUI: Rust / Ratatui
|
+-- socket ----> GUI: Qt Quick / QML
|
+-- MPRIS -----> Omarchy widget
Build and run
The daemon and TUI use Rust; the GUI uses Qt Quick/QML and C++. Building needs Rust 1.89+, Qt 6 and a C++ compiler. Demo data needs Go; rebuilding the Tidal adapter needs Node.js/npm. The GUI uses Qt Declarative, Shader Tools and Multimedia.
dev/ contains development commands and their helper programs:
dev/setup # build and install this checkout
dev/run # foreground daemon; add ui or gui to open a player
dev/build-gui # build the Qt frontend
dev/build-tidal # rebuild after changes to the Tidal web adapterdev/setup installs the program, launcher, user service and widget.
dev/run stops an installed brumm user service while developing.
Local builds can reuse the Apple Music developer token from the installed
release. Set BRUMM_TOKEN_FROM=/path/to/brumm to use another binary.
To sign a new token, provide APPLE_KEY_ID, APPLE_TEAM_ID and
APPLE_PRIVATE_KEY to dev/setup; dev/devtoken handles signing.
Keep signing keys and user credentials out of source control.
Preview and demo
dev/preview # isolated preview with the real account
dev/screenshot out.png # screenshot with sample data
dev/demo # first start with fake music services
dev/demo connected # all three services connected
dev/demo tidal # start with Tidal selected
dev/demo spotify # start with Spotify selectedThe service demo builds the current source and starts dev/fakedaemon with
sample music, generated covers and a simulated playback clock. It needs no
account and plays no audio. Every run starts fresh. Connect and switch services
with Ctrl + O; g switches GUI/TUI. A terminal such
as foot is needed for the TUI. Close the demo windows to end it.
Set BRUMM_PROTOTYPE_BUILD to reuse a demo build directory. For standalone
fixtures, use BRUMM_FIXTURE_FIRST_RUN, BRUMM_FIXTURE_ALL_SERVICES and
BRUMM_FIXTURE_PROVIDER=apple|tidal|spotify.
dev/preview needs Python 3 and an existing Apple Music sign-in. It copies
credentials into a private temporary configuration, with its own daemon,
socket and caches. It uses the real account: favorites, playlists and other
changes in the preview affect that account. The developer token can come from
the installed release or BRUMM_TOKEN_FROM.
Provider and engine guide
crates/brumm/src/
βββ provider/ # Service APIs, sign-in, navigation and track metadata
βββ engine/ # Chrome lifecycle, playback controls and state transport
Providers are built into the daemon. Each implements its service API, authentication, token refresh and playback page. The registry constructs the provider definition, which supplies its stable ID, navigation, capabilities, account identity and API client. The engine runs that playback page through Chrome/CDP and provides the common player lifecycle. The service SDK owns media loading, decoding and DRM.
GUI and TUI render provider-supplied labels, icons and typed destinations. Routes and resource IDs remain opaque: shared UI code must not construct API URLs or infer behavior from service-specific ID formats. Search, Now Playing, settings and help remain shared. Persist navigation by entry ID, not position.
The socket is versioned, newline-delimited JSON over a local Unix socket. Requests, replies and subscribed state carry the active session generation; incompatible protocol versions produce a visible error. Providers do not add separate frontend sockets. Credentials stay inside the daemon and its private playback bridge; only public sign-in prompts cross the frontend socket.
Switching is serialized. The daemon waits for dispatched mutations, cancels outgoing work, closes its player and private bridge, saves the account's queue, then activates the next session. Late replies, login completions and player events must not update the new session or write to its caches. Refreshing credentials must only update their owning account.
Storage is scoped by provider and account. Legacy Apple caches migrate once and remain available for rollback. Apple's cache identity currently derives from its Music User Token, so signing in with a rotated token may create a new namespace. Tidal library and resume caches expire after 24 hours; artwork expires after 24 hours without use and has a size limit.
Actions follow capabilities and resource permissions. Favorite, collection membership and negative feedback are distinct concepts. Use explicit desired states for writes, preserve unknown states, and only show supported actions. Playlist ownership is separate from being saved or followed; only editable playlists belong in the add-to-playlist picker. Preserve track order and repeated entries. A failed append after successful creation must retain the new playlist and report the failure.
Apple Music owns MusicKit sign-in, catalog/library mapping and its player page. Its separate favorite and library states must remain distinct.
Tidal uses device sign-in with the compatibility client from Untidy; this
is a compatibility dependency, not official application approval. Its bundled
official SDK adapter lives in crates/brumm/src/provider/tidal/web/. Home uses native page modules where
available and independent personal-mix fallbacks; Explore can use legacy
editorial pages. History mixes mean most-listened music, not recently played.
One collection action covers favorites. Owned and favorited playlists are
combined; playlist creation uses UNLISTED visibility.
Tidal pagination and page routes stay on validated API origins. Preserve opaque
cursors, bound include depth and request sizes, and avoid retrying ambiguous
playlist writes. Its account-bound loopback bridge checks origin, Host and
path and exposes finite credential and metadata operations. The native media
transport allows only the verified sp-ad-fa.audio.tidal.com HTTPS host,
validated single byte ranges, no redirects, cookies or OAuth forwarding,
at most 32 MiB per response and four concurrent deliveries. Closing the engine
cancels requests; signed media URLs are not persisted. The SDK still handles
decoding and DRM. Preview-only playback is rejected; actual and requested
quality are reported separately. New CDN hosts and higher quality tiers need
separate verification.
Spotify uses the Web Playback SDK and account-bound token refresh, including after suspend. Its SDK frame does not expose audio samples to the visualizer. Service setup is documented in the Spotify entry in the guide.
When adding a provider, implement its definition, auth, API mapping and playback page through these boundaries, then register it. Check stale work during switching, pagination, partial results, permissions, duplicate queue entries and GUI/TUI handoff. Working metadata alone does not prove full-track playback.
References: Tidal API, Tidal Web SDK, Spotify API migration guide.
Validation notes
Use fictional provider fixtures for sign-in states, capabilities, navigation, switching and delayed replies. Run the Rust, QML and SDK adapter suites for the parts changed; keep real tokens and personal account data out of fixtures. Desktop checks that need isolation can run in omabox, but audible playback needs a desktop with audio output.
The Tidal integration checks recorded on 2026-10-14 covered live device sign-in, session restoration, collection/search reads, personal mixes and editorial Explore. Full-track AAC playback, seeking, next-track transitions, repeated queue entries, pause/resume and audible output passed. Native editorial API failures required the legacy Explore fallback; CDN rejection of the browser Origin required the scoped native transport described above.
Those checks did not validate live favorite/playlist writes, every quality tier or Apple/Spotify paid playback. Fixture results and historical checks do not replace a current live test before release. Check sign-in, refresh, supported writes and Apple β Tidal β Spotify switching with suitable accounts.
Release history
These notes describe the releases as shipped; current controls and service support are documented above.
1.4: now with Tidal and Spotify
| Music services | Cathedral |
|---|---|
![]() |
![]() |
- π Tidal is here. Thank you, @keylimesoda!
- π’ Spotify too. Thank you, @sean-imus!
- π§ Pick your services. Press Ctrl+O to switch.
- π§Ή Tidier menus, README and folders, plus visualizer FPS options.
- π§ Fixed covers, queues, GUI/TUI switching and cathedral glass.
Update: press U when brumm offers it, or run brumm update.
1.3: a cathedral visualizer
- βͺ A cathedral: sun through stained glass. Press f, then 2.
- πΌοΈ The list of styles shows a picture of each. Press v.
- π«₯ The visualizer controls can hide while the mouse rests. Press x.
- πΎ f opens the style you saw last.
- π€ The visualizer buttons say what they do in words.
- π The menu is shorter, and the options fold away.
Update: press U when brumm offers it, or run brumm update.
1.2.2: smoother resizing
- πͺ The GUI follows window resizing more smoothly.
- β‘ The terminal scrolls and resizes more smoothly.
- π§± The cover wall fills new spaces with loaded covers.
Update: press U when brumm offers it, or run brumm update.
1.2: prepare for additional services
- π΅ Choose your music service on first start.
- π§© Apple Music has its own API module for future services.
- π¦ Dependencies are updated and pinned to exact versions.
Update: press U when brumm offers it, or run brumm update.
1.1: Rust core
- π¦ The daemon and terminal player now run on Rust.
Update: press U when brumm offers it, or run brumm update.
1.0.2: GUI starts on Omarchy
- πͺ The GUI starts with Qt 6.11. Run
brumm --gui.
Update: press U when brumm offers it, or run brumm update.
1.0.0: Explore, Replay and videos
-
π§ Explore has charts, genres and music video previews.
-
β€οΈ Favorites and Replay are on Home.
-
π Browse playlist folders and create playlists.
-
π More search results. Press Ctrl+i for details.
-
π Press F for the visualizer in full screen.
- πͺ The GUI starts on Omarchy and keeps small-window controls.
- π§± The cover wall stays responsive. Right-click for actions.
Update: press U when brumm offers it, or run brumm update. Video previews need qt6-multimedia on Arch and Omarchy. The installer includes it; existing installs can run sudo pacman -S --needed qt6-multimedia.
Inspired by vibez.






