Migrating from the script-based Detect deployment? Run Clean Up Script-Based macOS Detect Deployment before rolling out the
.pkg so the old runlayer-scan artifacts don’t conflict with com.runlayer.aiwatch.Overview
A signed, notarizedaiwatch binary installs once per device via .pkg. Tenant config (host + org API key, plus an enrollment key for Enforce) is pushed via MDM Configuration Profile. The .pkg bundles up to three launchd units: a scan LaunchAgent (user, default 15 min) for Detect, plus — when an EnrollmentKey is set — an enroll LaunchAgent (user, every 60 min, runs aiwatch enroll) and a hook-install LaunchDaemon (root, fast-retries every 60 s for the first 10 min after install then hourly, runs aiwatch setup hooks install --mdm) for Enforce.
Prerequisites
- Devices enrolled via UAMDM (User-Approved MDM) or DEP/ADE. TCC payloads are ignored on manually-enrolled MDM.
- An organization API key with the Detect Scan role minted in Settings → Organization API keys in the Runlayer dashboard. Record the secret value (
rl_org_...). - Your Runlayer tenant host URL (e.g.
https://your-instance.runlayer.com).
Apple Silicon only for now. The current release ships an
arm64 .pkg.Artifacts
The package is a.zip named aiwatch-<version>-macos-arm64.zip. Contents:
| File | Purpose |
|---|---|
aiwatch-<version>-macos-arm64.pkg | Signed + notarized installer (single aiwatch binary + scan & enroll LaunchAgents + hook-install LaunchDaemon) |
com.runlayer.aiwatch.pppc.mobileconfig | Full Disk Access / TCC grants (upload as-is) |
com.runlayer.aiwatch.loginitems.mobileconfig | Pre-approves the bundled LaunchAgents on macOS 13+ (upload as-is; LabelPrefix=com.runlayer.aiwatch covers all current and future user-context units) |
.zip yet.
Deploy the three Configuration Profiles before the
.pkg. Profiles must land in /Library/Managed Preferences/ and TCC before the bundled LaunchAgent’s first scan tick — otherwise aiwatch logs host not configured and TCC denies project-config reads until the next MDM sync.Deployment
Upload PPPC profile
Computers → Configuration Profiles → Upload. Upload
com.runlayer.aiwatch.pppc.mobileconfig as-is. Scope to your AI Watch Smart Group.The profile pins Full Disk Access to Developer ID team AF2M8HC7A2 + identifier com.runlayer.aiwatch — only the Anysource-signed binary satisfies the CodeRequirement. No edits.Upload Login Items profile
Computers → Configuration Profiles → Upload. Upload
com.runlayer.aiwatch.loginitems.mobileconfig as-is. Scope to the same Smart Group.Pre-approves the bundled LaunchAgent on macOS 13+ so users don’t see “Background Item Added” notifications.Create the tenant-config profile via JSON Schema
- Computers → Configuration Profiles → New → Application & Custom Settings → External Applications → Add → Custom Schema.
- Preference Domain:
com.runlayer.aiwatch. - Paste the contents of
com.runlayer.aiwatch.jamf.schema.jsoninto the schema source field. - Fill in Tenant Host (e.g.
https://your-instance.runlayer.com) and Org API Key (therl_org_...secret). - Scope to the same Smart Group.
Upload the .pkg and create a deployment Policy
Jamf → Computers → Management Settings → Computer Management → Packages → New. Upload
aiwatch-<version>-macos-arm64.pkg.Create a Policy to deploy the package: Computers → Policies → New. Add the package, set Trigger to Recurring Check-in and Frequency to Once per computer. Scope to the same Smart Group./Library/Managed Preferences/com.runlayer.aiwatch.plist. Rotating the API key later: edit the Jamf profile and re-publish — no .pkg reinstall.