Supersonic: a Go desktop client for Navidrome, Jellyfin and other self-hosted music servers
A lightweight and full-featured cross-platform desktop client for self-hosted music servers
At a glance
- What is it?
- Supersonic is a Fyne-based desktop player that speaks the Subsonic and Jellyfin APIs. It targets people who already run their own music server and want a native app instead of a browser tab.
- Who is it for?
- Adopt Supersonic if you already run Navidrome, Jellyfin, Gonic, LMS, Nextcloud Music, Ampache, Funkwhale, Supysonic or another Subsonic-compatible server and you want a native desktop player with MPV playback, gapless output and media key integration. Skip it if you need offline downloads, folder browsing or a mobile client: the README lists offline mode as eventually planned and iOS/Android as maybe eventually planned, and neither exists today.
- Can I use it commercially?
- Yes, with conditions. GPL-3.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
- Is it still maintained?
- Yes. The repository last received commits 3 days ago.
- What is it written in?
- Mainly Go, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 30, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What Supersonic solves for people running their own music server
Self-hosting a music library is the easy half. Navidrome, Jellyfin, Gonic, LMS, Nextcloud Music, Airsonic-Advanced, Ampache, Funkwhale and Supysonic all expose roughly the same catalog over HTTP, and each ships a web interface that is adequate for browsing and poor for listening. A web player lives in a tab, competes with every other tab for audio focus, and cannot talk to the operating system's media keys.
Supersonic is the other half. It is a desktop application that connects to any server implementing the Subsonic or OpenSubsonic API, or Jellyfin, and presents that catalog as a native window. The README describes it as a lightweight cross-platform desktop client for Subsonic and Jellyfin music servers, and the supported server list is explicitly partial: Navidrome, Jellyfin, Gonic, LMS, Nextcloud Music, Airsonic-Advanced, Ampache, Funkwhale and Supysonic.
The intended user is someone who has already made the decision to host their own library and now wants a client that behaves like a desktop music player rather than a web app. That framing matters, because Supersonic has no server of its own. It is a client, and everything it can show you depends on what the server's API exposes.
How the Go and Fyne architecture shapes what the app can do
The repository is a Go module, github.com/supersonic-app/supersonic, built on Go 1.24.0. The UI layer is fyne.io/fyne/v2, a cross-platform toolkit that renders its own widgets rather than wrapping native controls. That choice explains the cross-platform claim: one codebase produces the Linux, Windows and macOS builds, and the Makefile shows the packaging steps per target with fyne package -os darwin, -os windows and -os linux, all with the migrated_fynedo build tag.
Audio does not go through Fyne. The module depends on github.com/supersonic-app/go-mpv, a fork of the MPV bindings, and the README credits MPV for the gapless playback and the optional audio exclusive mode. MPV is also the reason the Linux distribution story is awkward: the .tar.xz builds require libmpv on the host, and the release page splits builds between libmpv1 and libmpv2.
Server communication is split across two client libraries in go.mod: github.com/supersonic-app/go-subsonic and github.com/dweymouth/go-jellyfin. Two separate API clients, not one abstraction over both, which is consistent with the README treating Jellyfin as a peer of the Subsonic family rather than a variant of it. Desktop integration comes from github.com/quarckster/go-mpris-server for Linux, and the README also names Windows SMTC and macOS media center integration. Credentials go through github.com/zalando/go-keyring, so passwords land in the platform keyring rather than a plain config file. Configuration is TOML, via github.com/pelletier/go-toml/v2, and the repository root carries a FyneApp.toml for the Fyne packaging metadata.
Installing Supersonic on Linux, Windows and macOS
The README links to platform-specific instructions and notes that in addition to the most recent stable release you can download the latest build from the main branch through the Actions tab, which requires being signed in to GitHub. If you prefer to build from source, BUILD.md holds the per-platform build instructions.
On Linux there are three routes. The AppImage on the latest release page bundles the MPV library, and the README lists ubuntu 22.04+, debian 12+ and fedora 42+ as tested. The .tar.xz builds do not bundle MPV, so libmpv must already be present, and you pick the build matching your distribution's major version. On apt-based systems the README gives this command:
sudo apt install libmpv1After libmpv is in place, extract the .tar.xz bundle and install it with make user-install for a per-user install or sudo make install for a system-wide one. The third route is the Flatpak from Flathub, and the README carries one warning about it: the Flatpak currently does not support CJK fonts because sandboxing breaks font lookup.
On macOS, Homebrew is the shortest path. The README gives these three commands, and the third is not optional:
brew tap supersonic-app/supersonic
brew install supersonic
xattr -r -d com.apple.quarantine /Applications/Supersonic.appThe xattr command clears the quarantine attribute. Supersonic is distributed without having been notarized, so macOS refuses to run it otherwise, and the README says to re-run that command when upgrading in future. Downloading the .app bundle from the Releases page works too, but it hits the same quarantine gate. On Windows you choose between the installer and a standalone zip that runs without a system installation.
First run is the same everywhere: add a server by entering its URL and credentials, and Supersonic reads the catalog from there. The README supports primary and alternate server hostnames, which is aimed at the common setup where an internal address works at home and an external one works elsewhere.
The features that justify a native client, and the ones that are still missing
The README's feature list is where the case for a desktop app is made. Gapless playback through MPV, with an optional audio exclusive mode. ReplayGain, with the caveat that it depends on files being tagged on the server. A waveform seekbar and a built-in 15-band graphic equalizer. MPRIS on Linux, SMTC on Windows and media center integration on macOS, which is what makes hardware media keys work. Scrobbling back to the server with configurable criteria. Multiple servers with switching between them. Download of songs, albums or playlists. Lyrics, internet radio for Subsonic servers, and casting to uPnP/DLNA devices.
The unchecked boxes are equally informative. Server jukebox control is planned. Browsing by folders is planned. Offline mode is eventually planned. iOS and Android support is maybe eventually planned. Those four items describe the shape of the gap: Supersonic is a networked desktop player, and it assumes the server is reachable. There is a download feature, but the README does not describe downloaded tracks as an offline library, and offline mode is listed separately as unbuilt.
Two other limitations come from the README rather than the feature list. Shuffle and repeat are marked partial, with the parenthetical listing shuffle album, playlist, artist radio and random songs, and repeat one/all. Artist radio depends on your server's support. ReplayGain depends on tags being present server-side. Both are cases where Supersonic is a thin layer over what the server already does, and both will behave differently against different backends.
Where Supersonic is the wrong tool
If your library exists only as local files, Supersonic cannot help. It has no local library scanner and no server component. Point it at nothing and it shows nothing.
If you listen mostly on a phone, the README's roadmap puts iOS and Android at maybe eventually planned, so the answer today is one of the mobile Subsonic clients instead. If you need music on a laptop with no network, offline mode is not built, and the download feature is not described in the README as a substitute for it.
If you organise your library by directory rather than by tags, browse by folders is still planned. And if you depend on CJK text rendering, the Flatpak is the wrong package specifically: the README states the Flatpak does not support CJK fonts because sandboxing breaks font lookup, which points you at the AppImage or the tarball instead.
There is also a platform risk worth naming. Fyne renders its own widgets, so the app will not look like a native GTK or Cocoa application, and the Makefile shows how much packaging work sits behind each platform: dylibbundler for macOS, a script to move a Python framework dependency into the bundle, and a codesign step. The Makefile itself calls the macOS dependency bundling a bit fragile because it assumes a specific location and version of the dependency.
Supersonic compared with a browser tab and with other Subsonic clients
The honest alternative for most self-hosters is the server's own web UI. Navidrome, Jellyfin and the rest ship one, it requires no installation, and it works from any machine with a browser. The difference in approach is not cosmetic. A web player has no MPRIS or SMTC integration, so media keys and desktop overlays do not apply. It cannot request audio exclusive mode, because that is an MPV capability the browser does not expose. It also cannot bundle an equalizer or a waveform seekbar in the same way.
Against other Subsonic desktop clients, the distinguishing choices here are MPV for playback and Fyne for the interface. MPV is what makes gapless playback and exclusive mode plausible rather than aspirational. Fyne is what makes one Go codebase cover three desktop platforms, at the cost of a UI that is drawn by the toolkit rather than by the platform. The dependency list makes the trade explicit: go-mpris-server for Linux media control, go-keyring for credential storage, and separate Subsonic and Jellyfin client libraries rather than a single unified backend.
Supersonic also supports OpenSubsonic, the extension to the Subsonic API, which matters because the README's server list spans projects that implement the base API to varying degrees. Features that depend on server extensions, such as artist radio, will work against some servers and not others.
Licence, release cadence and what upgrading costs
Supersonic is licensed GPL-3.0, and the LICENSE file sits at the repository root. For end users that changes nothing. For anyone embedding it, shipping a modified build, or linking it into a product, the GPL-3.0 obligations apply to distribution, and that is a question for your own legal review rather than for this article.
The project is not archived, and the last push to main was on 2026-09-28. Releases are frequent rather than ceremonial: v0.22.1 on 2026-08-09, v0.22.0 on 2026-07-13, v0.21.1 on 2026-04-05. The version numbers stay in the 0.x range, so the README's use of "latest stable release" is a label rather than a stability guarantee.
Upgrade cost is not uniform across platforms. On macOS the README says to re-run the xattr command after upgrading, because the notarization situation does not change between versions. On Linux, a tarball upgrade means re-checking which libmpv major version you installed against, since the builds are split. The Flatpak updates through Flathub and carries the CJK font limitation regardless of version. Windows users on the standalone zip replace the extracted directory. None of this is expensive, but the macOS step is easy to forget until the app refuses to launch.
Editorial conclusion
Adopt Supersonic if you already run Navidrome, Jellyfin, Gonic, LMS, Nextcloud Music, Ampache, Funkwhale, Supysonic or another Subsonic-compatible server and you want a native desktop player with MPV playback, gapless output and media key integration. Skip it if you need offline downloads, folder browsing or a mobile client: the README lists offline mode as eventually planned and iOS/Android as maybe eventually planned, and neither exists today. Before relying on it, confirm which libmpv major version your distribution ships, since the Linux tarball builds are split between libmpv1 and libmpv2, and check whether the Flatpak's missing CJK font support matters for your library.
Frequently asked questions
Which music servers does Supersonic support?
Any server implementing the Subsonic or OpenSubsonic API, or Jellyfin. The README gives a partial list: Navidrome, Jellyfin, Gonic, LMS, Nextcloud Music, Airsonic-Advanced, Ampache, Funkwhale and Supysonic.
How do I install Supersonic on macOS?
Install through the project's Homebrew tap with brew tap supersonic-app/supersonic followed by brew install supersonic, then run the xattr command from the README to clear the quarantine attribute. The README notes the app is distributed without notarization, so it will not run without that step, and says to re-run it after future upgrades.
Does Supersonic work offline?
No. The README lists offline mode as eventually planned, and it is unchecked. There is a download feature for songs, albums and playlists, but the README does not describe it as an offline library.
Why does the Supersonic Flatpak not show CJK characters?
The README states that the Flatpak package currently does not support CJK fonts because the sandboxing breaks font lookup. The AppImage and the .tar.xz builds are the alternatives on Linux.
What audio backend does Supersonic use?
MPV. The README credits MPV for the gapless playback and the optional audio exclusive mode, and go.mod depends on github.com/supersonic-app/go-mpv.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/supersonic-app-supersonic)