project · tier 1 · 2026
Vora — an AI travel agent that plans in under 60 seconds
A multi-agent LangGraph system that turns a single message into a full itinerary — 8+ external APIs, a 1,000-video TikTok enrichment pipeline, and 1,000+ travellers served.
- Role
- CEO & Founder
- Period
- Feb 2026 — Present
- Visit
- vora-planner.lat
Problem
Planning a trip means stitching together flights, stays, restaurants and things-to-do from a dozen tabs, then re-doing the work every time a plan changes. Joseph founded Vora as CEO to compress that into a single conversation: tell the agent what you want, get a complete, bookable itinerary back before you'd have finished reading the first search result page.
What I built
Vora's backend is a FastAPI service in front of a LangGraph StateGraph with 13 pipeline nodes plus 2 refinement nodes for handling follow-up changes — intent classification, preference extraction, parallel search across places/mobility/accommodation/restaurants, itinerary building, and enrichment. Responses stream to the Next.js frontend over Server-Sent Events, so the UI shows progress node by node instead of a blank spinner. A human-in-the-loop confirmation step lets the traveller correct course before the agent commits to bookings-grade output.
Underneath the live agent sits a data pipeline that scraped and enriched 1,000+ TikTok travel videos with Gemini 2.5 Flash, geocoded the results, and indexed them in Supabase's pgvector for semantic recommendation — so suggestions come from what people actually filmed, not just what an API returns.
Architecture
Hover or tab through a node to read what it does. Top is input; bottom is output.
- Classifies the message intent with an LLM; a deterministic guard handles a pending HITL confirmation.
- Extracts destination, dates, budget and travel style as structured output; merges with prior state.
- Generates the conversational reply — exploration, one clarifying question at a time, or a confirmation prompt.
- Builds the structured plan summary for the HITL confirmation widget, currency resolved by country.
- Processes the traveller's confirmation and unblocks the search pipeline.
- Fans out to places, mobility and accommodation search concurrently — roughly 3x faster than sequential.
- Searches points of interest against Google Places, a pool of roughly 100 candidates per trip.
- Searches flights and transit/drive routes in parallel, with per-airline deep links.
- Searches Airbnb listings, check-in/out computed from the trip dates.
- Builds the day-by-day itinerary with the LLM in adaptive batches, enriched with photos and coordinates.
- Attaches bookable Viator tours to each day, ranked by proximity and category relevance.
- Finds lunch/dinner restaurants per day, ranked by distance, rating and popularity.
- Attaches TikTok-derived videos via semantic search over a pgvector embedding index.
- Extracts a structured delta from a follow-up change and determines its scope.
- Applies the delta to state, clearing only what the scope requires so search re-runs selectively.
Vora's LangGraph `StateGraph` — 13 pipeline nodes (filled) plus 2 refinement nodes (ringed), left to right.
Evidence
Live at vora-planner.lat. A recorded demo shows the full flow from a single message to a finished itinerary. Full backend write-up in docs/VORA_BACKEND_ARCHITECTURE.md.