|
import marimo |
|
|
|
__generated_with = "0.9.2" |
|
app = marimo.App() |
|
|
|
|
|
@app.cell |
|
def __(): |
|
import marimo as mo |
|
|
|
mo.md("# Welcome to marimo! ππ") |
|
return (mo,) |
|
|
|
|
|
@app.cell |
|
def __(mo): |
|
slider = mo.ui.slider(1, 22) |
|
return (slider,) |
|
|
|
|
|
@app.cell |
|
def __(mo, slider): |
|
mo.md( |
|
f""" |
|
marimo is a **reactive** Python notebook. |
|
|
|
This means that unlike traditional notebooks, marimo notebooks **run |
|
automatically** when you modify them or |
|
interact with UI elements, like this slider: {slider}. |
|
|
|
{"##" + "π" * slider.value} |
|
""" |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.accordion( |
|
{ |
|
"Tip: disabling automatic execution": mo.md( |
|
rf""" |
|
marimo lets you disable automatic execution: just go into the |
|
notebook settings and set |
|
|
|
"Runtime > On Cell Change" to "lazy". |
|
|
|
When the runtime is lazy, after running a cell, marimo marks its |
|
descendants as stale instead of automatically running them. The |
|
lazy runtime puts you in control over when cells are run, while |
|
still giving guarantees about the notebook state. |
|
""" |
|
) |
|
} |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.md( |
|
""" |
|
Tip: This is a tutorial notebook. You can create your own notebooks |
|
by entering `marimo edit` at the command line. |
|
""" |
|
).callout() |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.md( |
|
""" |
|
## 1. Reactive execution |
|
|
|
A marimo notebook is made up of small blocks of Python code called |
|
cells. |
|
|
|
marimo reads your cells and models the dependencies among them: whenever |
|
a cell that defines a global variable is run, marimo |
|
**automatically runs** all cells that reference that variable. |
|
|
|
Reactivity keeps your program state and outputs in sync with your code, |
|
making for a dynamic programming environment that prevents bugs before they |
|
happen. |
|
""" |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(changed, mo): |
|
( |
|
mo.md( |
|
f""" |
|
**β¨ Nice!** The value of `changed` is now {changed}. |
|
|
|
When you updated the value of the variable `changed`, marimo |
|
**reacted** by running this cell automatically, because this cell |
|
references the global variable `changed`. |
|
|
|
Reactivity ensures that your notebook state is always |
|
consistent, which is crucial for doing good science; it's also what |
|
enables marimo notebooks to double as tools and apps. |
|
""" |
|
) |
|
if changed |
|
else mo.md( |
|
""" |
|
**π See it in action.** In the next cell, change the value of the |
|
variable `changed` to `True`, then click the run button. |
|
""" |
|
) |
|
) |
|
return |
|
|
|
|
|
@app.cell |
|
def __(): |
|
changed = False |
|
return (changed,) |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.accordion( |
|
{ |
|
"Tip: execution order": ( |
|
""" |
|
The order of cells on the page has no bearing on |
|
the order in which cells are executed: marimo knows that a cell |
|
reading a variable must run after the cell that defines it. This |
|
frees you to organize your code in the way that makes the most |
|
sense for you. |
|
""" |
|
) |
|
} |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.md( |
|
""" |
|
**Global names must be unique.** To enable reactivity, marimo imposes a |
|
constraint on how names appear in cells: no two cells may define the same |
|
variable. |
|
""" |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.accordion( |
|
{ |
|
"Tip: encapsulation": ( |
|
""" |
|
By encapsulating logic in functions, classes, or Python modules, |
|
you can minimize the number of global variables in your notebook. |
|
""" |
|
) |
|
} |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.accordion( |
|
{ |
|
"Tip: private variables": ( |
|
""" |
|
Variables prefixed with an underscore are "private" to a cell, so |
|
they can be defined by multiple cells. |
|
""" |
|
) |
|
} |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.md( |
|
""" |
|
## 2. UI elements |
|
|
|
Cells can output interactive UI elements. Interacting with a UI |
|
element **automatically triggers notebook execution**: when |
|
you interact with a UI element, its value is sent back to Python, and |
|
every cell that references that element is re-run. |
|
|
|
marimo provides a library of UI elements to choose from under |
|
`marimo.ui`. |
|
""" |
|
) |
|
return |
|
|
|
|
|
@app.cell |
|
def __(mo): |
|
mo.md("""**π Some UI elements.** Try interacting with the below elements.""") |
|
return |
|
|
|
|
|
@app.cell |
|
def __(mo): |
|
icon = mo.ui.dropdown(["π", "π", "β¨"], value="π") |
|
return (icon,) |
|
|
|
|
|
@app.cell |
|
def __(icon, mo): |
|
repetitions = mo.ui.slider(1, 16, label=f"number of {icon.value}: ") |
|
return (repetitions,) |
|
|
|
|
|
@app.cell |
|
def __(icon, repetitions): |
|
icon, repetitions |
|
return |
|
|
|
|
|
@app.cell |
|
def __(icon, mo, repetitions): |
|
mo.md("# " + icon.value * repetitions.value) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.md( |
|
""" |
|
## 3. marimo is just Python |
|
|
|
marimo cells parse Python (and only Python), and marimo notebooks are |
|
stored as pure Python files β outputs are _not_ included. There's no |
|
magical syntax. |
|
|
|
The Python files generated by marimo are: |
|
|
|
- easily versioned with git, yielding minimal diffs |
|
- legible for both humans and machines |
|
- formattable using your tool of choice, |
|
- usable as Python scripts, with UI elements taking their default |
|
values, and |
|
- importable by other modules (more on that in the future). |
|
""" |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.md( |
|
""" |
|
## 4. Running notebooks as apps |
|
|
|
marimo notebooks can double as apps. Click the app window icon in the |
|
bottom-right to see this notebook in "app view." |
|
|
|
Serve a notebook as an app with `marimo run` at the command-line. |
|
Of course, you can use marimo just to level-up your |
|
notebooking, without ever making apps. |
|
""" |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.md( |
|
""" |
|
## 5. The `marimo` command-line tool |
|
|
|
**Creating and editing notebooks.** Use |
|
|
|
``` |
|
marimo edit |
|
``` |
|
|
|
in a terminal to start the marimo notebook server. From here |
|
you can create a new notebook or edit existing ones. |
|
|
|
|
|
**Running as apps.** Use |
|
|
|
``` |
|
marimo run notebook.py |
|
``` |
|
|
|
to start a webserver that serves your notebook as an app in read-only mode, |
|
with code cells hidden. |
|
|
|
**Convert a Jupyter notebook.** Convert a Jupyter notebook to a marimo |
|
notebook using `marimo convert`: |
|
|
|
``` |
|
marimo convert your_notebook.ipynb > your_app.py |
|
``` |
|
|
|
**Tutorials.** marimo comes packaged with tutorials: |
|
|
|
- `dataflow`: more on marimo's automatic execution |
|
- `ui`: how to use UI elements |
|
- `markdown`: how to write markdown, with interpolated values and |
|
LaTeX |
|
- `plots`: how plotting works in marimo |
|
- `sql`: how to use SQL |
|
- `layout`: layout elements in marimo |
|
- `fileformat`: how marimo's file format works |
|
- `markdown-format`: for using `.md` files in marimo |
|
- `for-jupyter-users`: if you are coming from Jupyter |
|
|
|
Start a tutorial with `marimo tutorial`; for example, |
|
|
|
``` |
|
marimo tutorial dataflow |
|
``` |
|
|
|
In addition to tutorials, we have examples in our |
|
[our GitHub repo](https://www.github.com/marimo-team/marimo/tree/main/examples). |
|
""" |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.md( |
|
""" |
|
## 6. The marimo editor |
|
|
|
Here are some tips to help you get started with the marimo editor. |
|
""" |
|
) |
|
return |
|
|
|
|
|
@app.cell |
|
def __(mo, tips): |
|
mo.accordion(tips) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.md("""## Finally, a fun fact""") |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(mo): |
|
mo.md( |
|
""" |
|
The name "marimo" is a reference to a type of algae that, under |
|
the right conditions, clumps together to form a small sphere |
|
called a "marimo moss ball". Made of just strands of algae, these |
|
beloved assemblages are greater than the sum of their parts. |
|
""" |
|
) |
|
return |
|
|
|
|
|
@app.cell(hide_code=True) |
|
def __(): |
|
tips = { |
|
"Saving": ( |
|
""" |
|
**Saving** |
|
|
|
- _Name_ your app using the box at the top of the screen, or |
|
with `Ctrl/Cmd+s`. You can also create a named app at the |
|
command line, e.g., `marimo edit app_name.py`. |
|
|
|
- _Save_ by clicking the save icon on the bottom right, or by |
|
inputting `Ctrl/Cmd+s`. By default marimo is configured |
|
to autosave. |
|
""" |
|
), |
|
"Running": ( |
|
""" |
|
1. _Run a cell_ by clicking the play ( β· ) button on the top |
|
right of a cell, or by inputting `Ctrl/Cmd+Enter`. |
|
|
|
2. _Run a stale cell_ by clicking the yellow run button on the |
|
right of the cell, or by inputting `Ctrl/Cmd+Enter`. A cell is |
|
stale when its code has been modified but not run. |
|
|
|
3. _Run all stale cells_ by clicking the play ( β· ) button on |
|
the bottom right of the screen, or input `Ctrl/Cmd+Shift+r`. |
|
""" |
|
), |
|
"Console Output": ( |
|
""" |
|
Console output (e.g., `print()` statements) is shown below a |
|
cell. |
|
""" |
|
), |
|
"Creating, Moving, and Deleting Cells": ( |
|
""" |
|
1. _Create_ a new cell above or below a given one by clicking |
|
the plus button to the left of the cell, which appears on |
|
mouse hover. |
|
|
|
2. _Move_ a cell up or down by dragging on the handle to the |
|
right of the cell, which appears on mouse hover. |
|
|
|
3. _Delete_ a cell by clicking the trash bin icon. Bring it |
|
back by clicking the undo button on the bottom right of the |
|
screen, or with `Ctrl/Cmd+Shift+z`. |
|
""" |
|
), |
|
"Disabling Automatic Execution": ( |
|
""" |
|
Via the notebook settings (gear icon) or footer panel, you |
|
can disable automatic execution. This is helpful when |
|
working with expensive notebooks or notebooks that have |
|
side-effects like database transactions. |
|
""" |
|
), |
|
"Disabling Cells": ( |
|
""" |
|
You can disable a cell via the cell context menu. |
|
marimo will never run a disabled cell or any cells that depend on it. |
|
This can help prevent accidental execution of expensive computations |
|
when editing a notebook. |
|
""" |
|
), |
|
"Code Folding": ( |
|
""" |
|
You can collapse or fold the code in a cell by clicking the arrow |
|
icons in the line number column to the left, or by using keyboard |
|
shortcuts. |
|
|
|
Use the command palette (`Ctrl/Cmd+k`) or a keyboard shortcut to |
|
quickly fold or unfold all cells. |
|
""" |
|
), |
|
"Code Formatting": ( |
|
""" |
|
If you have [ruff](https://github.com/astral-sh/ruff) installed, |
|
you can format a cell with the keyboard shortcut `Ctrl/Cmd+b`. |
|
""" |
|
), |
|
"Command Palette": ( |
|
""" |
|
Use `Ctrl/Cmd+k` to open the command palette. |
|
""" |
|
), |
|
"Keyboard Shortcuts": ( |
|
""" |
|
Open the notebook menu (top-right) or input `Ctrl/Cmd+Shift+h` to |
|
view a list of all keyboard shortcuts. |
|
""" |
|
), |
|
"Configuration": ( |
|
""" |
|
Configure the editor by clicking the gears icon near the top-right |
|
of the screen. |
|
""" |
|
), |
|
} |
|
return (tips,) |
|
|
|
|
|
if __name__ == "__main__": |
|
app.run() |
|
|