Smooth, fast, simple. Forever.
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.
- 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
![]() Home |
![]() Artist page |
![]() Search |
![]() Settings & themes |
- Install Firmium for your distribution (see Install below)
- Open the app and enter your OpenSubsonic server URL (e.g.
http://your-navidrome-server:4533) - Enter your username and password — credentials are saved securely to your OS keyring
That's it. Your library will load automatically.
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.
Or download the latest .apk from the releases page and install it manually:
# Via ADB (sideloading):
adb install firmium_*.apkOr 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.
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:
- Install Firmium on your phone (above).
- 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.
- 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.
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 libxcb1Fedora
sudo dnf install -y webkit2gtk4.1 alsa-lib openssl-libs libsecret libxdo libxcbArch Linux
sudo pacman -S --needed webkit2gtk-4.1 alsa-lib openssl libsecret xdotool libxcbFirmium 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 -lto verify audio devices are visible.
Arch Linuxyay -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 sudo dpkg -i ./firmium_*.deb |
|
- 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
# Clone the repository
git clone https://github.com/fossisawesome/firmium.git
cd firmium
# Run the app (debug build)
cargo runFor an optimized release build:
cargo build --releaseThis produces a single self-contained binary at target/release/firmium.
The Android app is a native Kotlin + Jetpack Compose app in the android/ directory, built with Gradle independently of the desktop iced project.
- JDK 17 or later
- Android SDK with build tools 35 (install via Android Studio or
sdkmanager) ANDROID_HOMEenvironment variable set
cd android
# Development build
./gradlew assembleDebug
# Install debug build on connected device / emulator
./gradlew installDebug
# Release APK (requires signing env vars — see below)
./gradlew assembleReleaseThe 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-passwordIf these are not set, Gradle will build an unsigned APK.
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.
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 valueIf 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).
Bug reports, feature requests, and pull requests are welcome - open an issue or PR on GitHub.




