If Foobar2000 was made in the current year.
rox is a desktop music player for people with large, carefully tagged local libraries. The UI is panels you compose yourself, duplicate with independent configs, and pop out into real OS windows. Themes are token sets a person can share. Tagging is deep enough to trust with a real collection, and the whole thing stays fast at tens of thousands of tracks. Rust, built on gpui, with Linux, Mac, and Windows all first-class. If it doesn't start in under a second, it isn't rox.
The feature rundown
| Area | What's there |
|---|---|
| Library | Parallel scanner reading full tags, true durations, and each file's own codec, sample rate, and bit depth, live folder watching that survives renames, files with unreadable tags indexed by filename so nothing silently drops, folder tree, filters, and search |
| Playback | Gapless single-stream engine, queue with shuffle, repeat, and play-next, endless play that refills the queue from your browse order, from what you've neglected, or from what the current track sounds like, crossfade that leaves album-contiguous boundaries alone, recovery when an audio device disappears, media keys and now-playing integration on all three platforms |
| Sound | Optional local analysis describing how each track actually sounds, driving a sortable Similar column, Play Similar, and a nearest-by-sound shuffle. The built-in extractor needs no download; PANNs CNN10 or a weights file of your own if you want a heavier ear. Nothing leaves the machine |
| Audio | A ten-band equalizer in a window of its own, ReplayGain off the tags with an EBU R128 pass for the files no tagger ever measured, and an exclusive output mode (ALSA, WASAPI, CoreAudio) that states what the hardware agreed to |
| Panels | Forty panel types (library, queue, history, playlists, lyrics, cover, biography, artist and genre grids, spectrum, waveform, VU), composed freely, duplicated with independent configs, popped out into OS windows |
| Theming | Workspaces as single shareable files (layout, palette, appearance) in a folder you can drop a bundle into, palette tinting from the playing album's cover per window, light and dark following cover brightness |
| Tagging | Full tag editor with atomic writes and batch edits, multi-value genres with merges kept as a library opinion rather than a tag write, ratings stored in the files themselves (FMPS and POPM), online tag and cover lookup through MusicBrainz, iTunes, and Deezer, artist biographies |
| Lyrics | Synced and plain lyrics from sidecar files, tags, or lrclib, with an in-panel editor that writes back where it read from |
| History | A full listen log driving the history panel and stats window, Last.fm scrobbling |
| Playlists | Favourites, drag reorder across playlists, m3u import and export, entries that survive their files leaving and returning |
| System | Tray with quit-to-tray, one instance per data directory, portable mode, one binary, and a tasks window for the long library jobs with time estimates measured on your own machine |
Planned
| Area | What's coming | Tracked |
|---|---|---|
| Auto-update | Downloads and applies a release instead of pointing at it | #75 |
| Sources | Streaming services (Spotify, YouTube Music, Tidal) as community-maintained extensions, each its own library view, updating on their own release cycle when a service changes something | #8 |
| Unified library | One view merging local and streaming catalogs with matching across them, which is why track identity was never welded to file paths | #9 |
The full picture, including what's out of scope, lives in the product docs.
All first-party numbers: the same machine (Ryzen 9 5950X, Linux/Wayland), the same 50k-track library on an external SSD, every player with the library loaded and measured through one harness. Memory is PSS across the app's full process tree, "loaded" is when CPU settles after launch, idle is a paused player with the window visible.
| 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% |
DeaDBeeF would sit at 44 MB, but it never got a row: its MP3 parser segfaults partway through importing this library, every attempt. rox indexes all 50k tracks, including the truncated files that trip it.
Scanning reads deep. rox pulls full tags and true durations from every file on import, not a header skim, so the library you browse matches what's actually in the files. The scanner is parallel and outruns storage: with file data cached, a full import of this library lands in about 3 seconds; from a cold external SSD it is around 3 minutes, the drive maxed out with CPU to spare. Like for like, fooyin re-imports the same collection from a reset in about 30 seconds where rox takes 3, and in every rox run the ceiling was the disk, never the player.
rox ships as one 62 MB binary. Tauon's Flatpak is a 135 MB download, the Spotify client idles between 300 and 900 MB. Foobar2000 itself stays lean, but you knew that, that's the point.
I loved Foobar2000 because of panel UI you build yourself, a theme community on top of it (CaTRoX, NekoRoX, Georgia), and tag and library management that held up at scale. That stack is stranded on Windows, and nothing on Linux or Mac covers all three legs: Tauon's tagging is shallow, Strawberry isn't composable, Quod Libet isn't something you'd theme.
Oh right, and it needs to be native, everywhere.
I've been working on and off on variations of rox over the years through Golang and its fragmented GUI ecosystem. I landed on Wails but work on it was sporadic and I still had my Foobar setup. Progress took ages because making a GUI app on Go maybe isn't the best or maybe I'm just bad at it, but as I progressed, I also noticed that I was just doing another webapp which killed a lot of my motiviation to make a true spiritual successor to Foobar2000 in my mind. It had to be fast, it had to be native, it had to look as close as possible to CaTRoX.
Jump to the start of 2026 and I did a full-time move to Linux. Because of how CaTRoX (and my NekoRoX fork) is built with tons of random work arounds, Internet Explorer essentially running in panels and so on and so forth, it's just a pain to run through Wine and it really surfaces just how hacky everything is put together. It feels like the foundation isn't solid and everything is just one OS change away from exploding again.
I've been working on Orbit on the side and wanted to do an evaluation of gpui since I use Zed and I very much love the vision of going back native. I've been loving working with it for prototypes and I realized I had most of the foundation written and all I had to do is start mapping it over. So that's what I did. And now we have a new native player.
A workspace is a whole look in one shareable file: layout, palette, appearance. The shot above is the Default workspace, and these ship in the box too, one click away on the welcome window or in settings:
| CaTRoX | |
|---|---|
![]() |
|
| Foobar | Llama (WinAmp) |
![]() |
![]() |
| Metro | Phosphor |
![]() |
![]() |
Grab your platform's build from the releases page.
- Linux
- Arch Linux - Available on the AUR as
rox-player. - Tarball - Unpack the tarball and run
./rox.
- Arch Linux - Available on the AUR as
- macOS - Open the DMG and drag
roxinto Applications. - Windows - Unzip anywhere and run
rox.exe. If SmartScreen objects, More info > Run anyway.
rox <files or folders>- play them now, replacing what's loaded. Folders expand to the audio files directly inside them.--enqueue/-e- append the given files to the up-next queue instead of playing.--new-instance- start a second rox against the same data directory. Without it a launch hands its files to the rox already running, which raises its window and takes them. Linux and macOS only, Windows has no guard yet.--portable- keep all data (library, settings, caches) in arox-datafolder beside the executable for this run. To stay portable across launches, drop an empty file namedportablenext to the executable, or flip the toggle in the Behavior settings.
With Nix:
nix develop
cargo runThe dev shell carries the Rust toolchain and the Linux libraries gpui loads at runtime.
If you use direnv, direnv allow gets you the same shell on cd. The first build
compiles the whole gpui tree and takes a few minutes.
On a Mac you also need Xcode installed, nix or not: gpui compiles Metal shaders at
build time and nix can't ship Apple's Metal toolchain. On Xcode 26 that toolchain is
a separate one-time download: xcodebuild -downloadComponent MetalToolchain.
Without Nix you need stable Rust and gpui's system libraries from your distro (Wayland, X11, Vulkan, xkbcommon, fontconfig, alsa); every Rust dependency comes from crates.io. On Debian or Ubuntu that is:
sudo apt-get install -y pkg-config libasound2-dev libfontconfig1-dev \
libwayland-dev libxkbcommon-x11-dev libx11-dev libxcb1-dev libvulkan-dev \
libssl-devRun ./scripts/vendor-gpui.sh once before building: it fetches gpui and gpui-component
and applies the small patches under patches/ (the nix shell does this on entry).
Copy .env.template to .env to bake service identities into the binary at
compile time: LASTFM_API_KEY and LASTFM_API_SECRET for one-click scrobbler
connect, DISCORD_APPLICATION_ID for rich presence. Exported environment variables
win over the file, which is how the release workflow passes its secrets. A build
without any of them works the same minus those integrations, and the Last.fm
settings page takes your own key pair at runtime either way.
Debug builds accept a --fresh flag that runs rox against a wiped scratch data
directory in the OS temp folder, so cargo run -- --fresh walks the first-run
experience without touching your real settings or library. Release builds ignore it.
Check out the docs index which lists the altitude spec for how rox is built.
Something broke, or rox is missing the thing that would make it yours? Open an issue. The forms only ask for the essentials; repro steps, recordings, or a file that triggers the problem are all welcome extras. If neither form fits, a blank issue is fine too.
#rox lives on irc.hivecom.net. Quick questions, workspace show-and-tell, or kicking an
idea around before it's an issue all fit there. No client handy? The web chat
works from the browser and lands you straight in the channel.
Yes, IRC. You're looking at a Foobar2000 successor, what did you expect.
rox is written with AI tools because I'm building it for myself and I can only deliberately work on so many projects at the same time. If you want to contribute high quality hand written code and take over the development of rox instead of me using AI tools; be my guest.






