Inspiration

Modern travelers often face fragmented experiences when exploring new cities. They switch between apps for maps, recommendations, reviews, audio guides, and social sharing, resulting in missed opportunities and broken itineraries. We wanted to reimagine city exploration by unifying discovery, navigation, and storytelling in one seamless, AI-powered platform.

What it does

Mapora is a progressive web app that generates personalized city tours based on a user's interests, walking pace, dietary needs, and narrative preferences. It combines Google Maps APIs, Gemini AI for storytelling, and real-time navigation to deliver an all-in-one travel companion. Users receive dynamic, narrated itineraries complete with turn-by-turn directions, tailored descriptions, and community engagement features like ratings and leaderboards.

How we built it

  • Frontend: React + Material UI, responsive and optimized for mobile use.
  • Backend: Supabase Edge Functions (Deno), orchestrating tour logic, Gemini calls, and storing user data.
  • Database & Auth: Supabase PostgreSQL + JWT-based authentication.
  • AI Services: Gemini 2.5 for personalized narrative generation, tone customization, and Imagen for tour visuals. Text-to-Speech is used for audio guides.
  • Google Maps APIs: Places API (Autocomplete v2, Place Details, Text Search), Directions API, and JavaScript SDK to render the interactive tour map and compute optimal walking routes.
  • Deployment: Vercel for frontend and function hosting, Supabase for data layer and storage.

Challenges we ran into

  • API Complexity: Integrating multiple Google Maps APIs (v2 specifically) while handling edge cases in POI data retrieval and sequencing.
  • Tone Matching: Prompt engineering Gemini to consistently generate engaging and tone-accurate narratives for a wide range of POIs.
  • Caching & Latency: Managing performance at scale with minimal latency required in tour generation across arbitrary cities. Also Gemini would sometimes take way too long for no real reason.
  • UX Seamlessness: Designing the experience to avoid any context switching, despite spanning multiple subsystems (discovery, navigation, narration, stats).

Accomplishments that we're proud of

  • Supporting limitless cities worldwide through dynamic Google Maps integration. This is obviously great for scale, however would require a content review every now and then.
  • Delivering tone-personalized AI narration with including text to audio playback support. Essentially your own tour-guide!!!
  • Building an entire end-to-end tour pipeline, from user preferences to an optimized, narrated, and navigable tour, without leaving the app.
  • Creating a community dashboard that tracks travel stats and encourages deeper exploration through gamification.
  • Also, we shipped the app during the hackathon, we are super proud of that :)

What we learned

  • The power of deep personalization dramatically improves user engagement in travel planning. The beta users we gave the app to loved that they can make their own tours. We already got some early feedback for improvement which we added publicly to our roadmap
  • Seamless UX design must align technical decisions across frontend, backend, and third-party APIs.
  • Generative AI, when orchestrated properly, can be super powerful, it can drive real-time, useful, and context-aware decisions, so we can make apps we always dreamed of.
  • Small details like narration tone or walk-time estimation make a huge difference in perceived quality. (we personally love this tiny feature)

What's next for Mapora AI

  • Tour Editing: Letting users manually add, remove, or reorder stops in their AI-generated tours.
  • Mobile Apps: Publishing native apps to the Play Store and Apple Store for wider reach and AR integration.
  • Performance Enhancements: Optimizing database queries, API latency, and edge caching. We want to create a smart RAG system to support maps + gemini.
  • Scalability: Strengthening infrastructure to support higher user volumes and more concurrent tour generations.

Check out our official documentation to explore more. And visit our website.

Built With

Share this project:

Updates