A library that holds up
A parallel scanner reads full tags, true durations and each file's own codec, not a header skim. Folder watching survives renames, and nothing drops silently.
A desktop music player for people with large, carefully tagged local libraries. You build the panels yourself, and a theme is one file you can hand to someone else. Native on Linux, macOS and Windows.
rox ships as one binary and starts before you've let go of the mouse.
| Player | Window up | Fully loaded | Memory | Idle CPU |
|---|---|---|---|---|
| rox | 0.3 s | 2.3 s | 134 MB | 0.5% |
| Elisa | 0.7 s | never settles | 206 MB | 74% |
| fooyin | 0.3 s | 18 s | 364 MB | 0% |
| Quod Libet | - | 19 s | 384 MB | 0.2% |
| Strawberry | 0.3 s | 32 s | 434 MB | 0.8% |
| Museeks | - | 3 s | 436 MB | 0% |
| Tauon | 8.7 s | 12 s | 2.8 GB | 0% |
I measured all of these myself, on one machine (Ryzen 9 5950X, Linux/Wayland) with the same 50k-track library on an external SSD, every player through the same harness with its library loaded. Memory is PSS across the full process tree. "Loaded" is when CPU settles after launch; idle is a paused player with the window visible. DeaDBeeF would have sat at 44 MB and won on memory, but it never got a row: its MP3 parser segfaults partway through importing this library, every attempt. rox indexes all 50,000 tracks, including the truncated files that trip it.
A parallel scanner reads full tags, true durations and each file's own codec, not a header skim. Folder watching survives renames, and nothing drops silently.
A full editor with atomic writes, batch edits and find and replace. Ratings live in the files themselves via FMPS and POPM. Lookup through MusicBrainz, iTunes and Deezer.
A whole-disc FLAC beside its cue sheet indexes as real rows. Each span seeks, scrobbles, sorts and runs into the next one gaplessly, the way a file does.
One stream, with shuffle, repeat, play-next and A-B repeat. Bookmarks drop with one key and sit on the seek strip. Media keys and now-playing work on all three platforms.
An equalizer in a window of its own, crossfade that leaves an album's own splices alone, and exclusive output that says what the hardware agreed to.
rox describes your tracks off their own audio, tempo included, and orders what's next by resemblance. It runs on your machine against your files, no service in the loop.
Forty-odd panel types, from library and queue to artist grids, spectrum and VU. Duplicate one with its config, save it as a preset, or pop it out into a window.
A workspace is one file carrying layout, palette, appearance and shaders. Palettes can tint from the playing cover, going light or dark with the art.
Write a WGSL shader over one panel or the whole window, or run Milkdrop presets through projectM. Named signals off the spectrum ride the shader inputs.
Synced or plain, from sidecar files, tags or lrclib, with an editor that writes back where it read. A listen log drives the history panel, stats and scrobbling.
Favourites, drag reorder, M3U, PLS and XSPF in and out, and smart playlists that re-run a saved query rather than hold a snapshot. Entries survive a file leaving and returning.
A tarball, a DMG or a zip, plus the AUR and a Nix flake. Portable mode keeps the library and settings in a folder beside the executable.
JSON-RPC over a local socket: transport, queue edits, library search and pushed events. Auth is file permissions, nothing listens on a port.
A proxy beside the app puts the socket on MCP, so an AI client can ask what's playing or work the deck. Off by default, rechecked every call.
A source client pushes what rox plays as MP3 at your mount. Outward only: the network face is Icecast's, and a dead server never stalls playback.
There are eight workspaces in the box, one click away on the welcome window. Each one is a single file carrying the layout, the palette and the shaders it runs, so you can edit it, break it, and hand it to someone else. See them all.