Engineering Diary, Day 6: 199 Jets, 197 New Images, and the Data Audit That Killed 10 Aircraft
The CEO Opened NetJets
Three words changed my entire day: "太小儿科了" (too amateur). Wei pulled up the NetJets fleet page, then pulled up ours. The difference was immediate and painful.
NetJets shows real aircraft. Split-layout cards with cinematic photography on the right, detailed specs on the left. Category navigation that makes you feel like you are browsing a luxury catalog. Our fleet page? Five vague category descriptions and zero actual airplanes. For a platform that claims to charter private jets, not showing a single jet was, in retrospect, absurd.
This diary covers the six-hour sprint that followed. Three commits, 228 files changed, 3,868 lines added.
First: Fix What's Broken
Before touching the fleet page, I had to deal with two production issues that had been silently burning.
Routes 500 Error
All 10 programmatic route landing pages (/routes/beijing-to-shanghai, /routes/new-york-to-london, etc.) were returning 500 errors. The root cause: generateStaticParams was not passing the locale parameter. Next.js 16 requires every dynamic segment to be covered in static params. With 4 locales and 10 slugs, that is 40 pre-rendered pages that were all silently failing.
The fix was three lines. The debugging took thirty minutes. Welcome to web development.
Canonical URL Split
Google was indexing both flyvolo.ai and www.flyvolo.ai as separate sites, splitting our SEO authority in half. Updated robots.ts, sitemap.ts, layout.tsx metadata, all OpenGraph images, and every JSON-LD structured data block to point at www.flyvolo.ai as the single canonical origin.
The Two-Tier Data Architecture
The fleet redesign started with a data problem. We had 15 aircraft in aircraft.ts with full specs — cabin dimensions, performance data, amenities, AI match notes. But the real charter market has hundreds of models. Showing only 15 felt incomplete.
Solution: a two-tier catalog system.
- Tier 1:
aircraft.ts— 15 flagship aircraft with deep editorial content, full detail pages at/fleet/[slug] - Tier 2:
aircraft-catalog.ts— 199 verified jet models with display metadata (name, manufacturer, category, image ID, passenger count, range)
This reflects how the charter industry actually works. We can arrange any of 199+ model types through our operator network, but we have curated deep content for 15 flagship models that represent the best in each category.
The Data Audit That Killed 10 Aircraft
The initial catalog had 209 entries. Then I put on my aviation expert hat and audited every single one.
What I found was alarming. 10 aircraft that do not exist had somehow made it into our database:
- Citation IV — Cessna never built this. The Citation III jumped to the Citation V.
- Hawker 450XP — A cancelled program that never entered production.
- Hawker 850X, 850XPi, 850, 900 — Wrong model designations. The real lineup is Hawker 800XP, 850XP, 900XP.
- Legacy 550 — Does not exist. Embraer made the Legacy 450 and 500.
- Gulfstream GI — A turboprop, not a business jet. Does not belong in a jet charter catalog.
- Cessna 750, 551 — Duplicates of existing entries under their marketing names (Citation X, Citation II).
Beyond the ghost aircraft, 18 models were in the wrong category. The Learjet 60 family was listed as Heavy — it is a Midsize jet. The G100 and G150 were listed as Midsize — they are Light jets. Falcon 50/50EX were Midsize — they belong in Super Mid.
Honda was listed as the manufacturer. The correct legal name is Honda Aircraft Company.
"Citation Jet" was two words. The official Cessna trademark is one word: CitationJet.
Total corrections: 10 removals, 18 recategorizations, 2 manufacturer fixes, 2 naming fixes, 15 hasDetailPage flag recalibrations, and 2 slug mismatches. Final verified count: 199 jet models across 7 categories.
If you are building a platform in a domain you are not an expert in, your AI-generated data will contain confident errors. The Citation IV sounded perfectly plausible. You need domain knowledge — or at minimum, a rigorous fact-checking pass — to catch these.
Four New Components
ManufacturerBadge
Small-caps italic text component. "CESSNA" feels different from "Cessna" — the all-caps treatment signals luxury and authority. Same pattern NetJets uses for manufacturer attribution.
AircraftCard
The flagship component. NetJets-inspired split layout: 42% text on the left, 58% image on the right, with alternating left-right positions for visual rhythm. Each card shows the manufacturer badge, aircraft name in serif font, key specs (passengers, range, speed), a brief description, and a "View Details" CTA. The image uses object-fit: cover with a subtle dark gradient overlay from the text side.
CatalogCard
Compact grid card for the 199-model catalog. Shows the aircraft image, name, manufacturer, passenger count, range, and a category badge. Models with detailed spec pages get a "Full Specs" indicator linking to /fleet/[slug]. The cards render in a responsive 3-column grid.
RelatedAircraft
"You May Also Consider" section on detail pages. Shows 2-3 aircraft from the same category, excluding the current one. Positioned before the final booking CTA to encourage exploration without interrupting the conversion funnel.
197 Aircraft Images
Every model in the catalog needed a visual. We generated AI side-view renders at 1200x396 (3:1 aspect ratio) for each aircraft. The renders use a consistent style — white background, slight shadow, profile view — to create a clean, catalog-like aesthetic.
Each image is named by its database model ID ([modelId]_ai_exterior.jpg) for deterministic mapping. No lookup tables, no string matching — just /images/aircraft/[modelId]_ai_exterior.jpg.
Site-Wide Copy Audit
While auditing the fleet data, I discovered we had been claiming "500+ aircraft" across 18 files. This number was a hallucination from the early scaffolding phase — it sounded impressive but was completely made up.
The truthful framing: VOLO covers 200+ jet models encompassing tens of thousands of charter aircraft worldwide. The distinction matters. We do not own 500 planes. We provide access to a global network of operators flying 200+ different model types. Every reference was updated.
The Fleet Page Architecture
The new fleet listing page uses a two-section layout:
- Flagship Fleet — 15 aircraft rendered as large
AircraftCardcomponents, grouped by category with bilingual metadata (English + Chinese taglines, descriptions, passenger counts, price ranges) - Full Catalog — 199 models in a filterable 3-column grid of
CatalogCardcomponents, organized by 7 categories: Very Light, Light, Midsize, Super Mid, Heavy, Ultra Long Range, VIP Airliner
Detail pages got upgraded too: manufacturer badge in the hero, a split overview layout (60% editorial content + 40% sticky summary card with booking CTA), and the RelatedAircraft section before the final CTA.
What Shipped Today
| Change | Scope | Impact |
|---|---|---|
| Routes 500 fix | 1 file, 3 lines | 40 pre-rendered pages restored |
| Canonical URL unification | 8 files | SEO authority consolidated to www.flyvolo.ai |
| Fleet page redesign | 228 files, 3,868 insertions | 199 verified jet models, 197 new images, 4 new components |
| Data audit | aircraft-catalog.ts | 10 fake aircraft removed, 18 recategorized, 21 total fixes |
| Copy audit | 18 files | "500+ aircraft" hallucination corrected site-wide |
Reflections
Today was a lesson in standards. The fleet page was "fine" — it had content, it rendered, it did not crash. But "fine" is not the standard when you are asking people to wire five figures for a charter flight. The standard is NetJets. The standard is VistaJet. The standard is: would a person with a $10 million net worth trust this website with their travel?
The answer, before today, was no. After today, it is closer to yes. 199 real, verified aircraft models. Every one with a photo. Every one in the correct category. Every spec fact-checked against manufacturer data. Zero ghost aircraft, zero hallucinated numbers.
The hardest part of building with AI is not generating content — it is verifying content. The AI can produce 209 aircraft entries in seconds. Catching the 10 that should not exist requires domain expertise that no language model has. The human-AI collaboration is not "AI generates, human approves." It is "AI drafts, human audits, AI corrects." That loop is where quality lives.
Manténgase informado
Ofertas de tramos vacíos, nuevas rutas y análisis de aviación — en su bandeja de entrada.