Inspiration

Planning a trip usually means twenty open tabs, a camera roll full of TikTok screenshots, and no real idea what any of it will cost, especially when you're spending in a different currency. While planning a trip to Japan, we found ourselves struggling to research each and every place we come across on TikTok, co-ordinating travel, cost, and timings. We wanted a planner that would catch this, fix it, and ensure places are open and public holidays are accounted for before we left. Reducing friction in holiday planning is our priority.

Foreign currency is also where most people first meet hidden fees and confusing conversions, which is why we built the project around money as well as itineraries.

What it does

Tripezium turns the places you've saved online into a costed, multi-currency itinerary, and adapts when plans change.

  • Plan: tell us the countries, cities and dates for each stop, then pick interests that make sense for that destination and season.
  • Import: paste TikTok links or upload screenshots, and we extract the places automatically.
  • Itinerary: get a day-by-day, mapped plan with every stop costed in local currency and in your home currency, plus a budget per day and per city and a running trip total.
  • Holiday-aware: public holidays are checked for every country on your route. If a must-see lands on a closure day, the agent weighs the trade-off, moves or replaces it, and explains why. Kyoto on 1 January becomes a first shrine visit (hatsumōde) at Fushimi Inari.
  • Edit by chatting: "cheaper dinner in Osaka", "swap day 2 and 3" or "we're arriving a day late". The agent re-plans everything that's affected (other days, budget, closures) and explains what changed.
  • Money prompts: "load your card" reminders tell you roughly how much to convert and when, and overspend alerts suggest cheaper swaps.

How we built it

  • Back end: Python with FastAPI and Pydantic, deployed on a Vultr Ubuntu VM with Caddy for HTTPS, at api.tripezium.club.
  • Database: Tiger Data (PostgreSQL with TimescaleDB). Trips, places and suggested stops are relational tables, each itinerary is stored as one JSONB document, and exchange rates go into an fx_rates hypertable. It's also our cache for holidays, video imports and geocoding, so demo content survives redeploys.
  • Gemini: generates itineraries as structured JSON against a fixed schema, reads videos, screenshots and captions to extract places (multimodal), and handles chat edits and re-planning.
  • Code, not the model, does the maths: Gemini only estimates local costs per person. Currency conversion and every total are calculated in code with exact decimals, using Frankfurter (ECB) exchange rates with a hardcoded fallback.
  • Data sources: Nager.Date for public holidays, Open-Meteo for forecasts and historical climate, Google Places for weekly opening hours, and Nominatim for geocoding.
  • Voice: ElevenLabs speech-to-text and text-to-speech.
  • Map: Leaflet with OpenStreetMap.

Challenges we ran into

  • Making an LLM's output reliable. Itineraries are only useful if every item can be rendered, edited and costed, so we validate every response (exact trip dates, real place IDs, 24-hour times, ISO currency codes) and retry once with the problems listed.
  • Closures. Holidays are only part of the story. After generation, a deterministic pass checks each stop against the holiday list and real opening hours, and anything risky goes back for a revision. When we can't be sure, the app says "check hours before going" rather than presenting a guess as fact.
  • Untrusted input. Captions and imported text can contain instructions, so we pass them to Gemini in a clearly delimited block it's told never to obey, with delimiter text stripped first.
  • No TikTok API for saved folders. Collections can't be read, so import works from pasted links (via oEmbed captions and thumbnails) and screenshots.

Accomplishments that we're proud of

  • Solving a real problem we ran into ourselves, the difficulty of planning travels abroad.
  • A budget you can trust, because the AI estimates and our code does the arithmetic.
  • An agent that changes its priorities, not just individual items. When the user says "cut the budget by £200" or "we're arriving a day late", it drops conclusions that no longer hold and re-plans what depends on them.
  • A fully deployed system with fallbacks for rates, models and opening hours.

What we learned

  • Treating LLM output as structured data, validated by code, is what makes it usable in a real product.
  • Keep the model for judgement and creativity, and use deterministic code for anything that has to be exact, like money and dates.
  • Being honest about uncertainty, "check hours before going" builds more trust than confident but wrong answers.

What's next for Tripezium

  • Use the phone's location and time instead of the simulated trip clock.
  • Live opening-hours and closure checks with search grounding.
  • Real prices where available, instead of AI estimates.
  • More import sources, such as Instagram.
  • Shared trips with cost splitting and booking links.
  • A "Trips" feature inside Wise that tells you how much to convert and when, driving card spend and currency conversions.

Built With

Share this project:

Updates

Submission history