Skip to Content
How it works

How it works

Your code runs unmodified. Its dependencies are twins.

Your test command runs where it already runs, in your test container or on a laptop, and your code is neither modified nor told: same production hostnames, same credentials, same client library, same SDK. You change no base URLs and swap no credentials, unless your code already reads a vendor’s base URL from a variable production sets — setup points that variable at the sandbox, which edits no code and leaves the shipped path under test.

Its outbound calls land on twins instead of the vendor, because the proxy runs beside your code rather than inside it and reroutes the traffic. Your coding agent drives the sandbox from the shell — veris up and veris down for its lifecycle, veris sandbox data, veris sandbox clock and veris sandbox trace for what is in it — so seeding a row or arming a failure never touches your source either.

The terms used below are defined on Core concepts.

YOUR MACHINEVERISCoding agent sessionClaude Code · Codexprovisions the containers, runs testsDOCKER NETWORKYour code under testIn a container · unmodified · real SDKsveris-proxy containerrouting preconfigured ·owns the network · opens webhooksVeris control planeSandboxes · seed data · faults ·state inspectionSandboxpayments twingithub twininternal API twinStateful · deterministic · resettableveris commandsprovisions · runs testsall outbound trafficrerouted to twinswebhooks

The workflow

Create an environment

Pick the twins your code calls: veris env create checkout --services stripe,postgres. Once per project. The name and its settings are recorded in .veris/twin.yaml, committed with the repository.

Create a sandbox

veris up deploys one isolated running copy of that environment and waits until every twin answers. Every twin in it boots with a seeded world, or from a baseline or a snapshot you saved earlier. Ready in seconds, and it has a TTL so it cannot be left running.

Arrange the world

Seed the exact rows the case needs with veris sandbox data add, arm a failure the real vendor will not produce on demand — a fault is a row, added the same way — or move the clock with veris sandbox clock set. Optional: the default world already covers an ordinary path.

Run your tests

Run your own test command, unchanged, through the proxy: veris run -- pytest -q. Every outbound call to a twinned vendor reaches the twin instead. Nothing in your source changes and no credentials are swapped.

Read the receipt and the trace

The receipt veris run prints says what the sandbox received, and veris sandbox trace says what your code actually sent, with the headers and bodies of one entry under --body.

Reset and repeat

veris sandbox reset restores every twin to its boot seed, so the same test runs again; veris down tears the sandbox down. Same world in, same answers out, generated ids included.