Skip to content

Flight figures

This page covers the numbers on the flight detail pages (summary, Performance, Flight, Info, Phases, the declared task and optimisation pages) and on the map’s readings line. It builds on Flight analysis, which specifies the analysis itself. This page does not repeat these sections:

TopicWhere
Take-off, release, landing, engine runs, gliding block, height-gain rangeFlight analysis §5.1
Per-fix bearing, vario, ground speedFlight analysis §3.6
Pressure correction, and GPS altitude standing in for a missing baroFlight analysis §4.2
Thermals, legs (glides)Flight analysis §5.3–5.5
Leg, Optimization, TaskAttempt fieldsFlight analysis §2.4, §2.7, §2.8
The flight’s derived statistics (duration, averageGlideRatio, …)Flight analysis §2.1 (“Derived (lazy) statistics”)
Distance optimisationsFlight analysis §6
Task scoringFlight analysis §7.5
Per-fix average speed, average task speed, distance travelled, best 1 h / 2 hFlight analysis §7.6
Terrain elevationFlight analysis §8.1
Unit conversion, UnitFormatter, time formats, printf roundingFlight analysis §9
Barogram series, scale and readoutMap, barogram and airspace §4
Thermals page figuresThermals

Android ports every figure on this page from iOS. Where a figure differs, its section says so.

Every figure is computed in SI units: metres, seconds and m/s. Only the formatter converts it to the pilot’s unit. The output is "{number} {unit}". The number of decimals depends on the unit, not on the figure.

Unit settingDecimalsExample
Altitude: m, ft01240 m
Speed and wind: km/h, mph, kt098 km/h
Vertical speed: m/s22.49 m/s
Vertical speed: kt, ft/min05 kt
Distance: km, mi, nm2 (0 in the “rounded” variant)342.18 km
Percentage (percentageValue)2, format "%0.2f %%"34.00 %
Glide ratio (ldString)integer, format "%i:1"42:1

Rounding follows C printf on the exact binary value (flight analysis §9.3). Android reproduces it with CFormat. Numbers are not grouped, and the decimal separator is always ”.”.

FormatRuleUsed for
timeValueHH:mm:ss. A negative value gets +86400 and a value above 86400 gets −86400, once. Uses Float arithmeticDurations and times of day alike
shortTimeValue3h05m, 3h when the minutes are 0, 05m when the hours are 0. Seconds are dropped, and 0 gives 0hiOS inspector’s slim column
veryShortTimeValueOnly the non-zero parts: 1h 5m 30s, 45s. 0 gives an empty stringThermal phase caption

Durations go through timeValue, so a duration over 24 h wraps. 90 000 s shows as 01:00:00.

The detail pages hide what they cannot fill. They never show a placeholder.

  • A label/value item (DetailInfoItem) fails to build when its value is nil or empty. A paired row disappears when both of its items are missing. A section with no rows disappears.
  • A metric tile (DetailMetric) fails to build on a nil or empty string, so the tile is dropped and the grid closes up.
  • A summary row whose page has nothing to show is dropped. See §2.2.

The map’s readings line works the other way round. Each reading shows -- when it has no value (§8).

Some figures default to 0 rather than nil, so they show as 0. The sections below call these out.

All the figures on this page read Fix.pressureAltitude. It is never the raw B-record value:

  • When the whole log has a pressure altitude of 0, it is replaced by the GPS altitude (flight analysis §4.2, convertPressureToGPS).
  • Otherwise, when terrain elevation is available, it is calibrated so the first fix sits on the terrain, with the drift spread linearly to the last fix.

So a “height” on this page is the corrected baro altitude, or the GPS altitude for a log without a baro. The pilot’s barogram choice of pressure or GPS altitude (graphDataUnit, map-barogram §4.2) changes only the barogram. It changes nothing on this page.

Height above ground (AGL) = pressureAltitude − elevation, in metres. Fix.elevation defaults to 0, so a flight without terrain data shows its AGL equal to its MSL height, still labelled “AGL”. Only the map snapshot strip checks isElevationAvailable (§8.3).

Source: vulture-ios/Packages/Preferences/Sources/Preferences/Units/Formatter/UnitFormatter.swift, .../Units/Extensions/Double+Formatter.swift, Int+Formatter.swift, vulture-ios/Packages/Flights/Sources/Flights/Extensions/Int+Time.swift, vulture-ios/Packages/DesignSystem/Sources/DesignSystem/Extensions/Double+Percentage.swift, vulture-ios/Packages/FlightScreens/Sources/FlightScreens/FlightDetail/Rows/DetailInfoItem.swift, .../FlightDetail/Models/DetailMetricGrid.swift (DetailMetric.init?(label:formattedValue:tint:)); vulture-android/core/units/src/main/kotlin/be/fousa/vulture/core/units/UnitFormatter.kt, TimeFormats.kt, NumberFormats.kt.

These tiles also appear in the logbook list’s long-press preview, and the stored flight’s columns hold the same values.

TileValueShown when
DistancejudgedDistance, formatted with distanceStringnot nil
DurationjudgedDuration, formatted with timeValuenot nil
Average speed (flight.info.label.cruise.speed)judgedAverageSpeed, formatted with speedStringnot nil
Height gainaltitudeGained, formatted with altitudeString> 0
judgedDistance =
bestTaskAttempt.distance if bestTaskAttempt != nil and its distance > 0
else freeDistanceOptimization.distance if > 0
else nil (a winch hop)
judgedAverageSpeed = (follows the same branch as the distance)
task branch: bestTaskAttempt.averageSpeed if > 0, else nil
free branch: freeDistanceOptimization.averageSpeed if > 0, else nil
judgedDuration = duration ?? glidingBlockDuration (seconds)
altitudeGained = highestAltitudeFix.pressureAltitude − lowestAltitudeFix.pressureAltitude (m, 0 if either is nil)
  • The task branch is taken for an unfinished task attempt too, as long as it covered some distance. The distance and speed are then those of the path through the turnpoints it reached (flight analysis §2.8).
  • If the task branch is taken but its speed is not above 0, the speed tile is dropped. The free speed is not used in its place.
  • duration is landing minus take-off, in rawTime (flight analysis §2.1). The fallback to the gliding block applies only when there is no take-off or no landing fix.
  • altitudeGained is the height gain of the gliding range with the biggest climb above its own running minimum (flight analysis §5.1 processAltitudeGained). It is not the flight’s maximum minus its minimum.

iOS only, the slim figures. The inspector’s narrow column shows the same four tiles shortened. Distance uses roundedDistanceString (0 decimals, so 2500.9 m shows 3 km) and duration uses shortTimeValue. Speed and height gain are the same as in the tiles. Android has no slim column.

The rows appear in this order. A row is dropped when its condition fails.

RowShown whenCaptionHeadlineHeadline detail
Declared tasktask and bestTaskAttempt both existturnpoint count (plural string)“Completed” / “Unfinished” (isCompleted)task.distance when > 0
Performancesome distance optimisation has a distance > 0name of the best oneits distanceits averageSpeed when > 0
Thermalsthermals.count > 0thermal countaverageThermalVario (vertical speed)thermalPercentage (percentageValue)
Phasesphases is not emptynumber of cruise phasesphases.count (plain integer)—
FlightalwaysflightDuration (timeValue), or none——
Airspacethe crossing scan reported > 0 crossingscrossing count——
Infoalwayspilot name (logbook first, then IGC; blank counts as missing)——

The “best” optimisation is the largest distance among free, three turnpoints, triangle, out-and-return and out, taken in that order. On a tie, the first one in that order wins (Swift max(by:); Android keeps the same rule).

thermalPercentage = totalThermallingTime / duration × 100. Without a take-off or landing (duration == nil) the detail line is missing. averageThermalVario is time-weighted: Σ altitudeGained / Σ duration over all thermals, and nil when the total duration is 0. Both are covered in more depth in Thermals.

Source: vulture-ios/Packages/FlightScreens/Sources/FlightScreens/FlightDetail/Models/DetailFlightFigures.swift, .../FlightDetail/Summary/DetailSummaryViewModel.swift; vulture-android/domain/flightdetail/src/main/kotlin/be/fousa/vulture/domain/flightdetail/DetailFlightFigures.kt, DetailSummary.kt. Same as iOS.

RowValueMissing when
Gliding duration (flight.info.label.glide.duration)glidingBlockDuration (timeValue)no gliding block (row half hidden)
Height gainaltitudeGained (altitudeString)never: shows 0 m when there is no gain, unlike the summary tile
Best 1 h speedbest1hSpeedOptimization as an optimisation row (§3.2)nil
Best 2 h speedbest2hSpeedOptimization as an optimisation rownil
Maximum distance out (flight.label.optimization.maxout)maximumDistanceOutOptimization.distance (distanceString); a tap centres the map on its last fixnil

glidingBlockDuration = endGlidingBlockFix.rawTime − startGlidingBlockFix.rawTime. The gliding block is the longest engine-free stretch (flight analysis §5.1). The total gliding duration is this one block. It is not the sum of the cruise legs, which is the cruise duration in §4.2.

The best 1 h and 2 h windows come from the speed enricher (flight analysis §7.6). Their rows show the window’s distance and its average speed.

The five distance optimisations follow, in the order free, three turnpoints, triangle, out-and-return, out. A missing one is left out. Each row shows these values:

ValueRule
Distanceoptimization.distance (distanceString). When it is nil or 0, the declared task’s distance, else ""
Speed(optimization.averageSpeed ?? 0).speedString. It is always a string, so an optimisation with speed 0 shows 0 km/h
DetourtotalDetourDistance when > 0 (§6.3)

Optimization.averageSpeed = (km / (Δt / 3600)) / 3.6 m/s (flight analysis §2.7).

Source: vulture-ios/Packages/FlightScreens/Sources/FlightScreens/FlightDetail/Tabs/DetailTabPerformanceViewModel.swift, .../FlightDetail/Rows/DetailItemRow.swift (.optimization); vulture-android/domain/flightdetail/src/main/kotlin/be/fousa/vulture/domain/flightdetail/PerformanceTab.kt. Same as iOS.

RowFormulaFormatMissing when
Time (flight.info.label.time.duration)duration = landing.rawTime − takeoff.rawTimetimeValueno take-off or landing fix
Flight durationlanding.rawTime − (release ?? takeoff).rawTime − (engineRunTime ?? 0)timeValueno landing, or neither release nor take-off
Take-off typewinch / tow / self-launchlocalised labelunknown
Take-off performancesee belowverticalSpeedStringsee below
Average windmean of wind[*].speed (m/s)windSpeedStringnever: shows 0 km/h when no wind was estimated
Waterlogbook waterBalast in litreslocalised measurement (shortWaterValue)the flight is not in the logbook; 0 litres is shown

Take-off performance is the average climb from take-off to release, in m/s:

if release.pressureAltitude == 0:
gain = release.gpsAltitude − takeoff.gpsAltitude (nil if either GPS altitude is nil, e.g. a 2D fix)
else:
gain = release.pressureAltitude − takeoff.pressureAltitude
dt = release.time − takeoff.time (local time, not rawTime)
takeoffPerformance = dt > 0 ? gain / dt : nil

The figure is nil without a release or take-off fix. A tow climb therefore shows the average tow climb rate, and a winch launch the winch climb rate.

RowFormulaFormatMissing when
Cruise durationtotalCruisingTime = Σ leg.durationtimeValueno legs (legs == nil); an empty leg list gives 00:00:00
Cruise speed(Σ leg.distance / 1000) / (Σ leg.duration / 3600) / 3.6 m/sspeedStringeither sum is not above 0
Glide ratio (average L/D)Int(Σ leg.distance / Σ leg.altitudeDifference) × −1ldString, e.g. 42:1no distance, or a total altitude difference of 0
  • leg.distance is the leg’s 5-turnpoint optimised distance, not its path length (flight analysis §2.4).
  • leg.altitudeDifference = end.pressureAltitude − start.pressureAltitude, which is negative on a descending glide. The negation makes the ratio positive. The division is truncated toward zero before the negation.
  • If the glides gained height overall, the ratio is negative and shows as e.g. -35:1. Nothing clamps it.
  • A flight without thermals and without engine runs has no legs at all (flight analysis §5.5), so every cruise row is missing.

Cruise versus thermal split. The app never sums the two as a pair. Thermalling time is totalThermallingTime (Σ thermal durations, shown as a share of duration on the summary’s Thermals row). Cruise time is totalCruisingTime (Σ leg durations). The two do not add up to the flight time. Engine runs and the legs dropped for being no longer than minimumLegDuration count as neither (flight analysis §5.5).

This section shows only when engineRegistrationType is not empty, meaning some fix has ENL or MOP enabled.

RowValueMissing when
Engine type"ENL", "MOP" or "ENL + MOP"—
Engine runs"#" + engineRuns.count (countValue)count is 0
Engine durationengineRunTime = Σ run.duration (timeValue)the sum is 0

This section shows only when the log has more than one flap label. It is one bar per label, and each bar’s value is the number of fixes recorded at that flap position. That is a count of fixes, not of seconds, so it is only proportional to time at a constant logging interval.

Source: vulture-ios/Packages/FlightScreens/Sources/FlightScreens/FlightDetail/Tabs/DetailTabFlightViewModel.swift, vulture-ios/Packages/Flights/Sources/Flights/Models/Flight.swift (takeoffPerformance, totalCruisingTime, averageCruisingSpeed, averageGlideRatio, engineRunTime, averageWindSpeed); vulture-android/domain/flightdetail/src/main/kotlin/be/fousa/vulture/domain/flightdetail/FlightTab.kt, vulture-android/domain/flight/src/main/kotlin/be/fousa/vulture/domain/flight/model/FlightStatistics.kt, Flight.kt (takeoffPerformance).

Platform differences.

  • Water: Android uses plural resources (FIXED(B27)). The value is the same.
  • Glide ratio: both platforms format with ldString today. The Android comment FIXED(B26) says that iOS showed the bare integer, but the current iOS code uses .ldString too.
  • Average wind: iOS averages the values of a dictionary, which has no order. The floating-point sum can therefore differ in the last bit between runs. That never changes the 0-decimal display.

These are identity strings, not calculations. The logbook value wins over the IGC header value when the logbook value is not nil. On the Info and Flight pages a blank logbook value still wins and hides the row. Only the summary’s caption and title treat a blank value as missing (nonEmpty). The logger, FLARM, GPS and sensor rows come straight from the IGC header.

Source: vulture-ios/Packages/FlightScreens/Sources/FlightScreens/FlightDetail/Tabs/DetailTabInfoViewModel.swift.

The summary’s Declared task row and each tappable optimisation row open the same screen, built from a DetailOptimizationItem. For the declared task, the item wraps bestTaskAttempt together with the task.

TileValueShown when
Distanceas in §3.2always (an empty string drops it)
SpeedaverageSpeed.speedStringalways, including 0 km/h
Start heightTaskAttempt.startAltitude = pressure altitude of the first credited fixa task attempt with ≥ 2 credited fixes and a positive duration
Start speedstartGroundSpeed = ground speed of the first credited fixsame
Finish heightfinishAltitude = pressure altitude of the fix credited for the finishthe attempt is completed
Relative finish heightfinishAltitude − finishZone.minimumAltitudecompleted and the finish zone has a minimum (Elev)
AAT duration(finish.rawTime − start.rawTime) − minimumAATDurationcompleted and the task has a minimum AAT time
DetourtotalDetourDistance> 0

A free optimisation is an Optimization, not a TaskAttempt, so it has no start, finish, relative or AAT values. Its screen shows only distance, speed and detour.

Signed tiles. The relative finish height and the AAT duration both show a sign and a colour:

text = (d >= 0 ? "+" : "-") + format(|d|) // altitudeString or timeValue
tint = d >= 0 ? success (green) : brand (orange)

A difference of exactly 0 shows +0 m in green. The TaskAttempt doc comments say the differences are nil “when it was respected”, but the code sets them whenever both inputs exist.

Pressure-altitude fallback. finishAltitude is computed as finishFix?.pressureAltitude ?? finishFix?.gpsAltitude, and startAltitude the same way. pressureAltitude is never nil, so the GPS fallback never applies. A log with no baro already carries GPS values in pressureAltitude (§1.4).

There is one row per pair of consecutive credited fixes. A pair whose duration or distance is 0 is skipped, as happens when two turnpoints are credited at one fix. For a declared task, each waypoint the attempt never reached is then added as a failed leg.

ValueFormula
Timethe leg’s end fix time (timeValue)
Distancehaversine(previousFix, fix), 6371 km sphere (distanceString)
Speed(distance / 1000) / (duration / 3600) / 3.6, duration = fix.rawTime − previousFix.rawTime
Thermal varioΣ altitudeGained / Σ duration over the thermals that lie entirely within the leg’s time span; nil without any
Thermal shareΣ thermal duration / leg duration × 100 (percentageValue); nil when 0
Detour§6.3
Statussuccess, fail or unknown (shown as the leg number), from the best task attempt

The leg distances use the 6371 km haversine, but the headline distance uses the 6378.137 km optimisation path (flight analysis §13 item 5). So the legs do not add up exactly to the headline distance.

The leg item also computes the cruise speed and glide ratio over the flight’s legs inside the leg. When those glides lose no height, it falls back to Int(distance / (first.pressureAltitude − last.pressureAltitude)) over the leg’s own fixes. The leg row does not show these values. Compare and the Debrief read them; see Compare, ranking and statistics.

An unflown leg shows the declared distance: waypoint.distance, else the haversine from the previous waypoint. Instead of measured values it shows the declared bearing: waypoint.bearing, else the bearing from the previous waypoint, formatted "%i°". Every measured value is empty.

The detour is the extra distance flown over a leg compared to its straight line, not counting the circling.

flown = 0; i = 1
while i < legFixes.count:
if legFixes[i].thermal != nil:
last = last index j in legFixes where legFixes[j].thermal === legFixes[i].thermal
flown += haversine(legFixes[i−1], legFixes[last]); i = last + 1 // a thermal counts as entry → exit
else:
flown += haversine(legFixes[i−1], legFixes[i]); i += 1
detour = flown − legDistance
legDetour = detour > 100 m ? detour : nil
totalDetourDistance = Σ legDetour over the legs that have one, or nil when none has

legFixes is flight.fixes[indexes[k−1] ... indexes[k]]. fix.thermal is also set for rejected thermal candidates (flight analysis §13 item 9), so their circling is collapsed too. The 100 m threshold applies per leg, before the sum.

ConstantValue
Minimum leg detour100 m (strictly greater)
Earth radius6371 km

Source: vulture-ios/Packages/FlightScreens/Sources/FlightScreens/Models/DetailOptimizationItem.swift, DetailOptimizationItem+Legs.swift, OptimizedLeg.swift, vulture-ios/Modules/App/Sources/Map/OptimizationDetail/OptimizationDetailViewModel.swift, OptimizationDetailView.swift (OptimizationLegRow), vulture-ios/Packages/Flights/Sources/Flights/Models/TaskAttempt.swift (finalize(for:)); vulture-android/domain/flightdetail/src/main/kotlin/be/fousa/vulture/domain/flightdetail/DetailOptimizationItem.kt, OptimizationDetail.kt. Same as iOS. Android numbers the legs by their position in the list, 1…n (FIXED(B31)–FIXED(B33)).

The task popup opened from the task map shows the task’s own figures. Each tile is dropped when its value is missing.

TileValue
Distancetask.distance: the sum of the waypoint leg distances, recomputed whenever the waypoints change
Minimum heightthe finish zone’s minimumAltitude (altitudeString)
Minimum timetask.minimumAATDuration (timeValue)

When the popup is opened from a flight, it also shows the attempt status and the task optimisation row (§3.2).

Source: vulture-ios/Packages/FlightScreens/Sources/FlightScreens/FlightDetail/Tabs/DetailTabTaskViewModel.swift; vulture-android/feature/taskmap/src/main/kotlin/be/fousa/vulture/feature/taskmap/TaskDetailModel.kt.

The timeline is flight.phases: thermals, cruise legs, engine runs and event fixes, sorted as in flight analysis §2.6. The page’s filter shows all of them, or only one kind.

PhaseTimeCaptionValueValue detail
Eventfix.timetake-off and landing: "{pressureAltitude} MSL"; every other event: "{pressureAltitude − elevation} AGL"——
ThermalentryTimeduration.veryShortTimeValuethermal.vario (vertical speed); greyed when < 0altitudeGained, with + when > 0 (+620 m, -10 m, 0 m)
Cruiseleg.startFix.timeleg.averageSpeed (speedString)leg.distance (distanceString)"{averageGlideRatio}:1", missing when nil
Engine runstartFix.timeduration.timeValue——
  • The “MSL” and “AGL” suffixes are hard-coded English on both platforms.
  • The event caption for the high and low points of the height gain uses AGL, which equals MSL without terrain data (§1.4).
  • leg.averageSpeed = (distance/1000)/(duration/3600)/3.6, with no guard. A leg’s duration is always above minimumLegDuration, so the division is safe.
  • The leg glide ratio follows the same rule as the flight’s (§4.2): it is truncated, then negated, and nil when the distance is 0 or the altitude change is 0.

The summary’s Phases row counts every phase. Its caption counts the cruise phases (§2.2).

Source: vulture-ios/Packages/FlightScreens/Sources/FlightScreens/FlightDetail/Tabs/DetailTabPhasesViewModel.swift, .../FlightDetail/Rows/DetailItemRow.swift (eventRow, thermalRow, cruiseRow, engineRow, Fix.altitudeString, Thermal.altitudeGainedString); vulture-android/domain/flightdetail/src/main/kotlin/be/fousa/vulture/domain/flightdetail/PhasesTab.kt. Same as iOS.

The panel’s readings line shows the selected flight at the replay position (currentFix). The readings come in order of importance. The line shows as many as fit at full type size and drops the rest from the end.

#ReadingValueUnit label-- when
1Altitudefix.pressureAltitudealtitude unitno fix
2Variofix.vario (smoothed, flight analysis §3.6)vertical-speed unitno fix
3Ground speedfix.groundspeedspeed unitno fix
4Height above groundfix.pressureAltitude − fix.elevationaltitude unit + AGLno fix
5Distancefix.distanceTraveled × 1000 (the field is in km)distance unitno fix
6Average or task speedtask: fix.averageTaskSpeed; else fix.averageSpeedspeed unit + task or avgno fix, or the speed ≤ 0
7Track((bearing % 360) + 360) % 360 + °—no fix, or the fix has no bearing (the first fix)

The values use the formatters of §1.1 with the unit hidden. The unit is drawn separately in a smaller, fainter style. The “task” label and the task speed apply when the flight has a bestTaskAttempt, finished or not.

What the distance and speed readings mean comes from the speed enricher (flight analysis §7.6):

  • Average or task speed is a rolling average over the last 60 minutes of distance along the optimised path. It is not an average since the start: sum60 / (max(1, t − t₆₀) / 3600) / 3.6. The free pass fills averageSpeed along the free-distance optimisation. The task pass fills averageTaskSpeed along the best task attempt’s credited fixes.
  • Distance is the distance travelled along the optimised path: distance of the earlier legs + leg length − distance still to the next turnpoint. The task pass runs after the free pass and overwrites distanceTraveled within the task’s fix range. Within that range the reading is therefore the task distance, even when the speed reading is the free one.
  • A fix outside the optimised range keeps its default of 0. This includes fixes before the first turnpoint and the last turnpoint’s own fix and everything after it, unless the other pass covered them. Such a fix shows 0.00 km and an average speed of --.
ConstantValue
Average window3600 s
Empty-reading text--
Column width templates88888 altitude, -88.8 vario, 888 speed, 88888 AGL, 888.88 distance, 888 average, 888° track

The templates only size the columns, so a changing value does not move its neighbours. They have no effect on the values.

The scrubber bubble on the barogram formats its own values. See map-barogram §4.4. It is also the only place where the pressure or GPS altitude choice applies.

When a replay position is selected, the snapshot strip shows these values:

ValueFormat
Timefix.time.timeValue, after the date
Speedfix.groundspeed.speedString
Variovertical speed with 1 decimal (numberOfFractionDigits = 1)
MSLfix.pressureAltitude.altitudeString
AGLpressureAltitude − elevation, only when isElevationAvailable

Without a selected fix the strip shows only the identifier and the date.

Source: vulture-ios/Modules/App/Sources/Map/Flight/Flight/FlightViewModel.swift (PanelFlightItem conformance, snapshotContent()), .../Panel/Flights/Cells/PanelFlightReadoutView.swift, PanelFlightItem.swift, vulture-ios/Packages/Flights/Sources/Flights/Enricher/FlightSpeedEnricher.swift; vulture-android/feature/flightmap/src/main/kotlin/be/fousa/vulture/feature/flightmap/model/FlightMapPresentation.kt (panelFlightItems, averageSpeedString, trackString), .../model/SnapshotContent.kt, .../panel/FlightStrip.kt. Same as iOS.

9. Figures the flight detail does not show

Section titled “9. Figures the flight detail does not show”
  • Handicapped speed. Neither the flight detail nor the readings line divides by a handicap. The handicap, which comes from the competition a flight was opened from, is used only by the race ranking during a replay. See Compare, ranking and statistics.
  • Maximum and minimum heights. The detail pages have no maximum or minimum height figure. The highest and lowest points of the height gain appear as events on the Phases page (§7). The flight’s min/maxPressureAltitude set the barogram scale and the altitude colour ramp (map-barogram §3.2, §4.4), and maximumPressureAltitude pre-filters the airspace scan (map-barogram §5.7).