Summary
Psysonic currently ships Linux builds as .deb, .rpm, and .AppImage (plus the AUR recipe for Arch users). What's still missing is a Flatpak / Flathub presence — the single biggest discoverability channel on the Linux desktop, and the only sane install path on immutable distros.
This issue tracks introducing a Flatpak release, publishing it to Flathub, and wiring the maintenance into our existing release flow.
Motivation
- Flathub is the de facto cross-distro app store for Linux desktops.
.deb / .rpm / AUR / AppImage cover the "I know what I want" crowd; Flathub is where users discover apps.
- Sandboxing is a real user-facing benefit for a network-facing desktop app (Subsonic credentials, arbitrary server URLs, LRCLIB / Last.fm / Discord / Bandsintown integrations).
- Immutable distros (Fedora Silverblue, Bazzite, Aurora, Bluefin, SteamOS / Steam Deck Desktop Mode, Endless OS) cannot install
.deb / .rpm / AUR packages cleanly, and .AppImage works but is second-class there — Flatpak is the native option.
- Auto-updates via Flathub come for free for end users; we do not need to ship our own updater logic inside the Flatpak (and in fact must not — see below).
Scope
1. Manifest + build
2. Auto-updater interaction
3. CI / release pipeline
4. Flathub submission
5. Post-release maintenance
Open questions
- Do we want an
org.freedesktop.Sdk.Extension.rust-stable pinned version, or latest? Pinning gives reproducibility; latest tracks upstream. Flathub reviewers generally prefer pinned.
- Beta channel: Flathub supports
stable + beta branches. Worth it, or is the GitHub Releases page (where .AppImage already lives) enough for beta testers?
- i18n: AppStream
<description> can be localized per-locale. We already have 8 locales — worth translating the store listing, or ship English-only at first?
Non-goals
- Snap package — separate can of worms (snapd-confinement, Canonical-hosted store). Out of scope here.
- AppImage changes — already shipping from
release.yml, no work needed here.
References
Summary
Psysonic currently ships Linux builds as
.deb,.rpm, and.AppImage(plus the AUR recipe for Arch users). What's still missing is a Flatpak / Flathub presence — the single biggest discoverability channel on the Linux desktop, and the only sane install path on immutable distros.This issue tracks introducing a Flatpak release, publishing it to Flathub, and wiring the maintenance into our existing release flow.
Motivation
.deb/.rpm/ AUR / AppImage cover the "I know what I want" crowd; Flathub is where users discover apps..deb/.rpm/ AUR packages cleanly, and.AppImageworks but is second-class there — Flatpak is the native option.Scope
1. Manifest + build
packages/flatpak/directory alongsidepackages/aur/containing:app.psysonic.Psysonic.yaml(or.json) — Flatpak manifestapp.psysonic.Psysonic.desktop— desktop entry (reuse existing)app.psysonic.Psysonic.metainfo.xml— AppStream metadata (required by Flathub, includes screenshots, release notes, content rating)org.freedesktop.Platform23.08 or 24.08 with therust-stableSDK extension and thenodeSDK extension (we need both to build the Tauri bundle inside the Flatpak sandbox).cmakebuild-time dep (symphonia-adapter-libopusbundles libopus) — the Freedesktop SDK already ships cmake, so this should be a no-op, but verify..deb/.rpmstory on newer distros.--share=network(Subsonic / Last.fm / Discord RPC / LRCLIB / Bandsintown)--socket=pulseaudio+--device=all(audio engine, output device selection, USB DACs like UMC202HD)--socket=wayland+--socket=fallback-x11--socket=session-bus+--talk-name=org.mpris.MediaPlayer2.*(MPRIS)--talk-name=com.discordapp.*+--filesystem=xdg-run/discord-ipc-*:ro(Discord RPC via unix socket in$XDG_RUNTIME_DIR)--filesystem=xdg-music:ro(optional, for local-file playback if/when we add it)tauri-plugin-single-instanceuses a lockfile under$XDG_RUNTIME_DIR— should Just Work inside Flatpak, verify.TrayIconBuilderflow works under Flatpak — StatusNotifierItem needs--talk-name=org.kde.StatusNotifierWatcherand the host must run a tray (GNOME needs the AppIndicator extension).2. Auto-updater interaction
AppUpdater.tsxbehind an env var (e.g.PSYSONIC_FLATPAK=1set in the manifest) or a Cargo feature.3. CI / release pipeline
.github/workflows/release.ymlthat builds the Flatpak onv*tag push, usingflatpak-builderinside a container. Sits alongside the existing deb/rpm/AppImage job..flatpakbundle as a GitHub release asset (convenient for sideload testing before Flathub approval, and useful long-term for users who want to install without adding the Flathub remote).flathub/app.psysonic.Psysonic(separate repo under the Flathub org). Our in-repopackages/flatpak/manifest stays as the source of truth and gets mirrored on release — same pattern as AUR.CLAUDE.md's "Release-Prozess" alongside the existing AUR steps.4. Flathub submission
flathub/flathubwith the manifest.noneon everything), supported form factors (desktop).flathub.jsononce merged (optional but nice — gives the green checkmark).5. Post-release maintenance
cargo-sources.json+npm-sources.jsonlock files generated byflatpak-builder-tools(flatpak-cargo-generator,flatpak-node-generator).Open questions
org.freedesktop.Sdk.Extension.rust-stablepinned version, orlatest? Pinning gives reproducibility;latesttracks upstream. Flathub reviewers generally prefer pinned.stable+betabranches. Worth it, or is the GitHub Releases page (where.AppImagealready lives) enough for beta testers?<description>can be localized per-locale. We already have 8 locales — worth translating the store listing, or ship English-only at first?Non-goals
release.yml, no work needed here.References
flatpak-builder-tools(cargo + node generators): https://github.com/flatpak/flatpak-builder-tools