💬 Feedback
Built by Marek Pizner
Saturn
v0.1.13 Early Access

SATURN LAB

Open a repo with 10+ notebooks.
See what each one does, what runs first, and which experiment to trust.

Run it with Docker See the product
scroll

The canvas your Jupyter notebooks never had.

Point Saturn at your existing notebook folder. It discovers every file in place — no imports and no hidden copies — and gives it a card on one visual board. Add context, organize customizable swim lanes, connect execution and data flow, fork an experiment, then rerun it when you return.

Problem

"There are 14 notebooks in this repo. Which one starts the experiment? What does 07_final_v3 actually do? Nobody remembers."

Solution

A canvas. Every notebook a card. The whole project in one view.

Existing files appear automatically. Put one into a swim lane and Saturn moves it into the matching host folder. Add a one-line explanation, then connect the order and data flow. The structure is obvious at a glance.

localhost
Project
Customer Analytics
▶ Run pipeline
Data Sources
churn_data.csv
45,231 rows · 28 cols · host file
↑ Upload CSV / Parquet (multi)
🗄 Connect database
🔑 Secrets
Notebooks & Scripts
Runs all →
#8main pipelinejust now
#7main pipeline1h ago
🧠
3 models
1 in production
⬡ SATURN LAB
| Customer Analytics 📊 Experiments 🧠 Models admin · ADMIN
+ New Notebook ▾ Layout ⊞ Tidy board ⛶ Fit ⚙ Lanes Tools ▾
DATA SOURCES
NOTEBOOKS
PROCESSING
EXPERIMENTS
📄CSV
churn_data.csv
45,231 rows · 28 cols
customer_id · churn · tenure · +25 cols
data/churn_data.csv
Notebook
01_data_inventory
notebooks/01_data_inventory.ipynb
Lane Notebooks · Change ▾
↗ Open
Processing
feature_engineering
feature_engineering.ipynb
Lane Processing · Change ▾
Rolling features, lag vars, encode categoricals
📋
↗ Open
eng_features.parquet
rows: 45,231
columns: 35
Experiment
xgb_classifier
xgb_classifier.ipynb
r2 0.924 f1 0.920
Lane Experiments · Change ▾
n_estimators=400, lr=0.05
📋
↗ Open
Experiment
lgbm_classifier
lgbm_classifier.ipynb
r2 0.931 ★ f1 0.928 ★
Lane Experiments · Change ▾
LightGBM with early stopping
📋
↗ Open
Experiment
rf_classifier
rf_classifier.ipynb
r2 0.891 f1 0.887
Lane Experiments · Change ▾
Random Forest baseline
📋
↗ Open
Problem

"We tried XGBoost with three different feature sets last month. Which one gave 0.92 f1? It's in someone's head."

Solution

Every run tracked. Best result highlighted.

saturn.log(f1=0.920, rmse=0.043) — that's it. Compare the latest metrics, inspect trends and lineage, or switch to the sortable table. No spreadsheet, no Slack thread.

localhost / experiments
← Canvas
Experiments
8 runs
📊 Dashboard📋 Table
● Baseline● Extended Features
BaselineExtended Features accuracy ↑0.9240 ↑.0060.9471 ★ auc_roc ↑0.96820.9813 ★ f1 ↑0.90640.9204 ★
accuracy ↑
auc_roc ↑
f1 ↑
#8Jul 30, 14:20 · 18m 04saccuracy 0.9471 ↑
#7Jul 29, 10:42 · 14m 52saccuracy 0.9410
Problem

"New data arrived. Now open this notebook, then that one, then the other three — in the right order. Hope you don't forget one."

Solution

Press ▶ once. Walk away.

Saturn runs every notebook in dependency order, automatically. Live status on every card, logs on every step. No Airflow. No orchestration config. Just your notebooks.

localhost — run #8 in progress
Project
Customer Analytics
◌ Running pipeline…
2/4   xgb_classifier
Data Sources
churn_data.csv45,231 rows
↑ Upload CSV / Parquet (multi)
🗄 Connect database
🔑 Secrets
Notebooks & Scripts
Runs all →
#8main pipelinejust now
#7main pipeline1h ago
⬡ SATURN LAB
| Customer Analytics 📊 Experiments 🧠 Models admin · ADMIN
+ New Notebook ▾ Layout⊞ Tidy board⛶ Fit⚙ LanesTools ▾
DATA SOURCES
PROCESSING
EXPERIMENTS
📄CSV
churn_data.csv
45,231 rows · 28 cols
customer_id · churn · tenure · +25 cols
data/churn_data.csv
Processing
feature_engineering
feature_engineering.ipynb
Lane Processing · Change ▾
Completed in 4m 12s
📋
↗ Open
eng_features.parquet
rows: 45,231
columns: 35
Experiment
xgb_classifier
xgb_classifier.ipynb
Lane Experiments · Change ▾
n_estimators=400, lr=0.05
📋
↗ Open
Experiment
lgbm_classifier
lgbm_classifier.ipynb
Lane Experiments · Change ▾
LightGBM with early stopping
📋
↗ Open
Experiment
rf_classifier
rf_classifier.ipynb
Lane Experiments · Change ▾
Random Forest baseline
📋
↗ Open
Problem

"The model in prod is degrading. Which dataset trained it? Which feature engineering? Which run from six weeks ago?"

Solution

Every model traces back to everything.

saturn.register_model(clf, name="churn_v3") — one line. Saturn links the model to the exact run, data snapshot, params, and notebook that produced it. Debug drift in minutes.

localhost / models
← Canvas
Model Registry
3 models 1 in production saturn.register_model(clf, "name")
🔵
churn_predictor
sklearn · Customer Analytics · v3 in production
v3 v2 v1
v3
production
accuracy 0.9471 ★ auc_roc 0.9813 ★ f1 0.9204 ★
max_depth=5 n_estimators=400
churn_data.csv · Jul 30 · 2.4 MB · from xgb_classifier · run #8
Open pipeline
→ archived
×
v2
staging
accuracy 0.9440 auc_roc 0.9791 f1 0.9172
max_depth=4 n_estimators=300
churn_data.csv · Jul 28 · 2.1 MB · from xgb_classifier · run #7
Open pipeline
→ production
×
Select 2 versions to compare metrics and deltas.
Everything you need. Nothing you don't.
🔎
Discover existing notebooks
Point at a host folder and Saturn opens the repository automatically. If it finds requirements, you choose whether to install them; notebooks open directly in JupyterLab.
📓
One click to JupyterLab
Every notebook card has an ↗ Open button that drops you straight into JupyterLab. Work the way you already do — nothing new to learn.
Fork an experiment
Select one notebook or a connected branch and fork it. Saturn copies the real code and internal connections while leaving the original experiment untouched.
🗄️
Connect any database
Import data from PostgreSQL, MySQL, or MSSQL with a SQL query. Result saved as a versioned Parquet snapshot and wired into your pipeline automatically.
📋
Notebook templates
Bootstrap any node with built-in templates for EDA, feature engineering, classification, regression, and model registration. One click, ready to run.
🔒
Fully self-hosted
One docker compose up command. Your models, data, and experiments stay on your infrastructure — never on a third-party cloud.
👥
Multi-user with admin panel
Create team accounts and manage roles. A first-run setup screen creates your admin securely, with a built-in admin page for ongoing account management.
🎨
Customizable canvas
Create, rename, recolor, and remove lanes safely. Folders stay readable, deleted-lane notebooks move to Notebooks, and cards resize to fit long names.
Install

Running in
three commands.

Self-hosted from public Docker images. On your laptop, your server, or any cloud — your data never leaves your infrastructure.

# 1 · grab the compose file + env template
$curl -L -O https://saturnlab.pizner.com/downloads/docker-compose.prod.yml
$curl -L -o .env https://saturnlab.pizner.com/downloads/saturn.env.example

# 2 · set SECRET_KEY (and PORT / JUPYTER_PORT if you like)
$nano .env

# 3 · launch and print the actual clickable address
$docker compose -f docker-compose.prod.yml up -d && \
  SATURN_PORT="$(docker compose -f docker-compose.prod.yml port frontend 80 | tail -n 1 | sed 's/.*://')" && \
  echo "Saturn Lab → http://localhost:${SATURN_PORT}"
Free for noncommercial use
Free
Self-hosted under the PolyForm Noncommercial license. Personal projects, study, research, education, nonprofits, and government use are welcome.
Open Saturn Lab → Read the docs → Send feedback

Self-hosted · Configurable ports · Your data stays yours · No vendor lock-in