Open-source business simulation
A living world of customers for your system of record
Artificial Praxis generates customers with temperament, movement, and history — who message, book, cancel, and get upset when things fail. Every side effect executes through a pluggable connector, so you can watch how your real APIs behave under organic load.
Universal app for Apple silicon and Intel Macs

Inside the product
Watch the whole world, then step into any actor
Move from aggregate system health to the exact conversation and person behind it. Every message, decision, appointment, and recovery task stays connected to the living world that produced it.
Conversations
See every customer thread in context
Filter by channel, inspect the full exchange, and keep pending human decisions beside the conversation that needs them.

Actor view
Experience the system from one person's side
Enter any actor to see their channels, relationships, history, stress, tasks, and what the product currently feels like to them.

How it works
Seed it, run it, break things safely
Seed a world
Generate customer profiles around a location, or pass your own organizations — branding, services, staff — via the simulation config.
Let it live
Tick the world forward. Customers move, message, book, and cancel organically. Two test transports — local-sim and mock-random — work with zero setup.
Watch your system cope
Route capabilities at your real API and observe how it behaves under organic load: every call ledgered, every failure surfaced as a recovery task.
Why Praxis
Organic load, real consequences
A living world
Customer profiles with temperament, movement, and history. They message, book, cancel, no-show — and get upset when your system lets them down.
Pluggable connectors
Every side effect — create a contact, book, cancel, send a message — routes through a connector interface. Swap the backend without touching the engine.
Point it at your API, no code
Describe your API in config/connectors.json: one endpoint per capability, bodies as JSON templates rendered against simulation entities. The desktop app opens the folder for you.
Failure has consequences
Every attempt is recorded as an operation. Failures spawn recovery tasks and make the affected customer upset — so you see the human cost of a 502.
Local-first
Runs fully locally out of the box. Default transports resolve inside the engine — no external API needed. State lives in .praxis/, reset with one call.
Live control panel
Watch customers move on a live map, switch transports per capability while the world runs, and monitor whether your system of record is reachable.
Connectors
Your API, described in JSON
Add a connectors.json to the config folder and map each capability to one endpoint. The desktop app creates and opens this folder for you. Bodies and paths are JSON templates rendered against the simulation entities — the customer profile, the appointment, remote ids.
- 1Capabilities you don't declare fail as configuration-needed and surface as recovery tasks — never crashes.
- 2Registered connectors appear automatically in the panel's transport pickers, with live reachability monitoring.
- 3Need custom auth or multi-step calls? Implement the small Connector interface directly in TypeScript.
{
"connectors": [{
"id": "acme-crm",
"baseUrl": "https://api.acme.example/v2",
"auth": { "scheme": "bearer", "tokenEnv": "ACME_CRM_TOKEN" },
"capabilities": {
"actor.create": {
"path": "/customers",
"body": { "name": "{{profile.givenName}}" },
"remoteIdPath": "customer.id"
},
"booking.create": {
"path": "/appointments",
"body": { "customerId": "{{remoteActorId}}" }
}
}
}]
}API surface
Drive it from anywhere
The whole simulation is scriptable over HTTP — seed worlds, tick time forward, and inspect the connector ledger from CI or a notebook.
Get started
Run it locally in under a minute
Download the self-contained Mac app, or run from source. The default transports need no external API.
$ git clone https://github.com/jameshbarber/artificial-praxis.git $ cd artificial-praxis && pnpm install $ pnpm dev ▲ ready on http://localhost:3000