Volter WorldTwins of 108 services
A branch of every service your app calls
Test what your app does to Stripe, Slack, GitHub and a hundred more without touching them. Twins answer like the real APIs, webhooks included, and show every call on the vendor's own screens.
npm install -g @volter/worldthenvolter world init --installorask your coding agent

volter world view opens it.108services with a twin, one package each
- OpenAI
- Amazon Web Services
- Anthropic
- GitHub
- Google Gemini
- Sentry
- PostHog
- Stripe
- Slack
- Resend
- Datadog
- Cloudflare
- SendGrid
- Supabase
- Twilio
- Notion
01Unchanged
Your code stays exactly as it is.
Keep the vendor SDKs and the code that calls them. A World answers where the vendor would, so the program you test is the program you ship.
No mocked clients, no stubbed network, no special build.
Getting startedimport Stripe from 'stripe'
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY)
await stripe.customers.create({ email })
$ node signup.mjsapi.stripe.com
$ volter world run -- node signup.mjsStripe's twin
02A glass box
See what it did, on the vendor's own screens.
Each twin comes with its vendor's pages. The message your app posted is in the Discord channel; the customer it made is in Stripe's list; the email it sent is in Resend's log.
Beside them, every call your app made and every change it caused.
volter world view
03Branches
Branch it like a database.
Every write is a line in the World's log. Branch at any moment, look at the World as it was, reset to a known state, and push what you made to a World your team shares.
The same idea as Neon's branches, for every service at once.
The model
04On purpose
Real when you mean it.
Running against a World never touches the vendor. When a change should happen for real, deploy it from a shared World with the vendor's key: the World runs its checks, a reviewer approves, and each change comes back with a receipt.
Deploy from a shared Worldissues.create“Launch checklist”
The changeset in the deploy guide, step by step.
05How it works
Ten minutes from your app to your app in a World.
- 1
Make a World
In your app's folder: it finds the vendors your app calls and installs their twins.
volter world init --install - 2
Start it
Each vendor's twin comes up, with the state your story seeds.
volter world up - 3
Run your app in it
Your usual command, inside the World.
volter world run -- npm test - 4
Look
The vendors' screens, the calls and the changes, in your browser.
volter world view
Set up Volter World for this app, so its calls to Stripe, Slack, GitHub, OpenAI and the other services it uses go to local twins instead of the real APIs. The app keeps its real SDKs and code.
1. Install the command and your agent tooling: `npm install -g @volter/world`, then `volter agents install --yes`.
2. In the app's folder, `volter world init --install`: it detects the vendors the app calls and installs their twins. Show me the vendors it detected and why, before keeping them.
3. Start it: `volter world up`, then run the tests inside it: `volter world run -- <the test command>`. Fix anything that fails because a call went to the real service.
4. Tell me what the app did at each vendor (`volter world log`), and give me the dashboard link (`volter world view --no-open`, started in the background: it keeps running).
The guide: https://world.volter.ai/docs/guides/use-with-a-coding-agent.mdvolter agents install gives it the tools; the guide shows the rest.$ volter world up
acme-web 2 twins up, story loaded
slack: http://127.0.0.1:56313
stripe: http://127.0.0.1:56314
Run your app inside it: volter world run -- <command>
Env: .volter/world.env
$ volter world run -- node signup.mjs
[twin-inject] slack: redirecting to http://127.0.0.1:56313
[twin-inject] stripe: redirecting to http://127.0.0.1:56314
created cus_twin_1
$ volter world log
stripe customer.create customer:cus_twin_1
stripe event.record event:evt_twin_1
06Where it runs
On your laptop or your server.
Your machine
A World for one person. No account, nothing to sign in to.
volter world viewGetting started Your server
Many Worlds under one address, each with its own keys. Add the platform for orgs, members and sign-in through your Okta, Entra or Google Workspace. Free and open source.
volter-host serveHost Worlds for a team Self-host the platform 08Questions
What people ask first.
Does it send webhooks?
Yes. A twin sends the webhooks its vendor sends, when the vendor would send them, signed as the vendor signs them, to the endpoints your app registered. In a World a Stripe endpoint is signed with the secret your app's env already holds, so your handler verifies the first delivery unchanged: no tunnel, no copied secret.
Why not the vendor's own test mode?
A test mode is one shared account per vendor: your teammates' and your CI's runs pile up in it, it cannot be reset or branched, and its webhooks need a tunnel to your machine. A World is yours, or your team's, or one per pull request; it covers every vendor your app calls at once, starts from known data, and goes back to it in a command.
Is a twin a mock?
No. A twin keeps state the way the vendor does: create a customer and it is there when you list customers, with the ids, errors and pagination the real API gives. Stored data goes in through the vendor's own API, so what your app sees is what it would see there.
Does my code change?
No. Your app keeps its vendor SDKs and its code. volter world run points each vendor's host at its twin where your process starts, so nothing in your code knows.
How complete is a twin?
Each vendor's declared API is listed operation by operation, each one done or still to do, on the coverage page. Nothing is faked to look finished.
Can a World reach the real vendor?
Only when you say so. Running your app against a World sends its calls to each vendor that has a twin to the twin, not the vendor. When a change should happen for real, you deploy it from a shared World with the vendor's key, and every change comes back with a receipt.
Where does my data live?
On your machine, or on your own server. The World, the host and the twins are open source and run where you run them; none of it sends your data to Volter.
Give your app a World.
From an app that talks to Stripe and Slack to the same app running against twins of both, in ten minutes.