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.
One letter per line
The first character of every line is the record type — a single letter A–L. 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:
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)
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.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:
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.
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.
| Field | Format | Example | Decimal |
|---|---|---|---|
| Latitude | DDMMmmm[N/S] | 5052197N | 50°52.197′ → 50.86995° |
| Longitude | DDDMMmmm[E/W] | 00412163E | 4°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.
Every record type
Filter by name or letter, or narrow by category. Colour encodes what a record does.
The H record
One line per field: H, a source letter (F recorder · O observer · P pilot), a 3-letter subtype, then the data.
| Subtype | Example | Meaning |
|---|---|---|
DTE | HFDTEDATE:230726,01 | Date of first fix, DDMMYY (+ flight-of-day). Legacy: HFDTE230726 |
PLT | HFPLTPILOTINCHARGE:… | Pilot in charge |
GTY | HFGTYGLIDERTYPE:… | Aircraft / wing type |
GID | HFGIDGLIDERID:… | Registration |
DTM | HFDTM100GPSDATUM:WGS-1984 | GPS datum (100 = WGS84, always) |
FTY | HFFTYFRTYPE:LXNAV,Nano4 | Recorder make & model |
RFW/RHW | HFRFWFIRMWAREVERSION:… | Firmware / hardware version |
CID/CCL | HFCIDCOMPETITIONID:B21 | Competition number / class |
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 02 3638 FXA 3940 SIU │ │ │ │ └ bytes 39–40 → satellites in use │ │ │ └ code │ │ └ bytes 36–38 → fix accuracy (m) │ └ start/end byte └ number of extensions
| TLC | Meaning | Unit |
|---|---|---|
FXA | Fix accuracy (horizontal) — mandatory | m |
SIU | Satellites in use | count |
ENL | Engine noise level (motor-glider proof) | 000–999 |
GSP | Ground speed | km/h |
TAS/IAS | True / indicated airspeed | km/h |
TRT | Track (true) | ° |
VAT/VAR | Vario (total-energy / uncompensated) | m/s |
OAT | Outside air temperature | °C |
LAD/LOD | Extra decimal places of lat / lon | — |
TDS | Decimal part of fix seconds | 1/10 s |
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.
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.
Where parsers go wrong
- Read dates day-first.
HFDTEisDDMMYY, never ISO — and accept bothHFDTEDATE:DDMMYY,NNand legacyHFDTEDDMMYY. - Minutes are thousandths.
MMmmmmeansMM.mmmminutes, not decimal degrees. ApplyLAD/LOD/TDSwhen theIrecord declares them. - Longitude is three degree-digits (
DDD), latitude two. Off-by-one shifts every fix. - Trust
AoverV. When validity isV, 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
Irecord. Gmay be missing. Absence means "unvalidatable," not "invalid" — soft-loggers routinely omit it.- Times wrap at midnight. Detect a decreasing
HHMMSSand roll the date forward.