Which path?
1. Detect the Meradomo app
Your app talks to a Meradomo app the user already installed, over the local
Agent API. Nothing to bundle. Best when your users already run Meradomo.
The user downloads two apps.
2. Embed the engine — Model A
Your app ships the Meradomo engine inside it. The user creates a Meradomo account and pays
Meradomo, but never downloads the Meradomo app. One download. This guide.
3. Embed the engine — Model B
Same embed, but you pay Meradomo for usage and bill your own users however you like — they
need no Meradomo account. Coming soon.
https://<app>.<name>.meradomo.com (or <app>.<your-custom-domain>), and all
three keep the blind-pipe guarantee: keys live only on the user’s machine.
The shared engine
The engine is a single background process that terminates TLS locally and connects out to the shared front door. When several engine-bundled apps run on one Mac they share one engine rather than each starting their own:- The first app to launch spawns the engine; the rest discover and attach to it.
- The engine is reference-counted: it keeps serving while at least one app is attached and shuts down a short grace window after the last one closes. It is not an always-on daemon.
- The app the engine ships with is its first-party app and is auto-approved. Any other app that attaches to a shared engine is pending until the owner approves it in their account dashboard — no menu-bar app required.
The engine bundle
The engine binary (agent.mjs + a pinned Node runtime + the outbound client) is the Meradomo
product, so it ships as a pre-built, versioned, checksummed download, indexed by a public manifest:
bundle.json and re-verified end to end, so a corrupted or
tampered payload fails loudly instead of shipping.
Rust: the meradomo-engine crate
The launcher/client is open source (MIT) — on crates.io,
source at github.com/Meradomo/meradomo-engine:
connect() walks the user through account +
address + trial in their browser, then starts (or attaches to) the engine and publishes your app:
spawn_or_attach, and publish. If a Meradomo app (or another embedded engine) is
already running, spawn_or_attach attaches to it instead of starting a second engine.
The worked example lives at engine-launcher/examples/hello_meradomo.rs.
Reference
Any language: the raw wire protocol
The engine’s management surface is plain HTTP over loopback (http://127.0.0.1:8765), JSON bodies in
camelCase, no auth (loopback + same-user is the trust boundary — see
security model):
Attach to an incumbent engine only when its
protocol matches yours; a different number means
“incompatible — start your own”.
Billing (Model A)
Claiming an address starts a 14-day free trial, so a new user is live immediately. When a subscription lapses the engine reportsbilling.status = "hold" on /engine/info and /status, and the public
route goes down. Read that signal and show a plain “renew to keep serving” prompt — never jargon.