Skip to main content
Press the button and ctrlrun demo runs in this tab: real Python, the released ctrlrun wheel from PyPI, and the same five scenarios you would get from pip install ctrlrun && ctrlrun demo. Nothing is sent anywhere. The demo is in-process, writes its evidence to an in-memory filesystem, and opens no socket.
Press the button. The first run downloads about 10 MB of Python; after that the browser caches it.

What you should see

All five scenarios run in the browser. This is the output from the verification run described below, with the generated ids masked:
Scenario 1 is the one to read twice: remote refund calls: 1. The refund committed at the fake remote, the reply was lost, the agent retried, and the retry was refused. The customer was refunded once.

What is running

The version line in the output is the released version, so it can be behind main. Everything else on this site describes the current release.

Verified, and how to check

The Python this page runs was verified under Node against the same Pyodide build on 2026-09-06: Pyodide 314.0.6, Python 3.14.2, SQLite 3.39.0, ctrlrun 0.5.0 from PyPI, all five scenarios. Not a copy of it — the harness reads the program out of try-it.js and runs that. It carried its own copy until that date, which is how a syntax error in the page’s copy reached this page: both harnesses were green, one having stubbed the Python and the other having verified a program the page never ran. Two harnesses are committed, and you can run both:
verify-browser-demo.mjs is the one that proved the demo runs. A third check needs neither Node nor the network: tests/test_docs_travelling.py lifts the program out of the JavaScript and compiles it on every commit, so a syntax error fails CI rather than this page. verify-browser-wiring.mjs is the one that proves the button on this page gets wired: this site is a single-page application, and the first version of the script looked for its container before the page had rendered it, so the button did nothing.

If it does not run here

The page tells you what failed and gives you the command that always works:
A browser can fail this for reasons that have nothing to do with CTRLRun: a blocked CDN, an extension that stops WebAssembly, a very old browser, or a tab with no memory to spare. That is this page failing, not the library.

Next