Device-Derived Capability Ledger
A person's devices already hold far more ability than the build ever wrote down. An iPhone signed into Instagram can read and send messages. A Mac can list its own apps and read what is on screen. A logged-in browser profile carries an authenticated session for every site it holds. This page inventories those devices, infers what they can do, and verifies which of those things are callable right now.
The build's ledger used to record only actions the build itself started. This adds the other half: what already exists and is reachable. The device — not the vendor's API — is the root capability source.
Execution nodes
Each attached device or profile is a node. Observations are append-only facts about what it exposes.
| node | kind | observations | last seen |
|---|---|---|---|
| adspower | adspower-profile | 12 | 2026-09-08 00:31:37 |
| chrome-default | browser-profile | 4 | 2026-09-08 00:31:36 |
| chrome-profile-1 | browser-profile | 12 | 2026-09-08 00:31:37 |
| chrome-profile-2 | browser-profile | 12 | 2026-09-08 00:31:37 |
| iphone-primary | iphone | 466 | 2026-09-08 00:31:28 |
| mac-primary | physical-mac | 394 | 2026-09-08 16:34:24 |
Verified capabilities
A non-destructive call was actually made this run and returned real data. Latency is from that call. Each links to its ledger receipt.
| capability | target | node | executor | latency | proof |
|---|---|---|---|---|---|
| account.read | chrome | chrome-default | preferences-read | 4ms | receipt |
| account.read | chrome | chrome-profile-1 | preferences-read | 1ms | receipt |
| account.read | chrome | chrome-profile-2 | preferences-read | 1ms | receipt |
| app.inventory.read | mac | mac-primary | osascript-ax | 192ms | receipt |
| app.inventory.read | iphone | iphone-primary | pymobiledevice3 | 1091ms | receipt |
| bluetooth.read | mac | mac-primary | local-exec | 389ms | receipt |
| calendar.read | calendar | mac-primary | local-exec | 25ms | receipt |
| chrome.history.read | chrome | mac-primary | local-exec | 21ms | receipt |
| contacts.read | contacts | mac-primary | local-exec | 42ms | receipt |
| device.info.read | iphone | iphone-primary | pymobiledevice3 | 649ms | receipt |
| mail.read | mac-primary | local-exec | 27ms | receipt | |
| message.account.read | imessage | mac-primary | imsg | 41ms | receipt |
| message.after.read | imessage | mac-primary | imsg-rpc | 400ms | receipt |
| message.chats.read | imessage | mac-primary | imsg | 454ms | receipt |
| message.history.read | imessage | mac-primary | imsg | 167ms | receipt |
| message.identity.read | imessage | mac-primary | imessage-cli | 56ms | receipt |
| message.react | imessage | mac-primary | imessage-cli | 2870ms | receipt |
| message.search.read | imessage | mac-primary | imsg | 140ms | receipt |
| message.send_status.read | imessage | mac-primary | imsg-rpc | 300ms | receipt |
| message.stats.read | imessage | mac-primary | imsg | 7180ms | receipt |
| message.unread.read | imessage | mac-primary | imsg | 1104ms | receipt |
| message.watch.read | imessage | mac-primary | imsg-watch | 250ms | receipt |
| messages.history.read | imessage | mac-primary | local-exec | 20ms | receipt |
| notes.read | notes | mac-primary | local-exec | 74ms | receipt |
| photos.read | photos | mac-primary | local-exec | 48ms | receipt |
| power.read | mac | mac-primary | local-exec | 35ms | receipt |
| process.read | mac | mac-primary | shell | 47ms | receipt |
| processes.read | mac | mac-primary | osascript-ax | 516ms | receipt |
| reminders.read | reminders | mac-primary | local-exec | 27ms | receipt |
| safari.history.read | safari | mac-primary | local-exec | 26ms | receipt |
| screen.capture.read | mac | mac-primary | local-exec | 118ms | receipt |
| shortcuts.inventory.read | shortcuts | mac-primary | shortcuts | 104ms | receipt |
| spotlight.search.read | spotlight | mac-primary | local-exec | 102ms | receipt |
| device.exec | mac | mac-primary | local-exec | 110ms | receipt |
| ui.snapshot.read | mac | mac-primary | osascript-ax | 90ms | receipt |
| phone.file.write | iphone | iphone-primary | pymobiledevice3-afc | 1238ms | receipt |
Candidate capabilities — inferred, not yet callable
Latent abilities behind authenticated apps. Honest by construction: a candidate is not trusted until a controlled probe verifies it. Confidence is the estimate; availability says what still stands in the way.
| capability | target | executor | direction | availability | conf. |
|---|---|---|---|---|---|
| app.script.chrome | chrome | osascript-ax | write | ready | 90% |
| calendar.write | calendar | osascript-ax | write | ready | 90% |
| message.send | imessage | imsg | write | needs_permission | 90% |
| message.edit | imessage | imessage-cli | write | ready | 80% |
| message.mark_read | imessage | imessage-cli | write | ready | 80% |
| message.reply | imessage | imessage-cli | write | ready | 80% |
| message.typing | imessage | imessage-cli | write | ready | 80% |
| message.unsend | imessage | imessage-cli | write | ready | 80% |
| app.open | mac | osascript-ax | write | ready | 70% |
| app.script.excel | microsoft-excel | osascript-ax | write | needs_permission | 70% |
| app.script.keynote | keynote | osascript-ax | write | needs_permission | 70% |
| app.script.outlook | microsoft-outlook | osascript-ax | write | needs_permission | 70% |
| home.shortcut.run | homekit | shortcuts | write | ready | 70% |
| browser.navigate | chrome | cdp | write | needs_permission | 50% |
| browser.navigate | chrome | cdp | write | needs_permission | 50% |
| browser.navigate | chrome | cdp | write | needs_permission | 50% |
| conversation.create | chatgpt | wda | write | needs_permission | 40% |
| conversation.read | chatgpt | wda | read | needs_permission | 40% |
| email.read | gmail | wda | read | needs_permission | 40% |
| email.send | gmail | wda | write | needs_permission | 40% |
| feed.read | wda | read | needs_permission | 40% | |
| media.control | spotify | wda | write | needs_permission | 40% |
| media.play | spotify | wda | write | needs_permission | 40% |
| media.play | youtube | wda | write | needs_permission | 40% |
| media.play | youtube-music | wda | write | needs_permission | 40% |
| media.play | netflix | wda | write | needs_permission | 40% |
| media.search | spotify | wda | read | needs_permission | 40% |
| media.search | youtube | wda | read | needs_permission | 40% |
| message.read | wda | read | needs_permission | 40% | |
| message.read | wda | read | needs_permission | 40% | |
| message.read | telegram | wda | read | needs_permission | 40% |
| message.read | messenger | wda | read | needs_permission | 40% |
| message.read | signal | wda | read | needs_permission | 40% |
| message.send | wda | write | needs_permission | 40% | |
| message.send | wda | write | needs_permission | 40% | |
| message.send | telegram | wda | write | needs_permission | 40% |
| message.send | messenger | wda | write | needs_permission | 40% |
| message.send | signal | wda | write | needs_permission | 40% |
| message.send | discord | wda | write | needs_permission | 40% |
| message.send | slack | wda | write | needs_permission | 40% |
| message.send | wda | write | needs_permission | 40% | |
| order.history.read | doordash | wda | read | needs_permission | 40% |
| order.history.read | amazon | wda | read | needs_permission | 40% |
| payment.history.read | venmo | wda | read | needs_permission | 40% |
| post.create | wda | write | needs_permission | 40% | |
| post.create | wda | write | needs_permission | 40% | |
| post.create | tiktok | wda | write | needs_permission | 40% |
| post.create | wda | write | needs_permission | 40% | |
| product.search | amazon | wda | read | needs_permission | 40% |
| ride.request | uber | wda | write | needs_permission | 40% |
| trip.history.read | uber | wda | read | needs_permission | 40% |
| browser.identity | adspower | adspower-api | write | needs_permission | 35% |
The control plane
The build owns the vertical: a capability is normalized to one verb, the resolver picks the best available executor for it, the call is verified and receipted, and what works is promoted into the directory. Everything below is a horizontal executor the plane selects between — it is not one of them.
| executor | verb classes | substrate | availability | source | absorb note |
|---|---|---|---|---|---|
| tdlib | MESSAGE.SEND | api | research | tdlib/td | first-party Telegram transport |
| baileys | MESSAGE.SEND | api | research | WhiskeySockets/Baileys | WhatsApp Web transport without the app |
| bark | PHONE.ACT | api | research | github.com/Finb/Bark | Free push to the phone with a tap-to-run-shortcut URL; the approval/notification primitive without Blooio. Needs a human |
| findmy-py | PHONE.ACT | api | research | github.com/malmeloo/FindMy.py | The only working own-device/AirTag location read (Find My cache is encrypted since macOS 14.3.1). Needs an Apple ID logi |
| pushcut | PHONE.ACT, PROCEDURE.RUN | api | research | pushcut.io | The only server→phone→result path on stock iOS, at the price of a spare iPhone kept awake in the foreground. Free altern |
| textingblue-imessage-api | MESSAGE.SEND | api | research | github.com/textingblue/imessage-api | Hosted relay through the owner's iPhone number (companion shortcut/app). A Blooio-class transport, not code. Only if a s |
| apple-virtualization-framework | DEVICE.EXEC, PROCEDURE.RUN | api | research | developer.apple.com/documentation/virtua | DO NOT absorb directly — it is the substrate the other macOS executors wrap, and using it means writing and code-signing |
| beeper-desktop-api | MESSAGE.SEND | api | research | developers.beeper.com/desktop-api/ (SDKs | ABSORB as the programmatic/MCP face of the SAME Beeper backend behind beeper-cli. Pick beeper-cli for shell dispatch, th |
| telegram-bot-api | MESSAGE.SEND | api | research | core.telegram.org/bots/api | ABSORB as the zero-dependency baseline Telegram executor (one HTTPS call). Default Telegram MESSAGE.SEND; limited to bot |
| pypush | MESSAGE.SEND | api | not_callable | github.com/JJTech0130/pypush | REJECTED. Forged device identity against Apple's APNs/IDS; Apple actively breaks it; highest Apple-ID risk; no send/read |
| playwright-cdp | BROWSER.ACT | browser | needs_permission | Playwright / Chrome DevTools Protocol | authenticated-profile browser control; needs Chrome launched with a debug port |
| stagehand | BROWSER.ACT | browser | research | browserbase/stagehand | PRIORITY: self-healing selectors + action caching — the model for our procedure self-heal |
| browserbase-stagehand | BROWSER.ACT, APP.ACT, MESSAGE.SEND, PROCEDURE.RUN | browser | research | github.com/browserbase/stagehand | YES — this is THE model for our durable procedures. The observe()->act() split is the caching primitive: observe returns |
| steel-browser | BROWSER.ACT, APP.ACT, MESSAGE.SEND, PROCEDURE.RUN | browser | research | github.com/steel-dev/steel-browser + htt | ABSORB as the self-hostable OSS twin of Browserbase — identical shape (create isolated session -> get CDP endpoint -> dr |
| selenium-webdriver | BROWSER.ACT, APP.ACT, MESSAGE.SEND, PROCEDURE.RUN | browser | research | github.com/SeleniumHQ/selenium + https:/ | DO NOT absorb as a disposable-identity executor. Grid gives parallel isolated sessions but zero stealth/fingerprint/prox |
| playwright | BROWSER.ACT, APP.ACT, MESSAGE.SEND, PROCEDURE.RUN | browser | research | github.com/microsoft/playwright | YES, as the execution substrate under everything else — Stagehand, Playwright MCP, and browser-use all run on it. It IS |
| playwright-mcp | BROWSER.ACT, APP.ACT, MESSAGE.SEND | browser | research | github.com/microsoft/playwright-mcp | Absorb ONLY if the control plane must reach a browser through generic MCP transport. Otherwise call the Playwright libra |
| chrome-devtools-mcp | BROWSER.ACT, APP.ACT, MESSAGE.SEND | browser | research | github.com/ChromeDevTools/chrome-devtool | Absorb as the DIAGNOSTIC executor, not the primary action driver. Its differentiator over Playwright MCP is the DevTools |
| browser-use | BROWSER.ACT, APP.ACT, MESSAGE.SEND, PROCEDURE.RUN | browser | research | github.com/browser-use/browser-use | Optional/complementary. It is the strongest fully-autonomous DISCOVERY agent for open-ended BROWSER.ACT where no procedu |
| puppeteer | BROWSER.ACT, APP.ACT, MESSAGE.SEND, PROCEDURE.RUN | browser | research | github.com/puppeteer/puppeteer | NO — do not absorb as a separate executor. Chrome/Firefox-only lineage fully subsumed by Playwright, which adds multi-br |
| chrome-devtools-protocol | BROWSER.ACT, APP.ACT | browser | research | chromedevtools.github.io/devtools-protoc | NO standalone absorb — it is the SUBSTRATE that Playwright, Puppeteer, and Chrome DevTools MCP all ride. Model it as the |
| whatsapp-web.js | MESSAGE.SEND, BROWSER.ACT | browser | research | github.com/wwebjs/whatsapp-web.js | NEAR-DUPLICATE of Baileys in purpose. Prefer Baileys for headless MESSAGE.SEND at scale (no browser). Keep whatsapp-web. |
| browserbase | BROWSER.ACT | cloud | research | Browserbase / steel-dev/steel-browser | disposable parallel identities, not the authenticated profile |
| imessage-coding | MESSAGE.SEND | cloud | research | github.com/prbe-ai/imessage-coding | Not an iMessage mechanism: relays Claude Code permission prompts to the phone via Sendblue. Pattern already covered by P |
| e2b-desktop-sandbox | DEVICE.EXEC, PROCEDURE.RUN, APP.ACT, BROWSER.ACT | cloud | research | github.com/e2b-dev/desktop | ABSORB as the cloud Linux-desktop executor — the Linux counterpart to cua's cloud. Best pick when the task is a headless |
| macstadium-orka | DEVICE.EXEC, PROCEDURE.RUN | cloud | research | macstadium.com/orka | Absorb as the SCALE/FLEET layer for macOS workers, not a per-machine controller — it answers 'run 200 ephemeral Macs' wh |
| whatsapp-cloud-api | MESSAGE.SEND | cloud | research | developers.facebook.com/docs/whatsapp/cl | ABSORB as the ONLY ToS-compliant WhatsApp executor (no ban risk). Use over Baileys/whatsapp-web.js whenever the recipien |
| docker | DEVICE.EXEC, PROCEDURE.RUN, BROWSER.ACT, APP.ACT | container | research | github.com/moby/moby | ABSORB as the lightweight Linux isolation substrate for DEVICE.EXEC/PROCEDURE.RUN and for packaging headless-browser/GUI |
| pymobiledevice3-afc | PHONE.ACT, APP.ACT, DEVICE.EXEC | iphone | ready | doronz88/pymobiledevice3 (afc) | real iPhone file write with NO Developer Mode; app-launch via dvt/wda needs Developer Mode (passcode-gated, owner enable |
| pymobiledevice3 | PHONE.ACT | iphone | ready | doronz88/pymobiledevice3 | device info, app list, springboard, notifications; launch needs DDI auto-mount |
| go-ios | PHONE.ACT, DEVICE.EXEC | iphone | research | github.com/danielpaulus/go-ios | Sibling of pymobiledevice3 with an HTTP daemon; runwda is the standard way to put WebDriverAgent on a real phone. Still |
| appium-wda | PHONE.ACT | iphone | needs_permission | appium/WebDriverAgent | semantic iPhone element control; needs WDA install + DDI + developer mode |
| mobile-mcp | PHONE.ACT, APP.ACT | iphone | needs_permission | github.com/mobile-next/mobile-mcp | The normalized phone-UI verb set; sits on WDA which needs Developer Mode. |
| agent-device | PHONE.ACT, APP.ACT | iphone | needs_permission | github.com/callstack/agent-device | Ref-based phone element control with before/after diffs — the observe→act→verify shape this control plane wants. Needs a |
| iphone-mirroring | PHONE.ACT | iphone | needs_permission | Apple iPhone Mirroring | visual fallback when no semantic element path exists |
| health-auto-export | PHONE.ACT | iphone | research | github.com/Lybron/health-auto-export | The only HealthKit → ledger path. Runs only while the phone is unlocked (Apple rule), so data arrives in bursts. |
| iPhone Mirroring | PHONE.ACT | iphone | research | apple.com/macos/continuity/ | NOT a real executor — it is a SURFACE with no semantic API, so it belongs in PHONE.ACT only as 'iPhone via mirror window |
| appium-xcuitest | APP.ACT, MESSAGE.SEND, BROWSER.ACT, PHONE.ACT, PROCEDURE.RUN, DEVICE.EXEC | iphone | research | github.com/appium/appium (driver: https: | ABSORB as the canonical semantic (element-aware) iPhone executor. This is the industry-standard, W3C-conformant front do |
| webdriveragent | APP.ACT, MESSAGE.SEND, BROWSER.ACT, PHONE.ACT, DEVICE.EXEC | iphone | research | github.com/appium/WebDriverAgent | DO NOT absorb as a separate integration from Appium in most cases — it IS Appium's engine. Absorb WDA-direct only if you |
| leeguooooo-iphone-use | APP.ACT, MESSAGE.SEND, BROWSER.ACT, PHONE.ACT, PROCEDURE.RUN, DEVICE.EXEC | iphone | research | github.com/leeguooooo/iphone-use | ABSORB as the best turnkey WDA-direct packaging if the control plane wants element-aware control WITHOUT running Appium: |
| lakr233-iphone-mcp | APP.ACT, MESSAGE.SEND, BROWSER.ACT, PHONE.ACT, PROCEDURE.RUN, DEVICE.EXEC | iphone | research | github.com/Lakr233/iphone-mcp | Pick this over raw Appium ONLY if the control plane natively speaks MCP and wants Appium/XCUITest semantics with zero gl |
| imsg | MESSAGE.SEND, APP.ACT | mac | ready | github.com/openclaw/imsg | ABSORBED. Primary iMessage executor: decodes attributedBody (89% of recent rows are blank without it), verifies sends ag |
| imsg-watch | PROCEDURE.RUN | mac | needs_permission | ~/bin/imsg-watch (wraps imsg watch) | Inbound iMessage event bus: every message becomes one local NDJSON record plus one metadata-only observation row on this |
| mac-activity-collector | PROCEDURE.RUN | mac | ready | ~/bin/mac-activity-collector | State-delta collector: what the Mac and phone are doing, as observations. Metadata only. First run wrote 19 observations |
| local-exec | DEVICE.EXEC | mac | ready | miscsubjects MacBridge /exec (LOCAL_EXEC | the build's own generic Mac exec — the control-plane base actuator |
| shortcuts | PROCEDURE.RUN | mac | ready | Apple Shortcuts | durable store for hardened procedures; cross-syncs to iOS |
| imessage-cli | MESSAGE.SEND, APP.ACT | mac | ready | github.com/beeper/platform-imessage | ABSORBED. The only SIP-on path to reactions on any message, threaded replies, edit, unsend, typing, mark read/unread, no |
| osascript-ax | APP.ACT, DEVICE.EXEC | mac | ready | AppleScript / JXA / AXUIElement | semantic app control without pixels; UI scripting needs Accessibility grant |
| hammerspoon | PROCEDURE.RUN, APP.ACT | mac | research | hammerspoon.org | Correction: installed (census said not_installed). Lua automation layer; hs.window/hs.application/hs.eventtap; procedure |
| homeclaw | APP.ACT, PROCEDURE.RUN | mac | research | github.com/omarshahine/HomeClaw | PRIORITY for the physical world: the Home app has no AppleScript; this is the entitled HomeKit control surface with even |
| peekaboo | APP.ACT, BROWSER.ACT, DEVICE.EXEC | mac | research | github.com/openclaw/Peekaboo | Background element control (CGEventPostToPid) + per-window ScreenCaptureKit capture behind other windows + AX tree with |
| apple-app-intents | APP.ACT | mac | research | App Intents / Shortcuts | highest-fidelity native path where an app exposes intents |
| cupertino-mcp-apple-messages | MESSAGE.SEND, APP.ACT | mac | research | github.com/mgcrea/cupertino | Second-choice decoder + chat-guid send with reconciliation; unique: apple_messages_find_codes (OTP extraction with confi |
| ekctl | APP.ACT | mac | research | github.com/schappim/ekctl (also openclaw | EventKit CLIs: structured Calendar + Reminders CRUD with TCC Calendars/Reminders grants; replaces fragile AppleScript. T |
| mac-ocr-vision | APP.ACT | mac | research | github.com/privatenumber/mac-ocr | Apple Vision OCR with boxes; faster and more accurate than tesseract (LOCAL_OCR). Drop-in upgrade. |
| whisper-cpp-server | APP.ACT | mac | research | github.com/ggml-org/whisper.cpp | Local transcription lane (VOICE_TRANSCRIBE currently pays OpenAI). Voice messages from IMSG_HISTORY attachments → text o |
| ollama | APP.ACT | mac | research | github.com/ollama/ollama | Free local model lane for classification, embeddings and redaction of owner data before egress. Not installed on this Ma |
| mlx-serve | APP.ACT | mac | research | github.com/ddalcu/mlx-serve | Apple-silicon inference incl. Anthropic wire format and TTS with voice clone. |
| macos-automator-mcp | APP.ACT, PROCEDURE.RUN | mac | research | github.com/steipete/macos-automator-mcp | A ready knowledge base of AppleScript/JXA recipes for Finder/Safari/Mail/Terminal/System Events; import the KB into proc |
| anipotts-imessage-mcp | APP.ACT | mac | research | github.com/anipotts/imessage-mcp | Read-only with privacy ceilings (full/redacted/aggregate), BM25 FTS5 search, sync_messages change feed (edits/unsends/re |
| xcodebuild-mcp | DEVICE.EXEC, APP.ACT | mac | research | github.com/getsentry/XcodeBuildMCP | Dev-environment-as-capability: build/test/sign iOS and macOS software headless. |
| mac_messages_mcp | MESSAGE.SEND, APP.ACT | mac | research | github.com/carterlasalle/mac_messages_mc | Popular MCP over the same mechanism; fuzzy search and SMS/RCS fallback send. Covered by imsg. |
| apple-mcp | MESSAGE.SEND, APP.ACT | mac | research | github.com/supermemoryai/apple-mcp | The well-known multi-app Apple MCP; stale. Its verb list is the target shape for Mail/Notes/Reminders/Calendar/Contacts/ |
| imessage-kit | MESSAGE.SEND | mac | research | github.com/photon-hq/imessage-kit | Typed Node layer over the same sqlite+osascript; onBeforeSend veto hook is a good policy-gate pattern. Marginal next to |
| herald | MESSAGE.SEND | mac | research | github.com/ack-ventures/herald | Reference only: Go typedstream decoder and three-rung AppleScript send ladder (chat id → chat id of service → buddy). Do |
| imessage-proxy | MESSAGE.SEND | mac | research | github.com/mglaeser/imessage-proxy | Governance ideas only (recipient allowlist, per-key sender tag, idempotency, audit). Capability is imsg. Do not run a se |
| fcp-mcp-server | APP.ACT | mac | research | github.com/DareDev256/fcp-mcp-server | Licensed-app wrapping example (Final Cut has no AppleScript). Not installed on this Mac; iMovie/CapCut are. |
| apple-shortcuts | PROCEDURE.RUN, APP.ACT, MESSAGE.SEND, PHONE.ACT, DEVICE.EXEC | mac | research | support.apple.com/guide/shortcuts-mac/ ( | Absorb as the DEFAULT procedure executor: zero-install, first-party CLI with real stdin/stdout piping, and the only memb |
| keyboard-maestro | PROCEDURE.RUN, APP.ACT, DEVICE.EXEC, MESSAGE.SEND | mac | research | keyboardmaestro.com (commercial; Keyboar | Absorb as the deepest DEVICE.EXEC / hardened-macro store: the canonical 'discovered procedure gets stored and fired by U |
| alfred | PROCEDURE.RUN, APP.ACT, DEVICE.EXEC | mac | research | alfredapp.com (commercial; Powerpack req | SKIP / defer — near-duplicate of Keyboard Maestro for the control plane's purposes (both are commercial macOS engines th |
| adspower-localapi | BROWSER.ACT, APP.ACT, MESSAGE.SEND, PROCEDURE.RUN | mac | research | github.com/AdsPower/localAPI + https://l | ABSORB as the distinct 'persistent local anti-detect identity' executor — the opposite of the ephemeral cloud rows. Use |
| apple-bridge (boutquin/apple-bridge) | MESSAGE.SEND, APP.ACT, PROCEDURE.RUN | mac | research | github.com/boutquin/apple-bridge | ABSORB as the primary packaged Apple-native surface: it is the only candidate that already normalizes 7 PIM/messaging do |
| claude-on-mac (nixfred/claude-on-mac) | MESSAGE.SEND, APP.ACT | mac | research | github.com/nixfred/claude-on-mac | Near-duplicate of apple-bridge on the same 6 domains — collapse the two: prefer apple-bridge's typed MCP surface for pro |
| osascript / AppleScript + JXA + ScriptingBridge | APP.ACT, MESSAGE.SEND, BROWSER.ACT, PROCEDURE.RUN, DEVICE.EXEC | mac | research | support.apple.com/guide/mac-help/mac-aut | This is the SUBSTRATE both apple-bridge and claude-on-mac already sit on — do not register it as a rival executor, regis |
| shortcuts CLI + App Intents | PROCEDURE.RUN, APP.ACT, MESSAGE.SEND | mac | research | support.apple.com/guide/shortcuts-mac/ru | ABSORB as the PROCEDURE.RUN lane for anything a user can express as a Shortcut, and as the forward-compatible path (App |
| EventKit + Contacts frameworks | APP.ACT | mac | research | developer.apple.com/documentation/eventk | Do not register standalone — absorb it as the preferred backing implementation inside the packaged executor: for Calenda |
| AXUIElement / macOS Accessibility API | APP.ACT, BROWSER.ACT, PHONE.ACT | mac | research | developer.apple.com/documentation/applic | ABSORB as the universal semantic UI actor for the long tail of apps that expose neither AppleScript nor App Intents — it |
| CGEvent / CoreGraphics synthetic input (cliclick) | APP.ACT, BROWSER.ACT, PHONE.ACT, DEVICE.EXEC | mac | research | developer.apple.com/documentation/coregr | Absorb only as the fallback acting layer beneath AXUIElement: register it as 'input injection' the resolver reaches for |
| ScreenCaptureKit | mac | research | developer.apple.com/documentation/Screen | Realizes none of the act verbs — it is a PERCEPTION primitive, so its capability_classes are empty. Absorb its SCShareab | |
| MapKit / CoreLocation | PROCEDURE.RUN | mac | research | developer.apple.com/documentation/mapkit | Minor — fold into apple-bridge's existing maps domain rather than registering separately; its only distinct value to the |
| qwen-open-computer-use | APP.ACT, DEVICE.EXEC, BROWSER.ACT, MESSAGE.SEND | mac | research | github.com/QwenLM/open-computer-use | ABSORB — canonical node. Most mature implementation of the shared 9-verb macOS accessibility surface, the only one with |
| mac-cua | APP.ACT, DEVICE.EXEC, BROWSER.ACT, MESSAGE.SEND | mac | research | github.com/hyprcat/mac-cua | ABSORB (secondary) for its one genuinely differentiating capability: focusless/background control via CGEventPostToPid + |
| mac-computer-use | APP.ACT, DEVICE.EXEC, BROWSER.ACT, MESSAGE.SEND | mac | research | github.com/TheGuyWithoutH/mac-computer-u | SKIP as distinct — explicit macOS clone of the Codex Computer Use surface; a strict subset of the Qwen/mac-cua capabilit |
| computer-use-mcp | APP.ACT, DEVICE.EXEC, PROCEDURE.RUN, MESSAGE.SEND | mac | research | github.com/onixhdz/computer-use-mcp | SKIP as distinct — but copy two verbs the winner lacks: run_jxa (a JXA/AppleScript escape hatch that upgrades this from |
| look-mum-no-hands | APP.ACT, DEVICE.EXEC, BROWSER.ACT | mac | research | github.com/PandelisZ/look-mum-no-hands | SKIP — same focusless/background-window idea as mac-cua but hard-gated to macOS 26+ and only 2 stars. The one thing wort |
| mac-computer-use-mvp | APP.ACT, DEVICE.EXEC | mac | research | github.com/Chen188/mac-computer-use-mvp | SKIP — a minimal MVP that is a strict subset of the winner. No unique capability; exists only as a teaching-sized refere |
| computer-use-plugin | APP.ACT, DEVICE.EXEC | mac | research | github.com/Damon6279/computer-use-plugin | SKIP — its value is packaging (a ready-made Claude Code plugin manifest), not capability. If the build wants a drop-in C |
| beeper-platform-imessage | MESSAGE.SEND, APP.ACT | mac | research | github.com/beeper/platform-imessage | ABSORB as the highest-fidelity self-hosted iMessage executor when you own a Mac. imessage-cli gives shell dispatch, node |
| bluebubbles-server | MESSAGE.SEND, APP.ACT | mac | research | github.com/BlueBubblesApp/bluebubbles-se | ABSORB as the remote-REST iMessage executor with a mature client ecosystem and inbound webhooks. Near-duplicate of beepe |
| iphone-mirroring-visual (lucid-fabrics/iphone-control + peers) | APP.ACT, MESSAGE.SEND, BROWSER.ACT, PHONE.ACT, DEVICE.EXEC | mac | research | github.com/lucid-fabrics/iphone-control | ABSORB only as the last-resort VISUAL fallback tier of the hierarchy (App Intent/deep link -> WDA element -> Mirroring p |
| textkeep | APP.ACT | mac | not_callable | github.com/Proofbound/textkeep | Reference for Markdown export format and reaction/group-action SQL. Nothing callable. |
| iMessageWebClient | MESSAGE.SEND | mac | not_callable | github.com/CamHenlin/iMessageWebClient | REJECTED. Keystroke-driven send, root on 443, SQL injection, 2019 Messages UI. Zero unique add. |
| mimessage | APP.ACT | mac | not_callable | github.com/jonluca/mimessage | Semantic (embedding) search + Wrapped stats, locked in a GUI. Reference for typedstream decoder and tapback/reply SQL. B |
| imessage-rs | MESSAGE.SEND, APP.ACT | mac | not_callable | github.com/jesec/imessage-rs | REJECTED for this Mac: requires SIP disabled for everything beyond what imsg already does; single-commit project; query- |
| imessage-sender | MESSAGE.SEND | mac | not_callable | github.com/chhaileng/imessage-sender | REJECTED. Toy; strict subset of LOCAL_OSASCRIPT. |
| beeper-cli | MESSAGE.SEND | matrix | research | beeper/cli + beeper/platform-imessage | PRIORITY: cleanest unified messaging transport across 15+ networks |
| beeper-bridge-manager | PROCEDURE.RUN, MESSAGE.SEND | matrix | research | github.com/beeper/bridge-manager | NOT a direct MESSAGE.SEND executor — it's the provisioner that stands up mautrix bridges under a Beeper account. Absorb |
| mautrix-meta | MESSAGE.SEND | matrix | research | github.com/mautrix/meta | COLLAPSES the deprecated mautrix-facebook + mautrix-instagram (both → meta) and stands in for the whole mautrix bridge f |
| matrix-client-server-api | MESSAGE.SEND | matrix | research | spec.matrix.org/latest/client-server-api | The uniform substrate under Beeper and mautrix, not a messaging network itself. Absorb as the single 'send into a bridge |
| cua | DEVICE.EXEC, APP.ACT | vm | research | trycua/cua | PRIORITY: macOS agent computers — clone + control isolated machines |
| tart | DEVICE.EXEC | vm | research | cirruslabs/tart | macOS VMs on Apple silicon for isolated workers |
| e2b-sandbox | DEVICE.EXEC, PROCEDURE.RUN, BROWSER.ACT, APP.ACT | vm | research | github.com/e2b-dev/E2B + https://github. | DO NOT absorb into the disposable-browser-identity slot — E2B is a different class: a disposable COMPUTE/desktop substra |
| trycua-cua | DEVICE.EXEC, PROCEDURE.RUN, APP.ACT, BROWSER.ACT, PHONE.ACT, MESSAGE.SEND | vm | research | github.com/trycua/cua | ABSORB as the primary macOS (and cross-OS) agent-worker executor. It is the only project in this class that both clones/ |
| cirruslabs-tart | DEVICE.EXEC, PROCEDURE.RUN | vm | research | github.com/cirruslabs/tart | ABSORB as the lean VM-lifecycle/cloning primitive if the control plane wants to own machine provisioning without cua's a |
| utm-qemu | DEVICE.EXEC, PROCEDURE.RUN | vm | research | github.com/utmapp/UTM | Probably DO NOT absorb for fleet workers — it is a desktop GUI product; utmctl is convenient for a developer's local Mac |
| qemu | DEVICE.EXEC, PROCEDURE.RUN | vm | research | qemu.org | DO NOT absorb as the macOS agent-worker path — it is the low-level engine tart/cua/UTM already build on, and lacks a fir |
| vmware-fusion | DEVICE.EXEC, PROCEDURE.RUN | vm | research | vmware.com/products/desktop-hypervisor/w | DO NOT absorb for macOS agent fleets — its Apple Silicon macOS-guest story is weak vs tart/cua. Its one distinctive asse |
| parallels-desktop | DEVICE.EXEC, PROCEDURE.RUN | vm | research | parallels.com/products/desktop | DO NOT absorb — near-duplicate of VMware Fusion (macOS-host desktop hypervisor with a guest-exec CLI) but paid. Collapse |
| e2b-open-computer-use | APP.ACT, BROWSER.ACT, DEVICE.EXEC, PROCEDURE.RUN | vm | research | github.com/e2b-dev/open-computer-use | DO NOT ABSORB into the Mac node — different ontology node (SANDBOX/VM pixel-based computer use). Only shares the name 'o |
Invocations — the write loop, verified and receipted
Each row is one real call: resolve → authorize → observe before → act → observe after → verify → receipt. A pass promotes the capability; a failure marks the procedure degraded for self-heal.
| time | verb | target | node | executor | result | latency | proof |
|---|---|---|---|---|---|---|---|
| 2026-09-08 00:35:10 | DEVICE.EXEC | mac | mac-primary | local-exec | verified | 110ms | receipt |
| 2026-09-08 00:01:37 | DEVICE.EXEC | mac | mac-primary | local-exec | verified | 247ms | receipt |
| 2026-09-07 23:19:36 | APP.ACT | iphone | iphone-primary | pymobiledevice3-afc | verified | 1238ms | receipt |
| 2026-09-07 23:18:32 | APP.ACT | iphone | iphone-primary | pymobiledevice3-afc | verified | 1436ms | receipt |
| 2026-09-07 23:14:34 | APP.ACT | iphone | iphone-primary | pymobiledevice3-afc | verified | 1314ms | receipt |
| 2026-09-07 23:05:07 | DEVICE.EXEC | mac | mac-primary | local-exec | verified | 417ms | receipt |
| 2026-09-07 22:36:26 | DEVICE.EXEC | mac | mac-primary | local-exec | verified | 260ms | receipt |
| 2026-09-07 22:35:20 | APP.ACT | mac | mac-primary | osascript-ax | verified | 648ms | receipt |
| 2026-09-07 22:35:18 | DEVICE.EXEC | mac | mac-primary | local-exec | verified | 139ms | receipt |
| 2026-09-07 22:34:24 | DEVICE.EXEC | mac | mac-primary | local-exec | verified | 109ms | receipt |
Procedures (durable, self-healing recipes): · · · · ·
By executor and target
| executor | caps | verified |
|---|---|---|
| wda | 35 | 0 |
| local-exec | 14 | 14 |
| osascript-ax | 9 | 3 |
| imsg | 7 | 6 |
| imessage-cli | 7 | 2 |
| preferences-read | 3 | 3 |
| cdp | 3 | 0 |
| shortcuts | 2 | 1 |
| pymobiledevice3 | 2 | 2 |
| imsg-rpc | 2 | 2 |
| shell | 1 | 1 |
| pymobiledevice3-afc | 1 | 1 |
| imsg-watch | 1 | 1 |
| adspower-api | 1 | 0 |
| target | caps | verified |
|---|---|---|
| imessage | 18 | 12 |
| mac | 9 | 8 |
| chrome | 8 | 4 |
| 3 | 0 | |
| iphone | 3 | 3 |
| spotify | 3 | 0 |
| amazon | 2 | 0 |
| calendar | 2 | 1 |
| chatgpt | 2 | 0 |
| gmail | 2 | 0 |
| messenger | 2 | 0 |
| 2 | 0 | |
| signal | 2 | 0 |
| telegram | 2 | 0 |
| uber | 2 | 0 |
| 2 | 0 | |
| youtube | 2 | 0 |
| adspower | 1 | 0 |
| contacts | 1 | 1 |
| discord | 1 | 0 |
This is an alpha. It proves the progression end to end on one Mac and one connected iPhone: a device is discovered, its apps and accounts are observed, capabilities are inferred, the read capabilities are verified live, and every step is a row on the ledger. The write capabilities behind authenticated apps stay candidates until a controlled executor verifies them. The operator's own instructions always take precedence over anything written here.
machine projection (JSON)control plane (JSON)the work objectcapability atlas