Skip to content

Latest commit

 

History

2,567 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Rufin

Matrix License: GPL-3.0+ Rust 1.96+ GStreamer 1.26+
Flathub installs AUR version nixpkgs version Translate Rufin on Weblate

Rufin

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.


Rufin

📂 Sources

  •   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.

🎵 Playback

  • 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

📚 Library

  • 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_uri is 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 .csv files

✨ Rufin Connect

  • 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

🌍️ Discovery

  • 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

🧩 Integrations

  • 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

🛰️ Headless/Controller

  • Run release binaries without the desktop interface with rufin --headless; use cargo run -p rufin-controller for 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

🖥️ Interface

  • 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

Screenshots

Artist details Genres
Artist details Genres
Smart playlists Playback settings
Smart playlists Playback settings
Fullscreen player Visualizer settings
Fullscreen player Visualizer settings
Integrations Playlist settings
Integrations Playlist settings

Installation

Flatpak

Get it on Flathub

Fedora

Rufin is available for Fedora 44.

sudo dnf copr enable screwyy/rufin
sudo dnf install rufin

AUR

Latest binary releases:

yay -S rufin-bin

Building from the source:

yay -S rufin-git

Nix

Rufin is available in nixpkgs repository. To run Rufin without installing:

nix run nixpkgs#rufin

To add it to your profile:

nix profile install nixpkgs#rufin

You can also run main or an older release directly.

nix run github:screwys/Rufin/main
nix run github:screwys/Rufin/vX.Y.Z

Windows

Download 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.

macOS

Homebrew Cask is the primary macOS installation:

brew tap screwys/tap
brew install --cask rufin

You 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.

Building locally

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 Rufin

Development container

just container setup
just build

This makes just commands go through the container development. If you want to build natively instead after running this one, use just container disable.

Native build

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-libav

Fedora:

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-libav

For 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 wavpack

Building: After you installed dependencies for your operating system, you can build and run:

just build
just debug

Local 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.

Troubleshooting

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 flatpak
RUST_LOG=debug rufin # for native packages
just debug  # for local build

Uninstallation

You 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/rufin and ~/.local/share/rufin
  • Flatpak: ~/.var/app/io.github.screwys.Rufin/
  • macOS: ~/Library/Caches/io.github.screwys.Rufin and ~/Library/Application Support/io.github.screwys.Rufin
  • Windows: %LOCALAPPDATA%\screwys\Rufin

Contributing

To contribute code, please see CONTRIBUTING.md.

Translations

You can also contribute by translating the app on Weblate

Translation status

Credits

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.

Translation credits

  • 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

Donations

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:

Past Sponsors

gf3, aguhadug and 1 private sponsor

License

LICENSE

Footnotes

  1. 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. ↩

Releases

Sponsor this project

Packages

Used by

Contributors

Languages