A fast, KDE-native desktop music player built with Rust and Qt6.
Ferrous is a personal project built for my own daily listening. It pairs a Rust backend for playback, analysis, and library management with a Qt6/QML + KDE Kirigami frontend. Developed with KDE Plasma in mind, it targets responsive local-library workflows, gapless playback, and rich real-time visualization. Ferrous is opinionated about library organization — your folder structure is your library.
Playback — GStreamer-backed engine with seeking, gapless queue transitions, repeat, shuffle, and volume control.
Library — Folder-first browsing that mirrors your filesystem. Add one or more root directories, and Ferrous indexes them into a navigable tree with artist, album, and track grouping. It watches the roots, so files added, changed, or removed by other programs appear without a rescan, and it rescans them at startup. Roots on network or FUSE file systems, network or FUSE mounts inside a root, and roots with more folders than fs.inotify.max_user_watches allows are rescanned every 30 minutes instead, and Preferences > Library marks them. Watching can be turned off there. Removing a root there asks first and says how many tracks leave the library; the files stay on disk. Global search spans the entire library, with ranked results in artist, album and track sections and type: filters.
Queue — Open files, add folders, import M3U playlists, drag-to-reorder, and automatic session restore on launch. Clearing the queue, removing tracks, and replacing the queue can be undone until the queue changes again; see keyboard and mouse.
Tag editor — Multi-file tag editing with bulk operations and auto-numbering. Renaming files from their tags lists each new name, and any that cannot be used, before any file is renamed. Confirming renames only what the list showed, and nothing if the files changed since.
Album art — Folder and embedded cover art display with the option to fetch high-resolution artwork from the iTunes catalog. A suggestion can be previewed in the album art viewer, compared with the current art, and applied from there, or the viewer can go back to the suggestions. A folder's cover is its cover, folder, or front image, in that order and in any letter case, or else its first JPEG or PNG image by name. The library and the now-playing view both show the folder's cover before a track's embedded picture. Covers follow images that are added, renamed, removed, or replaced at the next scan, or at once while the library watches its folders. Applied artwork replaces that named image in its current format, or adds a cover.jpg or cover.png and leaves other images, such as back scans, untouched. In folders without such images, the artwork is embedded in every track there with the same album tag, and no track is changed unless all of them can be updated. Ferrous keeps no copy of the art it replaces, so it asks before replacing a track's existing art. Suggestions go to the album they were searched for, even if playback moves on before they are applied, and nothing is written if that track's file was moved, renamed, deleted or changed since the search.
Visualization — Live spectrogram and waveform displays rendered alongside embedded cover art. The spectrogram is inspired by Adobe Audition's spectral view — something I've spent countless hours using to analyze songs. It supports mono downmix or per-channel display, fullscreen viewing, logarithmic or linear frequency scale, an optional limit to the audible band of high-resolution tracks (22.05 or 24 kHz), adjustable dB range, configurable FFT window size, and centered or rolling display modes. Rolling mode scrolls continuously; centered mode shows a zoomable window around playback, with the view clamped at track boundaries. The waveform viewer supports zooming and per-channel inspection.
Desktop integration — MPRIS media controls, media key support, single-instance file opening, and .desktop/MIME registration.
Scrobbling — Last.fm integration with desktop authentication and batched submissions. In the status bar, a ring around the Last.fm glyph fills with the time listened towards the scrobble, as the scrobbler counts it: a seek doesn't move it, and only a new play starts it over. Its tooltip gives the time left, and the ring closes as soon as the play reaches the scrobble point; the scrobble is sent in the background. The countdown goes on through a seek, however near the end of the track; when playback stops after a play that ended before the scrobble point, the slot says that play wasn't scrobbled. It also says when scrobbles wait for Last.fm or one failed. When Last.fm can't be reached or is busy, scrobbles stay queued and are sent again, after 30 seconds and then at doubling intervals of up to 30 minutes, until Last.fm takes them; the slot says that they wait (a scrobble that is just being sent doesn't), the Last.fm preferences show when the next retry is, and the diagnostics log records each failure. The diagnostics log also records each Now Playing update and scrobble submission Ferrous sends, with the tracks, their play times, and what Last.fm did with them. When Last.fm asks Ferrous to slow down, nothing is sent until the wait it asks for is over, for at most a day, unless you reconnect the account. Recent Issues lists only what needs you, such as reconnecting the account, or scrobbles that Last.fm refused or that could not be saved. Clicking it pauses scrobbling until Ferrous quits, and strikes the glyph through: a track that plays while scrobbling is paused is never scrobbled, and nothing is sent to Last.fm. The Last.fm preferences can hide the slot.
Ferrous treats UI responsiveness as a correctness requirement. Playback, analysis, metadata extraction, library indexing, and search use background workers. Smooth visualization and immediately responsive interaction are development goals; if something feels sluggish, it's a bug.
MP3, FLAC, M4A/AAC, Ogg Vorbis, Opus, WAV, AC-3, DTS, and M3U/M3U8 playlists. Actual codec support depends on the GStreamer plugins installed on the host system.
On Fedora, the base, good, and bad-free GStreamer plugins that the RPM requires play every format above except AC-3 and DTS. Those need gstreamer1-plugin-libav, which the RPM recommends, so dnf installs it unless weak dependencies are turned off. Fedora builds that plugin against ffmpeg-free, which leaves out some codecs, such as E-AC-3. Replacing ffmpeg-free with the full FFmpeg from RPM Fusion (sudo dnf swap ffmpeg-free ffmpeg --allowerasing) adds them. Ferrous does not require RPM Fusion.
Prebuilt Fedora RPM packages are available from GitHub Releases.
To build from source, install the prerequisites in the installation guide, then:
git clone https://github.com/Tiaxi/ferrous.git
cd ferrous
./scripts/run-ui.shSee the installation guide for full dependency lists, manual build steps, and local package builds.
Ferrous is a personal project tailored for my specific needs and workflow. It is usable for daily listening but still under active development. Contributions and feedback are welcome, though the project direction follows my own priorities.
See the backlog for open ideas.
| Layer | Technology |
|---|---|
| Backend | Rust (playback, metadata, library, search, analysis) |
| Frontend | Qt6/QML + KDE Kirigami |
| Audio | GStreamer |
| Storage | SQLite |
- Installation guide — dependencies, build options, data locations
- Keyboard and mouse — shortcuts, scrolling, and zooming
- Development guide — building, testing, debugging, profiling
- Backlog — open feature and maintenance ideas
- Contributing — proposing and submitting changes
This project is licensed under the GNU General Public License v3.0.
