True Cost of Flying

Elke jet-tracker toont brandstof-CO₂ — en over de luchtvaart als geheel is CO₂ maar ongeveer een derde van de opwarming. True Cost of Flying toont dezelfde privéjetvlucht met de contrail-opwarming erbij, berekend met echte fysica (het CoCiP-model) en getekend op een kaart waar die werkelijk ontstond: brandstof-CO₂ versus gecombineerde CO₂e, naast elkaar

Rol
Solo — product & scope, de klimaatdata-pipeline (Python), de front-end (React · deck.gl · three.js) en DevOps
Klant
Zelf-geïnitieerd portfoliostuk
Disciplines
ProductKlimaatdata-engineeringDatavisualisatieFront-enddeck.glthree.jsDevOps
Links
Kort
  • Probleem — Elke jet-tracker toont alleen brandstof-CO₂ — ruwweg een derde van de opwarming van de luchtvaart. Contrails, het grotere niet-CO₂-aandeel, worden door geen enkele consumententool per vlucht geteld
  • Inzicht — Contrail-opwarming is vluchtspecifiek, geen vaste vermenigvuldiger — dezelfde route kan overdag koelen en ’s nachts opwarmen, dus moet het met echte fysica worden berekend
  • Oplossing — Solo gebouwd: een offline Python-pipeline (CoCiP · ERA5 · OpenAP) berekent vooraf 84 vluchten van 11 jets van publieke figuren; een statische React + deck.gl front-end toont brandstof-CO₂ versus gecombineerde CO₂e op een kaart
  • Resultaat — Live op contrails.ontwrpn.com — geen backend, hosting voor ongeveer £0; gevalideerd tegen gepubliceerde wetenschap (komt overeen met de conversiefactor van Contrails.org tot op 0,8%), onzekerheid op het scherm vermeld

CO₂ is maar een derde van het verhaal — contrails zijn het ontbrekende stuk

Het klimaatverhaal dat iedereen over vliegen vertelt, gaat over CO₂. Maar binnen de luchtvaart is CO₂ slechts ongeveer een derde van de opwarming; het grotere aandeel zijn niet-CO₂-effecten, gedomineerd door contrails — de witte strepen achter jets die uitwaaieren tot warmtevasthoudende cirrus. Contrail-cirrus alleen al heeft een grotere effectieve stralingsforcering dan alle CO₂ uit kerosine, en toch telt geen enkele consumententracker het per vlucht.

De markt splitst netjes en niemand zit ertussenin. Celebrity-jet-trackers rangschikken eigenaars op een vlakke CO₂-per-type-tabel. Contrails.org rangschikt commerciële vluchten op contrail-CO₂e, maar alleen per route en alleen binnen een voorspelvenster. Academische CoCiP-studies passen de fysica toe op privéjets, maar laten het in statische pdf’s met CO₂ en contrails apart gehouden. Het gat waarop ik mikte: brandstof-CO₂ en vluchtspecifieke contrail-CO₂e samensmelten tot één getal, per eigenaar, voor privéjets — en het resultaat leesbaar en geloofwaardig maken voor een leek.

Het eerlijke antwoord op “hoe erg was die vlucht echt?” is groter dan de CO₂ op elke rekenmachine — maar het ontbrekende stuk is onzichtbaar, grillig en echt moeilijk te berekenen

Drie oppervlakken op één gescrolde pagina — “de contrail is de pagina”

Het product bestaat uit drie oppervlakken, samengebonden door één idee waar ik me aan vasthield — de contrail is de pagina. Een leaderboard rangschikt de 11 eigenaars op gecombineerde opwarming (brandstof + contrails) als een donker bento-raster met warming-stripe-magnitudebalken. Een explorer laat je een bekende veelvlieger kiezen, dan een van hun vluchten, voor de twee-getallen-onthulling: brandstof-CO₂ versus gecombineerde CO₂e, opgeteld, met een GWP100 / GWP20-schakelaar waarvan de beweging het leermoment is — de contrails van één eigenaar springen van +90 t naar +332 t wanneer je de tijdshorizon wisselt.

De kaart maakt de these zichtbaar: een deck.gl TripsLayer inkt de contrail langs het echte vluchtspoor — amber voor de brandstof-CO₂-basislijn, rood over de ijs-oververzadigde band waar de ongetelde opwarming ontstaat, blauw waar het koelt — met een zachte gloed die over het spoor opbloeit terwijl het vliegtuig passeert. Boven alle drie pint de hero de pagina vast en vliegt de scrollpositie zelf een matglazen 3D-jet door het scherm, die de contrail erachter inkt. “Scroll om te vliegen” is letterlijk.

De hero — scrollen vliegt een matglazen 3D-jet over het scherm en inkt de contrail erachter. “Scroll om te vliegen” is letterlijk

De kaart — de contrail geïnkt langs het echte vluchtspoor; rood over de ene band waar de opwarming werkelijk ontstond. De kleur is de these

Leaderboard — 11 eigenaars gerankt op gecombineerde opwarming (brandstof + contrails)

De explorer — de twee-getallen-onthulling, met een GWP100 / GWP20-horizonschakelaar

Splits het systeem — zware offline-fysica, een read-only renderer

Het hele project rust op één architectuurbeslissing: twee strikt gescheiden helften. Een offline Python-pipeline zet adsb.lol-tracks om in CO₂ (OpenAP) en contrail-CO₂e (ERA5-meteorologie + het CoCiP-model van pycontrails), en levert een kleine statische parquet plus per-vlucht-GeoJSON. Eén vlucht laadt ruwweg 1 GB wereldwijde weersdata, dus dit kán niet op een gratis host draaien — het draait eenmalig, offline. De front-end is dan een pure renderer: een statische React + Vite + TypeScript + deck.gl SPA zonder backend en zonder API-sleutels, dus het deployt als één kleine nginx-container en kost ongeveer £0 om te draaien.

De zware fysica scheiden van een read-only renderer is de bindende keuze — daarom kan een fysica-zwaar idee op gratis hosting draaien

Nooit een kaal getal — eerlijkheid door constructie afgedwongen

Een vlakke vermenigvuldiger vervangen door een ondoorzichtig model lokt het voor de hand liggende bezwaar uit — waarom zou je het vertrouwen? — dus eerlijkheid wordt overal afgedwongen. Het gecombineerde cijfer is alleen brandstof-CO₂ plus contrails; de weggelaten termen (NOx, waterdamp, aerosolen) worden vermeld, zodat het nooit wordt opgeklopt tot de luchtvaartbrede ~3×. Het getal verschijnt nooit kaal: een GWP100 / GWP20-horizonschakelaar en een onzekerheidsband staan ernaast, omdat het IPCC bewust geen enkele metriek kiest.

En de twee getallen zijn niet even zeker — brandstof-CO₂ is hoog-betrouwbaar, contrails dragen ruwweg 70% onzekerheid (IPCC “lage betrouwbaarheid”), en dat staat op het scherm. Netto-koelende vluchten krijgen een voorbehoud, want CO₂ warmt eeuwenlang op terwijl contrail-koeling eenmalig is, dus een netto-negatief cijfer leest nooit als “klimaatpositief”. Bij een vlucht met weinig brandstof waar contrails de brandstof overstemmen, kopt het product absolute tonnen, geen misleidend percentage.

Klopt het model met wetenschap waarop het nooit is gefit?

Het reproduceert resultaten waarop het nooit is afgesteld. De vormingsincidentie ligt in dezelfde orde van grootte als de vlootstatistieken van Teoh et al. 2024. Dag versus nacht bepaalt het teken: Drake’s 767 vloog dezelfde route Toronto–Houston overdag (netto −10 t gekoeld) en ’s nachts (+1,6 t opgewarmd) — tegengesteld teken, identieke route. Een diepe-nachtvlucht voegde +90 t contrail-opwarming toe, ongeveer 2,4× de eigen brandstof van die vlucht, terwijl zes andere vluchten van dezelfde jet bijna niets vormden. De EF→CO₂e-conversie komt overeen met de eigen gepubliceerde factor van Contrails.org tot op 0,8%.

Waar het model afwijkt zeg ik het, en welke kant op — elke systematische bias duwt het cijfer omlaag, dus de tool neigt naar onderschatten, de conservatieve richting voor een verantwoordingsclaim

Een scroll-gevlogen 3D-hero, zonder de 3D-belasting

De matglazen jet is een CC-BY low-poly-model (toegeschreven in de footer), bij het laden gladgemaakt met Loop-subdivisie; een orthografische camera die in pixels wordt geschaald houdt het glasmateriaal fysiek stabiel en haalt schermrandvervorming weg; telefoons krijgen een rechtere klim en een kleinere jet, en prefers-reduced-motion — of een WebGL-fout — valt geruisloos terug op een SVG-glyph. De hele three.js-scène wordt als een lazy chunk van ~156 KB gzip buiten het kritieke pad van de hero geladen, en de ~400 KB map-stack is ook lazy-loaded, dus de kritieke-pad-JS daalde van ~457 KB naar ~59 KB gzip en de hero schildert snel.

Twee reviews hebben het gehard. Een adversariële multi-agent-pass over data/eerlijkheid, toegankelijkheid, performance en deployment ving een echte framing-scheur — een netto-koelende vlucht die een kale −154% toonde. Een aansluitende security-audit voegde HSTS toe, een strikt Content-Security-Policy (script-src ’self’, geen inline scripts), strakkere cache-control op statische data en assets, en interactive:false op de decoratieve kaart voor toegankelijkheid.

De lat: vertrouwd omdat de validatie standhoudt

Het stuk slaagt wanneer een reviewer de twee-getallen-onthulling bereikt, de contrail zichzelf rood ziet tekenen over het ene segment dat ertoe deed, de horizon wisselt en het getal ziet bewegen, begrijpt dat contrails ruwweg 30–60% toevoegen bij GWP100 (en waarom het luchtvaartbrede cijfer ~3× is), de onzekerheid ziet — en het getal vertrouwt omdat de validatie standhoudt tegen gepubliceerde wetenschap.

contrails.ontwrpn.com — live preview
Live demo
contrails.ontwrpn.com
Openen

Live — geen backend, hosting voor ongeveer £0, eerlijk door constructie

Bronnen

Volgend project
City Planner — siting-tool voor meerdere steden