Releases: zealsprince/rox
Release list
v1.5.1
rox 1.5.1 is a small release: the whole interface zooms now, and at full volume audio reaches your device untouched.
Zoom the whole UI
Ctrl with +/- steps the interface size up and down, and Ctrl+0 snaps it back, the same chords your browser uses (Cmd on macOS). It scales everything, not just the track list: the transport, the panels, the About window, they all grow together and stay laid out. The size sticks across launches. And it's yours alone now, so applying a workspace won't resize your text out from under you, the same way a shared look already leaves your dark/light pick where you set it.
Bit-perfect at full volume
At 100% volume rox now hands the decoder's samples straight to the device with no math in the path. With processing off and the device running at the file's own rate, what reaches your DAC is bit-for-bit what's on disk. This is the first piece of the processing chain landing (ADR 19): the rails are in, the effects (EQ, crossfade) come later.
Also
- rox is on the AUR now as
rox-player, so Arch users can install it from there. Thanks to Juniper for packaging it and sending the docs (#76). - On Windows a borderless window no longer flashes its title bar for a frame when it opens.
New Contributors
Full Changelog: v1.5.0...v1.5.1
v1.5.0
rox 1.5.0 is a theming release: every look now carries a dark and a light side with the pick in your hands, and a new console window shows the app's log live.
Warning
Because of workspaces now carrying two different branches of the palette; this breaks a non-built-in workspace if you've made one in the few days that this repository has been out. Assuming that no one has gone and completely built a full on custom UI yet, I went ahead and ripped the bandaid on this change now rather than later doing a full major release for this change.
Note
If you do happen to have made a custom workspace in such a short time: send it over to me and I'll migrate it for you. Consider sharing it in the discussions on the repository since if I see a few I might open up a path to sharing them with the broader community.
Dark and light, paired
The palette splits in two: a dark and a light palette, each editable and each remembered. A theme pick chooses which one shows - Dark, Light, or System, which follows your desktop's preference live. System is the default, so a fresh install matches the desktop it lands on.
Art theming now runs both ways: a bright cover flips a dark theme onto the light palette, and a dark cover flips a light theme dark. Each side always shows its own colors, so an edit you make on the light side is exactly what appears under a bright album. The keep-theme toggle holds your side under any cover.
The color editor follows whichever side is showing and re-seeds when that changes - a theme switch, the OS flipping under System, or a workspace apply. Reset returns to the side's designed anchor, and Inverse seeds one side from the other flipped, a quick start for pairing a look.
Workspace bundles carry both palettes but never your theme pick: applying a look restyles both sides and leaves dark/light where you set it. The shipped workspaces are re-authored as pairs, and their welcome tiles preview the side you're on. A new Theme Toggle panel puts the flip in your layout - sun while dark, moon while light, one click to switch.
A console for the log
The new console window (Application menu) shows the app's log as it happens: level filters, follow, copy, clear, and a button to reveal the log file on disk. The same lines land in a rolling file under the data dir, so a crash or a weird session leaves a record a bug report can attach.
Failed lookups got readable along the way. A cover, lyrics, tags, or biography search that can't reach its service now says so plainly - "no connection", "service returned 503" - with the console one click away, instead of dumping a raw request error into the panel.
Fixes
- Opening two tag or cover editors on the same track now gives each its own match window, and Apply lands on the editor that opened it.
- Running a second rox no longer breaks media keys.
Also
- The play button's highlight is now a pick: circle, square, or none.
- The volume strip's icon, slider, and percent readout are independent toggles, so it can be as small as a lone speaker.
rox --window-size 1440x900pins the window size for the session (I built this so that I could take consistent screenshots for the website which is now live over at rox.music)
Full Changelog: v1.4.1...v1.5.0
v1.4.1
rox 1.4.1 is a durability release: playlists and play history now survive their files leaving and coming back, and the thumbnail cache stores each cover once.
Playlists and history follow their files
A file missing at scan time loses its library row, and until now anything pointing at it stayed orphaned when the file returned: the playlist entry went silent, the play count restarted at zero. Every playlist entry and listen now remembers the file's path alongside its tags, and after each scan rox matches orphaned entries back to the library - by that path first, then by the tags when they name exactly one track. An ambiguous match never guesses. Unplug a drive, delete and restore an album, reorganize your folders with the app closed: your playlists and play counts find the files again, even at a new path. Existing playlists and history pick this up automatically, no re-add needed.
A track that left the library but whose file is still on disk also keeps its cover in playlist and history rows now, instead of going blank.
One cover, stored once
The thumbnail cache kept a copy of the cover per track, so an album of twelve tracks carried twelve identical JPEGs and paid twelve decodes. Covers now pool by content: any number of tracks sharing an image store it once, and only the first sight of a cover pays the decode. Existing caches migrate in place on first launch, and images nothing references anymore are swept on the next one.
Also
- The README benchmarks were redone through a single measurement harness across seven players (startup, load time, memory, idle CPU), and the page gained a feature rundown, download instructions, and the command line flags.
Full Changelog: v1.4.0...v1.4.1
v1.4.0
rox 1.4.0 is a looks release: four new panels, text that scales, and an improved onboarding experience.
New panels
Drawer tucks a second panel against an edge and shows only a labeled handle until the pointer rests on it, then slides out over the main panel and back home when you leave. Overlay layers a second panel over the main behind a scrim, revealed by a corner button or Tab - it's the old Depth panel renamed, and layouts saved as "depth" still load. Both cost nothing once settled.
The VU meter shows per-channel loudness with two ballistics - slow VU and snappy peak-hold - growing from a configured edge and colored by the same loudness ramp as the spectrum. Spacer holds nothing but the gap it occupies, for layouts that want air. Slide picks up a draggable rail under its dots, shaded edge scrims hinting at neighbors, and wheel-to-step.
Text sizing
A new Typography slider scales text across the whole app, and every panel can carry its own font scale on top. Fixed heights and cover tiles grow with the text, so a bumped-up queue or playlist stays proportioned instead of clipping.
Spectrum styles
The spectrum panel gains render styles (bars, LED blocks, line), an orientation edge, mirrored symmetry, and gradients from the theme, the cover art, or a custom two-color ramp behind a color picker. Layouts saved with the old gradient toggle load into the new options.
Workspaces
The welcome window shows the shipped workspaces as picture tiles, one click applying the whole look. Four new ones ship alongside the default: Foobar, Llama, Metro, and Phosphor. Bundles can carry a preview PNG beside their JSON, so a shared look shows what you're getting before you apply it.
Transport and track info
Every transport button - prev, play, next, the seek nudges, repeat, shuffle - can now be toggled per panel, so a bar is exactly the buttons you want. Track info that outgrows its panel can scroll (crawl out and back) or loop (chase its own tail), with a speed slider and a timed title/byline swap. Playing an album or selection from the library now lands the tracks in the up-next queue, so the queue panel lists what you actually chose.
Fixes
- Squeezing a layout through a small window no longer rewrites its splits for good. The dock keeps the real proportions separate from what currently fits, so restoring the main layout from the mini player brings the splits back where you left them.
- On Linux, library watching now respects the system's inotify budget: libraries with more folders than half the per-user allowance fall back to manual rescans instead of failing partway.
- Tab titles, table headers, and placeholder text take their color from the active palette instead of stock gray, hand-authored light themes are detected as light, and the settings, about, and stats windows render under the playing track's art tint like everything else.
- On KDE, switching between two workspaces that share a decoration mode no longer leaves the window stuck at its old size.
- Saved layouts and exported bundles no longer pick up float noise (0.05 coming back as 0.05000000074505806), so diffs of shared workspaces stay readable.
Also
- New about window with build identity, project links, and an on-demand update check, opened from the Application menu.
- The menubar gains playback actions and an art-theming toggle, and its empty middle drags the window when decorations are off.
Full Changelog: v1.3.0...v1.4.0
v1.3.0
rox 1.3.0 teaches the tag editor to read filenames and makes playback survive a yanked headphone cable.
Guess tags from filenames
The tag editor gained a Guess panel: give it a pattern like %artist% - %title% or %artist% - %album%/%track%. %title% and it fills fields from the file's name and its folders, with a live preview before anything is written. %skip% swallows parts you don't care about, and the last pattern you used is remembered.
Playback
An audio device that vanishes mid-song - headphones unplugged, a backend fault - no longer leaves the player frozen on "playing". rox rebuilds the stream and picks up where it was, still playing if it was playing. Removing the upcoming track right as it's queued up to decode now plays the real next track instead of the stale one, and gapless handoffs between tracks at different sample rates no longer lose their final frames.
Covers
Dropping a new cover.jpg into an album folder now refreshes the thumbnail: the cache tracks the art file's own identity instead of the audio file's. Existing caches migrate in place, nothing rebuilds from scratch. Panels also release their decoded covers when they close instead of holding them in memory for the whole session.
Performance
Artist and album search filter a cached list instead of rescanning every row per keystroke, year: searches stopped formatting the whole library's years each time, and scanning reads a file's tags and rating off one parse instead of two.
Also
- First launch now opens to the onboarding screen, so you pick a workspace or build your own window instead of landing in a preset arrangement.
- Windows builds no longer open a console window behind the app.
- On macOS, toggling the mini player while fullscreen now leaves fullscreen and comes up at its proper size instead of stretching over the whole Space.
Full Changelog: v1.2.1...v1.3.0
v1.2.1
A cleanup release over everything 1.2.0 shipped: fixes across settings, playback, and the library tools, plus a performance pass.
Settings
Settings now write atomically, so a crash mid-save can't take your layouts, workspaces, palettes, and last.fm session with it. The update check and the UI no longer overwrite each other's fields, and quitting from the menu saves pending layout changes the same way the Quit shortcut does.
Playback
Scrubbing near the end of a track lands where you point instead of jumping into the next one, and removing the upcoming track from the queue no longer skips a song at the gapless handoff. The visualizer feed keeps its channels aligned under load.
Library tools
Duplicate cleanup only trashes copies visible through the active filter, and "ABBA" now groups with "Abba". The scanner survives symlink loops, an aborted scan no longer counts as finished, and a folder moved into a watched library gets picked up. Saving tags, covers, or repairs no longer wakes the library watcher, so your own edits don't trigger a rescan.
Performance
Select-all drags, queue sync, sorting, and the appearance sliders stopped redoing work per row or per tick, and idle panels render less.
Also
- Ctrl+Shift extends selections as stacked ranges across the track panels.
- The Nix flake exports a proper package.
- M3U import keeps the first track when the file starts with a BOM.
- MPRIS reports position after a seek, and media keys survive closing the window that owned them.
- Last.fm connect can't hang forever.
- Panel persistence fixes: playlists columns save with the layout, the grid restores its scroll position without drifting, and gear and lock reach every panel.
Full Changelog: v1.2.0...v1.2.1
v1.2.0
rox 1.2.0 is about the library taking care of itself.
Live library watching
rox now watches your library folders. Files you add, move, or delete outside the app fold in on their own - no manual rescan. Renames keep their tracks' ratings, playlists, and listen history, and a catch-up pass on launch covers anything that changed while rox was closed. Toggle it on the Folders settings page.
Rescans also clean up after deletions now: a track whose file is gone loses its row. Guards make sure an unplugged drive or dropped network mount never reads as an emptied library.
Duplicates
A new window finds tracks your library carries more than once - same title and artist, whatever the files are named - and shows every copy with its cover, codec, and bitrate. Pick keepers by best quality, oldest, or newest; spares go to the OS trash, so a wrong pick comes back. It never takes a track's last copy, and copies that belong to different albums are never auto-checked.
Tag repair
Some MP3s (Bandcamp downloads are the usual source) carry an ID3v2.4 tag shape that many players read mangled - gray covers, blank fields. rox already reads these files right; the new Repair Tags window finds them across your library, or one folder, and rewrites the bytes clean through the same copy-verify-rename path every tag edit takes.
Update notifications
The new About page in settings shows your version and can check GitHub for a newer release, once a day at most, notify only. It never downloads or installs anything, and a toggle turns it off.
Also
- Media keys and the system transport now work on Windows.
- Inverting a palette between light and dark now lands on the designed counterpart and carries your color edits across, instead of a raw lightness flip.
- Bug report and feature request forms are up on the issue tracker.
Full Changelog: v1.1.1...v1.2.0
v1.1.1
A small patch on the tag editor's batch save.
- Saving a batch now shows per-file progress (Saving n/m) and commits each file in the background.
- The editor locks its inputs while a save runs so a half-committed batch can't be edited mid-flight; Cancel stays available to exit early.
- Panels can carry minimum and maximum dimensions, so workspace resizes keep layouts consistent.
Full Changelog: v1.1.0...v1.1.1
v1.1.0
This release is about getting music into rox from anywhere, and making every track list feel the same.
Play anything from anywhere
Drop files onto the app from your file manager - in your library or not - with drop zones for Play now, Play next, and Add to queue, and a preview label under the pointer. rox also takes files from the command line and file associations now, and forwards them to the running instance instead of opening a second window. The desktop entry registers audio types and gains an Add to Queue action.
Browse by folder
For the part of your library that is organized on disk rather than in tags: a folder tree panel and a folder: query pin that scopes any view to a whole subtree.
One track list everywhere
The columns, cells, and album headings the library panel uses are now shared across the playlists, history, and grid panels, and the queue is rebuilt on them too - with the playing entry tracked live and a floating queue modal when none is docked. The album grid gains type-ahead jump, and a shortcut can focus any panel by name.
Also
- A contrast appearance mode that keeps the dark ladder, plus a palette inverse that flips the neutrals and keeps the accents.
- Wider format support: the full pure-Rust symphonia codec and container matrix (Opus still pending).
- Bandcamp MP3s with blank tags read correctly now - a workaround for a tag-library quirk with ID3v2.4 unsynchronisation.
- Visualizers redraw at the rate the playhead moves instead of every frame.
- Faster queue Clear and multi-delete, a QuickPlay fix so clicks land on the right row, and submenu keyboard navigation.
Full Changelog: v1.0.0...v1.1.0
v1.0.0
The first release of rox: a desktop music player for people with large, carefully tagged local libraries. If Foobar2000 was made in the current year. Rust, built on GPUI, native on Linux, Mac, and Windows.
Panels you compose yourself. The UI is a dock of panels - library, album grid, play queue, playlists, filter, search, lyrics, biography, metadata, cover art, spectrum and waveform visualizers, listen history, and stats. Duplicate them with independent configs, nest them, pop them out into real OS windows, and save the arrangement as named layouts.
Themes a person can share. Palettes are OKLCH token sets, with seed-based window backdrops, per-panel theming, and icon packs. Workspaces bundle a layout, palette, and appearance into one shareable file.
Tagging you can trust with a real collection. A batch tag editor with online metadata match, a cover art editor with online cover search, lyrics editing and match, and atomic writes that copy, verify, and rename so a crash never eats a file.
A player that remembers. Listen history and play counts feed the stats panel, Last.fm scrobbling is built in, and the queue keeps playing past its end through continuation providers. Close the window and rox keeps running in the tray with media key support.
It stays fast at tens of thousands of tracks, and it starts in under a second.
Full Changelog: https://github.com/zealsprince/rox/commits/v1.0.0