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.
⭐ Highlights
Reactive selections for Matplotlib scatter plots
mo.ui.matplotlib adds reactive box and lasso selection to Matplotlib scatter plots.
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.
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.
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.
✨ 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
playwrightwhen 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.ClickExceptionfor sandbox missing pyzmq error (#8347) - Add interactive doc lookup for
data-marimo-docin 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.Imagewith raw bytes (e.g. GIFs) (#8282)
🐛 Bug fixes
- Only trigger cell when ALL its dependencies are unblocked (#8374)
- Supress 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.interactivebecomes blank with large plots (#8285) - Add a
has_warningsparse enum to indicate formatting errors (#8288) - Fix flakey
print_codetest (1f706a2) - Fix
--base-urlbreaks 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:
- @axsseldz made their first contribution in #8291
- @jeffs made their first contribution in #8297
- @snooze92 made their first contribution in #8301
- @Mr-Neutr0n made their first contribution in #8313
- @xfy0012 made their first contribution in #8308
- @mstanowski made their first contribution in #8329
- @fpreiss made their first contribution in #8356
- @jacobcbeaudin made their first contribution in #8351
Full Changelog: 0.19.11...0.20.0


