Share a Streamlit app without running a server
Sharing a Streamlit app usually means Community Cloud, a container on a VM, or someone's Snowflake login. A lot of ceremony. If the goal is just 'here, click this', there is a lighter route: stlite compiles the app into a single HTML file where Pyodide runs your Python in the viewer's browser. That file uploads here like any other.
Drop your Streamlit report here — get a live link
.zip, folder, or single .html — free, no account, live for 30 days.
The artifact dead-end
Community Cloud demands a GitHub repo and a public app by default. A container means keeping something patched, awake, and paid for. A lot of machinery for a dashboard six people will open.
The app already exists. It runs locally. The code was never the hard part—it’s the serving infrastructure shoved between your machine and someone else’s browser.
Two lines to a live link
Build your output like you already do, then hand the folder to the action:
Compile the app to one HTML file
npx @stlite/cli html ./my-app -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
- npx @stlite/cli html packs the entire project into a single HTML file: your app code embedded, the Streamlit runtime loaded from a pinned CDN build.
- Widgets, charts, and session state stay interactive. Python executes in the viewer's browser over WebAssembly, not on your machine.
- Verified on a real export served as a plain static file. Sliders, metrics, and line charts all work. Zero console errors.
- The first open takes a few seconds while the browser downloads the Python runtime and your requirements. Repeat visits come straight from cache.
- Anonymous links live 30 days. Pass an sp_ key and a name, and a recurring dashboard gets one stable URL.
Downloadable example
A triage dashboard. Runs right in your browser.
A support-ticket dashboard with a slider, metrics, and charts, compiled with the exact command above. First load downloads the Python runtime (give it a few seconds). Then move the slider.
Questions
Is it actually my app, or just a screenshot?
Your actual app. stlite is Streamlit running on Pyodide—the same widget and chart code executes right in the viewer's browser. Sliders slide, buttons re-run, metrics update. Nothing is pre-rendered.
What won't work in the browser?
None of this works without an actual server: st.secrets, direct database connections, background threads, and packages without a Pyodide build. Uploaded files land in the visitor's browser memory, not on your disk. If the app needs your machine, it needs real hosting—this route is strictly for self-contained apps.
How does this differ from share.stlite.net?
stlite's own sharing service encodes your app into a URL hash on their domain. Quick, sure, but the link depends entirely on their service and uptime. Exporting the HTML puts the file back in your hands: your link here, your expiry rules, and password protection on a paid plan.
Can visitors inspect my source code?
Yes. The app code is embedded in the HTML, fully readable from page source. Treat it as published. Never put credentials in the app (they wouldn't work from a browser anyway).
What's the maximum export size?
The HTML itself stays small—code is inlined, the runtime comes from the CDN—so you'll rarely hit the 10 MiB single-file limit. The real bottleneck is your requirements list: every package downloads as a wheel on first open, so heavy dependencies make that first load drag.
Does it work on mobile?
Yes. It's the same responsive Streamlit UI and the same Pyodide runtime in a mobile browser. Expect the first load to take longer over a phone connection.
Related recipes
- marimo: Share a marimo notebook as a link. Snapshot or interactive.
- Jupyter: Send a notebook to someone who doesn't run Jupyter
- Folium: A Folium map your reader can actually pan
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.