Skip to content

macOS Permissions

macOS gates access to the screen, input events, and protected files behind per-app privacy permissions (TCC). The Breeze agent and its desktop helper need three of these permissions for full functionality. Apple does not allow applications to grant these permissions to themselves – the supported paths are an MDM-delivered PPPC (Privacy Preferences Policy Control) configuration profile for zero-touch deployment, or a manual grant in System Settings.

Permission Binary Used For How to Grant
Full Disk Access /usr/local/bin/breeze-agent, /usr/local/bin/breeze-desktop-helper System data collection, backup features MDM PPPC profile (zero-touch) or manual System Settings grant
Accessibility /usr/local/bin/breeze-agent, /usr/local/bin/breeze-desktop-helper Remote input (mouse and keyboard) during remote desktop sessions MDM PPPC profile (zero-touch) or manual System Settings grant
Screen Recording /usr/local/bin/breeze-desktop-helper Remote desktop screen capture User approval only. MDM cannot pre-grant it – a PPPC profile can only allow standard (non-admin) users to approve it themselves, via the ScreenCapture service’s AllowStandardUserToSetSystemService authorization (macOS 11+)

If the Mac is enrolled in an MDM (Jamf, Mosyle, Kandji, Intune, etc.), deploy a PPPC configuration profile that grants Full Disk Access and Accessibility to both Breeze binaries. This is the recommended path for fleet deployments – no on-device interaction is required for those two permissions.

The profile identifies each binary by its installed path plus a code-signing requirement, so the grant only applies to a genuine, Developer ID-signed Breeze binary at that path.

The following profile is ready to import into your MDM (most consoles accept a raw .mobileconfig upload):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadType</key>
<string>com.apple.TCC.configuration-profile-policy</string>
<key>PayloadIdentifier</key>
<string>com.breezermm.pppc.privacy</string>
<key>PayloadUUID</key>
<string>7D3F2A91-5B4C-4E8D-9A16-C2E7F0B83D54</string>
<key>PayloadVersion</key>
<integer>1</integer>
<key>PayloadDisplayName</key>
<string>Breeze Agent Privacy Preferences</string>
<key>Services</key>
<dict>
<key>SystemPolicyAllFiles</key>
<array>
<dict>
<key>Identifier</key>
<string>/usr/local/bin/breeze-agent</string>
<key>IdentifierType</key>
<string>path</string>
<key>CodeRequirement</key>
<string>(identifier "breeze-agent-darwin-arm64" or identifier "breeze-agent-darwin-amd64") and anchor apple generic and certificate leaf[subject.OU] = D8W6N2JYMA</string>
<key>Allowed</key>
<true/>
</dict>
<dict>
<key>Identifier</key>
<string>/usr/local/bin/breeze-desktop-helper</string>
<key>IdentifierType</key>
<string>path</string>
<key>CodeRequirement</key>
<string>(identifier "breeze-desktop-helper-darwin-arm64" or identifier "breeze-desktop-helper-darwin-amd64") and anchor apple generic and certificate leaf[subject.OU] = D8W6N2JYMA</string>
<key>Allowed</key>
<true/>
</dict>
</array>
<key>Accessibility</key>
<array>
<dict>
<key>Identifier</key>
<string>/usr/local/bin/breeze-agent</string>
<key>IdentifierType</key>
<string>path</string>
<key>CodeRequirement</key>
<string>(identifier "breeze-agent-darwin-arm64" or identifier "breeze-agent-darwin-amd64") and anchor apple generic and certificate leaf[subject.OU] = D8W6N2JYMA</string>
<key>Allowed</key>
<true/>
</dict>
<dict>
<key>Identifier</key>
<string>/usr/local/bin/breeze-desktop-helper</string>
<key>IdentifierType</key>
<string>path</string>
<key>CodeRequirement</key>
<string>(identifier "breeze-desktop-helper-darwin-arm64" or identifier "breeze-desktop-helper-darwin-amd64") and anchor apple generic and certificate leaf[subject.OU] = D8W6N2JYMA</string>
<key>Allowed</key>
<true/>
</dict>
</array>
<key>ScreenCapture</key>
<array>
<dict>
<key>Identifier</key>
<string>/usr/local/bin/breeze-desktop-helper</string>
<key>IdentifierType</key>
<string>path</string>
<key>CodeRequirement</key>
<string>(identifier "breeze-desktop-helper-darwin-arm64" or identifier "breeze-desktop-helper-darwin-amd64") and anchor apple generic and certificate leaf[subject.OU] = D8W6N2JYMA</string>
<key>Authorization</key>
<string>AllowStandardUserToSetSystemService</string>
</dict>
</array>
</dict>
</dict>
</array>
<key>PayloadDescription</key>
<string>Grants Full Disk Access and Accessibility to the Breeze agent and desktop helper, and allows standard users to approve Screen Recording.</string>
<key>PayloadDisplayName</key>
<string>Breeze RMM - macOS Privacy Permissions</string>
<key>PayloadIdentifier</key>
<string>com.breezermm.pppc</string>
<key>PayloadScope</key>
<string>System</string>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>E19C6B0F-8A72-4D35-B6E4-1F5A9D27C803</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

The code requirements match both the Apple Silicon (-darwin-arm64) and Intel (-darwin-amd64) builds, so a single profile covers a mixed fleet. You can verify the signing identity of an installed binary at any time:

Terminal window
codesign -dvvv /usr/local/bin/breeze-agent 2>&1 | grep -E '^Identifier|TeamIdentifier'
# Identifier=breeze-agent-darwin-arm64
# TeamIdentifier=D8W6N2JYMA

Without an MDM, grant the permissions on the device under System Settings > Privacy & Security:

  1. Full Disk Access – open Privacy & Security > Full Disk Access, click +, press Cmd+Shift+G in the file picker, and add /usr/local/bin/breeze-agent and /usr/local/bin/breeze-desktop-helper.

  2. Accessibility – open Privacy & Security > Accessibility and add the same two binaries.

  3. Screen Recording – open Privacy & Security > Screen & System Audio Recording (labeled Screen Recording on macOS 12-14) and enable breeze-desktop-helper. If the helper has already attempted a capture, it appears in the list automatically; otherwise the first remote desktop connection triggers the standard macOS approval prompt.

Changes to Full Disk Access take effect after the agent service restarts:

Terminal window
sudo launchctl kickstart -k system/com.breeze.agent

A permission “disappears” after an agent update. TCC grants are keyed to the binary’s code-signing identity, not just its path. Official Breeze binaries are Developer ID signed with a stable identity, so grants survive updates. If a grant stops applying after an update, check that the binary is still properly signed:

Terminal window
codesign -dvvv /usr/local/bin/breeze-agent

Expect Authority=Developer ID Application: LanternOps LLC (D8W6N2JYMA) and TeamIdentifier=D8W6N2JYMA. An ad-hoc or unsigned binary – typical of a manual or development build – gets a new identity on every build, so macOS treats each update as a brand-new app and drops the grant. Reinstall an official signed release, or re-grant after each build for development installs.

The PPPC profile is installed but permissions are not granted. Confirm the profile arrived through MDM (profiles list should show it under a device channel). PPPC payloads are ignored when the profile is installed manually. Also verify the code requirement matches the installed binary: codesign -d -r- /usr/local/bin/breeze-agent prints the designated requirement to compare against.

Remote desktop connects but shows a black screen. Screen Recording has not been approved for breeze-desktop-helper. This permission always requires a one-time user approval – see the table above.