Jamf Pro
Deploy and manage Safety Endpoint on macOS devices using Jamf Pro Policies
This guide covers deploying Safety Endpoint to macOS devices using Scripts and Policies in Jamf Pro. The deployment uses a lightweight shell script that installs, updates, and verifies Safety Endpoint on a recurring schedule.
Jamf Pro required. Jamf Now does not support scheduled script execution. This guide requires Jamf Pro.
Overview
Safety Endpoint is deployed using two Jamf Pro components:
Script — uploaded once under Settings, contains the deployment logic
Policy — references the script, defines when and where it runs
The script downloads the official setup script from Safety over HTTPS and executes it. Since the setup script is idempotent, it handles installation, updates, and health checks internally. A built-in throttle ensures the script runs at most once per hour, even if the policy triggers more frequently.
The script reports status through its exit code:
0
Safety Endpoint is installed and up to date (or skipped — last run was less than 1 hour ago)
1
Setup failed — requires manual review
Prerequisites
Before starting, make sure you have:
Jamf Pro admin access with permissions to create Scripts and Policies
Enrollment key from the Safety Platform — click Manage Enrollment Key → Create Enrollment Key
Target devices running macOS 12 or later enrolled in Jamf Pro
Deploy Safety Endpoint
Get Your Enrollment Key
Log in to the Safety Platform, click Manage Enrollment Key → Create Enrollment Key, and copy the generated key. This key links devices to your Safety organization.
Add the Script in Jamf Pro
In Jamf Pro, go to Settings → Computer management → Scripts
Click New Script
On the General tab:
Display Name:
Safety Endpoint - RunCategory:
Security(or your preferred category)Information: Installs and maintains Safety Endpoint via the official setup script
On the Script tab, paste the script below with your enrollment key:
Make sure you replace REPLACE_WITH_YOUR_ENROLLMENT_KEY with your actual enrollment key before saving the script.
Click Save
Create the Setup Policy
In Jamf Pro, go to Computers → Policies
Click New Policy
On the Options tab, configure the General section:
Display Name:
Safety Endpoint - SetupEnabled: checked
Category:
SecurityTrigger: check both Recurring Check-in and Enrollment Complete
Execution Frequency: Ongoing
Using Ongoing with Recurring Check-in means the policy triggers at every check-in, but the script's built-in 1-hour throttle ensures it only performs work once per hour. The Enrollment Complete trigger ensures new Macs get Safety Endpoint immediately after enrollment.
Save and Verify
Click Save to deploy the policy.
Quick test: To verify the setup works on a specific Mac without waiting for the next check-in, run the following command on the device as root:
This forces an immediate check-in and triggers the policy. Check the policy logs in Jamf Pro to confirm it completed successfully.
Monitor Compliance
After deployment, monitor your fleet status in Jamf Pro:
Go to Computers → Policies
Select Safety Endpoint - Setup
Click Logs to view execution history
Completed
Script ran successfully
None — Safety Endpoint is installed or was already up to date
Failed
The script exited with a non-zero code
Click the log entry to view script output for error details
Pending
Device has not checked in yet
Wait for the next scheduled check-in
To view logs for a specific device, go to Computers → Search Inventory → select the device → History → Policy Logs.
Uninstall Safety Endpoint
If you need to remove Safety Endpoint from devices, create a separate policy with the uninstall wrapper script. Like the deployment script, it downloads the official uninstall script from Safety over HTTPS and executes it.
The uninstall script removes all Safety Endpoint artifacts from the machine, including configuration, firewall wrappers, package manager settings, and data for all user profiles.
Create the Uninstall Policy
Go to Computers → Policies → New Policy
On the Options tab, configure the General section:
Display Name:
Safety Endpoint - UninstallEnabled: checked
Category:
SecurityTrigger: Custom — enter the event name:
safetyUninstallExecution Frequency: Once per computer
On the Options tab, click Scripts → Configure → select Safety Endpoint - Uninstall
On the Scope tab, select the target computers or groups
Click Save
To trigger the uninstall on a device, run:
Self Service alternative: You can also make the uninstall policy available in Self Service. On the Self Service tab, check Make the policy available in Self Service, set the display name, and configure the button labels. Users with appropriate permissions can then trigger the uninstall themselves.
The script runs once per device with root privileges and will clean up:
Safety Endpoint binaries and system PATH entries
Per-user configuration, firewall wrappers, and shell profiles
Package manager configurations (pip, uv, npm)
Scheduled tasks and LaunchDaemons created by Safety Endpoint
Troubleshooting
Script fails with network errors
The script uses curl (pre-installed on macOS) to download the setup script over HTTPS. If the download fails:
Ensure the device has internet access to
getsafety.comIf your network uses a proxy, set the
HTTPS_PROXYenvironment variable at the system level —curlon macOS respects standard proxy environment variables automaticallyVerify no network appliance is blocking or intercepting HTTPS traffic to
getsafety.com
Policy does not run on devices
If the policy is not executing on target devices:
Verify the device is enrolled in Jamf Pro and checking in regularly (Computers → select device → General → Last Check-in)
Confirm the device is within the policy's Scope
Check that the Recurring Check-in trigger is enabled and the startup script is configured in Settings → Computer management → Check-In
Force an immediate check-in on the device with
sudo jamf policy
Script shows "skipping" every time
The message Last run was Xs ago (< 3600s). Skipping. means the throttle is working as expected. The script only performs work once per hour. If you need to force a re-run (e.g., for testing), delete the timestamp file on the device:
Policy shows "Failed" but Safety Endpoint is installed
A failed status means the script exited with a non-zero code. This can happen if:
The setup script detected a problem during its health check
A newer version failed to install
A temporary network issue occurred during the run
Check the policy logs for the specific device to see the script output. The next check-in will retry automatically (subject to the 1-hour throttle).
Policy does not retry after a failure
Jamf Pro has an internal 1-hour cooldown after a policy failure — if the script fails, Jamf will not retry it on that device for approximately 1 hour, regardless of check-in frequency. This is a server-side setting and is not configurable via the GUI.
On Jamf Pro (on-premises), the cooldown can be shortened via a database setting
On Jamf Cloud, this is not configurable — but it aligns with our script's 1-hour throttle, so the behavior is consistent
During testing, if you need to force a retry after a failure, edit the policy in the Jamf Pro console and click Save (even without changes) — this resets the cooldown for all devices.
Last updated
Was this helpful?

