github marimo-team/marimo 0.20.3

latest release: 0.20.4
9 hours ago

What's Changed

This release brings improved PDF export with slide deck support and interactive widget rasterization, along with spreadsheet-style selection statistics for data tables.

⭐️ Highlights

Export slides as PDF

Notebooks using the slides layout can now be exported as PDF:

marimo export pdf --as=slides

The UI automatically recommends the right preset based on your notebook's layout.

Additionally, the new --rasterize-outputs flag captures interactive widgets (Plotly, anywidgets, etc.) as images in PDF exports — so your interactive components are preserved in the final document. Read the docs for more details.

Summary statistics for selected cells in data tables

Select two or more cells in a data table to see count, sum, and average of the selected numeric values — just like a spreadsheet. Works with mo.ui.table and mo.ui.dataframe.

Smart previews for SQL and markdown cells in the minimap

The dependency minimap now shows the actual content of SQL and markdown cells instead of unhelpful boilerplate like mo.sql(f""".

✨ Enhancements

  • Add storage/database connections UI (#8528)
  • Add marimo export session CLI tool (#8533)
  • Export slides as PDF (#8523)
  • Add simpler page selector with text input (#8532)
  • Add storage file viewer and unify components (#8500)
  • Disable "Open in Vega Editor" link in ChartBuilder (#8503)
  • PathState follows os.PathLike ABC (#8403)
  • Stream virtual files instead of buffering entirely in memory (#8499)
  • Render web elements in PDF export (#8458)
  • Expand uv_build semver range to "<0.11.0" (#8502)
  • Improve DuckDB EXPLAIN rendering to show clean query plan text (#8487)
  • Unify Marimo icons to SVG and improve component structure (#8471)
  • Add dark and light logos for more storage providers (#8476)
  • Storage download with signed url and vfile cleanup (#8441)
  • Show smart previews for SQL and markdown cells in minimap (#8466)
  • Dynamic gallery index refresh on marimo run <folder> --watch (#8460)
  • Output Altair SVG charts as base64-encoded images (#8443)
  • Add option to create notebook from file tree (#8412)
  • Add Dataframe download separator (#8318)
  • Add reactive scattergl selection support (#8490)
  • Add html_head parameter to create_asgi_app() (#8302)
  • Add get_cell_dependency_graph MCP tool (#8174)
  • Add expand console output button (#7919)
  • Add summary statistics for selected cells (#8326)
  • CLI error UX improvements (#8375)

🐛 Bug fixes

  • Preserve SVG elements and href attributes in sanitization (#8520)
  • Improve storage protocol detection (#8513)
  • Safer ends_with_semicolon with token errors (#8548)
  • Fix pdb arrow navigation (#8543)
  • Use custom renderer for marimo elements for chatbot (#8546)
  • Memory leak in ASGI session cleanup (#8495)
  • When parent dir is searched, child files should be open too in storage-inspector (#8525)
  • Fix Panel DynamicMap and interactive streams not updating (#8538)
  • Return cell name in run mode (#8524)
  • Skip weave on windows (#8539)
  • Latex in notebook outline (#8505)
  • Remove duplicate separators in action menus (#8509)
  • Add "marimo-sidebar" to excluded tags in outline (#8504)
  • Fix matrix widget showing stale values after cell re-execution (#8507)
  • Fix mo.cache returning stale values (#8411)
  • Detect symlinked files inside assets directory for follow_symlink warning (#8474)
  • Render all markdown cells in snippets, not just the title cell (#8480)
  • Preserve cell config (hidden/disabled) on undo delete (#8483)
  • Implement no-op edit skipping in EditNotebookTool (#8486)
  • change copilot endpoint to follow pydantic-ai (#8481)
  • remove duplicated system prompt (#8482)
  • Prevent TTL timer from killing session when new consumer reconnects (#8461)
  • Fix SQL cell deps lost when duckdb fails to parse normalized SQL (#8437)
  • Handle gallery crash on file deletion (#8459)
  • Stop serving duplicate notebooks when auto_download is set (#8462)
  • Perform a vectorized search for tables (#8450)
  • Plotly-resampler (and other FigureWidget subclasses) not working in marimo by routing FigureWidget through the anywidget formatter and syncing widget state via _repr_mimebundle_(). (#8430)
  • More sql prepared statements and quoting (#8431)
  • Hide unsupported codemirror language warning when LLM generated (#8432)
  • Exclude kernel memory from server memory stats to prevent double-counting (#8426)
  • quote duckdb tables, schema with double quote (#8387)
  • Sql explain query with newline (#8428)
  • Normalize paths in file router to prevent HTTPException with dotdot paths (#8425)
  • Use dynamic filename for "Download image" context menu (#8408)
  • External cells should not capture vscode cells (#8401)
  • Fix sql validation errors not cleared on cell-language switch (#8388)
  • Fix command palette not restoring focus to editor on close (341af73)
  • Handle with_dynamic_directory mounted at sub-path (#8322) (#8434)
  • Prevent stale closure in useNonce hook (#7763)
  • Normalize math rendering in docs panel and LSP tooltips (#8315)

📚 Documentation

  • Fix authentication middleware example to use pure ASGI middleware (#8473)
  • Add cli option to disable DNS rebinding protection for the MCP server (#8464)
  • Add docs for supported LSPs (#8463)
  • Add wasm example for matplotlib to docs (#8415)

🔬 Preview features

  • Add storage inspector (#8299)
  • Add experimental code-mode MCP server (#8477)

Contributors

Thanks to all our community and contributors who made this release possible: @24f2006299, @akshayka, @Antyos, @app/renovate, @axsseldz, @bxff, @daizutabi, @dmadisetti, @ffmiruz, @giulio-leone, @kyrre, @Light2Dark, @manzt, @mscolnick, @peter-gy, @tigretigre

And especially to our new contributors:

Full Changelog: 0.20.2...0.20.3

Don't miss a new marimo release

NewReleases is sending notifications on new releases.