Polychrome

Sandboxed agent orchestration. Rust-native, one API, every surface, any model provider.

Add the Polychrome skill to your coding agent:

npx skills add officialunofficial/polychrome

Build your own anything. Polychrome runs agent conversations — the kind where a model calls tools and takes real actions in a loop. Each conversation gets its own isolated sandbox, so an agent can research, evaluate, and execute without reaching anything you didn't give it — on one machine or across a cluster.

Every surface is an edge. Chat, web, code-forge bots, email, cron, even other agents: each is a small adapter over the same public API — a chat-completions-compatible HTTP route backed by a streaming Connect RPC. Adding a surface means writing an adapter, never forking the core.

Every turn leaves a record you can replay. Two planes run every conversation: the control plane owns the public API, the Kubernetes reconciler, and a durable, signed event log — the source of truth for what the agent did. The execution plane runs one sandbox per conversation, and human-in-the-loop approvals pause a turn until someone decides. Backends, tools, and tenants swap behind Rust traits, so the orchestration core never changes.

Start here

  • Edges, ingress, and clients — the one API, the adapter contract, and the edge patterns anything rides on.
  • Architecture — control plane, execution plane, and the durable event log.
  • Personas — durable principals, caller attribution, and memory that follows the human.
  • Payments — link a wallet with a passkey, let an agent pay from it, and the safety model behind it.
  • Trust — how every tool call is contained: capabilities, outside content, escalation, and recovery.
  • Run and Deploy — local two-process setup and the Kubernetes overlays.
  • Operator CLI — cluster lifecycle, introspection, and driving turns.

Workspace

Polychrome is a Rust workspace of 43 crates, each owning one part of the platform. The control plane, the harness, the operator CLI, and the edge adapters build as separate binaries from shared crates. The reference edge uses the same public API as any other surface. Highlighted rows sit on the path every conversation runs.

CrateRole
polyc-control-planeControl-plane binary: AgentService, the chat-completions compat route, approvals, and the kube reconciler
polyc-harnessExecution-plane binary: the per-conversation HarnessService and turn loop
polyc-agentThe agent turn loop: provider and tool-call routing, shared by the control plane and harness
polyc-llmProvider-agnostic LLM trait and wire types
polyc-protoWire types plus DescriptorPool reflection
polyc-rpc-clientThin Connect RPC client over the generated AgentService client, shared by edges and the CLI
polyc-runtimeShared runtime for every binary: logging, the health/metrics side-server, and signal handling
polyc-cliOperator CLI: cluster lifecycle, log/exec/send, self-update
polyc-tuiOperator cockpit TUI (pc-tui): fleet, transcript, approvals, and tools panes
polyc-turn-runnerThe turn-running core shared by the harness server and the in-process replay transport
polyc-llm-vertexLlmProvider backend over the GCP AI platform REST API (WIF/ADC auth)
polyc-llm-openaiLlmProvider backend over the OpenAI-compatible chat-completions API (Ollama, LM Studio, vLLM, llama.cpp, and cloud backends alike)
polyc-toolsThe pure tool core: local, deterministic executors, the in-process registry, and MCP client/server composition
polyc-connectorsNetworked connectors over the pure tool core: the conversation-as-MCP server (the agent-to-agent inversion) and the standalone paid_fetch settlement executor
polyc-capabilityCapability taxonomy, derivation, and the pure gate-decision engine every tool call passes through
polyc-personaPersona directory: durable principals and caller attribution on an authenticated keyed store
polyc-persona-memoryPer-persona memory: a pure fold over the event log's events into durable facts
polyc-passkeyStandalone WebAuthn/passkey assertion verification, with no dependency on the persona model or control plane
polyc-cryptoProvenance signatures for tool calls
polycSDK umbrella crate: re-exports the edge adapter, wire types, agent loop, and LLM provider behind one dependency
polyc-eventlogAppend-only conversation event log over a Commonware journal
polyc-mmrMerkle Mountain Range verifiable event log
polyc-storage-gcsGoogle Cloud Storage primitives for the durable event log
polyc-controllerConversation CRD plus kube reconciler
polyc-k8s-typesVendored CRD types for the agent-sandbox Kubernetes resources the controller drives
polyc-slackReference chat edge: Slack Events API receiver dialing AgentService
polyc-telegramChat edge: Telegram Bot API webhook receiver dialing AgentService
polyc-discordChat edge: Discord interactions receiver dialing AgentService
polyc-githubCode-forge edge: GitHub webhook receiver dialing AgentService
polyc-emailAsync edge: inbound-mail webhook dialing AgentService, with signed approval-by-reply
polyc-triggerNon-human trigger edge: cron, queue, webhook, and filesystem events dialing AgentService
polyc-a2aAgent-to-agent edge: serves a signed Agent Card and drives A2A message/send tasks onto a turn
polyc-paymentsMachine Payments Protocol (Tempo) composition layer: the control-plane payment proxy and wallet views
polyc-payments-serverInbound 402 metering server: issues and verifies Tempo/x402 payment challenges
polyc-payments-clientStandalone outbound 402-gated payment client: pays a challenge under a per-call spend cap
polyc-x402x402 v2 header codec for the 402 challenge/settlement wire, independent of any payment scheme
polyc-egressSSRF-guarded outbound HTTP egress for any tool that fetches an agent- or model-supplied URL
polyc-spend-policyPre-authorization spend caps and per-conversation running budgets
polyc-wallet-delegationNon-custodial Tempo wallet delegation: passkey-delegated, spend-capped agent wallets
polyc-scaffoldScaffolder MCP connector: template catalog and ServiceDefinition provisioning tools
polyc-substrateClient for the agent-substrate control API: actor create/get/suspend/resume/delete
polyc-workqueueDurable, idempotent, backoff-retrying work queue for post-ack edge turns

Each edge is its own per-pattern adapter crate over the same public API — see Edges, ingress, and clients for the adapter contract. This table mirrors the workspace declared in Cargo.toml.