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.

Overview

Safety Endpoint is deployed using two Jamf Pro components:

  1. Script — uploaded once under Settings, contains the deployment logic

  2. 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:

Exit Code
Meaning

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 KeyCreate Enrollment Key

  • Target devices running macOS 12 or later enrolled in Jamf Pro

Deploy Safety Endpoint

1

Get Your Enrollment Key

Log in to the Safety Platform, click Manage Enrollment KeyCreate Enrollment Key, and copy the generated key. This key links devices to your Safety organization.

2

Add the Script in Jamf Pro

  1. In Jamf Pro, go to SettingsComputer managementScripts

  2. Click New Script

  3. On the General tab:

    • Display Name: Safety Endpoint - Run

    • Category: Security (or your preferred category)

    • Information: Installs and maintains Safety Endpoint via the official setup script

  4. On the Script tab, paste the script below with your enrollment key:

  1. Click Save

3

Create the Setup Policy

  1. In Jamf Pro, go to ComputersPolicies

  2. Click New Policy

  3. On the Options tab, configure the General section:

    • Display Name: Safety Endpoint - Setup

    • Enabled: checked

    • Category: Security

    • Trigger: 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.

4

Attach the Script to the Policy

  1. Still on the Options tab, click Scripts in the left sidebar

  2. Click Configure

  3. Select the Safety Endpoint - Run script you created earlier

  4. Leave script parameters empty (the enrollment key is embedded in the script)

5

Set the Scope

  1. Click the Scope tab

  2. Under Targets, set Target Computers to All Computers or select specific computer groups

  3. Use the Limitations and Exclusions tabs if you need to narrow the scope further

6

Save and Verify

Click Save to deploy the policy.

Monitor Compliance

After deployment, monitor your fleet status in Jamf Pro:

  1. Go to ComputersPolicies

  2. Select Safety Endpoint - Setup

  3. Click Logs to view execution history

Status
What It Means
Action

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 ComputersSearch Inventory → select the device → HistoryPolicy 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.

1

Add the Uninstall Script

  1. In Jamf Pro, go to SettingsComputer managementScripts

  2. Click New Script

  3. On the General tab:

    • Display Name: Safety Endpoint - Uninstall

    • Category: Security

  4. On the Script tab, paste the following:

  1. Click Save

2

Create the Uninstall Policy

  1. Go to ComputersPoliciesNew Policy

  2. On the Options tab, configure the General section:

    • Display Name: Safety Endpoint - Uninstall

    • Enabled: checked

    • Category: Security

    • Trigger: Custom — enter the event name: safetyUninstall

    • Execution Frequency: Once per computer

  3. On the Options tab, click ScriptsConfigure → select Safety Endpoint - Uninstall

  4. On the Scope tab, select the target computers or groups

  5. 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.com

  • If your network uses a proxy, set the HTTPS_PROXY environment variable at the system level — curl on macOS respects standard proxy environment variables automatically

  • Verify 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 → GeneralLast 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 SettingsComputer managementCheck-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?