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
- 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.
- 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.
