See what a file reveals, then remove it¶
A workout file carries more than a route. Alongside a GPS trace that usually begins and ends at your front door, files routinely carry device serial numbers and — depending on the device — age, gender, height, weight, resting and max heart rate, threshold power. Most people have never seen this, because nothing surfaces it. Then they email the file to a coach, or attach it to a forum post asking why their watch is misbehaving.
Exporting from Strava does not apply your privacy zones
Strava's Export Original hands back the file your device wrote — privacy zones are a display feature of the website, not a property of the file. If you downloaded it from Strava, assume the coordinates are unmasked.
First, look¶
this file discloses:
[serials] device_info.ant_device_number present in 22 message(s)
[serials] device_info.serial_number present in 31 message(s)
[serials] file_id.serial_number present in 1 message(s)
[location] 9189 GPS points; the route starts and ends at real places
route start ≈ 52.43, 13.75 · end ≈ 52.43, 13.74 (rounded to ~1 km so this report is safe to share)
clean: identity, body_metrics
reveal writes nothing. It reports what is actually in your file and names
the categories that are genuinely clean — no scare-mongering about data that
isn't there.
Why the coordinates are blurry
The report rounds positions to about a kilometre on purpose. These reports get pasted into the same forum threads the files do; a disclosure report that prints your doorstep would defeat itself.
Then, remove it¶
import chiptime
result = chiptime.scrub("ride.fit", gps_radius_m=500)
result.removed # {'serials': 32, 'location': 482}
result.output_strict_ok # True
open("clean.fit", "wb").write(result.data)
| Category | Default | What goes |
|---|---|---|
identity |
removed | user_profile — name, age, gender, height, weight |
serials |
removed | device serial numbers and ANT device ids |
body_metrics |
removed | configured physiology: threshold power, max/resting HR, VO2max |
| location | kept unless asked | GPS near your route's endpoints (--gps-radius M) or all of it (--drop-all-gps) |
Metadata categories are on by default because removing them costs you no
measurements. Location scrubbing is opt-in, because it does. Keep any
category with --keep-identity, --keep-serials, --keep-body-metrics.
Serial numbers and platform credit
Garmin is reported to use file_id.serial_number when deciding whether
an activity counts toward challenges and badges. If you scrub a file
you intend to re-upload to Garmin Connect, pass --keep-serials;
if you are sharing the file with a person, remove them. Privacy and
platform credit genuinely pull in opposite directions here, and only
you know which you want.
How location concealment works¶
--gps-radius 500 hides every point within 500 m of the route's first or
last fix — wherever it occurs in the ride. That matters: a loop that
passes your house mid-route, or an out-and-back that touches home at the
turnaround, would leak if only the leading and trailing points were removed.
Concealed coordinates become absent, never 0 — "no reading" must not
turn into a point off the coast of Africa. Everything else on those records
(heart rate, power, distance) is preserved, and your totals are untouched:
distance is a recorded field, not something computed from coordinates.
Your workout data stays your workout data¶
chiptime distinguishes fields that share a name but not a meaning.
session.max_heart_rate is the highest heart rate you reached in that
workout — that's training data, and it stays. zones_target.max_heart_rate
is your configured physiological maximum — that's personal, and it goes.
What this does not promise¶
Scrubbing removes disclosed data; it does not make a file untraceable.
Distance, speed, and duration remain on concealed records, and a determined
analyst could infer a route's shape from them. If you need a file to be
genuinely anonymous, --drop-all-gps and a hard look at what's left is the
starting point, not --gps-radius alone.