| Component | Runs as | Language | Required? |
|---|---|---|---|
microbridged |
app-owned child (standard GUI) or launchd service (explicit headless mode) | Rust | yes |
| First-party integrations (ChatGPT, Claude Desktop, Codex CLI, Claude Code, CNVS, Synara/Conductor attribution) | in-process modules of the daemon | Rust | bundled |
| Managed integrations (OpenCode, Cursor, Factory, T3 Code) | host plugins/hooks or socket clients | Rust/Node | opt-in |
| Community integrations | separate processes on the socket | any | optional |
| Menu bar app | primary UI (tray + settings + focus HUD) | Tauri 2 + React (apps/microbridge-ui) |
yes (default install) |
The daemon owns three things: the status bus (session registry fed by adapters), the focus policy (which session owns the deck), and the device layer (LED frames out, key events in). Integrations never touch the device — see protocol.md.
On macOS, the signed menu-bar app is the only standard Login Item and starts the bundled daemon for its own lifetime. Legacy UI/daemon LaunchAgents migrate only after the native login item and bundled socket are proven working. Users who deliberately enable the Homebrew headless service may still have a separate daemon background item.
These are commitments, not aspirations. CI and release checklists hold the line; regressions are release blockers.
| Metric | Budget | How |
|---|---|---|
| Idle CPU | near-idle with bounded wakeups | local session and frontmost-app watchers are event-driven; enabled hardware input is drained on a 16 ms tick, physical HID presence refreshes every 2 seconds without reopening a stable device, CNVS refreshes its local snapshot every 2 seconds while agents are active and every 10 seconds while idle, and an enabled paired T3 adapter refreshes at 900 ms with exponential backoff. |
| Idle RSS (daemon) | < 15 MB, target single-digit | single static Rust binary, no runtime |
| Network | explicit only | no telemetry; CNVS uses only its token-authenticated loopback endpoint, update checks are opt-in, T3 traffic requires an enabled paired environment, and Factory invokes the signed-in Droid CLI only for a requested control |
| Device traffic | bytes per state transition | LED frames written only when resolved state changes; a 32–64 byte HID report each |
| Disk | config file + log (rotated) | logs at info are transition-only |
First-party integrations are compiled into the daemon precisely to protect this
budget: watching ~/.codex/sessions or Claude Code hooks is file watching.
The paired T3 adapter uses a bounded refresh with exponential backoff because
the supported HTTP contract is snapshot-based. Cursor and Factory use one-shot
managed hooks and leave no resident helper process. Factory starts Droid
JSON-RPC only for an interrupt or reasoning-effort action and exits afterward.
OpenCode uses its official event plugin and creates no polling loop; reconnects
to the local daemon use bounded backoff. CNVS exposes snapshot state, so its in-process integration uses an adaptive
local-only refresh and publishes only changed sessions. It rereads CNVS's
endpoint descriptor for each scan or action, never persists its token, and
rejects endpoints that are not loopback addresses.
The deck shows exactly one session at a time:
- Approvals preempt. A session entering
awaiting_approvaltakes the deck (and the approve/reject keys) until resolved. - Pinned beats auto. The user can pin a session from Settings or a device key; pinning disables auto-follow until unpinned.
- Auto-follow. Otherwise the frontmost app's active session owns the
deck — driven by
NSWorkspacefrontmost-app notifications (event-driven, not polled). - Fallback. With no other signal, the most recently updated session wins.
Integrations never seize the hardware. Commands route only to the focused session's owner and only when that owner advertised the required capability.
- macOS is the reference platform (Micro owners skew Mac).
- Linux should work for daemon + socket; HID via
hidapiin M2. - Windows needs a named-pipe transport and is scheduled for M5.
- The socket lives in the user's home directory with mode
0600; there is no privileged component. The logged-in macOS user is the trust boundary. - Management messages require a completed, protocol-compatible
uihandshake. Client roles prevent accidental adapter privilege; they do not claim to isolate mutually hostile processes already running as the same user. - Actions route only through advertised host contracts. Most are JSON commands
to adapters; Factory actions start the user-installed
droidCLI in its documented JSON-RPC mode for that single request. CNVS actions use its authenticated loopback API and include the exact canvas and terminal node. - Hardware access is best-effort reverse engineering of the Micro's HID
protocol; the device layer is isolated in
mb-deviceso a firmware change cannot ripple past one crate.