Skip to main content
There are two ways to reach a user’s local app through Meradomo. Pick the one that fits how you want your users to sign up and pay.

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.
All three serve at 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:
The unpacked bundle is:
Every artifact’s checksum is recorded in 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:
A Tauri app adds the crate and calls one function. connect() walks the user through account + address + trial in their browser, then starts (or attaches to) the engine and publishes your app:
On the next launch, skip the browser: reuse the saved credential, call 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 reports billing.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.