Skip to content

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
1,000+travellers served
15agent nodes
8+external APIs
< 60sper itinerary, worst case

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

classify_intentextract_preferencesextract_refinement_deltagenerate_responseconfirm_planhandle_refinementhandle_confirmationparallel_searchplace_searchermobility_searcheraccommodation_searcherbuild_itineraryviator_enricherrestaurant_searchervideo_enricher

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.

Edges