Releases are built and published automatically by GitHub Actions
(.github/workflows/release.yml) whenever you push a v*.*.* tag. Each platform
runs on its own runner (macOS / Ubuntu / Windows), and electron-builder uploads
the installers and the latest-*.yml update manifests to a GitHub Release.
The app's auto-updater (src/main/updater.ts) reads those manifests straight
from the release — there is no separate update server to maintain.
From a clean working tree, run one of the cut scripts. Each bumps the version
in package.json, makes a Release vX.Y.Z commit, creates a matching vX.Y.Z
tag, and pushes both — which triggers the release workflow:
pnpm cut:patch # 0.1.0 -> 0.1.1
pnpm cut:minor # 0.1.0 -> 0.2.0
pnpm cut:major # 0.1.0 -> 1.0.0These wrap
pnpm version <type> && git push --follow-tags.pnpm versionrefuses to run with uncommitted changes, so commit your work first.
Then watch the build at https://github.com/wassgha/opendex/actions.
electron-builder uploads installers to a draft GitHub Release while the
three platform jobs run. Once they all succeed, the publish job writes
AI-generated release notes (from the diff since the previous tag) and flips
the release to published. Auto-update only picks up published releases.
To preview notes for unreleased commits on your machine:
pnpm notes:preview # needs AI_GATEWAY_API_KEY in .envSet these under Settings → Secrets and variables → Actions. The Apple credentials are the same ones used for the other CoreViz desktop app — a single Developer ID cert + App Store Connect API key works across app IDs.
| Secret | What it is |
|---|---|
CSC_LINK |
base64-encoded Developer ID Application .p12 certificate |
CSC_KEY_PASSWORD |
password for that .p12 |
APPLE_API_KEY |
base64-encoded App Store Connect API key (.p8) — used for notarization |
APPLE_API_KEY_ID |
the API key's 10-character Key ID |
APPLE_API_ISSUER |
the API key's Issuer ID (UUID) |
AI_GATEWAY_API_KEY |
Vercel AI Gateway key — generates release notes in the publish job (optional; skipped if unset) |
GITHUB_TOKEN is provided automatically by Actions — no setup needed.
Windows and Linux builds are currently unsigned. To sign Windows later, add a code-signing cert and pass
CSC_LINK/CSC_KEY_PASSWORDto the Windows job (electron-builder picks them up the same way).
build.macinpackage.jsonsetshardenedRuntime: true, points atbuild/entitlements.mac.plist, andnotarize: true.- electron-builder imports
CSC_LINKto sign the app + the bundled nativelibnutbinary (nut-js, used for computer-use input control), then submits the build to Apple for notarization using theAPPLE_API_*credentials and staples the ticket. - The entitlements allow JIT/WASM (the offline voice engines), library validation bypass (loading the native binary), network access, and the microphone.
See the original walkthrough for generating these credentials in
~/Development/snapbox/SIGNING_SETUP.md.
pnpm dist # builds installers into dist/ without publishingAuto-update is disabled in pnpm dev and only runs in packaged builds
(app.isPackaged).
- An app icon is not yet configured — electron-builder uses the default
Electron icon. To brand it, drop
build/icon.icns(mac),build/icon.ico(win), andbuild/icon.png(≥512px, linux) and rebuild; electron-builder picks them up frombuildResourcesautomatically. - The native
@nut-tree-fork/nut-jsdependency isasarUnpacked so its platform binary loads at runtime. pnpm fetches the correct per-platformlibnut-*binary on each runner.