GPX → FIT
Adaptive pacing with anchor-based timing
What it does
A GPX route only says where you went. It doesn't say when you were at each point. A basic converter spreads your time evenly along the route, so the result looks like you walked up a mountain at the same speed you ran down it.
This tool gives the route a realistic pace. You enter a start time, then say how long the activity took, when it ended, or the average speed you kept — whichever you actually know. (An average speed only sets the total; the pace still varies along the route, and any time you spend stopped is added on top of it.) You can also add times you know from along the way. It then works out when you were at every point and writes a FIT file you can upload to Strava, Garmin Connect and similar services.
How pacing works
- Gradient. Climbs slow you down and gentle descents speed you up. Running uses a curve based on the energy cost of running on slopes (Minetti), adjusted so you're fastest on a gentle descent of about 9% and steeper ones slow you down again. Hiking uses Tobler's hiking function. The tool blends the two automatically depending on how steep and how fast the activity is. For example, a slow day in the mountains paces like a hike even if you picked "Running".
- Slope averaging. Slope is averaged over several dozen meters instead of point to point, so small bumps in the elevation data don't cause sudden jumps in speed.
- Pace smoothness. Real people push a bit on climbs and ease off on descents, so their speed changes less than the slope alone would suggest. The tool limits how far your speed can swing from your usual pace. By default (level 5), the limit depends on the route and sport: flat routes and hikes vary less than hilly runs. The slider moves that limit. Higher numbers give a more even pace, and 10 is almost constant. Lower numbers follow the terrain more closely. Your start, end and anchor times are still matched exactly at every level.
- Surface (optional). When "Adjust pace for trail surface" is on, the route is matched against OpenStreetMap to find out what's under your feet: asphalt, gravel, rough trail. You're a little slower on rough ground. See Privacy for what this sends.
- Exact fit. The result is always scaled so the activity starts and ends exactly at the times you entered.
After converting, a speed and elevation chart slides up over the map so you can check the pacing before you download.
Anchor points
An anchor sets a time you know for a point on the route, e.g. "I reached the summit at 11:40". Click anywhere on the route to add one. The pacing between anchors is fitted separately, so each anchor makes the result more accurate.
If you click a spot the route passes more than once, like an out-and-back or a loop that crosses itself, you'll be asked which pass you meant.
Photo anchors
Photos you took during the activity usually record where and when they were taken, which is exactly what an anchor is. Drop them onto the Photos box and every geotagged photo becomes an anchor automatically.
The location and time are read from the photo's metadata inside your browser. The photos themselves are never uploaded, and nothing is stored after you close the tab.
When a photo is skipped
- No location/timestamp data. The photo has no GPS position or capture time. This is common with screenshots, photos shared over messaging apps (which strip metadata) and cameras without GPS.
- Outside the activity's time. It was taken more than 15 minutes before the start or after the end you entered.
- Too far from route. It was taken more than 150 m from the route.
Tips
- Phone photos work best, since they save GPS and an accurate time automatically.
- If every photo shows up as "outside the activity's time", check the camera's clock and time zone.
- Set the start time and duration before adding photos, since they're checked against them.
Stops
Click the route and choose "Add stop" to record a break, such as lunch, a summit rest or a café. You can give it either:
- A duration only. The tool works out when you got there from the pacing, and you leave that many minutes later.
- An exact arrival and departure time, if you know them.
The stop is written into the FIT file as a real pause, so it's excluded from moving time and doesn't lower your average pace.
Device
A FIT file names the device that recorded it with two numbers: a manufacturer ID and a product ID. Strava looks that pair up in its own list of devices and shows the name only if it finds a match. It ignores any device name written into the file. So typing "Garmin Forerunner 965" does nothing on Strava, but the Forerunner 965's IDs do.
That's why the picker only offers devices whose IDs are known. Garmin and Suunto publish theirs. The COROS, Polar and Wahoo ones come from the device tables of other FIT tools. Most other brands don't publish them, and a guessed ID would just show nothing.
- No device (the default) writes a neutral ID, so Strava shows no device.
- Custom IDs are for any other device. You can copy the IDs from a FIT file that device recorded, using any FIT viewer.
- Name embedded in file is written into the file too. Strava doesn't show it, but some other apps do.
Privacy
There's no server behind this site. The conversion itself is Python compiled to run in your browser (Pyodide), so the processing happens on your own device.
Stays on your device
- Your GPX file
- Your photos and their metadata
- Start time, duration, anchors, stops and device name
- The generated FIT file
There are no accounts, analytics, tracking or cookies.
What does go over the network
- Surface lookup (optional). If "Adjust pace for trail surface" is on, the route's coordinates are sent to OpenStreetMap's public Valhalla server when you convert. It receives only the shape of the route, with no times, photos, file name or device. Turn the option off and your route's coordinates are never sent anywhere.
- Map tiles. The background map is loaded from Thunderforest, like any web map. It can tell which area is being viewed.
- App code. On first load, the app downloads its libraries (Pyodide, Leaflet, exifr and a few Python packages) from public CDNs. This is the same for every visitor and has nothing to do with your data.
Stored in your browser
Only four settings: light or dark theme, whether surface lookup is on, your pace smoothness level, and the device you picked (with its embedded name).
Check it yourself
Open your browser's developer tools (F12), go to the Network tab and convert a route. Every request the page makes is listed there.