Skip to content

Marimo vs Jupyter: Why Switch for Python Data Science?

I’ve been using Jupyter Notebooks for data exploration for years, but I always felt something was missing. Last week, I decided to try Marimo for a personal project—building a weight tracking dashboard with Polars. The experience was so transformative that I completed the entire dashboard in under 20 minutes, and more importantly, I finally felt in control of my project.

The Productivity Problem with Jupyter

If you’ve worked with Jupyter, you know the pain. The hidden “cell execution order” bugs that appear when you run cells out of sequence. The scattered .ipynb files that are nightmares to version control. The unclear project structure that makes your data science folder look like a chaotic experiment.

But the worst part? The cognitive load. I constantly had to remember which cells I ran, in what order, and whether the current state of my variables was actually what I thought it was. This wasn’t just annoying—it was actively slowing me down.

For someone without a computer science background, these barriers make data science feel harder than it should be. You’re not just fighting the data; you’re fighting your tools.

Meet Marimo: The React-Driven Notebook

Marimo is different. It’s not just another notebook interface—it’s a reactive notebook that saves your work as standard Python files (.py), not JSON. This seemingly small change solves so many problems.

The core innovation is its reactive execution model. When you change a cell in Marimo, it automatically re-runs all dependent cells downstream. No hidden state, no execution order confusion, no “I forgot to run that cell three hours ago” bugs.

And because Marimo notebooks are just Python files, they’re Git-native from day one. No more merge conflicts on JSON. No more wondering what changed between versions. Just clean, readable diffs.

Real-World Transformation: A Non-CS Developer’s Story

Let me show you what I mean. I recently needed to create a dashboard to track my weight loss progress. In my old workflow, this would have taken me at least an hour of setup work.

My old stack: Jupyter + Quarto + Pandas + Poetry. The workflow was:

  1. Create a Jupyter notebook
  2. Import Pandas and load data
  3. Create some plots
  4. Export to Quarto for the dashboard
  5. Struggle with version control because .ipynb files are JSON
  6. Hope the dependencies work when I share it

My new stack: Marimo + Polars + UV. Here’s what happened:

I opened my terminal and created a new Marimo notebook:

Terminal window
uv init weight-tracker
cd weight-tracker
uv add marimo polars marimo-ui
uv run marimo edit app.py

Then I wrote my analysis:

import marimo
import polars as pl
@marimo.cell
def load_data():
df = pl.read_csv("weight_data.csv")
return df
@marimo.cell
def calculate_metrics(df):
metrics = (
df.lazy()
.filter(pl.col("weight") > 0)
.group_by("date")
.agg(
pl.mean("weight").alias("avg_weight"),
pl.col("weight").first().alias("start_weight"),
pl.col("weight").last().alias("current_weight")
)
.collect()
)
return metrics
@marimo.cell
def plot_progress(metrics):
import marimo as mo
return mo.ui.table(metrics)

When I changed the filter condition in calculate_metrics, Marimo automatically updated the table in plot_progress. No manual re-running, no hidden state, no confusion. The dashboard just worked.

Why Developers Are Switching: 5 Key Benefits

1. True Reproducibility

In Jupyter, I could run cells in any order, which meant my notebook might work for me but fail for someone else. Marimo’s reactive model guarantees a consistent execution order. Every run produces the same result, making collaboration and debugging significantly easier.

2. Git-Friendly Workflows

Marimo notebooks are valid Python files. This means:

  • Standard Git workflows work out of the box
  • Code review is straightforward
  • You can use any Git tool you already have
  • Merge conflicts are resolved with standard text diff tools

No more git diff showing you 500 lines of changed JSON formatting when you only edited one cell.

3. Faster Iteration Cycles

The combination of Marimo, Polars, and UV creates a remarkably fast development loop:

  • Marimo eliminates the need to manually re-run cells
  • Polars executes queries 5-10x faster than Pandas (especially on larger datasets)
  • UV resolves dependencies instantly compared to Poetry’s slower resolution

For data exploration, this means spending more time analyzing and less time waiting.

4. Better Project Control

Because Marimo notebooks are Python files, they fit naturally into a proper project structure:

project/
├── app.py # Marimo notebook
├── requirements.lock # UV lockfile
├── data/
│ └── weight_data.csv
└── output/

This is something that always felt awkward with Jupyter. I could structure my project however I wanted, but the .ipynb format never felt like “real code.” Marimo removes that psychological barrier.

5. Non-Programmer Friendly

Here’s what surprised me most: Marimo feels easier to use than Jupyter, even for someone without a CS background. The reactive model matches how I think—“when I change this data, update everything that depends on it.” I don’t have to understand execution graphs or DAGs. I just write code, and Marimo figures out the dependencies.

The Marimo + Polars + UV Stack Advantage

What makes this stack particularly powerful is how each tool addresses a different pain point:

Marimo handles the interactive development experience with its reactive model, eliminating cell execution order bugs and providing instant feedback.

Polars accelerates data manipulation with its lazy evaluation and query optimization. For someone who learned data science with Pandas, Polars feels more intuitive—the syntax reads like natural language.

UV (from the creators of Rye) makes dependency management trivial. No more waiting five minutes for Poetry to resolve dependencies. UV is essentially instant.

Together, they form a modern Python data science stack that’s faster, more reliable, and easier to maintain than the traditional Jupyter + Pandas + Poetry workflow.

Making the Switch: Quick Start Guide

If you’re considering the switch, here’s how I recommend starting:

Installation:

Terminal window
pip install uv marimo polars

Create your first notebook:

Terminal window
uv init my-project
cd my-project
uv add marimo polars
uv run marimo edit app.py

Convert existing Jupyter notebooks: Marimo provides an import tool:

Terminal window
marimo convert notebook.ipynb > app.py

Common gotchas to avoid:

  1. Don’t try to manually run cells in order—let Marimo’s reactive model handle it
  2. Remember that @marimo.cell decorators are required, not optional
  3. Use uv run instead of python to ensure your virtual environment is active

When Jupyter Still Makes Sense

I don’t want to suggest Marimo is perfect for everyone. Jupyter still has advantages:

  • Quick data exploration only: If you just need to check a CSV and close it, Jupyter is simpler
  • Collaborative notebooks: Many online platforms (like Google Colab) use Jupyter
  • Legacy workflows: If your team already has hundreds of Jupyter notebooks, switching costs might outweigh benefits

The key is to choose based on your goals, not trends.

Conclusion: Choose Based on Your Goals

Switch to Marimo if you value:

  • Productivity and faster iteration cycles
  • Git-friendly version control
  • Reproducible analysis
  • Clear project structure
  • Modern Python tooling

Stay with Jupyter if you:

  • Only need quick, one-off data exploration
  • Rely heavily on Jupyter-specific platforms
  • Work with teams that have extensive Jupyter infrastructure

For me, the decision came down to one moment: after building my weight tracking dashboard in 20 minutes, I realized I wasn’t just excited about the tool—I was excited to spin up new projects. That’s the feeling I’ve been chasing since I started data science, and Marimo finally delivered.

Final Words + More Resources

My intention with this article was to help others share my knowledge and experience. If you want to contact me, you can contact by email: Email me

Here are also the most important links from this article along with some further resources that will help you in this scope:

Oh, and if you found these resources useful, don’t forget to support me by starring the repo on GitHub!

Comments