Releases: marimo-team/marimo
Release list
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
0.23.11
What's Changed
This release gives mo.ui.table finer display control (fixed column widths, a toggleable search bar, and a reusable display config).
Additionally mo.output.clear_console() adds a way to clear console output mid-run, and ships a broad set of fixes across AI config, exports, and the data sources tree.
Various other bug fixes like matplotlib==3.11 support in mo.mpl.interactive and pydantic-slim integration also ship in this release.
⭐️ Highlights
More control over mo.ui.table display
You can now size and trim tables to fit your data. column_widths pins named columns to an exact pixel width (great for long file paths or notes that used to get clipped), while unlisted columns continue to size to their content. The search bar is now toggleable via show_search, and the four visibility flags are available as a reusable mo.ui.table.Display config you can build once and unpack into many tables (#9982, #9984).
mo.ui.table(df, column_widths={"filename": 600, "id": 60})
# Reusable display config
cfg = mo.ui.table.Display(show_search=False, show_download=False)
mo.ui.table(data, **cfg)
mo.ui.table(other, **{**cfg, "show_column_summaries": False})Clear console output mid-run
mo.output.clear_console() clears a cell's console output while it's still running, and the clear now sticks across reconnects, exports, and the on-disk session cache, not just in the live view. This replaces the old "re-run the cell to clear it" workaround.
✨ Enhancements
- Add show/hide all code commands to command palette (#9989)
- Add
show_searchand a reusablemo.ui.table.Displayconfig (#9984) - Add
column_widthstomo.ui.table(#9982) - Stub serialization toolkit (class/lazy/module stubs) (#9896)
- Add more trace attributes under an AI span (#9968)
- Only auto-expand search matches in the data sources tree (#9955)
- Disable settings overridden by
pyproject.toml(#9961) - Tighten markdown heading spacing (#9962)
- Add
mo.output.clear_console()(#9950)
🐛 Bug fixes
- Remove print page margin and inset content for themed PDF export (#9971)
- Support matplotlib 3.11 interactive (#9990)
- Add repair for orphaned tool calls (#9976)
- Wrap cells in function scope before ruff formatting (#9889)
- Allow DeepSeek custom provider configuration (#9969)
- Stringify pint-pandas values in table JSON output (#9951)
- Prevent hard failure on malformed AI config (#9960)
- Open AI settings from command palette when
ai.enabledis false (#9937) - Count lines like ast/tokenize, not
str.splitlines()(#9957) - Keep interactively-created hidden cells editable on creation (#9958)
- Delete local variables after cell execution (#9933)
- Correct fully-qualified table name in column previews (#9954)
📚 Documentation
- Fix shebangs
/bin/bash->/usr/bin/env bash(#9942)
📝 Other changes
- Bump pydantic-ai, and cap to v2 (#9978)
- sidebar code-mode: add run_scratchpad utility functions (#9637,
068f140) - Tooling to generate canonical
DESIGN.md(#9641,7f29fa3) - Support nested schemas for data sources (#9837, #9845,
06b152a)
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @dmadisetti, @kirangadhave, @Light2Dark, @lzblack, @peter-gy, @skaphi, @VishakBaddur
And especially to our new contributors:
Full Changelog: 0.23.10...0.23.11
0.23.10
What's Changed
This release brings threading and multiprocessing to WASM notebooks and makes remote storage browsing scale with search and pagination — alongside table column controls, slide editing improvements, and a broad set of fixes.
⭐️ Highlights
Pyodide 314.0
This release moves marimo's WebAssembly runtime to Pyodide's latest release: Pyodide 314.0. This allows use to use newer versions of duckdb, polars, and pyarrow as well as many other popular packages.
Threading and multiprocessing in WASM
WASM notebooks can now run threading- and multiprocessing-shaped code. marimo installs lightweight adapters for Pyodide so mo.Thread, stdlib threading primitives, and common multiprocessing APIs keep working in the browser, executing on a synthetic thread identity that the marimo runtime context follows (#9839).
Screen.Recording.2026-06-09.at.16.56.56.mov
Scalable remote storage browsing
Browsing large remote storage backends is now practical. Listings paginate behind a "Load more" button instead of loading everything up front, and when a prefix query matches none of the already-loaded entries, marimo pages through the backend to surface remote results — matching on full paths so partial path queries resolve, with clear status while it searches (#9834, #9835).
Screen.Recording.2026-06-10.at.11.56.00.AM.mov
✨ Enhancements
- Search the backend when no loaded entries match (#9835)
- Honor
OTEL_SERVICE_NAMEfor traces (#9906) - Progressively mount cell editors in the editor view (#9904)
- Generate Google Drive connection code for embedded environments (#9884)
- Paginate remote storage listings with a "Load more" button (#9834)
- Threading and multiprocessing adapters in WASM (#9839)
- Gate schema discovery behind "auto" for remote engines (#9784)
- Column visibility dropdown in table top bar (#9865)
- Support ROCM for
/api/usageendpoint (#9773) - Shared select-core for multiselect, dropdown, and filter picker (#9849)
- Per-slide show-code config + editor toggles (#9831)
- Resolve definitions and get docstring (#9838)
- Minimap insert-cell + context menu (#9830)
- Add a toggle to filter empty schemas and db (#9712)
- Wire Dremio dialect into the SQL editor (#9817)
- Allow lazy (callable) filename (#9799)
- Styled tooltip for
mo.ui.tablehover_template (#9780) - Remove beta status for opencode (#9791)
🐛 Bug fixes
- Deflake CI by ignoring finished WASM thread records (#9914)
- Rewrite double-quoted DuckDB sources in WASM (#9925)
- Avoid crash when creating a markdown cell (#9923)
- Stop logging raw AI config at debug level (#9911)
- Handle missing psutil gracefully for Android/Termux (#9872)
- Make WASM
as_completedtimeout deterministic (#9891) - Keep
!-command cells from disabling underscore-privatization on convert (#9873) - Respect user-configured marimo data transformer (#9887)
- Skip chart for nested/unknown column types (#9876)
- Correct editable input behavior with steps and fractional values (#9860)
- Allow async cancellation (#9705)
- Apply ordering to frozen set as it drifts with PYTHONHASHSEED (#9861)
- Highlight python code blocks in ty hover tooltips (#9824)
- Disable speaker notes handle on fullscreen (#9825)
- Disambiguate storage entries with duplicate paths (#9832)
- Add docstring styles for links (#9827)
- Infer provider profile from base_url for custom providers (#9813)
- Store video sources as virtual files instead of inlining (#9812)
- Show static-preview notice once per session (#9796)
- Stop reusable hint flicker on cell updates (#9782)
- Land focus in target cell on right-click Go to Definition (#9795)
- Fix reactive go-to-definition lookup (#9747)
- Coalesce outgoing document transactions to avoid intra-batch conflicts (#9781)
📚 Documentation
- Admonition (#9903)
- Support PEP 508 Emscripten dependency markers (#9864)
- Update SECURITY.md (#9863)
- Add entry on
jupyter-book-marimoplugin (#9802)
📝 Other changes
- Render marimo HTML styled in
mo.ui.chat(#9847, #9888,29352cf) - Preload panel chunks on hover/focus (#9650,
b3c9225) - Update to Pyodide v314.0.0 (#9844)
Contributors
Thanks to all our community and contributors who made this release possible: @agriyakhetarpal, @akshayka, @dmadisetti, @kirangadhave, @koaning, @Light2Dark, @mscolnick, @nkgotcode, @peter-gy, @Set27, @VishakBaddur
And especially to our new contributors:
- @agriyakhetarpal made their first contribution in #9844
- @nkgotcode made their first contribution in #9747
- @Set27 made their first contribution in #9773
Full Changelog: 0.23.9...0.23.10
0.23.9
What's Changed
This release makes opening a notebook in a second tab non-destructive, mo.ui.table adds new args for hidden_columns/visible_columns (mutually exclusive), and tightens sharing and error-output behavior across the board.
⭐️ Highlights
Open the same notebook in a second tab
Opening a notebook in a second browser tab no longer forcibly disconnects the first. The new tab joins as a live, read-only viewer, and you can take over editing from either side with a single click — no destructive modal and no reload required (#9746).
Screen.Recording.2026-06-01.at.3.31.17.PM.mov
Show and hide table columns
mo.ui.table now supports column visibility. Hide and show columns from the column header menu, Column Explorer with a click, find columns fast with smart prefix-based search, and control initial visibility from Python. A hidden-count and "Unhide all" link keep things discoverable (#9687, #9696).
Screen.Recording.2026-05-26.at.6.35.04.PM.mov
Cells with no output now show in slides
Because slides allow code edits, a slide edited to no longer produce an output used to disappear from the deck entirely. Such cells now appear in the slides minimap and viewer so you can edit them back in (they're still skipped during a presentation). Minimap thumbnails are also larger and more readable (#9771).
Screen.Recording.2026-06-03.at.2.25.46.PM.mov
✨ Enhancements
- Add MARIMO_RESTRICT_SHARING env var machine-wide (#9756)
- Non-destructive local takeover (read-only viewer + bidirectional takeover) (#9746)
- Add cells with no output to the minimap & viewer (#9771)
- Add GET /api/kernel/status endpoint (#9768)
- Enforce sharing config as server-side security (#9578)
- Add filter param for regex and callable filtering (#9667)
- Slides config panel open by default (#9737)
- Add pair with agent link (#9738)
- Add Opus 4.8 and script to append models to the top (#9723)
- Remove mapping for 'src' to 'auto-mix-prep' (#9725)
- Add workflow to automate running llm-sync-models script (#9724)
- Automation script to pull models.yml (#9635)
- Support Dremio ADBC data source browsing (#9694)
- Add auto_close_pairs setting (#9711)
- WASM compatibility rule checks (#9587)
- Fix dropped error hints and improve error output UI (#9673)
- Column Explorer visibility controls + smart-search (#9696)
- Sort toml entries when writing config (#9686)
- Pretty format hidden variable behavior in stack traces (#9660)
- Add column visibility kwargs and UI controls (#9687)
- Unified filter pill UI with overflow strip (#9638)
- Add padding between cell number and minimap dependency lines (#9675)
🐛 Bug fixes
- Escape user-controlled file_key in service worker injection (#9789)
- Fix completions in slides view (#9769)
- Arg/kwarg collision for local numpy vars in caching (#9751)
- Suppress marimo hover tooltip for all LSP providers, not just pylsp (#9741)
- Fix SQL defs lookup (#9754)
- Keep stepped range progress totals aligned (#9582)
- Per-provider max_tokens defaults with optional override (#9703)
- Accept ChartDataType in mo.ui.table to resolve pyright error when passing chart.value (#9674)
- Jump to running notebook cells only (#9707)
- Fix mo.cache raising KeyError: 'scratch' in scratchpad (#9664)
- Fix interruption for pydantic-ai chatbot (#9620)
- Preserve top level names for name thrashing (#9695)
- Lazy download-size RPC + first-page extrapolation (#9691)
📚 Documentation
📝 Other changes
- Don't shadow builtin print unless mo.Thread is used (#9765, #9766)
- Zz/zt/zb scroll for notebook viewport (#9701, #9728)
- Add rule to prevent test files from having the same name (#9671)
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @corleyma, @dmadisetti, @everettroeth, @foxcroftjn, @GHX5T-SOL, @kirangadhave, @kjgoodrick, @kratos0718, @Light2Dark, @mscolnick, @nojaf, @Rowlando13, @VishakBaddur, @XanthanGum
And especially to our new contributors:
- @everettroeth made their first contribution in #9664
- @foxcroftjn made their first contribution in #9686
- @GHX5T-SOL made their first contribution in #9582
- @kratos0718 made their first contribution in #9667
- @XanthanGum made their first contribution in #9725
Full Changelog: 0.23.8...0.23.9
0.23.7
What's Changed
This release brings major upgrades to table filtering, adds speaker notes to slide view, and lets WASM notebooks query remote files with DuckDB.
⭐ Highlights
Powerful new table column filters
Table columns now support the full operator set across every dtype. Text columns get contains, starts_with, ends_with, equals, regex, is_empty, and more, with a slash-bracketed regex input and a creatable values picker for in / not_in. Number columns get native between, and the new date/datetime/time filter UI brings the same operator coverage to date-like columns with smart clipboard paste for ISO/US/RFC dates and A - B ranges (#9597, #9615).
Screen.Recording.2026-05-18.at.7.54.06.PM.mov
Speaker notes for slides
Press S in slide view to open speaker notes alongside the current slide, including in fullscreen and kiosk mode (#9533).
Screen.Recording.2026-05-12.at.5.32.23.PM.mov
Query remote files with DuckDB in WASM notebooks
WASM notebooks can now read CSV, Parquet, JSON, and GeoJSON over HTTP from mo.sql, SQL cells, raw duckdb.sql/query/execute, connection SQL methods, and the duckdb.read_csv/read_parquet/read_json Python API. marimo rewrites the AST with sqlglot, fetches the remote file via its shared WASM fetch util, and binds the result as a pandas DataFrame that DuckDB can scan (#9480).
SELECT * FROM read_csv('https://example.com/cars.csv')✨ Enhancements
- Expand column filter operators and pill-editor UX (#9597)
- Date/datetime/time filter UI (#9615)
- Add speaker notes for slides (#9533)
- Support HTTP DuckDB queries in WASM notebooks (#9480)
- Snapshot document and outputs in MCP execute_code (#9654)
- Rename ctx.notify to broadcast_raw_notification (#9581)
- Record staleness reads on .code access only (#9655)
- Expose cell outputs to code_mode (#9653)
- Make
marimo newCLI help page render properly at 80 columns (#9636) - Read-before-write protection for cell edits (#9585)
- Skip stdlib/site-packages on per-cell check (#9629)
- Show cell index in dependency minimap (#9633)
- Extract ModuleReloader/ModuleWatcher into AutoreloadManager (#9590)
- DRY up code between wasm and native kernel (#9591)
- Update default duckdb mo.sql deps (#9599)
- Show .git and .venv in file browser (#9606)
- Support disabled on dropdown and multiselect (#9600)
- Split kernel command dispatch into router + callback bundles (#9577)
- Add Prompt tab to pair-with-agent modal (#9568)
- Replace MarimoFileKey alias with FileKey ADT (#9483)
- Optimize memoize_last_value for faster UI reactivity (#9555)
- Hardening pass — utilities, deprecated API cleanup, lifespan fix (#9552)
- Stream uploads to disk instead of buffering (#9527)
- Add
kernel_session()as context manager, DRY up tests (#9554) - Sandboxed exports for consistent wasm envs (#9519)
- Add tool approval flow for chat-panel (#9507)
- Remove input for hidden cells from exports (#9548)
- Parallelize file uploads with bounded concurrency (#9528)
- Use multipart/form-data for /api/files/create (#9521)
- Show loading and success toasts for exports (#9509)
- Add cut cells command (#8019)
- Allow def declarations within functions (#9379)
- Correlate scratchpad completion with run_id (#9350)
- Make disconnect indicator clickable to reconnect (#9410)
🐛 Bug fixes
- Guard SQL ref extraction on sqlglot availability (#9656)
- Fix lru_cache(...) resetting when cell is rerun (#9609)
- Skip reload when notebook has git conflict markers (#9626)
- Stream
lazy-polarsoutput viapl(lazy=True)(#9648) - Trigger downloads programmatically to work inside cross-origin iframes (#9649)
- Stdin handling for empty submissions (#9556)
- Avoid pyarrow requirement for polars output in DuckDB engine (#9643)
- Isolate test_project_dependencies from pyproject.toml pollution (#9634)
- Restore selection_mode='all' and accept list form (#9630)
- Allow freezing pandas index columns (#9631)
- Inline
public/images in static HTML export (#9627) - Remove unused flush_messages plumbing (#9598)
- Migrate remaining background-task sites to asyncio_utils (#9596)
- Normalize dev version in static notebook asset URL (#9592)
- JSON-escape > and < in web-component attrs (#9595)
- Render Enum members as str in JSON serializer (#9594)
- Narrow callback deps, drop get_context in cache (#9589)
- Callback bug fixes in cache clear, dataset connections, and model updates (#9588)
- Avoid treating class-like array refs as data primitives (#9569)
- Group kernel streams into KernelStreams; phase-key NotebookCellHooks (#9571)
- Pass theme to register_formatters in pyodide and script runner (#9553)
- Use Referrer-Policy same-origin to fix Chrome 147+ Error code 5 on macOS (#9543)
- Extract shared kernel lifecycle for subprocess and pyodide (#9541)
- Hide watermark when printing (#9525)
- Markdown singleton to mitigate reported race condition (#9530)
- Contain comm callback errors in mpl_interactive (#9532)
- Disconnect toolbar callbacks on cell rerun (#9531)
- Fix overflow and support vertical tabs (#9511)
- Allow hosts to size-gate downloads (#9510)
- Detect marimo notebooks with long module docstrings (#9652)
- Fix argument splitting on '--' in the command line (#9368)
📚 Documentation
- Update markdown_indentation.md (#9622)
- Standardize supported dataframe backends across UI elements (#9583)
- Attribution (#9608)
- Polish tutorial notebooks (#9573)
- Add detailed docstring for CLI recover command (#9546)
- Note that an added notebook will be downloaded if it's a URL path (#9545)
- Clarify that marimo run hides source code by default (#9529)
- Add Mermaid theme customization options (#9478)
- Remove formatter recommendation section from guide (#9434)...
0.23.6
What's Changed
🚨 Breaking changes
- Propagate notebook filename through MarimoIslandGenerator.from_file (#9409). This is a correctness fix, but could break existing users who relied on broken assumptions.
✨ Enhancements
- Implement kernel exit classification and notification system (#9500)
- Render notebook snapshot while Pyodide initializes (#9502)
- hide add cell toolbar when show-chrome is false (#9487)
- Add gpt-5.5 support (#9488)
- Extract NotebookWorkspace from AppFileRouter (#9448)
- Add new W&B models to llm-info data (#9465)
- Add --execute to
marimo export html-wasmfor session previews (#9437)
🐛 Bug fixes
- Send initial size when WebSocket opens (#9505)
- Restore --proxy for base_url (#9503)
- Avoid exponential blow-up of nested struct sample values (#9506)
- Normalize Windows backslashes in inserted image URLs (#9504)
- Skip wasm controller dynamic import unless host opts in (#9467)
- fix label alignment (#9486)
- standardize (y/n) prompt defaults (#9492)
- Skip /health checks for static notebooks (#9498)
- Avoid RecursionError when formatting objects with getattr traps (#9497)
- Prevent mpl figure DPI from compounding on cell rerun (#9474)
- use unified thinking for pydantic-ai (#9477)
- Remount
on src change in mo.Html to avoid stale paint (#9472)
- Fix UI hang and stabilize tests for unusual tuple/list/dict child classes (#9468)
- Include cell_manager in TransactionSource literal (#9457)
- Improve parameter validation error messages for list[NewType] fields (#9442)
📚 Documentation
- OpenCode Go config (#9431)
- Add slides documentation and video (#9464)
- Additional security acknowledgements (#9450)
📝 Other changes
- Support HTTP Range requests on virtual files (#9460) (#9473) (26ee423)
- Update all storybook dependencies to ^10.3.5 (#9392)
Contributors
Thanks to all our community and contributors who made this release possible: @app/renovate, @dmadisetti, @domwst, @fonnesbeck, @kirangadhave, @Light2Dark, @ljchang, @mchav, @mscolnick, @ralphptorres, @stephenlf, @wally-an
New Contributors
- @wally-an made their first contribution in #9442
- @ljchang made their first contribution in #9409
- @fonnesbeck made their first contribution in #9431
- @domwst made their first contribution in #9488
- @ralphptorres made their first contribution in #9492
Full Changelog: 0.23.5...0.23.6
0.23.5
What's Changed
This release adds editable code in slide view, OpenTelemetry distributed tracing support, and patches polars network I/O in WASM notebooks.
⭐ Highlights
Editable code in slide view
Press C (or click the code icon) in slide view to toggle an inline code editor under each slide, including in fullscreen mode. Run mode shows a read-only editor when include-code is enabled.
✨ Enhancements
- Add OTLP export and W3C trace context propagation to tracing (#9414)
- Add editable code in slide view (#9389)
- Patch polars I/O in wasm (#9413)
- Add a CLI tip for marimo pair (#9422)
- Prompt user to build fe at first run (#9381)
🐛 Bug fixes
📚 Documentation
- Update marimo-pair docs to mention molab (#9436)
📝 Other changes
- Add load_notebook helper, simplify AppFileRouter (#9438)
- Add data-testids to file-explorer dropdown menu items (#9427)
- Deflake subprocess kill test (#9423)
- CI: doppler secrets (#9236)
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @dmadisetti, @koaning, @Light2Dark, @mscolnick, @ouatu-ro, @tigretigre
Full Changelog: 0.23.4...0.23.5
0.23.4
What's Changed
✨ Enhancements
- Update snapshots and types for altair v6.1.0 / vega-lite v6.4.1 (#9415)
- make
_format_planrespect format_on_save; format enabled/disabled unit tests (#9380) - standardize top k filter components and logic (#9393)
- Editable filter pills (#9349)
🐛 Bug fixes
- allow cell selection on non-interactive marimo elements (#9399)
- adjust ordering of header (#9403)
- Msgspec encoding for starlette user (#9406)
- Check platform instead of sys.modules for pyodide check (#9404)
- Docs typo (#9400)
- Scope filter-by-values top-K to exclude the filter being edited (#9376)
- Hide marimo-pair in wasm, fix opencode prompt (#9375)
- Mark DuckDb INET type (from inet extension) as unknown type (#9384)
- Add Path to cookie (#9364)
📚 Documentation
- Documentation Bugfix: Polars cannot read json from URL (#9397)
📝 Other changes
- Update dependency postcss to ^8.5.10 (#9334)
- Update dependency postcss to v8.5.10 [security] (#9372)
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @app/renovate, @daniel-bogdoll, @dmadisetti, @iggylari, @jpopesculian, @kirangadhave, @Light2Dark, @mscolnick, @ouatu-ro
New Contributors
- @iggylari made their first contribution in #9384
- @daniel-bogdoll made their first contribution in #9397
- @ouatu-ro made their first contribution in #9380
Full Changelog: 0.23.3...0.23.4
0.23.3
What's Changed
✨ Enhancements
- Add slide config form in sidebar, and reveal slide types (#9300)
- Restore LICENSE in sdist via PEP 639 license-files (#9341)
- Status indicator for PDF exports via CLI (#9322)
- workspace management: add hooks, and shared components (#9272)
🐛 Bug fixes
- Guard
_resolve_proxyagainst bare-port inputs (#9366) - Guard
_references_virtual_fileagainst cyclic data (#9369) - Decode tuple/frozenset payloads with non-finite floats (#9365)
- Return html encoded matplotlib Figure from msgspec encoder hook (#9359)
- Harden trust-bearing window globals and gate script loading (#9330)
- fix markdown .center, .right, .left not respecting new lines (#9326)
- File navigator (#9307)
- Add
_MARIMO_DISABLE_AUTH_ON_VIRTUAL_FILESenv flag (#9343) - Correct AWS Bedrock Claude model IDs (#9299)
- Kill kernel's process group on shutdown (#9257)
- Add DataFusionFormatter (#9338)
- Preserve shared-memory virtual files owned by other live sessions (#9228)
- Update CsvViewer layout to use flex column. (#9336)
- Emit relative Location on login redirect (#9314)
- bump pymdown-extensions to fix NoneType bug (#9319)
- Trust exported notebook pages (#9318)
- Preserve non-string dict keys in rich display (#9301)
- Update dataflow.md.txt snapshot (#9315)
- Fix type-check
Channel.Pullwith NewType and union msg_type (#9296)
📚 Documentation
📝 Other changes
- Flush console output buffer before marking cell idle (#9164) (f0187ea)
- Resolve relative path sources in
--sandboxuv export (#9052) (ccc1841) - use union for narwhals files (#9156) (58543f6)
- Update dependency @playwright/test to ^1.59.1 (#9295)
- Replace pickle with msgspec for IPC serialization (#8713) (df4e40c)
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @app/renovate, @bfriebel, @dmadisetti, @Light2Dark, @manzt, @mchav, @mscolnick, @NewDestinyDan, @peter-gy, @shaun0927
New Contributors
- @NewDestinyDan made their first contribution in #9173
- @bfriebel made their first contribution in #9359
Full Changelog: 0.23.2...0.23.3
0.23.2
What's Changed
🚨 Breaking changes
- Mo.ui.refresh typing and docs (#9229)
✨ Enhancements
- Code-mode .screenshot() api (#9232)
- Visible markers for leading/trailing whitespace in string cells (#9256)
- swap reveal.js instead of swiper for slides (#9166)
- change wasm link to molab link on run page (#9240)
- Bail out of type inference when completion budget expires (#9247)
- Introduce better_inspect module for enhanced dir() and help() functionality for marimo-pair (#9223)
- add molab resource to edit homepage (#9241)
- Add
ctx.packagesnamespace to code mode (#9233) - Backend-based file and directory duplication (#9142)
- Support columns in marimo-pair (#9212)
- Expand
uv_buildsupported versions in build-system (#9231) - Visually distinguish null, empty, whitespace, NaN, and Infinity in table cells (#9218)
- Restore Altair SVG output as base64-encoded Data URLs (#9104)
- Auto-save in code-mode and marimo-pair (#9191)
- add molab share action (#9207)
- LSP root and document URI integration from backend (#9143)
- Decouple Matplotlib render resolution (DPI) from display size (#9144)
🐛 Bug fixes
- Hold references to asyncio tasks (#9261)
- Use urlparse instead of regex for proxy determination (#9254)
- Preserve columns in DefaultTableManager exports (#9258)
- Drop dangling @file URLs from the session cache (#9278)
- Make
FieldTypesaMapto preserve column order (#9279) - Avoid double-mangling names inside walrus comprehension (#9276)
- Static path handling (#9281)
- Restore plain text tracebacks and fix exit codes for code mode (#9224)
- Suppress
marimo-ui-value-updateecho for user-initiated changes (#9262) - "Download as .py" in WASM run-mode exports (#9268)
- Tailwind v4 opacity fix, selection toggle, hover colors, and cleanup (#9259)
- Export menu works for plain-Python data without
pandas/polars/pyarrow(#9246) - Drop stale autosaves after newer foreground writes (#9239)
- Preserve column order in DefaultTableManager select/drop (#9235)
- Use the proactor event loop policy on Windows in edit-mode runtimes (#9194)
- Allow for data-uris in mpl-interactive and marimo-panel after a cell has run (#9196)
- Opencode marimo-pair skill discovery (#9225)
- fix variants for toast (#9230)
- Only toast cell logs in app mode (#9190)
- fix label not being passed through for mo.ui.tabs (#9187)
- Support
mo.ui.matplotlibselections from code mode (#9195) - fix cte refs for errored paths, and dml (#9188)
- Add warning log when repr_mimebundle fails (#9199)
- Use shared memory for virtual files when running with app isolation (#9181)
- Virtualize dataframe page selector to fix "No matching page" bug (#9178)
- Arrow keys lose selection in vim visual mode (#9172)
- Strip access token via redirect (#9170)
- Pair direction (#9161)
- Require auth in LSP middleware (#9160)
- With_dynamic_directory path traversal (#9162)
- Image dimensions for Altair PNG outputs (#9149)
📚 Documentation
- Update Traditional Chinese README to highlight marimo pair (#9183)
- Maintainer approval in contributing (#9153)
- Link to marimo pair in the README (#9145)
📝 Other changes
- Clear error state on disabled-transitively cells when ancestor recovers (#8784) (ba12764)
- Update dependency dompurify to v3.4.0 [security] (#9216)
- Update dependency lodash-es to v4.18.1 [security] (#9217)
- Add lazy cache blob types (arrow, npy) (#9035) (6baa22d)
- Widen
Html.batch()type to accept all UIElement subclasses (#9163) (#9176) (73ff622) - Handle list-type tooltip encoding in altair chart (#9167) (#9175) (386cba6)
- Add reactive funnel and funnelarea selection support (#9044) (b95d26d)
- Add reactive box plot selection support (#9010) (b73a370)
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @app/renovate, @daizutabi, @dmadisetti, @kirangadhave, @Light2Dark, @manzt, @moble, @mscolnick, @nojaf, @shaun0927, @thliang01
New Contributors
- @shaun0927 made their first contribution in #9239
Full Changelog: 0.23.1...0.23.2


