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