A Folium map your reader can actually pan
The map is done: markers sized, popups written, the story in the geography. Then someone flattens it into a PNG for the group chat, and nobody can zoom into their own neighbourhood. Folium's HTML export is the same map, fully interactive. It just needs somewhere to live.
Drop your Folium report here — get a live link
.zip, folder, or single .html — free, no account, live for 30 days.
The artifact dead-end
A screenshot of a map misses the point entirely: no zoom, no pan, no popups. Just a reader squinting at a frozen frame.
The "proper" routes (GeoServer, a tile pipeline, a hosted dashboard) are answers to a much bigger question than "can you look at this."
Two lines to a live link
Build your output like you already do, then hand the folder to the action:
Save the map as HTML
m.save("map.html").github/workflows/ci.yml
- uses: bitgate/ship-page-action@v1
if: always()
with:
path: map.htmlOr with plain curl — no account needed
curl -fsS -X POST https://ship.page/deploy \
-H "Content-Type: text/html" \
--data-binary @map.html | jq -r .urlpath: map.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
- m.save("map.html") writes one self-contained file (Leaflet from the CDN, your markers and popups embedded). Upload it; the link is live.
- Verified when served as a plain static file: panning, zooming, tooltips, popups, and the fullscreen plugin all work. Zero console errors.
- Tiles stream from OpenStreetMap's servers at view time (readers need internet access). Heavy public traffic should bring its own tile source per OSM's usage policy.
- Skip tile providers that now want keys. Default OpenStreetMap just works; others (CartoDB included) require an API key, and folium warns at save time.
- For charts rather than geography, the Plotly route on this site is the same drill: export, upload, link.
Downloadable example
Six stations, one interactive map
A folium map of sample passenger numbers — circle markers, tooltips, popups and a fullscreen button — saved with m.save() and verified to pan and zoom when served as a static file.
Questions
Is the hosted map actually interactive?
Yes. The export embeds Leaflet and your layers directly. Pan, zoom, marker popups, and layer controls all run client-side in the reader's browser (where they belong). Tested on a real export with tooltips, popups, and a fullscreen button—served statically, zero console errors.
Do the map tiles always load reliably?
Tiles are fetched from a tile server at view time. The default OpenStreetMap layer needs no key and works out of the box—though if you expect serious traffic, OSM's acceptable-use policy says bring your own tiles. Some providers — CartoDB among them — now require an API key, which folium passes through as a tiles option.
Can I render the map without leaking the raw data?
No. Whatever is on the map sits right in the HTML: markers, coordinates, and popup content are plainly readable in page source. The link is unguessable and noindexed, but public to anyone holding it.
What's the maximum map size?
Single-file uploads cap out at 10 MiB (plenty for tens of thousands of markers). Past that, reach for MarkerCluster at save time to slim the file, or zip the map together with its assets.
Do plotly-based maps and choropleths work?
Same flow: fig.write_html("index.html", include_plotlyjs=True) and upload. The Plotly page on this site covers the bundling options in detail.
Related recipes
- Jupyter: Send a notebook to someone who doesn't run Jupyter
- marimo: Share a marimo notebook as a link. Snapshot or interactive.
- Single HTML file: One HTML file, one POST, one URL
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.