Marimo
marimo is a reactive Python notebook: run a cell or interact with a UI
element, and marimo automatically runs dependent cells (or marks them as
stale), keeping code and outputs
consistent and preventing bugs before they happen. Every marimo notebook is
stored as pure Python, executable as a script, and deployable as an app.
Developer experience is core to marimo, with an emphasis on
reproducibility, maintainability, composability, and shareability.
Highlights
- ๐ batteries-included: replaces
jupyter
, streamlit
, jupytext
, ipywidgets
, papermill
, and more
- โก๏ธ reactive: run a cell, and marimo reactively runs all dependent cells or marks them as stale
- ๐๏ธ interactive: bind sliders, tables, plots, and more to Python โ no callbacks required
- ๐ฌ reproducible: no hidden state, deterministic execution, built-in package management
- ๐ executable: execute as a Python script, parameterized by CLI args
- ๐งช testable: run your favorite test suite, verify your notebook's correctness
- ๐ shareable: deploy as an interactive web app or slides, run in the browser via WASM
- ๐ข๏ธ designed for data: query dataframes and databases with SQL, filter and search dataframes
- ๐ git-friendly: notebooks are stored as
.py
files
- โจ๏ธ a modern editor: GitHub Copilot, AI assistants, vim keybindings, variable explorer, and more
A reactive programming environment
marimo guarantees your notebook code, outputs, and program state are consistent. This solves many problems associated with traditional notebooks like Jupyter.
A reactive programming environment.
Run a cell and marimo reacts by automatically running the cells that
reference its variables, eliminating the error-prone task of manually
re-running cells. Delete a cell and marimo scrubs its variables from program
memory, eliminating hidden state.
Compatible with expensive notebooks. marimo lets you configure the runtime
to be
lazy,
marking affected cells as stale instead of automatically running them. This
gives you guarantees on program state while preventing accidental execution of
expensive cells.
Synchronized UI elements. Interact with UI
elements like sliders,
dropdowns, dataframe
transformers, and chat
interfaces, and the cells that
use them are automatically re-run with their latest values.
Interactive dataframes. Page through, search, filter, and
sort
millions of rows blazingly fast, no code required.