NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #2518 most downloaded on PyPI
A library for making reactive notebooks and apps
Last release 3 days ago
01 Oct 2026
Ships on a steady schedule
a new release about every 2 weeks
Nearly every release is documented
notes for 54 of the last 60 stable releases
6 versions withdrawn
withdrawn after publishing
5 years old
392 releases · first in 2022
One column per quarter.
Make local agent pairing easier to discover
expand_outputs as an argument to ctx.edit_cell and ctx.create_cell (#10974)cache size (#10837)cache dir (#10836)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
This release reworks sandboxing to improve correctness, recovery, and consistency, and adds Pixi as a new sandbox backend.
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.
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.
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.
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!
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.
expand_output cell decorator (#10911)%env values in ipynb conversion (#10904)webbrowser (#10887)image_compare (#10907)data-tooltip attributes (#10851).env resolution when there is no pyproject.toml (#10583)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, @Oscar-Williams, @peter-gy, @phobson, @SergeyAxiomatic
And especially to our new contributors:
Full Changelog: 0.24.2...0.25.0
Always show storage metadata for files
Thanks to all our community and contributors who made this release possible: @akshayka, @kirangadhave, @Light2Dark, @mscolnick
Full Changelog: 0.24.1...TODO_CURRENT_VERSION
This release makes it easier to share slide decks, browse files across directories and GitHub repositories, in addition to many other bug fixes. Some
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.
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 runRead the docs for static HTML, or learn about interactive WebAssembly exports.
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.
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.
mo.latex to accept text directly (#10723)allow_provider_config is false (#10590, 3524643)mo.ui.matrix (#10520, 5c3646a)geoarrow imports to geoarrow-types (#10659)srcdoc (#10668)mace imports to mace-torch (#10594)mo.ui.date_range value (#10649)Path.__deepcopy__ recursion (#10702)mo.ui.dictionary and .batch (#10653)contains operator (#10617)mo.ui.file_browser (#10613)sql_parse_error lint rule (#10757)mo.video example (#10731)experimental.cache to cache.store and add signing fields (#10523, 7ff2b4d)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:
Full Changelog: 0.24.0...0.24.1
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_brow…
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 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.
Read the docs to learn more.
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.
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.mp4Give your AI access to capabilities like web search directly from the siderbar:
Screen.Recording.2026-08-10.at.5.14.09.PM.movuv_build to <=0.13.0 (#10467)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:
Full Changelog: 0.23.16...0.24.0
🛢️ 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.
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.
Overflowing slides now show a "scroll for more" hints, and slide container styling is simplified (#10363).
mo.stop as scratchpad success (#10369)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:
Full Changelog: 0.23.15...0.23.16
Serialize pandas via Arrow IPC instead of deprecated feather
marimo-base (#10260)echo_update acks back to clients (#10178)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
Full Changelog: 0.23.14...0.23.15
This release brings anywidget composition with hot reload, an experimental debugger with per-line timing, chat AI improvements, and cached WASM export
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.
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.
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.movBuilding 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).
The AI chat panel picked up several upgrades this release:
@error://all or a single cell's error to attach its source, traceback, and SQL schema as context chips (#10038)Read the docs for more on AI features.
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).
Read the docs for more on exporting notebooks.
mdx flavor in md export (#10116)__generated_with when that's the only change in a notebook (#10027)mo.ui.panel in its docstring (#10067)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:
Full Changelog: 0.23.13...0.23.14
fix: edge cases for parsing pasted notebooks by @akshayka in #10033
Full Changelog: 0.23.12...0.23.13
Upgrade frontend to Tailwind v4.3 and lint deprecated classes
marimo export md (#9586) (8565003)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
Full Changelog: 0.23.11...0.23.12
This release gives mo.ui.table finer display control (fixed column widths, a toggleable search bar, and a reusable display config). Additionally mo.ou
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.
mo.ui.table displayYou 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})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.
show_search and a reusable mo.ui.table.Display config (#9984)column_widths to mo.ui.table (#9982)pyproject.toml (#9961)mo.output.clear_console() (#9950)ai.enabled is false (#9937)str.splitlines() (#9957)/bin/bash -> /usr/bin/env bash (#9942)068f140)DESIGN.md (#9641, 7f29fa3)06b152a)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
This release brings threading and multiprocessing to WASM notebooks and makes remote storage browsing scale with search and pagination — alongside tab
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.
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.
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
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
OTEL_SERVICE_NAME for traces (#9906)/api/usage endpoint (#9773)mo.ui.table hover_template (#9780)as_completed timeout deterministic (#9891)!-command cells from disabling underscore-privatization on convert (#9873)jupyter-book-marimo plugin (#9802)mo.ui.chat (#9847, #9888, 29352cf)b3c9225)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:
Full Changelog: 0.23.9...0.23.10
This release makes opening a notebook in a second tab non-destructive, mo.ui.table adds new args for hidden_columns/visible_columns (mutually exclusiv
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.
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
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
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
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:
Full Changelog: 0.23.8...0.23.9
Nothing published for this version
Hardening pass — utilities, deprecated API cleanup, lifespan fix
This release brings major upgrades to table filtering, adds speaker notes to slide view, and lets WASM notebooks query remote files with DuckDB.
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).
<p align="center"> <video width="600" src="https://github.com/user-attachments/assets/435052c5-3365-4b81-a8f0-1b6fcddbca46" /> </p>
Press S in slide view to open speaker notes alongside the current slide, including in fullscreen and kiosk mode (#9533).
<p align="center"> <video width="600" src="https://github.com/user-attachments/assets/b83b918b-8482-49dd-990a-78fe3d0566d7" /> </p>
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')
marimo new CLI help page render properly at 80 columns (#9636)kernel_session() as context manager, DRY up tests (#9554)lazy-polars output via pl(lazy=True) (#9648)public/ images in static HTML export (#9627)Thanks to all our community and contributors who made this release possible: @akshayka, @archpulse, @arghaffari, @dmadisetti, @jeremytanjianle, @JoostGevaert, @kirangadhave, @leoadberg, @Light2Dark, @manzt, @mchav, @mscolnick, @peter-gy, @Rowlando13, @Shamik-07, @williambdean
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.23.6...0.23.7
Propagate notebook filename through MarimoIslandGenerator.from_file (#9409). This is a correctness fix, but could break existing users who relied on b
marimo export html-wasm for session previews (#9437)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
Full Changelog: https://github.com/marimo-team/marimo/compare/0.23.5...0.23.6
This release adds editable code in slide view, OpenTelemetry distributed tracing support, and patches polars network I/O in WASM notebooks.
This release adds editable code in slide view, OpenTelemetry distributed tracing support, and patches polars network I/O in WASM notebooks.
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.
<p align="center"><img width="600" src="https://github.com/user-attachments/assets/a54257f8-e199-4a13-9641-85bf0c34d016" /></p>
Thanks to all our community and contributors who made this release possible: @akshayka, @dmadisetti, @koaning, @Light2Dark, @mscolnick, @ouatu-ro, @tigretigre
Full Changelog: https://github.com/marimo-team/marimo/compare/0.23.4...0.23.5
Update snapshots and types for altair v6.1.0 / vega-lite v6.4.1
_format_plan respect format_on_save; format enabled/disabled unit tests (#9380)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
Full Changelog: https://github.com/marimo-team/marimo/compare/0.23.3...0.23.4
Add slide config form in sidebar, and reveal slide types
_resolve_proxy against bare-port inputs (#9366)_references_virtual_file against cyclic data (#9369)_MARIMO_DISABLE_AUTH_ON_VIRTUAL_FILES env flag (#9343)Channel.Pull with NewType and union msg_type (#9296)--sandbox uv export (#9052) (ccc1841)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
Full Changelog: https://github.com/marimo-team/marimo/compare/0.23.2...0.23.3
Visible markers for leading/trailing whitespace in string cells
ctx.packages namespace to code mode (#9233)uv_build supported versions in build-system (#9231)FieldTypes a Map to preserve column order (#9279)marimo-ui-value-update echo for user-initiated changes (#9262)pandas/polars/pyarrow (#9246)mo.ui.matplotlib selections from code mode (#9195)Html.batch() type to accept all UIElement subclasses (#9163) (#9176) (73ff622)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
Full Changelog: https://github.com/marimo-team/marimo/compare/0.23.1...0.23.2
This release includes quality of life improvements to marimo slides, bug fixes to marimo islands that revive our quarto extension, a new lint rule, an
This release includes quality of life improvements to marimo slides, bug fixes to marimo islands that revive our quarto extension, a new lint rule, and minor security improvements.
Slide mode now has a minimap: a scrollable panel showing your cells at reduced scale, with click-to-navigate and drag-to-reorder support. It's performance-aware — cells only render in the minimap when they're in view.
https://github.com/user-attachments/assets/67e3c935-f3ad-47cf-bd4b-59887607a0a0
We've fixed many bugs with [marimo islands], a way to embed marimo outputs and/or Python code in other HTML. These fixes also make our quarto-marimo. (#9071) extension compatible with this version of marimo as well.
This release includes minor security improvements, including input sanitization, path traversal prevention, open redirect blocking, and auth endpoint hardening.
marimo-mpl-interactive, marimo-panel) to prevent script injection (#9133)head_html injection to run mode only (#9137)custom.css (#9131)//evil.com) (#9112)We've also updated our security documentation with a standard operating procedure for future disclosures (#9114).
Thank You. The enthusiasm following our recent CVE disclosure is a testament to what a healthy open-source community looks like. A special thank you to @GCXWLP, @Jvr2022, @offset, @l3tchupkt, @Fushuling, @RacerZ-fighting, and @q1uf3ng for their engagement and reports during this sprint. It takes a community to keep FOSS secure. We're lucky to have this one!
mo.ui.matplotlib rendering on browser zoom by @manzt in #9125Full Changelog: https://github.com/marimo-team/marimo/compare/0.23.0...0.23.1
This release contains important security updates for CVE-2026-39987. See Terminal WebSocket Authentication Bypass
This release contains important security updates for CVE-2026-39987. See Terminal WebSocket Authentication Bypass
The /terminal/ws endpoint is accessible without authentication on default marimo installations. This allows for unauthenticated users to remote execute code via this endpoint.
--host 0.0.0.0 and while in edit mode (not an application).You are not affected if any of these are true.
Please upgrade to 0.23.0 or later.
Full Changelog: https://github.com/marimo-team/marimo/compare/0.22.5...0.23.0
This release launches marimo pair — an agent skill that drops AI agents directly inside a running marimo notebook session — along with a cleaner, more
This release launches marimo pair — an agent skill that drops AI agents directly inside a running marimo notebook session — along with a cleaner, more responsive data table experience and a slate of reliability fixes.
marimo pair is a new agent skill that gives AI agents full control over a running marimo notebook session — accessing live variables, executing cells, installing packages, and building reproducible programs alongside you. This release adds the marimo pair prompt CLI command, a "Pair with an agent" modal in the notebook menu, and a secure --with-token auth flow that keeps credentials out of shell history.
npx skills add marimo-team/marimo-pair
<p align="center"><img width="600" src="https://github.com/user-attachments/assets/539fea4f-bf37-4216-9e5d-913e0797a6a6" /></p> <p align="center"><img width="600" src="https://github.com/user-attachments/assets/b22dfa18-0393-407f-998a-26ad9f96b9f7" /></p>
Column headers are now split into a dedicated sort button (cycles asc → desc → clear on click, hidden until hover) and a separate ⋯ menu button for column options. Tables with ≤ 4 columns automatically use natural width with a filler column; larger tables fill the container. Vertical column separators complete the refresh.
<p align="center"><img width="600" src="https://github.com/user-attachments/assets/577f08d8-57fd-411a-82b5-e2f6202fc333" /></p> <p align="center"><img height="300" src="https://github.com/user-attachments/assets/fbf0404f-cb25-4f4f-9220-baf65b4e2750" /></p> <p align="center"><img width="600" src="https://github.com/user-attachments/assets/63f52ac9-db5a-4d36-be89-8dd9850ebd9c" /></p>
NotebookCell with runtime status and error (#9056)marimo pair prompt CLI command and "Pair with an agent" modal (#9000)MimeBundleDescriptor) (#8972)_code_mode through scratchpad (#9030)Thanks to all our community and contributors who made this release possible: @alwaysahustler, @app/marimo-github-maintenance-bot, @app/renovate, @axsseldz, @daizutabi, @dmadisetti, @kirangadhave, @Light2Dark, @ManasVardhan, @manzt, @mscolnick, @tschm
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.22.0...0.22.5
Nothing published for this version
Nothing published for this version
This release brings a unified data table explorer, reliability improvements to the programmatic notebook API that power the new marimo-pair agent skil
This release brings a unified data table explorer, reliability improvements to the programmatic notebook API that power the new marimo-pair agent skill, smarter numeric formatting in tables, faster mo.persistent_cache, and a contextual tips system in the CLI.
The row viewer and column explorer panels are now unified into a single tabbed "Table Explorer" pane. A single toolbar button opens and closes the panel; Rows and Columns tabs live inside it, and your selected tab persists across open/close.
The experimental _code API receives reliability fixes in this release, enabling the new marimo-pair agent skill for pair programming in marimo notebooks.
npx skills add marimo-team/marimo-pair
mo.image no longer normalizes uint8 values (#8889)Previously, mo.image() normalized all numeric arrays (including uint8) to the [0, 1] float range. Now, uint8 arrays are always rendered with values in [0, 255] without normalization. Two new parameters — vmin and vmax — let you set explicit value bounds for under- or over-saturated displays. If you relied on the old uint8 normalization, pass vmin=0, vmax=1 explicitly.
__marimo__ location now follows sys.pycache_prefix (#8797)The __marimo__ directory now respects sys.pycache_prefix, consistent with Python's own __pycache__ placement. This also fixes cache placement for notebooks in nested directories. Existing caches will not be migrated — they can be safely deleted.
The cache format version has been bumped, invalidating existing caches.
hide_code not taking effect on kernel-created cells (#8926)--watch file reload (#8846)session.notify() (#8886)code as positional arg in edit_cell (#8806)__doc__ to cell execution namespace (#8636)_code_mode cell ID collisions on large notebooks (#8951)mo.ui.matplotlib selection masks (#8940)mo.ui.matplotlib (#8883)mo.mpl.interactive in marimo run mode (#8760)NotebookDocument model (#8842)Thanks to all our community and contributors who made this release possible: @abhiyadav2345, @akshayka, @app/dependabot, @app/marimo-github-maintenance-bot, @app/renovate, @Bortlesboat, @daizutabi, @dmadisetti, @kirangadhave, @koaning, @Light2Dark, @manzt, @mauro-cerzosimo, @mscolnick, @peter-gy, @Sushit-prog, @tomneep
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.21.1...0.22.0
Nothing published for this version
mo.mpl.interactive() has been rewritten to use marimo's built-in communication channel instead of a separate server and WebSocket proxy. This means in
mo.mpl.interactive() has been rewritten to use marimo's built-in communication channel instead of a separate server and WebSocket proxy. This means interactive matplotlib plots now work with no background threads or separate server process needed.
You can now export your marimo notebook as a Jupyter .ipynb file directly from the editor's download menu. Cells are exported in visual order with their captured outputs included.
<p align="center"> <img width="500" src="https://github.com/user-attachments/assets/2649e395-fc5d-4c73-909d-ed0c590806a3" /> </p>
width: "container" on all Altair charts, which distorted aspect ratios, made charts look different from the Altair docs. Charts now render at Altair's native default size. If you want a chart to fill the container width, set width="container" explicitly in your chart spec.marimo export ipynb to support command-line arguments (#8709)getcontext("spawn") (#8705)TypeIs/TypeGuard narrowing through @app.function, @mo.cache, and @mo.lru_cache (#8598)NameError in marimo run when passing mo.md() between cells (#8692)<title> tooltip from marimo icons (#8595)Thanks to all our community and contributors who made this release possible: @akshayka, @axsseldz, @chentoast, @daizutabi, @dmadisetti, @ffmiruz, @koaning, @Light2Dark, @manzt, @MarcoGorelli, @mchav, @mscolnick, @peter-gy, @PranavGopinath, @thliang01, @tigretigre, @tsubasakong, @VishakBaddur
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.20.4...0.21.0
Nothing published for this version
This release brings improved PDF export with slide deck support and interactive widget rasterization, along with spreadsheet-style selection statistic
This release brings improved PDF export with slide deck support and interactive widget rasterization, along with spreadsheet-style selection statistics for data tables.
Notebooks using the slides layout can now be exported as PDF:
<p align="center"> <img width="600" src="https://github.com/user-attachments/assets/f0f67608-408f-47d7-8722-12cb641333de" /> </p>
marimo export pdf --as=slides
The UI automatically recommends the right preset based on your notebook's layout.
Additionally, the new --rasterize-outputs flag captures interactive widgets (Plotly, anywidgets, etc.) as images in PDF exports — so your interactive components are preserved in the final document. Read the docs for more details.
Select two or more cells in a data table to see count, sum, and average of the selected numeric values — just like a spreadsheet. Works with mo.ui.table and mo.ui.dataframe.
<p align="center"> <img width="650" src="https://github.com/user-attachments/assets/245cc6c2-4622-4cca-85e6-9fd035de13ae" /> </p>
The dependency minimap now shows the actual content of SQL and markdown cells instead of unhelpful boilerplate like mo.sql(f""".
<p align="center"> <img width="400" src="https://github.com/user-attachments/assets/8c9ba8c3-d66a-433d-ab11-7050581a6446" /> </p>
marimo export session CLI tool (#8533)ChartBuilder (#8503)uv_build semver range to "<0.11.0" (#8502)marimo run <folder> --watch (#8460)html_head parameter to create_asgi_app() (#8302)get_cell_dependency_graph MCP tool (#8174)mo.cache returning stale values (#8411)auto_download is set (#8462)FigureWidget through the anywidget formatter and syncing widget state via _repr_mimebundle_(). (#8430)with_dynamic_directory mounted at sub-path (#8322) (#8434)Thanks to all our community and contributors who made this release possible: @24f2006299, @akshayka, @Antyos, @app/renovate, @axsseldz, @bxff, @daizutabi, @dmadisetti, @ffmiruz, @giulio-leone, @kyrre, @Light2Dark, @manzt, @mscolnick, @peter-gy, @tigretigre
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.20.2...0.20.3
This release improves the experience of imperatively writing output with `mo.Thread`s, and also includes an important bug fix for `mo.ui.matplotlib` s
This release improves the experience of imperatively writing output with mo.Threads, and also includes an important bug fix for mo.ui.matplotlib selection.
It is now possible for multiple mo.Thread objects to write to a single cell's output area using mo.output.append().
mo.status.progress_bar is now thread-safe, making it possible for multiple mo.Thread objects (started in the same cell) to update a single progress bar. This lets you communicate progress to the user when multiple threads are sharding work. (Example notebook.)
<p align="center"> <img width="600" src="https://github.com/user-attachments/assets/38adf9b2-ab9b-4e32-a95c-0342e2bb79a7" /> </p>
ExecutionContext.output to marimo.Thread (#8413)Thanks to all our community and contributors who made this release possible: @akshayka, @coastalwhite, @icholy, @manzt
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.20.1...0.20.2
Nothing published for this version
This release brings richer interactivity to scientific computing workflows in marimo with new UI primitives and a small breaking change to make mo.sto…
This release brings richer interactivity to scientific computing workflows in marimo with new UI primitives and a small breaking change to make mo.stop more predictable.
mo.ui.matplotlib adds reactive box and lasso selection to Matplotlib scatter plots.
<p align="center"> <img width=600 src="https://github.com/user-attachments/assets/2902eb51-2be4-4a5c-9d24-2d091f029eab"> </p>
Box select by default, <kbd>Shift</kbd>+click for lasso. Read the docs for more details.
mo.ui.matrix provides interactive numeric grid inputs. Initialize with a nested list or NumPy array and get a reactive element that updates as the user edits cells.
<p align="center"> <img width=600 src="https://github.com/user-attachments/assets/3671b7a8-c197-4a19-8247-858a44093027" /> </p>
Supports per-element bounds, symmetric constraints, and custom precision. Read the docs for more details.
nn.Module displayPyTorch nn.Module instances now render as collapsible HTML trees with color-coded layer categories.
<p align="center"> <img width=650 src="https://github.com/user-attachments/assets/2e85c231-2937-498f-900f-e9e66fd74a8a" /> </p>
Frozen layers are visually dimmed with trainable parameter counts shown inline. Hover any layer to view its docstring in the Documentation panel.
mo.stop now waits for all dependencies to unblock (#8374)Previously, when a cell depended on two branches that were both stopped with mo.stop, unblocking just one branch would trigger the dependent cell — often resulting in a NameError because the other branch's variables were still undefined. Now, marimo waits until all of a cell's dependencies are unblocked before running it. This also means that manually running a cell with a stopped ancestor will show a clear "ancestor stopped" message instead of a NameError.
mo.ui.matplotlib() (#8342)mo.ui.matrix() (#8354)playwright when running sandboxed thumbnail generation (#8339)getpass.getpass() input in notebook UI (#8345)click.ClickException for sandbox missing pyzmq error (#8347)data-marimo-doc in cell output (#8343)nn.Module (#8307)__buffer__ objects in widget comm buffers (#8283)IPython.display.Image with raw bytes (e.g. GIFs) (#8282)+ character in file paths being decoded as space in URLs (#8344)mpl.interactive becomes blank with large plots (#8285)has_warnings parse enum to indicate formatting errors (#8288)print_code test (1f706a2)--base-url breaks og:thumbnail generation path (#8329)Thanks to all our community and contributors who made this release possible: @akshayka, @andrewsoonqn, @axsseldz, @daizutabi, @dmadisetti, @fpreiss, @jacobcbeaudin, @jeffs, @Light2Dark, @manzt, @Mr-Neutr0n, @mscolnick, @mstanowski, @peter-gy, @snooze92, @xfy0012
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.11...0.20.0
docs: minor grammatical corrections to Marimo SQL tutorial. by @gvwilson in https://github.com/marimo-team/marimo/pull/8258
Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.10...0.19.11
This release focuses on anywidget improvements, along with UI enhancements and many bug fixes.
This release focuses on anywidget improvements, along with UI enhancements and many bug fixes.
anywidget improvements
This release improve marimo's anywidget integration with better lifecycle management, performance, and static export support (#8244, #8166, #8163, #8256, #8168, #8159, #8082). Anywidgets now render in static HTML exports with client-side interactivity preserved, and mo.state setters work in widget callbacks.
Together these changes improve performance and reliability for interactive widget libraries. Here's 10M points rendered interactively on a 24GB M4 MacBook Air with jupyter-scatter:
<p align="center"> <img width="600" src="https://github.com/user-attachments/assets/bfd78b99-e1b0-4e6c-abf8-6f96736e8bf8" /> </p>
Try it for yourself on molab!
Column header alignment in tables
Column headers now follow the same alignment as cell data when using text_justify_columns, fixing the visual mismatch where headers stayed left-aligned while data was right- or center-aligned. (#8236)
<p align="center"> <img width="500" src="https://github.com/user-attachments/assets/dc677879-422e-4950-ba9b-53c8e812937e" /> </p>
Hide reusable functions from the dependency graph
A new "Hide reusable functions" toggle in the dependency graph settings panel lets you declutter the graph by hiding def cells that don't have edges to other cells. (#8228)
mo.state setters in widget callbacks (#8244)dict(ChatMessage(...)) (#8091)marimo env output (#8157)Thanks to all our community and contributors who made this release possible: @AhmadYasser1, @akshayka, @dmadisetti, @ffmiruz, @julianpistorius, @koaning, @Light2Dark, @manzt, @maxkoretskyi, @mscolnick, @nojaf, @peter-gy
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.9...0.19.10
docs: molab links by @akshayka in https://github.com/marimo-team/marimo/pull/8112
marimo export namespace by @peter-gy in https://github.com/marimo-team/marimo/pull/8154Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.8...0.19.9
Remove some deprecation warnings
This release introduces notebook galleries with OpenGraph previews, along with anywidget improvements, AI enhancements, and many bug fixes.
Serve a gallery of notebooks
You can now serve multiple marimo notebooks as a gallery using marimo run with folders or multiple files. This is useful for showcasing collections of notebooks, tutorials, or dashboards in a single browsable interface.
<p align="center"> <img width="600" src="https://github.com/user-attachments/assets/336702a5-6758-43dc-953a-8fee096c3726" /> </p>
# Serve all notebooks in a folder
marimo run my_notebooks/
# Serve multiple folders and files
marimo run tutorials/ examples/ standalone.py
# Run with sandboxed environments per notebook
marimo run my_notebooks/ --sandbox
Rich gallery previews with OpenGraph metadata
Gallery cards can be customized with OpenGraph metadata. Define metadata in your notebook's PEP 723 script block to control how each notebook appears in the gallery:
[tool.marimo.opengraph]
title = "My Analysis"
description = "Exploratory data analysis of Q4 results"
image = "https://example.com/thumbnail.png"
For dynamic metadata, define a generator function that computes OpenGraph fields at runtime.
You can also auto-generate thumbnail images for your notebooks using marimo export thumbnail:
# Generate thumbnails (code-only, no execution)
marimo export thumbnail my_notebooks/
# Generate thumbnails with notebook execution for richer previews
marimo export thumbnail my_notebooks/ --execute --sandbox
Thumbnails are stored in the __marimo__/ directory alongside your notebooks and served automatically in gallery mode.
Attach images to "Generate with AI"
You can now attach images when using "Generate with AI" to provide visual context for code generation. This is useful for sharing mockups, charts, or screenshots that help the AI understand what you're trying to build.
<p align="center"> <img width="750" src="https://github.com/user-attachments/assets/20a3585a-2915-425f-a0f6-96bc3f059c2a" /> </p>
__getattr__ returning non-callable values in serialization (#8109)mo.output.replace() when first-page data is unchanged (#8066)Thanks to all our community and contributors who made this release possible: @dmadisetti, @gvwilson, @koaning, @Light2Dark, @lucharo, @manzt, @maruthgoyal, @mscolnick, @peter-gy, @marcodlk
Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.7...0.19.8
marimo now supports exporting notebooks as PDFs, both from the CLI and directly from the notebook interface. Whether you're generating documentation,
PDF Export
marimo now supports exporting notebooks as PDFs, both from the CLI and directly from the notebook interface. Whether you're generating documentation, creating reports, or sharing your work, you can now produce professional-looking PDF outputs with full support for your notebook's visualizations and markdown content.
Export from the command line using the new marimo export pdf command, with options to control output format and include CLI arguments for parameterized notebooks. The PDF exporter runs your notebook, captures all outputs, and uses nbconvert's WebPDF exporter (powered by Chromium) for high-quality rendering. When running marimo as a notebook, you'll find a new "Export as PDF" option in the export menu.
# Export a notebook to PDF
marimo export pdf notebook.py -o notebook.pdf
# Pass CLI arguments to your notebook
marimo export pdf notebook.py -o report.pdf -- --date 2026-01-29 --region west
# Watch for changes and auto-regenerate
marimo export pdf notebook.py -o notebook.pdf --watch
Requirements: PDF export requires nbformat and nbconvert[webpdf] to be installed.
_marimo_row_id when clamping table columns (#8029) (#8035) (83f0901)watch_and_export implementations (#8000)Thanks to all our community and contributors who made this release possible: @akshayka, @app/renovate, @dmadisetti, @faysou, @Light2Dark, @manzt, @mscolnick, @MukeshK17, @peter-gy, @sswatson-ap
Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.6...0.19.7
fix number component navigation
Thanks to all our community and contributors who made this release possible: @akshayka, @app/renovate, @manzt, @mscolnick
Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.5...TODO_CURRENT_VERSION
inverted flag for pdfDownloadEnabled
--session-ttl flag to marimo edit (#7863)Thanks to all our community and contributors who made this release possible: @akshayka, @AnirudhDagar, @app/pre-commit-ci, @dmadisetti, @EdSwarthout, @koaning, @Light2Dark, @manzt, @mscolnick, @tokoko, @VedantMadane
Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.4...0.19.5
Increase codecov timeout by @akshayka in https://github.com/marimo-team/marimo/pull/7852
marimo._convert by @mscolnick in https://github.com/marimo-team/marimo/pull/7858Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.3...0.19.4
This release introduces isolated sandbox environments for multi-notebook directories and migrates our AI integrations to pydantic-ai for improved reli
This release introduces isolated sandbox environments for multi-notebook directories and migrates our AI integrations to pydantic-ai for improved reliability with modern LLM providers.
You can now run marimo edit --sandbox directory/ to open a folder of notebooks where each notebook runs in its own isolated sandbox environment. This means:
This is useful when working on multiple notebooks with different dependency requirements, or for maintaining a collection of standalone, shareable notebooks.
# Open a directory with per-notebook isolation
marimo edit --sandbox ./notebooks/
[!NOTE] This feature requires
pyzmqas a dependency. If you're running marimo withuvx, use:uvx --with pyzmq marimo edit --sandbox ./notebooks/Alternatively install marimo as
marimo[sandbox]ormarimo[recommended]to get all the recommended packages.
See our guide on sandboxed home and inlining dependencies guide for more details on sandboxed notebooks.
pydantic-aiWe've migrated our AI integrations to use pydantic-ai, which brings several improvements:
max_completion_tokens parameterThis is a behind-the-scenes change that improves reliability—your existing AI configuration should continue to work without changes
[tool.marimo.venv].path to specify a specific venv (#7821)__contains__ and __getitem__ in anywidget (#7846)mo.ui.dataframe showing incorrect column count (#7845)repr_mimebundle handles empty include/exclude parameters gracefully (#7787)mo.ui.plotly support for bar and heatmap (#7769)Thanks to all our community and contributors who made this release possible: @akshayka, @alonsosilvaallende, @andrewsoonqn, @AnirudhDagar, @dmadisetti, @koaning, @Light2Dark, @mscolnick, @NickCrews, @nojaf, @pepijndevos, @Ravinlathigra, @szst11
Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.2...0.19.3
This PR fixes a bug that prevented deployed notebooks from accessing request context like user authentication data, cookies, headers, etc.
This PR fixes a bug that prevented deployed notebooks from accessing request context like user authentication data, cookies, headers, etc.
Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.1...0.19.2
This release includes a new API for formatting values in mo.ui.dataframe, as well as small bug fixes.
This release includes a new API for formatting values in mo.ui.dataframe, as well as small bug fixes.
Thanks to all our community and contributors who made this release possible: @akshayka, @dmadisetti, @hodlen, @Light2Dark, @manzt
Full Changelog: https://github.com/marimo-team/marimo/compare/0.19.0...TODO_CURRENT_VERSION
This release introduces a refreshed UI with lighter cell styling and a new Developer Panel, along with reorganized sidebar panels and important bug fi
This release introduces a refreshed UI with lighter cell styling and a new Developer Panel, along with reorganized sidebar panels and important bug fixes.
<p align="center"> <img width="750" src="https://github.com/user-attachments/assets/6ae89a34-8b80-40c0-9b49-1717b75165df" /> </p>
<p align="center"> <img width="750" src="https://github.com/user-attachments/assets/668407dc-2ffd-4ef5-aff4-e8b546daaec1" /> </p>
marimo has many panels for configuring and inspecting notebooks, but mixing essential tools with advanced features can overwhelm new users. This release introduces a dedicated Developer Panel at the bottom of the editor (similar to VS Code's panel or browser DevTools) to house specialized tools like the terminal, logs, tracing, and scratchpad.
The sidebar now focuses on core panels that all users need, while power users can open the Developer Panel when they need deeper visibility into execution or want a scratchpad for experimentation. If you prefer a different arrangement, panels can be freely moved between the sidebar and Developer Panel—just drag them where you want.
Cmd/Ctrl + J or via the footerTo reduce clutter, several panels have been reorganized:
Cmd/Ctrl+Shift+I)mo.carousel() (#7709)Ctrl as modifier key on macOS (#7608)mo.ui.dataframe (#7584)dev install (#7372)!pip and give better error message (#7525)Ctrl+Click to select cell type on Windows/Linux (#7580)UIElement.form docstring (#7578)mo.ui.altair_chart. (#7673)DirectedGraph into smaller components (#7527)marimo edit local static notebooks (#7474)--asset-url as a fallback (#7453)Thanks to all our community and contributors who made this release possible: @akshayka, @andrewsoonqn, @corleyma, @dmadisetti, @koaning, @Light2Dark, @m-rgba, @majiayu000, @manzt, @mscolnick, @nojaf, @prateek, @thliang01
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.18.4...0.19.0
fix download_json in tables by adding strict_json arg by @Light2Dark in https://github.com/marimo-team/marimo/pull/7429
Full Changelog: https://github.com/marimo-team/marimo/compare/0.18.3...0.18.4
handle nans and infs in table filter
Thanks to all our community and contributors who made this release possible: @dmadisetti, @Light2Dark, @mscolnick
Full Changelog: https://github.com/marimo-team/marimo/compare/0.18.2...0.18.3
Inline relative images inside pyodide
Thanks to all our community and contributors who made this release possible: @app/dependabot, @app/renovate, @cosmo-grant, @dmadisetti, @hodlen, @koaning, @Light2Dark, @mscolnick, @szst11
Full Changelog: https://github.com/marimo-team/marimo/compare/0.18.1...0.18.2
Include mo.sidebar() when using Grid layout
Thanks to all our community and contributors who made this release possible: @adamwdraper, @app/renovate, @cosmo-grant, @dmadisetti, @koaning, @Light2Dark, @manzt, @mscolnick, @patyork, @robd518
Full Changelog: https://github.com/marimo-team/marimo/compare/0.18.0...0.18.1
Remove stream argument for built-in AI models
uv pip install (#7179)Thanks to all our community and contributors who made this release possible: @adamwdraper, @akshayka, @dmadisetti, @kiwamizamurai, @kjgoodrick, @koaning, @Light2Dark, @mscolnick, @olad5, @sswatson, @thliang01
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.17.8...0.18.0
This release focuses on stability improvements and bug fixes across the runtime, with enhancements to error messaging, UI refinements, and better supp
This release focuses on stability improvements and bug fixes across the runtime, with enhancements to error messaging, UI refinements, and better support for third-party integrations like Ibis and DuckDB.
can_narwhalify (#7160)!pip metadata from ipynb convert and handle ! commands (#7141)mo.ui.file_browser when listing is slow (#7155)Thanks to all our community and contributors who made this release possible: @akshayka, @chendaniely, @dmadisetti, @enosh, @koaning, @Light2Dark, @mscolnick, @peterbygrave, @SamarJyoti496
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.17.7...0.17.8
This release focuses on stability with several bug fixes. It also adds SQLAlchemy Supabase support and removes Python 3.9 compatibility.
This release focuses on stability with several bug fixes. It also adds SQLAlchemy Supabase support and removes Python 3.9 compatibility.
mo.ui.chat so content stays clean (#7066)sqlalchemy supabase connector (#7068)cell_id (#7072)Thanks to all our community and contributors who made this release possible: @akshayka, @bjoaquinc, @bmerkle, @dmadisetti, @koaning, @Light2Dark, @mscolnick, @SamarJyoti496
And especially to our new contributors:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.17.6...0.17.7
We've temporarily disabled the SQL linter as it causes freezing in the browser.
We've temporarily disabled the SQL linter as it causes freezing in the browser.
Full Changelog: https://github.com/marimo-team/marimo/compare/0.17.5...0.17.6
We made a few more changes to our markdown parsing.
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.
Full Changelog: https://github.com/marimo-team/marimo/compare/0.17.4...0.17.5
Important bug fixes for markdown cells.
Important bug fixes for markdown cells.
Full Changelog: https://github.com/marimo-team/marimo/compare/0.17.3...0.17.4
This release adds support for OpenAI's Codex agent in the AI chat sidebar, improves Altair chart interactivity, and includes important bug fixes and p
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.
<p align="center"> <img width="750" src="https://github.com/user-attachments/assets/91ae1969-b3f8-4c90-a03a-e49bb4859ebc" /> </p>
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.
AppMeta and make it public (#6939)mo.ui.altair_chart (#6986)natural_sort by 120% (#6975)chart.to_dict() and don't mutate charts (#6972)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:
Full Changelog: https://github.com/marimo-team/marimo/compare/0.17.2...0.17.3
Important bug fix for plotly charts
Important bug fix for plotly charts
Full Changelog: https://github.com/marimo-team/marimo/compare/0.17.1...0.17.2
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.
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.
marimo env optional deps (#6826)commentLines as readonly in SQLMetadata (#6846)uv section less confusing (… (#6813)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: https://github.com/marimo-team/marimo/compare/0.17.0...TODO_CURRENT_VERSION
This release delivers improvements to the AI user experience and adds support for Python 3.14.
This release delivers improvements to the AI user experience and adds support for Python 3.14.
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":
<p align="center"> <img width=700 src="https://github.com/user-attachments/assets/01d01fa4-8766-490d-ae61-05bd98ca2114"> </p>
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
<p align="center"> <img width=700 src="https://github.com/user-attachments/assets/1b40995d-20c7-4f58-9069-c54973387b2c"> </p>
See the MCP documentation to learn more. Special thanks our Resident MCP/AI Engineer @bjoaquinc for driving the implementation and improvements!
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.
msgspec_m fork (#6774)mo.ui.dataframe to narwhals; support duckdb, ibis, pandas, polars (#6772)ai.chat (#6668)--watch (#6701)msgspec Python 3.14 compatibility (#6749)mo.ui.plotly tests (#6757)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: https://github.com/marimo-team/marimo/compare/0.16.5...0.17.0
fix (gemini): premature client close error when using gemini models in chat by @bjoaquinc in https://github.com/marimo-team/marimo/pull/6634
Full Changelog: https://github.com/marimo-team/marimo/compare/0.16.4...0.16.5
Your coding agent can read these notes before it upgrades. Set up the MCP server →