asc-notarization
rudrankriyam/app-store-connect-cli-skills
Archive, export, and notarize macOS apps with Developer ID signing for distribution outside the App Store.
What is asc-notarization?
Prepares macOS applications for direct distribution by archiving with Xcode, exporting with Developer ID signing, and submitting to Apple's notarization service. Use this when you need to distribute a macOS app outside the App Store with proper code signing and Apple notarization approval.
- Archive macOS apps using xcodebuild with Release configuration
- Export archives with Developer ID Application signing and secure timestamps
- Create ZIP, DMG, or PKG containers for notarization submission
- Submit apps to Apple's notarization service with fire-and-forget or polling modes
- Check notarization status and retrieve developer logs for troubleshooting
- Staple notarization tickets to apps for offline verification
How to install asc-notarization
npx skills add https://github.com/rudrankriyam/app-store-connect-cli-skills --skill asc-notarization- Xcode installed with command line tools configured
- Developer ID Application certificate in local keychain
- App Store Connect API authentication configured (asc auth login or ASC_* env vars)
- Xcode project that builds for macOS
How to use asc-notarization
- 1.Verify a valid Developer ID Application certificate exists in keychain using security find-identity
- 2.Archive the app with xcodebuild archive using Release configuration and macOS destination
- 3.Create an ExportOptions.plist with method set to developer-id and your team ID
- 4.Export the archive using xcodebuild -exportArchive with the plist
- 5.Create a ZIP file from the exported .app bundle using ditto
- 6.Submit the ZIP to notarization with asc notarization submit --file and optionally --wait
- 7.Check status with asc notarization status or fetch logs with asc notarization log if needed
- 8.Staple the notarization ticket using xcrun stapler staple after approval (optional but recommended)
Use cases
- Distributing a macOS app directly to users outside the App Store
- Preparing an app for Developer ID signing and Apple notarization approval
- Creating notarized DMG or PKG installers for enterprise or direct download
- Automating the full macOS app signing and notarization workflow
- Troubleshooting notarization failures by fetching detailed developer logs
- macOS app developers distributing outside the App Store
- DevOps engineers automating app release pipelines
- Teams requiring Developer ID signing and Apple notarization
- Developers building enterprise or direct-to-user macOS distributions
asc-notarization FAQ
A Developer ID Application certificate for signing .app and .dmg files, or a Developer ID Installer certificate for .pkg files. These must be created at https://developer.apple.com/account/resources/certificates/add; the App Store Connect API does not support creating them.
Yes. Use asc notarization submit --file without --wait for fire-and-forget submission, then check status later with asc notarization status --id SUBMISSION_ID.
Fetch the developer log with asc notarization log --id SUBMISSION_ID and curl the log URL to see detailed issues. Common causes include unsigned nested binaries, missing hardened runtime, or embedded libraries without timestamps.
Stapling is optional but recommended. It allows the app to be verified offline. Use xcrun stapler staple on the .app, .dmg, or .pkg after notarization succeeds.
The asc notarization command automatically uses multipart upload for files over 5 GB. For upload timeouts, set ASC_UPLOAD_TIMEOUT environment variable (e.g., ASC_UPLOAD_TIMEOUT=5m).
Full instructions (SKILL.md)
Source of truth, from rudrankriyam/app-store-connect-cli-skills.
name: asc-notarization description: Archive, export, and notarize macOS apps using xcodebuild and asc. Use when you need to prepare a macOS app for distribution outside the App Store with Developer ID signing and Apple notarization.
macOS Notarization
Use this skill when you need to notarize a macOS app for distribution outside the App Store.
Preconditions
- Xcode installed and command line tools configured.
- Auth is configured (
asc auth loginorASC_*env vars). - A Developer ID Application certificate in the local keychain.
- The app's Xcode project builds for macOS.
Preflight: Verify Signing Identity
Before archiving, confirm a valid Developer ID Application identity exists:
security find-identity -v -p codesigning | grep "Developer ID Application"
If no identity is found, create one at https://developer.apple.com/account/resources/certificates/add (the App Store Connect API does not support creating Developer ID certificates).
Fix Broken Trust Settings
If codesign or xcodebuild fails with "Invalid trust settings" or "errSecInternalComponent", the certificate may have custom trust overrides that break the chain:
# Check for custom trust settings
security dump-trust-settings 2>&1 | grep -A1 "Developer ID"
# If overrides exist, export the cert and remove them
security find-certificate -c "Developer ID Application" -p ~/Library/Keychains/login.keychain-db > /tmp/devid-cert.pem
security remove-trusted-cert /tmp/devid-cert.pem
Verify Certificate Chain
After fixing trust settings, verify the chain is intact:
codesign --deep --force --options runtime --sign "Developer ID Application: YOUR NAME (TEAM_ID)" /path/to/any.app 2>&1
The signing must show the chain: Developer ID Application → Developer ID Certification Authority → Apple Root CA.
Step 1: Archive
xcodebuild archive \
-scheme "YourMacScheme" \
-configuration Release \
-archivePath /tmp/YourApp.xcarchive \
-destination "generic/platform=macOS"
Step 2: Export with Developer ID
Create an ExportOptions plist for Developer ID distribution:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<string>developer-id</string>
<key>signingStyle</key>
<string>automatic</string>
<key>teamID</key>
<string>YOUR_TEAM_ID</string>
</dict>
</plist>
Export the archive:
xcodebuild -exportArchive \
-archivePath /tmp/YourApp.xcarchive \
-exportPath /tmp/YourAppExport \
-exportOptionsPlist ExportOptions.plist
This produces a .app bundle signed with Developer ID Application and a secure timestamp.
Verify the Export
codesign -dvvv "/tmp/YourAppExport/YourApp.app" 2>&1 | grep -E "Authority|Timestamp"
Confirm:
- Authority chain starts with "Developer ID Application"
- A Timestamp is present
Step 3: Create a ZIP for Notarization
ditto -c -k --keepParent "/tmp/YourAppExport/YourApp.app" "/tmp/YourAppExport/YourApp.zip"
Step 4: Submit for Notarization
Fire-and-forget
asc notarization submit --file "/tmp/YourAppExport/YourApp.zip"
Wait for result
asc notarization submit --file "/tmp/YourAppExport/YourApp.zip" --wait
Custom polling
asc notarization submit --file "/tmp/YourAppExport/YourApp.zip" --wait --poll-interval 30s --timeout 1h
Step 5: Check Results
Status
asc notarization status --id "SUBMISSION_ID" --output table
Developer Log (for failures)
asc notarization log --id "SUBMISSION_ID"
Fetch the log URL to see detailed issues:
curl -sL "LOG_URL" | python3 -m json.tool
List Previous Submissions
asc notarization list --output table
asc notarization list --limit 5 --output table
Step 6: Staple (Optional)
After notarization succeeds, staple the ticket so the app works offline:
xcrun stapler staple "/tmp/YourAppExport/YourApp.app"
For DMG or PKG distribution, staple after creating the container:
# Create DMG
hdiutil create -volname "YourApp" -srcfolder "/tmp/YourAppExport/YourApp.app" -ov -format UDZO "/tmp/YourApp.dmg"
xcrun stapler staple "/tmp/YourApp.dmg"
Supported File Formats
| Format | Use Case |
|---|---|
.zip | Simplest; zip a signed .app bundle |
.dmg | Disk image for drag-and-drop install |
.pkg | Installer package (requires Developer ID Installer certificate) |
PKG Notarization
To notarize .pkg files, you need a Developer ID Installer certificate (separate from Developer ID Application). This certificate type is not available through the App Store Connect API — create it at https://developer.apple.com/account/resources/certificates/add.
Sign the package:
productsign --sign "Developer ID Installer: YOUR NAME (TEAM_ID)" unsigned.pkg signed.pkg
Then submit:
asc notarization submit --file signed.pkg --wait
Troubleshooting
"Invalid trust settings" during export
The Developer ID certificate has custom trust overrides. See the Preflight section above to remove them.
"The binary is not signed with a valid Developer ID certificate"
The app was signed with a Development or App Store certificate. Re-export with method: developer-id in ExportOptions.plist.
"The signature does not include a secure timestamp"
Add --timestamp to manual codesign calls, or use xcodebuild -exportArchive which adds timestamps automatically.
Upload timeout for large files
Set a longer upload timeout:
ASC_UPLOAD_TIMEOUT=5m asc notarization submit --file ./LargeApp.zip --wait
Notarization returns "Invalid" but signing looks correct
Fetch the developer log for specific issues:
asc notarization log --id "SUBMISSION_ID"
Common causes: unsigned nested binaries, missing hardened runtime, embedded libraries without timestamps.
Notes
- The
asc notarizationcommands use the Apple Notary API v2, notxcrun notarytool. - Authentication uses the same API key as other
asccommands. - Files are uploaded directly to Apple's S3 bucket with streaming (no full-file buffering).
- Files over 5 GB use multipart upload automatically.
- Always use
--helpto verify flags:asc notarization submit --help.
Related skills
More from rudrankriyam/app-store-connect-cli-skills and the wider catalog.

asc-ppp-pricing
Set territory-specific pricing for subscriptions and in-app purchases using App Store Connect CLI.

asc-release-flow
Validate app readiness and drive App Store submission with asc, handling metadata, builds, IAP, subscriptions, and privacy checks.

asc-revenuecat-catalog-sync
Sync App Store Connect subscriptions and in-app purchases with RevenueCat catalogs.

asc-shots-pipeline
Automate iOS screenshot capture, framing, and App Store upload with xcodebuild, AXe, and Koubou.

asc-signing-setup
Set up iOS/macOS signing certificates, provisioning profiles, and bundle IDs via App Store Connect CLI.

asc-submission-health
Validate App Store submission readiness, submit versions, and monitor review status with asc commands.