IGC flight-recorder format
records A–L We-Fly

Interactive specification

The IGC flight-recorder file, decoded.

Every flight in a soaring logbook starts as an .igc file — plain ASCII, one record per line, written by a GNSS recorder or a phone app. The B record is its heartbeat: a GPS fix, ten times a minute. Paste a file below and watch the barograph draw itself.

Barograph — altitude vs time pressureGNSS
Plain ASCII, line-oriented Fixed-column records WGS84 · UTC FAI-validated (G record)
01 Overview

One letter per line

The first character of every line is the record type — a single letter AL. The rest of the line is fixed-width and/or delimited data whose layout depends on that letter. A recorder writes the file once, in order:

record order
A  recorder identification          (one, first line)
H  header metadata                  (pilot, glider, date, hardware)
I  B-record extension schema        (extra fix fields)
J  K-record extension schema        (optional)
C  task declaration                 (optional, pre-flight)
F  satellite constellation          (at start, then on change)
B  position fix  ── repeated ──      the track / barograph
E  events    K  periodic data       (interleaved with B)
G  security signature               (last; optional on soft-loggers)
Reference implementation. We-Fly parses uploads with igc-parser. When a real file disagrees with the strict manufacturer spec — soft-loggers do this constantly — follow the tolerant behaviour, not the letter of the law.
02 B-record anatomy

The fix, byte by byte

A B record is a 35-byte fixed base, optionally extended by fields the I record declares. Columns are 1-indexed from the B. Hover a field:

Hover or focus a field to decode it.
03 Live decoder

Paste IGC, read it back in English

Edit the file on the left. Every line is parsed live — the record letter is colour-coded, B-record coordinates are converted to decimal degrees, and the barograph redraws from the fixes. Nothing leaves the page.

IGC source · editable
Decoded live
Barograph — from your fixes pressureGNSS
04 Coordinates & altitude

Degrees, minutes, thousandths

Latitude and longitude are not decimal degrees. They are degrees + minutes + thousandths of a minute, WGS84, with a hemisphere letter. Longitude degrees take three digits, latitude two.

FieldFormatExampleDecimal
LatitudeDDMMmmm[N/S]5052197N50°52.197′ → 50.86995°
LongitudeDDDMMmmm[E/W]00412163E4°12.163′ → 4.20272°

Altitude — two of them, both in metres

Pressure altitude (cols 26–30) is on the ISA 1013.25 hPa datum — not the pilot's QNH. GNSS altitude (cols 31–35) is the WGS84-ellipsoid height. When fix validity is V (2D), trust pressure altitude and treat the GNSS value as unreliable.

05 Record explorer

Every record type

Filter by name or letter, or narrow by category. Colour encodes what a record does.

06 Header fields

The H record

One line per field: H, a source letter (F recorder · O observer · P pilot), a 3-letter subtype, then the data.

SubtypeExampleMeaning
DTEHFDTEDATE:230726,01Date of first fix, DDMMYY (+ flight-of-day). Legacy: HFDTE230726
PLTHFPLTPILOTINCHARGE:…Pilot in charge
GTYHFGTYGLIDERTYPE:…Aircraft / wing type
GIDHFGIDGLIDERID:…Registration
DTMHFDTM100GPSDATUM:WGS-1984GPS datum (100 = WGS84, always)
FTYHFFTYFRTYPE:LXNAV,Nano4Recorder make & model
RFW/RHWHFRFWFIRMWAREVERSION:…Firmware / hardware version
CID/CCLHFCIDCOMPETITIONID:B21Competition number / class
07 Fix extensions

The I record & three-letter codes

The I record declares the extra fields appended to every B record: a count, then for each a start byte, end byte, and a three-letter code (TLC). J/K do the same for periodic data.

I record — 2 extensions
I 02 3638 FXA 3940 SIU
   │  │    │    │    └ bytes 39–40 → satellites in use
   │  │    │    └ code
   │  │    └ bytes 36–38 → fix accuracy (m)
   │  └ start/end byte
   └ number of extensions
TLCMeaningUnit
FXAFix accuracy (horizontal) — mandatorym
SIUSatellites in usecount
ENLEngine noise level (motor-glider proof)000–999
GSPGround speedkm/h
TAS/IASTrue / indicated airspeedkm/h
TRTTrack (true)°
VAT/VARVario (total-energy / uncompensated)m/s
OATOutside air temperature°C
LAD/LODExtra decimal places of lat / lon
TDSDecimal part of fix seconds1/10 s
08 Task declaration

The C record

A pre-flight declared task: one header line (declaration date/time, flight date, task id, turnpoint count, description), then one line per point reusing the B-record coordinate format.

declared FAI triangle
C230726210000230726000102Demo Triangle
C5052000N00412000ETakeoff
C5100000N00500000ETP1
C5052000N00412000ELanding

Point count = takeoff + start + turnpoints + finish + landing. The coordinates are identical in format to a B-record fix, so the same decoder handles both.

09 Parsing gotchas

Where parsers go wrong

  • Read dates day-first. HFDTE is DDMMYY, never ISO — and accept both HFDTEDATE:DDMMYY,NN and legacy HFDTEDDMMYY.
  • Minutes are thousandths. MMmmm means MM.mmm minutes, not decimal degrees. Apply LAD/LOD/TDS when the I record declares them.
  • Longitude is three degree-digits (DDD), latitude two. Off-by-one shifts every fix.
  • Trust A over V. When validity is V, the GNSS altitude is unreliable — prefer pressure altitude or drop the fix.
  • Pressure altitude is on 1013.25 hPa, in metres — not the pilot's QNH, not feet.
  • Slice by column, not whitespace. B records have none; extensions are byte-positional per the I record.
  • G may be missing. Absence means "unvalidatable," not "invalid" — soft-loggers routinely omit it.
  • Times wrap at midnight. Detect a decreasing HHMMSS and roll the date forward.
10 Sources

What this reconciles