Repository navigation
Releases: marimo-team/marimo
Release list
0.25.1
✨ Enhancements
- Make local agent pairing easier to discover (#10946)
- Update LLM model catalog (#11002)
- Add
expand_outputsas an argument toctx.edit_cellandctx.create_cell(#10974) - Record cache entries in a per-notebook manifest (#10838)
- Marimo
cache size(#10837) - Marimo
cache dir(#10836)
🐛 Bug fixes
- Keep getpass responses out of saved console output (#11043)
- Reject invalid code mode cell names (#11032)
- Align and unshrink mo.ui.radio button when option label wraps (#11031)
- Harden sandbox environment selection (#11026)
- Send origin referrer on cross-origin requests from notebook pages (#11015)
- Keep sandbox package managers fixed in install alerts (#10983)
- Render dotted chart columns when data falls back to CSV (#10856)
- Fix plotly hover text rendering issue (#10988)
- Avoid repeated Docker prompt for sandboxed URL edits (#10984)
- Make the kernel SIGINT handler reentrancy-safe (#10975)
- Secure language server websocket listeners (#10979)
- Change tokenization to allow trailing comments (#10981)
- UI fix for SFTP (and a fsspec plugin for ssh) (#10977)
- Ensure partial cell config update preserves existing values (#10971)
📚 Documentation
- Add huggingface/drive to remote storage (#10959)
- Normalize styles from katex bump (#10995)
- Add Whisper sandbox example (#10994)
- Fix quickstart anchors in Spanish and Chinese READMEs (#10989)
- Security clarification on pyproject.toml (#10986)
- Add ffmpeg pixi example for blog post (#10993)
📝 Other changes
Contributors
Thanks to all our community and contributors who made this release possible: @dmadisetti, @kirangadhave, @koaning, @Light2Dark, @manzt, @marthacryan, @mscolnick, @peter-gy, @sadov, @ZainnQureshii
Full Changelog: 0.25.0...0.25.1
0.25.0
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.pyPixi-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.
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_outputcell 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
%envvalues 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-tooltipattributes (#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
.envresolution when there is nopyproject.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, @os...
0.24.2
What's Changed
✨ Enhancements
- Always show storage metadata for files (#10799)
🐛 Bug fixes
- Recognize MSSQL DuckDB string type aliases (#10801)
- Remove Markdown prose width cap (#10802)
- Finalize cells after post-execution hook interrupts (#10792)
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @kirangadhave, @Light2Dark, @mscolnick
Full Changelog: 0.24.1...TODO_CURRENT_VERSION
0.24.1
What's Changed
This release makes it easier to share slide decks, browse files across directories and GitHub repositories, in addition to many other bug fixes. Some other changes include better geospatial data support with GeoPandas, polars and duckdb, web assembly optimizations, and a condensed graph view to understand your notebook's dependencies.
⭐️ Highlights
Export slides to HTML and WebAssembly
Share notebooks in the slides layout as reveal.js decks, preserving slide structure, fragments, and deck settings. Export static HTML with captured outputs, or use WebAssembly to keep Python controls interactive in the browser.
marimo export html slides.py -o slides.html
marimo export html-wasm slides.py -o slides --mode run
Read the docs for static HTML, or learn about interactive WebAssembly exports.
Browse local folders and GitHub repositories
Keep project files, data directories, and GitHub repositories within reach in the Files panel. Add named local directories in pyproject.toml, or use Add Connection to connect a GitHub repository and browse its files.
[tool.marimo.file_browser]
folders = [
{ path = "/absolute/path/to/data", name = "Data" },
{ path = "/absolute/path/to/assets", name = "Assets" },
]Read the docs for additional local folders, or learn about remote storage connections.
A compact view of notebook dependencies
The dependency graph now shows compact variable summaries, making it easier to follow connections in larger notebooks. Double-click a cell in the graph to expand its code.
✨ Enhancements
- Make the file browser faster and easier to navigate (#10773)
- Condensed dependency graph representation (#10766)
- Show only specific columns from the column menu and explorer (#10768)
- Find connections by provider in command palette (#10749)
- Refresh static notebook run dialog (#10741)
- Persist static code visibility in URL (#10742)
- Refresh the model catalog and restore automated updates (#10735)
- HTML and WASM export of Reveal slides (#10703)
- Read provider keys from environment variables (#10665)
- Stream validated structured cell completions (#10652)
- Make proposed AI edits UI consistent with editor styling (#10595)
- Update LLM model catalog (#10634)
- Preview and edit TOML files with syntax highlighting (#10599)
- Hide redundant notebook download submenu (#10607)
- Upload files directly into folders (#10637)
- Make auto-discovered connections easier to add (#10640)
- Open the JSON viewer for string columns containing JSON documents (#10629)
- Connect GitHub repos from the Add Connection UI (#10604)
- Replace GitHub Models with GitHub Copilot (#10750)
- Allow
mo.latexto accept text directly (#10723) - Add shortcut to create a SQL cell below (#10701)
- Support multi-root file browsing (#10727)
- Install WebAssembly notebook packages in parallel with progress updates (#9702, 78f0366)
- Hide unused providers when
allow_provider_configis false (#10590, 3524643) - Show detected data sources and hide suggestions for existing connections (#10575, ba0219a)
- Add GeoPandas geometry table support (#10536, 205fa16)
- Lint rule for private imports (#10580, 3a1b1da)
- Type exact values and adjust step sizes in
mo.ui.matrix(#10520, 5c3646a) - Add Databricks SQL warehouse discovery plugin (#10556, df8dbed)
- Update LLM model catalog (#10571, 09c2c30)
- Install server requirements for notebook exports (#10473, 397fae2)
🐛 Bug fixes
- Add an exit control to fullscreen cell output (#10769)
- Make cross-cell navigation work before target editors finish loading (#10708)
- Map
geoarrowimports togeoarrow-types(#10659) - Preserve newlines in iframe
srcdoc(#10668) - Map
maceimports tomace-torch(#10594) - Detect CRS-qualified DuckDB geometry (#10643)
- Set explicit browser cache headers (#10614)
- Preserve insertion order for NumPy integer dictionary keys (#10788)
- Serialize Polars cache values with native IPC (#10775)
- Respect a single supplied bound when choosing the default
mo.ui.date_rangevalue (#10649) - Keep marimo running when tracing dependencies are missing (#10758)
- Fix scope renaming during notebook conversion (#10748)
- Use Ctrl for AI shortcuts on Windows (#10751)
- Preserve unqualified references in methods (#10679)
- Handle spaces in package extras (#10686)
- Prevent nested progress output from shaking (#10743)
- Preserve virtual ESM URLs (#10687)
- Make edit replay robust across structural changes (#10662)
- Fix reference ordering for recursive private functions (#10678)
- Update the Matplotlib pin in tutorials to avoid
Path.__deepcopy__recursion (#10702) - Accept covariant mappings in
mo.ui.dictionaryand.batch(#10653) - Stop listing unavailable Kimi K3 on W&B (#10689)
- Make catalog discovery reuse one connection (#10636)
- Match generated filter code to the widget's literal
containsoperator (#10617) - Fix table-cell edit styling and popover dismissal (#10622)
- Resolve the default database for Snowflake engines without a database in the URL (#10616)
- Derive canvas draw scale from the backing store (#10626)
- Validate that checkbox values are booleans (#10601)
- Reject an empty-string value in
mo.ui.file_browser(#10613) - Fix code lens tooltip jitter (#10591)
- Route AI tool arguments to the correct tool (#10597)
- Store a keyed hash of the auth token in the session cookie (#10691)
- Preserve dataframe state after unmounting (#10762, #10759, 69e0067)
- Use Ctrl for chart pan and zoom on non-macOS platforms (#10496, #3812, b4181ab)
- Restore streaming package installation in WebAssembly notebooks (#10522, c3717b7)
- Sanitize signing config from untrusted layers (#10525, 55e2a22)
- Handle delimiters when detecting URLs in table cells (#10570, eb9960f)
- Suppress warnings for duration columns in column summaries (#10531, 666e922)
- Pass real JSON schema through for MCP/backend tools (#10573, 9131759)
- Fix Slurm script execution and refresh deployment examples (#10469, f1b3678)
📚 Documentation
- Fix the SQL Support link in the
sql_parse_errorlint rule (#10757) - Fix the
mo.videoexample (#10731) - Keep sidebar code mode aligned with marimo-pair (#10683)
- Update the molab storage documentation (#10672)
- Add a callout to use Jupyter-to-marimo agent skill (#10593)
📝 Other changes
- Restore typechecking with Click 8.4 (#10738)
- Skip the Scattermapbox selection test when Plotly removes it (#10721)
- Update actions/checkout digest (#10710)
- Update all oxc dependencies (#10700)
- Update all storybook dependencies to ^10.5.10 (#10673)
- Update codemirror dependencies (#10482, 0a80490)
- Update build tools (#10630)
- Update dependency @testing-library/jest-dom to v7 (#10619)
- Restore current JAX coverage after Flax compatibility fix (#10669)
- Generate OpenAPI schema for UI plugin contracts (#10513, 257ea7a)
- Unblock Flax tests during JAX compatibility window (#10646)
- Update pre-commit hooks (#10578, 96a4942)
- Make session resume E2E retries reliable (#10588, cad0f45)
- Introduce SigningPolicy and rename mode to verification (#10524, 3dbe26f)
- Add geometry fixture corpus and baselines (#10516, eece28b)
- Enable four additional Ruff checks (#10586, 4e4efcc)
- Keep custom SSL clients type-safe on openai 3 (#10587, e878ff7)
- Migrate to MCP 2 (#10581, 849f16b)
- Scope debugger ignore (#10540, ea3be97)
- Remove stale ignores (#10539, c092a67)
- Move cache configuration from
experimental.cachetocache.storeand add signing fields (#10523, 7ff2b4d)
Contributors
Thanks to all our community and contributors who made this release possible: @Abdulrehman-PIAIC80387, @abelsiqueira, @afonsojanu, @akshayka, @alchem0x2A, @Aniket-a14, @dmadisetti, @Jacky-J126, @kirangadhave, @kjgoodrick, @koaning, @ktaletsk, @Light2Dark, @manzt, @matemijolovic, @mscolnick, @Nikhil-Koganti, @peter-gy, @pylrn, @robd518, @sha2fiddy, @winklemad
And especially to our new contributors:
- @abelsiqueira made their first contribution in #10626
- @afonsojanu made their first contribution in #10702
- @alchem0x2A made their first contribution in #10594
- @Aniket-a14 made their first contribution in #10701
- @Jacky-J126 made their first contribution in #10757
- @matemijolovic made their first contribution in #10762
- @Nikhil-Koganti made their first contribution in #10496
- @pylrn made their first contribution in #10723
- @sha2fiddy made their first contribution in #10616
Full Changelog: 0.24.0...0.24.1
0.24.0
What's Changed
This release improves the user experience for working with data sources in the marimo editor. It also makes a small breaking change to mo.ui.file_browser, restricting navigation outside the target directory by default with restrict_navigation=True. Like all our releases, it includes many other enhancements and bug fixes.
🤗 Hugging Face Hub integration
Hugging Face Hub is now a first-class remote storage backend. Hugging Face Hub (huggingface_hub.HfApi) usage is automatically detected, with your HuggingFace data appearing in the storage sidebar.
- Browse datasets, models, spaces, and buckets, with lazy listing/download/signed-URL support via HfApi.
- Bucket paths are namespaced like repos (buckets///...), matching the Hugging Face Hub API.
- Read files directly with hf:// URLs from Polars, pandas, or DuckDB.
Read the docs to learn more.
🛢️ Preview variables bound to data sources
Variables bound to data sources and remote storage backends are now decorated with small icons indicating the connection. Hover over the icon to see details about the connection, or click it to open the relevant section in the data sources sidebar panel.
📥 A unified export dialog
The marimo editor now includes a simple, unified, and customizable export dialog, allowing you to export notebooks to various formats and customize the options for each export type.
export-dialog-demo.mp4
🤖 AI capabilities in the chat sidebar
Give your AI access to capabilities like web search directly from the siderbar:
Screen.Recording.2026-08-10.at.5.14.09.PM.mov
All changes
✨ Enhancements
- add capabilities UI for chat sidebar (#10502)
- Infer file browser initial path from initial value (#10362)
- Make editor code lens configurable via display.code_lens (#10512)
- Migrate frontend to AI SDK v7 (#10486)
- Enable editor code lens (#10507)
- Improve discoverability of collapse/expand all sections commands (#10464)
- Raise upper bound on
uv_buildto<=0.13.0(#10467) - Update LLM model catalog (#10440)
- Report missing Chromium for PDF export (#10453)
- Add Hugging Face Hub as a remote storage backend (#10419)
- Unified export dialog UI (#10429)
🐛 Bug fixes
- Improve hover hit-area of code-lens (#10576)
- chat sidebar: mark Code Mode as beta (#10569)
- Restrict navigation by default (#10518)
- Creating new thread from sidebar doesn't work (#10538)
- Preserve nulls in pandas JSON stringification (#10517)
- Export filenames are unreadable in molab (#10478)
- Raise on colliding option names in dropdown/multiselect (#10511)
- Torch formatter popup clipping (#10493)
- Mo.image_compare scales images to given width/height (#10500)
- Kill processes when interrupting a cell (#10492)
- Raise a helpful error for invalid radio/multiselect option names (#10498)
- Resolve file keys through the workspace when matching sessions (#10474)
- Restore view state after present-mode callbacks (#10452)
- Support quoted headings in document outline (#10454)
- Preserve invalid cells in topological IPYNB export (#10451)
- Prevent UI / state from being miskeyed for hash construction (#10447)
- Export dialog tab a11y and error logging (#10444)
- Broaden catches from TokenError to TokenError + SyntaxError (#10446)
📚 Documentation
- Add PyCharm video (#10521)
- Describe cache_cells and its use for WASM exports (#10455)
- Document workarounds for refreshing SQL cells in app mode (#10418)
- update docs and UI for quick-add datasources (#10426)
- Document data source environment discovery (#10423)
🔬 Preview features
- Add capability discovery (#10399)
📝 Other changes
- Align Renovate and pnpm release cooldowns (#10572)
- Update dependency mermaid to v11.16.1 [security] (#10234) (c583cd8)
- Update dependency dompurify to v3.4.13 [security] (#10491)
- Update dependency form-data to >=4.0.6 [security] (#10231) (a110544)
- Update dependency postcss to v8.5.23 [security] (#10322)
- Update dependency @playwright/test to ^1.62.1 (#10257) (c9accd8)
- Update build tools (#10294) (6f1e27c)
- Update dependency turbo to v2.9.14 [security] (#10235) (2d5b535)
- ci fix: add types-docutils for mypy typecheck (#10487)
- Security acknowledgments (#10279) (1a60a4e)
- [pre-commit.ci] pre-commit autoupdate (#10248) (233d184)
Contributors
Thanks to all our community and contributors who made this release possible: @Abdulrehman-PIAIC80387, @akshayka, @app/github-actions, @app/pre-commit-ci, @app/renovate, @Chinmayrawat15, @dmadisetti, @kirangadhave, @koaning, @Light2Dark, @manzt, @mscolnick, @peter-gy, @tschm, @wally-an, @yairchu
And especially to our new contributors:
- @Chinmayrawat15 made their first contribution in #10498
Full Changelog: 0.23.16...0.24.0
0.23.16
What's changed
🛢️ Quickly add discovered data sources to your notebook
marimo can now discover data sources configured on your machine. The backend scans environment variables for available connections across Postgres, MySQL, Trino, AWS, PyIceberg, and PySpark, and surfaces them in a new quick-add UI in the editor.
📣 Callout glow-up
mo.callout now accepts an optional title argument, rendered with a matching icon:
mo.md("It's dangerous to go alone!").callout(kind="warn", title="Warning")
Callouts and Markdown admonitions also share a new, unified look inspired by GitHub's admonitions, so they flow more naturally in the body of your notebook and keep text legible.
Slides improvements.
Overflowing slides now show a "scroll for more" hints, and slide container styling is simplified (#10363).
✨ Other enhancements
- minor add db dialog UI cleanup (#10398)
- Backend data source discovery (#10408)
- Store JSON credentials as secrets or file paths (#10379)
- Keep the reader banner visible while scrolling (#10390)
- simplify slide container styles, and add docs (#10363)
- Treat downstream
mo.stopas scratchpad success (#10369) - Update LLM model catalog (#10240)
- Container credentials and allow_http for S3 stores (#10356)
- Upgrade codemirror-sql (#10350)
- Make copy line up/down hotkeys editable (#10241)
- "Scroll for more" hint on overflowing slides (#10305)
- Bound file previews and offer download for unpreviewable files (#10277)
- Add callout titles, unify callout and admonition styling (#10312)
🐛 Bug fixes
- Prevent duplicate row header columns (#10412)
- Do not echo kernel-pushed anywidget state back on save_changes (#10410)
- Correct MCP streamable_http_client import name (#10388)
- Use load_catalog for pyiceberg when no catalog options set (#10409)
- Validate named DuckDB connections (#10400)
- Raise viewer banner above the app header (#10411)
- fix typing-extensions import error on 3.11 (#10406)
- Stop terminal Ctrl-C from killing the kernel on Windows (#10370)
- Detect marketplace-installed pair skills (#10385)
- Restore scratchpad editor after panel hide (#10384)
- Upgrade codemirror-languageserver to v2 (#10355)
- Use --file path instead of --session for pair prompt (#10367)
- cap mcp to 2.0 (#10373)
- Scroll horizontally when navigating to an off-screen column (#10354)
- fix column summary chart warnings and edge cases for null cols (#10317)
- Respect actual schema/catalog when dropping in-memory SQL tables (#10357)
- Wrap long code lines in WebPDF export (#10295)
- Quote DuckDB identifiers when dropping in-memory tables (#10341)
- Load Optional Dependencies settings on the home page (#10351)
- Ignore inactive session messages (#10330)
- Strip display.custom_css from notebook script metadata (#10323)
- Sanitize non-BCP-47 browser locales that crash the frontend (#10318)
📚 Documentation
- Build llms.txt locally as a compact index instead of crawling the site (#10383)
- Sync Traditional Chinese README with English (#10364)
- Link to marimo.io/pair, not github (#10311)
📝 Other changes
- Add code lens linking datasources, buckets, and caches to panels (#10161) (254ee01)
- Preview SVG and text-based media in file sidebar (#10187) (4eda78b)
- Stop scratchpad console cross-delivery between concurrent executes (#10036) (bbed512)
- Relax pymdown-extensions upper bound to allow 11.x (#10332)
- Fix typo in matrix.py documentation (#10337)
- Unify Ctrl+Enter, Shift+Enter and Submit button behavior (#8324) (#9836) (bc203a4)
- Update dependency postcss to v8.5.12 [security] (#10310)
Contributors
Thanks to all our community and contributors who made this release possible: @Abdulrehman-PIAIC80387, @akshayka, @app/github-actions, @app/renovate, @Dhruv-kys, @gsmith-alvarez, @kirangadhave, @koaning, @Light2Dark, @manzt, @mscolnick, @peter-gy, @Ploruto, @thliang01, @tschm
And especially to our new contributors:
- @AnshManwani made their first contribution in #9836
- @Abdulrehman-PIAIC80387 made their first contribution in #10241
- @Ploruto made their first contribution in #10337
- @MHouse made their first contribution in #10036
- @Dhruv-kys made their first contribution in #10354
- @gsmith-alvarez made their first contribution in #10388
Full Changelog: 0.23.15...0.23.16
0.23.15
What's Changed
✨ Enhancements
- Prefill issue-report fields via include toggles (#10307)
- Searchable combobox for secret/env fields (#10253)
- Support default file browser selection (#10255)
- Previewable issue diagnostics in the feedback modal (#10251)
- Stream file-browser downloads from disk (#10247)
- Support theme override via query param (#10196)
- Target the current session so agents connect to the right notebook (#10169)
- Propagate request trace context to the kernel (#10166)
- Add deck-level content alignment control (#10176)
- Update LLM model catalog (#10157)
- Queue follow-up messages while assistant is streaming (#10174)
🐛 Bug fixes
- Data_editor corrupting int8/uint8/float16 columns on edit (#10211)
- Reject catch-all getattr objects as DB connections (#10301)
- Clamp dropdown to viewport and portal into fullscreen root (#10297)
- Retain static output through initial hydration (#10298)
- Exclude marimo package from modulefinder crawl (#10249)
- Harden create-test-release action (#10278)
- Remeasure container-width Vega charts when host gains size (#10266)
- Avoid recursively scanning anywidget state (#10254)
- Retry invalid anywidget modules (#10259)
- Resolve pytest race condition during edit (#10139)
- Canonicalize widget files in HTML exports (#10261)
- Resolve version from
marimo-base(#10260) - Handle PEP 695 TypeAlias in DeprivateVisitor (#10227)
- Support Google Vertex with Pydantic-AI v2 (#10256)
- Pin pydantic-ai instrumentation version (#10239)
- Stringify bare pint values in JSON encoding (#10242)
- Restore retina rendering for matplotlib figures (#10246)
- Make long error toasts readable and copyable (#10243)
- Serialize pandas via Arrow IPC instead of deprecated feather (#10244)
- Data_editor corrupting int8/uint8/float16 columns on edit (#10211)
- Dismiss Jedi signature hint on Escape and closing paren (#10162)
- prevent AI in-editor input from disappearing on rejection (#10206)
- Disable scroll view on mobile to prevent crash (#10212)
- Surface load errors instead of rendering a silent blank (#10121)
- Scope skew-protection exemption to login form (#10164)
- Skip missing-package nudge for marimo.* imports (#10167)
- Resolve normalized package names to their module (#10165)
- Sort packages panel list case-insensitively (#10168)
- Do not fire anywidget change listeners at mount (#10179)
- Preserve output DOM across present/edit mode toggles (#10160)
- Do not broadcast anywidget
echo_updateacks back to clients (#10178) - Preserve leading underscores in to_camel_case (#10170)
- Prevent marimo check from formatting regular markdown files (#10138)
📚 Documentation
- Marimo glance (#10282)
- Pycharm plugin (#10283)
- Marimo pair (#10288)
- Consolidate AI guides and route readers to marimo pair (#10293)
- Fix missing colon on persistent_cache example (#10228)
- Mdx-marimo for publishing (#10208)
- Move OG image execution behind flag (#10175)
- Initial selection support for mo.ui.matplotlib (#10177)
📝 Other changes
- Handle private imports (#9704) (f08787a)
- fix nav menu dropdown clipping (#9469) (d6bd0d5)
- Update dependency ws to v8.21.0 [security] (#10236)
- Update dependency js-cookie to v3.0.7 [security] (#10232)
- Update dependency dompurify to v3.4.12 [security] (#10230)
- Fix/container gc retention (#9918) (593ba29)
- Snapshot public API exports and signatures (#10218)
- Include local wheels in WASM exports (#10071) (53e7962)
- Preserve multiline string indentation in cell loader (#9877) (1f1bb63)
Contributors
Thanks to all our community and contributors who made this release possible: @aadetya, @akshayka, @app/github-actions, @app/marimo-github-maintenance-bot, @app/renovate, @Bartok9, @dmadisetti, @eeshsaxena, @kirangadhave, @Light2Dark, @manzt, @mscolnick, @peter-gy, @winklemad, @yairchu, @yarikoptic
New Contributors
- @ChidiebereNjoku made their first contribution in #9877
- @winklemad made their first contribution in #10211
- @Bartok9 made their first contribution in #10228
- @aadetya made their first contribution in #10239
- @edwardwkrohne made their first contribution in #9918
- @yarikoptic made their first contribution in #10265
Full Changelog: 0.23.14...0.23.15
0.23.14
What's Changed
This release brings anywidget composition with hot reload, an experimental debugger with per-line timing, chat AI improvements, and cached WASM exports.
Plus many fixes across charts, tables, and exports.
⭐️ Highlights
Anywidget composition and hot reload
marimo now supports anywidget's new composition API: parent widgets can render child widgets they were handed as values. Widget frontend code also hot-reloads in place as you edit it — live views re-render with widget state intact (#10127).
Read the docs for more on building custom UI plugins.
Debugger and per-line timing
An experimental debugger execution lifecycle adds frame watching to cell execution, highlighting the currently executing line and enabling debug points (#9970).
Screen.Recording.2026-06-23.at.9.53.50.AM.mov
Building on the same machinery, the experimental line_timing flag shows an elapsed-time pill on any line that has been busy for more than ~500ms (#10126).
Chat AI improvements
The AI chat panel picked up several upgrades this release:
- Web search and fetch — the chat panel can now search and fetch from the web, adapting to your provider's native tools when available (#10052)
- Errors as chat context — mention
@error://allor a single cell's error to attach its source, traceback, and SQL schema as context chips (#10038) - "Fix in chat" — cell errors and tracebacks gain an option to route the failing code straight into the sidebar (#10024)
- Prompt caching — enabled for supported providers (#10052)
Screen.Recording.2026-06-30.at.5.24.02.PM.mov
Read the docs for more on AI features.
Cached WASM exports
marimo export html-wasm --execute now bundles runtime cache into the export, so published notebooks hydrate cell outputs from cache instead of recomputing them in the browser (#9897). This lets you share interactive snapshots of executions that normally can't run in the browser at all (like a jax or torch training run) while the rest of the notebook stays live. Built on a new cell-level cached execution lifecycle, opt-in via [tool.marimo.runtime] cache_cells = true (#9895).
Screen.Recording.2026-07-08.at.4.39.03.PM.mov
Read the docs for more on exporting notebooks.
✨ Enhancements
- Support anywidget composition and hot reload (#10127)
- Add signatures to cache bundles to prevent tamper (#10123)
- Add MARIMO_SESSION_COOKIE_SECURE env var for Secure session cookie (#10117)
- Support
mdxflavor in md export (#10116) - Honor per-cell hide_code in kiosk and reader views (#10111)
- Allow selecting a pandas DataFrame index as a chart axis (#10097)
- Add web search and fetch capabilities to AI chat, with provider caching (#10052)
- Single-cell error chips and auto-sync resource map (#10038)
- Add "Hide all" columns action (#10068)
- Introduce progressive loading for WASM (#10044)
- Open home in a new tab instead of replacing the current one (#10066)
- Add "Fix with AI assistant" option for errors (#10024)
- Better completions around function calls (#10045)
- Add Fable and Sonnet 5 to models list (#10051)
- Avoid bumping
__generated_withwhen that's the only change in a notebook (#10027) - Bundle session caches into html-wasm --execute output (#9897)
- Cell-level cached execution lifecycle (#9895)
🐛 Bug fixes
- Fix mounting anywidget CSS in cross-realm roots (#10136)
- Allow WebPDF export on Windows (#10131)
- Preserve aspect ratio for images with numeric dimensions (#10130)
- Fall back to interpreter completion when jedi static analysis raises (#10100)
- Make graceful kernel shutdown opt-in to unblock event loop (#10124)
- Classify SetBreakpointsCommand and resync breakpoints on restart (#10120)
- Key task-list checkboxes by checked state to prevent stale render (#10114)
- Extend LSP go-to-definition fallback to context menu and cmd+click (#10102)
- Increased cache robustness for wire level cell resolution (#10109)
- Respect per-notebook inline theme when serving a directory (#10101)
- ASGI credentials reflection (#10107)
- Fix pie chart rendering when innerRadius is undefined (#10104)
- Apply mo.ui.dataframe row filter when submitted via .form() (#10092)
- Render legacy named render/initialize exports (#10093)
- Don't grey out streaming output in grid and slides layouts (#10094)
- Fix data editor in fullscreen (#10098)
- Make the rename symbol popup readable in dark mode (#10091)
- Fix external go to definition (#10099)
- Cache os.path.realpath results in _is_user_module (#10086)
- Readonly view selects SQL language (#10074)
- Polars lazyframe query plan visualisation fix (#10087)
- Preserve leading and trailing comments when formatting cells (#10060)
- Show sql snippet cells as sql instead of python (#10050)
- Restore write permission on export directory after copytree on Nix (#10041)
- Expand dict transformation (#9561)
📚 Documentation
- Fix single-column example in mo.ui.table docstring (#10075)
- Emphasize non-reactivity of
mo.ui.panelin its docstring (#10067)
🔬 Preview features
- Experimental line_timing — green active-line highlight + per-line timer (#10126)
- Experimental SSE transport for the kernel connection (MARIMO_SERVER_TRANSPORT) (#10119)
- Debugger execution lifecycle (#9970)
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @brookpatten, @David-Wu1119, @dmadisetti, @eeshsaxena, @Felipenguim, @Hemanth-1354, @kirangadhave, @Light2Dark, @manzt, @mscolnick, @ohmdelta, @Oishe, @peter-gy, @qorexdevs, @VishakBaddur, @wally-an, @yairchu
And especially to our new contributors:
- @qorexdevs made their first contribution in #10050
- @Felipenguim made their first contribution in #10067
- @eeshsaxena made their first contribution in #10072
- @brookpatten made their first contribution in #10074
- @Oishe made their first contribution in #10075
- @ohmdelta made their first contribution in #10087
- @David-Wu1119 made their first contribution in #10100
- @Hemanth-1354 made their first contribution in #10114
Full Changelog: 0.23.13...0.23.14
0.23.13
What's Changed
- fix: edge cases for parsing pasted notebooks by @akshayka in #10033
- WIP: adding a jax/flax formatter by @koaning in #9902
- bug: formatting of exposed classes preserves class decorators by @yairchu in #10042
- release: 0.23.13 by @dmadisetti in #10046
Full Changelog: 0.23.12...0.23.13
0.23.12
What's Changed
✨ Enhancements
- Improve anywidget invalid module error messages (#10026)
- WandB models updated (#10040)
- LazyStore dual-mode WASM backend (#9898)
- Avoid forced min-width and horizontal clipping in mobile app view (#10023)
- Stamp context attachments (#9994)
- Update llm-info model catalog and backfill descriptions (#10002)
- Hydrate islands from JSON payloads (#9987)
- Suppress kernel-dependent table controls in static export (#10007)
- Keyboard and screen-reader accessibility for mo.ui.file_browser (#10005)
- synonyms for showing code in the command palette (#9993)
- Defer marimo-pair references and improve code mode prompts (#9985)
- Support array protocol objects (torch.Tensor, JAX, etc.) in mo.audio (#9943)
🐛 Bug fixes
- Use CSS styles for width/height to support percentage values (#9966)
- Close pty master before reaping to avoid event-loop deadlock (#10031)
- Bump ruff version for test failures (#10029)
- Remove unavailable models (#10025)
- Keep with_dynamic_directory serving after a directory symlink swap (#10015)
- Avoid double formatting in mo.output.replace (#9909)
- Typing for numpy as indices (#10014)
- Use GITHUB_TOKEN for sync-llm-info PR creation (#9998)
- Ignore D421 property-docstring-starts-with-verb lint rule (#9992)
📝 Other changes
- Support pydantic-ai v2 (#9973)
- Tighten import handling and fix SetComprehension typo (#9607) (ea3c57c)
- Clarify UIElement value is read-only (#9382) (bf0468d)
- Anywidget refresh value (#9454) (f7b1571)
- Support multiple markdown flavors in
marimo export md(#9586) (8565003) - Upgrade frontend to Tailwind v4.3 and lint deprecated classes (#9995)
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @allin2, @app/github-actions, @dmadisetti, @kirangadhave, @koaning, @ktaletsk, @Light2Dark, @lxingy3, @mscolnick, @peter-gy, @Vitaliy-Pikalo
New Contributors
- @Vitaliy-Pikalo made their first contribution in #9943
- @github-actions[bot] made their first contribution in #10002
- @onthebed made their first contribution in #9382
- @lxingy3 made their first contribution in #9909
- @ktaletsk made their first contribution in #10031
- @allin2 made their first contribution in #9966
Full Changelog: 0.23.11...0.23.12


