Share a marimo notebook as a link. Snapshot or interactive.
marimo notebooks are reactive — move a slider and every dependent cell re-runs. Sharing one used to mean marimo's own cloud or a server you babysit. The built-in exporters change that: export a static HTML snapshot for the free link, or a WebAssembly build that keeps the whole notebook interactive for anyone with the URL.
Drop your marimo report here — get a live link
.zip, folder, or single .html — free, no account, live for 30 days.
The artifact dead-end
Sending the .py file assumes the reader has marimo installed, the data present, and the patience to run it. Most readers just want the results (or one slider to play with).
Standing up a hosted marimo server for a single report means auth, uptime and a bill. Infrastructure nobody asked for.
Two lines to a live link
Build your output like you already do, then hand the folder to the action:
Export the notebook as HTML
marimo export html notebook.py -o index.html.github/workflows/ci.yml
- uses: bitgate/ship-page-action@v1
if: always()
with:
path: index.htmlOr with plain curl — no account needed
curl -fsS -X POST https://ship.page/deploy \
-H "Content-Type: text/html" \
--data-binary @index.html | jq -r .urlpath: index.html deploys exactly what the tool wrote — no detection to configure. The link goes in the job summary — add comment: true and it lands on the pull request too.
What you get
- marimo export html writes a single self-contained file with code and outputs baked in. Upload it; the link is live.
- Widgets freeze into their last state in the static export, and the page says so. An honest snapshot (which is usually what a report needs).
- marimo export html-wasm keeps the notebook fully interactive — Python runs in the reader's browser — but the export is a whole folder: roughly 700 files for a small notebook, over the free 100-file zip cap, so that path needs a paid API key (900 files per request)
- Verified both ways on a real notebook. The static export renders code, tables, and charts exactly as saved; the wasm export boots, executes, and reacts. All served as plain static files (no backend required).
- Anonymous links live 30 days (claim them for 90). Or redeploy one named URL on a schedule from CI.
Downloadable example
A reactive notebook. Frozen at export time.
A small wind-farm analysis exported with the exact command above—code, the slider's last state, the computed table, and the chart, all in one file. The wasm variant of this notebook stayed interactive when we served it (no server-side runtime required).
Questions
Which export do you actually need?
Static html when the reader needs the results, not the knobs: one file, one free link, done. Pick html-wasm when interactivity is the point—sliders, inputs, and reactive cells all run in the reader's browser, no server required. That wasm export is a folder of roughly 700 files, though, so it needs a paid plan's higher file cap.
Is the static export actually interactive?
No. It's an honest snapshot: code, outputs, tables, and charts frozen as rendered. Sliders stay visible, but they don't re-run anything (and the export says so on the page). For live interactivity, use html-wasm.
Does html-wasm require anything server-side?
Nothing from you — Pyodide runs Python in the reader's browser and the export bundles marimo's runtime. Package requirements download as wheels on first open, so expect that first load to take a few seconds.
Why not just share on marimo's own cloud?
marimo's cloud gives you a workspace with accounts and sharing rules. This is just a file on a URL. No workspace, no seats—and on a paid plan, the link can be password-protected.
Can visitors see your code?
Yes, in both exports. The notebook source ships inside the page (that's what makes wasm re-execution possible). Keep secrets in environment variables on your machine—never in the notebook.
Related recipes
- Jupyter: Send a notebook to someone who doesn't run Jupyter
- Streamlit: Share a Streamlit app without running a server
- Python coverage: Your Python coverage HTML report, as a link on every PR
Try it on your next run
Anonymous deploys need no account and no key — paste the step, get a link. When you want stable URLs that redeploy in place, an API key and a name are all it takes.
Need to share the report with someone outside GitHub? How to share a GitHub Actions artifact without a login.