Build muxr extensions
muxr extensions are Herdr plugins with an optional declarative phone UI. Bundled features and third-party plugins use the same public contract.
Create one
muxr plugin create my-plugin
cd my-plugin
muxr plugin check .
muxr plugin dev . --web
The generated plugin contains:
herdr-plugin.toml— identity, backend entrypoints, permissions, and lifecycle hooks.muxr-ui.json— declarative phone surfaces, shortcuts, RPC contributions, and optional realtime streams.- A backend entrypoint for bounded actions and data. The phone never downloads executable plugin UI.
What extensions can add
Plugins compose the same flat primitive vocabulary used by muxr's bundled features:
- Home, session, settings, and composer contributions
- Lists, item metadata, forms, trees, folder selection, and detail screens
- Bounded code and unified-diff views with app-owned syntax highlighting, line numbers, light/dark themes, and plain-text fallback
- Validated actions, navigation, accessibility text, and localization keys
- Shortcuts and invalidation events
- Bounded host context and backend RPCs
- Generic PCM/WebRTC realtime streams
The kernel retains pairing, encryption, permissions, secure storage, terminal rendering, foreground services, and OS bridges. Plugins supply product behavior without shipping React Native code, native modules, HTML, arbitrary WebViews, or executable phone UI.
{ "type": "code", "path": "data.body", "fileNamePath": "data.name" }
{ "type": "diff", "path": "data.patch" }
The app infers common languages from the file name, bounds tokenization work, and renders unknown formats as selectable plain text.
Install and manage
muxr plugin install ./my-plugin
muxr plugin list
muxr plugin update ./my-plugin
muxr plugin remove my-plugin
Plugins can also be installed from a pinned GitHub ref or exact npm version. Approval, disable, revoke, process isolation, payload limits, replay fencing, and stream cleanup are enforced by the host.
Contract and examples
Read the complete plugin authoring guide, the architecture, and the working plugins/ examples. Code, Status, Servers, Attachments, and Voice are useful references because they run through the same API available to your extension.
Usage is also a backend-boundary example: muxr invokes an exact pinned ccusage native package with --offline --no-cost, allowlists per-agent totals, and never executes the coding CLIs whose logs it reads.