Marimo adalah reactive notebook Python open-source yang menyimpan file sebagai .py murni dan secara otomatis menjalankan ulang sel yang bergantung pada variabel yang berubah. Pilihlah Marimo jika Anda butuh reproducibility, git-friendly diff, dan deployment sebagai web app. Tetap gunakan Jupyter jika seluruh tim, integrasi VSCode, dan ekosistem plugin (nbextensions, JupyterLab) sudah menjadi standar kerja Anda. Sebagai backend developer Python yang lama hidup dengan FastAPI, saya mulai serius memakai Marimo di awal 2026 karena satu alasan sederhana: notebook yang bisa saya uvicorn-kan dan review lewat pull request tanpa harus melihat JSON output metadata. Panduan ini membandingkan keduanya secara jujur, dengan contoh kode nyata, benchmark, dan skenario migrasi.
Marimo menggunakan reactive execution model: mengubah nilai di satu sel otomatis memicu sel dependen, mirip spreadsheet. Berbeda dengan Jupyter yang linier dan menyimpan hidden state.
File Marimo adalah Python murni (.py), bukan JSON. Diff Git bersih, bisa di-review lewat pull request, dan dapat dijalankan sebagai script biasa dengan python notebook.py.
Jupyter tetap unggul dalam ekosistem: dukungan kernel bahasa lain, JupyterLab extension, integrasi VSCode/Colab, dan ratusan library viz yang sudah dites di sana.
Marimo 0.10+ (rilis Q2 2026) mendukung uv sandboxing, WASM deployment via marimo export html-wasm, dan mode aplikasi dengan mo.App.
Migrasi bertahap dimungkinkan: marimo convert notebook.ipynb mengkonversi 80–90% sel otomatis, sisanya perlu refactor karena aturan single-definition per variabel.
Apa Itu Marimo dan Mengapa Muncul di 2026?
Marimo adalah open-source Python notebook yang dirilis oleh tim eks-Google Brain pada 2023, dan mencapai maturity di 2026 setelah rilis versi 0.10. Berbeda dengan Jupyter yang menyimpan sel dan output dalam file .ipynb berformat JSON, Marimo menyimpan seluruh notebook sebagai file Python murni. Ini bukan sekadar detail teknis. Implikasinya besar: notebook Anda bisa dijalankan lewat python notebook.py, di-import sebagai module, di-review lewat pull request tanpa noise metadata, dan dijalankan di CI/CD tanpa Papermill atau nbconvert.
Alasan Marimo booming di 2026 sederhana. Reproducibility crisis di notebook Jupyter akhirnya diakui secara luas. Studi dari Rensselaer Polytechnic Institute (RPI) tahun 2023 menemukan bahwa lebih dari 36% notebook publik yang mereka evaluasi tidak dapat dieksekusi ulang sesuai urutan sel yang tersimpan, biasanya karena hidden state, out-of-order execution, atau variabel yang bertabrakan. Ketika ekosistem MLOps semakin serius soal reproducibility (Delta Lake, MLflow, DVC), notebook Jupyter mulai terasa seperti liability. Marimo dirancang dari nol untuk mengatasi ini dengan reactive graph, deterministic execution, dan file format yang human-readable.
Honestly, dari perspektif backend developer, saya melihat Marimo sebagai notebook yang diperlakukan seperti kode. Bukan draft coretan, bukan tempat sekali pakai, melainkan artifact yang bisa ditest, di-lint, dan di-deploy. Itu satu-satunya notebook yang saya izinkan masuk repository production tanpa merasa bersalah.
Marimo vs Jupyter: Tabel Perbandingan Cepat
Tabel di bawah merangkum perbedaan dimensi teknis yang paling sering ditanyakan tim saya sebelum memilih antara dua notebook ini. Data mencerminkan Marimo 0.10.x (Q2 2026) dan JupyterLab 4.3+ dengan Jupyter Server 2.14+.
Fitur
Marimo
Jupyter Notebook
Format file
Python murni (.py)
JSON (.ipynb)
Model eksekusi
Reactive (DAG dependency)
Manual, linier
Hidden state
Tidak mungkin (auto re-run)
Sering, sumber bug
Git diff friendly
Ya, diff kode saja
Buruk, JSON + metadata
Deploy sebagai script
python nb.py
Butuh nbconvert/Papermill
Deploy sebagai web app
Ya, mo.App + WASM
Butuh Voila/Streamlit
UI widget
Built-in mo.ui
ipywidgets (eksternal)
Kernel bahasa lain
Python saja
50+ kernel (R, Julia, Scala)
Integrasi VSCode
Terbatas (browser-first)
Native, sangat matang
Ekosistem plugin
Sedang tumbuh
Sangat matang, JupyterLab ext
Learning curve
Sedang (aturan reactive)
Rendah, familiar
Bagaimana Reactive Execution Marimo Bekerja?
Reactive execution adalah fitur inti Marimo yang paling sering ditanya. Cara kerjanya: Marimo memindai kode Anda untuk membangun dependency graph antar sel. Jika sel A mendefinisikan variabel df, dan sel B membaca df, maka B secara otomatis bergantung pada A. Saat Anda mengubah A, Marimo langsung menjalankan ulang B (dan semua sel dependen lain) tanpa perlu klik "Run All". Model ini sama dengan spreadsheet Excel: perubahan di sel A1 otomatis memicu recalculation di B1=A1*2.
Contoh konkret. Bayangkan notebook untuk analisis penjualan:
# Sel 1
import marimo as mo
import pandas as pd
df = pd.read_csv("sales.csv")
# Sel 2
threshold = 1000
# Sel 3
filtered = df[df["amount"] > threshold]
mo.md(f"Jumlah baris di atas threshold: **{len(filtered)}**")
Di Jupyter, kalau saya mengubah threshold = 5000 di Sel 2 lalu lupa menjalankan ulang Sel 3, output filtered tetap memakai nilai lama (stale). Ini sumber bug klasik yang menghabiskan waktu debugging. Saya pernah kena bug ini persis saat presentasi ke stakeholder, dan sejak itu selalu paranoid. Di Marimo, mengubah threshold otomatis memicu re-run Sel 3, dan Anda selalu melihat state konsisten dengan kode terakhir yang tersimpan.
Konsekuensi desain: Marimo melarang redefinisi variabel di sel berbeda. Anda tidak boleh menulis df = ... di dua sel. Jika perlu, gunakan nama berbeda (df_raw, df_clean) atau bungkus dalam function scope. Aturan ini terasa kaku di awal, tapi menghilangkan seluruh kelas bug hidden state. Dari pengalaman saya migrasi ~40 notebook internal, aturan ini yang paling banyak memaksa refactor, dan hasilnya notebook jadi jauh lebih mudah dipahami tiga bulan kemudian.
Untuk workflow eksplorasi data besar yang bergantung pada engine analitik cepat, kombinasi Marimo + DuckDB sangat kuat. Saya membahas pattern ini lebih dalam di panduan DuckDB Python untuk pandas dan Parquet, di mana query SQL yang mahal di-cache secara reactive dan tidak perlu re-run manual.
Masalah Hidden State di Jupyter dan Solusi Marimo
Hidden state adalah situasi di mana state kernel Jupyter tidak sesuai dengan urutan sel di file. Misalnya, Anda menghapus sel yang mendefinisikan x, tapi x masih ada di memori kernel, sehingga sel bawah masih "bekerja" padahal seharusnya error. Ketika kolega Anda meng-clone notebook dan menjalankan "Restart & Run All", notebook gagal. Anda malu, mereka frustrasi.
Marimo mengatasi ini dengan tiga mekanisme:
Auto-invalidation: Menghapus sel otomatis menghapus variabel dari kernel state, dan sel yang bergantung padanya langsung menampilkan error.
Deterministic ordering: Urutan eksekusi ditentukan oleh dependency graph, bukan urutan Anda mengklik. File yang sama = eksekusi yang sama, di mesin siapa pun.
No global mutation: Variabel single-definition memaksa Anda memisahkan concern per sel, membuat DAG bersih.
Untuk memperkuat reproducibility di sisi data, Anda tetap perlu validasi schema (Marimo tidak menangani ini). Saya biasanya memasang Pandera di sel awal setelah data loading. Baca panduan lengkap Pandera untuk validasi Pandas dan Polars untuk pattern schema-first yang saya pakai di production.
UI Widget dan Interaktivitas: mo.ui vs ipywidgets
Salah satu selling point Marimo adalah mo.ui, namespace built-in untuk widget interaktif. Anda tidak perlu install ipywidgets, tidak perlu %matplotlib widget, tidak perlu hack Voila. Widget di Marimo adalah first-class citizen dan otomatis terintegrasi dengan reactive graph.
import marimo as mo
import pandas as pd
df = pd.read_csv("sales.csv")
# Widget slider
slider = mo.ui.slider(start=100, stop=10000, step=100, value=1000, label="Threshold")
slider
# Sel berikutnya (akan re-run otomatis saat slider berubah)
filtered = df[df["amount"] > slider.value]
mo.md(f"Baris di atas **{slider.value}**: {len(filtered)}")
Perhatikan bahwa kita hanya perlu membaca slider.value. Marimo tahu bahwa sel filter bergantung pada slider dan otomatis menjalankan ulang saat user menggeser. Di Jupyter dengan ipywidgets, Anda harus setup callback manual, memasang @interact decorator, atau membungkus dalam observe() handler. Boilerplate lebih banyak, dan sering breaking di JupyterLab vs classic Notebook.
Widget yang tersedia mencakup slider, dropdown, multiselect, text, date, file uploader, table editable, form, tabs, dan dataframe filter. Ada juga mo.ui.altair_chart() dan mo.ui.plotly() yang membuat visualisasi jadi selection-aware: user klik titik di chart, Anda dapat data pilihannya di sel berikutnya. Ini pattern yang sangat sulit dibangun di Jupyter tanpa Panel atau Streamlit terpisah.
Untuk dashboard interaktif ringan (misal analisis EDA cepat untuk stakeholder non-teknis), Marimo bisa menggantikan Streamlit dengan satu file. Kalau Anda datang dari workflow automated EDA dengan ydata-profiling dan Sweetviz, Marimo memberikan level kontrol menengah: lebih terkurasi dari auto-report, lebih ringan dari full-blown Streamlit app.
Package Management: uv, Sandbox, dan Reproducibility
Rilis Marimo 0.9 (Q4 2025) memperkenalkan integrasi uv, package manager Python ultra-cepat dari Astral. Marimo bisa menyimpan dependency notebook langsung di header file .py menggunakan PEP 723 script metadata:
# /// script
# requires-python = ">=3.11"
# dependencies = [
# "marimo",
# "pandas==2.2.3",
# "duckdb==1.1.3",
# "altair==5.5.0",
# ]
# ///
import marimo as mo
import pandas as pd
# ... rest of notebook
Jalankan dengan marimo edit --sandbox notebook.py dan Marimo otomatis membuat isolated venv via uv, install exact versions yang dideklarasikan. Ini menghilangkan seluruh kelas masalah "works on my machine": notebook yang saya kirim ke rekan kerja akan berjalan dengan environment yang identik, tanpa Docker atau requirements.txt terpisah.
Jupyter tidak punya equivalent built-in. Anda bisa memakai jupytext untuk convert ke .py, atau jupyter-book untuk publish, tapi tidak ada satu perintah yang bilang "jalankan notebook ini dengan dependency yang tepat dalam sandbox". Anda perlu conda/pip environment terpisah, dan reproducibility bergantung pada disiplin tim mengelola environment.yml.
Untuk data pipeline yang serius soal reproducibility, saya kombinasikan header PEP 723 di Marimo dengan pyproject.toml untuk library helper. Notebook standalone, tapi tetap bisa import module bersama. Pattern ini bekerja bagus dengan CI/CD karena satu perintah uv run python notebook.py cukup untuk eksekusi headless.
Deployment: WASM, mo.App, dan Script Mode
Ada tiga mode deployment utama untuk notebook Marimo di 2026:
1. Script mode: python notebook.py
Karena file Marimo adalah Python murni, Anda bisa menjalankannya langsung sebagai script. Semua sel dieksekusi berurutan sesuai dependency graph, output cetak ke stdout. Ini pattern favorit saya untuk batch job: cron ke Marimo notebook untuk ETL harian, tanpa Papermill atau nbconvert.
2. App mode: marimo run notebook.py
Menjalankan notebook sebagai web app read-only (sel kode tersembunyi, hanya UI dan output yang tampil). Cocok untuk dashboard internal. Bungkus dengan mo.App jika ingin custom routing atau embed di FastAPI existing app, pattern favorit saya karena base backend kita sudah FastAPI.
from fastapi import FastAPI
from marimo import create_asgi_app
app = FastAPI()
marimo_app = create_asgi_app().with_app(path="/dashboard", root="notebook.py")
app.mount("/", marimo_app.build())
Kalau Anda sudah punya pipeline serving model ML lewat FastAPI, mounting Marimo sebagai dashboard operator internal enak sekali. Saya bahas pattern serving-nya di serving Scikit-Learn di production dengan FastAPI yang bisa dipadukan dengan dashboard Marimo ini.
3. WASM mode: marimo export html-wasm
Ini fitur paling berdampak di 2026. Marimo export ke file HTML standalone yang menjalankan Python di browser via Pyodide/WASM. Tidak butuh server, tidak butuh kernel, tidak butuh instalasi. Anda bisa upload ke GitHub Pages atau CDN dan share URL. Notebook sepenuhnya interaktif di browser user, dengan pandas, numpy, matplotlib semua bekerja. Ada limitasi (library dengan C extension tertentu tidak jalan di WASM), tapi untuk edukasi, demo, atau prototype interaktif ini luar biasa.
Jupyter punya JupyterLite yang berbasis konsep serupa, tapi setup lebih rumit dan bundle size lebih besar. Untuk single-file distribution, Marimo WASM lebih ergonomis.
Kapan Pakai Marimo, Kapan Tetap dengan Jupyter?
Setelah setahun memakai Marimo di production dan mempertahankan Jupyter untuk workflow tertentu, ini pedoman keputusan yang saya pakai.
Pilih Marimo jika:
Notebook akan masuk repository dan direview lewat pull request.
Anda butuh reproducibility (regulasi, riset, ML pipeline production).
Notebook akan dijalankan sebagai job/dashboard oleh sistem lain.
Anda ingin membangun mini web app interaktif tanpa Streamlit.
Tim Anda sudah nyaman dengan Python OOP dan aturan single-definition.
Tetap dengan Jupyter jika:
Eksperimen sekali pakai, coretan cepat yang tidak akan disimpan.
Berdasarkan pengalaman mengkonversi 40+ notebook internal, sekitar 80–90% sel terkonversi tanpa masalah. Sisanya biasanya butuh refactor karena tiga alasan:
Redefinisi variabel: Sel seperti df = df.dropna() lalu df = df.reset_index() harus dipisah menjadi df_clean = df.dropna() dan df_ready = df_clean.reset_index(), atau digabung dalam satu sel.
Mutable state across cells: Loop yang append ke list global harus dibungkus function atau dijadikan comprehension dalam satu sel.
IPython magic commands:%matplotlib inline tidak diperlukan; %%time diganti dengan Python context manager biasa; !pip install dipindah ke header PEP 723.
Strategi migrasi bertahap yang saya rekomendasikan: mulai dari notebook analitis kritis yang sering di-review kolega (di sinilah git diff bersih paling berharga), lalu notebook yang akan dijadikan dashboard, terakhir notebook batch ETL. Notebook eksplorasi lepas boleh tetap di Jupyter selamanya, tidak semua notebook perlu diperlakukan seperti kode production. Untuk deep-dive teknis, lihat panduan migrasi resmi Marimo yang mencakup pattern-pattern spesifik.
Untuk tooling MLOps tetangga (validasi, orchestration, feature store), Anda tidak perlu ganti apa pun. Marimo bekerja mulus dengan Pandera, Great Expectations, Prefect, dan MLflow. Notebook Marimo menjadi artifact yang di-track MLflow atau dieksekusi Prefect flow, bukan pengganti tool tersebut.
Pertanyaan yang Sering Diajukan
Apakah Marimo bisa menggantikan Jupyter sepenuhnya?
Untuk workflow Python murni yang menuntut reproducibility dan versioning, ya. Tapi Jupyter tetap unggul untuk kernel non-Python (R, Julia), integrasi Google Colab, dan ekosistem plugin JupyterLab. Banyak tim di 2026 memakai keduanya: Jupyter untuk sketching, Marimo untuk kode yang di-review.
Apakah Marimo gratis dan open source?
Ya. Marimo dirilis di bawah lisensi Apache 2.0 dan tersedia gratis di repository GitHub resmi. Perusahaan pengembangnya, Marimo Inc, sedang membangun produk cloud berbayar tapi core notebook tetap open source.
Bagaimana cara install Marimo?
Jalankan pip install marimo atau uv add marimo. Kemudian buka editor dengan marimo edit untuk notebook baru, atau marimo edit notebook.py untuk file existing. Marimo membuka browser secara otomatis di localhost:2718.
Apakah Marimo mendukung pandas dan Polars?
Ya, kedua library bekerja penuh tanpa konfigurasi khusus. Marimo bahkan menampilkan DataFrame secara interaktif (sortable, filterable) tanpa perlu widget tambahan. Untuk Polars, dukungan lazy execution juga berjalan mulus dan cocok dengan reactive graph Marimo.
Bisakah saya menjalankan Marimo di VSCode?
Marimo saat ini adalah browser-first, belum ada extension VSCode setara Jupyter Notebook. Namun karena file adalah Python murni, Anda bisa mengedit di VSCode dan menjalankan lewat terminal (marimo edit notebook.py) yang membuka browser. Extension eksperimental sudah ada di marketplace tapi belum stabil per Q3 2026.
Panduan praktis Optuna 4.x untuk tuning scikit-learn, XGBoost, dan LightGBM: TPE sampler, pruner, cross-validation, storage backend, multi-objective, sampai integrasi MLflow di pipeline production 2026.
Pandera 0.22 mengubah kontrak data jadi kode Python berbasis class. Panduan validasi Pandas dan Polars di pipeline produksi, dari DataFrameModel sampai integrasi dbt, Airflow, dan FastAPI.
Playbook production serving model scikit-learn dengan FastAPI: Pydantic V2, lifespan handler, micro-batching, ONNX Runtime, Uvicorn+Gunicorn, dan monitoring Prometheus untuk p99 di bawah 30 ms.