// CONTRACT v1 · OPEN SOURCE · APACHE-2.0

Reproduce any bug.
Any language.
Any environment.

Vivarium is a three-layer reproduction substrate. WebAssembly for milliseconds, Docker for fidelity, and a third layer for everything else. Problem first, technology second.

vivarium.dev/layer1-wasm/cpython-137205
WASM
VIVARIUM · LAYER 1 · PYODIDE · SQLITE3

Reproducing python/cpython#137205

PRAGMA foreign_keys silently dropped under autocommit=False.

✕ UNREPRODUCED|fk_off ≠ fk_on
# repro.pyimport sqlite3def test_fk():conn = sqlite3.connect(':memory:')fk_on = conn.execute('PRAGMA foreign_keys').fetchone()[0]assert fk_on == 1
ElementsConsoleNetworkSources1 error
await pyodide.runPythonAsync(repro)
AssertionError: 0 != 1
at test_fk (repro.py:5)
vivarium.dev/layer2-docker/postgres-lost-update
DOCKER
VIVARIUM · LAYER 2 · DOCKER · POSTGRESQL

Reproducing PostgreSQL lost-update under READ COMMITTED

Concurrent UPDATEs lose writes when a SELECT-then-UPDATE pattern omits row-level locks.

RUNNING — tx-1 ⨯ tx-2
# compose-up.shdocker compose up -dpsql -c "SET TRANSACTION ISOLATION LEVEL READ COMMITTED"parallel ./tx.sh ::= 1 2
container.logtx-1.logtx-2.logrunning
[docker] Pulling postgres:15-alpine
postgres ready in 74ms
tx-1: UPDATE accounts SET balance = balance + 100
tx-2: UPDATE accounts SET balance = balance - 50
waiting for both transactions to commit…
vivarium.dev/layer1-wasm/ruby-21709
WASM
VIVARIUM · LAYER 1 · RUBY.WASM · UNICODE

Reproducing ruby/ruby#21709

String#unicode_normalize edge case for combining diacritics in NFD form.

✓ REPRODUCED — bug reproduced
# repro.rbs = "café"nfd = s.unicode_normalize(:nfd)back = nfd.unicode_normalize(:nfc)raise "round-trip lost" unless s == back
ElementsConsoleNetworkSourcesverified
await rubyVm.evalAsync(repro)
round-trip lost (RuntimeError raised as expected)
verdict: REPRODUCED — issue#21709 reproducible in ruby.wasm

// SHIPPED · 2026

11
reproductions catalogued
4
MCP tools
6
phases closed
v1
public contract

// THREE-LAYER ARCHITECTURE

Pick the layer that fits your bug.

You never choose by hand — each recipe declares its own layer. The layers exist because no single runtime fits every bug.

L1

Browser-native, instant.

WebAssembly runtimes inside the visitor’s tab. Algorithms, parsers, in-memory database operations. Startup in milliseconds to seconds.

Pyodide · sqlite-wasm · wasm32-wasip1 · Ruby.wasm · PHP.wasm
L2

Container fidelity.

Real filesystem, real processes, real network. Catalogue model: pinned Dockerfile + GHCR image. The visitor reproduces locally with one `docker run`.

Docker · Firecracker · gVisor
L3

Record-replay & deterministic.

Heisenbugs only. Vivarium pre-records the trace; the visitor replays. Burned-in GHCR images run on commodity Linux hosts — no PMU required.

rr · Antithesis · CRIU · WASI Preview 3+

// SEE IT RUN

Eleven real upstream bugs, running in a browser tab.

pandas, numpy, CPython, Ruby, PHP, Rust regex on Layer 1. PostgreSQL, bash, flock, find/xargs on Layer 2. coreutils sort race on Layer 3.