Strava heatmap overlay in Gaia GPS showing heatmap tracks near Grosvenor Arch in Utah canyon country
Heatmap density near Grosvenor Arch in Utah, showing which lines through the canyon network have been traveled. Even faint traces indicate a passable route.
Strava heatmap in Gaia GPS showing canyon route through Surprise Canyon and Headquarters Canyon in desert terrain
Surprise Canyon and Headquarters Canyon, showing how heatmap density traces the viable routes through otherwise featureless terrain.

The Strava heatmap is one of the most underused planning tools in backcountry hiking. Most people know it was once used to accidentally reveal secret military bases when soldiers jogged their perimeters. But it’s also a good source of information to prevent you from getting cliffed out!

What the Strava heatmap actually shows you

The heatmap is a density map of every GPS track uploaded to Strava. That’s a ton of data points from runners, cyclists, hikers, skiers, and anyone else recording activities outdoors. Bright areas have had a lot of people travel through them! You can see individual tracks from folks running and hiking through areas. Which means you get some information for off trail traverse if someone else has recently been through that area and recorded it on Strava. Not everywhere has tracks, but a lot of places do!

For backcountry route-finding, this is extraordinarily useful because the heatmap is essentially a crowd-sourced viability filter. If there’s a faint line glowing even slightly in the heatmap, someone has been there, which means a cliff band or off trail traverse likely goes!

I use it constantly for three specific things:

Cliffband avoidance. In terrain where you’re constantly choosing your own line through redrock, the heatmap can tell you instantly which gully exits and which canyon walls have been tested in well-travelled areas. Even a faint heatmap trace through an otherwise blank wall can be a good indication to investigate.

Route viability in mountain terrain. On routes like the Collegiate Peaks section of the Nolans 14, where you’re moving cross-country over ridges and through couloirs, the heatmap shows you exactly which col has seen foot traffic and which one is a dead end. It’s not perfect; some legitimate lines have never been recorded on Strava. But in popular ranges, the coverage is dense enough to be genuinely useful.

Strava heatmap in Gaia GPS showing Collegiate Peaks route near La Plata Peak and Ellingwood Ridge
La Plata Peak area on the Collegiate Loop. The heatmap shows the Ellingwood Ridge approach and the summit route while leaving the blank faces unambiguous.
Strava heatmap in Gaia GPS showing Huron Peak and Missouri Basin on the Collegiate Loop
Huron Peak and Missouri Basin. The heatmap shows the well-traveled ridge line and makes the cross-country approach from the basin obvious.

Hitchhike spots. Roads with high heatmap density are busy. A trailhead access road glowing orange has a lot of traffic, which means good hitching odds. A faint or dark road is going to be a long wait. Before a road walk or a hitch, I check the heatmap to get at least a little bit of beta on how viable a hitch might be.

Why you can’t just load it directly

Strava’s heatmap is technically available on their website, but they don’t offer a public tile URL you can plug into Gaia GPS. The tiles require authentication, and Gaia (or CalTopo) can’t handle that authentication natively.

The solution is a proxy: a small piece of server code that sits between Gaia and Strava, handles the authentication, and passes the tile images through. That proxy lives on Cloudflare Workers, which gives you free hosting for this kind of lightweight task.

The setup requires three free accounts and about 30 minutes. Every step happens in a web browser! So no coding or software to install to get this working.


Setup: Step by Step

What you’ll need

  • A Strava account (free is fine; the global heatmap works without a paid subscription)
  • A GitHub account (free at github.com; this is where the proxy code lives)
  • A Cloudflare account (free at cloudflare.com; this runs the proxy server)

If you already have any of these, skip that step.


Step 1: Create your accounts

Strava: Sign up at strava.com. You don’t need to upload any activities. A blank account works fine for the global heatmap.

GitHub: Sign up at github.com. GitHub is where software projects are stored. You’ll be using it to host a copy of the proxy code.

Cloudflare: Sign up at cloudflare.com. Cloudflare is a company that, among other things, lets developers run small programs for free on their global network. The proxy runs here.


Step 2: Fork the proxy repository

“Forking” means making your own copy of someone else’s code on GitHub. You don’t need to understand the code; you just need your own copy so you can configure it with your credentials.

  1. Go to github.com/JKesslerPhD/strava-heatmap-proxy
  2. Click the Fork button in the top-right corner
  3. Leave all the default settings and click Create fork

You now have your own copy of the proxy at github.com/YOUR_USERNAME/strava-heatmap-proxy.


Step 3: Get your Strava credentials

The proxy needs two things from your Strava account: your athlete ID and a session cookie. Neither of these is your password.

Your athlete ID:

  1. Log in to strava.com
  2. Click your profile photo in the top right, then “My Profile”
  3. Look at the URL in your browser. It will read something like https://www.strava.com/athletes/72766582
  4. The number at the end is your athlete ID. Copy it so you have it.

Your session cookie:

  1. While logged in to Strava, go to strava.com/maps (this loads the heatmap page)
  2. Open your browser’s developer tools. On Chrome or Edge: press F12 or right-click anywhere on the page and select “Inspect”. On Safari: you’ll need to enable the Develop menu first under Safari > Preferences > Advanced.
  3. Click the “Application” tab (Chrome/Edge) or “Storage” tab (Safari)
Click the Application tab in Chrome DevTools
The Application tab is in the overflow menu (the >> arrow) if you don’t see it immediately.
  1. In the left sidebar, expand “Cookies” and click on strava.com
  2. Find the row named _strava4_session. You can filter for this in the inspection filter option.
Filter cookies to find _strava4_session
Type “strava4” in the filter box to isolate the session cookie quickly.
  1. Click on it and copy the entire value in the “Value” column; it will be a long string of letters and numbers

Keep this value somewhere safe. You’ll paste it in the next step. Note: this cookie expires periodically (usually every few months). When it expires, you’ll repeat this step and update it.


Step 4: Get your Cloudflare credentials

Your Account ID:

  1. Log in to cloudflare.com
  2. From the main dashboard, use the quick search in the left sidebar. Type “account” and select “Copy account ID”
Copy account ID from Cloudflare quick search
The “Copy account ID” option copies it directly to your clipboard.

Create an API Token:

  1. Click your profile icon (top right) and then “My Profile”
  2. Click “API Tokens” in the left sidebar
  3. Click “Create Token”
  4. Click “Use template” next to “Edit Cloudflare Workers”
  5. Under the “Account Resources” section, set it to “Include > Your Account”
  6. Under “Zone Resources” set it to “Include > All Zones From An Account > Your Account”
  7. Click “Continue to summary” then “Create Token”
  8. Copy the token value. You can only see it once, so paste it somewhere safe.

Step 5: Add secrets to your GitHub repository

Your forked repository needs to know your Cloudflare account and your Strava credentials. You store these as “secrets” in GitHub; they’re encrypted and only accessible to the automated deployment process.

  1. Go to your forked repository: github.com/YOUR_USERNAME/strava-heatmap-proxy
  2. Click Settings (it’s on the top menu bar of the repository webpage)
GitHub repository Settings tab
Click “Settings” on the top navigation bar of your forked repository.
  1. In the left sidebar, click Secrets and variables > Actions
Secrets and variables menu in GitHub Settings
Expand “Secrets and variables” in the left sidebar and choose “Actions”.
  1. Click New repository secret and add each of the following:
Secret nameValue
CF_ACCOUNT_IDYour Cloudflare Account ID (from Step 4)
CF_API_TOKENYour Cloudflare API Token (from Step 4)
STRAVA_IDYour Strava athlete ID (from Step 3)
STRAVA_SESSIONYour _strava4_session cookie value (from Step 3)

You’ll add each one by clicking “New repository secret,” entering the name and value, and clicking “Add secret.” Repeat for all four.

Repository secrets page showing all secrets added
After adding all four secrets, your Repository secrets page should look like this (you’ll add the fifth, KV_NAMESPACE_ID, in the next step).

You’ll also need one more secret, the KV Namespace ID, which you’ll create in the next step entirely in the Cloudflare dashboard.


Step 6: Create the KV namespace in Cloudflare

A KV namespace is a small key-value store Cloudflare uses to cache the heatmap authentication tokens so the proxy doesn’t have to re-authenticate on every tile request. You create it directly in the Cloudflare dashboard; no command line needed.

  1. Go to dash.cloudflare.com and log in
  2. In the left sidebar, use quick search and enter “Workers KV,” then click Create a KV namespace
  3. Name it STRAVA_HEATMAP_PROXY_COOKIES (use this exact name)
  4. Click Add
  5. Click “Metrics” at the top
  6. The namespace will appear on the left with an ID next to its name, a string like abc123def456.... Copy that ID.

Now go back to your GitHub repository secrets and add one more:

Secret nameValue
KV_NAMESPACE_IDThe namespace ID from the Cloudflare KV dashboard

Step 7: Deploy

With all five secrets in place, you can now deploy the proxy. GitHub Actions will do it automatically.

  1. Go to your forked repository on GitHub
  2. Click the Actions tab
  3. In the left sidebar, click Deploy to Cloudflare
  4. Click Run workflow > Run workflow
Deploy to Cloudflare GitHub Actions workflow
The “Run workflow” button triggers the deployment. A green checkmark means it succeeded.

The deploy takes about 30 seconds. When it shows a green checkmark, the proxy is live.


Step 8: Find your proxy URL

Your proxy is now running at:

https://strava-heatmap-proxy.YOUR_CLOUDFLARE_SUBDOMAIN.workers.dev

To find your exact subdomain, go to dash.cloudflare.com > Workers and Pages > strava-heatmap-proxy. The URL will be listed there.

Visit that URL in your browser; you should see a list of available tile URLs for different colors and activity types.


Step 9: Add the heatmap to Gaia GPS

Now for the payoff. The tile URL format for the global heatmap (all activities, orange color) is:

https://strava-heatmap-proxy.YOUR_SUBDOMAIN.workers.dev/global/orange/all/{z}/{x}/{y}@2x.png

Replace YOUR_SUBDOMAIN with your actual subdomain from Step 8.

In Gaia GPS (iOS or Android):

  1. Open Gaia GPS on your desktop computer (you can’t do this from the mobile device)
  2. Tap “Explore Layer Library” at the bottom and scroll down
  3. Tap Add Custom Map Source
  4. Name it something like “Strava Heat Map”
  5. Paste the URL above (with your subdomain) into the “Title URL” box
  6. Tap Save

The heatmap will now appear as a toggleable layer in your map. Set the opacity to around 50-60% so you can see both the heatmap and the underlying topo simultaneously.


Tile options

The proxy supports several color schemes and activity filters. Swap out the relevant part of the URL:

Colors: orange, hot, blue, bluered, purple, gray, mobileblue

Activity filters:

  • all — everything (most useful for route-finding)
  • run — runners only
  • sport_Hike — hikers only
  • sport_MountainBikeRide — MTB
  • winter — ski/snowshoe activities

For backcountry hiking, all gives you the densest data. If you’re specifically looking for foot-travel-only routes to avoid MTB confusion, use sport_Hike, although this will also exclude trail runs and I’ve found it to be a sparser data source.


Refreshing your session cookie

The _strava4_session cookie expires periodically. When it does, the heatmap tiles will stop loading in Gaia. The fix is straightforward:

  1. Repeat Step 3 to get a fresh cookie
  2. Go to your GitHub repository > Settings > Secrets and variables > Actions
  3. Update the STRAVA_SESSION secret with the new value
  4. Re-run the deploy (Step 7)

This typically needs to be done every couple of months depending on your Strava session settings.


Questions?

If you run into trouble with the setup, the best resource is the original proxy repository at github.com/JKesslerPhD/strava-heatmap-proxy. Comments are open below if you get stuck on a specific step.