A while back I flew VeloGPS to Hong Kong and checked its recording against an independent ADS-B track of the same flight. That was a 6,700-mile test at 530 mph. This is the opposite end of the scale: two short bike rides through the neighborhood, at cycling speed, recorded twice at once.

On the morning of June 7th I rode from home to the Brooks store, then later rode home from a bakery a block away. I recorded both legs two ways simultaneously:

  • VeloGPS — my app, running on an iPhone in a jersey pocket.
  • Apple Watch Ultra 2 — Apple's flagship watch, with dual-frequency (L1/L5) GPS, recording to the Workout app and synced through Strava, exported as GPX.

That's a deliberately lopsided matchup. The watch is a purpose-built tracking device with better antennas and a multi-band GPS chip, and its track passes through Strava's processing pipeline before I see it. VeloGPS is a phone doing its best from inside a pocket. The question isn't which is "better" on paper — it's whether the signal coming out of the simple tool is good enough to stand next to the complicated one.

Here's the whole comparison in one chart, with the detailed tables below.

Horizontal bar chart showing VeloGPS's reading as a percentage above or below the Apple Watch Ultra 2 for six metrics across both rides. Duration, distance, average moving speed, and elevation loss all sit inside a shaded plus-or-minus-five-percent band; elevation gain on ride 1 and max speed on both rides fall outside it.

Each bar is VeloGPS's reading as a percentage above or below the watch's, for both rides. Nine of the twelve bars land inside the ±5% band. The three that don't are the two metrics GPS is worst at — instantaneous max speed, and an elevation-gain figure distorted by a tiny denominator (more on both below).

How I compared them

Both tracks are real recorded GPX. I parsed each file and computed every metric myself with the same code, so the two sources are measured identically rather than trusting each device's own summary screen:

  • Distance is the haversine sum over consecutive points.
  • Elevation gain/loss uses a 0.5 m noise threshold (the same one VeloGPS uses internally), applied to both files.
  • Speed is derived from position and time between points — for both tracks — so the comparison is apples-to-apples. (This means the max-speed figures below aren't either device's reported max; they're recomputed the same way for both.)
  • Spatial deviation is, for each VeloGPS point, the distance to the nearest segment of the watch's track — i.e. how far the two recordings sat apart on the actual road.

Ride 1 — Home → Brooks

Metric VeloGPS Apple Watch Δ
Distance 6.58 km (4.09 mi) 6.51 km (4.05 mi) +1.0%
Duration 25m 55s 26m 04s −9s
Elevation gain / loss 17 m / 121 m 22 m / 128 m −5 m / −7 m
Avg moving speed 17.2 km/h (10.7 mph) 16.9 km/h (10.5 mph) +0.3 km/h
Max speed 37.2 km/h (23.1 mph) 43.9 km/h (27.3 mph) −6.7 km/h
Points recorded 873 1,404

Ride 2 — Bakery → Home

Metric VeloGPS Apple Watch Δ
Distance 6.71 km (4.17 mi) 6.66 km (4.14 mi) +0.8%
Duration 30m 29s 30m 30s −1s
Elevation gain / loss 132 m / 38 m 131 m / 37 m +1 m / +1 m
Avg moving speed 14.7 km/h (9.1 mph) 14.3 km/h (8.9 mph) +0.4 km/h
Max speed 36.9 km/h (22.9 mph) 30.7 km/h (19.1 mph) +6.2 km/h
Points recorded 1,047 1,707

Distance lands within 1% on both rides. Duration is within nine seconds and one second. Average moving speed is within half a km/h. Elevation gain and loss — usually the noisiest thing a phone GPS reports — agree to within a few meters, and on Ride 2 to within a single meter.

How far apart were the two tracks?

The headline number is how closely VeloGPS traced the same path the watch did. For every VeloGPS point I measured the distance to the nearest point on the watch's track:

Ride 1 Ride 2
Median deviation 0.7 m 0.7 m
90th percentile 1.5 m 1.4 m
95th percentile 1.9 m 1.8 m
Max 18.2 m 4.1 m

A median of 0.7 m means the two recordings sat, typically, less than a meter apart on the road — well inside GPS noise. Ninety-five percent of points were within about 2 m. That isn't two devices agreeing on roughly the same route; it's the same line drawn twice.

Where they differ

Two honest gaps, and one design difference:

Max speed is the one metric that diverges, and it diverges in opposite directions — the watch reads higher on Ride 1, VeloGPS reads higher on Ride 2. That's the signature of single-point GPS jitter, not a systematic bias in either device. Instantaneous max is the noisiest figure any GPS track produces: one slightly-off fix between two timestamps throws it off. Every other speed and distance number, which averages over many points, lines up cleanly.

The big elevation-gain bar in the chart is a percentage illusion. Ride 1 shows VeloGPS −22.5% on elevation gain — the largest-looking miss on the chart. In absolute terms it's 17 m vs. 22 m: a five-meter difference on a ride that was almost entirely downhill. When the true value is tiny, a small absolute gap becomes a big percentage. Ride 2, which actually climbs, has both devices within a meter (+1.1%). The chart honestly plots the percentage; the meters tell you it doesn't matter.

VeloGPS logs fewer points — 873 vs. 1,404, and 1,047 vs. 1,707 — roughly half. The watch samples at a fixed 1 Hz; VeloGPS applies a Kalman filter and a distance filter, storing a point only when you've actually moved. Despite keeping half as many points, it lost no fidelity: distance, route, and elevation all matched. The thinner track is the same road, recorded more efficiently.

Caveats

This is two rides, both short, both in the same neighborhood, on one clear-weather day. It's not a controlled study — it's a side-by-side check. The spatial-deviation numbers also assume the watch track is "truth," which it isn't exactly; it's just an independent, higher-spec reference. And as noted, I recomputed every metric myself rather than comparing each device's own summary, which removes one source of apples-to-oranges error but means these aren't the numbers either app would show you on its screen.

The point

A phone in a pocket, running a single-developer app with no external sensors, recorded two bike rides to within 1% of distance, a handful of meters of elevation, and a sub-meter median of the line traced by an Apple Watch Ultra 2 with a multi-band GPS chip and a commercial processing pipeline behind it. On the flight to Hong Kong the comparison was against a professional flight-tracking feed and the agreement held at altitude. Here it held on the street. The signal coming out of VeloGPS stands next to the complicated tool without flinching.