This is a production-ready flight search engine called FavFlight.
- Node.js 18+
- Amadeus API credentials (free tier available at https://developers.amadeus.com)
pnpm installEdit .env.local:
AMADEUS_CLIENT_ID=your_client_id
AMADEUS_CLIENT_SECRET=your_client_secret
pnpm devOpen http://localhost:3000 with your browser.
FavFlight is a senior-level flight search application demonstrating:
- Real-time filtering (price, stops, airlines)
- Live price charts with Recharts
- Responsive design (desktop sidebar + mobile drawer)
- Clean state management with Zustand
- Type-safe API integration with Amadeus
- Production UX with loading states and error handling
- Next.js 16 (App Router)
- TypeScript 5 (strict)
- TailwindCSS 4 + shadcn/ui
- Zustand (state management)
- Recharts (data visualization)
- Amadeus API (flight data)
All flight data and filters live in Zustand store (useFlightStore):
- Raw flights from API
- Active filters
- Derived filtered flights (computed in real-time)
- Memoized selectors for optimal rendering
SearchForm: Flight search inputFlightCard+FlightList: Results display with statesPriceFilter,StopsFilter,AirlineFilter: Real-time filtersPriceChart: Recharts visualizationMainLayout: Responsive container with sidebar/drawer
- User adjusts filter → Zustand action updates store
- Store notifies subscribers
- Selectors recompute filtered flights
- Chart and list re-render with new data
- No page reloads, no duplicated state
app/
api/
flights/route.ts # Flight search API (proxy to Amadeus)
airports/route.ts # Airport reference data
airlines/route.ts # Airline reference data
bookings/route.ts # Server-side booking persistence (POST)
bookings/[id]/route.ts # Booking retrieval (GET)
booking/
page.tsx # Booking flow (select return / confirm)
confirmation/
page.tsx # Confirmation wrapper (server)
ConfirmationClient.tsx# Client rendering and copy-link UI
globals.css
layout.tsx
page.tsx # Main search page
components/
search/
SearchForm.tsx
results/
FlightCard.tsx
FlightList.tsx
filters/
PriceFilter.tsx
StopsFilter.tsx
AirlineFilter.tsx
charts/
PriceChart.tsx
layout/
MainLayout.tsx
ui/
button.tsx
pagination.tsx
store/
flightStore.ts # Zustand store
types/
flight.ts # TypeScript flight types
lib/
amadeus.ts # Amadeus API client
referenceData.ts # Airport/airline helper + caching
utils.ts # small helpers (cn, formatters)
formatters.ts # display formatting helpers
public/ # Static assets
.data/ # (dev) server-side persisted bookings.json
pnpm build
pnpm startvercel link
vercel env add AMADEUS_CLIENT_ID
vercel env add AMADEUS_CLIENT_SECRET
vercel deploy✅ API keys never exposed to client
✅ All Amadeus calls proxied through /api/flights
✅ No sensitive data in public folders
- Add Amadeus credentials to
.env.local - Run
pnpm dev - Search flights using IATA codes (JFK, LAX, etc.)
- Use filters to explore results
- Check
README_DETAILED.mdfor architecture deep-dive
Built as a production-ready technical assessment. Every detail matters.