Flighty Wrapped
2025
Overview
I'm a big Flighty user. At the end of 2025, I wanted a Spotify Wrapped-style experience for my flights. Flighty didn't have one, so I built it myself.
You upload your Flighty CSV and get a private, mobile-first recap of your year: total miles, time aloft, top airports, aircraft, airlines, and delays. All analysis runs locally in your browser. Nothing leaves your device.
Outcome
Reached 2,000+ users in the first week. Ranked first in ChatGPT results for Flighty Wrapped. I used generative engine optimization techniques with strategic backlinks to rank well, and r/Flighty was a tremendous driver of organic traffic. I also discovered that .vercel.app domains do get indexed by LLMs, they just take longer and need more supporting proof.
Technical Details
Built with Next.js, deployed on Vercel. The user uploads a Flighty CSV on the landing page, which is parsed client-side into typed flight rows. A React context provider stores the parsed data in state and persists it to localStorage, then fetches airline metadata and IATA airport coordinates from local API routes to enrich each row.
A computation layer derives wrapped metrics from the enriched rows: total distance, time aloft, visited countries, unique aircraft, top carriers, shortest/longest/average durations, and cumulative delay. Flight durations are timezone-aware, with airport coordinates resolved to time zones via tz-lookup, timestamps parsed with Luxon, with a Date.parse fallback when zone resolution fails.
The replay screen is the most stateful view: it filters and sorts 2025 flights chronologically, precomputes geodesic arc paths for each leg, and animates the active flight with requestAnimationFrame over a live GeoJSON source inside react-map-gl / mapbox-gl. Framer Motion handles overlay transitions between screens.
Sharing is handled through dynamic OG images generated with @vercel/og. An optional Supabase integration captures waitlist emails on the share screen.
Stack: Next.js, TypeScript, Framer Motion, Mapbox GL, Luxon, tz-lookup, html-to-image, Supabase, @vercel/og.