{"id":46000150,"url":"https://github.com/lukacf/meerkat","last_synced_at":"2026-05-31T07:00:41.675Z","repository":{"id":334044332,"uuid":"1139800076","full_name":"lukacf/meerkat","owner":"lukacf","description":"Meerkat - A modular, high-performance agent harness built in Rust.","archived":false,"fork":false,"pushed_at":"2026-05-27T12:07:18.000Z","size":490844,"stargazers_count":14,"open_issues_count":28,"forks_count":5,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-27T14:27:50.674Z","etag":null,"topics":["agentic","ai","ai-agents","claude","claude-code","cli","codex","codex-cli","gemini","gemini-cli","harness","mcp","rest","rpc","rust","sdk","sdk-python","sdk-rust","sdk-typescript"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lukacf.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":"audit/docs-consistency-2026-04-21/README.md","citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-01-22T12:38:43.000Z","updated_at":"2026-05-27T10:38:13.000Z","dependencies_parsed_at":null,"dependency_job_id":"4333bc8c-1318-4473-8272-a61c4c6b405d","html_url":"https://github.com/lukacf/meerkat","commit_stats":null,"previous_names":["lukacf/meerkat"],"tags_count":47,"template":false,"template_full_name":null,"purl":"pkg:github/lukacf/meerkat","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lukacf%2Fmeerkat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lukacf%2Fmeerkat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lukacf%2Fmeerkat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lukacf%2Fmeerkat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lukacf","download_url":"https://codeload.github.com/lukacf/meerkat/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lukacf%2Fmeerkat/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33722156,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agentic","ai","ai-agents","claude","claude-code","cli","codex","codex-cli","gemini","gemini-cli","harness","mcp","rest","rpc","rust","sdk","sdk-python","sdk-rust","sdk-typescript"],"created_at":"2026-02-28T22:09:06.902Z","updated_at":"2026-05-31T07:00:41.661Z","avatar_url":"https://github.com/lukacf.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\".github/meerkat-logo.png\" alt=\"Meerkat\" width=\"280\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eMeerkat\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cstrong\u003eA modular, high-performance agent harness built in Rust.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#quick-start\"\u003eQuick Start\u003c/a\u003e \u0026bull;\n  \u003ca href=\"#capabilities\"\u003eCapabilities\u003c/a\u003e \u0026bull;\n  \u003ca href=\"#surfaces\"\u003eSurfaces\u003c/a\u003e \u0026bull;\n  \u003ca href=\"#examples\"\u003eExamples\u003c/a\u003e \u0026bull;\n  \u003ca href=\"https://docs.rkat.ai\"\u003eDocs\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Rust-1.94+-orange?logo=rust\" alt=\"Rust 1.94+\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-MIT%2FApache--2.0-blue\" alt=\"License\"\u003e\n\u003c/p\u003e\n\n---\n\n## Why Meerkat?\n\nMeerkat is a **library-first, high-performance, modular agent harness** -- composable Rust crates that handle the hard parts of building agentic systems: state machines, retries, budgets, streaming, tool execution, MCP integration, and multi-agent coordination.\n\nThat harness is backed by a shared runtime. The same sessions, tools, credentials, schedules, live channels, blobs, and mob members work across the CLI, services, SDKs, and browser/WASM delivery instead of each surface reimplementing agent behavior.\n\nIt is designed to be **stable** (typed session events, explicit terminal results, resumable persistence, scoped credentials) and **fast** (\u003c10ms cold start, ~20MB memory, small standalone binaries for the common surfaces). Meerkat lifecycle flows are specified as typed formal state machines and mathematically proven with TLA+ where it matters, which means the system avoids getting stuck in invalid or unknown states.\n\nThe library still comes first; surfaces come second. Pick the entry point that fits your architecture: embed the crates directly, run a CLI task, host REST or JSON-RPC, expose MCP tools, script from Python or TypeScript, or ship a browser-delivered agent with `@rkat/web`.\n\n### How it compares\n\n| | Meerkat | Claude Code / Codex CLI / Gemini CLI |\n|---|---|---|\n| **Design** | Library-first runtime you can embed, script, host, or ship in the browser | CLI-first interactive terminal tool |\n| **State model** | Realm-scoped sessions, config, credentials, blobs, schedules, and mobs | Tool-local or app-local state |\n| **Providers** | Anthropic, OpenAI, Gemini, and self-hosted OpenAI-compatible models | Usually one provider family |\n| **Auth** | Env API keys, realm bindings, OAuth/device flows, TokenStore, cloud IAM, and per-session/member overrides | Usually provider key per process |\n| **Surfaces** | CLI, REST, JSON-RPC, MCP, Rust/Python/TS SDKs, Web SDK/WASM | CLI plus selected SDKs |\n| **Agent infra** | Hooks, skills, semantic memory, MCP, live tool scope, blobs, typed events, structured output | File/context tooling around one process |\n| **Automation** | Durable once/interval/calendar schedules for sessions and mobs | External cron/scheduler required |\n| **Multi-agent** | Session-backed mob members, peer comms, profile-driven teams, flows, and realm-scoped WorkGraph commitments | Single agent or ad hoc delegation |\n| **Portable deployment** | Signed `.mobpack` artifacts with `pack`, `inspect`, `validate`, `deploy`, and `mob web build` | No equivalent portable team artifact flow |\n| **Distribution** | Release binaries, Homebrew tap, SDK auto-runtime, crates, PyPI, npm | Runtime plus dependencies |\n\nThose tools excel at interactive development with rich terminal UIs. Meerkat is for automated pipelines, embedded agents, multi-agent systems, browser-delivered agents, and applications that need programmatic control over lifecycle, credentials, tools, and runtime events.\n\n## Quick Start\n\n```bash\ncargo install rkat\nexport RKAT_OPENAI_API_KEY=sk-...\n```\n\n`RKAT_OPENAI_API_KEY`, `RKAT_ANTHROPIC_API_KEY`, and `RKAT_GEMINI_API_KEY` take precedence over the provider-native names (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, `GOOGLE_API_KEY`). Azure OpenAI uses `RKAT_AZURE_OPENAI_API_KEY` plus `RKAT_AZURE_OPENAI_ENDPOINT` (or the unprefixed Azure names). You can also install from the Homebrew tap, use release binaries, or let the Python and TypeScript SDKs auto-resolve `rkat-rpc`:\n\n```bash\nbrew install lukacf/meerkat/rkat\npip install meerkat-sdk\nnpm install @rkat/sdk\nnpm install @rkat/web\n```\n\nRelease artifacts include `rkat`, `rkat-rpc`, `rkat-rest`, and `rkat-mcp`.\n\n**Run a one-off prompt** with any provider:\n\n```bash\nrkat run \"What is the capital of France?\"\nrkat run --model gpt-5.5 \"Explain async/await\"\n```\n\n**Render rich answers in your browser** when a visual artifact is easier to read:\n\n```bash\nrkat run --browser \"Create a one-page HTML brief comparing REST, RPC, and MCP surfaces\"\nrkat help --browser \"How do I configure Azure OpenAI?\"\n```\n\n**Share state across processes** with an explicit realm:\n\n```bash\nrkat --realm team-alpha run \"Draft a release note\"\nrkat-rpc --realm team-alpha\n```\n\nSame realm means shared sessions, config, backend, credentials, schedules, blobs, and mobs. Different realms stay isolated.\n\n**Use persisted credentials** when env vars are not enough:\n\n```bash\nrkat auth login openai\nrkat auth profiles --realm dev\nrkat run --model gpt-5.5 --auth-binding dev:openai_oauth \"Summarize this pull request\"\n```\n\nRealm bindings also work through REST, JSON-RPC, SDKs, and mob member launches, so applications can scope credentials per tenant, session, or team member without hardcoding provider keys. Bindings are provider-checked against the selected model, so an OpenAI binding should be paired with an OpenAI model, an Anthropic binding with an Anthropic model, and so on.\n\n**Give it tools and let it work.** Enable shell access, MCP tools, schedules, comms, and mob orchestration with the `full` tool preset:\n\n```bash\nrkat run --tools full \\\n  \"Create a small mob to inspect src/ for functions longer than 50 lines. \\\n   Ask the members to suggest refactors, then collect and summarize the results.\"\n```\n\n**Extract structured data** with schema validation and budget controls:\n\n```bash\nrkat run --model claude-opus-4-8 --tools workspace \\\n  --schema '{\"type\":\"object\",\"properties\":{\"issues\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"properties\":{\"file\":{\"type\":\"string\"},\"severity\":{\"type\":\"string\",\"enum\":[\"critical\",\"high\",\"medium\",\"low\"]},\"description\":{\"type\":\"string\"}},\"required\":[\"file\",\"severity\",\"description\"]}}},\"required\":[\"issues\"]}' \\\n  --max-tokens 4000 \\\n  \"Audit the last 20 commits for security issues. Check each changed file.\"\n```\n\nThe agent loops autonomously -- calling tools, reading results, reasoning, calling more tools -- until the task is done or the budget runs out. Provider selection comes from the model catalog, so switching models does not require a code change.\n\n**Generate images** from a runtime-backed session:\n\n```bash\nrkat run --model gpt-5.5 --allow-tool generate_image \\\n  \"Use generate_image with provider \\\"openai\\\" to create a square PNG icon for a release dashboard. Return the blob id.\"\nrkat blob get \u003cblob_id\u003e --output release-dashboard.png\n```\n\nThe active chat model does not need to be an image model. Image requests route through configured image provider profiles, and generated bytes are stored as blobs that CLI, REST, RPC, MCP, and SDK clients can fetch.\n\n### Self-hosted models\n\nRun local models through any OpenAI-compatible server (Ollama, vLLM, LM Studio). Add model aliases to your active realm config:\n\n```toml\n[self_hosted.servers.local]\ntransport = \"openai_compatible\"\nbase_url = \"http://127.0.0.1:11434\"\napi_style = \"chat_completions\"\n# Optional: bearer_token_env = \"LOCAL_LLM_TOKEN\"\n\n[self_hosted.models.gemma-4-31b]\nserver = \"local\"\nremote_model = \"gemma4:31b\"\ndisplay_name = \"Gemma 4 31B\"\nfamily = \"gemma-4\"\ntier = \"supported\"\ncontext_window = 256000\nmax_output_tokens = 8192\nvision = true\nimage_tool_results = true\ninline_video = false\nsupports_temperature = true\nsupports_thinking = true\nsupports_reasoning = true\ncall_timeout_secs = 600\n```\n\nThen use it like any other model:\n\n```bash\nrkat run -m gemma-4-31b \"Explain the code in main.rs\"\nrkat doctor\n```\n\nSelf-hosted credential resolution uses the same auth binding resolver as hosted providers. Precedence is: explicit `auth_binding`, selected realm `default_binding`, configured `default` realm binding, then legacy `[self_hosted.servers]` compatibility. Legacy compatibility is intentionally fail-closed for credentials: if a legacy server defines bearer material but no usable auth binding is configured, Meerkat refuses to synthesize bearer auth; a selected realm without a self-hosted binding also fails instead of falling back to legacy config.\n\n## Testing\n\nMeerkat's repo-wide lanes are exposed through Make:\n\n```bash\nmake build\nmake check\nmake lint\nmake test\nmake agent-gate\n```\n\nUse `make agent-gate` for local multi-agent edits. It derives build-relevant changed files and runs the scoped clippy + nextest gate, escalating only when a change affects global Rust lanes.\n\nDeterministic end-to-end lanes are also available through Make:\n\n```bash\nmake e2e-fast\nmake e2e-system\n```\n\nLive-provider lanes stay opt-in:\n\n```bash\nmake e2e-live\nmake e2e-smoke\n```\n\nWhen you need targeted Cargo work inside the repo, use the wrapper:\n\n```bash\n./scripts/repo-cargo test -p meerkat-tools --test schema_snapshot\n```\n\n## Development Setup\n\nInstall the Rust toolchain required by the default local build lanes:\n\n```bash\nmake install-build-deps\n```\n\nRelease discipline includes generated contract freshness and package-version checks:\n\n```bash\nmake verify-version-parity\nmake verify-schema-freshness\nmake release-preflight\n```\n\n## Capabilities\n\n**Providers and streaming.** Anthropic, OpenAI, Azure OpenAI, Gemini, and self-hosted models share one streaming interface. The model catalog carries defaults, capability gates, parameter schemas, provider-native web-search behavior, image defaults, and provider/model mismatch checks.\n\n**Sessions, realms, and auth.** Sessions are realm-scoped and resumable across surfaces. Env vars are the fast path; realm bindings add backend profiles, auth profiles, `auth_binding`, OAuth/device flows, TokenStore persistence, cloud IAM, external resolvers, auth freshness, and per-member overrides.\n\n**Tools and integration.** Custom dispatchers, builtins, shell, scheduler tools, comms, skills, memory, MCP servers, and structured output compose into one tool surface. Applications can discover deferred tools with `tool_catalog_search` and `tool_catalog_load`, live-add or reload MCP servers, and scope tool visibility by profile, session, or turn.\n\n**Scheduling.** Durable schedules run sessions or mobs from once, interval, or calendar triggers. Occurrences survive process restarts and carry overlap, misfire, and missing-target policy. Host apps use REST/RPC schedule APIs; agents use the `meerkat_schedule_*` tools.\n\n**WorkGraph.** WorkGraph is a realm-scoped durable commitment graph for agent work. Agents create, claim, link, evidence, and close work items through `workgraph_*` tools. REST, RPC, Python, and TypeScript provide WorkGraph observability, including goal and attention status reads; CLI and trusted in-process hosts provide the narrow goal and attention controls.\n\n**Multi-agent mobs.** Mobs are reusable teams built from definitions, profiles, profile stores, budgets, scoped tools, credentials, flows, and signed peer-to-peer wiring. Prefabs are no longer the model; define the team you need and launch members through the current `mob_*` tools and host APIs.\n\n**Comms.** Agents use `send_message` for ordinary collaboration and `send_request` / `send_response` for ask/reply workflows. Queue or steer handling controls when peers process messages, and host-side receipts and terminal peer responses remain typed events.\n\n**Live audio.** Choose a realtime-capable model such as `gpt-realtime-2` and open a live channel through the `live/open`, `live/status`, `live/refresh`, `live/send_input`, `live/commit_input`, `live/interrupt`, `live/truncate`, and `live/close` JSON-RPC methods, or the matching `liveOpen` / `live_open` family in the TypeScript and Python SDKs. JSON-RPC hosts must enable the `--live-ws` listener (`/live/ws`) for the audio WebSocket bootstrap returned by `live/open`.\n\n**Image generation and blobs.** `generate_image` is a session-scoped builtin backed by provider image profiles and realm blob storage. Generated image blocks can be read from history and fetched through blob APIs or SDK helpers.\n\n**Web/WASM.** `@rkat/web` wraps `MeerkatRuntime`, browser sessions and mobs, typed event subscriptions, JS tools, structural `authBinding`, provider proxy support, and host-page auth resolvers. Mobpacks can also be built into browser bundles with `rkat mob web build`.\n\n**Packaging and targets.** Mobpack ships the current CLI surface: `rkat mob pack`, `rkat mob inspect`, `rkat mob validate`, `rkat mob deploy`, and `rkat mob web build`.\n\n**Modularity.** Rust library consumers choose feature flags such as `anthropic`, `openai`, `gemini`, `session-store`, `mcp`, `comms`, `skills`, `schedule`, and `workgraph`. Shipped CLI/RPC/REST/MCP binaries are product builds with the expected batteries included.\n\n## Surfaces\n\nAll surfaces share the same session lifecycle and runtime-backed contracts.\n\n| Surface | Use Case | Docs |\n|---------|----------|------|\n| **Rust crate** | Embed agents in your Rust application | [SDK guide](https://docs.rkat.ai/rust/overview) |\n| **Python SDK** | Script agents from Python; auto-resolves `rkat-rpc` | [Python SDK](https://docs.rkat.ai/sdks/python/overview) |\n| **TypeScript SDK** | Script agents from Node.js; auto-resolves `rkat-rpc` | [TypeScript SDK](https://docs.rkat.ai/sdks/typescript/overview) |\n| **Web SDK (`@rkat/web`)** | Browser/WASM sessions, mobs, subscriptions, JS tools, provider proxy/auth resolver | [Web/WASM](https://docs.rkat.ai/examples/wasm) |\n| **CLI (`rkat`)** | Terminal, CI/CD, cron jobs, shell scripts | [CLI guide](https://docs.rkat.ai/cli/commands) |\n| **REST API** | HTTP integration for web services | [REST guide](https://docs.rkat.ai/api/rest) |\n| **JSON-RPC (`rkat-rpc`)** | SDK backend and IDE/desktop integration over stdio or TCP, with optional live audio WebSocket (`--live-ws`) | [RPC guide](https://docs.rkat.ai/api/rpc) |\n| **MCP Server (`rkat-mcp`)** | Expose Meerkat as tools to other AI agents | [MCP guide](https://docs.rkat.ai/api/mcp) |\n\n## Architecture\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\".github/meerkat-architecture.png\" alt=\"Meerkat architecture\" width=\"100%\"\u003e\n\u003c/p\u003e\n\nSee the [architecture reference](https://docs.rkat.ai/reference/architecture) for crate structure, state machine details, and extension points.\n\n## Examples\n\n### Embedded structured extraction (Rust)\n\nUse an agent as a processing component in your service -- typed output, budget-limited, no subprocess. For long-lived realm-backed applications, use the runtime-backed `SessionService` setup in the Rust SDK guide; direct `AgentBuilder` remains useful for standalone embedded components and tests.\n\n```rust\nlet mut agent = AgentBuilder::new()\n    .model(\"claude-opus-4-8\")\n    .system_prompt(\"You are an incident triage system.\")\n    .output_schema(OutputSchema::new(triage_schema)?)\n    .budget(BudgetLimits::default().with_max_tokens(2000))\n    .build(llm, tools, store)\n    .await?;\n\nlet result = agent.run(raw_alert_text.into()).await?;\nlet output = result.structured_output.ok_or(\"schema validation returned no output\")?;\nlet triage: TriageReport = serde_json::from_value(output)?;\nroute_to_oncall(triage).await;\n```\n\nThe agent returns validated JSON matching your schema, enforced by budget limits. This runs in-process in your Rust binary -- no HTTP roundtrip, no subprocess management.\n\n### Realm binding (CLI)\n\nAfter defining a realm binding and storing its credentials, pass the binding explicitly:\n\n```bash\nrkat run --realm prod --model gpt-5.5 --auth-binding prod:openai \\\n  \"Summarize the incident queue with the production OpenAI binding.\"\n```\n\nThe same structural `auth_binding` shape is accepted by RPC, REST, SDKs, and mob member launch requests.\n\n### Durable scheduled work (CLI)\n\nSchedulers can target either a session or a mob and apply overlap, misfire, and missing-target policy:\n\n```bash\nrkat run --tools full --realm ops \\\n  \"Create an hourly health-check schedule for the payments service. \\\n   Skip overlapping runs, skip stale occurrences, and report the next planned fires.\"\n```\n\nApplications that manage schedules directly can use `schedule/create` over JSON-RPC or `/schedules` over REST. Agents manage the same model through `meerkat_schedule_create`, `meerkat_schedule_list`, `meerkat_schedule_occurrences`, and the related update/pause/resume/delete tools.\n\n### CI failure analysis with mobs (Python)\n\nDrive an agent from your Python backend. The SDK starts or connects to `rkat-rpc`, then the agent coordinates mob members to parallelize work across providers.\n\n```python\nfrom meerkat import MeerkatClient\n\nclient = MeerkatClient()\nawait client.connect(realm_id=\"ci\")\n\nresult = await client.create_session(\n    f\"Analyze these CI failures. Create a small mob for investigation, \"\n    f\"scope shell access to the worker members, collect the findings, \"\n    f\"and return structured JSON.\\n\\n{ci_log}\",\n    model=\"claude-opus-4-8\",\n    enable_shell=True,\n    enable_mob=True,\n    auth_binding={\"realm\": \"ci\", \"binding\": \"default_anthropic\"},\n    output_schema={\n        \"type\": \"object\",\n        \"properties\": {\n            \"failures\": {\"type\": \"array\", \"items\": {\"type\": \"object\", \"properties\": {\n                \"test\": {\"type\": \"string\"},\n                \"root_cause\": {\"type\": \"string\"},\n                \"suggested_fix\": {\"type\": \"string\"}\n            }, \"required\": [\"test\", \"root_cause\", \"suggested_fix\"]}}\n        }, \"required\": [\"failures\"]\n    },\n)\n\nreturn result.structured_output[\"failures\"]\n```\n\nThe orchestrator agent delegates investigation, collects findings, and synthesizes a structured report. Budget and tool scopes keep the work bounded.\n\n### Multi-agent mob for code audit (CLI)\n\nMobs are definition/profile driven. Define the team structure and let the agent orchestrate current mob runtime surfaces:\n\n```json\n{\n  \"id\": \"audit-team\",\n  \"profiles\": {\n    \"analyst\": {\n      \"model\": \"claude-opus-4-8\",\n      \"peer_description\": \"Analyzes code for error handling gaps, security issues, and test coverage.\",\n      \"tools\": { \"shell\": true, \"builtins\": true, \"comms\": true }\n    },\n    \"writer\": {\n      \"model\": \"gpt-5.5\",\n      \"peer_description\": \"Turns analysis findings into clear remediation plans.\",\n      \"tools\": { \"builtins\": true, \"comms\": true }\n    }\n  },\n  \"wiring\": {\n    \"role_wiring\": [{ \"a\": \"analyst\", \"b\": \"writer\" }]\n  }\n}\n```\n\n```bash\nrkat run --tools full --realm prod \\\n  \"Use audit-team.json to audit the payments module. \\\n   Keep shell access scoped to the analyst and return a prioritized remediation plan.\"\n```\n\nThe orchestrating agent creates the mob from the definition, launches profile-backed members, wires communication, and collects the final report. Use realm profile references or per-member `auth_binding` values when different roles need different credentials. See the [mobs guide](https://docs.rkat.ai/guides/mobs) for flows, `mob_spawn_member`, and direct host APIs.\n\n### Browser runtime (Web/WASM)\n\n```typescript\nimport * as wasm from \"@rkat/web/wasm/meerkat_web_runtime.js\";\nimport { MeerkatRuntime } from \"@rkat/web\";\n\nconst runtime = await MeerkatRuntime.init(wasm, {\n  model: \"claude-opus-4-8\",\n  anthropicBaseUrl: \"https://proxy.example.com/anthropic\",\n  anthropicApiKey: \"proxy\"\n});\n\nconst session = runtime.createSession({\n  model: \"claude-opus-4-8\",\n  authBinding: { realm: \"dev\", binding: \"default_anthropic\" }\n});\n\nconst sub = session.subscribe();\nconst result = await session.turn(\"Draft a browser-only release note.\");\nconsole.log(result.text);\nconsole.log(sub.poll());\nsub.close();\n```\n\nBrowser auth can be supplied at runtime bootstrap, through the `@rkat/web` provider proxy, or through a host-page external auth resolver for structural `authBinding` values. The same package supports browser mobs, JS tools, typed subscriptions, and mobpack deployment.\n\n### Portable Mob Deployment (CLI + Web)\n\nBuild once, run in multiple environments with a portable `.mobpack`:\n\n```bash\nrkat mob pack ./mobs/release-triage -o ./dist/release-triage.mobpack \\\n  --sign ./keys/release.key --signer-id release-team\nrkat mob inspect ./dist/release-triage.mobpack\nrkat mob validate ./dist/release-triage.mobpack\nrkat mob deploy ./dist/release-triage.mobpack \"triage latest regressions\" --trust-policy strict\n```\n\nStrict trust requires the signer ID and public key to be present in the user or project trusted-signers store before deploy.\n\nBrowser target from the same artifact:\n\n```bash\ncargo install wasm-pack\nexport PATH=\"$HOME/.cargo/bin:$PATH\"\nrkat mob web build ./dist/release-triage.mobpack -o ./dist/release-triage-web\n```\n\nSee full guide: [Mobpack and Web Deployment](https://docs.rkat.ai/guides/mobpack).\n\n## Configuration\n\n```bash\nexport RKAT_ANTHROPIC_API_KEY=sk-ant-...\nexport RKAT_OPENAI_API_KEY=sk-...\nexport RKAT_GEMINI_API_KEY=...\nexport RKAT_AZURE_OPENAI_API_KEY=...\nexport RKAT_AZURE_OPENAI_ENDPOINT=https://example.openai.azure.com/\n```\n\n```toml\n# .rkat/config.toml (project) or ~/.rkat/config.toml (user)\n[agent]\nmodel = \"claude-opus-4-8\"\nmax_tokens = 4096\n\n[provider_tools.anthropic]\nweb_search = true\n\n[provider_tools.openai]\nweb_search = true\n\n[provider_tools.gemini]\ngoogle_search = true\n```\n\nSee the [configuration guide](https://docs.rkat.ai/concepts/configuration), [realms](https://docs.rkat.ai/concepts/realms), [providers](https://docs.rkat.ai/concepts/providers), and [auth guide](https://docs.rkat.ai/guides/auth) for the full reference.\n\n## Documentation\n\nFull documentation at **[docs.rkat.ai](https://docs.rkat.ai)**.\n\n| Section | Topics |\n|---------|--------|\n| [Getting Started](https://docs.rkat.ai/introduction) | Introduction, quickstart |\n| [Core Concepts](https://docs.rkat.ai/concepts/sessions) | Sessions, realms, auth and bindings, tools, providers, scheduling, mobs, comms, live |\n| [Guides](https://docs.rkat.ai/guides/hooks) | Auth, scheduling, live audio, image generation, Web/WASM, hooks, skills, memory, mobs, CD/distribution |\n| [CLI \u0026 APIs](https://docs.rkat.ai/cli/commands) | CLI, REST, JSON-RPC, MCP |\n| [SDKs](https://docs.rkat.ai/rust/overview) | Rust, Python, TypeScript, Web |\n| [Reference](https://docs.rkat.ai/reference/architecture) | Architecture, capability matrix, builtin tools, session contracts |\n\n## Development\n\n```bash\nmake build                          # Cargo build by default\nmake check                          # Compilation check lane\nmake lint                           # Clippy and static checks\nmake test                           # Fast tests (unit + integration-fast)\nmake agent-gate                     # Scoped local gate for changed files\n```\n\nRun `make verify-version-parity` and `make verify-schema-freshness` when touching generated contracts, SDK wrappers, package metadata, or release-facing schemas.\n\n## Contributing\n\n1. Run `make agent-gate` or the relevant Make lane for your change.\n2. Add or update tests for behavior changes.\n3. Run version/schema freshness checks when touching generated contracts or release metadata.\n4. Submit PRs to `main`.\n\n## License\n\nLicensed under either of [Apache-2.0](LICENSE-APACHE) or [MIT](LICENSE-MIT), at your option.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flukacf%2Fmeerkat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flukacf%2Fmeerkat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flukacf%2Fmeerkat/lists"}