Website
The consumer reference site at flighthelp.net. The visible front door for travelers, the demonstration that the underlying infrastructure works, and the SEO surface that brings new builders, contributors, and journalists to the project.
This document covers what the site is for, what pages it has, how each is structured, and the design and performance constraints. The implementation stack is in TECH-STACK.md. The design system is in DESIGN-SYSTEM.md.
What the site is for
Three audiences, ranked by priority:
- Travelers in trouble or in planning. Someone at a gate, in a taxi, or sitting in seat 32B looking up a fact. This is the primary user.
- Contributors discovering the project. Someone who stumbles in via Google, reads the about page, and wants to help.
- Builders evaluating the infrastructure. A developer or PM at a downstream consumer (OTA, AI lab, insurance company) who finds the site, then follows it to the API docs.
The site does not try to convert travelers into anything. There is nothing to sign up for. There is no upsell. There is no donation pop-up. The donation page exists because some users will look for it, not because the site nudges them toward it.
Site map
Nine page types, each templated from the same underlying API data.
1. Homepage
Above the fold: a search bar, three tool cards (bag-fit, compensation, contact-an-airline), a live activity ticker showing recent verifications, and a recent-changes feed. No marketing copy. No hero image. No carousel.
Below the fold: a brief explainer ("What is flighthelp?"), four featured scenario pages (rotating by relevance to current disruption events), and links to the API for builders.
The homepage is the only page that has any "about" content above the fold; every other page goes straight to the task.
2. Airline pages
Roughly 400 pages, one per scheduled carrier. The most-trafficked page type by far.
Sections (in display order):
- Header strip: airline name, IATA code, alliance badge, "verified by N travelers, last updated DATE."
- Quick actions row: Call · Message on X · Check bag size · Am I owed money — four pill buttons, each linking to the relevant tool with this airline pre-filled.
- Tabs: Contact / Baggage / Fees / Scenarios / Quirks / History.
- Contact tab: Phone numbers, WhatsApp, X handles, email, web forms — sorted by success rate descending. Each entry shows last-verified date, success rate (e.g. "94% of callers reached a human"), typical wait time, IVR path notes.
- Baggage tab: Tables per fare class. Personal item / carry-on / checked dimensions and weights. Sizer photos when available. Enforcement strictness ("This airline actually weighs and measures carry-ons at the gate"). Fee for exceeding allowance. Special items (pets, sports, instruments).
- Fees tab: Every fee structured: change, cancel, seat select, priority boarding, meals, lounge, extra bag, oversized bag, etc. With conditions and currency.
- Scenarios tab: Links to scenario pages relevant to this airline (e.g., for Ryanair: "Ryanair gate baggage check," "Ryanair cancellation under EU 261").
- Quirks tab: Known gotchas. ("Ryanair charges €55 to print a boarding pass at the gate." "Lufthansa's Economy Light fare allows no checked bag." "Air France hand baggage allowance varies by route.")
- History tab: Full edit log, sortable, with diffs.
- Sidebar: Top contributors to this page. Related airlines (alliance partners, code-share partners). "Verification needed" items (data flagged stale).
- Page footer: Contributors list, license note ("Data CC-BY 4.0"), full edit-history link, "Report an error" form.
Every field on the page shows: value, unit (where applicable), source link, last-verified timestamp, "Still accurate?" thumbs button, edit link.
3. Airport pages
Roughly 500 major airports get full pages; smaller airports get stub records linking to the dataset.
Sections:
- Header strip: Airport name, IATA/ICAO codes, city, country.
- Quick actions: Terminals · Lounges · Sleep · Eat · Transport · Lost & Found.
- Terminals: Map (where licensable), airline-to-terminal mapping, connections between terminals.
- Security: Crowdsourced wait times, Pre-Check / Global Entry / CLEAR locations, fast-track options.
- Lounges: Sorted by access type (Priority Pass / Diners / Star Alliance Gold / etc.). Hours, capacity notes, shower availability.
- Amenities: Showers, sleep pods/quiet rooms, prayer rooms, baggage storage, medical, family rooms, smoking lounges, pet relief, charging stations, 24h food.
- Lost & Found: Per-airline desk locations, central airport lost-and-found contacts.
- Ground transport: Metro, train, bus, taxi, rideshare, shuttle — with current prices and travel times to city center.
- Immigration tips: Expected wait, common pitfalls, transit-without-visa rules.
- WiFi: Network name that works, time limits.
4. Scenario pages
Roughly 80 core scenarios at launch. One page per traveler situation.
Examples: Flight cancelled in EU more than 14 days notice, Flight cancelled in EU less than 14 days notice, Bumped from US domestic flight, Bag delayed over 24h on international flight, Bag lost permanently, Missed connection due to airline fault, Missed connection due to weather, Denied boarding involuntarily, Medical emergency mid-flight, Pet refused at gate, Strike by airline staff, Strike by ATC, Diverted to alternate airport, Stranded overnight without hotel.
Sections (in display order):
- Header: Title, one-sentence summary, applicable jurisdictions.
- Quick answer: "You are entitled to X under Y law" — surface the bottom line at the top.
- Your rights: Plain-language summary of what you can demand.
- Step by step: Numbered actions, with time limits and proof to collect.
- Template messages: Pre-filled letters in multiple languages. Copy-to-clipboard buttons.
- Escalation path: Numbered steps from initial airline contact through national regulator, EU body, small claims, and aviation court — with direct contacts for each.
- Typical outcomes: Compensation range, success rate, time-to-resolution percentile.
- Real cases: Anonymized accounts from contributors who went through this scenario.
- Common airline pushback: A list of arguments airlines make to deny claims, with the correct counter-response and the legal basis for it.
- Related scenarios: Links to adjacent situations.
5. Comparison pages
Roughly 150 high-volume comparisons. Sortable, filterable tables backed by the API.
Examples:
- Carry-on size by airline (every airline, sortable by dimension)
- Cheapest checked-bag fees on transatlantic routes
- Strictest vs. most lenient enforcement (community-rated)
- Pet-friendliest carriers (cabin and cargo policies side-by-side)
- Airlines that allow musical instruments in the cabin
- Lounge access by credit card
Each comparison page is generated from the dataset, updates automatically as the underlying data changes, and lets the user export the visible table as CSV.
6. Knowledge pages
Roughly 40 legal/regulatory deep-dives. One per regulation or major legal topic.
Examples: EU 261/2004, UK 261, Brazil ANAC 400, Montreal Convention, US DOT Tarmac Delay Rule, Canada APPR, India DGCA passenger rights, Israel Aviation Services Law, the difference between EU 261 and the Montreal Convention.
Sections:
- Plain-language summary
- Who it applies to
- Key provisions, article by article
- How it interacts with other regulations
- Common amendments and their dates
- Notable court cases that have shaped interpretation
- Links to the full legal text
- Link to the rules engine's implementation of this regulation
7. Tool pages
Interactive single-purpose tools, all backed by the API.
- Bag-fit checker: Enter dimensions and weight, see which airlines accept it without a fee.
- Compensation calculator: Enter flight details and disruption type, see what you're owed under every applicable regime.
- Contact finder: Enter airline and country, see contacts sorted by success rate with live wait-time estimates.
- Fee total estimator: Enter route, fare class, and add-ons; see total ancillary cost across airlines.
- Currency-adjusted comparison: See fees converted to a chosen currency.
- Stale-data finder: For contributors. Shows entities that need verification, sortable by traffic and age.
Each tool has a permalink that encodes the inputs, so users can share a specific result.
8. Community pages
- Contributor profiles: Public profile of a contributor (if they opted in). Reputation, badges, recent edits, edits accepted, time as contributor.
- Leaderboards: Global, regional, per-airline, per-airport.
- Recent activity feed: Real-time stream of approved edits, with diffs.
- Per-page change log: Every entity has a "history" view showing its full edit timeline.
- Disputes: Active disputes are public; users can read the discussion and see the resolution.
9. Meta pages
- About
- Mission and principles (links to MISSION.md and PRINCIPLES.md mirrored as HTML)
- Governance (links to the bylaws and process docs)
- Transparency report (quarterly, published)
- Donate (single page, no pressure)
- API docs (links to
docs.flighthelp.net) - Dataset download (links to the bulk snapshots)
- Status (links to
status.flighthelp.net) - Press (links to the press kit and contact)
- Contact
Design constraints
These are absolute. Every design decision is judged against them.
Time-to-interactive under 1 second on a 3-year-old Android over 3G. This is the primary metric. Lighthouse mobile score of 95+ on every page.
Zero tracking scripts. No Google Analytics, no Hotjar, no Mixpanel, no Segment, no Facebook Pixel, no Twitter conversion, no ads, no affiliate links, no remarketing tags. The internal analytics use self-hosted Plausible.
No cookie banner because no cookies are set. No consent management platform. No GDPR banner. The site does not collect anything that requires consent.
PWA-installable. Service worker caches recently-viewed airlines for offline access. Users at the gate with no signal can still load the airline they just viewed.
Tap targets at least 48×48px. Spacing follows the 4px base unit.
Contrast at least WCAG AA, AAA on critical body text. Tested across both light and dark modes.
Full keyboard navigation. Every interactive element is reachable and operable without a mouse. Screen-reader tested with VoiceOver and NVDA.
Twelve languages at launch. EN, ES, PT, FR, DE, IT, AR, ZH, JA, HI, RU, TR. More added as community translates.
No carousels. No hero videos. No autoplay anything. No infinite scroll. No modals that block content. The site is a reference, not a marketing surface.
Voice and copy
Direct, useful, never marketing-y. No "amazing." No "we." Address the user as "you" when needed, otherwise impersonal.
Numbers and codes lead. "LH 441 · Munich → JFK · 2h 14m delay" not "Your Lufthansa flight from Munich to JFK was delayed by 2 hours and 14 minutes."
Verification states are explicit. "Verified by 12 travelers · 19 May 2026" not "Trusted." Stale data is shown as "Not verified in 8 months" not hidden.
Disclaimers and uncertainty are visible, not buried. "Disputed: 4 contributors disagree" appears inline next to the disputed value, not in a footnote.
URL structure
Stable, predictable, hackable.
flighthelp.net/ Homepage
flighthelp.net/airlines/ List
flighthelp.net/airlines/lufthansa Airline page
flighthelp.net/airlines/lufthansa/baggage Baggage subsection
flighthelp.net/airlines/lufthansa/baggage?fare=economy-light
flighthelp.net/airlines/lufthansa/contact Contact subsection
flighthelp.net/airports/ List
flighthelp.net/airports/lhr
flighthelp.net/scenarios/eu-cancellation-less-than-14-days
flighthelp.net/compare/carry-on-size
flighthelp.net/compare/checked-bag-fees
flighthelp.net/learn/eu-261
flighthelp.net/tools/bag-fit
flighthelp.net/tools/compensation
flighthelp.net/contributors/{username}
flighthelp.net/changes
flighthelp.net/about
flighthelp.net/transparency
flighthelp.net/donate
Trailing slashes are stripped. Capitals are normalized to lowercase. Old URLs (from any migration) are 301 redirected to the canonical form.
Internationalization
Twelve launch languages. The user's language is determined by:
- Explicit URL prefix (
/de/,/es/,/fr/) - Saved preference (localStorage)
Accept-Languageheader- Default to English
URLs include the language prefix when not English: flighthelp.net/de/airlines/lufthansa.
Hreflang tags are emitted for every translated page.
Content that varies by language (scenario steps, template messages, regulation summaries) is sourced from the dataset's localizable string fields. Content that does not vary (airline name, IATA code, dimensions) is rendered once and translated only as labels around it.
Search
A single search bar in the global header. Backed by Meilisearch.
Searches with structure are routed automatically:
- "LH 441" → tries to interpret as flight number, links to the flight tools.
- "Lufthansa" → airline page.
- "LHR" → airport page.
- "EU 261" → knowledge page.
- "Cancelled flight Europe" → most relevant scenario.
- Free text → ranked search across all entities.
Search suggestions appear after 2 characters. Recent searches stored client-side only.