Documentation

External access

What other apps can control, who is allowed, and what is never exposed.

Off by default. Turn it on in Settings → Integration. The master switch closes every adapter at once; each adapter also has its own switch.

What external access is

Other apps can ask Proxy Manager to do a small, fixed set of things: turn routing on or off, edit the hostname targets, edit per-app rules, read status, and open a window or a specific Settings pane. Everything else stays in the app.

The feature exists for automation — a Shortcut that toggles routing, a launcher that opens the Targets pane, a script that adds a host before a build. It is not a remote-control API for the whole app.

What can be controlled

ActionArgumentsKind
ping—read
capabilities—read
status—read
routing.explainhost:string, bundleID:string?read
routing.enable—policy
routing.disable—policy
routing.toggle—policy
routing.retry—policy
targets.listenabledOnly:bool?read
targets.addpattern:string, enabled:bool?policy
targets.removeid:uuid?, pattern:string?policy
targets.updateid:uuid, pattern:string?, enabled:bool?policy
targets.clearconfirm:boolpolicy
presets.list—read
presets.applyname:stringpolicy
apps.list—read
apps.setEnabledenabled:boolpolicy
apps.setDefaultmode:enumpolicy
apps.rule.setkey:string, keyKind:enum, mode:enum, enabled:bool?policy
apps.rule.removeid:uuid?, key:string?, keyKind:enum?policy
apps.resolvebundleID:string?, path:string?, pid:int?read
ui.openpane:enum, section:enum?, revealPattern:string?, revealAppRuleID:uuid?ui
app.activatepane:enum?ui

Mutations are idempotent and report whether they changed anything. Arguments marked ? are optional. Unknown arguments are rejected, so a typo fails instead of being ignored.

Kind is read, ui or policy. A few rules are not visible in the table:

  • targets.remove and apps.rule.remove take exactly one selector.
  • targets.clear requires confirm=true.
  • apps.rule.set never turns per-app routing on; use apps.setEnabled or the Shortcut.
  • ui.open with a section requires pane=settings.

Turn it on

Settings → Integration has one master switch and a switch per adapter:

SwitchWhat it closes
Allow external controleverything: the local socket, the XPC agent, URL links and Shortcuts
Apps and CLI (XPC)the com.proxymanager.control service and its socket
URL linksproxymanager:// delivery
Shortcuts and Sirithe App Intents
Keep an audit logaudit writes only; requests still run

Turning the master switch off stops the endpoint and unregisters the agent. Approvals are kept, so turning it back on does not ask again. revert.sh goes further and also removes the socket, token and approval file.

Who is allowed

  • Every app is approved once. The first request shows a sheet with Allow Control, Read Only or Deny. The grant is stored against the app's code-signing designated requirement, so a different binary claiming the same bundle identifier must ask again. Revoke any approval in Settings → Integration.
  • Two scopes. Read only can list targets, read status and explain routing. Control can also change routing, targets and per-app rules.
  • No administrator prompts, ever. An external call is never treated as a present user. If a privileged action were needed it would be deferred, exactly as for a background launch. A remote enable that could raise the password dialog would be a phishing primitive.
  • Rate limited and audited. 240 reads and 30 mutations per minute per caller, with a tighter limit on routing.toggle. Requests land in integration-audit.jsonl (0600) with redacted arguments.
  • The boundary is your user account. The socket is 0600 and the agent checks the caller's signature, but a process already running as you can read the token. This protects against accidental control and unapproved apps, not against malware running as you.

What is never exposed

  • The tunnel: endpoints, SSH credentials, the Keychain password.
  • The local proxy listener's bind host or port, and the system-proxy internals.
  • Shell/GUI environment injection, the privileged helper, Login Items.
  • Appearance, monitoring history, config import or reset.

Those stay UI-only even for an approved Control caller.

Errors

Every response carries a stable code: bad_request, unknown_action, invalid_argument (with the offending field), unauthorized, forbidden, not_found, conflict, busy, timeout, unavailable, unsupported, shutting_down, requires_user_action, internal.

Pick an adapter

  • URL links — zero dependencies, no reply channel, routing and windows only.
  • Shortcuts & Siri — the OS-native path for people.
  • Apps & CLI — typed request/reply for other software.