Skip to main content

Strava Globe

Your entire Strava history as glowing tracks on a realistic 3D Earth.

Every activity on one globe

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. App-generated stat cards (training-plan summaries and the like) are detected and skipped, so only real photographs appear.
  • 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.

Flight tour flying between places

Tour mode mid-journey: Rawai → Ao Nang, each stop card carrying the photos taken there — click one for full size.

From orbit to city… …to street level
A city's worth of tracks Runs along a coastline

Quickstart

  1. Request your archive on strava.com: Settings → My Account → Download or Delete Your Account → Request Your Archive (the zip arrives by email).

  2. 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 — dropping app screenshots, detected when an image is both locally flat (synthetic gradients, share of near-zero variance 8×8 blocks) and extremely compressible (bytes per pixel); real photographs carry sensor noise everywhere and never trip both,
  • 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 = 1 and dynamicAtmosphereLighting = false are 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.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for strava-globe 0.3.0
File Size Uploaded
strava_globe-0.3.0.tar.gz 18.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for strava-globe 0.3.0
File Interpreter ABI Platform
strava_globe-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 40.2 kB

Release files / strava_globe-0.3.0.tar.gz

Download URL strava_globe-0.3.0.tar.gz
Size 18.9 kB
Tags Source
SHA-256 checksum
How to use checksums
66ea9133932efe173fc3f912156764e0da9084b5fa6c3ff56e6483fdd13047f9
BLAKE2b-256 checksum
How to use checksums
0c3dd8047cbd79abe25e74e7688b9500ddd1f78118cd96e60c4cec192427ee22
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

Release files / strava_globe-0.3.0-py3-none-any.whl

Download URL strava_globe-0.3.0-py3-none-any.whl
Size 21.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bc7fef1b4d8c198f386f6fe3e18c643d91a66e8da0e8a0b7f73ef3105df2fc4c
BLAKE2b-256 checksum
How to use checksums
47334cb41dd1cc216f10f3c1a168b16cf2d1667d5db2e26f36f3c10f5a0fcb66
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

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page