github marimo-team/marimo 0.25.0

2 hours ago

This release reworks sandboxing to improve correctness, recovery, and consistency, and adds Pixi as a new sandbox backend.

We expect most users to be able to upgrade without making changes. Existing sandbox commands continue to work, but the underlying environment lifecycle has changed substantially and could affect some workflows.

This release also adds portable WebAssembly exports, persistent expanded outputs, and many fixes across the editor and runtime.

⭐️ Highlights

Pixi-powered notebook sandboxes

marimo sandboxes now support Pixi, bringing Conda packages, native libraries, and non-Python runtimes into notebook environments.

uv remains the default; use --sandbox=pixi to opt in.

# uv remains the default
uvx marimo edit --sandbox notebook.py

# Use Pixi
pixi exec marimo edit --sandbox=pixi notebook.py

Pixi-backed notebooks can combine packages from PyPI and Conda in the notebook’s inline configuration:

# /// script
# dependencies = ["marimo"]
#
# [tool.pixi.workspace]
# channels = ["conda-forge"]
#
# [tool.pixi.dependencies]
# r-base = "*"
# rpy2 = "*"
# ///

For example, this configuration carries everything needed to use R from Python. Learn more about Pixi sandboxes.

A revamped sandbox lifecycle

As part of the new sandbox architecture, the marimo editor now starts separately from notebook kernels. Sandboxed notebooks open faster because the editor no longer waits for uv or Pixi to prepare the environment and start the kernel.

The Packages panel shows that work as it happens. If setup fails, you can now edit the notebook manifest and retry without restarting marimo.

sandbox-recovery

Read the sandbox guide to learn more.

Keep cell outputs expanded

One of our most-requested features is here: expanded cell outputs can now be saved as part of the notebook.

When you select Expand Cell Output, marimo records the preference on the cell:

@app.cell(expand_output=True)
def _():
    ...

The output remains expanded when you reopen or share the notebook. Selecting Clamp Cell Output restores the default behavior.

This was also one of the first contributions from our newest team member, @marthacryan!

Portable WebAssembly exports

Interactive WebAssembly notebooks can now be exported as a single HTML file that opens directly in a browser, or as a self-contained bundle for serving without an internet connection:

marimo export html-wasm notebook.py --single-file -o notebook.html
marimo export html-wasm notebook.py --offline -o dist/

Read the WebAssembly export guide.

✨ Enhancements

  • Rebuild sandbox execution around one environment per notebook (#10728)
  • Run notebook sandboxes with Pixi (#10697)
  • Show sandbox context in the Packages panel (#10729)
  • Unify sandbox execution and asynchronous startup (#10821)
  • Add sandbox startup and recovery UI (#10822)
  • Keep sandbox setup separate from installed packages (#10944)
  • Add expand_output cell decorator (#10911)
  • Add Lens to the optional dependency dialog (#10950)
  • Add Studio and Lens CLI tips (#10873)
  • Create self-contained WebAssembly export bundles for offline use (#10879)
  • Support single-file WebAssembly exports (#10878)
  • Include marimo-lens in recommended dependencies (#10897)
  • Open the issue-report modal from the error fallback (#10875)
  • Replace the JSON viewer to remove MUI and Emotion (#10865)
  • Automatically mount Lens when installed (#10814)
  • Update the LLM model catalog (#10828)
  • Allow accordion items to start expanded (#10824)
  • Default new SQL cells to an available connection (#10826)

🐛 Bug fixes

  • Recover the file browser after cached output resets (#10862)
  • Improve missing-backend errors and sandbox startup cleanup (#10954)
  • Refresh the FastAPI example (#10945)
  • Disable thinking for inline autocomplete (#10890)
  • Collapse all sections when nested heading ranges share an end cell (#10923)
  • Wait for initialization before starting sessions (#10927)
  • Preserve local images in HTML and PDF exports (#10938)
  • Expand home directories in custom CSS paths (#10829)
  • Strip quotes and whitespace from %env values in ipynb conversion (#10904)
  • Preserve cell-toolbar keyboard activation (#10827)
  • Selectively prune modules under pytest (#10908)
  • Defer browser discovery until a cell uses webbrowser (#10887)
  • Fix expanded output in image_compare (#10907)
  • Send stable conversation headers to OpenCode Go (#10895)
  • Stop sandbox export children reliably on termination (#10891)
  • Count nulls correctly in boolean column statistics (#10866)
  • Resolve notebook paths when running cells with pytest (#10864)
  • Fall back to CSV for Altair charts without pyarrow (#10855)
  • Render display math nested in list-item continuations (#10785)
  • Prevent console crashes when input prompts are interrupted (#10854)
  • Recover from prompt submission failures (#10818)
  • Render multiline tooltips with normalized line endings (#10850)
  • Support multiline text in data-tooltip attributes (#10851)
  • Initialize terminal dimensions before shell startup (#10830)
  • Truncate long column names in the columns menu (#10831)
  • Run async notebooks from inside a running event loop (#10505)
  • Fix Codex marimo pair skill detection (#10671)
  • Run notebook sandboxes from uv script environments (#10696)
  • Centralize uv and PEP 723 operations (#10695)

📚 Documentation

  • Reframe package management docs around projects and sandboxes (#10940)
  • Explain .env resolution when there is no pyproject.toml (#10583)
  • Add more videos to the documentation (#10623)
  • Stop the docs font size from scaling up on wide screens (#10914)
  • Fix dependency installation in island payloads (#10832)

🔬 Preview features

  • Add an agent-facing CLI for live notebook sessions (#10777)
  • Add opt-in CLI prompts for agent pairing (#10889)

📝 Other changes

  • Surface when the workspace file scan is truncated (#10550)
  • Allow Jedi 0.20.0 (#10863)
  • Update pre-commit hooks (#10707)
  • Update npm non-major dependencies (#10714)

Contributors

Thanks to all our community and contributors who made this release possible: @akshayka, @atul2387, @boydgreenfield, @Chinmayrawat15, @cspipaon, @dangooddd, @DevPranjal, @dmadisetti, @julio4, @kirangadhave, @koaning, @Light2Dark, @manzt, @marthacryan, @mscolnick, @NoiceHax, @Oscar-Williams, @peter-gy, @phobson, @SergeyAxiomatic

And especially to our new contributors:

Full Changelog: 0.24.2...0.25.0

Don't miss a new marimo release

NewReleases is sending notifications on new releases.