Skip to main content
Mirrored from Meerkat Meta main at 26f5ae9da1fd on 2026-11-03; Meta version 0.9.9 at that commit. This guide starts with the Meta application runtime. If you only need to run an agent or a mob, Core’s quickstart is enough. Component choice explains the optional pieces.

Prepare a matching SDK and gateway

Python and TypeScript clients need a compatible gateway executable. The source path below builds the gateway and SDK from the same checkout. For a packaged installation, use the instructions and checksums supplied with your release.
From this source checkout, with Rust 1.97+ and Python 3.10+:
The final command prints CARGO_TARGET_DIR. The built gateway is its debug/rpc_gateway executable. Pass that absolute path to .gateway(...) in the examples below. Run Python snippets in an async entry point; the repository README has a complete asyncio.run example that reads status and shuts down cleanly. When native release archives are available, use rpc_gateway from the matching meta-rpc-gateway-<version>-<target> archive and install the matching meerkat-meta Python package or @rkat/meta-sdk TypeScript package. Follow that release’s platform and checksum instructions. Linux x86_64 and aarch64 and macOS arm64 archives are published with the release, listed in index.json and checksums.sha256; macOS x86_64 and Windows archives may arrive later, listed in index-trailing.json and checksums-trailing.sha256. Rust hosts use the meerkat-meta crate directly:

Bootstrap a runtime

The fastest way to get a running system is start_meta_runtime. It takes a module configuration, agent event stream, and a startup timeout. Host-supplied modules are optional, so this runnable baseline starts with an empty module and discovery list.

Use the unified runtime

For production deployments that combine a Meerkat mob with Meta modules, use the UnifiedRuntime builder:
The unified runtime bootstraps both systems, merges their event streams, and manages the combined lifecycle. See the unified runtime guide for details.

Open the console

Once the runtime is serving HTTP, open the admin console at:
The bundled gateways bind an available loopback port and return the exact http_base_url in the initialization result. A library host may choose its own address. For an SDK-launched rpc_gateway, protected console APIs are auth-closed by default: without configured auth, the gateway trusts no signing key. Configure .auth(...) and the matching bearer-token or authenticated-proxy handling described in Authentication. Alternatively, for a loopback-only or authenticated-proxy-protected demo, explicitly add .console_auth_required(False) in Python or .consoleAuthRequired(false) in TypeScript before .build(). These are deliberate opt-outs, not production defaults. Keep the runtime alive while browsing; the status-only examples above shut it down when finished, and a console host should retain that cleanup on exit. The console shows the agent sidebar, conversation workspace, signals rail, topology, logs, and health overview. The bundled app seeds from REST, sends through JSON-RPC, and tails replayable timeline frames over SSE.

Keep agents available across sessions

For durable agent identities, use a roster and the identity-first API. The following sketch shows how a personal agent connects to a triage agent; MOB_TOML supplies their profiles as described in roster:
Profiles are templates; members are declared. The [profiles.*] tables in MOB_TOML produce no members on their own: the identities your roster returns (or ensure_member names) are the only members that exist, and nothing spawns one member per profile for you. Both SDKs pass a typed RosterContext to the roster callback: Python exposes context.mob_definition and context.previous_identities; TypeScript exposes context.mobDefinition and context.previousIdentities. The stock gateway supplies its compiled mob definition, so a profile-shaped roster can derive members from that definition’s profiles. Custom or older hosts may omit the definition (None/null), and missing prior identities default to an empty list. See Profiles are templates.The prior-identity list is call-site-dependent, not an authoritative membership snapshot on every callback. Topology-query and edge-reconciliation snapshots supply registered identities; bootstrap, full roster refresh/reconcile, and reset-time spec adoption currently pass an empty list. An empty list does not establish that no identities are registered.If the definition declares [wiring] (auto_wire_orchestrator or role_wiring), call rt.mob_handle().reconcile_edges() after boot and after each rt.reconcile(); ensure_member reconciles on its own. Pin runtime_mode = "turn_driven" on profiles that back addressable identities: meerkat defaults to autonomous_host, which runs a kickoff turn at spawn and skips ambient per-turn recall for generic SDK/work delivery. Non-steer local canonical console-human input can carry configured typed injected context even for autonomous_host; that exception does not cover arbitrary external bindings. See Runtime modes.
Use respawn() for non-destructive recovery that keeps continuity, and reset() only when the app intentionally wants a destructive new generation and session. If you change a durable identity’s role in the roster, its resume fails closed until that boot declares the migration with .role_migrations([...]). See the Python SDK page for the builder form and Configuration for the init parameter.

What’s next