Rufin is a powerful, fast and easy to use native music player for local/remote folders and music servers, available on multiple platforms. Rufin offers a rich library browsing and management experience while making the most of each source's unique features. It can be run headless, scripted, or controlled from its Web UI; and can be securely synced with other devices with Rufin Connect.
-
Local libraries: Rufin provides favorites, playlists, activity history, Auto DJ recommendations and metadata editing.
-
Jellyfin: Supports library separation, Jellyfin WebSocket for incremental scans, metadata editing over API and Instant Mix. -
Navidrome /
OpenSubsonic: Supports API key authorization, normal/legacy passwords, Navidrome's own API and OpenSubsonic v2 APIs. Metadata editing is available if the library can be matched to local files. -
Emby: Supports library separation, incremental scans, metadata editing, and Instant Mix. Ratings are saved locally. -
Plex: Supports password and browser sign-in, shared libraries and Plex Home profiles, library separation, incremental scans, server playlists and ratings, and locally stored favorites. Includes Plex recommendations for Auto DJ, downloads where permitted, Plex Companion controls and queue handoff. -
WebDAV: Direct read/write access to WebDAV and Nextcloud libraries without filesystem mounts, including downloads, tag/lyrics editing. Supports HTTPS, custom certificates and headers, password or bearer-token authentication, Nextcloud browser sign-in, and alternate addresses for LAN, VPN, or Tailscale connections. -
SMB / Samba: Direct read/write access to Windows, Samba, and NAS shares without filesystem mounts, including downloads, tags/lyrics editing. Supports share discovery, guest and domain-qualified logins, signing and encryption, and alternate addresses for LAN, VPN, or Tailscale connections.
- True gapless playback and configurable equal-power crossfade mode
- ReplayGain/EBU R128 analysis and true-peak measurement
- 10-band equalizer with presets, perceptual/linear volume scale preference and fade on play/pause
- Auto DJ that keeps the queue filled; server recommendations when available with a smart local fallback
- Random play with filters for track count, year range, genre and played/unplayed status
- Optional waveform seekbar; waveforms are generated for the current track and cached
- Fullscreen player with visualizer
- CUE sheet support with separate playable tracks
- Broad codec support 1
- Audio output device selection
- Configurable playback speed and pitch
- Drag songs from your queue or lists to playlists, or select multiple of them with your keyboard batch operations
- Combine all your music from different sources in a single listening session with global playlists
- Import/export your playlists as .m3u/.m3u8/PLS/XSPF; as long as
media_uriis accessible Rufin can play them - Download tracks manually or through automatic rules, then keep using the same remote library while offline
- Can be set as default audio player to open any audio file, or via CLI with
rufin track.mp4 - Drag folders, audio files or playlists to Rufin window to import them
- Path matching between music servers and local folders, allowing local playback while keeping server activity and history
- Metadata and artwork editing, including bulk editing and Musicbrainz metadata autofill
- Automatic metadata, artwork and lyrics caching; and in-app lyrics/artwork search functionality
- Rating support, with an option to enable visual-only partial stars for OpenSubsonic
- Virtualized, smooth to scroll pages
- Can write EBU R128 tags to tracks
- Furigana and Romaji lyrics overlays, translation preference and karaoke mode support
- Extensive lyrics organization settings; you can automatically save fetched lyrics to your source as embeds or separate .lrc files
- Granular import/export backup options including credentials, automatic backups with password protection are available
- Listening activity can be exported as Last.fm/ListenBrainz compatible
.csvfiles
- Shares sources, credentials, playlists, favorites, pins, preferences, listening history between paired devices
- Uses Iroh for encrypted connections, discovery, relays and device-to-device transfers
- Keeps playback queues, downloaded files, local paths and encoding choices per device
- Continue playback where another device left off
- Supports encrypted profile files through local folders, WebDAV/Nextcloud, and Samba shares
- Local folder sync can be done with solutions like Syncthing or optional Iroh relays
- Server-provided artist, track, album, playlist and genre radios, including recommendations from server plugins
- App owned smart (i.e. dynamic) playlists with custom sorting and limits; can use metadata, play/skip history or pre-defined dynamic lists
- Dedicated Search, Folders and History pages
- Moods browsing and mood/BPM-based smart playlists for Plex, Navidrome, Subsonic and local/remote libraries
- Synchronized lyrics (including word-by-word) with built-in search and adjustable offset
- Last.fm, Libre.fm and ListenBrainz scrobbling, with offline storage and automatic retries
- Discord Rich Presence
- Private mode for temporarily pausing external activity
- Secure storage for server credentials and API secrets by default
- Casting support for UPnP and Chromecast, plus Plex Companion queue control and playback handoff in both directions
- Run release binaries without the desktop interface with
rufin --headless; usecargo run -p rufin-controllerfor the separate GTK-free build - Enable the Controller for browser access or scripting through the HTTP API, inside the app or from terminal with:
export RUFIN_API_TOKEN="your_token"
rufin --headless --listen- Control playback, browse your library, manage sources and playlists, and view the queue & lyrics from a browser
- Playback stays on the device running Rufin
- Token-based authentication
- Fast, responsive and broadly customizable
- Theme support including custom themes
- Extensive keyboard shortcuts catalog
- Automatic updates for Windows and macOS builds
- Easy built-in log viewing and exporting (privacy-conscious)
- Type to search
- Can run in the background or set to launch minimized, which uses the GNOME portal when available
- System tray integration
![]() |
![]() |
| Artist details | Genres |
![]() |
![]() |
| Smart playlists | Playback settings |
![]() |
![]() |
| Fullscreen player | Visualizer settings |
![]() |
![]() |
| Integrations | Playlist settings |
Rufin is available for Fedora 44.
sudo dnf copr enable screwyy/rufin
sudo dnf install rufinLatest binary releases:
yay -S rufin-binBuilding from the source:
yay -S rufin-gitRufin is available in nixpkgs repository. To run Rufin without installing:
nix run nixpkgs#rufinTo add it to your profile:
nix profile install nixpkgs#rufinYou can also run main or an older release directly.
nix run github:screwys/Rufin/main
nix run github:screwys/Rufin/vX.Y.ZDownload the .exe from GitHub Releases.
The installer has opt-in Automatic updates in General preferences to have Rufin install an
available Windows update when the app starts. Alternatively, you can click Update button in
Version History on the latest release.
Homebrew Cask is the primary macOS installation:
brew tap screwys/tap
brew install --cask rufinYou can turn on Automatic updates in General preferences to have
Rufin install an available update when the app starts or manually click Update button in Version History on the latest release.
You can also download .dmg files directly from
GitHub Releases, but then you have to update manually.
Start by cloning the repository. You can build Rufin natively or use our Linux development container if you want to keep dependencies outside of your system and have Docker or Podman available.
git clone https://github.com/screwys/Rufin.git
cd Rufinjust container setup
just buildThis makes just commands go through the container development. If you want to build natively instead after running this one, use just container disable.
Building Rufin requires Rust 1.96 or newer, CMake 3.25 or newer, Ninja,
pkg-config, GTK 4.20 or newer, libadwaita 1.9 or newer, and GStreamer 1.26 or
newer. Packaging and translation checks additionally require msgfmt from gettext.
Arch Linux:
sudo pacman -S --needed \
base-devel rust cargo cmake ninja just pkgconf gettext gtk4 libadwaita \
gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad \
gst-plugins-ugly gst-libavFedora:
sudo dnf install \
rust cargo cmake ninja-build just pkgconf-pkg-config gettext gtk4-devel \
libadwaita-devel gstreamer1-devel gstreamer1-plugins-base-devel \
gstreamer1-plugins-base gstreamer1-plugins-good \
gstreamer1-plugins-bad-free gstreamer1-plugins-bad-free-extras \
gstreamer1-plugins-ugly-free gstreamer1-plugin-libavFor additional codecs, install the matching GStreamer plugins.
Windows: Windows builds run natively in the MSYS2 UCRT64 environment. From its Windows
UCRT64 terminal, use MSYS2's pacman.exe to install the build and packaging
dependencies:
ucrt=mingw-w64-ucrt-x86_64
pacman -S --needed base-devel git \
"$ucrt"-{adwaita-icon-theme,cmake,gdk-pixbuf2,gettext-runtime,gettext-tools} \
"$ucrt"-{gst-libav,gst-plugins-bad,gst-plugins-base,gst-plugins-good} \
"$ucrt"-{gst-plugins-ugly,gstreamer,gtk4,hicolor-icon-theme,libadwaita} \
"$ucrt"-{just,ninja,nsis,perl,pkgconf,rust,shared-mime-info,toolchain,wavpack}macOS:
brew install \
rust cmake just pkgconf gettext gtk4 libadwaita gstreamer \
librsvg game-music-emu libnice-gstreamer libopenmpt libsoup meson ninja openssl@3 wavpackBuilding: After you installed dependencies for your operating system, you can build and run:
just build
just debugLocal builds are shown as Rufin (Development) and use the isolated Rufin.Devel application
identity. The first macOS just debug or
just build automatically creates the persistent local Rufin Development signing identity on macOS. The first signing operation may ask for access to the certificate's private
key; Always Allow should keep this one-time.
On macOS, just build creates .local/artifacts/Rufin.Devel.dmg for installation and
platform behavior testing.
On Windows, just build creates the isolated versioned
.local/artifacts/Rufin.Devel-*-setup.exe installer.
Testing, Nix, and container controls are documented in CONTRIBUTING.md.
Open Troubleshooting from the main menu, enable Debug logging, reproduce the problem, then click Save. Crash logs also appear here on
the next launch. Logs have secrets and absolute folder paths redacted, but you may still want to review the logs before sharing them.
Or you can just run Rufin from the terminal:
flatpak run --env=RUST_LOG=debug io.github.screwys.Rufin 2>&1 # for flatpakRUST_LOG=debug rufin # for native packagesjust debug # for local buildYou can remove Rufin with your package manager, use the uninstaller included with the Windows
.exe (which can also delete the cache), or delete Rufin.app from Applications if you installed the macOS .dmg.
To delete all of Rufin’s local data, remove its directories for your operating system:
- Linux and FreeBSD (planned):
~/.cache/rufinand~/.local/share/rufin - Flatpak:
~/.var/app/io.github.screwys.Rufin/ - macOS:
~/Library/Caches/io.github.screwys.Rufinand~/Library/Application Support/io.github.screwys.Rufin - Windows:
%LOCALAPPDATA%\screwys\Rufin
To contribute code, please see CONTRIBUTING.md.
You can also contribute by translating the app on Weblate
Built with GTK 4, libadwaita, gtk-rs and GStreamer
Rufin is greatly influenced by Feishin, and a lot of design decisions are directly borrowed; as much we can achieve natively.
Player backend design and Smart Playlists are inspired from Strawberry (fork of Clementine).
Icon is designed by Commenter25 and it is licensed under CC-BY-SA-3.0.
- Estonian translation by Priit Jõerüüt
- Russian and Latvian translation by aguhadug
- German translation by sevachka
- Chezch translation by Jakub Cabal
- Chinese (Traditional) translation by Tsung-Ying Yu
- Finnish translation by Jiri Grönroos
- French translation by Arnaud Constantin
- Italian translation by Patrick Canal
If you would like to contribute financially, you can do so on Github, buymeacoffee or via bitcoin: bc1q4hmfnc64xsk2zprlw6d088kxkhv5xek8hmv87t
I would like to thank everyone who has made a donation:
gf3, aguhadug and 1 private sponsor
Footnotes
-
AAC and ALAC (including M4A/MP4), AIFF and WAV, APE, FLAC, TTA and WavPack, MP1/MP2/MP3 and Musepack, Ogg Vorbis/Opus/Speex, MKA and audio-only WebM, WMA/ASF, DSD, tracker modules such as MOD/XM/IT/S3M/MPTM, and emulated game music such as NSF/VGM. All supported packages have the required plugins. You may need additional GStreamer plugins if you are building Rufin natively; after installing them, restart Rufin and Resync the local library to retry rejected files. ↩








