Inspiration
Travel planning is fragmented; you're constantly jumping between Google Flights, hotel sites, calendar apps, and messaging friends to coordinate. We wanted to build something that felt like talking to a knowledgeable travel agent: just tell it where you want to go, and it handles the rest. Voice-first AI has matured to the point where that experience is actually possible, so we set out to build it.
What it does
Voyage is an AI-powered travel companion that lets you plan and book trips entirely through conversation. You speak (or type) to a voice agent, which collects your destination, dates, and traveler details. It then surfaces real flight options via the Amadeus API, walks you through selecting and booking a flight, and sends a confirmation email. Hotel recommendations, a live itinerary, and a calendar view are generated alongside the conversation, all in a single multi-panel dashboard. No switching tabs, no forms to fill out.
How we built it
- Frontend: React + TypeScript with Tailwind CSS and Framer Motion for a fluid, animated UI
- Voice agent: Vapi for real-time voice calls with a multi-phase pipeline (trip planning → flight selection → passenger info collection → booking confirmation)
- Flight search & booking: Amadeus Flight Offers API for search, Duffel API for order creation
- Hotels: Amadeus Hotel Search API via a Supabase Edge Function (Deno)
- Email confirmations: Resend SDK for transactional booking emails
- Calendar sync: ICS file generation so booked flights appear in any calendar app
- Backend: Express server handling Duffel orders, with Supabase for edge function hosting
Challenges we ran into
- Voice-to-booking pipeline complexity: Orchestrating a 4-phase pipeline (voice collection → flight search → passenger details → payment) through real-time SSE events was incredibly tricky. Each phase had to seamlessly hand off to the next while keeping the UI in sync — a single dropped event could break the entire flow.
- Multi-API orchestration: Chaining Duffel (flights), Amadeus (hotels), and Gemini (activities) in parallel, each with different auth schemes (OAuth2, bearer tokens, API keys), different response schemas, and different failure modes. Amadeus alone required a 3-step process: IATA → coordinates → hotel IDs → pricing.
- Layout containment: The 3-panel desktop grid kept overflowing when the center panel loaded long itineraries, pushing all panels past the viewport. We went through several iterations before landing on a robust fixed-position solution.
- Stripe + Duffel payment handoff: The Duffel offer price can change between search and booking. We had to re-fetch the live price when creating the Stripe PaymentIntent, then re-verify on order placement to prevent price mismatches.
## Accomplishments that we're proud of
- End-to-end voice booking: You can literally talk to Voyage, describe your trip, and walk away with a confirmed flight booking and a full itinerary — no forms, no manual search.
- Real-time SSE pipeline: Streams field-by-field progress updates as the voice agent collects travel info, delivers flight results the moment they're ready, and pushes booking confirmations instantly.
- 6 API integrations working in harmony: Vapi, Duffel, Amadeus, Gemini, Stripe, and Google Calendar — all orchestrated through a single conversational interface.
- Smart fallback system: If Gemini hits a quota limit, the app generates a destination-aware static itinerary. The user never sees an error.
What we learned
- SSE > WebSockets for this use case: Simpler, auto-reconnecting, and natively supported — we didn't need bidirectional communication since the voice agent handles input.
- Voice UX requires defensive filtering: Transcription services leak internal protocol messages. You need to sanitize at both the data layer and rendering layer.
- API schema translation is the real work: Most backend code is transforming complex nested schemas (Duffel slices, Amadeus geocode chains) into clean structures the frontend can render.
- Gemini prompt engineering for structured output: Getting consistent valid JSON with destination-appropriate suggestions required careful prompt design and output validation.
What's next for Voyage AI
- Multi-city trips with layover activities
- Hotel booking completion (currently search-only)
- Return flight bundling
- User accounts & trip history via Supabase
- Mobile companion app
- Real-time price alerts via Resend email
- Group trip coordination through shared voice sessions
Built With
- amadeus
- duffel
- express.js
- gemini
- javascript
- node.js
- npm
- openai
- react.js
- stripe
- supabase
- typescript
- vapi
- vite
Log in or sign up for Devpost to join the conversation.