This project is configured for direct macOS distribution with Developer ID signing and notarization. The Mac App Store path is documented separately in APP_STORE.md.
Releasebuilds useDisplayFill/LightRelease.entitlementsinstead of the sandbox entitlements file.Releasebuilds enable Hardened Runtime, which Apple requires for notarized macOS apps distributed outside the Mac App Store.scripts/set_version.shupdates the app version and build number in the Xcode project.scripts/release_direct.sharchives, exports, verifies, notarizes, staples, and zips the app.
- Join the Apple Developer Program and install a
Developer ID Applicationcertificate in your login keychain. - Open the target in Xcode and set your signing team, or export
TEAM_IDwhen running the release script. - Create a notary keychain profile with
notarytool.
xcrun notarytool store-credentials "DisplayFill-Notary" \
--apple-id "YOUR_APPLE_ID" \
--team-id "YOUR_TEAM_ID" \
--password "YOUR_APP_SPECIFIC_PASSWORD"For CI, you can use an App Store Connect API key instead of an Apple ID, but the script in this repo expects a saved keychain profile name.
Run the commands below from the repository root.
- Set the version you want to ship.
./scripts/set_version.sh 2.0 20- Build, export, notarize, staple, and zip the app.
TEAM_ID="YOUR_TEAM_ID" \
NOTARY_PROFILE="DisplayFill-Notary" \
./scripts/release_direct.sh- Upload the generated zip from
dist/to GitHub Releases, your website, or any other direct-download channel.
If you only need a signed build for local testing and want to skip notarization:
TEAM_ID="YOUR_TEAM_ID" \
SKIP_NOTARIZATION=1 \
./scripts/release_direct.shThat produces a zip in dist/, but it is not suitable for public distribution.
build/DisplayFill.xcarchivedist/export/DisplayFill.appdist/DisplayFill-<version>-<build>-macOS.zipdist/DisplayFill-<version>-<build>-macOS.notary.json
The release script already runs these checks:
codesign --verify --deep --strict --verbose=2xcrun stapler validatespctl -a -t exec -vv
If notarization fails, inspect the JSON log saved in dist/.
- The app target uses the checked-in
DisplayFill/Info.plist; keep its version fields in sync with the Xcode build settings. - If you later want in-app auto-updates for direct distribution, add Sparkle on top of this release pipeline rather than replacing it.