The Modern macOS Package Builder
A robust CLI tool and Go library for building signed, notarized macOS
installer packages (.pkg) with auto-generated install scripts
— no manual scripting required.
Build a signed, notarized .pkg from a single JSON config file.
Generates postinstall, uninstall.sh, and upgrade scripts automatically.
Writes /etc/paths.d and /etc/manpaths.d entries so binaries are immediately discoverable.
Automatically signs binaries and the final installer with your Developer ID certificate.
Directly integrates with Apple's Notary API — no more xcrun altool.
First-class support for Welcome screens, READMEs, Licenses, and Dark Mode backgrounds.
Generate distribution packages with per-user installation domain choices.
Strips com.apple.quarantine attributes to prevent Gatekeeper false positives.
Dry-run mode prints all commands without touching the system — perfect for CI debugging.
| Field | Type | Default | Description |
|---|---|---|---|
id | string | required | Reverse-DNS package identifier, e.g. com.example.tool. |
name | string | required | Application name. Used as the install prefix component and in paths.d. |
version | string | "1.0.0" | Package version string. |
output | string | "out.pkg" | Output .pkg filename. |
single_user | boolean | false | Produce a distribution package with per-user installation domain choices. |
symlink_binaries | boolean | false | Create symlinks in /usr/local/bin/ for each detected binary. |
files | object | Map of dest_subdir → [source_paths]. Installed under /Library/<Name>/<Version>/. | |
distribution.* | object | UI assets for the installer wizard: readme, license, welcome, background, background_dark. | |
signing.identity | string | Developer ID Installer certificate name or hash. | |
signing.notarize | boolean | false | Submit the package to Apple's Notary API after signing. |
signing.issuer_id | string | App Store Connect API issuer ID. Env: MACOSNOTARYLIB_ISSUER_ID. | |
signing.key_id | string | App Store Connect API key ID. Env: MACOSNOTARYLIB_KID. | |
signing.private_key_b64 | string | Base64-encoded private key. Env: MACOSNOTARYLIB_PRIVATE_KEY. |
Validate config, create a temp staging directory, copy all files into it.
Remove com.apple.quarantine extended attributes from all staged files.
Auto-generate postinstall, preupgrade, postupgrade, and uninstall.sh from the file map.
Sign all executables in the staging directory with your Developer ID Application certificate.
Assemble the staged payload and scripts into a flat .pkg component.
Wrap into a distribution package when UI assets or single_user mode is enabled. Injects <domains> for per-user installs.
Sign the final package with your Developer ID Installer certificate.
Submit to Apple's Notary API and staple the resulting ticket to the package.