This guide covers setting up Apple Developer ID code signing for ErrandDesktop distribution outside the Mac App Store.
- Sign in to Apple Developer
- Navigate to Certificates, Identifiers & Profiles → Certificates
- Click + to create a new certificate
- Select Developer ID Application (used for distributing outside the App Store)
- Follow the prompts to upload a Certificate Signing Request (CSR):
- Open Keychain Access → Certificate Assistant → Request a Certificate From a Certificate Authority
- Enter your email, set Request is: Saved to disk, click Continue
- Upload the generated
.certSigningRequestfile
- Download the generated
.cerfile and double-click to install it in Keychain Access
- Open Keychain Access
- In the login keychain under My Certificates, find Developer ID Application: Your Name (TEAM_ID)
- Right-click → Export
- Choose Personal Information Exchange (.p12) format
- Set a strong password — you'll need this as
CERTIFICATE_PASSWORD - Save the
.p12file
In your repository, go to Settings → Secrets and variables → Actions and add:
| Secret | Value |
|---|---|
CERTIFICATE_P12 |
Base64-encoded .p12 file (base64 -i certificate.p12 | pbcopy) |
CERTIFICATE_PASSWORD |
Password used when exporting the .p12 |
APPLE_ID |
Your Apple ID email (used for notarization) |
APPLE_PASSWORD |
App-specific password (generate at appleid.apple.com → Sign-In and Security → App-Specific Passwords) |
TEAM_ID |
Your 10-character Apple Developer Team ID (visible in the Developer portal under Membership) |
Create ErrandDesktop.entitlements in the project root:
<?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>com.apple.security.virtualization</key>
<true/>
</dict>
</plist>The com.apple.security.virtualization entitlement is required for the Apple Containerization framework to create and manage lightweight Linux VMs.
If you enable App Sandbox in the future, you will also need:
com.apple.security.network.client— for outgoing network connectionscom.apple.security.network.server— for the bridge API servercom.apple.security.files.user-selected.read-write— for user-selected file access
Currently the app runs without App Sandbox to allow full Containerization framework access.