Skip to main content
Paste one command into a Jamf policy set to run daily. No script to write.

Before you begin

  • Admin access to Unbound and Jamf Pro.
  • macOS 13 or later, 300 MB free. Older Macs use the Python installer.
  • HTTPS allowed to getunbound.ai, unbound-release-artifacts.s3.us-west-2.amazonaws.com, and the hosts after --backend-url and --gateway-url in your command.

1. Copy the command

Sign in to your Unbound dashboard and open Configure — on a dedicated deployment that is your own address, not gateway.getunbound.ai. Select My org (MDM), then the macOS tab, and copy the command. It looks like this, with your own key and URLs:
YOUR_ADMIN_API_KEY is your admin API key: one key covers the whole fleet, and each Mac uses it to fetch its own device key. It arrives filled in, so paste the command exactly as copied.
If the command starts with sudo python3, follow the Python installer page instead.

2. Create the policy

Computers → Policies → New
1

General

Name it Unbound daily onboard, tick Enabled, set Trigger to Recurring Check-in and Execution Frequency to Once every day.
2

Files and Processes

Select Files and Processes → Configure, then paste the command into Execute Command as a single line.
3

Scope

Add one test Mac, then Save.
Anyone who can open the policy can read the API key it contains, so limit who can edit policies in Jamf.

3. Test, then roll out

On the test Mac, run sudo jamf policy -id POLICY_ID, where POLICY_ID is the number after id= in the policy’s URL. The first run takes a few minutes and ends with unbound-hook setup summary, every tool marked configured. Then confirm both:

Jamf

Computers → [the Mac] → History → Policy Logs shows Completed.

Unbound

In your Unbound dashboard, the Mac appears under Settings → Devices, and its Last Sync on AI Tools Discovery is recent.
When both pass, change the policy’s scope to your developer Mac group. To re-test the same day, open the policy’s Logs and select Flush.

Command flags

You do not need to edit the command. This is what it carries.

Troubleshooting

A failed run prints UNBOUND_INSTALL_FAILED step=<step> code=<n> in the policy log.

Remove Unbound

Disable the policy or remove the Macs from its scope, then run:
It prints UNBOUND_CLEAR_OK. To also delete what it leaves behind:

Deploy the package from your own Jamf

Use this when your security policy does not allow downloading software at install time. You verify the signed package once and host it in Jamf. Macs download nothing from Unbound when they install it.
1

Download

From the latest release, download unbound-runtime-<version>.pkg, unbound-runtime-<version>.pkg.sha256, jamf-setup.sh and jamf-setup.sh.sha256.
2

Verify the downloads

The signature must read Developer ID Installer: Websentry Inc (ZMA55FTA8W) and Notarization: trusted by the Apple notary service. spctl must print accepted and source=Notarized Developer ID. These two checks prove the package comes from Unbound unmodified. The hash files come from the same release, so they only catch a corrupted download: the two package hashes must match, and the script check must print jamf-setup.sh: OK.
3

Upload to Jamf

In Settings → Computer management → Packages, upload the package. In Settings → Computer management → Scripts, create a script named Unbound setup and paste the contents of jamf-setup.sh. Read it before you upload it. That is how you confirm the script, since its hash file comes from the same release. It is short, runs the installed runtime and downloads nothing. Its only network call reports the install result to your backend.Wait until the package no longer shows Availability pending before you run the policy. If it stays pending for more than an hour, delete it and upload it again.
4

Create the policy

Computers → Policies → New. Set Trigger to Recurring Check-in and Execution Frequency to Once per computer. Add the package with the Install action. Add the Unbound setup script with Priority set to After, and fill in its parameters from the command in Configure:Leave 5 and 8 empty. Test on one Mac as in step 3.
Jamf stores the API key in the policy and passes it to the script on each Mac, so anyone who can view the policy can read it. Limit who can view and edit policies in Jamf.
To repair tool settings every day the way the curl command does, add a second policy with only the Unbound setup script, the same parameters, and Once every day. Macs installed this way do not update on their own. When a new release ships, verify the new package, replace it in the policy, and Flush the policy logs so each Mac installs it once. To remove Unbound, run the Unbound setup script with parameter 8 set to clear. No key is needed. It prints UNBOUND_CLEAR_OK.

What gets installed

Before installing, the installer checks the package against a pinned SHA-256 hash and confirms it is signed by Unbound’s Developer ID, Team ID ZMA55FTA8W.
The discovery service scans the Mac on install and every twelve hours after that. Confirm it is running with sudo launchctl print system/ai.getunbound.discovery.The package receipt is ai.getunbound.runtime. Use it to build a Jamf Smart Group, or run pkgutil --pkg-info ai.getunbound.runtime to check the installed version.

Tamper Resistance

Keeping Unbound active on every device with managed settings.