Maintainer notes for building, signing, and publishing a release. If you just want to use the app, ignore this file.
After a release build on Apple Silicon:
| Artifact | Path |
|---|---|
| App bundle | src-tauri/target/release/bundle/macos/ParseKit.app |
| DMG installer | src-tauri/target/release/bundle/dmg/ParseKit_<version>_aarch64.dmg |
| Updater tarball | ParseKit_<version>_aarch64.app.tar.gz (created by publish script) |
| Update manifest | parsekit-latest.json |
src-tauri/binaries/ is gitignored. The sidecar must be built on the target architecture before packaging.
You do not need to manually build or upload DMGs. On every push to master:
- CI runs unit tests and typechecks.
- If there are new commits since the last release tag, the workflow auto-bumps the patch version (e.g.
0.2.4→0.2.5). - It builds the signed
.app, styled DMG, updater tarball, andparsekit-latest.json. - It publishes a GitHub Release and commits the synced version files back to
masterwith[skip release]so the bot does not loop.
Push code → wait ~25 minutes → fresh DMG on Releases.
To ship a minor/major bump instead of patch, set the version in package.json higher than the latest published release before pushing (e.g. 0.3.0). The workflow keeps your manual bump.
To re-run without new commits: Actions → Release → Run workflow.
Before shipping, write user-facing notes at:
docs/releases/vX.Y.Z.md
scripts/publish-release.sh loads that file via scripts/release-notes.sh.
If the file is missing, a clear install-focused default is used.
Do not pass raw commit subjects as RELEASE_NOTES (that used to produce empty one-liners on GitHub).
Override only when needed:
RELEASE_NOTES="$(cat docs/releases/v0.2.10.md)" npm run publish:macos# Local build only (sign, verify, DMG)
npm run release:macos
# Manual upload to GitHub (normally handled by CI)
export TAURI_SIGNING_PRIVATE_KEY="$HOME/.tauri/parsekit.key"
export TAURI_SIGNING_PRIVATE_KEY_PASSWORD=""
npm run publish:macosBuild on each target platform (Apple Silicon vs Intel) so the sidecar filename embeds the correct host triple.
npx tauri signer generate -w ~/.tauri/parsekit.key -f --ci -p ''Keep the private key local. Never commit it. The public key lives in src-tauri/tauri.conf.json under plugins.updater.pubkey.
ParseKit uses the Tauri v2 updater. Clients fetch:
https://github.com/harshabala/parsekit/releases/latest/download/parsekit-latest.json
Important: GitHub returns 404 for latest.json. The manifest must be named parsekit-latest.json.
The updater tarball is built after scripts/postbuild-macos.sh seals the .app with codesign --deep. createUpdaterArtifacts is off in tauri.conf.json so Tauri doesn't emit a pre-sign tar.gz that fails strict verification on extract.
When a newer version is available, users see a gold banner: Install & Restart or Later. Updates replace the app bundle in place — not the DMG flow.
The DMG uses a custom background (scripts/dmg/dmg-background.png) with baked-in drag-to-Applications guidance. Finder can't animate that window live, so the art carries the instructions.
Window layout is configured in src-tauri/tauri.conf.json under bundle.macOS.dmg.
Release builds are ad-hoc signed (codesign --verify --deep --strict passes on the build artifact). They are not notarized. Users need the one-time Gatekeeper approval documented in INSTALL.md.
publish:macos uploads to the v<version> release:
ParseKit_<version>_aarch64.dmgParseKit_<version>_aarch64.app.tar.gzparsekit-latest.json
The repo must be public so clients can download assets without authentication.