Skip to content

Releases: marimo-team/marimo

0.17.2

24 Oct 20:14

Choose a tag to compare

Important bug fix for plotly charts

What's Changed

Full Changelog: 0.17.1...0.17.2

0.17.1

24 Oct 18:06

Choose a tag to compare

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 env optional 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 commentLines as 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 uv section 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

15 Oct 17:15

Choose a tag to compare

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-token

See 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_m fork (#6774)
  • Create ToolGuidelines for better Agent orientation of when and how to use marimo tools (#6793)
  • Migrate mo.ui.dataframe to 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 msgspec Python 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

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:

Full Changelog: 0.16.5...0.17.0

0.16.5

02 Oct 20:00

Choose a tag to compare

What's Changed

Full Changelog: 0.16.4...0.16.5

0.16.4 and 0.16.3

01 Oct 19:02

Choose a tag to compare

0.16.4

Important Upgrade

This release includes an important fix for Security Release - CWE-441 - Unauthenticated Proxy.

What's Changed

New Contributors

Full Changelog: 0.16.3...0.16.4


0.16.3

What's Changed

New Contributors

Read more

0.16.2

24 Sep 12:41

Choose a tag to compare

What's Changed

Full Changelog: 0.16.1...0.16.2

0.16.1

22 Sep 19:46

Choose a tag to compare

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 GetNotebookErrors tool (#6445)
  • Add session_id to system_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 marimo to 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

  • Update CLAUDE.md to incorporate marimo check (#6448)
  • Update system prompt & CLAUDE.md (#6437)

📝 Other changes

  • check ignore for ci (#6474)
  • Run check on examples (#6450)
  • Fix uv snapshot (#6440)

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

0.16.0

18 Sep 21:46

Choose a tag to compare

This release brings multi-cell AI code generation and marimo check for static code analysis, along with preview features for AI agents.

Highlights

Generate multiple cells with AI

You can now generate entire notebooks with AI within marimo.

The "Generate with AI" feature has been upgraded to create multiple cells at once, organizing code into logical units (#6312).

As you watch the AI work, cells stream in with a distinctive visual indicator, making it clear which cells are AI-generated. Accept suggestions with Tab or reject with Escape.

Detect and fix common issues with marimo check

marimo includes a comprehensive linting system that helps you write better, more reliable notebooks. The new marimo check command detects and reports on common errors before runtime, ensuring your notebooks follow marimo's best practices (#6288).

Run marimo check to identify issues like multiple definitions, circular dependencies, and syntax errors. Add --fix to automatically resolve formatting issues. Configure marimo check as a hook with AI coding agents like Claude Code or Google Gemini to automatically correct potential mistakes in AI-generated code.

# Check for issues
marimo check notebook.py

# Auto-fix formatting issues
marimo check --fix notebook.py

You can also use marimo check for CI/CD pipelines with its non-zero exit codes on warnings.

AI Agent Sidebar (Preview)

Connect marimo notebooks to AI coding assistants like Claude Code or Gemini CLI through the new Agent sidebar (#6331, #6389). This experimental integration uses the Agent Client Protocol (ACP) to enable AI agents to help write and modify code directly in your notebooks.

Enhanced agent capabilities:

  • Upload files directly from your computer into the agent context
  • Reference data with @ - mention dataframes, variables, and errors
  • Attach files with # - include notebook files in your prompts
  • Open terminal for agent commands directly from the sidebar

Note: This feature is behind a feature flag and ready for early testing. Start your agent with --watch mode for best results.

✨ Enhancements

  • Clean up stack traces with marimo check (#6423)
  • Add session_ttl parameter to create_asgi_app (#6419)
  • Add xterm addons and terminal resize (#6395)
  • Add tables and variable tool (#6396)
  • Download table regardless of cell selection (#6391)
  • Upload files, @-symbol for data, # for files in the Agent panel (#6389)
  • Add script to generate lint docs (#6379)
  • Refresh example notebooks (#6378)
  • marimo check --fix (#6288)
  • Update ToolManager to initialize in lifespans.py and use ToolBase for backend tool registration (#6375)
  • Expand app.run to allow programmatic overrides (#6359)
  • Better ACP commands, edit the notebook without --watch, slash-commands (#6360)
  • Generate multiple cells with "Generate with AI" (#6312)
  • Add progress_bar with iterator and total (#6424)
  • Add "open in terminal" to Agent sidebar (#6405)
  • Add async progress bar functionality (#6336)

🐛 Bug fixes

  • Allow parsing lists in app config kwargs (#6427)
  • Handle 'import *' correctly for marimo check (#6425)
  • Remove body tags when rendering custom HTML (#6421)
  • Pandas series with columns the same as index name (#6418)
  • Shelex paths for lsp (#6403)
  • Add 'class' as a builtin (#6399)
  • Handle nested msgspec parsing (#6382)
  • Add string conversion in DataTableColumn.__post_init__ (#6383)
  • Fix enter for renaming a cell not working (#6376)
  • Allow syntax errors (#6371)
  • Fix could not find function given request: FunctionCallRequest (#6365)
  • Fix InstallHook.js:1 in HTML, <tr> cannot be a child of <table> (#6367)
  • Use TypeVar for Cls in class_definition (#6364)
  • Allow invalid decorator permutations (#6357)
  • Allow test cells in the presence of async cells (#6355)
  • Handle empty tool results in agents (#6431)

📚 Documentation

  • Add agents docs and feature flag (#6409)
  • Add --unsafe-fixes and example rule (#6398)
  • Add syntax error check rule as a base example (#6384)

📝 Other changes

  • Tests for edge case file names (#6400)
  • Tool calls styling and streamdown (#6411)
  • Change styles for staged AI cells (#6410)
  • Frontend filename edge case tests (#6401)
  • Pass around single bytes of message for KernelMessage (#6380)
  • Lazyer initialization of tools (#6377)
  • Use nested op from data (#6381)
  • Pin duckdb <=1.3.0 for type-checking (#6374)

Contributors

Thanks to all our community and contributors who made this release possible: @Antyos, @bjoaquinc, @daizutabi, @dmadisetti, @Light2Dark, @maxkoretskyi, @mscolnick, @nojaf

And especially to our new contributors:

Full Changelog: 0.15.5...0.16.0

0.15.5

15 Sep 18:12

Choose a tag to compare

What's Changed

  • fix: show both inputs and task list in TODO mkdocs-marimo example by @superlopuh in #6351
  • Fix UI element updates not working in WASM due to request parsing order by @manzt in #6354

New Contributors

Full Changelog: 0.15.4...0.15.5

0.15.4

15 Sep 15:02

Choose a tag to compare

This is a quick follow-up to 0.15.3 with important bug fixes for how messaging works inside marimo.

Preview features

  • WIP Agent sidebar (Claude Code and Gemini CLI) (#6331)
  • Add marimo._ipc for multi-environment kernels (#6303)

Enhancements

  • Add progress_bar type hints (#6304)

Bug fixes

  • Remove dual JSON encoding in pyodide message callback (#6350)
  • Apply styles manually for actions menu (#6346)
  • Json encode handle more human types, and more human readable for tables (#6334)
  • Checks if sql variable data exists before accessing it (#6327)
  • Fallback to __dict__/__slots___ in enc_hook for unknown objects (#6332)

Documentation

  • Debugging notebooks (#6305)

Other changes

  • Update react-aria dependencies (#6344)
  • Introduce ToolBase and centralize tool implementations (#6309)

Contributors

Thanks to all our community and contributors who made this release possible: @Antyos, @bjoaquinc, @dmadisetti, @Light2Dark, @manzt, @mscolnick.

And especially to our new contributors:

Full Changelog: 0.15.3...0.15.4