Skip to main content
ProjectsVoyageAI

Project 10 / 12

End-to-End Travel Planning

VoyageAI

Travel planner that turns a natural-language trip request into a real itinerary tied to an actual map, not a wall of generic text. A persistent Travel DNA profile keeps preferences consistent across every change.

voyageai
VoyageAI preview
Stack
Next.jsMapboxLLaMA
Modules
4
Key decisions
2

01Problem

What was broken

Ask most travel planners for an itinerary and you get a wall of text with no map, no memory of what you liked on day one by day five, and no way to see the plan instead of read it.

02Impact

What it does now

One place to plan a full trip. Weather, pacing, and budget all factor into the itinerary, and the map updates live as the plan changes instead of sitting static beside a wall of text.

03Architecture

How it is built

Next.js 16 App Router handles the whole flow. Travel DNA, the user's stored preferences, lives in Prisma and gets pulled into every prompt. Mapbox GL renders straight from the LLM's structured JSON geometry output, so the map updates in step with the itinerary instead of lagging behind it.

Modules

  • PDF Parsing
  • Travel DNA State
  • Mapbox Correlator
  • Token Tracking

04Intelligence

Where the AI sits

The trip assistant keeps the whole itinerary in context, so it can answer questions or edit a single day's route without regenerating the days that didn't change.

05Decisions

Trade-offs I chose

  1. 01

    Rigid JSON Enforcement (Groq/LLaMA)

    Mapbox needs parseable GeoJSON, not prose. JSON mode prompts constrain the LLM to return GeoJSON and structured time arrays directly, so there's no conversational filler to strip out before the map can render it.

  2. 02

    Decoupled Authentication

    Auth runs on stateless JWTs with httpOnly refresh token rotation and CSRF protection, so a user's AI token usage is tied to them specifically and a stolen access token alone can't refresh itself.