What tracé tracks: the public telemetry note
tracé's entire premise is that a route never leaves your browser. That promise is only worth anything if the rest of what the app does is disclosed just as plainly. Below is every analytics event tracé sends — all six of them, by exact name and property — and an explanation of why that's the complete list, not a curated one.
The six events, in full
tracé uses Vercel Web Analytics as its analytics processor. It sends nothing else, and nothing beyond the six named, count-only events below — each fires with the event name and, where noted, one property drawn from a fixed, closed set of values.
| Event | Property | Why it exists |
|---|---|---|
session_start |
kind: "new" | "returning" |
Counts one visit, bucketed by whether this browser has been seen before. Feeds the returning-visitor share, which Vercel Web Analytics doesn't report natively, and is the denominator for the two rate metrics below. |
route_loaded |
source: "file" | "demo" | "share" | "komoot" |
Counts one successfully analyzed route, tagged with how it arrived. Feeds routes per session — a second route in one session is the strongest available signal that the first one was useful. |
share_created |
scope: "single" | "all" |
Counts a share link being copied, separating one route's link from the copy-all button so a single click on "copy all" can't inflate the rate. Feeds the viral loop metric. |
share_opened |
none | Counts a share link being successfully opened by a recipient — the other half of the viral loop metric, and the only measurement of whether shared links actually get followed. |
layer_enabled |
layer: "poi" | "surface" | "wind" |
Counts a visitor opting into one of the three layers that reach a third-party service. Feeds a session-depth metric, and doubles as an early-warning signal for the Overpass relay's capacity ceiling. |
elevation_refetched |
none | Counts a manual elevation refetch. It's the clearest evidence a visitor arrived with a file the app couldn't fully analyze, and chose to persist anyway. |
That's the complete list — six events, no others. If a seventh ever ships, this page and
llms.txt change in the same commit as the code, per the rule
recorded directly in src/analytics/events.ts.
What is never sent — and why that isn't just a promise
No route data, no coordinates, no filenames, no distances, no route ids, no timings, and
no identifier of any kind is ever sent by these six events. That isn't a policy tracé is
merely asking you to trust: every one of the functions above takes only a closed union of
literal string values as its parameter — "file" | "demo" | "share" | "komoot",
for example, never a plain string. A filename, a coordinate pair, a distance
figure, or anything else read out of your GPX file simply does not fit that type. Passing
one would not compile. The app's central promise is enforced here by the type checker,
not by reviewer discipline or good intentions — which is the strongest thing this page can
say, and also the limit of what it's claiming: it describes these six functions, not every
line of code that will ever exist in this repository.
The "seen before" flag
session_start's new/returning split is backed by a single first-party
localStorage key, weitblick-seen (it keeps the app's original
name, like every other persisted key — see docs/reference/gotchas.md). That
flag stays in your browser. It is never transmitted anywhere; only the derived
"new" or "returning" bucket reaches Vercel. A browser that
blocks storage — Safari private mode, most notably — simply can't read or write the flag,
so it's counted as "new" on every visit. That biases the returning-visitor
number downward, which is the safe direction: it can manufacture under-counting, never
false retention.
What actually does leave the browser, opted in
Four features are not analytics and are not covered by the closed-union guarantee above, because their entire job is to fetch something the browser doesn't have. Every one of them is something you switch on or press — none of it is background traffic. All four are disclosed here with the same plainness as the six events, because implying tracé makes no network requests at all would be its own kind of lie:
- The OpenStreetMap Overpass relay (the POI and surface layers). When either layer is switched on, the map's current bounding-box coordinates are sent through tracé's one server-side endpoint, a stateless relay that exists only because browsers are no longer permitted to call Overpass directly. It stores nothing and runs only while one of those layers is on.
- The wind-impact feature, off by default. Turning it on sends your route's coordinates and ride times to Open-Meteo so it can look up historical wind conditions along the route.
-
The elevation lookup, for a GPX file that carries no elevation data at
all. Such a file opens with the elevation features disabled and a button offering to
fetch the missing data; nothing happens until you press it. Pressing it downloads
terrain tiles from AWS Open Data
(
s3.amazonaws.com/elevation-tiles-prod). Your file is not uploaded — the browser works out which map tiles the route crosses and asks for those. Worth being precise about what that still reveals: the set of tiles requested tells that host roughly where in the world your route is, even though it never sees the route itself. -
Komoot URL import. If you paste a Komoot tour link, that tour's ID is
sent to Komoot's own public API (
api.komoot.de) to fetch the route, with no relay in between. This one is a request for something you asked for by pasting its address, rather than anything derived from a file you hold — but it is a network request all the same, so it is listed here.
Separately, every route you open is cached locally in your browser's IndexedDB as gzipped GPX text — nothing else is stored, nothing is derived-and-kept, and no server is involved. That cache is what lets a tab reopen on your next visit, and it's clearable at any time from Settings.
Sources
Every claim on this page is drawn directly from the implementing code: src/analytics/events.ts (the six events, their properties, and the closed-union invariant), and public/llms.txt (the same privacy disclosure in the app's machine-readable summary). This page and both of those are kept in agreement by convention, not by generation — if you find a mismatch, the code is authoritative and this page is wrong.
Analyze your own route — nothing about it is ever sent anywhere.
Open tracé