# Share a kepler.gl Map — The Export, With the Map Still Interactive

Canonical: https://commareports.com/share-kepler-gl-map
Published: 2026-09-14

> kepler.gl exports a self-contained HTML map with the data baked in. Publish it to Comma for a URL where the layers, filters and time playback still work.

# Share a kepler.gl map

A kepler.gl map is an argument made out of movement. The hexbin layer means
nothing until you drag the time slider; the point cloud means nothing until you
filter it. It is one of the few analysis artifacts where a screenshot is not a
lossy version of the thing — it is a different thing entirely, and a less
convincing one.

kepler.gl knows this, which is why the export is HTML and not PNG.

## Export

In the app: **Share → Export Map → HTML**. From Python, for maps a job
produces:

```python
from keplergl import KeplerGl

m = KeplerGl(height=700, data={"trips": df}, config=config)
m.save_to_html(file_name="map.html")
```

Either way the result is one self-contained file: your data, your layer
configuration, and the kepler.gl runtime.

## Publish it

Drop `map.html` into [Comma](https://commareports.com/), or from the job:

```python
import requests, os

requests.post(
    "https://commareports.com/api/v1/reports",
    headers={"Authorization": f"Bearer {os.environ['COMMA_API_TOKEN']}"},
    json={"title": "Trip density — March", "html": open("map.html").read()},
).raise_for_status()
```

Scripts run inside a sandboxed iframe (`allow-scripts`, no `allow-same-origin`),
so layer toggles, the time playback, tooltips and the 3D tilt all work at the
URL. See the [API reference](/docs/api).

## Two things to check before you publish

**The Mapbox token.** The export embeds the token the session used. Publishing
the file publishes the token, so use a public, URL-restricted token — not a
secret one — and rotate it if a broadly-shared map has been out for a while.

**The data.** The rows are baked into the file. For trip, delivery or device
data, that is location history, and location history de-anonymises people at a
rate most people underestimate. Aggregate to hexbins before export when the
finding is a pattern rather than a set of points, and set report access to
private or team — see [sharing & access control](/docs/sharing).

## Comments on the map

Geospatial findings get discussed by people who are not analysts: an operations
lead, a city partner, a planner. Anchored threads keep their question on the
map — "is this cluster the depot or a data artifact?" — rather than in an email
with a screenshot attached. See [commenting on HTML](/comment-on-html).

Republishing at the same report id when the data refreshes appends a revision,
so a month-over-month comparison is two points in one URL's history rather than
two files with confusing names.

## Limits

- **Entry HTML: 5 MB.** This is the real constraint: kepler.gl inlines the
  dataset, and a few hundred thousand points exceeds it easily. Aggregate,
  sample, or pre-bin — a hexbin layer over aggregated counts is usually both
  smaller and more readable than the raw points.
- Assets: 25 MB per file, **250 MB and 500 files total**.
- **60 requests/minute per token.**

## Try it

Comma is free — unlimited reports, unlimited commenters, unlimited revision
history.

**[Publish a map →](https://commareports.com/)**

### Related

- [Share a Folium map](/share-folium-map) · [Share a Leaflet map](/share-leaflet-map)
- [Share a pydeck map](/share-pydeck-map) · [Share a Plotly HTML chart](/share-plotly-html)
- [Share a D3 visualization](/share-d3-visualization) · [Interactive HTML reports](/interactive-html-reports)
