mobpack is the portable runtime artifact for mobs. You build it once, then
deploy it with an objective, invoke a typed callable flow, or build a browser
bundle.
A mobpack is not a VM, container, or complete host image. It carries a mob
definition and reviewed runtime assets. It does not carry the Meerkat binary,
OS packages, provider credentials, secret environment values, or operator
network policy.
What this guide is for
Use this guide when you want to:- package a mob into a portable artifact
- sign and validate that artifact
- invoke it consistently across CLI, service, and browser targets
What you get
- Single-file artifact:
.mobpack - Optional signing and trust verification
- Deterministic
inspectandvalidateboundaries - Closed capability and target-surface declarations
- Typed, capability-gated deploy defaults
- Optional adaptive FlowMaster policy and schema assets
- Typed callable invocation (
mob run) and browser bundle target (mob web build)
Directory to artifact
manifest.tomldefinition.json- optional
skills/,hooks/,mcp/,config/defaults.toml - optional adaptive content under
adaptive/andschemas/
skills/, hooks/, mcp/, config/, adaptive/,
and schemas/ as typed asset sections, plus the root manifest, definition,
and signature records. Other safe files can be carried and are covered by the
digest, but the runtime does not interpret them as assets. Paths are
canonicalized and unsafe or duplicate entries fail closed. Required capability
tokens and surface selectors use closed typed vocabularies, so an unknown
token fails instead of silently downgrading execution.
Manifest contract
A minimal manifest names and versions the artifact. Optional sections declare capabilities, model aliases, profile assets, supported target surfaces, and adaptive metadata:cli, rpc, rest, mcp, and web. Skill paths
must be canonical paths under skills/. definition.json remains the one
MobDefinition authority; the manifest describes packaging and deployment
requirements around it.
Deploy defaults are an allow-list
config/defaults.toml is parsed into MobpackDeployPolicy, not merged into the
host’s general Config. A pack may declare only:
- top-level
max_tokensfor the per-turn output cap [models]defaults foranthropic,openai, andgemini[budget]valuesmax_tokens,max_duration_secs, andmax_tool_calls[compaction]valuesauto_compact_threshold,recent_turn_budget,max_summary_tokens, andmin_turns_between_compactions
session_compaction in [requires].capabilities and
on the selected runtime. Unknown sections and fields fail closed. In
particular, a pack cannot set realm bindings, self-hosted endpoints, provider
tool keys, comms credentials, hooks, shell security, storage, retry, or general
agent/tool configuration. Operator realm and environment layers remain
authoritative; pack values are deployment defaults, not overrides of
operator-owned truth.
The definition also cannot smuggle realm references. Optional hook and MCP
assets are declarations that still require compatible host capabilities and
host-local resources. Keep secrets outside the archive.
Signed packs and trust policy
Sign at pack time:- CLI
--trust-policy RKAT_TRUST_POLICY- config
trust.policy - default
strict(fail closed; accepting unsigned or unknown-signer packs requires an explicitpermissiveopt-in)
- unsigned packs
- unknown signers
- invalid signatures
- signer key mismatches
Run Modes
Deploy a pack with one objective and optional host-owned model or budget overrides:schemas/main-input.json, parameters are validated against it before the flow
starts. The resulting object is the flow’s params context, so step messages
can read values such as {{ params.prompt }}. --prompt is sugar for
--param prompt=<text>:
--detach requires a
callable flow and returns its run id; inspect the persisted mob and run
afterward:
Adaptive mobpacks
An adaptive mobpack declares[adaptive] with a FlowMaster profile, objective
class, SHA-256 policy digest, required schemas, and target surfaces. It also
supplies:
adaptive/policies.tomladaptive/flowmaster.prompt.mdschemas/registry.jsonand every registered required schema
rkat mob pack stamps the adaptive_flow requirement and generates the
canonical adaptive/layer-decision.schema.json. Validation rejects a policy
digest mismatch, incomplete policy with any zero limit, missing registered
schema, or stale layer-decision schema. A runtime without adaptive_flow
rejects the pack instead of running a non-adaptive fallback.
Browser target: mob web build
The browser runtime is the real meerkat agent stack compiled to wasm32 —
same agent loop, same LLM providers (Anthropic, OpenAI, Gemini), and same
streaming as CLI/RPC/REST. mob web build does not compile it; the command
copies the required prebuilt runtime artifacts into the browser bundle.
Prerequisites: the prebuilt meerkat-web-runtime artifacts — the wasm-bindgen
glue (meerkat_web_runtime.js) and its paired meerkat_web_runtime_bg.wasm —
produced by wasm-pack build meerkat-web-runtime --target web or an equivalent
wasm-bindgen pipeline. The CLI fails closed without them and never emits a
placeholder bundle. Pass either the generated output directory or the
*_bg.wasm file (the sibling .js glue is copied alongside it):
python3 -m http.server) and open index.html:
index.html- browser bootstrap page: trust-verifies the pack and initializes the WASM runtime, but does not create a mob or provide prompt/transcript UImeerkat-bootstrap.js— reusable ES module exportingbootMobpack(opts); import it from your own appmeerkat_web_runtime.js— the wasm-bindgen gluemeerkat_web_runtime_bg.wasm— the compiled meerkat agent stackmobpack.bin— the packed mob artifact (loaded via the runtime’sinit_runtime)manifest.web.toml— derived web manifest
bootMobpack bakes in the trust policy this bundle was built with
(--trust-policy); override it (and supply trusted_signers) for signed/strict
production deployments.
How the WASM runtime works
The runtime usestokio_with_wasm as a drop-in tokio replacement (backed by the JS event loop), reqwest with browser fetch for HTTP, and web-time for browser-safe timestamps. The #[async_trait(?Send)] pattern handles wasm32’s single-threaded model.
API:
Browser capabilities and limitations
Available: agent loop (streaming, retries), all LLM providers, sessions, JSON schema validation, budget enforcement, events, skills, MCP config types, tool/compactor/memory traits. Not available (browser inherent): filesystem config loading, stdio MCP servers, shell tool, file-based persistence. Use programmatic config and in-memory storage instead. Not yet available (upstream blocker): MCP protocol client over HTTP — thermcp crate depends on tokio/mio which don’t compile on wasm32. MCP config types and tool definitions work; actual connections to MCP servers are blocked pending rmcp wasm32 support.
Cool web patterns
Incident war room
Buildops-war-room.mobpack, publish web bundle behind internal auth, and let responders open a zero-install multi-agent workspace in-browser.
Embedded dashboard copilot
Bundledashboard-copilot.mobpack and embed it in your observability or release dashboard to summarize anomalies and propose mitigation steps in context.
Example library
See runnable examples:examples/028-mobpack-release-triage-shfor a signed release-triage mobpack that is packed, inspected, validated, and deployed end to endexamples/029-web-incident-war-room-shfor a browser-deployable SEV war room with source-controlled mobpack inputs and kickoff promptsexamples/030-web-dashboard-copilot-shfor an embeddable dashboard copilot that emits a web bundle plus sample host-integration assets
