True Cost of Flying

Chaque traqueur de jets montre le CO₂ du carburant — et sur l’ensemble de l’aviation, le CO₂ ne représente qu’environ un tiers du réchauffement. True Cost of Flying montre le même vol de jet privé avec son réchauffement par traînées de condensation ajouté, calculé avec une vraie physique (le modèle CoCiP) et tracé sur une carte là où il s’est réellement formé : CO₂ du carburant contre CO₂e combiné, côte à côte

Rôle
Solo — produit & cadrage, le pipeline de données climatiques (Python), le front-end (React · deck.gl · three.js) et le DevOps
Client
Projet de portfolio auto-initié
Disciplines
ProduitIngénierie de données climatiquesDatavisualisationFront-enddeck.glthree.jsDevOps
Liens
En bref
  • Problème — Chaque traqueur de jets ne montre que le CO₂ du carburant — grosso modo un tiers du réchauffement de l’aviation. Les traînées de condensation, la plus grande part hors CO₂, ne sont comptées par aucun outil grand public au niveau du vol
  • Insight — Le réchauffement des traînées est spécifique au vol, pas un multiplicateur fixe — une même route peut refroidir de jour et réchauffer de nuit, il faut donc le calculer avec une vraie physique
  • Solution — Construit en solo : un pipeline Python hors-ligne (CoCiP · ERA5 · OpenAP) précalcule 84 vols de 11 jets de personnalités publiques ; un front-end statique React + deck.gl montre le CO₂ du carburant contre le CO₂e combiné sur une carte
  • Résultat — En ligne sur contrails.ontwrpn.com — pas de backend, hébergé pour environ £0 ; validé contre la science publiée (correspond au facteur de conversion de Contrails.org à 0,8% près), incertitude affichée à l’écran

Le CO₂ n’est qu’un tiers de l’histoire — les traînées sont la pièce manquante

L’histoire climatique que tout le monde raconte sur l’avion, c’est le CO₂. Mais dans l’aviation, le CO₂ ne représente qu’environ un tiers du réchauffement ; la plus grande part est constituée d’effets hors CO₂, dominés par les traînées de condensation — les lignes blanches derrière les jets, qui s’étalent en cirrus piégeant la chaleur. Les cirrus de traînées à eux seuls ont un forçage radiatif effectif plus grand que tout le CO₂ du kérosène, et pourtant aucun traqueur grand public ne les compte au niveau du vol.

Le marché se divise nettement et personne ne se tient au milieu. Les traqueurs de jets de célébrités classent les propriétaires sur une table plate de CO₂ par type. Contrails.org classe les vols commerciaux par CO₂e des traînées, mais seulement par route et seulement dans une fenêtre de prévision. Les études CoCiP académiques appliquent la physique aux jets privés, mais la laissent dans des PDF statiques, le CO₂ et les traînées tenus séparés. La brèche que je visais : fusionner le CO₂ du carburant et le CO₂e des traînées spécifique au vol en un seul chiffre, par propriétaire, pour les jets privés — et rendre le résultat lisible et crédible pour un non-spécialiste.

La réponse honnête à « à quel point ce vol était-il néfaste, vraiment ? » est plus grande que le CO₂ de chaque calculateur — mais la pièce manquante est invisible, intermittente et vraiment difficile à calculer

Trois surfaces sur une page scrollée — « la traînée est la page »

Le produit, ce sont trois surfaces liées par une idée à laquelle je me suis tenue — la traînée est la page. Un classement range les 11 propriétaires par réchauffement combiné (carburant + traînées) en une grille bento sombre avec des barres de magnitude en bandes de réchauffement. Un explorateur permet de choisir un voyageur célèbre, puis l’un de ses vols, pour le face-à-face des deux chiffres : CO₂ du carburant contre CO₂e combiné, additionnés, avec une bascule GWP100 / GWP20 dont le mouvement est le moment pédagogique — les traînées d’un voyageur passent de +90 t à +332 t quand on change l’horizon temporel.

La carte rend la thèse visible : un TripsLayer de deck.gl encre la traînée le long de la trace réelle du vol — ambre pour la ligne de base du CO₂ carburant, rouge sur la bande sursaturée en glace où se forme le réchauffement non compté, bleu là où elle refroidit — avec une douce lueur qui éclôt sur la trace au passage de l’avion. Au-dessus des trois, le hero épingle la page et la position de scroll fait elle-même voler un jet 3D en verre dépoli à travers l’écran, encrant la traînée derrière lui. « Scroller pour voler », au sens littéral.

Le hero — scroller fait voler un jet 3D en verre dépoli à travers l’écran, encrant la traînée derrière lui. « Scroller pour voler », au sens littéral

La carte — la traînée encrée le long de la trace réelle du vol ; rouge sur la seule bande où le réchauffement s’est réellement formé. La couleur est la thèse

Classement — 11 propriétaires rangés par réchauffement combiné (carburant + traînées)

L’explorateur — le face-à-face des deux chiffres, avec une bascule d’horizon GWP100 / GWP20

Scinder le système — physique hors-ligne lourde, un rendu en lecture seule

Tout le projet repose sur une décision d’architecture : deux moitiés strictement séparées. Un pipeline Python hors-ligne transforme les traces adsb.lol en CO₂ (OpenAP) et en CO₂e des traînées (météorologie ERA5 + le modèle CoCiP de pycontrails), produisant un petit parquet statique plus un GeoJSON par vol. Un seul vol charge environ 1 Go de météo mondiale, donc cela ne peut pas tourner sur un hébergement gratuit — cela tourne une fois, hors-ligne. Le front-end est alors un rendu pur : une SPA statique React + Vite + TypeScript + deck.gl sans backend ni clés d’API, qui se déploie en un seul petit conteneur nginx et coûte environ £0 à faire tourner.

Séparer la physique lourde d’un rendu en lecture seule est le choix structurant — c’est pourquoi une idée lourde en physique tient sur de l’hébergement gratuit

Jamais un chiffre nu — l’honnêteté imposée par construction

Remplacer un multiplicateur plat par un modèle opaque appelle l’objection évidente — pourquoi lui faire confiance ? — alors l’honnêteté est imposée partout. Le chiffre combiné est uniquement CO₂ carburant plus traînées ; les termes omis (NOx, vapeur d’eau, aérosols) sont déclarés, pour qu’il ne soit jamais gonflé jusqu’au ~3× à l’échelle de l’aviation. Le chiffre n’apparaît jamais nu : une bascule d’horizon GWP100 / GWP20 et une bande d’incertitude l’accompagnent, parce que le GIEC ne choisit délibérément aucune métrique unique.

Et les deux chiffres ne sont pas également certains — le CO₂ carburant est de haute confiance, les traînées portent environ 70% d’incertitude (GIEC « faible confiance »), et c’est dit à l’écran. Les vols à refroidissement net sont nuancés, car le CO₂ réchauffe pendant des siècles tandis que le refroidissement des traînées est ponctuel, donc un chiffre net négatif ne se lit jamais comme « positif pour le climat ». Sur un vol à faible carburant où les traînées écrasent le carburant, le produit met en avant les tonnes absolues, pas un pourcentage trompeur.

Le modèle s’accorde-t-il avec une science sur laquelle il n’a jamais été ajusté ?

Il reproduit des résultats sur lesquels il n’a jamais été réglé. L’incidence de formation tombe dans le même ordre de grandeur que les statistiques de flotte de Teoh et al. 2024. Le jour contre la nuit en commande le signe : le 767 de Drake a volé la même route Toronto–Houston de jour (refroidi net de −10 t) et de nuit (réchauffé de +1,6 t) — signe opposé, route identique. Un vol en pleine nuit a ajouté +90 t de réchauffement par traînées, environ 2,4× le CO₂ du carburant de ce vol même, tandis que six autres vols du même jet n’en ont presque pas formé. La conversion EF→CO₂e correspond au facteur publié de Contrails.org à 0,8% près.

Là où le modèle diverge, je le dis, et dans quel sens — chaque biais systématique pousse le chiffre vers le bas, donc l’outil penche vers la sous-estimation, le sens conservateur pour une mise en cause de personnes

Un hero 3D piloté au scroll, sans la taxe de la 3D

Le jet en verre dépoli est un modèle low-poly CC-BY (crédité dans le pied de page), lissé au chargement par subdivision de Loop ; une caméra orthographique mise à l’échelle en pixels garde le matériau verre physiquement stable et supprime la distorsion de perspective au bord de l’écran ; les téléphones reçoivent une montée plus droite et un jet plus petit, et prefers-reduced-motion — ou tout échec WebGL — bascule en silence vers un glyphe SVG. Toute la scène three.js est livrée en un chunk lazy d’environ 156 Ko gzip hors du chemin critique du hero, et la pile de carte de ~400 Ko est aussi chargée en lazy, donc le JS du chemin critique est passé de ~457 Ko à ~59 Ko gzip et le hero s’affiche vite.

Deux revues l’ont durci. Une passe multi-agent adverse sur données/honnêteté, accessibilité, performance et déploiement a attrapé une vraie faille de cadrage — un vol à refroidissement net affichant un nu −154%. Un audit de sécurité de suivi a ajouté HSTS, une Content-Security-Policy stricte (script-src ’self’, aucun script inline), un cache-control resserré sur les données et assets statiques, et interactive:false sur la carte décorative pour l’accessibilité.

La barre : digne de confiance parce que la validation tient

La pièce réussit quand un évaluateur atteint le face-à-face des deux chiffres, regarde la traînée se dessiner en rouge sur le seul segment qui comptait, bascule l’horizon et voit le chiffre bouger, comprend que les traînées ajoutent environ 30–60% à GWP100 (et pourquoi le chiffre à l’échelle de l’aviation est ~3×), voit l’incertitude — et fait confiance au chiffre parce que la validation tient face à la science publiée.

contrails.ontwrpn.com — aperçu en ligne
Démo en ligne
contrails.ontwrpn.com
Ouvrir

En ligne — pas de backend, hébergé pour environ £0, honnête par construction

Sources

Projet suivant
City Planner — outil d’implantation multi-villes