OverflowBar uses semantic version tags and publishes installable DMGs plus Sparkle ZIP/appcast assets through GitHub Releases. The DMG remains the primary manual distribution path; the ZIP is the in-app update payload and the third-party Homebrew Cask mirrors the DMG.
- Patch release: focused compatibility, capture, activation, or packaging fixes
- Minor release: a user-visible capability or meaningful workflow improvement
- Major release: an incompatible preference, architecture, or product-direction change
There is no release solely to satisfy a calendar. Important fixes should be released promptly; routine improvements are grouped into coherent updates.
-
Update
CFBundleShortVersionStringand increaseCFBundleVersioninOverflowBar/Resources/Info.plist. -
Update
Casks/overflowbar.rbwith the release version and the SHA-256 of the matching DMG. -
Move user-visible changes into
CHANGELOG.mdand updateRELEASE_NOTES.md. -
Build Debug and Release configurations.
-
Run live checks:
- arrow is present
- selected native icons can be automatically arranged and hidden/revealed
- second row opens and closes
- genuine previews load and fresh AX/native activation opens the intended interface; uncertain items remain accessible
- Safe Reset and normal quit reveal the group
- macOS 27 leaves hiding disabled
- 100 complete panel/activation cycles and a two-hour soak complete without input interference or resource growth
-
Build and verify the DMG and updater ZIP:
./scripts/create-dmg.sh hdiutil verify dist/OverflowBar-<version>.dmg shasum -a 256 -c dist/OverflowBar-<version>.dmg.sha256
The release workflow also generates and signs
dist/appcast.xmlusing theSPARKLE_ED_KEYGitHub Actions secret. Keep the private key out of the repository and publish only the public key inInfo.plist. -
Validate the Homebrew Cask metadata:
bash scripts/validate-homebrew-cask.sh
-
Commit and push the release source.
-
Run Release preflight from Actions on that exact commit. It checks the production signing key, serves a staged feed locally, then probes and installs the signed ZIP over a disposable copy of the published v1.0.19 app. The preflight does not publish; its localhost appcast is test evidence and must not be used as a release feed.
-
Create a signed annotated tag on the verified commit and push it:
git tag -s v<version> -m "OverflowBar <version>"
git push origin v<version>The tag triggers .github/workflows/release.yml, which validates version
parity and monotonic build numbers, builds the DMG and updater ZIP, generates
the signed appcast, and creates the GitHub Release with all updater assets. A
stable release is explicitly marked as the latest stable version.
If release notes need correction after publication, update RELEASE_NOTES.md
on main and run Refresh release notes from Actions with the published
version. It reuses the published updater ZIP, regenerates and verifies the
signed Sparkle appcast, then refreshes the GitHub release description without
rebuilding the released app.
- After publication, download the exact DMG and its
.sha256asset from that release, verify them, then updateCasks/overflowbar.rbto the published DMG's checksum. DMG container hashes can vary between builds, so the cask must match the artifact CI actually published. Push the checksum update to the default branch so the documented Homebrew tap receives it.
scripts/create-dmg.sh uses DEVELOPER_ID_APPLICATION when provided. Without it, the script creates an ad-hoc signed community build. Notarization must be added before describing a release as Gatekeeper-ready.
The native validation matrix remains open follow-up validation for v1.5.0 and future releases. Generic placeholders, a widened divider, passing unit tests or a signed DMG are not native GUI evidence. The v1.5.0 release report records the physical checks waived for that release. Keep signed Sparkle generation in release CI, package both ad-hoc XPC services, and verify their current designated requirements from the installed application.