Skip to content

fossisawesome/firmium

Repository files navigation

Firmium logo

Firmium

Smooth, fast, simple. Forever.

Latest release AUR version License: GPL-3.0 Sponsor on GitHub Discord


Firmium homepage


Firmium is a cross-platform OpenSubsonic music streaming client targeting Linux desktop, Windows and Android. The desktop app is a native iced (Rust) application; Android is native Kotlin/Compose. It connects to any OpenSubsonic-compatible server — such as Navidrome — and provides lightweight, low-latency audio playback using the native OS audio engine.

Note: Firmium is a client only — you need a self-hosted OpenSubsonic-compatible server to use it. Navidrome is the most popular choice and is free and open source.

Features

  • Gapless & crossfade playback — next track preloads silently; configurable 1–12 s crossfade
  • Equalizer — 10-band graphic and parametric modes, saveable profiles, per-device assignment
  • Synced lyrics — LRC line highlighting, word-by-word karaoke animation, LRCLIB fallback
  • Smart radio & mixes — Start Radio from any track/album/artist; generate queues by BPM/genre; auto-continues after queue ends
  • Audio visualizer — Orb, Bars, and Oscilloscope modes, colors pulled from cover art
  • Offline library — download tracks or full albums, plays local copy automatically when available
  • Cross-device queue sync — resume exactly where you left off on any device
  • ReplayGain normalization and bit-perfect audio mode (desktop)
  • 18+ color themes including Gruvbox, Tokyo Night, Dracula, Catppuccin, and more — plus custom TOML themes (desktop)
  • Listening stats & Recap — local play history with swipeable Recap cards (top tracks, artists, genres, streaks) across custom date ranges; export as CSV or JSON
  • Android Auto & Wear OS — full library browsing, voice search, and transport controls in the car and on your wrist
  • Credentials in OS keyring — never stored as plaintext; supports multiple saved servers
  • Scrobbling — Last.fm (via server) and ListenBrainz

Gallery

Homepage
Home
Artist page
Artist page
Search
Search
Settings
Settings & themes

Getting Started

  1. Install Firmium for your distribution (see Install below)
  2. Open the app and enter your OpenSubsonic server URL (e.g. http://your-navidrome-server:4533)
  3. Enter your username and password — credentials are saved securely to your OS keyring

That's it. Your library will load automatically.

Install

Firmium is available for Linux desktop and Android.

Compatibility (Linux): Tested on Hyprland (Wayland). Other desktop environments should work but are not officially tested. X11 is untested.

Android

Get it on Obtainium

Or download the latest .apk from the releases page and install it manually:

# Via ADB (sideloading):
adb install firmium_*.apk

Or transfer the APK to your device and open it with a file manager. You may need to enable Install from unknown sources in your device settings.

Note: Firmium for Android requires Android 8.0 (API 26) or later.

Using Android Auto

Firmium supports Android Auto, so you can browse your library and play music from your car's display. Installing the APK alone is not enough, though: because Firmium is sideloaded rather than installed from the Google Play Store, Android Auto hides it by default. To use it in your car, allow it once:

  1. Install Firmium on your phone (above).
  2. Open the Android Auto settings on your phone, scroll to the bottom and tap Version about ten times to unlock Developer settings, then turn on Unknown sources.
  3. Connect your phone to the car and choose Firmium from the car's app launcher.

The "Unknown sources" step is required only because Firmium is not distributed through the Play Store; it would not be needed for a Play Store release approved for Android Auto. See the Android Auto guide for browsing, voice control, and more.

System Dependencies

Before running Firmium, install the required system libraries for your distribution.

Debian / Ubuntu
sudo apt update && sudo apt install -y libwebkit2gtk-4.1-0 libasound2 libssl3 libsecret-1-0 libxdo3 libxcb1
Fedora
sudo dnf install -y webkit2gtk4.1 alsa-lib openssl-libs libsecret libxdo libxcb
Arch Linux
sudo pacman -S --needed webkit2gtk-4.1 alsa-lib openssl libsecret xdotool libxcb

Firmium also requires:

  • A Secret Service provider (GNOME Keyring or KWallet) for credential storage — included in most desktop environments. Without it, passwords won't be saved and you'll need to log in every launch.
  • PipeWire or PulseAudio — on modern distros ALSA routes through one of these. Run aplay -l to verify audio devices are visible.

Installing the App

Arch Linux
yay -S firmium-desktop-bin # or paru -S firmium-desktop-bin
Fedora (COPR)
sudo dnf copr enable fossisawesome/Firmium
sudo dnf install firmium
Debian / Ubuntu / other

Download the .deb from the releases page, then:

sudo dpkg -i ./firmium_*.deb

Building from Source

Prerequisites

  • Rust 1.80 or later (rustup default stable)
  • System dependencies for your distribution (see System Dependencies above) — ALSA, GTK 3, libsecret, and a Vulkan/OpenGL driver

Steps

# Clone the repository
git clone https://github.com/fossisawesome/firmium.git
cd firmium

# Run the app (debug build)
cargo run

For an optimized release build:

cargo build --release

This produces a single self-contained binary at target/release/firmium.

Building for Android

The Android app is a native Kotlin + Jetpack Compose app in the android/ directory, built with Gradle independently of the desktop iced project.

Additional Prerequisites

  • JDK 17 or later
  • Android SDK with build tools 35 (install via Android Studio or sdkmanager)
  • ANDROID_HOME environment variable set

Steps

cd android

# Development build
./gradlew assembleDebug

# Install debug build on connected device / emulator
./gradlew installDebug

# Release APK (requires signing env vars — see below)
./gradlew assembleRelease

The release APK is output to android/app/build/outputs/apk/release/.

To sign the release build, set these environment variables before running assembleRelease:

export ANDROID_SIGNING_KEY_PATH=/path/to/your.keystore
export ANDROID_SIGNING_KEY_ALIAS=your-key-alias
export ANDROID_SIGNING_STORE_PASSWORD=store-password
export ANDROID_SIGNING_KEY_PASSWORD=key-password

If these are not set, Gradle will build an unsigned APK.

Troubleshooting (Android)

App installed but won't open Ensure your device runs Android 8.0 (API 26) or later. If you sideloaded the APK, confirm you have allowed installs from unknown sources.

Playback notification doesn't appear Grant Firmium the Notifications permission in your device's app settings. On Android 13+, this permission must be granted explicitly.

Credentials lost after reinstall Credential storage is tied to the app's Android Keystore entry. A full uninstall clears the keys — you'll need to log in again after reinstalling.

No audio through Bluetooth / certain output devices ExoPlayer routes audio through the Android audio system. If a specific output device isn't working, check that it is selected as the active output in your system's audio settings.

Troubleshooting (Linux)

App launches but credentials aren't saved / login fails every restart Your system's Secret Service daemon isn't running or isn't unlocked. On GNOME, ensure GNOME Keyring is started. On KDE, ensure KWallet is enabled and unlocked. You can test with:

secret-tool store --label='test' key value

If that fails, your keyring isn't running.

No audio output Check that ALSA or PipeWire/PulseWire is set up correctly. Run aplay -l to list audio devices.

Blank window or app won't start (Wayland) Try forcing XWayland: WAYLAND_DISPLAY= ./firmium or set GDK_BACKEND=x11 before launching.

Server connection refused Make sure your server URL includes the port (e.g. http://192.168.1.10:4533) and that Firmium can reach it on your network. Check your server's logs if the URL looks correct.

Bit-perfect Audio doesn't seem to change the output rate On PipeWire systems, the app stream can open at the track's native sample rate while the ALSA sink itself stays locked at a fixed rate (commonly 48000Hz), so PipeWire resamples before the signal reaches the DAC. Check with pw-top during playback — if the alsa_output sink row doesn't match your track's sample rate, add a default.clock.allowed-rates list (e.g. [ 44100 48000 88200 96000 176400 192000 ]) to ~/.config/pipewire/pipewire.conf.d/, then restart PipeWire (systemctl --user restart pipewire pipewire-pulse wireplumber).

Contributing

Bug reports, feature requests, and pull requests are welcome - open an issue or PR on GitHub.

License

GPL-3.0 - see LICENSE for the full text.

Sponsor this project

 

Contributors