Aviation Data · Retrospective · Nov 2026

Why I switched off the IST delay pipeline.

From May to October 2026 a small pipeline built a flight-delay dataset for Istanbul Airport — a paid backfill of May to July, then nightly collection — joined it with ADS-B tracks and weather, and published a delay dataset, a model and a live prediction board here. On 14 November 2026 I switched it off. It produced real results, but it had stopped producing trustworthy data two months before anyone noticed — including me. This page is what it found, what broke it, and why I'm putting the time back into mechanical engineering.

136,459flights collected over 134 clean days, May – Sep 2026
11.8%of passenger departures left the gate 15+ min late
0.729live AUC on 1,067 real flights scored before they flew — offline tests of the same method said 0.711–0.716
3outside services it depended on, plus the accounts and tokens linking them

Timeline

Six months, three data sources, one person.

  1. May 1 – Jul 26 · paid backfill~1,500 flights a day. 96% of everything in the dataset comes from these 85 days.
  2. Jul 27 · free tierDown to ~100 flights a day — the free schedule API allows 100 requests a month. Enough for a live board, not for a full airport.
  3. Aug 17 – Sep 5 · three failures at onceOpenSky lost coverage of Istanbul, my OpenSky API account was disabled, and the token that publishes to this site expired. I fixed the account and the token by hand; the coverage came back on its own in early September.
  4. Sep 13 · the quiet oneThe schedule provider changed what its "delay" field measures. Nothing errored. The delay rate on this site went from about 13% to 66% overnight. Details below.
  5. Oct 11 · OpenSky stops answeringEvery request through the relay that lets GitHub's servers reach OpenSky started coming back as HTTP 502. Daily flight counts fell from ~100 to 0–2. Every run still reported success.
  6. Nov 14 · switched offWorkflows disabled, pages frozen on the clean period (May 1 – Sep 12), this write-up published.

The quiet failure

Istanbul didn't suddenly get five times later. The definition did.

The delay label came from the schedule provider, which reports a delay value only for some flights. I treated a blank as "on time" and checked that once against an independent source — OpenSky's ADS-B timestamps — and it held. Then, on 13 September, the provider started filling in a value for 98% of flights instead of ~30%, and the share of departures labelled 15+ min late jumped from about 13% to about 66%.

The independent timestamps show what actually changed. Before 13 September, the reported delay ended about 25 minutes before the aircraft was seen airborne — it measured the pushback from the gate, and taxiing came after. From 13 September it ended about 1.5 minutes before airborne — it now measured takeoff, so it included Istanbul's ~20-minute taxi. Meanwhile the time from schedule to airborne didn't move at all.

Reported delays vs. independent airborne times, weeklyFrom 13 September the reported late share jumps from about 13% to 65%, while the median time from schedule to airborne stays near 21 minutes.Share of departures reported 15+ min late0%20%40%60%80%Week of 27 Apr: 9.0% · 532 departuresWeek of 4 May: 11.7% · 3,914 departuresWeek of 11 May: 17.2% · 4,377 departuresWeek of 18 May: 12.6% · 4,731 departuresWeek of 25 May: 10.3% · 4,956 departuresWeek of 1 Jun: 10.3% · 4,658 departuresWeek of 8 Jun: 12.9% · 2,688 departuresWeek of 15 Jun: 11.5% · 5,275 departuresWeek of 22 Jun: 11.4% · 5,264 departuresWeek of 29 Jun: 12.1% · 5,912 departuresWeek of 6 Jul: 12.6% · 5,543 departuresWeek of 13 Jul: 14.1% · 5,663 departuresWeek of 20 Jul: 19.5% · 5,668 departuresWeek of 27 Jul: 13.1% · 1,196 departuresWeek of 3 Aug: 12.0% · 736 departuresWeek of 10 Aug: 14.2% · 688 departuresWeek of 17 Aug: 16.5% · 568 departuresWeek of 24 Aug: 21.1% · 740 departuresWeek of 31 Aug: 13.9% · 323 departuresWeek of 7 Sep: 17.3% · 693 departuresWeek of 14 Sep: 61.6% · 644 departuresWeek of 21 Sep: 65.2% · 664 departuresWeek of 28 Sep: 74.2% · 640 departuresWeek of 5 Oct: 65.8% · 579 departuresMedian minutes from schedule to airborne (OpenSky, independent)020406080Week of 25 May: 22.4 min · 4,956 departuresWeek of 1 Jun: 22.3 min · 4,658 departuresWeek of 8 Jun: 23.1 min · 2,688 departuresWeek of 15 Jun: 21.9 min · 5,275 departuresWeek of 22 Jun: 22.4 min · 5,264 departuresWeek of 29 Jun: 22.5 min · 5,912 departuresWeek of 6 Jul: 22.4 min · 5,543 departuresWeek of 13 Jul: 23.3 min · 5,663 departuresWeek of 20 Jul: 24.4 min · 5,668 departuresWeek of 27 Jul: 25.0 min · 1,196 departuresWeek of 3 Aug: 21.0 min · 736 departuresWeek of 10 Aug: 23.6 min · 688 departuresWeek of 31 Aug: 19.8 min · 323 departuresWeek of 7 Sep: 25.0 min · 693 departuresWeek of 14 Sep: 19.7 min · 644 departuresWeek of 21 Sep: 21.2 min · 664 departuresWeek of 28 Sep: 22.6 min · 640 departuresWeek of 5 Oct: 20.4 min · 579 departuresMayJunJulAugSepOct13 Sep: definition change
Show the numbers
Week ofDeparturesDelay value presentReported 15+ lateSchedule→airborne (min)
27 Apr53224%9.0%—
4 May3,91429%11.7%—
11 May4,37738%17.2%—
18 May4,73129%12.6%—
25 May4,95626%10.3%22.4
1 Jun4,65826%10.3%22.3
8 Jun2,68832%12.9%23.1
15 Jun5,27527%11.5%21.9
22 Jun5,26425%11.4%22.4
29 Jun5,91226%12.1%22.5
6 Jul5,54330%12.6%22.4
13 Jul5,66330%14.1%23.3
20 Jul5,66843%19.5%24.4
27 Jul1,19635%13.1%25.0
3 Aug73631%12.0%21.0
10 Aug68835%14.2%23.6
17 Aug56842%16.5%—
24 Aug74044%21.1%—
31 Aug32340%13.9%19.8
7 Sep69345%17.3%25.0
14 Sep64499%61.6%19.7
21 Sep66499%65.2%21.2
28 Sep64099%74.2%22.6
5 Oct57999%65.8%20.4
What it cost: four weeks of data that looked fine, a model retrained on it, and a live board whose predictions said 16% while the "actual" rate read 59%. The board kept ranking flights in a sensible order (AUC 0.667), but its probabilities stopped meaning anything. All of it is excluded from the archived pages.

Why I'm stopping

Keeping it alive had become maintenance, not engineering.

A pipeline like this has to keep three outside services working together — a flight-tracking network, a commercial schedule API and a relay server — plus the tokens and accounts that connect them. Each one changes on its own schedule, without telling you: coverage disappears, an account gets disabled, a field quietly changes meaning, a server starts returning errors. None of that is under my control, and almost none of it shows up as a failed run. Keeping up with all of it is hard for one person — and the moment I stopped watching closely, it drifted for two months without anyone knowing.

Both failures that ended it were silent: the pipeline logged a warning and exited "successfully", so the site kept serving numbers that looked plausible. If I kept it running, the next fix would have to be monitoring — alerts on zero rows, checks that the label still means what it meant. That is real work, but it is not the work I want this portfolio to be about. I'm a mechanical engineering student, and that is where the time is going now.

What survived

The results from the clean period still stand.

0.729live AUC — predictions logged before departure, scored after, Aug 5 – Sep 12
10.2% vs 11.7%average predicted vs actual late rate on those 1,067 flights — close to calibrated
53.9%of departures with under 60 min on the ground ran late, vs 13.7% at 60–90 min — the strongest single signal

How the live board's probabilities held up

Each flight was given a delay probability before it departed. Grouped by that probability, here is how often they really were late:

Predicted riskFlightsAverage predictedActually late
0–8%6073.5%6.1%
8–12%1819.8%10.5%
12–20%10114.9%17.8%
20–35%13626.7%27.2%
35%+4243.4%33.3%

The middle of the range is almost exactly right. The "safe" flights ran late about twice as often as predicted — the same weakness the offline tests showed: a bad day hits normally punctual flights, and nothing in their history warns of it.

Lessons

What I'd do differently.

The archive

The pages stay up, frozen on the clean data.