Managed preferences
Every preference key Outbound reads from MDM, its type, what it forces and what the user still controls.
Outbound reads one managed-preference domain, com.outboundfirewall.outbound. An administrator forces keys in it with a configuration profile (payload type com.apple.ManagedClient.preferences); the sample profile on the IT page shows the layout, with the keys inside the forced mcx_preference_settings dictionary.
Only forced keys count
Section titled “Only forced keys count”A key only has an effect when the profile forces it. The app checks each key with objectIsForced, so the same key written as an ordinary user default (written by a script, defaults write, or a user) does nothing. This keeps a managed Mac managed: a value someone sets in their own preferences is never mistaken for the administrator’s.
Most forced keys with the wrong value type are ignored, and the stored setting stays in force. Invalid rule-feed settings instead stop feed updates and report a configuration error. The approval controls fail closed: an invalid ApprovalAuthority counts as none, an invalid SettingsLocked as true, and an invalid PauseAllowed, NetworkRescueAllowed or UninstallAllowed as false. Integers outside their range are clamped. For Mode, a value that is not one of the three mode names is ignored the same way. Nothing crashes and nothing falls back to a guessed default.
The app reads the forced keys at launch and observes the domain for changes, so editing the profile takes effect without a restart of the Mac. The background agent, which draws the menu bar item and runs the feed and audit export, reads the same forced values. The network filter reads them itself too, and it is the filter that sends audit lines to a SIEM.
The keys
Section titled “The keys”| Key | Type | What it does |
|---|---|---|
LicenseKey |
String | Licenses the Mac with this key, without a prompt. Settings › License then reads “This license is managed by your organization.”, Use a Different Key and Deactivate are hidden, and outboundctl refuses activation. |
LicenseDeviceName |
String | Optional name for this Mac’s licence activation. |
Mode |
String | Forces the operation mode: alert (Ask), silentAllow (Learn) or silentDeny (Strict). See Operation modes. |
ManagedRulesOverride |
Boolean | When true, managed rules from the feed take precedence over every other rule except priority rules. See Rules. |
UsersMayEditRules |
Boolean | When false, rule editing is locked: the app shows “Managed by your organization” and outboundctl refuses changes with exit status 77. See Locking settings. |
DisableAlerts |
Boolean | When true, no alert appears. An ask verdict is resolved without asking: denied in Strict mode, allowed otherwise. |
TelemetryBlockCategories |
Array of strings | Forces “Block known telemetry” on with exactly these categories, or off for an empty array. See below. |
RuleFeedURL |
String | HTTPS address of the managed rule feed. See Managed rule feed. |
RuleFeedPinnedSHA256 |
String | Optional. 64 hexadecimal digits; the feed is refused unless its exact bytes have this SHA-256. |
AuditExportPath |
String | Absolute path of the directory that receives a copy of the audit log. ~ is expanded. See Audit log export. |
ApprovalAuthority |
String | Who may approve loosening protection: user, administrator or none. |
SettingsLocked |
Boolean | When true, the settings lock stays on and cannot be turned off on the Mac. |
PauseAllowed |
Boolean | When false, pausing is refused, even with an administrator’s approval. |
NetworkRescueAllowed |
Boolean | When false, network rescue and turning the filter off are refused. |
UninstallAllowed |
Boolean | When false, Outbound cannot be removed on the Mac. |
RuleFeedPublicKeys |
Array of strings | Base64 Ed25519 public keys. When set, every rule feed must be signed by one of them. |
RuleFeedAllowRollback |
Boolean | When true, outboundctl feed rollback may reinstall a kept feed. |
RuleFeedAllowedRedirectHosts |
Array of strings | Extra hosts a rule-feed or blocklist download may be redirected to. |
DeviceGroups |
Array of strings | Groups this Mac belongs to, matched against a feed’s targets. |
TimeoutAction |
String | allow or deny for an alert nobody answers. |
AppAbsentAction |
String | allow or deny while the background agent is absent. |
AlertTimeoutSeconds |
Integer, 5 to 300 | How long a TCP alert waits. |
AllowQuitAgent |
Boolean | When false, the background agent cannot be quit. |
UpdatesEnabled |
Boolean | When false, app updates are off. |
UpdateChannel |
String | stable or beta. |
UpdateDeferralDays |
Integer, 0 to 90 | Holds back new updates by this many days. |
AIAssistantEnabled |
Boolean | When false, the Assistant and cloud AI are off. |
AIAllowedProviders |
Array of strings | Cloud AI provider IDs allowed; on-device AI stays allowed. |
MCPServerEnabled |
Boolean | When false, the MCP server cannot run or be installed. |
CodingAgentIntegrationEnabled |
Boolean | When false, coding agents cannot connect over ACP. |
CLIChanges |
String | Command-line changes: allow (tightening), ask (every change) or off. |
CLIChangesAllowed |
Boolean | Deprecated: use CLIChanges. Read for one release; true means allow, false means off. |
Blocklists |
Array of strings | Catalogue IDs that must stay subscribed. |
HistoryEnabled |
Boolean | When false, connection history is not recorded; rollups are unaffected. |
HistoryRetentionDays |
Integer, 1 to 400 | Days of connection history to keep. |
EncryptedDNS |
String | Forces the DNS provider: quad9, cloudflare, google, nextDNS (or nextdns), dns4eu, controld or custom. dns4eu selects DNS4EU Protective; controld selects Control D Unfiltered. An unknown value is ignored. |
AuditRemoteDetail |
String | Remote detail in audit lines and exports: full, domain or hashed. |
AuditHostIdentifier |
String | Host field in the sealed log: computerName or serialHash. |
AuditRetentionDays |
Integer, 1 to 400 | Days the sealed audit log is kept (30 when not forced). |
AuditFormat |
String | Format for audit sinks: jsonl, cef, leef or ecs. |
AuditSyslogURL |
String | Syslog server, syslog+tls://host:port. |
AuditSyslogPinnedSHA256 |
String | SHA-256 of the syslog server’s certificate; delivery stops on a mismatch. |
AuditHTTPURL |
String | HTTPS endpoint for an HTTP audit sink. |
AuditHTTPKind |
String | hec (Splunk), elastic (bulk) or generic JSON. |
AuditHTTPTokenKeychainLabel |
String | System keychain service that holds the HTTP sink’s token. |
AuditHTTPTokenFile |
String | Absolute path to a root-owned token file, mode 0600 or 0400, at most 8 KiB. |
AuditUnifiedLog |
Boolean | When true, redacted audit lines also go to the unified log. |
AuditSpoolMegabytes |
Integer, 1 to 2048 | Most data each audit sink queues, in MiB (default 256). |
OutboundTelemetryEnabled |
Boolean | Forces anonymous product telemetry on or off. |
Mode accepts the three mode names the app stores internally: alert, silentAllow and silentDeny. When the key is forced:
- The mode picker in the Firewall menu, the menu bar panel and the main window is disabled.
- The app explains why: “Your organization sets the mode” in the menu bar panel, “Your organization manages the mode on this Mac.” in the main window.
outboundctl prefs set moderefuses with “mode is set by your organization and cannot be changed from outboundctl.”
A Mode of any other value, or a value that is not a string at all, is ignored and the user’s own choice stays in force.
DisableAlerts
Section titled “DisableAlerts”With DisableAlerts forced true, connections that would ask are decided without an alert, in the filter itself. An ask verdict becomes deny in Strict mode and allow in Ask and Learn. The decision still appears in the Network Monitor and the audit log. outboundctl prefs set disable-alerts refuses while the key is forced.
TelemetryBlockCategories
Section titled “TelemetryBlockCategories”This key forces the “Block known telemetry” switch on the Telemetry settings page. The value is an array of category names:
analytics,crash-reporting,logging,feature-flags,advertising,attribution,session-replay- An empty array forces the switch off.
- Names this build does not know are ignored. Only forced arrays count; any other type is ignored.
The switch and the category toggles are then disabled in Settings, with a “Managed by your organisation” note. Apps a person turned telemetry off for stay off: the key does not touch per-app opt-outs. The rules appear in the Rules pane as one rule group named “Known telemetry”.
Rule feed and audit export
Section titled “Rule feed and audit export”RuleFeedURL and RuleFeedPinnedSHA256 drive the managed rule feed; AuditExportPath drives the audit export. Both are read by the background agent, and both fail safe: a feed address that is not HTTPS, or a pin that is not 64 hexadecimal digits, is reported as a configuration problem in Settings rather than silently ignored. An unusable pin never means “no pin”.
Reading the values yourself
Section titled “Reading the values yourself”outboundctl prefs listandoutboundctl prefs get <key>print the effective values, that is, your stored settings with every forced key laid over them. A forcedModeorDisableAlertsis visible there.outboundctl prefs setrefuses the two keys it can be overridden by (mode,disable-alerts) while they are forced. Other forced keys do not blockprefs set, but a change that would loosen protection is refused in any case and must be approved in the app.