The problem
AI-generated itineraries need a reliable path from a draft to a saved trip. I built place discovery, planning and persistence with explicit validation and review before saving.
What I built
- Designed and developed the Flutter/Dart client, Python/FastAPI services and PostgreSQL database end to end, using SQLAlchemy for persistence.
- Built destination/place discovery, saved places, trips and day-wise itineraries.
- Integrated AI drafts from sourced places, structured output validation and user review before saving.
- Enforced ownership, atomic trip saves and idempotency to avoid partial or duplicate records.
- Implemented quota-aware Gemini/Groq routing, provider cooldowns, usage records, bounded discovery caching and source attribution.
- Added coordinated token refresh in Dio, timeouts and one retry; configured Vercel web/Render API deployment and backend/Flutter CI.
How it fits together
- 01Discover places
- 02Travel preferences
- 03AI draft
- 04Validate + review
- 05Owned atomic save
An engineering decision
I treated AI output as a draft. Validation and review separate generation from persistence, and an idempotent save path protects against duplicate submissions. Provider cooldowns and usage tracking make quota failures easier to handle.
Evaluation & limitations
Focused backend and Flutter checks cover selected application flows. Broader itinerary-quality and real-user evaluation remains to be completed. Hosted demo services may need time to initialize.
Next steps
Expand device-level regression coverage and evaluate itinerary quality against a defined set of travel scenarios.
