# tracé > tracé is a free cycling GPX route analyzer that runs entirely in the browser: an interactive > map, a grade-colored elevation profile with bidirectional hover, route statistics, climbs > categorized Cat 4 to Hors Catégorie, grade distribution, FIETS difficulty, drag-to-select > section stats, physics-based pacing/ETA, ride analytics for GPS recordings, and private route > sharing by link. No account, no upload, no database — the GPX file never leaves the machine. Site: https://www.tracelab.cc/ (also reachable at https://weitblick-cc.vercel.app/, which is a fallback origin for the same app, not a separate product). ## What it does - Reads GPX 1.1 `` and `` files from any source — Strava, Garmin, Komoot, RideWithGPS, Wahoo, and hand-written files — via the upload button, drag-and-drop, or a pasted Komoot tour URL. Multiple routes open as tabs and can be compared against each other. - **Every route** gets: an interactive map and a grade-colored elevation profile linked by bidirectional hover; distance, elevation gain/loss, min/max elevation, average and steepest grades; a climbing/flat/descending terrain split; a grade-distribution histogram; a FIETS difficulty score; detected climbs categorized Cat 4 → HC as shaded profile bands and a sortable table; drag-to-select statistics for any section; a "worst-case" mode that simulates the +15–25% elevation gain a ridden route typically reports over the planned one; and a physics-based pacing/ETA model driven by rider mass, W/kg and road-vs-gravel rolling resistance. - **GPS recordings** (auto-detected from timestamps and real GPS noise) additionally get: elapsed/moving/stopped time, speed bands, terrain time, first/second-half splits, an optional speed and heart-rate trace on the profile, per-climb VAM and Ferrari gradient-normalized estimated W/kg, heart-rate recovery after each effort, and within-ride fatigue read as aerobic decoupling between the ride's first-half and second-half climbs. - **Optional, opt-in layers**: surface classification (road plus four gravel categories, the ISGG/Neil Shirley taxonomy) and an OpenStreetMap points-of-interest layer (drinking water, food, fuel, repair, shelter), both sourced from the OpenStreetMap Overpass API; and retrospective wind-impact analysis (a signed time cost/benefit with an uncertainty band) sourced from Open-Meteo. - **Display units are metric or imperial**, selectable in Settings and remembered. Analysis is always SI internally. VAM, the steepest-window labels and the POI buffer stay metric in both systems, by cycling convention. - Light and dark themes. Desktop-first, responsive down to phones. ## Privacy — the distinguishing property - Route analysis is **100% client-side JavaScript**. There is no database, no account system, no server-side state, and no upload step. The GPX file is read by the browser and stays there. - **Sharing is also private.** A shared route is compressed into the *fragment* of a link (the part after `#`), which browsers never transmit to a server. The recipient's browser decodes it locally. No server — including tracé's own — ever receives a shared route. - Routes are cached in the visitor's own browser (IndexedDB, gzipped GPX only) so tabs reopen on the next visit. This cache is local and clearable from Settings. - **The only server-side code in the entire project** is a stateless relay that forwards OpenStreetMap Overpass queries, which exists solely because browsers are no longer permitted to call Overpass directly. It stores nothing. It runs only when the POI or surface layer is switched on, and it sees bounding-box coordinates, never a file. - The wind-impact feature is off by default; enabling it sends route coordinates and ride times to Open-Meteo. ## Key definitions used by the analysis - **Climb categorization** follows the Garmin/RideWithGPS/GPSLogger convention: score = climb length in metres × average grade in percent, mapped to Cat 4, 3, 2, 1 and Hors Catégorie. Ascending runs are detected on smoothed elevation and merged across short dips. - **Elevation gain** uses Strava-style hysteresis counting: change accumulates only once it moves far enough in one direction, so GPS noise cannot inflate the total. - **Elevation is smoothed** with a centered distance-window moving average before grades are computed, because raw GPS elevation is vertically noisy. - **FIETS** is the Dutch difficulty index, computed per climb and for the route. - Tracks over 10,000 points are downsampled before analysis. Files with no elevation data render immediately with elevation features disabled and offer a one-press lookup against AWS Open Data's terrain tiles — never an automatic network fetch. ## Links - [The app](https://www.tracelab.cc/): open a GPX file — no account, nothing to sign up for - [Demo route](https://www.tracelab.cc/demo.gpx): a real ~147 km Odenwald GPX with 11 categorized climbs (Cat 2–4), also loadable from the app's "Try a demo route" button - [Source repository](https://github.com/mitevpi/weitblick): code, design specs, and the sourced research notes behind every analysis convention and tuned constant ## Answers to common questions - *Is my GPX file uploaded anywhere?* No. It is parsed in your browser and never sent anywhere. - *Does it cost anything?* No, and there is no account to create. - *Can I share a route without a server seeing it?* Yes — that is what the fragment-based share link is for. - *Does it work with Strava/Garmin/Komoot exports?* Yes, and Komoot tours can be imported by URL. - *Does it analyze recorded rides, not just planned routes?* Yes — recordings are detected automatically and unlock the ride-analytics layer described above.