Why Not Jupyter
| Problem | Jupyter | Marimo |
|---|---|---|
| Hidden state | Cells can run out of order | Reactive DAG — always consistent |
| File format | .ipynb JSON (merge conflicts) | Pure .py files (git-friendly) |
| Reproducibility | Depends on execution order | Deterministic reactive execution |
| Interactivity | Requires ipywidgets setup | Built-in UI elements |
| Deployment | Needs Voila/Streamlit | marimo run notebook.py |
Reactive Execution
When you change a cell, all cells that depend on it automatically re-run:
# Cell 1: Change this...
x = mo.ui.slider(1, 100, value=42)
# Cell 2: ...and this auto-updates
y = x.value ** 2
mo.md(f"x={x.value}, y={y}")Built-in UI Elements
# Sliders, dropdowns, tables, forms, file upload...
dropdown = mo.ui.dropdown(["GPT-4", "Claude", "Llama"], label="Model")
checkbox = mo.ui.checkbox(True, label="Stream output")
text = mo.ui.text(placeholder="Enter prompt...")
table = mo.ui.table(dataframe) # Interactive data tableDeploy as Apps
# Run as a web app
marimo run notebook.py
# Run as slides
marimo run notebook.py --mode slides
# Export to HTML
marimo export html notebook.py -o output.htmlGit-Friendly
Notebooks are plain Python — diffs are readable:
- x = 42
+ x = 100AI Integration
import marimo as mo
from anthropic import Anthropic
client = Anthropic()
prompt = mo.ui.text_area(placeholder="Ask anything...")
if prompt.value:
response = client.messages.create(
model="claude-sonnet-4-20250514",
messages=[{"role": "user", "content": prompt.value}]
)
mo.md(response.content[0].text)Key Stats
- 10,000+ GitHub stars
- Pure .py file format
- Reactive execution (no hidden state)
- 20+ built-in UI elements
- Deploy as apps, dashboards, slides
FAQ
Q: What is Marimo? A: Marimo is a reactive Python notebook stored as .py files with built-in UI elements, no hidden state, and one-command deployment as web apps.
Q: Is Marimo free? A: Yes, fully open-source under Apache 2.0 license.
Q: Can I convert Jupyter notebooks to Marimo?
A: Yes, run marimo convert notebook.ipynb to auto-convert.