revert: roll back flatpak packaging experiment (#271 + follow-ups) (#297)

Reverts #271, #292, #293, #294, #295, #296.

The flatpak CI pipeline itself works end-to-end, but the installed bundle
surfaced three separate manifest issues during smoke-test on Wayland+NVIDIA:

1. GDK_BACKEND is not set, so without an X11 display in the sandbox GTK
   aborts with "Failed to initialize GTK".
2. libayatana-appindicator3 is not bundled in the GNOME 47 runtime, so
   libappindicator-sys panics the main thread.
3. The release binary is compiled via \`cargo build --release\` rather than
   \`cargo tauri build\`, so the \`custom-protocol\` feature is off and
   Tauri falls back to devUrl — the window opens but shows
   "Could not connect to localhost".

Rolling back so main stays on 1.43.0. A follow-up on the original PR
tracks the fixes needed before re-attempting.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Frank Stellmacher
2026-04-24 22:50:06 +02:00
committed by GitHub
parent dd947df0b9
commit 67d51a0975
11 changed files with 20 additions and 316 deletions
-79
View File
@@ -73,7 +73,6 @@ jobs:
build-macos-windows:
needs: create-release
if: false # TEMP: flatpak-only test run
permissions:
contents: write
strategy:
@@ -164,7 +163,6 @@ jobs:
generate-manifest:
needs: [create-release, build-macos-windows]
if: false # TEMP: flatpak-only test run
runs-on: ubuntu-24.04
permissions:
contents: write
@@ -184,7 +182,6 @@ jobs:
build-linux:
needs: create-release
if: false # TEMP: flatpak-only test run
permissions:
contents: write
runs-on: ubuntu-24.04
@@ -231,81 +228,6 @@ jobs:
\( -name "*.deb" -o -name "*.rpm" -o -name "*.AppImage" \) \
| xargs gh release upload "app-v${VERSION}" --clobber
build-flatpak:
needs: create-release
permissions:
contents: write
runs-on: ubuntu-24.04
container:
image: bilelmoussaoui/flatpak-github-actions:gnome-47
options: --privileged
steps:
- uses: actions/checkout@v5
# Container runs as root but the checkout is owned by the runner user;
# without this, any later `git` (including gh release upload's internal
# git probe) aborts with "dubious ownership".
- name: mark workspace as safe for git
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- name: install source-generation tools
run: |
dnf install -y python3-pip python3-aiohttp
pip3 install --break-system-packages tomlkit
- name: install flatpak-builder-tools
run: |
git clone --depth=1 \
https://github.com/flatpak/flatpak-builder-tools.git \
/tmp/flatpak-builder-tools
# cargo generator: still a single script
# node generator: now a proper Python package, install via pip
pip3 install --break-system-packages \
/tmp/flatpak-builder-tools/node
- name: generate cargo offline sources
run: |
python3 /tmp/flatpak-builder-tools/cargo/flatpak-cargo-generator.py \
src-tauri/Cargo.lock -o packages/flatpak/cargo-sources.json
- name: generate npm offline sources
run: |
flatpak-node-generator npm package-lock.json \
-o packages/flatpak/npm-sources.json
- name: patch manifest for this release
# The `app-v*` tag only materialises when the Draft release is published,
# so it is not a real git ref during CI. Use the triggering `v*` tag
# and its commit sha directly — both exist when the workflow runs.
env:
TRIGGER_TAG: ${{ github.ref_name }}
TRIGGER_SHA: ${{ github.sha }}
run: |
sed -i \
-e "s|tag: app-v.*|tag: ${TRIGGER_TAG}|" \
-e "s|commit: PLACEHOLDER_COMMIT|commit: ${TRIGGER_SHA}|" \
-e "s|VITE_LASTFM_API_KEY=__LASTFM_KEY__|VITE_LASTFM_API_KEY=${{ secrets.VITE_LASTFM_API_KEY }}|" \
-e "s|VITE_LASTFM_API_SECRET=__LASTFM_SECRET__|VITE_LASTFM_API_SECRET=${{ secrets.VITE_LASTFM_API_SECRET }}|" \
packages/flatpak/dev.psysonic.Psysonic.yml
- uses: flatpak/flatpak-github-actions/flatpak-builder@v6
with:
bundle: Psysonic_${{ needs.create-release.outputs.package_version }}.flatpak
manifest-path: packages/flatpak/dev.psysonic.Psysonic.yml
cache-key: flatpak-${{ github.sha }}
- name: install gh CLI
run: dnf install -y gh
- name: upload flatpak bundle to release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
VERSION=${{ needs.create-release.outputs.package_version }}
gh release upload "app-v${VERSION}" \
"Psysonic_${VERSION}.flatpak" \
--clobber
# Verifies that `nix build .#psysonic` still works against the current source,
# refreshes `nix/upstream-sources.json` (npmDepsHash) + `flake.lock`
# (nixpkgs pin), and pushes the resulting store paths to the public Cachix
@@ -315,7 +237,6 @@ jobs:
# The refreshed lock/hash files are committed back to `main` when they change.
verify-nix:
needs: create-release
if: false # TEMP: flatpak-only test run
runs-on: ubuntu-24.04
permissions:
contents: write
-4
View File
@@ -13,10 +13,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
>
> **📦 Version jump 1.34.x → 1.40.0:** The 1.34.x patch series was bumped a lot as each small feature landed. 1.40.0 consolidates the last few weeks of work — macOS signing + auto-updater, the Device-Sync overhaul, theme work and contrast audits — into a single coherent release. The next major bump (2.0.0) is planned once Windows code-signing + Windows auto-updater are active as well.
## [1.43.2]
test
## [1.43.0] - 2026-04-20
### Added
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "psysonic",
"version": "1.43.2",
"version": "1.43.0",
"private": true,
"scripts": {
"dev": "vite",
-4
View File
@@ -1,4 +0,0 @@
# Generated by flatpak-cargo-generator and flatpak-node-generator.
# Committed only in the Flathub mirror repo, not here.
cargo-sources.json
npm-sources.json
@@ -1,10 +0,0 @@
[Desktop Entry]
Name=Psysonic
Comment=Desktop music player for Subsonic API-compatible servers
Exec=psysonic
Icon=dev.psysonic.Psysonic
Terminal=false
Type=Application
Categories=AudioVideo;Audio;Music;Player;
StartupWMClass=psysonic
Keywords=music;player;subsonic;navidrome;streaming;
@@ -1,107 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>dev.psysonic.Psysonic</id>
<name>Psysonic</name>
<summary>Music player for Subsonic-compatible servers</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0-only</project_license>
<developer id="dev.psysonic">
<name>Psychotoxical</name>
</developer>
<description>
<p>
Psysonic is a desktop music player for Subsonic-compatible servers such as
Navidrome and Gonic. It connects to your self-hosted music library and lets
you stream your collection from anywhere.
</p>
<p>Features:</p>
<ul>
<li>Gapless playback with a native Rust audio engine</li>
<li>Fullscreen ambient player with album art backdrop</li>
<li>Synced and plain lyrics via LRCLIB and YouLy+</li>
<li>Scrobbling to Last.fm</li>
<li>Discord Rich Presence integration</li>
<li>MPRIS media controls and global shortcuts</li>
<li>Multiple server profiles</li>
<li>Catppuccin-themed UI with glassmorphism effects</li>
<li>Play queue management with drag-and-drop</li>
</ul>
</description>
<launchable type="desktop-id">dev.psysonic.Psysonic.desktop</launchable>
<url type="homepage">https://github.com/Psychotoxical/psysonic</url>
<url type="bugtracker">https://github.com/Psychotoxical/psysonic/issues</url>
<url type="donation">https://ko-fi.com/psychotoxic</url>
<url type="vcs-browser">https://github.com/Psychotoxical/psysonic</url>
<categories>
<category>AudioVideo</category>
<category>Audio</category>
<category>Music</category>
<category>Player</category>
</categories>
<keywords>
<keyword>music</keyword>
<keyword>player</keyword>
<keyword>subsonic</keyword>
<keyword>navidrome</keyword>
<keyword>gonic</keyword>
<keyword>streaming</keyword>
<keyword>self-hosted</keyword>
</keywords>
<!-- OARS 1.1 — music streaming player, no objectionable content generated by the app.
social-info:mild covers Last.fm scrobbling and Discord Rich Presence. -->
<content_rating type="oars-1.1">
<content_attribute id="social-info">mild</content_attribute>
</content_rating>
<recommends>
<display_length compare="ge">768</display_length>
<control>keyboard</control>
<control>pointing</control>
</recommends>
<supports>
<internet>always</internet>
</supports>
<!-- Screenshots: replace placeholders with real 16:9 screenshots (no window
decorations) before submitting to Flathub. At least 3 are required. -->
<screenshots>
<screenshot type="default">
<caption>Main player view with album art and play queue</caption>
<image type="source" width="1600" height="900">https://raw.githubusercontent.com/Psychotoxical/psysonic/main/assets/screenshots/main.png</image>
</screenshot>
<screenshot>
<caption>Fullscreen ambient player</caption>
<image type="source" width="1600" height="900">https://raw.githubusercontent.com/Psychotoxical/psysonic/main/assets/screenshots/fullscreen.png</image>
</screenshot>
<screenshot>
<caption>Settings — server profiles and appearance</caption>
<image type="source" width="1600" height="900">https://raw.githubusercontent.com/Psychotoxical/psysonic/main/assets/screenshots/settings.png</image>
</screenshot>
</screenshots>
<releases>
<release version="1.43.0" date="2026-04-20">
<url type="details">https://github.com/Psychotoxical/psysonic/releases/tag/app-v1.43.0</url>
<description>
<p>Added user management for Navidrome admins, seekable HTTP streaming,
mini player improvements, floating player bar, NVIDIA DMA-BUF auto-disable,
and smoother lyrics scroll animation.</p>
</description>
</release>
<release version="1.42.1" date="2026-04-19">
<url type="details">https://github.com/Psychotoxical/psysonic/releases/tag/app-v1.42.1</url>
<description>
<p>Critical fix: mini player no longer hangs the app on Windows. Added
optional "Preload mini player" setting on Linux and macOS.</p>
</description>
</release>
</releases>
</component>
@@ -1,89 +0,0 @@
app-id: dev.psysonic.Psysonic
runtime: org.gnome.Platform
runtime-version: '47'
sdk: org.gnome.Sdk
sdk-extensions:
- org.freedesktop.Sdk.Extension.rust-stable
- org.freedesktop.Sdk.Extension.node20
command: psysonic
separate-locales: false
finish-args:
# Network: Subsonic server, Last.fm, Discord RPC, LRCLIB, Bandsintown
- --share=network
- --share=ipc
# Display
- --socket=wayland
- --socket=fallback-x11
# Audio: PulseAudio + ALSA, USB DACs (UMC202HD etc.)
- --socket=pulseaudio
- --device=all
# D-Bus: MPRIS, Discord RPC, tray icon
- --socket=session-bus
- --talk-name=org.mpris.MediaPlayer2.*
- --own-name=org.mpris.MediaPlayer2.psysonic
- --talk-name=com.discordapp.*
# Discord RPC unix socket lives in $XDG_RUNTIME_DIR
- --filesystem=xdg-run/discord-ipc-0:ro
- --filesystem=xdg-run/discord-ipc-1:ro
- --filesystem=xdg-run/discord-ipc-2:ro
- --filesystem=xdg-run/discord-ipc-3:ro
- --filesystem=xdg-run/discord-ipc-4:ro
# Tray icon (GNOME needs AppIndicator extension installed)
- --talk-name=org.kde.StatusNotifierWatcher
- --talk-name=org.freedesktop.Notifications
# Local music library (read-only, for future local-file playback)
- --filesystem=xdg-music:ro
build-options:
append-path: /usr/lib/sdk/rust-stable/bin:/usr/lib/sdk/node20/bin
env:
- CARGO_HOME=/run/build/psysonic/cargo
- CARGO_NET_OFFLINE=true
- RUSTUP_TOOLCHAIN=stable
modules:
- name: psysonic
buildsystem: simple
build-options:
env:
# Disables the in-app updater UI — Flathub owns updates for Flatpak installs
- VITE_PSYSONIC_FLATPAK=1
# Prevents tauri-build from checking whether the Vite dev server is running
- TAURI_SKIP_DEVSERVER_CHECK=true
# Last.fm API keys — replaced with real values by the CI job at build time
- VITE_LASTFM_API_KEY=__LASTFM_KEY__
- VITE_LASTFM_API_SECRET=__LASTFM_SECRET__
# npm offline cache — flatpak-node-generator places sources in flatpak-node/npm-cache
- npm_config_cache=/run/build/psysonic/flatpak-node/npm-cache
build-commands:
# Install npm dependencies from pre-generated offline sources
- npm ci --offline
# Build frontend (dist/ must exist before cargo compiles the Rust crate,
# because tauri-build embeds the assets at compile time)
- npm run build
# Build the Rust binary (offline, using pre-vendored cargo sources)
- cargo build --manifest-path src-tauri/Cargo.toml --release
# Install binary and assets
- install -Dm755 src-tauri/target/release/psysonic "${FLATPAK_DEST}/bin/psysonic"
- install -Dm644 dev.psysonic.Psysonic.desktop "${FLATPAK_DEST}/share/applications/dev.psysonic.Psysonic.desktop"
- install -Dm644 dev.psysonic.Psysonic.metainfo.xml "${FLATPAK_DEST}/share/metainfo/dev.psysonic.Psysonic.metainfo.xml"
- install -Dm644 src-tauri/icons/32x32.png "${FLATPAK_DEST}/share/icons/hicolor/32x32/apps/dev.psysonic.Psysonic.png"
- install -Dm644 src-tauri/icons/128x128.png "${FLATPAK_DEST}/share/icons/hicolor/128x128/apps/dev.psysonic.Psysonic.png"
- install -Dm644 src-tauri/icons/128x128@2x.png "${FLATPAK_DEST}/share/icons/hicolor/256x256/apps/dev.psysonic.Psysonic.png"
- install -Dm644 src-tauri/icons/icon.png "${FLATPAK_DEST}/share/icons/hicolor/512x512/apps/dev.psysonic.Psysonic.png"
sources:
- type: git
url: https://github.com/Psychotoxical/psysonic.git
# Updated automatically by the CI release job; bump manually for local builds
tag: app-v1.43.0
commit: PLACEHOLDER_COMMIT
# Generated by the CI job via flatpak-cargo-generator and flatpak-node-generator.
# Committed into git only for the Flathub mirror repo (separate from this source
# repo); locally, run packages/flatpak/generate-sources.sh to create them.
- cargo-sources.json
- npm-sources.json
- type: file
path: dev.psysonic.Psysonic.desktop
- type: file
path: dev.psysonic.Psysonic.metainfo.xml
+17 -17
View File
@@ -547,9 +547,9 @@ dependencies = [
[[package]]
name = "cc"
version = "1.2.61"
version = "1.2.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d"
checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20"
dependencies = [
"find-msvc-tools",
"jobserver",
@@ -952,9 +952,9 @@ checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f"
[[package]]
name = "data-encoding"
version = "2.11.0"
version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8"
checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea"
[[package]]
name = "deranged"
@@ -2506,9 +2506,9 @@ dependencies = [
[[package]]
name = "libc"
version = "0.2.186"
version = "0.2.185"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f"
[[package]]
name = "libloading"
@@ -3653,7 +3653,7 @@ dependencies = [
[[package]]
name = "psysonic"
version = "1.43.2"
version = "1.43.0"
dependencies = [
"biquad",
"discord-rich-presence",
@@ -4173,9 +4173,9 @@ dependencies = [
[[package]]
name = "rustls"
version = "0.23.39"
version = "0.23.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c2c118cb077cca2822033836dfb1b975355dfb784b5e8da48f7b6c5db74e60e"
checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21"
dependencies = [
"once_cell",
"ring",
@@ -4199,9 +4199,9 @@ dependencies = [
[[package]]
name = "rustls-pki-types"
version = "1.14.1"
version = "1.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9"
checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd"
dependencies = [
"web-time",
"zeroize",
@@ -4236,9 +4236,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
[[package]]
name = "rustls-webpki"
version = "0.103.13"
version = "0.103.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06"
dependencies = [
"ring",
"rustls-pki-types",
@@ -5841,7 +5841,7 @@ dependencies = [
"indexmap 2.14.0",
"toml_datetime 1.1.1+spec-1.1.0",
"toml_parser",
"winnow 1.0.2",
"winnow 1.0.1",
]
[[package]]
@@ -5850,7 +5850,7 @@ version = "1.1.2+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
dependencies = [
"winnow 1.0.2",
"winnow 1.0.1",
]
[[package]]
@@ -7113,9 +7113,9 @@ dependencies = [
[[package]]
name = "winnow"
version = "1.0.2"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0"
checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5"
dependencies = [
"memchr",
]
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "psysonic"
version = "1.43.2"
version = "1.43.0"
description = "Psysonic Desktop Music Player"
authors = []
license = ""
+1 -1
View File
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Psysonic",
"version": "1.43.2",
"version": "1.43.0",
"identifier": "dev.psysonic.player",
"build": {
"beforeDevCommand": "npm run dev",
-3
View File
@@ -94,9 +94,6 @@ function pickAsset(assets: GithubAsset[]): GithubAsset | undefined {
type DlState = 'idle' | 'downloading' | 'done' | 'error';
export default function AppUpdater() {
// Flathub manages updates for Flatpak installs — updater UI must not appear
if (import.meta.env.VITE_PSYSONIC_FLATPAK === '1') return null;
const { t } = useTranslation();
const [release, setRelease] = useState<ReleaseData | null>(null);
const [dismissed, setDismissed] = useState(false);