Releases: marimo-team/marimo
0.17.5
We made a few more changes to our markdown parsing.
You may have a bit more code-drift at first, but this change aims to prevent common merge-conflicts, ruff formatting conflict, and edge-cases with various markdown syntax.
What's Changed
- deps: downgrade vega to fix tooltips by @mscolnick in #7008
- fix: re-rendering of latex by @mscolnick in #7010
- fix: logic for determining reasoning model by @mscolnick in #7009
- fix: simplify markdown by @dmadisetti in #7005
- docs: dev-documentation for adding new backend/mcp tools by @bjoaquinc in #7011
- fix: ensure correct markdown serialization by @dmadisetti in #7016
Full Changelog: 0.17.4...0.17.5
0.17.4
Important bug fixes for markdown cells.
What's Changed
- feat: add errors_summary prompt for easy injection of all notebook errors by @bjoaquinc in #6995
- fix: don't sanitize icons in markdown by @mscolnick in #7001
- fix: markdown single lines by @mscolnick in #7002
Full Changelog: 0.17.3...0.17.4
0.17.3
What's Changed
This release adds support for OpenAI's Codex agent in the AI chat sidebar, improves Altair chart interactivity, and includes important bug fixes and performance improvements.
Codex Agent Support
Use OpenAI's Codex agent in the AI chat sidebar by selecting "Codex" from the agent dropdown. The agent can help with code editing, debugging, and notebook modifications.
Altair and Vega-Lite Enhancements
Marimo now uses Vega-Lite 6. Charts support legend-based selection in composite charts (layered, vconcat, hconcat), binned data selection, and images in tooltips. Table charts are now faster and handle string columns with up to 20k rows.
✨ Enhancements
- Better console and cell error parsing/prompts in Agent mode (#6961)
- Improve performant table charts, remove feat flag (#6892)
- Altair legend selection for composite charts (#6971)
- Re-initialize LSP on reconnect (#6967)
- Document AppMetaand make it public (#6939)
- Handle nested sql statements for sql smart cells (#6947)
- Better error handling in type-mismatch for mo.ui.altair_chart(#6986)
- Support binning point selection in altair (#6983)
- Support images in vega/altair tooltips (#6934)
- Add back floating outline (#6933)
- Add support for Codex agent (#6901)
- Speed up function natural_sortby 120% (#6975)
- Generate different sql code based on dialect (#6915)
🐛 Bug fixes
- Fallback for chart.to_dict()and don't mutate charts (#6972)
- Chart sizing with nested hconcat in vconcat (#6970)
- Escape special characters in frontend altair chart builder (#6973)
- Cache completion item to avoid jitter (#6946)
- Update anchor link handling to retain query params (#6930)
- Fix polars test (#6952)
- Quote table and col names from postgres and duckdb too (#6942)
- Fix tests by casting enum to string for polars (#6936)
📚 Documentation
- Enforce markdown formatting on save (#6969)
- Fix file.md example (#6966)
- Aws bedrock regions (#6964)
- Include new backend and frontend tools, chat panel agent mode, and mcp server video (#6954)
- Correct prompts.md typo (#6945)
📝 Other changes
- Upgrade vega-embed in lockfile as well (#6984)
- Set all vega renderer to canvas except col header charts (#6985)
- Upgrade to vega lite 6, react-vega 8 (#5641) (0adb3b2)
- DRY GetActiveNotebooks tool and ActiveNotebooks prompt and improve outputs (#6976)
- Enable passing in token password from file (#6974)
- Set initial mode for islands (#6950)
- Add tests for nested markdown in smart cells (#6949)
- More edge cases for duckdb pivot (#6944)
- Update all storybook dependencies to ^9.1.14 (#6943)
- Update all storybook dependencies to ^9.1.13 (#6935)
- Find cell id through shadow doms (#6929)
- Add new backend tools to basestruct test (#6925)
Contributors
Thanks to all our community and contributors who made this release possible: @bjoaquinc, @dmadisetti, @koaning, @kyrre, @Light2Dark, @macota, @misrasaurabh1, @mscolnick, @SamarJyoti496
And especially to our new contributors:
- @macota made their first contribution in #6945
- @misrasaurabh1 made their first contribution in #6975
- @SamarJyoti496 made their first contribution in #6930
Full Changelog: 0.17.2...0.17.3
0.17.2
Important bug fix for plotly charts
What's Changed
- fix: plotly rendering by @mscolnick in #6927
Full Changelog: 0.17.1...0.17.2
0.17.1
What's Changed
Important: Embedded JavaScript in markdown will now be stripped - this is a feature, not a bug! Users who need to render custom HTML/JS should use mo.Html() or mo.iframe() instead of mo.md().
Break: markdown output (mo.md) is always sanitized by default. This is so application builders don't need to worry about sanitizing their own input when interpolating in markdown and inputs, e.g. mo.md(f"Hello {user_input.value}")
own.
Break: All outputs are sanitized before any cell is run. This is to prevent accidental running of JavaScript when opening a notebook.
Experimental Agent Mode - New experimental agent mode in the AI chat sidebar with tools to edit cells, run cells, and read their outputs.
✨ Enhancements
- Add google-genai dependency to recommended, tweak marimo envoptional deps (#6826)
- Add GetCellOutputs tool and get_llm_context for all UIElement classes (#6889)
- Handle SSL configuration for other openai compat config. (#6907)
- Implement ReconnectingWebSocketTransport for improved WebSocket handling (#6909)
- Better tracebacks, padding, remove button for static files (#6912)
- Print matplotlib Figures/Axes in rich table output (#6904)
- add duplicate selection shortcut to hotkeys as part of editing command (#6843)
- Avoid full width for column faceted charts (#6887)
- add sample query, better tool descriptions to improve agentic mode (#6880)
- add data config in the UI (#6878)
- Fallback to available storage when localStorage is not available (#6879)
- add run stale cells tool, refactor out notebook actions (#6842)
- Auto_instantiate=false by default (#6849)
- Package installation autorun (#6856)
- Add LintNotebook tool to backend and mcp server (#6853)
- increase timeout to 120s for reasoning models (#6839)
- allow run-all for completions bar (#6840)
- Show better diff for ACP (#6828)
- Hack needed to support the NVIDIA DGX Spark (#6822)
- Set cursor-pointer for button (#6775)
- Portals in vscode (#6803)
🐛 Bug fixes
- Add setup cell that has been deleted (#6916)
- fix wrapping on long text in tables (#6917)
- support column edits based on index, instead of id (#6891)
- Disable lsp by default (#6908)
- Dont mutate pandas when fixing column types (#6906)
- Copy code block inside accordion (#6905)
- Respect sandbox confirmation (#6885)
- Merge streamed agent message chunks to prevent fragmentation (#6835)
- Fix typo introduced during refactoring (#6876)
- fix column names that are not stringed in tables (#6873)
- add catches for get_schemas (#6874)
- Sanitize markdown text (#6848)
- fix delay mount css (#6864)
- Failing cache test on python 3.10 (#6863)
- Better cli error when missing mcp dep (#6859)
- Cell style not applied correctly (#6824)
- Mark commentLinesas readonly in SQLMetadata (#6846)
- Allow cache blocks to be invoked in script mode (#6819)
- Hide invalid options on setup cell context menu (#6821)
- use spinning indicator and check instead for autofix (#6830)
- Update markdown output to include 'contents' class (#6804)
- Table charts should update when underlying data updates (#6809)
📚 Documentation
- Security documentation updates (#6881)
- Fallbacks and warnings for missing features from sandboxed iframes + docs (#6883)
- More prescriptive remote connection docs (#6871)
- Update command to launch ACP in windows (#6862)
- Fix link to uv guide (#6816)
- Make getting started installation uvsection less confusing (… (#6813)
- Dataframe docs (#6812)
- Improve copilot docs (#6811)
- Update gh actions uv setup to v7 (#6799)
🔬 Preview features
- edit notebook tool (#6786)
📝 Other changes
- Update dependency tailwindcss to ^4.1.15 (#6902)
- Update dependency vite to ^7.1.19 (#6900)
- Update dependency vite to ^7.1.18 (#6897)
- Update build tools (#6890)
- Upgrade form-data to secure version (#6888)
- Bump postcss from 7.0.39 to 8.5.6 (#6884)
- Merge commit from fork (b2f7e9b)
- Update testing dependencies (#6855)
- [pre-commit.ci] pre-commit autoupdate (#6850)
- Merge commit from fork (a107e81)
- Ci breakage in python 3.13.8 (#6831)
- Support git dependencies in sandboxed script metadata (#5545) (#6827) (74b3602)
- Update use-acp to version 0.2.4 and better ACP loading state UI (#6815)
- Migrate out smart cell logic to its own package (#6808)
- Duckdb interrupt (#6806)
- Filter sql defs from generated return (#6805)
- Allow ASYNC240 (#6703) (4ea8cf3)
- Add tool guidelines to all backend/mcp tools (#6801)
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @arjunguha, @bjoaquinc, @dmadisetti, @koaning, @Light2Dark, @manzt, @minsun-ss, @mscolnick, @olad5, @prosoitos, @sebkur, @sshtomar
And especially to our new contributors:
Full Changelog: 0.17.0...TODO_CURRENT_VERSION
0.17.0
This release delivers improvements to the AI user experience and adds support for Python 3.14.
AI autofix for cells
When AI generates code suggestions for fixing Python and SQL cells, you can now accept and run the suggested code with a single click of "Fix with AI":
Model Context Protocol (MCP) enhancements
marimo now exposes its AI tools through an MCP server endpoint, allowing external AI applications like Claude Code, Cursor, and VS Code to interact with your notebooks.
marimo edit notebook.py --mcp --no-tokenSee the MCP documentation to learn more. Special thanks our Resident MCP/AI Engineer @bjoaquinc for driving the implementation and improvements!
Python 3.14 support
marimo now officially supports Python 3.14, released this month. Official support for Python 3.9 has been dropped as it approaches end-of-life in October 2025, though it remains functional for the time being.
✨ Enhancements
- Switch to msgspec_mfork (#6774)
- Create ToolGuidelines for better Agent orientation of when and how to use marimo tools (#6793)
- Migrate mo.ui.dataframeto narwhals; support duckdb, ibis, pandas, polars (#6772)
- Support copying raw value for console output (#6751)
- Add prompts and ActiveNotebooks prompt to marimo mcp server (#6760)
- Python 3.14 support (#6712)
- Add structured errors to frontend tools (#6748)
- Intentional sidebar ordering (#6742)
- Add bedrock inference profiles (#6738)
- DRY common package managers install logic (#6685)
- Add detailed output metadata to frontend tools (#6720)
- floating label for AI generations in a cell (#6690)
- Support Iceberg introspection through duckdb (#6707)
- Add multi-tool support for all providers (#6672)
- Reset input on submit in ai.chat(#6668)
- AI autofix mode for sql cells (#6639)
- Expand cache api to match functools api (#6660)
- Rig up cache api (#6662)
- Add multi-column sorting with stack-based behavior (#6257) (9b58a93)
🐛 Bug fixes
- Watch for file move with watchdog and Claude Code (#6798)
- Tutorial explanation of how to configure lazy execution (#6758)
- Preserve cursor position when updating cell code in watch mode or auto-formatting (#6792)
- Fix empty submits and output area (#6794)
- Jupytext convert with markdown with quotes (#6789)
- Use thead instead of div inside table (#6785)
- Use event loop factory for uvicorn >= 0.36.0 (#6779)
- Pytest-changed (#6761)
- Send function-request when static to show Static Notebook warning (#6765)
- Fix with ai button for all cells (#6755)
- Support initial selection in Plotly plots (#6747)
- Fix dependency panel edges (#6753)
- Format OpenAPI generated files after codegen in build script (#6739)
- Safer windows logging on PermissionErrors (#6735)
- Update regex in Plotly template parser to handle special characters (#6728)
- Ignore prune cache on windows (#6733)
- Use UTF-8 encoding for subprocess calls in package managers (#6729)
- Manually move copilot file extension from js to cjs (#6727)
- Datetime UI element rendering in Docker containers (#6730)
- Respect holoviews hv.output() settings when rendering in marimo (#6732)
- Allow for cache hits from external modules (#6731)
- Allow uv_build < 0.10.0 (#6714)
- Handle OSErrors when seraching for pyproject.toml (#6726)
- Typos ci (#6725)
- New query to get duckdb databases for ducklakes (#6708)
- Run / edit mode for docker (#6724)
- More aggressive file reconciliation in --watch(#6701)
- Ensure custom content in header (#6709)
- Ensure consistent checking with unparsable cells (#6702)
- Enable stub mechanism for caching un-pickable objects (#6657)
- Handle big ints better (#6768)
- Patch msgspecPython 3.14 compatibility (#6749)
📚 Documentation
- Add documentation for mcp server, client, tools, and chat panel modes (#6744)
- Remove duplicate phrase in SQL documentation (#6740)
- Add async cache support (#6736)
- Change READMEs to be more consistent for different languages (#6696)
- Add marimo editable install in pixi env, simplify docs in CONTRIBUTING.md (#6679)
- MCP server ui, auth, and rules (#6659)
- uv-suitable update instructions when using uv (#6681)
- Move sql linter to config instead of feat flag (#6665)
- Verifying fe lints and pre-commmit hooks (#6642)
- Update docs; resolve #6623 (#6693) (42f6183)
📝 Other changes
- Add mo.ui.plotlytests (#6757)
- Disable snippets for LSP completions (#5949) (07b6cbc)
- Lint breaks (#6658)
Contributors
Thanks to all our community and contributors who made this release possible: @akshayka, @bjoaquinc, @dmadisetti, @eamonburns, @jschfflr, @Light2Dark, @lucharo, @manzt, @mscolnick, @olad5, @Prince213, @rgasper, @schlich, @yairchu
And especially to our new contributors:
- @olad5 made their first contribution in #6642
- @eamonburns made their first contribution in #6696
- @stephenlf made their first contribution in #6693
- @Prince213 made their first contribution in #6714
- @jschfflr made their first contribution in #6736
- @rgasper made their first contribution in #6738
Full Changelog: 0.16.5...0.17.0
0.16.5
What's Changed
- fix (gemini): premature client close error when using gemini models in chat by @bjoaquinc in #6634
- feat: news and notices by @dmadisetti in #6635
- tests: fix broken tests on main by @mscolnick in #5746
- feat: add mcp status and refresh by @mscolnick in #6636
- sql errors, just return error message for better formatting by @Light2Dark in #6633
- update to multi-cell prompt by @Light2Dark in #6640
- fix: wasm with starlette issue by @mscolnick in #6648
- feat: move AI Inline Tooltip out of experimental by @mscolnick in #6646
- fix: setup cell can be focused / enter command mode by @mscolnick in #6645
- check + fix: Protections around user packges being used as site packages by @dmadisetti in #6638
- group chat history by date, add search bar by @Light2Dark in #6654
- fix: find valid maxFractionalDigits by @mscolnick in #6655
- fix: include html in marimo base by @mscolnick in #6653
- improvement: better UX for AI context items by @mscolnick in #6649
Full Changelog: 0.16.4...0.16.5
0.16.4 and 0.16.3
0.16.4
Important Upgrade
This release includes an important fix for Security Release - CWE-441 - Unauthenticated Proxy.
What's Changed
- ci: run changed tests first by @mscolnick in #6595
- fix: remove failing windows test by @dmadisetti in #6597
- chore: move to rolldown by @mscolnick in #6033
- always show generate with ai in column mode when opened by @Light2Dark in #6602
- fix save bug when adding a model by @Light2Dark in #6600
- pass down user-config for /snippets by @mscolnick in #6583
- migrate: zod 4 by @mscolnick in #6599
- Initial hover_template function by @nojaf in #6580
- fix: debounce infinite loop by @mscolnick in #6603
- fix zod schema type errors for data-table by @Light2Dark in #6606
- improvement: narwhals v2 by @mscolnick in #6546
- standardize db icons for sql by @Light2Dark in #6605
- improvement: use lazy-frames for multi-step processing, include more tests by @mscolnick in #6608
- feat: Allow specifying asset_url for ASGI app by @elahmo in #6610
- fix: data-table cellHoverTextSchema validation by @mscolnick in #6613
- altair: set background to transparent for vegafusion if no background is set by @Light2Dark in #6614
- tests: fix formatting test by @mscolnick in #6615
- improvement: cleanup ibis code to share from narwhals table manager by @mscolnick in #6612
- feat: Create frontend tools framework and integrate to backend ai system by @bjoaquinc in #6609
- feat: MCP presets: marimo docs and context7 by @mscolnick in #6619
- Add mapping for 'airflow' to 'apache-airflow' by @koaning in #6622
- add datasource AI context by @Light2Dark in #6618
- chore(deps): update dependency @typescript/native-preview to v7.0.0-dev.20250928.1 by @renovate[bot] in #6616
- enable column explorer for run mode by @Light2Dark in #6626
- slightly lighten dark mode comment in codemirror by @Light2Dark in #6628
- fix: windows globbing for check by @dmadisetti in #6598
- fix: claude 4.0 models by @mscolnick in #6630
- fix: propagate delete in watch mode by @dmadisetti in #6629
- refactor: MPL proxy endpoint by @dmadisetti in #6632
New Contributors
Full Changelog: 0.16.3...0.16.4
0.16.3
What's Changed
- fix: fe lint errors by @dmadisetti in #6515
- tests: add some more validation tests for msgspec serialization by @mscolnick in #6514
- strips explain, better error output for sql error by @Light2Dark in #6518
- fix: catch sqlalchemy types by @dmadisetti in #6519
- fix: preserve comments in jupyter conversion by @dmadisetti in #6516
- improvement: support 2-space markdown and paragraphs without newline before lists by @mscolnick in #6512
- Fix anywidget initial buffer handling regression by @manzt in #6520
- fix: whitespace discrepancies on round trip conversions by @dmadisetti in #6521
- Support sticky headers on table by @nojaf in #6486
- add parse function in /validate endpoint for SQL by @Light2Dark in #6517
- improvement: add completion info to SQL table completions by @mscolnick in #6502
- fix: allow empty keys for openai compatible config by @mscolnick in #6525
- runtime fixes for parse_sql, if duckdb not installed by @Light2Dark in #6527
- add databricks to connection form by @Light2Dark in #6528
- only run sqlglot limit check when user sets a limit by @Light2Dark in #6530
- docs: LLM provider configuration by @mscolnick in #6529
- feat: add openrouter as a supported provider by @mscolnick in #6531
- enhancement(msgspec): create BaseStruct with get_pydantic_core_schema class method and refactor MCP msgspec.Struct types to use it by @bjoaquinc in #6540
- fix: handle by mro types from upstream libs by @mscolnick in #6539
- fix: add more expressions for SQL refs by @mscolnick in #6538
- don't override auto-save by when in --watch mode by @mscolnick in #6535
- improvement: google vertex support, make google key optional by @mscolnick in #6537
- fix: anthropic typing breaks by @mscolnick in #6543
- fix(mcp-server): make mcp-server lifespan and startup non-blocking for marimo server by @bjoaquinc in #6545
- fix: switch to depth-first traversal for inOrderIds method by @mscolnick in #6548
- chore: eslint to biome partial migration by @mscolnick in #6552
- chore(deps): update all storybook dependencies to ^9.1.8 by @renovate[bot] in #6554
- fix: matplotlib interactive stability fixes by @dmadisetti in #6550
- quote brackets, and get offset map for column number positioning by @Light2Dark in #6542
- fix: slider input when cleared by @mscolnick in #6557
- lint fixes by @Light2Dark in #6563
- feat: edit files from a Gist url by @crivaronicolini in #6559
- re-enable sql-mode internally by @Light2Dark in #6558
- feat: use mo.inspect in formatters for some basic types by @mscolnick in #6541
- Click filenames in stack trace to open locally in editor by @yairchu in #6556
- improvement: dont show python traceback for sql errors by @mscolnick in #6573
- improvement: cache validation requests for sql linter by @mscolnick in #6574
- optimize validation request for duckdb sql by @Light2Dark in #6578
- devops: make dev explicitly uses the port the pnpm expects (fix #6565) by @yairchu in #6575
- improvement: change output default from above to below by @mscolnick in #6572
- Turns on sql_linter to true by default by @Light2Dark in #6579
- expose feature flag for chat mode by @Light2Dark in #6577
- change ff name, chat_mode by @mscolnick in #6582
- fix[lsp]: allow binary locations with spaces by @dmadisetti in #6569
- chore: Update ruff version in dev dependencies to match pre-commit by @mscolnick in #6585
- internal: remove whitespace in tutorials by @mscolnick in #6588
- docs: add missing docs by @mscolnick in #6586
- Update sqlglot dependency to include 'rs' variant in for better perf by @mscolnick in #6584
- sql linter: add listener to set focus state and parse only when focused by @Light2Dark in #6591
- claude 4.5 by @koaning in #6592
- add simple auto fix button for sql cell by @Light2Dark in #6590
- Prune redundant traceback item at start of all traces by @yairchu in #6589
- feat: marimo check --format=jsonby @dmadisetti in #6570
- add docs for azure and properly handle endpoint by @Light2Dark in #6587
New Contributors
- @crivaronicolini made their first con...
0.16.2
What's Changed
- docs: i18n by @mscolnick in #6478
- docs: add documentation for mo.outline widget by @mscolnick in #6468
- docs: wide -> medium by @mscolnick in #6480
- [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci[bot] in #6481
- Add hover text on table header by @nojaf in #6466
- chore(deps): update build tools by @renovate[bot] in #6484
- improve perf and visual for table header tooltip by @Light2Dark in #6488
- feat: lint pattern to extract and process logs (capture invalid sql) by @dmadisetti in #6407
- feat: Add markdown to the cell level by @dmadisetti in #6479
- feat: Add "download" option to mo.ui.dataframe by @AnirudhDagar in #6492
- tests: skip failing test by @mscolnick in #6493
- snapshot: sql_parsing_errors.txt by @dmadisetti in #6496
- share types and function between table and dataframe for download by @Light2Dark in #6497
- fix: copy output exclude ansi and html by @mscolnick in #6495
- feat: Streaming files for check by @dmadisetti in #6494
- feat: Wrap and pass SQL Errors by @dmadisetti in #6498
- fix: cell-id logic in function-registry by @mscolnick in #6500
- sql mode - validate for duckdb by @Light2Dark in #6460
Full Changelog: 0.16.1...0.16.2
0.16.1
This release includes improvements to internationalization and important bug fixes.
✨ Enhancements
- Add to outline mo.outline()(#6430)
- Display plain output for explain queries in duckdb (#6439)
- Add GetNotebookErrorstool (#6445)
- Add session_idtosystem_context(#6443)
- Use user's (or configured) locale for dates, times, and numbers (#6433)
- Add locale to display config (#6432)
- Show tool location and kind when no output (#6441)
- Add datasource tool (#6422)
- Use user's local for date inputs (#6412)
- Hover over cell (#6420)
- Display tool inputs for tool accordion (#6452)
- Add maybe import marimoto Generate with AI (#6471)
🐛 Bug fixes
- Preserve literal strings in type annotations (#6451)
- check if default schema and db is string, for engines (#6438)
- String quoting for marimo (#6470)
- Skip adding import if already exists (#6475)
- Restrict uvicorn version to avoid notebook creation issues (#6453) (#6467) (4c17a0e)
- Center slides better for iframed content (#6465)
- Return original markdown text, override format (#6464)
- Prevent new language adapter instances being created on keypress (#6459)
- Specify utf-8 encoding when writing toml files (#6449)
📚 Documentation
📝 Other changes
Contributors
Thanks to all our community and contributors who made this release possible: @bjoaquinc, @daizutabi, @dmadisetti, @Light2Dark, @manzt, @maxkoretskyi, @mscolnick, @nojaf
Full Changelog: 0.16.0...0.16.1


