The idea

Two ways a lift shows up in a recording

Some devices stop counting distance on a lift, so the distance stands still while the elevation and the GPS position move. Others keep counting, and then a lift is a climb that looks like no ride: steep, steady, fast and in a straight line. The code looks for both, joins pieces that belong together, and runs the search again where the altimeter froze.

  1. Distance standing still while you climb or drop and travel.
  2. Follow every climb and find where it starts and ends.
  3. Check that it's a straight, steep, steady climb, with special care across gaps in the recording.
  4. Split climbs at stations where you change lifts.
  5. Join pieces broken up by the altimeter or GPS jittering.
  6. Search again on the corrected elevation where the altimeter froze.
On every chart:elevationlift foundaltimeter as recorded, where it differs
Step 1

Distance standing still

LIFT_MINIMUM_CLIMB_M 100 mLIFT_MINIMUM_TRAVEL_M 200 mLIFT_MINIMUM_DURATION_S 60 s

Wherever the distance doesn't change from one sample to the next, the code looks at the whole stretch where it stands still. That stretch is a lift when all three hold: the elevation ends at least 100 m higher or lower, the GPS position ends at least 200 m away in a straight line, and it lasts at least a minute.

Each rule rules something out. Without travel, it's the altimeter settling after the start or drifting during a pause. With less climb, it's a gap in the recording while you rode on. Shorter than a minute, it's an altimeter glitch. Standing still at the very start of the recording never counts, since that's GPS and the altimeter settling.

Schema · over time
liftdistanceelevationdistance stands still≥ 100 m up or down≥ 200 m apart (GPS), ≥ 60 s
Example · schüttel shuttle 1/6 · 07.03.2025 · over time
2004006008001'0000102030405060minmdistance (0 to 6.9 km)shuttle: 23 mindistance stays at 6.94 kmridden down
elevationdistancelift
After 38 minutes riding down, the shuttle drives you from 289 m back up to 833 m. The distance stays at 6.94 km for 23 minutes while GPS moves 2'517 m in a straight line, so all three rules hold. Plotted against distance, as the ride chart is, this would be a vertical line.

This rule found lifts on 19 of the 54 rides that have lifts.

Step 2

Following each climb

CLIMB_DIP_TOLERANCE_M 5 mLIFT_FLAT_START_M 10 mLIFT_LONG_LENGTH_M 1'000 m

Where the device keeps counting distance, the code walks the ride from sample to sample. From each sample it follows the climb while the elevation keeps rising. Dips of up to 5 m don't end it, since a lift's altimeter jitters too. The climb's top is its highest sample, and its bottom is where it was last lowest before that.

A climb is first tested from that bottom. If that fails, it's tried again from where it first gets 10 m higher, but only when at least 1 km of climb is left. This drops a flat approach to the lift (riding to the valley station) that would make the climb look too winding or too gentle. A shorter steep climb after riding on the flat is ridden, so it doesn't get this second try.

Schema · elevation along the ride
lowest pointrises > 10 m from heredip ≤ 5 m: climb goes onhighest point: topdip > 5 m ends the climb
Example · Fuck You Verbier Bikepark · 23.08.2021 · km 23.6 to 25.45
2'2002'3002'40024.024.525.0kmmlowest+10 mtop
lowesttop200 m
approach on the flat (seen from above)climblift
From its lowest point at km 23.86, this climb starts with 380 m of winding along the valley floor. Measured from there, the straight line from bottom to top is only 57 % of the way, so it fails. Tried again from km 24.24, where it first gets 10 m higher, the rest is 1'165 m long and 83 % straight, which passes.
Step 3

The straight-climb test

A climb from bottom to top is a lift only if it passes every one of these checks, in this order. Lengths and straightness go by the GPS track, with each position replaced by the median of the 9 around it, so a stray fix doesn't bend the line.

CheckRuleRules out2 crevaisons, lift 1a wee bit of ascending
Climb≥ 100 msmall climbs706 m188 m
Length≥ 500 mshort steep pushes (unless the ride starts on the lift, see below)2'216 m2'963 m
Grade20 to 50 %
15 % if ≥ 1 km
ridden climbs (gentler), altimeter jumps (steeper)32 %6 % ✕
Speed up≤ 300 m/minaltimeter jumps61 m/min·
Speed while recording≥ 15 m/minpushing or slow riding (pauses don't count)61 m/min·
Duration≥ 60 sglitches11 min 34·
Gapssee belowpushing while the recording pausednone·
Straightness≥ 75 %roads and trails that wind95 %·
Legs≤ 3climbs that zigzag (a mid-station is fine)1·
Terrain model≥ 100 m and the minimum gradethe altimeter climbing over flat ground698 m·

Straightness is the straight-line distance from bottom to top divided by the distance along the track. Legs are the straight lines left when the track is simplified with a tolerance of 30 m, or 5 % of the bottom-to-top distance when that's more.

Schema · seen from above
lift: 2 legs, straight line ≥ 75 % of the waytolerance 30 m or 5 %road or trail: straight line well under 75 %

Rides that start on a lift

When the climb starts within 100 m of the ride's start, there's no minimum length. You may have started recording on the lift, so only its last part is in the ride.

Example · 1st time @ Lenzerheide · 02.08.2016 · km 0 to 1.5
1'7501'8001'8501'9000.00.20.50.81.01.21.5kmmlift: 410 m long, too short, but it starts at km 0
The recording starts on the chairlift: 115 m up over 410 m, 28 % steep, 98 % straight. It's shorter than 500 m, but it starts at km 0.01, so it counts.
Step 3, continued

Climbs across gaps in the recording

PAUSE_AFTER_S 30 sLIFT_GAP_MINIMUM_CLIMB_RATE 8.5 m/minLIFT_RECORDED_LENGTH_M 250 mLIFT_RECORDED_SHARE 40 %

Devices often stop recording on a lift, or pause while you push the bike, so a climb can be a straight line between two samples many minutes apart. Seen from the track alone, both look the same. Two rules tell them apart:

Schema · over time
lift: 200 m in 15 min = 13 m/minpushed: 200 m in 24 min = 8.3 m/minno samples between the dots (time →)
Example · Chur DH · 27.06.2017 · over time
1'2001'4001'6000204060minmlift
recordedgaplift
The device recorded nothing on the cable car. Each of the five rides up is a gap of 12 to 20 minutes rising about 420 m, so 21 to 34 m/min: lifts.
Example · giftig däfür schöön · 06.09.2016 · over time
600700800020406080minm194 m in 24 min241 m in 50 min
recordedgap
Two climbs that are steep enough on the map (23 % and 27 %). But the gaps rise 194 m in 24 minutes (7.9 m/min) and 241 m in 50 minutes (4.9 m/min): pushed, not lifted.
Step 4

Stations between lifts

LIFT_STOP_CLIMB_M 30 mLIFT_STOP_TURN_DEGREES 15°TURN_STRETCH_M 300 m

Taking two lifts in a row makes one long climb. The code splits it at stops: pauses of more than 30 s, inside a closely recorded stretch, that rise less than 30 m. A stop splits the climb only if the way turns there by at least 15°, comparing the 300 m before with the 300 m after. Going on in the same direction, it's one lift standing still for a while.

Each piece is then tested on its own, and the result depends on how many pieces are lifts:

Schema · seen from above
pause > 30 s, rising < 30 mturn ≥ 15° (300 m on each side)lift 1lift 2
Example · 2 crevaisons · 24.09.2017 · km 21.6 to 26.1
1'0001'5002'0002223242526kmm7 min at the station
station500 m
One climb of 1'374 m from the valley. At km 24.3 the recording pauses for 7 min 23 while rising only 6 m, and the way turns by 58°. Both pieces pass on their own (706 m and 653 m up), so they're two lifts. The whole climb would have passed too, as one lift.
Example · a wee bit of ascending after all that descending · 20.07.2015 · km 0 to 6
4006008000123456kmmwhole climb: 188 m over 3 km = 6 %this piece alone: 22 %
A stop at km 2.58 splits this climb. The last piece, 109 m up over 503 m at 22 %, passes every check on its own. But it's the only lift piece, and the whole climb rises 188 m over 3 km, only 6 %. So it's ridden: no lift.
Step 5

Joining lift pieces

LIFT_GLITCH_GAP_S 15 sLIFT_JOIN_GAP_S 30 s

The altimeter or GPS jittering on a chairlift can end a climb early (a dip of more than 5 m), and the rest is found as a second piece. Lift pieces at most 15 s apart are always joined. Up to 30 s apart, they're joined when the second goes on in the same direction (it turns less than 15°). Otherwise it's the next lift, right after the first.

Schema · over time
≤ 15 s: always joined≤ 30 s: joined if it goes on in the same direction→ one lift→ one lift, or the next lift if it turns ≥ 15°
Example · weird crash · 27.08.2017 · km 0.3 to 3.9
1'6002'0002'400123kmm15 stwo pieces, one liftlift 1
elevationlift piecesgap between pieces
The second chairlift dips at km 2.35, which ends the climb, and the rest is found again 15 s later. The two pieces are joined into one lift. The same happens on the last lift (4 s apart), which is how this ride ends up with the 3 lifts it really has instead of 5.
Step 6

Lifts where the altimeter froze

A frozen altimeter doesn't climb on a lift, so the straight-climb test can't see it. When the elevation correction had the terrain model stand in anywhere on the ride (see the Elevation corrections page), the build runs steps 2 to 5 again on the corrected elevation, keeps the lifts it already had, and joins everything once more.

Example · shoulder slam · 29.04.2026 · the whole ride
600700800051015kmmaltimeter frozen
altimetercorrected elevationlift
The altimeter froze for most of the day and only jumped around the first lifts. On the recorded elevation the code finds 3 lifts. On the corrected elevation it finds the other 2 as well, at km 10.2 and 13.6: 5 laps, 5 lifts.
What comes out

On the rides

286lifts found
54rides with at least one lift
19rides where the distance stood still on a lift