Core-Monitor is not a throwaway unsigned zip anymore. The release path in this repository is built around three requirements:
- Every public build should pass the macOS test suite first.
- Every downloadable app should be Developer ID signed and notarized.
- Every channel should point to the same stable artifact names:
Core-Monitor.dmgfor normal installs andCore-Monitor.app.zipfor archive-friendly installs.
- GitHub Releases: primary source of truth, public changelog, checksums, and pinned Homebrew cask artifact.
- Website: the main download buttons should point to
releases/latest/download/Core-Monitor.dmg, and the install section should also surfacereleases/latest/download/Core-Monitor.app.zip. - Homebrew: this repository acts as a custom tap; users should tap it first, then install
offyotto/core-monitor/core-monitor. - Direct support/install docs: README, website, and release notes should present DMG as the standard drag-to-Applications path and ZIP as the fallback/manual path.
The release workflow expects these repository or organization secrets:
BUILD_CERTIFICATE_BASE64: base64-encoded Developer ID Application.p12P12_PASSWORD: password for the.p12KEYCHAIN_PASSWORD: temporary keychain password used on the runnerARCHIVE_PROVISIONING_PROFILE_BASE64: base64-encodedMac Team Provisioning Profile: CoreTools.Core-Monitorfor the archive stepWEATHERKIT_PROVISIONING_PROFILE_BASE64: base64-encodedMac Team Direct Provisioning Profile: CoreTools.Core-MonitorAPPLE_TEAM_ID: Apple Developer team id when using Apple ID notarization- For notarization, configure one of these:
APP_STORE_CONNECT_API_KEY_BASE64APP_STORE_CONNECT_KEY_IDAPP_STORE_CONNECT_ISSUER_ID- Or both:
APPLE_IDAPPLE_APP_SPECIFIC_PASSWORD
Do not rely on a bare NOTARYTOOL_PROFILE secret on GitHub Actions. A profile name alone does not recreate the runner keychain entry. Either provide Apple ID credentials so the workflow can create the profile on the runner, or provide an App Store Connect API key.
- Update the changelog-worthy product copy in the README and website if the release shifts positioning or install instructions.
- Make sure the marketing version and build number in Xcode are correct.
- Tag the commit with a release tag such as
v14.0.0. - Push the branch and tag.
- Let
.github/workflows/release.ymlbuild, notarize, and publish bothCore-Monitor.app.zipandCore-Monitor.dmg. - Confirm the release contains:
Core-Monitor.dmgCore-Monitor.dmg.sha256Core-Monitor.app.zipCore-Monitor.app.zip.sha256core-monitor.rb
- Verify the website's main download button resolves to the DMG and the install section still exposes the ZIP fallback.
- Test the Homebrew install path:
brew tap --custom-remote offyotto/core-monitor https://github.com/offyotto/Core-Monitor
brew install --cask offyotto/core-monitor/core-monitorUnsigned CI check:
xcodebuild test \
-project Core-Monitor.xcodeproj \
-scheme Core-Monitor \
-destination 'platform=macOS' \
CODE_SIGNING_ALLOWED=NOSigned archive + zip:
./scripts/release/build_release.shbuild_release.sh archives with automatic signing against the WeatherKit-enabled development profile installed on the machine, then performs a developer-id export so the release artifact keeps the WeatherKit entitlement while still shipping as a Developer ID app. For local/manual release experiments, ARCHIVE_CODE_SIGN_STYLE=Manual can be combined with ARCHIVE_PROVISIONING_PROFILE_SPECIFIER, but the GitHub workflow intentionally keeps archive signing automatic so the app and helper targets can resolve their own signing requirements.
The repository's Release configuration now uses the WeatherKit entitlement. The direct-download path therefore depends on both provisioning profile secrets listed above: the development profile for the archive phase and the direct-distribution profile for the export phase.
Notarize and staple the app:
APPLE_ID="you@example.com" \
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx" \
APPLE_TEAM_ID="TEAMID1234" \
./scripts/release/notarize_release.sh build/release/Core-Monitor.app.zip build/release/export/Core-Monitor.appBuild the DMG from the stapled app:
./scripts/release/build_dmg.sh build/release/export/Core-Monitor.app build/release/Core-Monitor.dmgNotarize the DMG:
APPLE_ID="you@example.com" \
APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx" \
APPLE_TEAM_ID="TEAMID1234" \
./scripts/release/notarize_disk_image.sh build/release/Core-Monitor.dmg- GitHub Releases: already automated in this repo
- GitHub Pages site: keep download/install copy aligned with the DMG-first, ZIP-fallback download path
- Homebrew: keep the custom-tap install path working; a dedicated
homebrew-core-monitorrepo can come later if install volume justifies it - MacUpdate / AlternativeTo / Apple Silicon directories: submit after each major release and keep screenshots current
- Setapp: viable only after the helper install and first-run flow feel invisible to a non-technical customer; do not prioritize it ahead of release trust and onboarding
Setapp is attractive for distribution reach, but it is not the first move for Core-Monitor. The app still has a privileged helper path and advanced fan-control behavior that need a calmer first-run experience before a subscription catalog audience will trust it. Treat Setapp as a second-stage distribution channel, not the main launch surface.