Skip to content

Releases & versioning

FolioOrb uses plain semantic versioning. The version lives in one place — app/version.py — and flows into the app, the installers, and the release assets.

Pushing a v* tag (or merging to main) triggers a single GitHub Actions workflow. It runs the tests, builds both installers on their native runners, smoke-tests each frozen bundle, and only then publishes. If either build or smoke test fails, nothing is published and the previous release stays exactly as it was.

Release pipeline from a main merge through tests, parallel macOS and Windows builds with smoke tests, to a GitHub Release feeding the website download buttons. Stable releases come from version tags and are the default download; a rolling latest-main prerelease is refreshed on every merge and linked as a development build.
  • Stable — cut by pushing a version tag like v5.16.1. This is what the website, README, and download buttons point to by default. A tag whose number doesn’t match app/version.py fails the build on purpose, so assets can never be mislabeled.
  • latest-main — a single rolling prerelease, refreshed on every merge to main. Always marked prerelease, so it never becomes the “latest” download by accident. Offered under a direct Development build link for anyone who wants to test the newest changes.
Asset Description
FolioOrb-macOS-arm64-v5.16.1.dmg macOS Apple Silicon installer
FolioOrb-Windows-x64-v5.16.1-Setup.exe Windows per-user installer
SHA256SUMS.txt Checksums for every asset — see verifying downloads

Development builds use the same names with v5.16.1 replaced by main-<short-sha>.

Builds are currently unsigned (macOS uses only PyInstaller’s ad-hoc signature). We don’t claim otherwise anywhere — the install guides show the exact warnings you’ll see. The path forward, in order:

Phase Status Effect
1 · Unsigned + checksums Now Works everywhere; system warnings on first launch
2 · Apple Developer ID signing Activation pending Establishes publisher identity; Gatekeeper can still warn before notarization
3 · macOS notarization Readiness checked in; activation pending Clears the unidentified-developer block after acceptance; the normal first-open confirmation remains
4 · Windows code signing Readiness checked in; activation pending Establishes publisher identity; SmartScreen reputation warnings can still appear

Phase 2’s fail-closed workflow support is checked in, but no public release is described as Developer ID signed until the certificate is configured and the exact downloaded app and DMG pass signature verification. The documented rehearsal keeps publish=false; a manual run can publish only when publish=true is explicitly selected from main. Phase 3’s build-only rehearsal support is also checked in, but remains dormant until Developer ID signing is active in the same run and an App Store Connect API credential is configured. It submits and staples the app before assembling the DMG, then separately submits and staples the signed DMG. Both artifacts must receive Apple’s Accepted result and pass Gatekeeper assessment. Notarization remains a separate later gate until that exact downloaded DMG is independently accepted and the public-verification switch is enabled. Phase 4 follows the same evidence boundary on Windows. A build-only rehearsal uses short-lived GitHub OIDC authentication to sign both the frozen executable and final installer with Azure Artifact Signing, requires SHA-256 RFC 3161 timestamps, and checks the exact expected publisher subject before upload. Public downloads remain described as unsigned until the downloaded installer and its installed executable pass independent Authenticode verification and the Windows public-verification switch is enabled.