Run marimo, the reactive Python notebook, on Amazon SageMaker Studio and Studio Lab.
For SageMaker Studio Lab (free, no AWS account required):
curl -fsSL https://raw.githubusercontent.com/scttfrdmn/aws-marimo-sagemaker/main/bootstrap.sh | bashThen start marimo:
~/start-marimo.sh📖 Full Bootstrap Guide | ⚙️ Manual Setup
marimo's home page loads but notebooks show blank cells or "connecting" status.
This is a known limitation of SageMaker Studio Lab's gateway/ALB infrastructure. HTTP proxying through jupyter-server-proxy works correctly — you can browse marimo's file list — but WebSocket connections (which marimo requires for cell execution) are dropped by the SageMaker gateway on /proxy/PORT/ paths. This affects all WebSocket-dependent proxied applications, not just marimo.
What works:
- ✅ marimo home page / file browser via
/proxy/2718/ - ✅ HTTP API requests through the proxy
- ✅ jupyter-server-proxy 4.4.0 (conda default) — no downgrade needed
What doesn't work (without the shim):
- ❌ Interactive notebook editing (requires WebSocket)
- ❌ Cell execution and reactive updates (requires WebSocket)
Workaround included: This repo uses ws-sse-proxy to translate WebSocket to SSE, making marimo fully functional on Studio Lab. See WEBSOCKET-STATUS.md for details, or just run:
bash start-marimo-shim.sh
# Then access at /proxy/2719/Tracking: marimo-jupyter-extension #8 and marimo #8060
Want to try marimo right now?
👉 Start with the Quick Start Guide - Get marimo running in 5 minutes on SageMaker Studio Lab (free!) or Studio.
This repository provides:
-
📖 Complete Blog Post (~2000 words)
- Deep dive into marimo's features
- Why use marimo on SageMaker
- Architecture overview
- Deployment strategies
- Best practices and troubleshooting
-
- 5-minute setup for Studio Lab (free)
- Easy installation for Studio
- Sample notebooks
- Troubleshooting tips
-
🔧 Infrastructure as Code
terraform/- Complete Terraform deploymentcdk/- AWS CDK (Python) deployment- Lifecycle configurations
- Sample notebooks
-
- Complete ML workflow
- Interactive data exploration
- Model training with reactive parameters
- SageMaker integration examples
Perfect for: Learning, experimenting, quick demos
- Get free SageMaker Studio Lab account
- Follow QUICKSTART.md
- Try the sample notebook
- Total time: ~10 minutes
Perfect for: Individual users, existing Studio environment
- Open SageMaker Studio or Studio Lab
- Run
pip install marimo jupyter-server-proxy - Start with
marimo edit --host 0.0.0.0 --port 2718 --no-token --headless - See QUICKSTART.md for details
- Note: On Studio Lab, WebSocket connections are blocked by the gateway — see known limitation
Perfect for: Teams, production workloads, persistent setup
- Read the blog post for architecture understanding
- Choose Terraform or CDK
- Deploy with one command
- Get automated, persistent marimo installation
Traditional Jupyter notebooks have well-known issues:
- ❌ Hidden state from out-of-order execution
- ❌ JSON format causes Git conflicts
- ❌ ~75% of notebooks on GitHub don't run
- ❌ Hard to reproduce research
marimo solves these problems:
- ✅ Reactive execution - cells auto-update when dependencies change
- ✅ Stored as pure Python - Git-friendly, executable as scripts
- ✅ No hidden state - deterministic, reproducible
- ✅ Interactive UI widgets - no callbacks needed
- ✅ Three tools in one - notebook, script, and web app
┌─────────────────────────────────────┐
│ SageMaker Studio / Studio Lab │
│ ┌───────────────────────────────┐ │
│ │ JupyterLab Environment │ │
│ │ ┌─────────────────────────┐ │ │
│ │ │ jupyter-server-proxy │ │ │
│ │ │ ↓ │ │ │
│ │ │ marimo server (:2718) │ │ │
│ │ └─────────────────────────┘ │ │
│ └───────────────────────────────┘ │
└─────────────────────────────────────┘
.
├── README.md # This file
├── QUICKSTART.md # 5-minute setup guide
├── BOOTSTRAP.md # One-command bootstrap guide
├── STUDIO-LAB-SETUP.md # Automated Studio Lab setup
├── BADGES.md # Badge options for READMEs
├── WEBSOCKET-STATUS.md # WebSocket proxy status & research
├── CONTRIBUTING.md # Contribution guidelines
├── CHANGELOG.md # Version history (Keep a Changelog)
├── LICENSE # MIT License
├── VERSION # Semantic version (0.1.0)
├── blog-post.md # Full blog post (~2000 words)
├── sagemaker_ml_demo.py # Complete demo notebook
├── bootstrap.sh # One-command setup script
├── start-marimo-shim.sh # Start marimo with WebSocket shim
├── studio-lab-setup.sh # Setup script with conda env
├── terraform/ # Terraform IaC (coming soon)
├── cdk/ # AWS CDK IaC (coming soon)
└── notebooks/ # Sample notebooks (coming soon)
import marimo as mo
# Interactive slider
slider = mo.ui.slider(0, 100, value=50)
# Automatically updates when slider changes!
result = slider.value ** 2
mo.md(f"Value: {slider.value}, Squared: {result}")import marimo as mo
import boto3
sagemaker = boto3.client('sagemaker')
# List training jobs
jobs = sagemaker.list_training_jobs(MaxResults=10)
# Interactive table
mo.ui.table(jobs['TrainingJobSummaries'])See sagemaker_ml_demo.py for a complete, production-ready example.
cd terraform
terraform init
terraform applyCreates:
- SageMaker Studio Domain
- VPC and security groups
- IAM roles
- Lifecycle configuration for marimo
- S3 bucket for artifacts
cd cdk
pip install -r requirements.txt
cdk deploySame infrastructure as Terraform, using Python CDK constructs.
See QUICKSTART.md - just pip install marimo and go!
| Option | Cost | Best For |
|---|---|---|
| Studio Lab | $0 (100% free) | Learning, small projects |
| Studio (manual) | ~$0.05-2/hour | Individual use, testing |
| Studio (IaC) | ~$1-5/hour | Teams, production |
marimo's lightweight architecture means minimal overhead costs.
Studio Lab / Manual:
pip install --upgrade marimoWith Lifecycle Config:
Update the version in install-marimo.sh and redeploy lifecycle configuration.
Terraform:
terraform destroyCDK:
cdk destroyManual: Just stop using it - no infrastructure to clean up!
marimo on SageMaker is perfect for:
- 🔬 Reproducible Research - Pure Python format, no hidden state
- 👥 Team Collaboration - Git-friendly, version-controlled notebooks
- 📊 Interactive Dashboards - Reactive UI updates, deploy as web apps
- 🚀 MLOps Pipelines - Run notebooks as scripts in CI/CD
- 🎓 Teaching & Demos - Predictable execution, professional output
- 🔍 Data Exploration - Interactive filtering and visualization
When to use marimo:
- ✅ Building dashboards or interactive apps
- ✅ Need reproducible, version-controlled research
- ✅ Want reactive, automatic updates
- ✅ Creating reusable modules or pipelines
- ✅ Teaching or presenting (no hidden state issues)
When to use Jupyter:
- ✅ Quick ad-hoc exploration
- ✅ Team heavily invested in Jupyter ecosystem
- ✅ Need specific Jupyter extensions
Best practice: Use both! Convert between formats as needed with marimo convert.
Common issues and solutions are in QUICKSTART.md.
Quick fixes:
- Can't access UI: Check proxy URL path
- Port in use: Use different port (
--port 8889) - Proxy not working: Run
jupyter serverextension enable --py jupyter_server_proxy
- ✅ Try the Quick Start (5 minutes)
- ✅ Read the blog post for deep dive
- ✅ Run the demo notebook
- ✅ Convert your Jupyter notebooks:
marimo convert notebook.ipynb - ✅ Deploy with infrastructure-as-code for production use
# Change slider, everything updates automatically
slider = mo.ui.slider(0, 100)
filtered_data = data[data['value'] > slider.value]
plot = create_plot(filtered_data) # Auto-updates!# Clean diffs, no JSON
git diff notebook.py
# Run as script
python notebook.py
# Deploy as app
marimo run notebook.py# No callbacks needed!
dropdown = mo.ui.dropdown(['A', 'B', 'C'])
table = mo.ui.table(dataframe)
plot = mo.ui.plotly(figure)This repository: MIT License
marimo: Apache 2.0 License
- marimo team - for building an amazing reactive notebook platform
- AWS SageMaker team - for creating a flexible ML platform
- Community - for feedback and contributions
- Issues: Open an issue in this repository
- marimo Discord: https://marimo.io/discord
- AWS Support: https://aws.amazon.com/support/
- Quick Start Guide - Get running in 5 minutes
- Bootstrap Guide - One-command automated setup
- Studio Lab Setup - Persistent conda environment
- WebSocket Status - WebSocket limitation details
- Blog Post - Complete guide (~2000 words)
- Badge Options - Add badges to your own projects
- Contributing - How to contribute
- Changelog - Version history
- Version: 0.1.0 (Semantic Versioning)
- License: MIT
- Copyright: © 2026 Scott Friedman
- Changelog: Keep a Changelog format
Contributions are welcome! Please read CONTRIBUTING.md for guidelines.
To contribute:
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
See CHANGELOG.md for version history.
Ready to get started?
👉 One command: curl -fsSL https://raw.githubusercontent.com/scttfrdmn/aws-marimo-sagemaker/main/bootstrap.sh | bash
👉 Or manual: QUICKSTART.md
👉 Deep dive: Full blog post
Happy reactive coding! 🚀