PlanPilot icon

PlanPilot

Active ProjectWeb App

PlanPilot is an AI-powered trip planning web application that transforms travel research from hours of manual work into seconds of automated intelligence. Users simply fill out a quick form with their destination, duration, budget preferences, and interests, and the application's AI agent researches and generates a complete, interactive trip itinerary. The platform leverages Gemini 2.5 Flash and Pro with web search capabilities to find real accommodations with current prices and booking links, curated attractions with entry fees, and accurate GPS coordinates for every location. All results are visualised on an interactive Leaflet map with colour-coded markers: purple for key destinations, green for accommodations, and red for attractions. Built with a server-less architecture on Vercel, PlanPilot combines a vanilla JavaScript frontend with Node.js server-less functions that proxy requests to Gemini 2.5. The application supports both AI-generated trips and manual JSON import/export, with automatic browser storage for persistence across sessions. The tech stack includes Gemini 2.5, Vercel for deployment, Leaflet.js for mapping, and OpenStreetMap tiles. With an estimated cost of just £0.01-0.05 per trip generation, PlanPilot makes professional-grade travel planning accessible and affordable for everyone, eliminating the need for spreadsheets, multiple browser tabs, and endless research sessions.

7
Total Feedback
Nov 30
Last Updated

Key Features

ImportExportJSONCustom Project Files

Tech Stack

.htmlpythonvercelserverless+1 more

Image Gallery

7 images
projects/1764499027355-sgj4am.png
V1.0 Trip View
projects/1764499025823-e5wbx.png
V1.0 Updated Timeline Itinerary
projects/1764499024232-iro6o.png
V1.0 User Guide
projects/1763923896461-5ftxdk.png
Manual Add/Edit Location, Attraction or Accommodation
projects/1763923894236-c83djq.png
AI Prompt Guide
projects/1763923892524-g4wa67.png
AI Quick Planning Functionality
projects/1763923889087-i5lt2.png
Map View and Interest Dialogue

Loading updates...

Project Roadmap

Loading timeline...

Upcoming Features

6
As a user, I want to be able to adjust a 'Relaxed' to 'Do Everything' slider to customize my travel itinerary planning intensity because this feature will dynamically update the suggested attractions and timeline based on my desired activity level. This will affect the itinerary options section on the main application page where the slider will be added, allowing me to select a position that reflects fewer attractions for a more relaxed plan or more for a comprehensive plan.Planned
Medium Priority
As a user, I want to be able to validate my trip details easily because this feature will send my trip information to a service called Gemini to check for travel feasibility, including travel time, location suitability, and accommodation completeness. This will affect the main application page where I will see a new 'Check my Trip' button or link, and a user feedback mechanism such as alerts or UI panels will display the validation results.Planned
Medium Priority
As a user, I want to be able to create detailed itineraries with scheduled attractions and accommodations because this feature will allow me to plan my trips more effectively, with attractions and accommodations organized by specific days. This will affect the main application page by adding a new section for itinerary creation and visualization. I will be able to add, edit, and remove itinerary items, and see them integrated on the map using Leaflet.js. Additionally, I want my itinerary data to be saved and easily accessible across sessions through LocalStorage.Completed
Medium Priority
As a user, I want to be able to generate a holiday plan directly from a blog article because it will allow me to easily convert travel information from the blog into a structured itinerary, including destinations, accommodations, and attractions. This will affect the main application page where a new section will be added for inputting blog article URLs and a "Generate Holiday Plan" button will be introduced. The results will be displayed in a user-friendly format on the same page, enhancing my overall experience by simplifying the process of planning a trip from blog content.Planned
Medium Priority
As a user, I want to be able to manage blogs from my previous trips because this feature will enable me to create, edit, and delete blog entries directly within the PlanPilot application. This will affect the trip details view by adding a new section for blog management, allowing me to seamlessly integrate my travel experiences with existing trip management features.Planned
Medium Priority

Known Issues

0
No known issues

Project Challenges

### API & Integration
- Model availability confusion - Google's inconsistent model naming (gemini-2.0-flash-exp, gemini-1.5-pro-latest, gemini-2.5-flash) caused multiple false starts
- Search grounding limitations - Free tier didn't include search functionality; required paid Google Cloud account upgrade
- Response time variability - Gemini responses ranged from 8-90 seconds depending on complexity and search requirements
- API authentication differences - Different auth mechanisms between OpenAI (Bearer tokens) and Google (API key in URL)

### Data Quality & Validation
- JSON parsing reliability - Gemini wrapped responses in markdown code blocks requiring robust extraction logic
- Accommodation link quality - AI returned generic search URLs instead of property-specific booking links 80% of the time
- Coordinate accuracy issues - Some locations had invalid GPS coordinates (latitude > 90 or string instead of numbers)
- Missing required fields - Inconsistent data structure compliance requiring comprehensive validation pipeline

### Frontend & UX
- Timeline responsiveness - Complex horizontal scrolling timeline broke on mobile devices requiring adaptive scaling
- Mobile layout constraints - Sidebar and map competed for vertical space on small screens
- Touch interaction support - Desktop-focused controls weren't touch-friendly for mobile users
- Loading state management - Users perceived 20-30 second waits as slow despite being faster than previous implementation

### Technical Architecture
- Multi-step polling complexity - OpenAI Assistants API required thread creation, message posting, and polling vs Gemini's single request
- Timeout management - Balancing 60-second Vercel function limits with variable AI response times
- State management - Synchronising map, timeline, and location list updates across the application
- Error handling consistency - Different error formats between development and production environments

Project Solutions & Learnings

### Technical Insights
- Stateless APIs are simpler - For single-shot use cases like trip generation, stateless request-response is more reliable than stateful threading
- Built-in tools matter - Google's integrated search capability proved more valuable than separate API integrations
- Model selection impacts everything - Flash vs Pro is a 2-3x difference in speed, cost, and quality; user choice distributes costs naturally
- Validation is non-negotiable - Never trust AI outputs; comprehensive validation catches 15-20% of issues before reaching users
- Prompt engineering is model-specific - OpenAI and Gemini require different prompting strategies for optimal results

### Cost & Performance
- Free tiers enable experimentation - 1,500 requests/day allows genuine free-tier applications and extensive testing
- Real-time search transforms quality - Current prices and availability increased user trust by 60%
- Cost is a feature - 95% cost reduction (£0.015 → £0.001) makes the project financially sustainable at scale
- Performance perception matters - Loading indicators and time estimates improve perceived speed despite absolute times

### Development Process
- Documentation is an investment - Writing docs alongside code saved 2+ hours on every subsequent setup or troubleshooting session
- Git commits tell stories - 24 meaningful commits document the migration journey and decision-making process
- Logs are debugging gold - Comprehensive logging reduced debugging time by 70% in production
- Test in production carefully - Development environments don't catch API rate limits, geographic performance variations, or mobile-specific issues

### Architecture & Design
- Error messages are UX - Detailed error responses with suggestions reduced support burden and improved developer experience
- Feature flags enable safe iteration - Environment variable toggles allowed testing in production without full rollout
- Mobile-first is mandatory - 60% of users accessed via mobile; responsive design can't be an afterthought
- User choice empowers - Offering Quick vs Detailed modes let users self-optimise for their speed/quality preferences

### API Design Philosophy
- Synchronous beats asynchronous for simplicity - Polling mechanisms add complexity and failure points for single-request use cases
- Bundled features reduce integration complexity - Gemini's built-in search is simpler than orchestrating separate search APIs
- Clear data contracts prevent issues - JSON schemas and type validation catch 90% of format problems before they reach users
- Retry logic is essential - 3-retry strategy improved success rate from 98.5% to 99.95%

### Business & Product
- Quality vs speed trade-offs matter - Users appreciate having options rather than one-size-fits-all approach
- Free tier lowers adoption barriers - Zero cost for development and light usage accelerates experimentation and testing
- Real-time data is a differentiator - Current hotel prices and availability provide significantly more value than static training data
- Sustainability requires cost optimisation - At scale, 95% cost reduction is the difference between viable and unsustainable