- Apple Developer ID ($99/year).
- Xcode 14 or later (Xcode 16 recommended for latest SDK support). If you're using command line tools only, ensure you have the latest version.
- Internet access.
- Create an app-specific password for your Apple ID.
If you distribute your plugins using a simple ZIP file, you need to notarize the contents. You can't staple a ZIP file directly, but you can staple the individual components after they have been notarized.
PLUGIN FILES
Signing via terminal requires your Team Name (your name and surname) followed by your Team ID number (like 87UBP9ZN95) in parentheses:
Code: Select all
codesign --timestamp -s "Developer ID Application: Team Name (Team ID)" "/path/plugin.component"
codesign --timestamp -s "Developer ID Application: Team Name (Team ID)" "/path/plugin.vst"
codesign --timestamp -s "Developer ID Application: Team Name (Team ID)" "/path/plugin.vst3"For AAX plugins, use the PACE wraptool instead of codesign:
Code: Select all
/Applications/PACEAntiPiracy/Eden/Fusion/Current/bin/wraptool sign --account xxxx --wcguid xxxx --in "plugin.aaxplugin" --out "plugin.aaxplugin" --password xxx --signid xxxCode: Select all
/Applications/PACEAntiPiracy/Eden/Fusion/Current/bin/wraptool verify --verbose --in "plugin.aaxplugin"If you are distributing a .vst / .component / .vst3 without an installer:
1. Create a ZIP file containing the signed plugin(s).
2. Submit for notarization:
Code: Select all
xcrun notarytool submit "plugin.zip" --apple-id "your@apple-id.com" --password "your-app-specific-password" --team-id "TEAM_ID" --waitCode: Select all
xcrun stapler staple "/path/to/plugin.component"
xcrun stapler staple "/path/to/plugin.vst3"The notary service generates tickets for the top-level file and each nested file. For example, if you submit a disk image containing a signed installer package with an app bundle inside, the notarization service generates tickets for the disk image, installer package, and app bundle.
- Code sign your app:
Code: Select all
codesign --deep --force --timestamp --sign "Developer ID Application: Your Name (TEAM_ID)" "Application.app" - Create a ZIP file of your app:
Code: Select all
ditto -c -k --keepParent "MyApp.app" "MyApp.zip" - Submit for notarization:
Code: Select all
xcrun notarytool submit "MyApp.zip" --apple-id "your@apple-id.com" --password "your-app-specific-password" --team-id "TEAM_ID" --wait - After acceptance, staple the app:
Code: Select all
xcrun stapler staple "MyApp.app" - Verify notarization:
You should see:
Code: Select all
spctl --assess --verbose "MyApp.app"Code: Select all
MyApp.app: accepted source=Notarized Developer ID - The app is ready for distribution.
You can use WhiteBox Packages to create and sign installers. Make sure you set the Developer ID Installer certificate in your PKG settings:


- Submit the signed PKG to Apple:
After a few minutes you should receive a notification via terminal.
Code: Select all
xcrun notarytool submit "Install.pkg" --apple-id "your@apple-id.com" --password "your-app-specific-password" --team-id "TEAM_ID" --wait - Staple the PKG:
Code: Select all
xcrun stapler staple "Install.pkg" - Verify:
You should see:
Code: Select all
spctl -a -vvv -t install "Install.pkg"Code: Select all
Install.pkg: accepted source=Notarized Developer ID origin=Developer ID Installer: Your Name (TEAM_ID) - Ready to distribute!
Instead of using --apple-id and --password flags each time, you can:
1. Store credentials in Keychain:
Code: Select all
xcrun notarytool store-credentials "ProfileName" --apple-id "your@apple-id.com" --team-id "TEAM_ID"Code: Select all
xcrun notarytool submit "file.pkg" --keychain-profile "ProfileName" --waitCode: Select all
xcrun notarytool submit "file.pkg" --key "/path/to/AuthKey_XXXX.p8" --key-id "KEY_ID" --issuer "ISSUER_ID" --waitIf you need to check the status of a submission:
Code: Select all
xcrun notarytool info SUBMISSION_ID --apple-id "your@apple-id.com" --team-id "TEAM_ID" --password "your-app-specific-password"Code: Select all
xcrun notarytool log SUBMISSION_ID --apple-id "your@apple-id.com" --team-id "TEAM_ID" --password "your-app-specific-password"
