Open Source Airline Fleet Catalog - Schema Proposal
Author: Clément Wehrung
Date: February 4, 2026
Status: Draft for Discussion
Implementation: See fleet-catalog/ directory
Overview
This document proposes a standardized JSON schema for an open source catalog of airline fleets. The goal is to track aircraft properties (WiFi, cabin configuration, IFE, etc.) across multiple airlines with a consistent format and change history.
Design Principles
- One JSON file per airline - Easy to maintain, review PRs, and avoid merge conflicts
- Standardized enums - Consistent values across all airlines (e.g., WiFi types)
- History tracking - Record property changes over time with timestamps
- Extensible - Room for airline-specific fields without breaking the schema
- Machine-readable - JSON Schema validation for data quality
Current Implementation
The schema has been implemented with Air France data exported from the fleet database:
- 220 aircraft with full property data
- History tracking for WiFi upgrades, seat config changes, etc.
- ICAO24 hex codes for ADS-B tracking correlation
Proposed Directory Structure
Schema Definition
Root Object (Airline File)
Aircraft Object
{
"registration": "FHPND",
"icao24": "39bda3",
"aircraft_type": {
"iata_code": "223",
"icao_code": "A223",
"manufacturer": "Airbus",
"model": "A220",
"variant": "300",
"full_name": "AIRBUS A220-300 PASSENGER"
},
"operator": {
"sub_fleet_code": "CA",
"cabin_crew_employer": "AF",
"cockpit_crew_employer": "AF"
},
"cabin": {
"physical_configuration": "Y148",
"operational_configuration": "C008Y135",
"saleable_configuration": null,
"total_seats": 148,
"classes": {
"first": 0,
"business": 0,
"premium_economy": 0,
"economy": 148
},
"freight_configuration": "PP000LL000"
},
"connectivity": {
"wifi": "high-speed",
"wifi_provider": "Starlink",
"satellite": true,
"live_tv": false,
"power_outlets": true,
"usb_ports": true
},
"ife": {
"type": "streaming",
"personal_screens": false
},
"status": "active",
"tracking": {
"first_seen": "2025-12-20",
"last_seen": "2026-02-05",
"total_flights": 3214
},
"metadata": {
"delivery_date": null,
"msn": null,
"line_number": null,
"production_site": null,
"engine_type": null,
"aircraft_name": null,
"livery": null,
"comments": null
},
"history": [...]
}
Standardized Enums
connectivity.wifi
| Value |
Description |
Examples |
"none" |
No WiFi available |
— |
"low-speed" |
Basic WiFi, typically < 10 Mbps |
Gogo ATG, old Ku-band systems |
"high-speed" |
Fast WiFi, typically > 50 Mbps |
Starlink, Viasat Ka-band, Gogo 2Ku |
connectivity.wifi_provider
Suggested standardized provider names:
| Provider |
Notes |
"Starlink" |
SpaceX LEO constellation |
"Viasat" |
Ka-band GEO satellites |
"Gogo 2Ku" |
Dual Ku-band antennas |
"Gogo ATG" |
Air-to-ground (US only) |
"Panasonic Ku" |
Ku-band system |
"Inmarsat GX" |
Global Xpress Ka-band |
"Anuvu" |
Formerly Global Eagle |
ife.type
| Value |
Description |
"none" |
No IFE system |
"overhead" |
Shared overhead screens only |
"seatback" |
Personal seatback screens |
"streaming" |
BYOD streaming to personal devices |
"hybrid" |
Both seatback screens and streaming |
status
| Value |
Description |
"active" |
Currently in service |
"stored" |
Temporarily stored/parked |
"maintenance" |
In heavy maintenance |
"retired" |
Permanently removed from fleet |
Cabin Class Codes
Standard codes used in configuration_raw:
| Code |
Class |
Notes |
F |
First Class |
Traditional first |
P |
First Class |
Premium first (e.g., La Première) |
J |
Business Cla ss |
Standard code |
C |
Business Class |
Alternative code |
W |
Premium Economy |
|
Y |
Economy |
|
History Tracking
Each time a property changes, append an entry to the history array:
History Fields
| Field |
Type |
Description |
timestamp |
ISO 8601 |
When the change was detected |
property |
string |
Dot-notation path to the changed field |
old_value |
any |
Previous value (or null if new) |
new_value |
any |
New value |
source |
string |
How the change was detected |
Source Values
| Value |
Description |
"flight_api" |
Detected via flight data API |
"airline_api" |
From airline's official API |
"manual" |
Manual update/correction |
"seatguru" |
SeatGuru or similar source |
"community" |
Community contribution |
Example: Air France A220-300
Example: Air France 777-300ER (Multi-Class)
Migration from Current Format
For existing data (e.g., Air France tracking), here's the field mapping:
| Current Field |
New Path |
Transformation |
registration |
registration |
Keep as-is (no dash) |
type_code |
aircraft_type.iata_code |
Direct mapping |
type_name |
aircraft_type.* |
Parse into manufacturer/model |
owner_airline_code |
Top-level airline.iata_code |
Move to file level |
owner_airline_name |
Top-level airline.name |
Move to file level |
wifi_enabled |
connectivity.wifi |
Combine with high_speed_wifi |
high_speed_wifi |
connectivity.wifi |
Y → "high-speed", else "low-speed" |
physical_pax_configuration |
cabin.configuration_raw |
Direct mapping |
| — |
cabin.classes |
Parse from configuration |
first_seen_date |
tracking.first_seen |
Direct mapping |
last_seen_date |
tracking.last_seen |
Direct mapping |
total_flights_tracked |
tracking.total_flights |
Direct mapping |
WiFi Conversion Logic
Cabin Configuration Parser
Metadata Fields (for PlaneSpotters-style data)
These fields capture additional data often found on PlaneSpotters.net:
Metadata Field Descriptions
| Field |
Description |
Example |
delivery_date |
Date aircraft was delivered to airline |
2022-03-15 |
msn |
Manufacturer Serial Number |
55012 |
line_number |
Production line number |
1234 |
production_site |
Factory location |
Toulouse, Hamburg, Mirabel, Charleston |
engine_type |
Engine model |
Trent XWB-84, GE90-115B, PW1500G |
aircraft_name |
Given name (if any) |
Fort-de-France, Château de Versailles |
livery |
Special paint scheme |
standard, SkyTeam, Olympic 2024 |
comments |
Additional notes |
Free text |
Production Sites Reference
| Manufacturer |
Sites |
| Airbus |
Toulouse (France), Hamburg (Germany), Tianjin (China), Mobile (USA) |
| Boeing |
Everett (USA), Renton (USA), Charleston (USA) |
| Airbus Canada |
Mirabel (Canada) |
| Embraer |
São José dos Campos (Brazil) |
Validation
A JSON Schema file should be maintained at schema/aircraft.schema.json for:
- CI validation on PRs
- Editor autocomplete
- Documentation generation
Open Questions
- Registration format: ✅ Decided: Strip dashes (
FHPND not F-HPND)
- ICAO24 hex codes: ✅ Decided: Yes, include for ADS-B correlation
- Frequency of updates: Real-time vs. daily snapshots?
- Historical snapshots: Keep full point-in-time snapshots or just deltas?
- API access: Should we provide a read-only API for querying?
- PlaneSpotters integration: How to merge MSN, delivery dates, aircraft names?
Implementation Status