Download Latest Version 0.22.0 source code.tar.gz (155.8 MB)
Email in envelope

Get an email when there's a new version of marimo

Home / 0.21.0
Name Modified Size InfoDownloads / Week
Parent folder
0.21.0 source code.tar.gz 2026-03-16 156.8 MB
0.21.0 source code.zip 2026-03-16 158.9 MB
README.md 2026-03-16 10.2 kB
Totals: 3 Items   315.7 MB 0

Interactive matplotlib now works everywhere — including WASM and Pyodide — plus you can download notebooks as ipynb directly from the editor.

⭐️ Highlights

Interactive matplotlib in WASM and Pyodide

mo.mpl.interactive() has been completely rewritten to use marimo's built-in communication channel instead of a separate server and WebSocket proxy. This means interactive matplotlib plots now work in WASM/Pyodide environments for the first time, with no background threads or separate server process needed.

Download notebooks as ipynb

You can now export your marimo notebook as a Jupyter .ipynb file directly from the editor's download menu. Cells are exported in visual order with their captured outputs included.

🚨 Breaking changes

  • Altair charts no longer stretch to full container width by default (#8696). Previously, marimo set width: "container" on all Altair charts, which distorted aspect ratios, made charts look different from the Altair docs. Charts now render at Altair's native default size. If you want a chart to fill the container width, set width="container" explicitly in your chart spec.

✨ Enhancements

  • Accept list args in ctx.install_packages (#8703)
  • Add different auth options for Snowflake in the UI (#8661)
  • Add read file and download snippets for storage inspector (#8640)
  • Ruff config discovery for notebook cell formatting (#8609)
  • Move matplotlib interactive to use marimo comm instead of over WS (#8612)
  • Refine type inference for cache decorators (#8629)
  • Improve command palette search with additional keywords (#8600)
  • Download notebooks as ipynb through UI (#8582)
  • Standardize file explorer icons, colors, spinner (#8571)
  • Add banner about GitHub free tier models (#8575)
  • Wait for buffered stdout/stderr before reading MCP execution results (#8577)
  • Format CellSelectionStats (proper aggregation, 3 decimal places) (#8564)
  • Storage inspector fixes and code gen update (#8566)
  • Add the ability to control the cache (#8311)
  • Add reactive histogram selection support (#8489)

🐛 Bug fixes

  • marimo export ipynb to support command-line arguments (#8709)
  • Tag install location on ModuleNotFound to distinguish installation on server vs kernel (#8619)
  • Fix copy to clipboard on Safari (#8587)
  • Debounce clearing of console outputs to prevent flickering (#8621)
  • Use explicit multiprocessing getcontext("spawn") (#8705)
  • Fix loguru messages not being printed (#8697)
  • Convert decimals to float64 for filtering in tables (#8706)
  • Catch generic exception when export to PDF (#8704)
  • Use request path to scope code-mode runtime behavior (#8702)
  • Add global previewed tables state (#8630)
  • Re-render mutable Html children in vstack/hstack on flush (#8626)
  • Fix Plotly selections returning points outside the selected range (#8685)
  • Ignore sql_refs for top level determination (#8673)
  • Send absolute path to frontend for file_browser (#8668)
  • Handle rust panic errors when getting config for obstore (#8658)
  • Don't search winpython in scanner for workspace files (#8633)
  • Correctly handle IPv6 (#8650)
  • Relative CSS paths (#8654)
  • Clamp the height and add overflow for storage inspector error (#8647)
  • Handle matplotlib boxplot/violinplot dict outputs (#8540)
  • Preserve TypeIs/TypeGuard narrowing through @app.function, @mo.cache, and @mo.lru_cache (#8598)
  • Truncate HTML output of run stale cells tool (#8578)
  • Do not prompt for overwrite when exporting WASM to an empty directory (#8591)
  • Fix keyboard shortcuts normalization (#8576)
  • Only display "Jump to page" when >100 pages (#8563)
  • Prevent NameError in marimo run when passing mo.md() between cells (#8692)
  • Fix vim macros duplicating inserted characters (#8470)
  • Forward cell names and configs on external file reload (#8433)
  • Prevent getnameinfo hang on Windows for link-local IPv6 (3b8b9bd)
  • Initialize cell_ids on notebook creation (#8310)
  • Remove SVG <title> tooltip from marimo icons (#8595)
  • Idempotent ipynb round-trip (#7939)

📚 Documentation

  • Enable storage inspector by default (#8666)
  • Add database UI - add text to help users (#8675)
  • Add variable type information to 'get_cell_dependency_graph' (#8663)
  • Sync Traditional Chinese README with latest updates (#8638)
  • Link to docs in language server page (#8614)
  • GitHub molab (#8604)
  • Iframe allow forms for ui.form (#8602)
  • Export, publishing, deploying refactor (#8581)
  • Simplify agents.md, add general approach to PRs (#8583)
  • Document session files for molab GitHub previews (#8573)
  • Add section on opencode agent (#8567)
  • Molab (#8554)

🔬 Preview features

  • Add internal code mode module for programmatic notebook control (#8670)
  • Add server registry and SSE execute endpoint (#8592)

📝 Other changes

  • Update Dockerfile with metadata labels, environment variables, and user permissions (#8637)
  • Remove GPT 5.4 pro (#8660)
  • Add newest GPT model, remove GPT 5.2 (#8586)
  • Remove old AI models, add latest ones (#8129)
  • Replace hatch env layer with native uv commands (#8510)
  • Prevent make dev from rewriting api.yaml version on event (#8334)
  • Fix broken tests on main (#8653)
  • Fix breaking tests for pandas support (#8593)
  • More hatch -> uv failures (#8655)

Contributors

Thanks to all our community and contributors who made this release possible: @akshayka, @axsseldz, @chentoast, @daizutabi, @dmadisetti, @ffmiruz, @koaning, @Light2Dark, @manzt, @MarcoGorelli, @mchav, @mscolnick, @peter-gy, @PranavGopinath, @thliang01, @tigretigre, @tsubasakong, @VishakBaddur

And especially to our new contributors:

Full Changelog: https://github.com/marimo-team/marimo/compare/0.20.4...0.21.0

Source: README.md, updated 2026-03-16