Mercury
Re-runs cells below a changed widget
Python app framework guide · Reviewed August 2026
Compare seven Streamlit alternatives by the choice that matters first: do you want to keep a notebook, build a script-based app, wire callbacks, or manage a larger workflow?
Compared from official documentation and project repositories. No framework is best for every project.
Quick answer
Start with the application model and file format. Those two choices usually matter more than the length of the feature list.
Re-runs cells below a changed widget
Full-script rerun by default; optional fragments
Functions and event listeners connect inputs to outputs
Explicit callbacks connect component properties
High-level reactive APIs plus lower-level callbacks
Renders a notebook with ipywidgets callbacks
GUI events plus pipelines, data nodes, and scenarios
Dependency-based reactive notebook execution
“Existing notebook” means the framework can use an .ipynb file as the application source. Some script-based tools can be demonstrated inside Jupyter without using the notebook itself as the deployed app.
Mercury in one minute
Mercury is the option in this guide built around keeping a Jupyter notebook readable, editable, and useful as the application itself.
Your existing notebook remains the source. Mercury also works with the ipywidgets already in it.
Read a widget value normally. Mercury re-runs the cells below it without callback wiring.
Set the theme, sidebar, code visibility, and shared-password protection as part of publishing.
Publish from MLJAR Studio to MLJAR Cloud, including one free public app, or self-host with Docker.
Balanced reviews
Every option has a strong use case and a real tradeoff. The useful question is which tradeoff matches your project.
Mercury turns the Jupyter notebook you already have into a web app. Existing ipywidgets continue to work, or you can add Mercury widgets that re-run the cells below them without callbacks. Styling, code visibility, password protection, and publishing are part of the same notebook-first workflow.
Best for
Existing Jupyter notebooks that need to become styled dashboards, reports, forms, or password-protected tools.
Consider something else if
Your work is not already in Jupyter, or you need pipeline and scenario orchestration as part of the framework itself.
Streamlit popularized the fast path from a Python script to a shareable data app. Its default execution model reruns the script from top to bottom after an interaction, supported by caching and session state. Modern Streamlit also offers fragments that can rerun independently, so full-app reruns are no longer the only option.
Best for
A quick script-based app, an established component ecosystem, and straightforward Community Cloud deployment.
Consider something else if
You want to serve existing notebooks directly, or prefer dependency-based notebook reactivity without organizing code into fragments.
Gradio builds interfaces around Python functions with Interface, Blocks, components, and event listeners. It now supports much more than small demos, including chat, multimedia, tabular apps, workflows, and custom layouts. Its close integration with Hugging Face Spaces remains a major practical advantage for sharing model-driven applications.
Best for
ML demos, chat interfaces, multimedia inputs, and projects already connected to the Hugging Face ecosystem.
Consider something else if
You want the notebook itself to remain the application source, or prefer one notebook-native model across reports, dashboards, and tools.
Dash combines React components and Plotly.js with a Python server backend. Flask is the default, with additional server backends supported in current Dash versions. A declarative layout and explicit callbacks provide detailed control over complex interactions, with commercial hosting and enterprise tooling available from Plotly.
Best for
Production analytical applications that need precise callback control, Plotly integration, and enterprise options.
Consider something else if
You want the shortest learning curve, do not want to maintain callbacks, or need to keep an existing notebook as the app.
Panel is part of the HoloViz ecosystem and supports both high-level reactive APIs and lower-level callback-based control. It works in notebooks and regular Python files, supports many plotting libraries, and offers unusually broad output and deployment choices, including server applications, static pages, and client-side Pyodide builds.
Best for
HoloViz or Bokeh users who want flexible layouts, broad plotting support, and several levels of control.
Consider something else if
You want a very small API surface. Panel provides considerable flexibility, but there are more concepts to learn.
Voilà renders a Jupyter notebook as a standalone application and hides input cells by default. Each connected user receives a dedicated Jupyter kernel, while interactivity is provided through ipywidgets callbacks. It is intentionally close to the notebook model and does not require a separate application script.
Best for
Sharing an existing notebook and its ipywidgets with the smallest possible conceptual change.
Consider something else if
You need an opinionated widget system, managed deployment, or more built-in control over application structure and styling.
Taipy is a full-stack framework for data and AI applications. Its scope extends beyond user-interface components to data nodes, task orchestration, scenarios, what-if analysis, and execution tracking. That makes it a different kind of alternative: the framework can manage both the application interface and the workflow behind it.
Best for
Applications that need pipeline execution, scenario comparison, or production workflow management beside the UI.
Consider something else if
You are starting with an existing Jupyter notebook and only need a straightforward way to share its analysis.
marimo is a reactive notebook environment stored as pure Python. When a cell or UI element changes, dependent cells update automatically, and no callbacks are required. The notebooks can run as scripts or applications and can execute in the browser through WebAssembly. Jupyter notebooks can be converted, but marimo uses its own format and runtime.
Best for
New projects that want reactive execution, git-friendly notebooks, SQL support, and a pure-Python file format.
Consider something else if
You need to keep a library of .ipynb notebooks unchanged rather than converting and adopting another notebook environment.
Decision guide
Start with your current code, deployment needs, and preferred interaction model.
FAQ
Mercury starts from a Jupyter notebook and re-runs the cells below a changed widget. Streamlit starts from a Python script and reruns the full script by default, although current Streamlit versions also support fragments that can rerun independently.
Yes. Both projects are open source under the Apache-2.0 license and can be self-hosted. Mercury offers optional MLJAR Cloud hosting, while Streamlit offers Community Cloud.
Mercury and Voilà keep an existing .ipynb file as the deployed application source. Panel can work in notebooks too, but applications are composed with Panel components and served by Panel. marimo can convert a Jupyter notebook, but the result uses marimo’s own pure-Python notebook format.
marimo is the closest conceptually because both provide reactive execution without callbacks. Mercury re-runs cells below a widget in an existing Jupyter notebook; marimo tracks dependencies in its own pure-Python notebook format.
Gradio is often the most direct choice, particularly for model inputs and outputs, chat or multimedia interfaces, and deployment to Hugging Face Spaces.
Keep your analysis in Jupyter, add styling and password protection, then publish from MLJAR Studio to one free public app or deploy Mercury with Docker.
pip install mercury