JAMF deployment
A complete JAMF rollout requires three pieces:
- A Bootstrap script that writes
/etc/preamp/bootstrap.envbefore the .pkg installs. This carries the org enrollment token and the assigned user’s email so each device attributes to a real person on the Workforce tab. - The managed
.pkg, deployed via a JAMF policy. - A PPPC Profile granting Full Disk Access to the agent’s binary.
An optional Configuration Profile with preference domain ai.preamp tunes runtime settings (schedule, full-backup interval, allow-uninstall, custom apiUrl for air-gapped installs). Not required for enrollment.
Prerequisites
- Preamp admin console access (to generate an enrollment token).
- JAMF Pro tenant with permission to upload scripts, configuration profiles, and packages.
- The signed
preamp-managed-<version>.pkg. See Package downloads for the URL and SHA-256 verification steps. - At least one verified domain for your org under
app.preamp.ai → Settings → Domains. Without it, devices still back up but land in the per-org unattributed bucket on the Workforce tab instead of attributing to a real person.
Steps
-
Generate an enrollment token in the Preamp admin console (https://app.preamp.ai/org/fleet/devices?tab=enrollment). Copy it immediately, the plaintext is shown only once.
-
Add the bootstrap script to JAMF. In Settings → Computer Management → Scripts create a new script named
Preamp bootstrapwith these parameter labels:Parameter Label Value at policy time Parameter 4 Org token The token from step 1. Parameter 5 User email JAMF substitution for the assigned user’s email (typically the EMAILfield from User and Location). Must be a verified-domain address for per-person attribution.Parameter 6 Display name Optional. JAMF substitution for the assigned user’s real name (often $REALNAME).Paste this body:
#!/bin/bash set -euo pipefail TOK="${4:-}" EM="${5:-}" NM="${6:-}" if [[ -z "$TOK" ]]; then echo "preamp bootstrap: parameter 4 (org token) is required" >&2 exit 1 fi mkdir -p /etc/preamp chmod 0700 /etc/preamp umask 077 { printf 'PREAMP_ORG_TOKEN=%s\n' "$TOK" printf 'PREAMP_USER_EMAIL=%s\n' "$EM" printf 'PREAMP_USER_NAME=%s\n' "$NM" } > /etc/preamp/bootstrap.env chmod 0600 /etc/preamp/bootstrap.env -
Upload the managed
.pkg(preamp-managed-<version>.pkg) to JAMF’s package repository. -
Create the deployment policy. Computers → Policies → New:
- Scripts payload: add the
Preamp bootstrapscript. Set Priority to Before. Fill in the parameters per the table above. - Packages payload: add
preamp-managed-<version>.pkg. - General → Trigger: Check-in.
- General → Frequency: Once per computer.
- Scope: the target Macs.
The script writes the bootstrap file, then the .pkg installs, then the postinstall reads the file, runs
preamp enrollas the console user, and deletes the bootstrap file on success. - Scripts payload: add the
-
Import the PPPC template (
installers/macos/pppc-template.xmlfrom the agent repo) into JAMF’s PPPC Utility, fill in$TEAM_IDand$CODE_REQUIREMENTfrom your signed binary, and upload the resulting profile. See the PPPC profile guide for the exactcodesigninvocations. -
Scope the PPPC profile to the same target set as the deployment policy.
-
(Optional) Tune runtime settings via Configuration Profile. If you need to override the default schedule, set a custom
apiUrlfor air-gapped installs, or enable user-initiated uninstall, create a Configuration Profile in JAMF Pro using the Application & Custom Settings payload with preference domainai.preamp. See the managed preferences reference for available keys. The Configuration Profile is independent of enrollment.
Verification
On a target Mac after the policy runs:
/etc/preamp/bootstrap.envis absent (the postinstall deletes it on successful enroll; presence means enroll failed, check the policy run log).- The agent appears in System Settings → Privacy & Security → Full Disk Access with a grey toggle (meaning an MDM granted it).
- The device shows up under the assigned user on
app.preamp.ai/org/inventory/workforce. If it lands under Unattributed devices, the assigned user’s email domain isn’t in the org’s verified-domains list. Add it underapp.preamp.ai → Settings → Domainsand retry; the next policy run re-attributes the device.
Failure modes
- Console user is
rootat install time (login window, fresh image before first login). The postinstall logsno console user; deferring enroll until next policy runand leaves the bootstrap file in place. The next JAMF policy run picks it up. - Bootstrap env file is malformed (typo in a key, missing
=). The agent’s parser rejects malformed lines andpreamp enrollexits non-zero, visible in the JAMF policy log. The bootstrap file stays in place for diagnosis. - Email is outside the org’s verified domains. Enroll succeeds but the device lands in the unattributed bucket. Verify your org domains and retry; the bootstrap file is removed on first successful enroll regardless of attribution outcome.
Uninstall
Deploy preamp-uninstaller-<version>.pkg via the same JAMF policy mechanism. The uninstaller pkgutil --forgets itself so repeated runs are safe. If you set allowUninstall: true in a Configuration Profile, the uninstaller also removes per-user data trees.
Trust note
The org token is sensitive. It appears in JAMF policy logs unless logging is suppressed for the bootstrap script step. Treat it like any other secret in your MDM tenant, and rotate via app.preamp.ai → Settings → Enrollment tokens → Revoke if exposed. The postinstall removes the on-disk bootstrap file as soon as enroll succeeds; if you see the file lingering on a managed Mac, that’s a signal enroll didn’t complete.