✨ Inspiration

We’re often asked by friends for vacation recommendations and detailed itineraries from our past trips. Instead of scrolling through photos or DMs, Roam lets you share your travel history through interactive pins on a world map. Friends can tap your destinations to instantly receive:

  • An AI-generated itinerary from your uploaded photos
  • Links to flights and local resources
  • A shared visual of where you’ve been and what you explored

Roam makes it effortless to relive, share, and inspire new adventures — powered by AI.


🧠 What We Learned

  • How to properly structure a full-stack project (backend + frontend + services)
  • Working with SwiftUI for the first time
  • Managing dependencies and environment variables
  • Integrating Supabase for authentication, storage, and PostgreSQL data
  • Handling Flask routing, JWT middleware, and cross-platform API calls

🛠️ How We Built It

We followed a modular architecture to connect our iOS app to a scalable Flask backend.

Tech Stack:

  • Backend: Python + Flask
  • Database & Auth: Supabase (PostgreSQL, Auth, Storage)
  • AI/ML: Google Gemini API (multimodal — image + text)
  • Image Processing: Pillow for EXIF metadata and thumbnail generation
  • Frontend: SwiftUI + MapKit for interactive maps

Architecture Overview:

/backend
  /app
    /routes        # auth.py, vacations.py, photos.py, ai.py, friends.py
    /services      # gemini_service, supabase_service, exif_service, geocoding_service
    /middleware    # auth_middleware.py (JWT)
    /models        # schemas.py (Pydantic models)

Built With

Share this project:

Updates