Step-by-step guide for cutting a new release.
- Push access to
mainon github.com/proofofprints/PoPManager - The following GitHub Actions secrets must be set (Settings → Secrets and variables → Actions):
TAURI_SIGNING_PRIVATE_KEY— Tauri updater signing private key (base64 string frompopmanager.key)TAURI_SIGNING_PRIVATE_KEY_PASSWORD— password for the signing key
- Tag ruleset allows you to create
v*tags (you may need bypass permissions)
Update the version in all three manifest files to match the new version:
| File | Field |
|---|---|
src-tauri/tauri.conf.json |
"version": "X.Y.Z" |
package.json |
"version": "X.Y.Z" |
src-tauri/Cargo.toml |
version = "X.Y.Z" |
Commit and push to main (via PR or direct push):
git add src-tauri/tauri.conf.json package.json src-tauri/Cargo.toml
git commit -m "release: bump version to X.Y.Z"
git push origin mainnpx tsc --noEmit
cd src-tauri && cargo checkgit checkout main
git pull
git tag vX.Y.Z
git push --tagsThis triggers the release.yml GitHub Actions workflow, which:
- Builds on 4 platforms in parallel (Windows, macOS ARM, macOS Intel, Linux)
- Signs all updater artifacts with the Tauri signing key
- Creates a draft GitHub release with all installers +
latest.jsonattached
Monitor progress at: https://github.com/proofofprints/PoPManager/actions
All 4 jobs must pass:
build (windows-latest, x86_64-pc-windows-msvc)→.msi,.exebuild (macos-latest, aarch64-apple-darwin)→.dmg(Apple Silicon)build (macos-latest, x86_64-apple-darwin)→.dmg(Intel)build (ubuntu-22.04, x86_64-unknown-linux-gnu)→.deb,.AppImage,.rpm
- Go to Releases
- Find the draft release titled "PoPManager vX.Y.Z"
- Verify the expected assets are attached:
- Installers for all platforms
.sigsignature files for each installerlatest.json(updater manifest)
- Edit the release notes if needed
- Click Publish release
Open PoPManager (running the previous version) → Settings → Check for Updates. It should show the new version as available.
The TAURI_SIGNING_PRIVATE_KEY_PASSWORD GitHub secret doesn't match the key. Edit the secret and retype the exact password.
The pubkey field in tauri.conf.json contains the wrong value. It must be the public key (from popmanager.key.pub), not the private key. The public key decodes to text starting with "minisign public key". The private key decodes to "rsign encrypted secret key" — if you see that, you have them swapped.
The bundle.createUpdaterArtifacts field is missing from tauri.conf.json. It must be set to "v1Compatible" (or true for Tauri v3+).
A Windows-only crate is being compiled on non-Windows platforms. Check that tauri-winrt-notification is under [target.'cfg(windows)'.dependencies] in Cargo.toml, not under general [dependencies].
The workflow lacks permission to create releases. Ensure release.yml has permissions: contents: write at the top level.
Your tag ruleset restricts creation. Either add yourself to the bypass list in Settings → Rules → Rulesets, or temporarily disable the tag ruleset for the push.
The latest.json file doesn't exist at the expected URL. This happens when:
- The release hasn't been published yet (still in draft)
- The repo is private (unauthenticated downloads return 404)
- The signing step was skipped so
latest.jsonwasn't generated
The signing keypair lives at:
- Private key:
L:\PoPManager\~\.tauri\popmanager.key(also stored asTAURI_SIGNING_PRIVATE_KEYGitHub secret) - Public key:
L:\PoPManager\~\.tauri\popmanager.key.pub(also intauri.conf.json→plugins.updater.pubkey)
If you lose the private key or need to rotate:
npx @tauri-apps/cli signer generate -w "L:\PoPManager\~\.tauri\popmanager.key" --forceThen update:
tauri.conf.json→plugins.updater.pubkeywith the new public key- GitHub secret
TAURI_SIGNING_PRIVATE_KEYwith the new private key file contents - GitHub secret
TAURI_SIGNING_PRIVATE_KEY_PASSWORDwith the new password
Warning: Rotating the keypair means installed copies running the old public key cannot verify updates signed with the new key. Users will need to manually download the new version from the Releases page. Only rotate if necessary.
| Workflow | Trigger | Purpose |
|---|---|---|
.github/workflows/release.yml |
Push v* tag |
Cross-platform release builds |
.github/workflows/ci.yml |
PR to main |
TypeScript + Rust checks |
PoPManager follows Semantic Versioning:
- Major (X.0.0) — breaking changes or major feature overhauls
- Minor (0.X.0) — new features, backward compatible
- Patch (0.0.X) — bug fixes, minor polish