Mixing code with widgets
marimo is reactive, which allows you to have Python interact with a rich widget ecosystem including native UI elements, reactive cell updates, and anywidget integration.

marimo transforms static notebooks into dynamic, interactive experiences through its powerful widget system. Unlike traditional notebooks where interactivity is an afterthought, marimo’s reactive architecture makes widgets first-class citizens that seamlessly integrate with your analysis workflow.
Reactive cells can respond
Notebook cells are reactive in marimo. If a cell needs a variable in order to run, it becomes a dependant of the cell that has the variable declaration. This also means that when a variable updates, any dependant cells can also auto-run. This reactive mechanism comes with a lot of benefits, not the least that it allows for native integration beteen Python code and UI elements. Reactivity is what allows for notebooks that can also function as interactive dashboards and webapps.
This reactive execution model creates a responsive user experience where moving a slider, selecting from a dropdown, or uploading a file instantly propagates changes throughout your analysis. Users see immediate feedback as visualizations update, statistics recalculate, and derived values adjust to reflect their input.
Rich library of UI elements
There are many widgets supported natively in marimo’s comprehensive UI library. The platform provides essential interface elements out of the box, including sliders, dropdowns, file upload widgets, data tables, and form builders.
However, beyond these standard UI elements, marimo also ships bespoke widgets for dataframes. When a dataframe is shown to the user it is wrapped around an interface that makes it easy to search, filter or download the data. These elements appear any time you would display a dataframe and it also works with SQL queries.
Altair and Plotly charts can also be made interactive in marimo. Users can brush to select data range and use built-in zoom and pan controls to find subsets worth zooming in on. These interactions automatically propagate back to your notebook, allowing chart interactions to drive further analysis or update other visualizations in real-time.
This tight integration eliminates the boilerplate code typically required to connect interface elements with analytical logic, while the interactive charting capabilities turn static visualizations into powerful exploration tools.
Anywidget ecosystem
marimo also supports widgets from the anywidget ecosystem. It’s a great foundation for anything custom, and you can benefit from many widgets that already exist today. Some widgets allow you to literally draw a dataset while others go as far adding gamepad support. And because marimo is reactive, all of your Python code can respond to changes made to these widgets.
marimo’s integrated LLM tools make custom widget creation more accessible than ever. You can describe the interface you want in natural language, and the AI can generate the HTML, CSS, and JavaScript code needed to create functional anywidgets.
From analysis to application
The combination of reactive cells, native widgets, anywidget extensibility, and AI-powered development creates a powerful pathway from analytical notebooks to polished applications. The same environment where you explore data and develop insights becomes the platform for sharing those insights with others.
This seamless transition eliminates the traditional handoff between data scientists and frontend developers. Analytical work can evolve naturally into tools that stakeholders can use to explore data, test scenarios, and gain insights independently.