Run marimo reactive notebooks on Amazon SageMaker Studio Lab and SageMaker Studio
Project description
marimo on Amazon SageMaker
Run marimo, the reactive Python notebook, on Amazon SageMaker Studio and Studio Lab.
โก One-Command Setup
For SageMaker Studio Lab (free, no AWS account required):
curl -fsSL https://raw.githubusercontent.com/scttfrdmn/aws-sagemaker-marimo/main/bootstrap.sh | bash
Then start marimo:
~/start-marimo.sh
๐ Full Bootstrap Guide | โ๏ธ Manual Setup
โ ๏ธ Known Limitation: WebSocket on SageMaker Studio Lab
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
๐ Quick Start (5 Minutes)
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.
๐ What's Included
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
-
๐ Demo Notebook
- Complete ML workflow
- Interactive data exploration
- Model training with reactive parameters
- SageMaker integration examples
๐ฏ Choose Your Path
Path 1: Just Try It (Fastest)
Perfect for: Learning, experimenting, quick demos
- Get free SageMaker Studio Lab account
- Follow QUICKSTART.md
- Try the sample notebook
- Total time: ~10 minutes
Path 2: Manual Setup on Studio/Studio Lab
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
Path 3: Production Deployment
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
๐ก Why marimo?
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
๐๏ธ Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ SageMaker Studio / Studio Lab โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ JupyterLab Environment โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ jupyter-server-proxy โ โ โ
โ โ โ โ โ โ โ
โ โ โ marimo server (:2718) โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ฆ Repository Structure
.
โโโ 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)
๐ Sample Notebooks
Quick Demo
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}")
SageMaker Integration
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.
๐ข Deployment Options
Option 1: Terraform
cd terraform
terraform init
terraform apply
Creates:
- SageMaker Studio Domain
- VPC and security groups
- IAM roles
- Lifecycle configuration for marimo
- S3 bucket for artifacts
Option 2: AWS CDK
cd cdk
pip install -r requirements.txt
cdk deploy
Same infrastructure as Terraform, using Python CDK constructs.
Option 3: Manual (Quickest)
See QUICKSTART.md - just pip install marimo and go!
๐ฐ Cost Comparison
| 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.
๐ง Maintenance
Updating marimo
Studio Lab / Manual:
pip install --upgrade marimo
With Lifecycle Config:
Update the version in install-marimo.sh and redeploy lifecycle configuration.
Cleanup
Terraform:
terraform destroy
CDK:
cdk destroy
Manual: Just stop using it - no infrastructure to clean up!
๐ค Use Cases
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
๐ marimo vs Jupyter
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.
โ Troubleshooting
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
๐ฏ Next Steps
- โ 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
๐ Features Showcase
Reactive Execution
# 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!
Git-Friendly
# Clean diffs, no JSON
git diff notebook.py
# Run as script
python notebook.py
# Deploy as app
marimo run notebook.py
Interactive UI
# No callbacks needed!
dropdown = mo.ui.dropdown(['A', 'B', 'C'])
table = mo.ui.table(dataframe)
plot = mo.ui.plotly(figure)
๐ License
This repository: MIT License
marimo: Apache 2.0 License
๐ Acknowledgments
- marimo team - for building an amazing reactive notebook platform
- AWS SageMaker team - for creating a flexible ML platform
- Community - for feedback and contributions
๐ฌ Support
- Issues: Open an issue in this repository
- marimo Discord: https://marimo.io/discord
- AWS Support: https://aws.amazon.com/support/
๐ Documentation
- 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
๐ Project Info
- Version: 0.1.0 (Semantic Versioning)
- License: MIT
- Copyright: ยฉ 2026 Scott Friedman
- Changelog: Keep a Changelog format
๐ค Contributing
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-sagemaker-marimo/main/bootstrap.sh | bash
๐ Or manual: QUICKSTART.md
๐ Deep dive: Full blog post
Happy reactive coding! ๐
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aws_sagemaker_marimo-0.2.0.tar.gz.
File metadata
- Download URL: aws_sagemaker_marimo-0.2.0.tar.gz
- Upload date:
- Size: 33.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.23
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ebc42070b17d041ed83edabbce7913402c8ac6148a5f88bd687ca6a3662c007d
|
|
| MD5 |
620708507a099d990825120f68060ffe
|
|
| BLAKE2b-256 |
4dcc5ccb141b56c495c17b13f0e175c702ba002ef93311622ee74f2b4eaf40bd
|
File details
Details for the file aws_sagemaker_marimo-0.2.0-py3-none-any.whl.
File metadata
- Download URL: aws_sagemaker_marimo-0.2.0-py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.23
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d7a4c83814749076a1b1da09d05b7a562799a6b525b891020f0a1abfd94c9f2a
|
|
| MD5 |
1abc6cfb309c972175de3a33f0136150
|
|
| BLAKE2b-256 |
2905b89f9d1cf73203b2e5bf8a223343a79305acd5e6423d50bc24204ca6c0f0
|