Files
clipbored/docs/RELEASE.md
Akshay Kolli d86d392c3a
Some checks failed
CI / Test And Build (push) Has been cancelled
UI fixes
2026-07-08 01:13:02 -04:00

2.4 KiB

Release Guide

This guide covers the local release build, optional Developer ID signing, and optional notarization flow.

Local Validation

Run:

./scripts/check.sh

This runs the unit test suite, builds build/ClipBored.app, applies an ad-hoc hardened-runtime signature, enforces the 2 MiB executable and bundle size gates, and verifies the app signature.

Local Archive

Run:

./scripts/release-macos-app.sh

Without signing credentials, this creates:

build/ClipBored.app
build/ClipBored.zip

The app remains ad-hoc signed and is suitable for local validation only.

Developer ID Signing

Set a Developer ID Application identity:

export DEVELOPER_ID_APPLICATION="Developer ID Application: Example, Inc. (TEAMID)"
./scripts/release-macos-app.sh

The script rebuilds the app, re-signs it with hardened runtime and timestamping, verifies the signature, and writes build/ClipBored.zip.

iCloud Sync Entitlements

The default local and release scripts do not add iCloud entitlements. Sync history with iCloud will report unavailable in those builds. To ship iCloud Sync, sign with an entitlement file that grants the app's ubiquity container, then repeat the signature, smoke, and notarization checks.

Notarization

Preferred: configure a notarytool keychain profile once:

xcrun notarytool store-credentials "clipbored-notary" \
  --apple-id "developer@example.com" \
  --team-id "TEAMID" \
  --password "app-specific-password"

Then run:

export DEVELOPER_ID_APPLICATION="Developer ID Application: Example, Inc. (TEAMID)"
export NOTARYTOOL_PROFILE="clipbored-notary"
./scripts/release-macos-app.sh

Alternative environment-only notarization:

export DEVELOPER_ID_APPLICATION="Developer ID Application: Example, Inc. (TEAMID)"
export APPLE_ID="developer@example.com"
export APPLE_TEAM_ID="TEAMID"
export APPLE_APP_SPECIFIC_PASSWORD="app-specific-password"
./scripts/release-macos-app.sh

When notarization succeeds, the script staples the ticket to build/ClipBored.app, validates the staple, and recreates build/ClipBored.zip.

Final Manual Checks

Before publishing, run the checklist in SMOKE_TEST.md, then confirm:

codesign --verify --deep --strict --verbose=2 build/ClipBored.app
xcrun stapler validate build/ClipBored.app
spctl --assess --type execute --verbose=4 build/ClipBored.app