Spin your first clone
Nothing to a running, seeded clone in five minutes.
See how it works
The architecture behind a clone, in one diagram.
Connect your agent
Point your agent at a clone over its HTTP API or MCP.
Browse the CLI
Every command and flag, with real output.
The mental model
asymmetric has two nouns, at two altitudes.Clone
One running instance of a SaaS product — a real backend, its own database,
real auth. The unit you build and compose.
Environment
A named composition of clones on shared infrastructure. The unit you point an
agent at and score.
The loop
Every asymmetric session is the same five beats. Each is one command.Spin
asym spin slack creates a clone, allocates ports, runs migrations,
and waits until it’s healthy. You get a live API endpoint back.Seed
Load a deterministic fixture for repeatable evals, or generate realistic data
with an LLM. Either leaves the clone in a known starting state.
Run
Point your agent at the clone’s HTTP API or MCP server. It reads, writes, and
acts against a real backend — every action lands in the clone’s own database.
Inspect
Read the database directly with
query to score exactly what the agent did.
Stream logs to debug.Why a clone, not a mock
High fidelity, not stubs
Clones are real NestJS backends on real Postgres with real JWT auth — stateful,
referentially consistent, returning authentic errors. Not canned responses.
Reproducible to the row
Every clone has a stable id, its own database, and a recorded seed.
reset
rebuilds it to byte-for-byte the same starting state.Scorable
The agent’s work is just rows in a database you own. Read them with
query
to grade a run objectively, not by scraping output.Local-first
Everything runs through Docker on your machine. No cloud account, no external
dependencies. A connected control-plane mode is planned.
Concepts at a glance
| Term | What it is |
|---|---|
| Clone | One running instance of a template — a real backend with its own database, auth, and ports. You pass its id (slack-a1b2) to every command. |
| Environment | A named composition of clones you point an agent at and score. Membership is the single source of truth; clones don’t know which environment they’re in. |
| Template | A directory with a clone.manifest.json that declares how a product is cloned — services, modes, migrations, seeds. Six ship today: slack, stripe, notion, hubspot, github, linear. |
| Mode | A named set of a template’s services (api = backend only, full = backend + frontend). |
| Seed | The data loaded into a fresh clone — a deterministic fixture or AI-generated data. Replayed on reset. |
| Provider | The engine behind every command. LocalDockerProvider today; a CloudProvider is planned. Same commands, different engine. |
| Registry | ~/.asymmetric/registry.json — the source of truth recording every clone and environment. |
What’s in the box
| Piece | Package | What it is |
|---|---|---|
| The CLI | apps/cli (@asymmetric-ai/cli, commands asym / asymmetric) | The spin → seed → inspect → reset toolchain you drive. |
| The contract | packages/clone-contract | The shared CloneProvider interface, types, and named errors — the seam everything is built against. |
| The clone templates | apps/*-clone | Six templates today — Slack, Stripe, Notion, HubSpot, GitHub, Linear — each a real backend, MCP server, and Postgres. |
Next steps
Quickstart
Spin, seed, and point an agent at your first clone.
How it works
CLI, contract, providers, shared infra, and templates.
Connect your agent
HTTP API and MCP, with working examples.
Available templates
The clones you can spin today.