šŸƒ Share notebooks from GitHub!

Badge generator

marimo 0.20.0

marimo 0.20.0

marimo 0.20.0 is now available. Install with

pip install --upgrade marimo

This release brings richer interactivity to scientific computing workflows in marimo with new UI primitives and a small breaking change to make mo.stop more predictable.

Reactive selections for Matplotlib scatter plots

mo.ui.matplotlib adds reactive box and lasso selection to Matplotlib scatter plots. Make a selection on a scatter plot and your selection is automatically sent back to Python. This lets you efficiently select into plots with millions of points, with no performance hit because the filtering is done on the backend.

Open in molab

Box select by default, Shift+click for lasso. Read the docs for more details.

Editable matrix and vector inputs

mo.ui.matrix provides interactive numeric grid inputs. Initialize with a nested list or NumPy array and get a reactive element that updates as the user edits cells.

Open in molab

Supports per-element bounds, symmetric constraints, and custom precision. Read the docs for more details.

Rich PyTorch nn.Module display

PyTorch nn.Module instances now render as collapsible HTML trees with color-coded layer categories.

Open in molab

Frozen layers are visually dimmed with trainable parameter counts shown inline. Hover any layer to view its docstring in the Documentation panel.

Breaking changes

mo.stop now waits for all dependencies to unblock (#8374)

Previously, when a cell depended on two branches that were both stopped with mo.stop, unblocking just one branch would trigger the dependent cell — often resulting in a NameError because the other branch’s variables were still undefined. Now, marimo waits until all of a cell’s dependencies are unblocked before running it. This also means that manually running a cell with a stopped ancestor will show a clear ā€œancestor stoppedā€ message instead of a NameError.

Exceptions block descendant execution

Previously, when a cell’s ancestor raised an exception, you could manually run it anyway, putting the notebook in an inconsistent state. Now, marimo always prevents cells from running if any of its ancestors raised an exception. This means that manually running a cell with a ā€œerroredā€ ancestor will show a clear ā€œancestor raisedā€ message.

Enhancements

  • Add mo.ui.matplotlib() (#8342)
  • Add Matplotlib SVG output support (#8312)
  • Add mo.ui.matrix() (#8354)
  • Add default focus for cell-links (#8372)
  • Allow excluding code blocks when exporting to PDF (#8362)
  • Include playwright when running sandboxed thumbnail generation (#8339)
  • Mask getpass.getpass() input in notebook UI (#8345)
  • Add sidebar upload progress toast and optional finish title (#8308)
  • Use click.ClickException for sandbox missing pyzmq error (#8347)
  • Add interactive doc lookup for data-marimo-doc in cell output (#8343)
  • Add rich HTML formatter for PyTorch nn.Module (#8307)
  • Support __buffer__ objects in widget comm buffers (#8283)
  • Add r2 support for ā€˜marimo edit’ (#8278)
  • Render IPython.display.Image with raw bytes (e.g. GIFs) (#8282)

Bug fixes

  • Only trigger cell when ALL its dependencies are unblocked (#8374)
  • Suppress warnings for meta information in config in markdown (#8290)
  • Remove resize when tracing panel in sidebar (#8366)
  • Display mermaid error if present and strip diagram (#8368)
  • Merge new panels into saved localStorage layout on upgrade (#8351)
  • Thread-safe redirection of console outputs in run mode (#8353)
  • Apply flex only for nested stacks (#8357)
  • Prevent duplicated system prompts in PydanticAI completions (#8356)
  • Display math rendering (#8348)
  • Fix + character in file paths being decoded as space in URLs (#8344)
  • Fix minor typo in mount.tsx (#8325)
  • Stop hardcoding us-central1 as vertex ai default location (#8313)
  • Suppress dark-mode hover border on published cells (#8297)
  • Prevent duplicate execution of nested marimo custom elements (#8286)
  • Comment only files count as empty files (#8289)
  • Refresh mpl interactive plots when browser tab becomes visible (#8287)
  • Fix mpl.interactive becomes blank with large plots (#8285)
  • Add a has_warnings parse enum to indicate formatting errors (#8288)
  • Fix flakey print_code test (1f706a2)
  • Fix --base-url breaks og:thumbnail generation path (#8329)

Documentation

  • Fix documentation and argument-parsing for thumbnails export (#8301)
  • Skills (#8321)
  • Clarify pixi vs hatch setup guidance in CONTRIBUTING (#8291)

Preview features

  • Storage inspector backend logic and models (#8233)

Contributors

Thanks to all our community and contributors who made this release possible: @akshayka, @andrewsoonqn, @axsseldz, @daizutabi, @dmadisetti, @fpreiss, @jacobcbeaudin, @jeffs, @Light2Dark, @manzt, @Mr-Neutr0n, @mscolnick, @mstanowski, @peter-gy, @snooze92, @xfy0012

And especially to our new contributors:

We’re grateful for every contribution, from code to documentation to bug reports. Thank you for helping make marimo better!