Inspiration

Travel planning is full of "looks fine on a map" traps: a route might be short, but opening hours, realistic dwell time, and travel duration make the day impossible. Traditional planners give you a list of places—but when do you actually arrive? Will it be open? How long should you stay?

We wanted something that feels like talking to an assistant, but behaves like a planner—with explicit constraints, concrete places, and plans you can actually execute.

What it does

TripPilot transforms rough travel intent into a feasible, time-aware itinerary:

  1. Multimodal Input: Speak or type your travel ideas naturally ("2 days in Rome, I love museums and want to see night views")
  2. AI-Powered Itinerary Generation: Gemini converts free-form input into structured day-by-day plans with specific attractions
  3. Real-World Validation: The app fetches actual opening hours and calculates travel time between stops
  4. Constraint Detection: Gemini analyzes your itinerary and identifies conflicts (arriving after closing, insufficient time, etc.)
  5. Smart Suggestions: When issues arise, Gemini proposes actionable fixes—reorder stops, reduce stay time, or start earlier
  6. One-Click Export: Export directly to Google Maps navigation or Google Calendar

How we built it

  • Frontend: Vite + React + TypeScript + Tailwind CSS
  • AI Engine: Gemini 3 API with structured JSON output constraints
  • Maps Integration: Google Maps Platform (Places API, Routes API, Maps JavaScript API)
  • Cloud Backend: Firebase Authentication + Firestore for trip persistence
  • Voice Processing: Gemini multimodal API for speech-to-text
  • Deployment: Vercel with server-side Gemini proxy (API key protection)

Key Architecture Decision: We force Gemini to output strict JSON schemas, not free-form text. This means every AI suggestion is directly executable—"reorder: placeId1,placeId2,placeId3" or "reduce_stay: placeId, 30 minutes"—not vague advice.

Challenges we ran into

  • Parsing Complex Opening Hours: Google Places returns nested arrays of time periods; handling edge cases (24-hour venues, holidays, multiple time slots) required careful normalization
  • Constraint Reasoning: Getting Gemini to reason about multiple constraints simultaneously (travel time + opening hours + recommended stay) required a 3-step pipeline: Normalize → Detect → Decide
  • Voice UX on Mobile: Implementing hold-to-talk with proper pointer capture, auto-stop after 25 seconds, and graceful error handling across browsers

Accomplishments that we're proud of

  • Closed-Loop Planning: AI suggestion → apply change → recompute routes → compare outcomes—users see the improvement immediately
  • 8+ Language Support: Full localization with locale-aware Gemini prompts (Chinese, Japanese, Korean, French, Spanish, German, etc.)
  • Natural Voice Input: Hold-to-talk feels like a walkie-talkie, not clunky click-to-record interfaces
  • Real Feasibility Checking: Not just "this looks good"—actual validation against venue hours and travel times

What we learned

  • Prompting for structured JSON requires explicit schema constraints and examples
  • Travel planning has many hidden constraints—opening hours alone are surprisingly complex
  • Users want AI to propose changes, not silently apply them—transparency builds trust

What's next for TripPilot

Our vision: TripPilot as your AI travel companion—not just a planner, but a guide that stays with you throughout your journey.

Near-term roadmap:

  • On-trip assistance: Real-time rerouting when plans change (missed bus, attraction closed unexpectedly)
  • Proactive suggestions: "You have 2 hours before dinner—here's a café nearby with great reviews"
  • Multi-day optimization: Automatically balance attraction density across days

Longer-term vision:

  • Live voice guide: Speak to TripPilot while walking—"What's the history of this building?"
  • Context-aware reminders: "Your museum reservation is in 30 minutes, start walking now"
  • Post-trip memories: Auto-generate trip summaries with photos and highlights

Built With

Share this project:

Updates