Skip to main content
This walks you from nothing to a running, seeded clone you can point an agent at. It takes about five minutes, most of which is Docker pulling the image on the first spin. By the end you’ll have done the whole loop by hand:
  1. Spin a real Slack clone and confirm it’s healthy.
  2. Seed it to a known starting state.
  3. Inspect its database to score what happened.
  4. Reset it for the next trial, then destroy it.
Each is one command. The one-command path does all of it for you; the rest of the page is the same thing, step by step, so you understand each piece.

Prerequisites

Docker installed and running (docker ps should work).
Node.js >= 18.
The CLI available — npx @asymmetric-ai/cli or npm i -g @asymmetric-ai/cli (see Installation).
Optional: ANTHROPIC_API_KEY in your environment, for AI seeding.
The CLI is free to install from npm; clone images are pulled for free on first spin. The rest of this page uses the global asym command — prefix any of these with npx @asymmetric-ai/cli instead if you’d rather not install.

The one-command path

If you just want the magic, run:
asym quickstart
It preflights Docker, spins a Slack clone, seeds the acme-corp fixture, and prints a ready-to-run curl plus the asym query to read the clone’s state:
  ✓ slack-a1b2 ready in 38.2s
    API: http://127.0.0.1:3001/api   ·   seeded: acme-corp
The steps below do the same thing by hand so you understand each piece. (Slack is the default; pass --template <name> to quickstart a different one — see all templates.)

1. Spin a clone

asym spin slack
The first spin pulls the image and starts shared Postgres + Redis, so give it a minute. When it’s healthy you get a card with the clone id, its endpoint, and the programmatic-access tokens it auto-provisions:
  ✓ slack-a1b2  (api)  http://127.0.0.1:3001/api  ready in 38.2s
    db clone_slack_a1b2 · env -
    bot token   xoxb-…
    user token  xoxp-…
slack-a1b2 is the clone id — you’ll pass it to every other command. The short suffix is random, so yours will differ. The bot/user tokens are the fastest way to point an agent at the clone; reprint them later with asym tokens slack-a1b2. See Connect your agent.

2. Confirm it’s running

asym ls
slack-a1b2	slack	api	running	-

3. Seed a known starting state

For a reproducible run, load a deterministic fixture:
asym seed slack-a1b2 --fixture acme-corp
For realistic, varied data, generate it with an LLM (needs ANTHROPIC_API_KEY):
asym seed slack-a1b2 --ai
AI seeding asks Claude for a dataset, then creates it through the clone’s own HTTP API — real signups, workspace/channel creation, and message posts (the clone’s REST control-plane routes), each performed as the right user so auth and referential integrity stay intact:
  ✓ seeded slack-a1b2  (ai: 20 (0 rejected))

4. Point your agent at it

Your agent talks to the clone exactly like real Slack, over the endpoint from step 1. A quick liveness check:
curl http://127.0.0.1:3001/api/health
Use that base URL (or the clone’s MCP server) as your agent’s target, with a bot or user token as the bearer — everything it does lands in the clone’s own database. The full wiring, with auth and a worked example, is in Connect your agent.

5. Inspect what happened

Read the database directly to score the run. Queries are read-only by default, so you can’t corrupt the clone:
asym query slack-a1b2 "select count(*) from messages"
Get JSON for programmatic scoring:
asym query slack-a1b2 "select id, name from channels" --json
Need an interactive shell? db prints the exact psql command to run:
asym db slack-a1b2
Watch the backend live while your agent runs:
asym logs slack-a1b2 -f

6. Reset for the next trial

reset drops the database, re-runs migrations, and re-applies the last seed — back to an identical starting state, no rebuild:
asym reset slack-a1b2
  ✓ reset slack-a1b2 (dropped, re-migrated, re-seeded)

7. Tear it down

asym destroy slack-a1b2
  ✓ destroyed slack-a1b2
This removes the containers, drops the database, frees the ports, and deletes the clone from your registry.

More templates

Slack is one of six templates that ship today. List them all:
asym ls --templates
TemplateWhat it clones
slackSlack — RPC Web API, the {ok} envelope, MCP server
stripeStripe — payments, customers, invoices
notionNotion — pages, blocks, databases
hubspotHubSpot — CRM contacts, deals, companies
githubGitHub — repos, issues, pull requests
linearLinear — issues, projects, cycles
asym spin <template> works the same for every one. Browse the Templates section for each one’s API shape and fidelity.

Where to go next

Connect your agent

Wire your agent to the clone over its HTTP API or MCP, with a worked example.

Seeding

Fixtures vs AI seeding, and when to use each.

How it works

What spin actually does under the hood.

Environments

Compose several clones into one named environment.