Commit Graph
129 Commits
Author SHA1 Message Date
vicrodh efa486ba4f feat(packaging+log): standalone qbzd packages, IP masking in logs
- nfpm-qbzd.yaml (deb/rpm, libasound-only dep) + release workflows build
  the standalone qbzd packages per arch; dual dispatch to the future
  qbz-rpm repo (continue-on-error until token scope lands).
- Gentoo overlay templates: qbzd (source build) + qbzd-bin (tarball
  repack) with systemd user unit + completions.
- Log redaction layer 3: IPv4 -> *.*.*.<last>, IPv6 -> *:*:<last>, with
  version/timestamp false-positive guards (qbz-log 10/10 tests).

km
2026-07-25 12:05:56 -06:00
vicrodh 93ae499f38 ci(release): install jack headers for the build-qbzd jobs
qbzd pulls qbz-audio whose jack-sys build script requires jack.pc; the
desktop build job already installs libjack-jackd2-dev, the new qbzd jobs
did not.

cc
2026-07-23 14:00:23 -06:00
vicrodh c7070241a4 ci(apt): trigger the apt repo update from the aarch64 workflow too (#648)
The x86_64 workflow fires the repository-dispatch minutes after its own
publish, while the native arm64 build is still running — so qbz-apt's
update-repo downloaded the Release assets when only the amd64 .deb existed.
The arm64 .deb landed hours later with nothing re-indexing, leaving the
apt arm64 tree stuck at 1.2.15 (verified: QBZ_*_arm64.deb IS on the 2.0.x
releases). update-repo is idempotent (re-downloads every *.deb, rebuilds
both indices), so the second dispatch completes whichever arch the first
one missed, in either finish order.

km
2026-07-21 12:29:26 -06:00
vicrodh c15c71449a chore(deps): bump actions/github-script from 7 to 9
cc
2026-07-17 20:14:33 -06:00
vicrodh 6620dd769b chore(deps): bump actions/upload-artifact from 4 to 7
cc
2026-07-17 20:14:25 -06:00
vicrodh 0692048833 chore(deps): bump actions/download-artifact from 4 to 8
cc
2026-07-17 20:14:18 -06:00
vicrodh 0f829ab62f chore(deps): bump actions/checkout from 4 to 7
cc
2026-07-17 20:14:06 -06:00
vicrodh 601188a2c0 ci: build qbzd on ubuntu-22.04 with slint-free and glibc-floor gates
cc
2026-07-14 21:12:21 -06:00
vicrodh 39eb12fc45 feat(packaging): ship qbzd binary and user unit in deb/rpm and tarball
cc
2026-07-14 21:02:34 -06:00
vicrodh 02c2dba68d feat(qbzd): scaffold slint-free qbzd crate with clap verb tree and CI gate
IV6 build peak: 795 MB max RSS (summed across the cargo-capped build's
process tree via /proc VmRSS polling; /usr/bin/time -v is not installed
on this box). aws-lc-rs in graph: 0 (single rustls provider: ring
v0.17.14 throughout).

cc
2026-07-14 12:53:09 -06:00
vicrodh 957ac6503a merge: 2.0.2 fixes into pre-release
Kiosk polish + volume fluidity + playlist drag-reorder + quality badge, and
issue fixes: #491/#519 album/artist header, #534 snap audio, #573 plex sync,
#578 gpu tier, #588 trackpad scroll, #588/#590 quality, #591/#592 pipewire.

cc
2026-07-13 09:40:53 -06:00
dependabot[bot] 144428ed89 chore(deps): bump softprops/action-gh-release from 2 to 3 (#577)
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 00:39:52 -06:00
dependabot[bot] caa9a682ef chore(deps): bump peter-evans/repository-dispatch from 3 to 4 (#576)
Bumps [peter-evans/repository-dispatch](https://github.com/peter-evans/repository-dispatch) from 3 to 4.
- [Release notes](https://github.com/peter-evans/repository-dispatch/releases)
- [Commits](https://github.com/peter-evans/repository-dispatch/compare/v3...v4)

---
updated-dependencies:
- dependency-name: peter-evans/repository-dispatch
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-13 00:39:49 -06:00
vicrodh e369f4bb3a chore(issue-template): require a logs checklist on bug reports
Adds a prominent 'bug reports need logs' banner and a required pre-flight checklist (attach logs or explain why not, searched duplicates, included repro steps). Without logs most reports stall on needs-info.

cc
2026-07-12 20:17:12 -06:00
Victor RH 9352a498a7 Merge pull request #574 from afonsojramos/ci/test-crates
ci: add test-crates workflow for workspace unit tests
2026-07-12 19:39:44 -06:00
vicrodh 15ff525d43 ci(dependabot): track the crates/ workspace, drop npm and src-tauri
cc
2026-07-10 01:04:42 -06:00
vicrodh ca1fa56a5b docs(contributing): route contributors to the crates/ Slint tree
cc
2026-07-10 01:04:31 -06:00
vicrodh 39204a41ff chore(cleanup): remove legacy Tauri/vite dev scripts and legacy-tree-notice workflow
cc
2026-07-10 01:00:06 -06:00
Afonso Jorge Ramos 54da577d56 ci(test-crates): align workflow with release CI conventions
Match naming, permissions, concurrency, mold linker, and cache save-if
policy (write only from pre-release) used by the Slint release jobs.
2026-07-10 01:02:37 +02:00
Afonso Jorge Ramos 7a600a60f4 ci: add workspace cargo test job (exclude Slint UI graph)
Run unit/doc tests for the shipping crates workspace on PRs without
compiling qbz-ui. Fix three green-blockers: local playlist schema for
tests, Track.work fixture, and a stale ListenBrainz doctest.
2026-07-10 00:52:05 +02:00
vicrodh 5ba00ab4ef ci(linux): save the amd64 slint-linux cache on main (was never written)
release-linux had save-if:false deferring cache writes to build-slint.yml,
which no longer runs — so the amd64 `slint-linux` dep cache was never created
and every release/snap amd64 build ran fully cold (no dep cache; qbz_ui
recompiles regardless). release-linux-aarch64 already saves (save-if:true),
which is why only the aarch64 cache existed. Save on main so pre-flights warm
it and tag runs restore it.

cc
2026-07-09 12:09:54 -06:00
vicrodh 235bad253a ci(snap): skip the Snap Store publish when no store credentials are set
The publish step failed the whole run with "login_data is empty" when
SNAPCRAFT_STORE_CREDENTIALS is unset, even though both binaries compiled and
the amd64 snap packed fine. Move the secret to job level and gate the publish
step on it: with no secret the snap is still built and uploaded as an artifact,
publish is skipped (green run) instead of failing. Applies to both arches.

cc
2026-07-09 10:13:02 -06:00
vicrodh 207d928fd8 ci(snap): add an arm64 track to release-snap (native runner, dump repack)
Both arches now publish from CI: the existing amd64 track plus a new
build-binary-arm64 (native ubuntu-24.04-arm, free for public repos, reuses
release-linux-aarch64's cargo cache) -> snap-arm64 that dumps the prebuilt
aarch64 binary with packaging/snap-slint/snapcraft-arm64.yaml. This CI upload
is the sole publish path; Launchpad / "Build from GitHub" is not used.

cc
2026-07-09 08:13:58 -06:00
vicrodh ec1f48b581 chore: legacy-tree notices — PR bot, sentinel READMEs, PR template
Two contributors in one week sent solid PRs against the retired
Tauri/Svelte tree (#561, #564) because nothing in the repo says it is
dead. Three zero-risk notices, no code touched: a pull_request_target
bot that leaves one sticky comment when a PR touches src//src-tauri/
(target on purpose — fork PRs cannot be commented under plain
pull_request; the PR code is never checked out), sentinel READMEs at
both tree roots (what GitHub renders when browsing), and a PR template
checkbox. The tree deletion + local reference worktree is the 2.0.2
follow-up (owner hold: no dependency risk allowed before 2.0.1).

cc
2026-07-08 11:47:28 -06:00
vicrodh 1d16d84468 ci(gentoo): require the amd64 dist in the overlay Manifest, retry downloads
A Manifest published without its amd64 DIST entry bricks emerge for
every amd64 user, which is worse than failing the job; a 3x30s retry
absorbs release-asset propagation lag right after the tag. Also
documents the #557 root cause at the top: the overlay must never be
edited by hand — an ebuild change without Manifest regeneration is a
guaranteed digest mismatch; template changes are republished by
re-dispatching this workflow.

cc
2026-07-06 20:30:49 -06:00
vicrodh 395e537b59 fix(build): drop compile-time x86 target-features — runtime AES dispatch
Users on CPUs without AES-NI (Nehalem i7-860, pre-2010 Intel Macs) or
without SSSE3 (AMD Phenom II) crashed at launch with SIGILL. The
global `-C target-feature=+aes,+ssse3` was kept after the #353/#343
x86-64-v3 incident on the belief that the aes crate's cpufeatures
runtime check would protect CPUs without AES-NI — but a compile-time
target feature makes cpufeatures compile its check to a constant, so
the AES-NI intrinsics ran unconditionally (credentials AES-GCM decrypt
at startup), and +ssse3 let LLVM autovectorize anywhere, breaking
Phenom II. Measured on the qbz-cmaf hot path (Ctr128BE<Aes128>
apply_keystream, 256 MB, release): 2145 MB/s compiled-in vs 2162 MB/s
runtime-dispatched, identical output — the flags bought nothing on
capable CPUs. Removed from .cargo/config.toml, all dev/build scripts
and the release/build workflows; old CPUs now get the software AES
fallback instead of a crash.

Fixes #549

cc
2026-07-05 14:17:46 -06:00
vicrodh 1e521a182f fix(ci): stop snapcraft resolving the root source-build recipe
The root snapcraft.yaml (source build, kept for Snap Store remote
builders) shadowed the staged snap/snapcraft.yaml dump recipe, so the
v2.0.0 snap job recompiled the entire workspace inside LXD and the
container OOM'd. Remove the root recipes from the CI working copy
before invoking snapcraft.

cc
2026-07-04 13:07:41 -06:00
vicrodh 3fa1334bb3 fix(ci): raise the snap packaging job timeout to 90 minutes
The v2.0.0 tag run was cancelled at exactly 30 minutes with snapcraft's
LXD build still running. The job does no compilation, but container
bootstrap plus platform snap downloads on public runners routinely
exceed the old budget.

cc
2026-07-04 10:54:10 -06:00
vicrodh cc353d46d7 fix(ci): self-hosted build uses the ftrace-validated capped recipe
threads=2/cgu256/opt3 under the widened cap margin — completed with a
5.7 GB global floor and zero kill signals while the desktop ran. Same
flags across runs keeps the runner's target cache warm.

cc
2026-07-03 23:28:09 -06:00
vicrodh 3da94e6499 fix(ci): unquoted colon broke the self-hosted workflow YAML
cc
2026-07-03 21:55:46 -06:00
vicrodh 55619bc1da fix(ci): make the self-hosted build desktop-proof
The uncapped opt-3/threads-2 recipe dies to earlyoom whenever the
desktop holds RAM (its trigger is RAM-only, so free swap cannot save
an uncapped build). Switch to the capped threads-1/opt-2 recipe,
proven end-to-end under an 8G/10G cgroup cap with the desktop open —
slower, but it finishes regardless of box load.

cc
2026-07-03 21:53:36 -06:00
vicrodh d638e75abb fix(ci): build-slint runs on manual dispatch only, never on pushes
Repo policy: public workflows fire on release tags only. A push to
main is a release merge whose tag immediately fires the real release
builds, so the auto-build on main was pure double spend.

cc
2026-07-03 19:16:20 -06:00
vicrodh 400637bf6d fix(ci): apply the pending release-pipeline review fixes
Restores the ALSA layout binds in both snap recipes (bit-perfect hw:
access inside the snap), lets the build cache save on main as well as
slint-mvp, installs the desktop file as com.blitzfc.qbz.desktop so the
AppStream launchable and the MPRIS DesktopEntry resolve in deb/rpm,
clears the stale boot-restore error when a new browser sign-in starts,
and adds the X11 dlopen libraries to the flake's runtime set. The
flake version/rev/srcHash bump remains a tag-time step (documented in
the release checklist, which is rewritten for the 2.0 Slint flow).

cc
2026-07-03 18:46:37 -06:00
vicrodh 1b933299e1 ci: rewrite release workflows for the Slint binary
release-linux, release-linux-aarch64, release-macos and release-flatpak
now build the crates/ workspace (Tauri npm builds removed) with the
proven build-slint recipe: 18 GB extra swap, mold, pinned nightly, MIN
memory tier. Build-once-package-many: nfpm deb/rpm, minimal-AppDir
AppImage, and the AUR/Gentoo/APT tarball with its name and layout
contract preserved. macOS assembles a QBZ.app skeleton, ad-hoc signs
it, and packs a dmg with hdiutil.

Cross-cutting: prerelease detection extended to -rc/-beta/-alpha/-pre,
tag-on-main ancestry guard (manual dispatch skips it), fail-fast
version assert against crates/Cargo.toml, unstripped binary archived
per tag. Tauri-updater bridge: AppImages and macOS .app.tar.gz are
signed with the existing Tauri minisign key so 1.2.x installs
auto-update into v2 via the unchanged release-updater-manifest.yml.

cc
2026-07-02 10:11:16 -06:00
vicrodh 94aa3782d2 ci: auto-trigger build-slint only on main; manual elsewhere
Feature branches (slint-mvp) no longer auto-run the build on every push — that
burned minutes, and the qbz_ui compile is the expensive one. build-slint.yml now
auto-fires only on push to main; workflow_dispatch keeps it manually triggerable
on any branch.

cc
2026-06-26 17:23:11 -06:00
vicrodh 77a476c8e7 ci(snap): all-hosted Snap pipeline for the Slint build (dump prebuilt binary)
The dev box is Gentoo/OpenRC with no systemd, hence no snapd, so it cannot
build or upload snaps. This pipeline keeps everything on GitHub-hosted Ubuntu
runners (which have snapd) instead:

- packaging/snap-slint/snapcraft.yaml: a `plugin: dump` recipe that packages a
  PRE-BUILT qbz binary (no compilation), with the Slint runtime stack
  (Vulkan/GL via the gnome extension, winit Wayland/X11, alsa/pipewire, mpris).
  Kept separate from the Tauri snapcraft.yaml so neither clobbers the other.
- .github/workflows/release-snap.yml: job 1 compiles the binary on a 16 GB
  runner using the same MIN-tier + 18 GB swap recipe as build-slint.yml; job 2
  downloads it and runs snapcraft `dump` + snapcore/action-publish. The heavy
  compile is on a free public runner; the snap packaging is on a runner that
  has snapd — neither touches the OpenRC box.

Requires the SNAPCRAFT_STORE_CREDENTIALS secret (generate once via
`snapcraft export-login` on any snapd-capable host). The runtime confinement
(stage-packages/plugs for the non-GTK GPU stack) is a first cut and will need a
real `snapcraft build` + `snap run` on the runner to finalize; it cannot be
tested locally without snapd.

cc
2026-06-26 08:32:26 -06:00
vicrodh 00ef194a93 ci(build-slint): cacheable build + swap sized for the ~30GB qbz_ui peak
The qbz_ui rustc (generated Slint UI, one ~1.6M-line module) is the build
wall: measured peak demand ~30 GB (RSS+Swap), and it is frontend-bound.
Codegen knobs barely move it (cu=256/opt=2 + -Z threads=1/jobs=1 shave only
~3 GB vs cargo defaults), so the build is made to FIT via RAM+swap, not tuned
down. Extracting feature crates out of the bin does not lower it either: the
bin peaks at only ~4.5 GB; qbz_ui is strictly upstream of it.

- Swap 8 -> 18 GB: 16 GB RAM + ~22 GB swap (~38 GB) comfortably exceeds the
  ~30 GB demand. 8 GB was an OOM risk (16+4+8 ~= 28 GB < 30 GB).
- Swatinem/rust-cache@v2 (crates -> target, shared-key, save-if slint-mvp):
  a controller-only push restores the prebuilt qbz_ui rlib from cache and
  rebuilds only the cheap qbz bin. This, not the peak, is the minute saver.
- Pin a dated nightly (was floating @nightly): rustc -V is part of the cache
  key, so a floating nightly re-keyed the cache and invalidated every Cargo
  fingerprint daily (the from-scratch-every-run waste).
- concurrency cancel-in-progress: a new push to slint-mvp cancels the older
  in-flight build instead of stacking ~20-min runs.

cc
2026-06-26 06:38:24 -06:00
vicrodh c8ef2a1b1d refactor(slint): split qbz-slint into qbz-ui lib + qbz bin; reclaim qbz binary
Slint cannot split the .slint compilation across crates, but a Slint LIBRARY
crate exposes its generated Rust types to dependent crates (verified with a
minimal proof). So:

- NEW crate `qbz-ui` (lib): owns the whole .slint tree + build.rs + bundled
  translations; `slint::include_modules!()` + the generated types (AppWindow,
  MiniPlayerWindow, all globals/structs) are re-exported. Translation domain is
  now `qbz-ui` (the .po files renamed accordingly).
- `qbz-slint` (bin) -> renamed to `qbz` (package + `[[bin]] name = "qbz"`),
  reclaiming the binary name from the retired Tauri app. It depends on `qbz-ui`
  and does `pub use qbz_ui::*;` so existing `crate::AppWindow` / `crate::*State`
  references resolve unchanged.

This splits the single ~20 GB rustc into two crates (UI/codegen vs the 75k LOC
of logic) — the foundation for lower build peak, incremental caching, and the
upcoming per-feature crate extraction.

Also fixed for the move: qbz-i18n bundled-.po include paths, the font/WGSL
`include_bytes!`/`include_str!` paths (-> ../../qbz-ui/ui/), workspace members,
dev scripts (`-p qbz`), and the CI workflows. `cargo check -p qbz` is green.

cc
2026-06-25 17:51:09 -06:00
vicrodh b9eb300516 ci: self-hosted runner workflow for qbz-slint (real artifact path)
The GitHub-hosted private runner is 2 vCPU/8 GB and cannot build qbz-slint
(died at 1h42m). The dev box CAN, so a self-hosted runner (qbz-box) gives a
reliable CI artifact. Manual trigger; uncapped threads=2 (box-proven);
persistent work dir = incremental after first build.

cc
2026-06-25 13:32:06 -06:00
vicrodh a4371f294b ci: add mupdf-sys system libs (harfbuzz, jbig2dec, openjp2, jpeg, zlib, gumbo)
mupdf-sys (via qbz-booklet) links the system third-party libs; the build
got 21 min in and failed on a missing harfbuzz. Add the full mupdf system-lib
set so it links cleanly.

cc
2026-06-25 10:31:25 -06:00
vicrodh 2f58778abd ci: fix swap setup in slint build
The runner already ships an active /swapfile, so fallocate on it fails with
"Text file busy". Add the extra swap on a fresh path (/swap_extra) and guard
the whole swap block so a hiccup never fails the job — memory was never the
blocker (the prior run died on disk, not OOM).

cc
2026-06-25 10:08:17 -06:00
vicrodh 0b466474ef ci: fix runner disk exhaustion in slint build
ubuntu-24.04 has no separate large /mnt disk — it's all on the 72 GB root
(~16 GB free), so the 12 GB swapfile + cargo target overflowed it (protobuf
failed with ENOSPC, not OOM — the build was memory-fine). Free ~25-30 GB of
unused preinstalled toolchains, drop swap to 8 GB, and keep the target on the
default path.

cc
2026-06-25 10:04:54 -06:00
vicrodh 5806b0c057 ci: build qbz-slint on GitHub Actions (linux)
Build-only workflow on ubuntu-24.04 with a 12 GB swapfile and the
lowest-memory rustc settings (serial frontend, codegen-units 256,
opt-level 2, one rustc at a time) so a stock 16 GB runner can compile the
Slint app. Triggers on push to slint-mvp and via workflow_dispatch.

cc
2026-06-25 09:43:50 -06:00
vicrodh a62c2f26f2 docs(issue-template): emphasize log sharing and add log-access screenshot
cc
2026-05-25 09:58:30 -06:00
Afonso Jorge Ramos 4fd85b5b2f fix(ci): suffix macOS .app.tar.gz bundles with arch to fix auto-updater 2026-05-11 16:17:07 +02:00
vicrodh a912ced3d0 build: bump Node 20 to Node 24 across CI workflows and Flatpak manifest
Cherry-picked from PR #377 (thanks @Mar0xy) — Node-only portion, no
Discord IPC additions:

- 4 workflows (release-{linux,linux-aarch64,macos,flatpak}.yml) now
  install Node 24
- packaging/flatpak/com.blitzfc.qbz.yml: SDK extension node20 → node24,
  build append-path and npm_config_nodedir aligned

Forcing function: @icons-pack/svelte-simple-icons@7.x already in use
declares engines.node >=24, so Node 20 produces an EBADENGINE warning
in CI. Node 20 also reached EOL on 2026-04-30. Node 24 has been LTS
since October 2025 (~7 months of maturity).

Discord IPC permissions and qbz-wrapper script from #377 were
intentionally NOT cherry-picked — there's no Discord RPC feature in
QBZ today (#336 is still planned but not implemented), so adding the
sandbox permission and the launch wrapper now would expand the
attack surface for nothing. They'll land together with the actual
feature when it ships.

cc
2026-05-05 12:10:07 -06:00
vicrodh ec3fbf1d3f chore(ci): remove build-qbzd workflow
The qbzd daemon is still in early development and the build pipeline
isn't ready to ship artifacts. Drop the workflow until the daemon
work lands so it doesn't fire on tag push and produce broken jobs.

cc
2026-04-28 21:40:13 -06:00
vicrodh 0461c36912 security: address CodeQL alerts from the v1.2.5 scan
Triaged the 8 open CodeQL alerts raised on the 1.2.5 merge commit.

Critical (1) — real, fixed:

  * .github/workflows/release-updater-manifest.yml:29 — the resolve
    step interpolated `${{ github.event.workflow_run.head_branch }}`
    directly into a shell heredoc. `head_branch` on `workflow_run` is
    attacker-controllable (any outside contributor can push a branch
    whose name embeds a payload). Route the value through an env var
    (HEAD_BRANCH) and validate the shape with a strict regex before
    letting it flow into shell or $GITHUB_OUTPUT.

Warnings (2) — real, fixed:

  * .github/workflows/build-qbzd.yml had no `permissions:` block, so
    every job inherited the repo's default GITHUB_TOKEN scope. Add a
    top-level `permissions: contents: read`; the existing `release`
    job keeps its own `contents: write` override for publishing
    artifacts.

Warnings (3) — real, low severity, mitigated:

  * crates/qbzd/src/{daemon.rs,session.rs} logged `user_id` at info
    level (CodeQL rust/cleartext-logging). Demoted the three lines to
    `log::debug!` so default-level logs stay free of the numeric user
    id, with a comment noting RUST_LOG=debug re-enables them for
    diagnostics.

Warnings (2) — false positives, dismissed in GitHub:

  * crates/qbzd/src/login.rs:103 — `println!` to stdout inside the
    interactive `qbzd login` subcommand; login confirmation UX, not a
    persistent log. (alert #63 dismissed, reason: false positive)
  * crates/qbzd/src/qconnect.rs:540 — `session_uuid` is an ephemeral
    per-connection identifier QConnect exchanges in cleartext itself;
    not a credential or token. (alert #65 dismissed, reason: false
    positive)

cc
2026-04-15 16:10:06 -06:00
vicrodh 62d1674673 chore(release): hide qbzd from UI and CI until it ships
qbzd is feature-complete on disk but not ready for public release yet.
Keep all code paths in place so it can be unhidden with a one-line
flip, but remove it from the user-facing surface:

  * build-qbzd.yml: comment out the `push.tags` trigger so neither a
    regular `v*` version tag nor a `qbzd-v*` tag auto-builds artifacts.
    workflow_dispatch is preserved for manual testing.
  * CastPicker.svelte: guard the QBZ Daemon tab, the manual-connect
    section, and the three `v2_qbzd_*` Tauri invocations behind a
    `QBZD_ENABLED` flag (currently false). Default activeProtocol
    switches to 'chromecast' so the picker doesn't start on a hidden
    tab.
  * SettingsView: DAC Setup Wizard icon filter swapped — button icon
    drops the `invert(1)` so it reads on light accent colors (e.g.
    Catppuccin Lavender), and the tooltip copy of the same icon now
    has `invert(1)` so it reads on the dark surface bg. Unrelated to
    qbzd but bundled since both are pre-release polish.

cc
2026-04-15 10:28:25 -06:00
vicrodh 2f5a6aaddf ci(updater): sign artifacts and consolidate updater manifest
Adds TAURI_SIGNING_PRIVATE_KEY(_PASSWORD) env to release-linux,
release-linux-aarch64, and release-macos build steps, collects the
resulting .sig files into the release artifacts, and adds a new
release-updater-manifest workflow that waits for all platform sig
files to land on the release and assembles latest.json for the
updater endpoint.

Cherry-picked from #305 by @afonsojramos.

cc
2026-04-13 14:53:52 -06:00