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:

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, or from the job:

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.

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.

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.

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 →

Related