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: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:Next
- 60-second quickstart: protect one function for real.
- Outcomes and AMBIGUOUS: what scenario 1 means.
- Get started · Why.