Skip to content

feat(release): Dreamforge desktop releases for macOS and Windows from GitHub Actions - #25

Merged
QuicksilverSlick merged 3 commits into
mainfrom
feat/windows-release-pipeline
Sep 16, 2026
Merged

QuicksilverSlick merged 3 commits into
mainfrom
feat/windows-release-pipeline

Conversation

@QuicksilverSlick

@QuicksilverSlick QuicksilverSlick commented Sep 16, 2026

Copy link
Copy Markdown
Owner

What this is

Dreamforge desktop installers for macOS and Windows, built in GitHub Actions, with the in-app updater turned on. This replaces the local Windows-only script from the first commit on this branch, because two publishers would overwrite one latest.json.

  • .github/workflows/dreamforge-desktop-release.yml
    • macOS: Apple Silicon and Intel (Intel cross-compiled on macos-latest, as upstream does). Builds Dreamforge.app and a DMG, ad-hoc signed because Apple Silicon refuses to launch unsigned code. Not notarized, since there is no Apple Developer account. codesign --verify --deep --strict runs on every build.
    • Windows: the NSIS installer, same as upstream's Windows job.
    • Publish runs only from a manual run on main with publish=true. It checks the version is plain x.y.z and newer than the live feed, and that every .sig was made by the key in desktop/src-tauri/dreamforge-updater.pub. Then it uploads DMGs, updater archives, the installer and latest.json to the rolling release dreamforge-desktop-latest, with latest.json last.
    • Pull requests that touch the workflow build installers as run artifacts and can never publish. The signing key reaches only manual runs on main.
  • scripts/release-latest-json.py: writes a multi-platform latest.json for darwin-aarch64, darwin-x86_64 and windows-x86_64, and matches each signature's key ID against the public key. --selftest runs in CI.
  • desktop/src-tauri/dreamforge-updater.pub: the updater public key, ID D9DED66F367B9EA7. The private half stays on the owner's machine until it is added as the TAURI_SIGNING_PRIVATE_KEY secret.
  • desktop/src-tauri/.gitignore: ignores the generated tauri.release.conf.json.

Not built on macOS: the mesh-llm feature. Windows does not build it either.

Before the first publish

gh secret set TAURI_SIGNING_PRIVATE_KEY --repo QuicksilverSlick/buzz < ~/.tauri/dreamforge.key

Verified

  • Two independent reviews (first CI run, security) with every finding applied, then a static walk of every step's input and output paths against Tauri CLI 2.11.4 and upstream release.yml.
  • --selftest covers version ordering, bad versions, and foreign, empty, junk and missing signatures. It also checks the committed key's ID.
  • This PR's own run builds the installers for real: https://github.com/QuicksilverSlick/buzz/actions/runs/35133400416

Known limits

  • Mac users see "Open Anyway" once per install, and likely a keychain prompt after each update, because an ad-hoc signature changes every build. A Developer ID certificate removes both.
  • The bundle identifier is still xyz.block.buzz.app, the same as Block's Buzz, so a Mac with both apps installed shares their settings folder and keychain entries.

🤖 Generated with Claude Code

QuicksilverSlick and others added 3 commits September 16, 2026 11:57
…abled

scripts/release-windows.bat <version> builds the NSIS installer through the existing build-windows-installer.bat with the updater configured (public key and endpoint via the upstream build-release-config.mjs delta, version patched into the same delta so no tracked file changes), lets Tauri sign the .exe with the fork's minisign key at ~/.tauri/dreamforge.key, writes latest.json with scripts/release-latest-json.py (refuses a version that is not newer than the published feed), and uploads exe + sig + latest.json to the rolling GitHub release dreamforge-desktop-latest on QuicksilverSlick/buzz.

build-windows-installer.bat gains an optional TAURI_BUILD_ARGS passthrough so the release script does not need a second copy of it. tauri.release.conf.json is now ignored so release worktrees stay clean.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… GitHub Actions

Releases move to CI so one publisher owns latest.json. .github/workflows/dreamforge-desktop-release.yml builds an ad-hoc signed app and DMG for aarch64 and x86_64 macOS (not notarized) and the NSIS installer for Windows, with the updater pointed at the rolling release dreamforge-desktop-latest and the committed public key desktop/src-tauri/dreamforge-updater.pub. A manual run with publish=true checks the version is newer than the published feed, writes latest.json for darwin-aarch64, darwin-x86_64 and windows-x86_64, and uploads everything, latest.json last. Pull requests touching the workflow only build. Without the TAURI_SIGNING_PRIVATE_KEY secret, builds skip updater artifacts and publish refuses.

scripts/release-latest-json.py now takes one PLATFORM=SIG_FILE=URL triple per platform and refuses missing or empty signatures. scripts/release-windows.bat is removed and build-windows-installer.bat is back to origin/main, so local installer builds are unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: QuicksilverSlick <russelledeming@gmail.com>
The updater signing key now reaches only manual runs on main: pull requests and dispatches from other branches build without updater archives, so unreviewed code never runs next to the key. Publishing refuses any ref but main, early in the build jobs and again in the publish job's condition.

release-latest-json.py takes --pubkey and refuses a .sig whose minisign key ID differs from the committed public key, since tauri build only warns on a mismatched pair and every installed app would reject that release. --check validates the version before looking at the feed, so an empty or malformed version is refused before the first publish too; Set version now runs on every manual run instead of only when a version is given.

Mac update archives carry the version (Dreamforge_<version>_<arch>.app.tar.gz), so uploading never replaces a file the live latest.json points at.

The macOS config step runs --selftest, so pull requests that change the script test it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: QuicksilverSlick <russelledeming@gmail.com>
@QuicksilverSlick QuicksilverSlick changed the title feat(release): one-command Windows release with the in-app updater enabled feat(release): Dreamforge desktop releases for macOS and Windows from GitHub Actions Sep 16, 2026
@QuicksilverSlick
QuicksilverSlick merged commit 6bf3f0f into main Sep 16, 2026
62 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant