Inspiration
Planning a trip often means juggling a dozen tabs—maps, spreadsheets, notes, and calendar apps. On average, people look at 277 different web pages to plan their trip. We wanted to build a seamless, unified workspace where you can visualize your itinerary geographically while simultaneously managing your schedule. Furthermore, while AI is great at suggesting travel ideas, it often hallucinates fake places. We were inspired to build a tool that bridges the gap between AI generation and real-world mapping, creating practical, actionable trip itineraries.
What it does
GooseRoute is a full-stack, AI-powered travel itinerary and route planning application. It features a dynamic two-panel interface that lets users organize their trips seamlessly.
Interactive Scheduling: Users can drag unscheduled events from an itinerary bucket and drop them directly onto a visual timeline/calendar.
AI Planner: Powered by Google's Gemini 3 Flash, the app can auto-generate a custom day-by-day itinerary.
Real-World Grounding: Every AI-generated event is automatically enriched with real coordinates and Place IDs using the Google Places API, so it plots perfectly on the integrated Google Map.
Smart Map: The map stays synchronized with the user's schedule, automatically fitting its bounds to the planned route.
How we built it
We built GooseRoute on the following web development frameworks:
Frontend: Next.js 16.2.2 (App Router) with React 19 and Tailwind CSS v4. We used @dnd-kit/core for the complex drag-and-drop interactions.
State Management: We used Zustand to handle complex client-side interactions between the map, calendar, and AI panels.
Backend & Auth: Supabase (PostgreSQL with Row Level Security) handles secure user authentication and database storage.
AI & APIs: We used the Vercel AI SDK to structure the outputs from Google's Gemini 3 Flash. We heavily utilized the Google Maps JavaScript API (v2 loader) and Google Places server-side Text Search API for geographic enrichment.
Challenges we ran into
Map State vs. React Re-renders: Keeping the Google Maps instance functional while users toggled between different right-panel tabs (Map vs. Events vs. AI) was tricky. We had to implement logic to keep the map mounted but hidden via CSS (display: none) rather than destroying and recreating the map instance.
Complex Drag-and-Drop Math: Dropping an event onto a schedule timeline required complex pixel-to-time math. We had to calculate absolute pixel offsets relative to the drop zone container to accurately map events to the nearest half-hour slot.
Accomplishments that we're proud of
Server-Side Geography Enrichment: We are incredibly proud of our AI pipeline. Instead of just dumping raw AI text into the app, we intercept the AI's schedule, query the Google Places API server-side, and inject real lat/lng coordinates and Place IDs before it ever reaches the user. This makes the AI's output instantly usable on the map.
Fluid Layout: Successfully building a custom, resizable split-pane layout from scratch (using native window event listeners) that houses both complex calendar interactions and an interactive map seamlessly.
What we learned
We learned how to enforce strict JSON schema outputs from LLMs using zod and the Vercel AI SDK to ensure our app doesn't break when parsing AI responses.
We leveled up our client-side state management by utilizing Zustand alongside Supabase.
We navigated the new paradigms of React 19 and Next.js 16, learning to troubleshoot modern bleeding-edge web tech where traditional StackOverflow answers don't exist yet.
What's next for GooseRoute
Calendar Export Integration: Utilizing our internal ICS generation libraries (src/lib/ics.ts) to let users one-click export their finalized itineraries directly to Google Calendar or Apple Calendar.
Collaborative Planning: Expanding our Supabase backend to support real-time multiplayer editing, allowing families and friends to drag-and-drop itinerary events on the same trip simultaneously.
Real-time Bookings: Integrating APIs to surface live pricing for hotels and flights directly within the event creation flow.
Built With
- google-gemini
- google-maps
- react
- sql
- supabase
- tailwind
- typescript
- vercel
- zod
- zustand

Log in or sign up for Devpost to join the conversation.