marimo explained: reactive Python notebooks stored as testable scripts
An official-source analysis of marimo’s dependency graph, pure Python files, built-in SQL, UI elements, app deployment, WebAssembly runtime, reproducibility claims, and practical limits.
Position and current signal
marimo is a reactive Python notebook stored as a normal `.py` file, with cells connected through variable definitions and references. At capture time it had 21,925 stars, about 171 default-branch commits in 30 days, and release 0.23.14. Its important claim is not a different canvas; it addresses hidden state, stale out-of-order results, and opaque JSON diffs in conventional notebooks.
Use cases and capabilities
The project supports data exploration, SQL analysis, model experiments, teaching material, interactive reports, and internal tools. Built-in UI elements pass values from sliders, tables, and forms into Python. SQL cells return data frames. One file can be edited as a notebook, executed as a script, or served as a read-only application. AI assistance is optional and is not required for the reactive runtime.
How the reactive model works
marimo statically examines names defined and read by each cell, then builds a directed acyclic dependency graph. A changed variable causes only affected downstream cells to run in topological order; deleting a cell removes its definitions. The system rejects multiple cells that define the same variable, reducing ambiguity. Lazy execution can protect expensive work, while in-place mutation of objects may remain invisible to name-based analysis.
Stack and file model
The backend and notebook programs are primarily Python, while the browser interface uses TypeScript and React. A notebook is an importable, testable Python program with readable Git diffs. App mode sends interface values to backend computation. A WebAssembly build uses Pyodide to execute Python in the browser, which helps serverless demonstrations but constrains available packages, browser resources, networking, and durable storage.