Strava Globe
Your entire Strava history as glowing tracks on a realistic 3D Earth.
Point it at the export zip Strava gives you, and you get a private, local globe (CesiumJS + satellite imagery) you can spin, zoom from orbit down to street level, and fly around:
- Every GPS track drawn on the globe, colored by activity type, with hover tooltips (name · date · distance · place) — click a track to fly to it.
- ▶ Tour mode: your activities are clustered into places, named via offline reverse geocoding, ordered by first visit — and the camera flies through your travel history stop by stop, with a card per place and a closing summary.
- Your photos, where you took them: pictures attached to activities show up on the activity card and on tour stops — click one for a full-size lightbox.
- Filters by activity type and year, satellite or street basemap, and an idle globe spin until you grab it.
- No accounts, no API keys, no upload. Your tracks never leave your machine.
The tour taking off: home base → Poznań → Vienna, the first three of 41 stops.
| From orbit to city… | …to street level |
|---|---|
Quickstart
-
Request your archive on strava.com: Settings → My Account → Download or Delete Your Account → Request Your Archive (the zip arrives by email).
-
Run (with uv, no install needed):
uvx strava-globe ~/Downloads/export_12345678.zip
or classically:
pip install strava-globe strava-globe ~/Downloads/export_12345678.zip
The globe builds and opens at http://localhost:8933. Next time, plain
uvx strava-globe reuses the last build (the generated data lives in your
user data directory; --port, --no-browser, and --data-dir are available).
How it works
The builder (strava_globe/tracks.py) reads activities.csv from the
export — zip or extracted folder — then for every activity file:
- decodes FIT with fitfast and GPX with a small XML parser (indoor activities without GPS are skipped),
- splits tracks at GPS dropouts (>500 m between fixes),
- simplifies each segment with Ramer-Douglas-Peucker (~5 m tolerance,
simplification), - tags the activity with its nearest city and country — offline GeoNames
lookup via
reverse-geocoder, - thumbnails any photos attached to the activity (EXIF-rotated, two sizes, Pillow) into your local data directory,
- and writes one compact
activities.json(~1.7 MB for 725 tracks / 1.9 M raw GPS points).
The web app (strava_globe/web/) is dependency-free: CesiumJS 1.131 from the
jsdelivr CDN, imagery streamed from Esri World Imagery (satellite) or
OpenStreetMap (streets), served by a stdlib static server with caching
disabled.
Controls
| drag / scroll | spin / zoom the globe |
| hover a track | tooltip with name, date, distance, place |
| click a track | fly to that activity |
T or ▶ Tour |
replay your travels place by place |
| space · ⏮ ⏭ / arrows · Esc | pause · previous/next stop · end tour |
| ⌂ Home | back to the full globe |
Privacy
Your GPS data stays local: the generated activities.json lives in your user
data directory (never in this repo or the package), and the app talks only to
the CDN and the map tile servers (which necessarily see which map areas you
view, as with any online map).
Notes
- Rendering quirk:
msaaSamples = 1anddynamicAtmosphereLighting = falseare deliberate — MSAA and sun-driven atmosphere shading render a black globe on software-GL stacks (e.g. headless/embedded Chromium). - Tile imagery: Esri World Imagery is used under its terms for personal/non-commercial viewing; OpenStreetMap tiles per the OSM tile usage policy.
- Not affiliated with or endorsed by Strava, Garmin, Esri, or OpenStreetMap. "Strava" is used descriptively: the input is the data export Strava provides to its users.
Development
git clone https://github.com/lukaszkolodziejczyk/strava-globe
cd strava-globe
uv run strava-globe path/to/export.zip
Releases: push a v* tag — GitHub Actions builds and publishes to PyPI via
trusted publishing (.github/workflows/release.yml).
License
BSD 3-Clause. Place names derived from
GeoNames data (CC-BY 4.0) via reverse-geocoder.
Metadata
Release files for strava-globe 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| strava_globe-0.2.0.tar.gz | 18.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| strava_globe-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 38.7 kB
Release files / strava_globe-0.2.0.tar.gz
| Download URL | strava_globe-0.2.0.tar.gz |
|---|---|
| Size | 18.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dcfde8dc3f034f9e8257d2192c6a579d0375e94ec57bb2f68eea885ee671dcf4
|
|
BLAKE2b-256 checksum How to use checksums |
09c8875c71284dc9bb1610153d390e1e9e7945056622890f57acea82bc4aa528
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 30, 2026.
Transparency logRelease files / strava_globe-0.2.0-py3-none-any.whl
| Download URL | strava_globe-0.2.0-py3-none-any.whl |
|---|---|
| Size | 20.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
45a9df7752b1114c053ac68012a2300ec58c7488f93f3a6fe0908fa43d143442
|
|
BLAKE2b-256 checksum How to use checksums |
293b324a5b3ffe26dac7350c6138f69c6ba63002d7e8c21d2c76df4705190d39
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 30, 2026.
Transparency log