- Apple Developer Program membership ($99/yr) — developer.apple.com/programs
- Developer ID Application certificate (see Step 1)
- App-Specific Password (see Step 2)
-
create-dmginstalled —brew install create-dmg
- Go to developer.apple.com/account/resources/certificates/list
- Click + → Select "Developer ID Application" → Continue
- If asked for a CSR:
- Open Keychain Access → Certificate Assistant → Request a Certificate From a Certificate Authority
- Select "Saved to disk" → Upload the
.certSigningRequestfile
- Download the certificate (
.cer) and double-click to install
Verify:
security find-identity -v -p codesigning | grep "Developer ID"
# Output: "Developer ID Application: Your Name (TEAM_ID)"- Go to account.apple.com → Sign-In and Security → App-Specific Passwords
- Click + → Name it
ScreenRecorder Notarization - Copy the password (format:
xxxx-xxxx-xxxx-xxxx)
cp .env.example .envFill in your values:
APPLE_ID="your-apple-id@example.com"
APPLE_TEAM_ID="YOUR_TEAM_ID"
SIGNING_IDENTITY="Apple Development: Your Name (TEAM_ID)"
RELEASE_SIGNING_IDENTITY="Developer ID Application: Your Name (TEAM_ID)"
APP_PASSWORD="xxxx-xxxx-xxxx-xxxx"
APP_VERSION="1.0.0"# Bump version in .env, then:
./release.shThe script handles everything automatically:
| Step | Action |
|---|---|
| 1 | Stamps APP_VERSION into Info.plist |
| 2 | Builds release binary |
| 3 | Signs with Developer ID (hardened runtime) |
| 4 | Submits to Apple for notarization (~2-5 min) |
| 5 | Staples notarization ticket |
| 6 | Creates DMG |
| 7 | Git tags v{VERSION} and force-pushes to trigger GitHub Actions |
The DMG at .build/ScreenRecorder-{VERSION}.dmg is ready to distribute.
The workflow at .github/workflows/release.yml is triggered automatically by release.sh when it pushes the version tag.
Go to github.com/codeitlikemiley/screenrecorder/settings/secrets/actions and click "New repository secret" for each:
| Secret | Value |
|---|---|
APPLE_ID |
Your Apple ID email |
APPLE_TEAM_ID |
Your Team ID |
APP_PASSWORD |
App-specific password from Step 2 |
SIGNING_IDENTITY |
Developer ID Application: Your Name (TEAM_ID) |
CERTIFICATE_P12 |
Base64-encoded .p12 (see below) |
CERTIFICATE_PASSWORD |
Password set when exporting .p12 |
KEYCHAIN_PASSWORD |
Any random string (e.g. gh-actions-2026) |
- Open Keychain Access → My Certificates (left sidebar)
- Find and right-click "Developer ID Application: …" → Export…
- Save as
certificate.p12, set a password when prompted - Base64-encode and copy to clipboard:
base64 -i certificate.p12 | pbcopy - Paste that as the
CERTIFICATE_P12secret value
| Issue | Fix |
|---|---|
No identity found |
Developer ID cert not installed — redo Step 1 |
The signature is invalid |
Using wrong identity — check RELEASE_SIGNING_IDENTITY in .env |
| Notarization rejected | Run: xcrun notarytool log <id> --apple-id ... --team-id ... --password ... |
| Gatekeeper blocks app | Notarization or stapling failed — re-run ./release.sh |