- Replace the glob find for the .sig file with an explicit target-based
path ($matrix → src-tauri/target/<target>-apple-darwin/release/bundle/
macos/Psysonic.app.tar.gz.sig) and dump directory listings so we can
see what tauri-action actually leaves behind if the path is wrong
- Skip verify-nix while we iterate fast on signing + updater (its auto-
commits of flake.lock / npmDepsHash cause rebase friction on every
release)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
tauri-action on macOS cross-target builds produces the .app.tar.gz.sig
locally but silently skips its upload ("Signature not found for the
updater JSON. Skipping upload..."), which caused generate-manifest to
abort on v1.34.15 because the .sig asset was absent.
New step after tauri-action locates the .sig under src-tauri/target/*/
release/bundle/macos/ and uploads it as Psysonic_aarch64.app.tar.gz.sig
or Psysonic_x64.app.tar.gz.sig — the exact filenames generate-update-
manifest.js expects.
Also bumps version to 1.34.16.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- tauri-plugin-updater wired into lib.rs with pubkey + GitHub Releases
endpoint in tauri.conf.json; updater:default capability granted
- AppUpdater.tsx: on macOS, the download button now invokes the updater
plugin (check + downloadAndInstall) which downloads the signed
.app.tar.gz, verifies the minisign signature against the bundled
pubkey, replaces /Applications/Psysonic.app, and relaunches. Windows
and Linux keep the existing "download DMG/EXE/AppImage via reqwest
then point to the folder" flow
- CI: pass TAURI_SIGNING_PRIVATE_KEY + _PASSWORD to tauri-action so the
.sig files are produced alongside the update bundles
- New generate-manifest job (after build-macos-windows) runs
scripts/generate-update-manifest.js which downloads the .sig files
from the release, assembles latest.json for darwin-aarch64 and
darwin-x86_64, and uploads it back as a release asset
Windows will be added to latest.json once the Certum cert is active.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Wire up Developer ID Application certificate + App Store Connect API Key
to tauri-action on the macOS runner. Decodes the base64-encoded .p8 into
a file before the build, exports APPLE_API_KEY_PATH via $GITHUB_ENV, and
forwards the remaining credentials through the env block. Windows runner
receives the vars but tauri ignores them off-platform.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Wires cachix/cachix-action@v15 into the verify-nix job. The action
watches the nix store for the duration of the workflow and uploads
new paths to the `psysonic` cache on cachix.org automatically.
Using Cachix-managed signing (no signing key on our side) — Cachix
signs server-side with the cache's built-in keypair. End users will
pick up the public key automatically via `cachix use psysonic`, so
no manual nix.conf configuration is required.
Consequence: after the next `v*` release, `nix profile install
github:Psychotoxical/psysonic` pulls a prebuilt binary from Cachix
instead of recompiling Rust + npm deps locally.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Supersedes PR #203's out-of-tree upstream-src layout now that the Nix
build lives in the canonical repo. The flake treats `self` as the
source of truth — nothing in flake.nix or psysonic.nix needs a manual
version bump per release.
flake.nix
- `inputs.upstream-src` dropped; `src = self` throughout
- Dev shell retains the full WebKitGTK / GStreamer / AppIndicator
closure needed for tauri:dev on NixOS (Linux x86_64 + aarch64)
nix/psysonic.nix
- Version read from package.json (upstreamMeta.version removed)
- `srcClean` filter excludes node_modules / dist / target / .git /
result / .flatpak-builder
- `cargoDeps = rustPlatform.importCargoLock` with empty
`outputHashes` — sufficient for our local `[patch.crates-io]`
path overrides (cpal-0.15.3, symphonia-format-isomp4)
- Wraps the installed binary with LD_LIBRARY_PATH + GST_PLUGIN_PATH
+ GIO_EXTRA_MODULES + GDK_BACKEND=x11 + WebKit disable flags
nix/upstream-sources.json
- Reduced to `{ npmDepsHash }`. Placeholder for the initial commit;
the verify-nix job rewrites it on every release from the actual
`prefetch-npm-deps` output.
.github/workflows/release.yml
- New `verify-nix` job gated on `create-release` (same as the
Tauri builds). Checks out `main`, installs Nix, recomputes
`npmDepsHash`, refreshes `flake.lock`, runs
`nix build .#psysonic --no-link` as the sanity check, then
commits lock + hash updates back to `main` when they changed.
- The old standalone `upstream-release-nix.yml` is intentionally
not ported; its scheduled re-poll of the upstream release is
redundant now that the source lives here.
Tarball publishing and Cachix upload remain explicitly out of scope —
those ship in a follow-up workflow tied to the cache setup.
Required by symphonia-adapter-libopus which bundles and compiles
libopus from source via CMake.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- CI: add squashfs-tools dep, APPIMAGE_EXTRACT_AND_RUN=1, appimage to
--bundles, and *.AppImage to upload glob
- main.rs: set GDK_BACKEND=x11 and WEBKIT_DISABLE_COMPOSITING_MODE=1
on Linux before Tauri init — WebKitGTK on Wayland is unstable;
both vars are overridable by setting them before launch
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove tauri-plugin-updater, relaunch_after_update command, generate-update-
manifest.js, the generate-manifest CI job, and all signing/upload steps for
.sig files and latest.json. The updater plugin, its pubkey and endpoint config
in tauri.conf.json, and the updater:default capability are all gone.
Replace AppUpdater.tsx with a lightweight component that:
- Fetches https://api.github.com/repos/Psychotoxical/psysonic/releases/latest
after a 4 s delay (no install, no download, no progress bar)
- Shows a dismissible toast with two buttons:
GitHub → releases/latest
Website → https://psysonic.psychotoxic.eu/#downloads
i18n: remove updaterInstall/Downloading/Installing/Download/ExperimentalHint
keys from all 7 locales; add updaterWebsite; update updaterVersion wording.
CI: remove generate-manifest job and all .sig signing/upload steps from
build-macos-windows. Also remove TAURI_SIGNING_PRIVATE_KEY env vars (no
longer needed). Release now just builds and uploads the installable binaries.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
CSS: remove `font-weight` from transition list on `.fs-lyric-line` — it
triggers layout reflow on every animation frame when the active line changes.
Replaced with `transform: scaleX(1.015)` on `.fsl-active` (compositor-only).
Added `contain: layout style` to `.fs-lyrics-overlay` to isolate reflows.
Cargo.lock: update for thread-priority crate (added in previous audio commit).
CI: replace delete-asset workaround with `updaterJsonKeepUniversal: false`
to prevent tauri-action from uploading a latest.json with wrong signature.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Internet Radio full release (HTML5 engine, card UI, RadioDirectoryModal,
cover upload), Backup/Restore, Albums year filter, Statistics Library
Insights (playtime/genres/formats), Playlist cover upload, resizable
tracklist columns for Playlists & Favorites, crossfade fine control,
Settings Storage tab redesign, various fixes and UI polish.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
tauri-action uploads the .exe but doesn't create .nsis.zip/.sig because
the bundler doesn't pick up TAURI_SIGNING_PRIVATE_KEY automatically.
Added a PowerShell step that zips the exe, signs it via tauri signer,
and uploads .nsis.zip + .nsis.zip.sig — mirroring the macOS approach.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- fix: CI Windows NSIS upload — let tauri-action handle artifact upload directly
- fix: Linux/AUR ring linker error — cc + -fuse-ld=bfd via .cargo/config.toml
- fix: releases now created as draft for review before publishing
- chore: consolidate 1.27.0–1.27.2 changelog into single entry
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- fix: Radio from context menu passed artist name as ID to getSimilarSongs2 (closes#29)
- fix: CI Windows NSIS upload — tauri-action no longer searches missing bundle/msi/
- fix: Linux/AUR ring linker error — use cc instead of rust-lld via .cargo/config.toml
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
tauri-action already signs and uploads the .nsis.zip.sig when
TAURI_SIGNING_PRIVATE_KEY is set, so the manual find returns empty
and crashed with "a value is required for <FILE>". Exit 0 cleanly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New app icon across all platforms
- AUR package: Arch/CachyOS users can install via yay/paru
- AppImage removed: incompatible with non-Ubuntu distros due to
bundled WebKitGTK vs system Mesa/EGL conflicts
- CI: build only deb+rpm for Linux, drop GStreamer/linuxdeploy deps
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Switch Linux CI build from ubuntu-22.04 to ubuntu-24.04 — bundles
WebKitGTK 2.44 which uses eglGetPlatformDisplay instead of the
deprecated eglGetDisplay(EGL_DEFAULT_DISPLAY) that fails on Mesa 25.x
(CachyOS/Arch with RDNA 4 and other modern hardware)
- Add EGL_PLATFORM=x11 to AppRun as additional safeguard for XWayland
- Fix shell:allow-open capability missing URL scope (update toast link
was silently blocked by Tauri v2 without explicit allow-list)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add full search results page (/search?q=) with artist, album, song sections
- Fix search results column alignment (fixed-width Format column eliminates per-grid auto-sizing variance)
- Remove experimental gapless playback (caused song skipping and beginning cutoffs)
- Add known limitations to README and CHANGELOG (seeking, DnD reliability)
- Update GitHub Actions to Node.js 24 (checkout@v5, setup-node@v5)
- Add align-items: center to tracklist-header CSS
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>