Theme: Booking to Belonging
An AI-powered travel concierge web application that personalizes the travel experience by analyzing user preferences through photo analysis and intelligent booking recommendations.
This application helps travelers discover their travel personality and get personalized recommendations for flights, hotels, and attractions.
-
**Photo Analysis
- Upload travel photos
- AI-powered analysis using Google Gemini Vision API
- EXIF metadata extraction (location, date, camera info)
- Travel personality profiling
- Personalized hotel recommendations
-
**Auto Booking System
- Flight search and booking via Amadeus API
- Hotel recommendations and reservations
- Attraction discovery
- Framework: Next.js 14 with TypeScript
- Styling: Tailwind CSS
- UI Theme: Marriott-inspired (red/white/gold palette)
- Features:
- Drag-and-drop file upload
- Real-time image preview
- Responsive design
- Framework: Flask (Python)
- AI Services:
- Google Gemini API (image analysis)
- Mistral AI Voxtral (voice - planned)
- Amadeus APIs (booking - planned)
- Image Processing: PIL, exifread
- Node.js 18+ and npm
- Python 3.9+
- Google Gemini API key
- Navigate to backend folder:
cd backend- Create virtual environment:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate- Install dependencies:
pip install -r requirements.txt- Configure environment variables:
- Copy
.env.exampleto.env - Add your Google Gemini API key:
- Copy
GEMINI_API_KEY=your_actual_api_key_here- Run the Flask server:
python app.pyBackend will run on http://localhost:5000
- Navigate to frontend folder:
cd frontend- Install dependencies:
npm install-
Configure environment:
.env.localfile is already created with default backend URL- Modify if your backend runs on a different port
-
Run the development server:
npm run devFrontend will run on http://localhost:3000
- Open
http://localhost:3000in your browser - Click "Discover Your Travel Style" or navigate to
/image-analysis - Upload 1-10 travel photos (drag & drop or click to select)
- Click "Analyze My Travel Style"
- View your personalized travel personality profile with:
- Travel style (Adventure Seeker, Luxury Traveler, etc.)
- Personality traits
- Favorite activities
- Destination preferences
- Recommended hotel types
Test the Gemini API connection:
curl http://localhost:5000/test_geminiHealth check:
curl http://localhost:5000/healthBalloon Muscles/
βββ backend/
β βββ app.py # Main Flask application
β βββ requirements.txt # Python dependencies
β βββ .env # Environment variables (API keys)
β βββ .env.example # Environment template
β βββ utils/
β β βββ gemini_client.py # Gemini Vision API integration
β β βββ exif_extractor.py # EXIF metadata extraction
β βββ uploads/ # Temporary image storage
β
βββ frontend/
β βββ app/
β β βββ page.tsx # Home page
β β βββ layout.tsx # Root layout
β β βββ image-analysis/
β β βββ page.tsx # Image analysis page
β βββ components/
β β βββ ImageUpload.tsx # File upload component
β β βββ AnalysisResults.tsx # Results display component
β βββ .env.local # Frontend environment variables
β βββ package.json # Node dependencies
β βββ tailwind.config.ts # Tailwind configuration
β
βββ README.md # This file
The UI is inspired by the Marriott website with:
- Color Palette:
- Primary Red:
#8B0000(Marriott signature) - Accent Gold:
#B8860B - Neutral: Gray scale for backgrounds
- Primary Red:
- Typography: Clean, modern sans-serif
- Layout: Spacious, luxury-focused, responsive
- Animations: Subtle hover effects and transitions
- Visit Google AI Studio
- Create a new API key
- Add to
backend/.env:GEMINI_API_KEY=your_key_here
- Visit Mistral AI Platform
- Generate API key
- Add to
backend/.env:MISTRAL_API_KEY=your_key_here
- Visit Amadeus for Developers
- Create an app to get API key and secret
- Add to
backend/.env:
AMADEUS_API_KEY=your_key_here
AMADEUS_API_SECRET=your_secret_here
| Endpoint | Method | Description |
|---|---|---|
/health |
GET | Health check |
/test_gemini |
GET | Test Gemini API connection |
/analyze_images |
POST | Analyze travel photos |
Request:
- Content-Type:
multipart/form-data - Body:
images(multiple files)
Response:
{
"success": true,
"images_analyzed": 3,
"metadata": [...],
"analysis": {
"travel_style": ["Adventure Seeker", "Nature Lover"],
"activities": ["Hiking", "Photography"],
"destination_types": ["Mountains", "Forests"],
"personality_traits": ["Adventurous", "Independent"],
"recommended_hotels": ["Boutique Hotel", "Mountain Resort"],
"insights": "This traveler loves outdoor adventures...",
"confidence_score": 0.85
}
}- Task 1: Image to Gemini Analysis
- Task 2: Voice + Sentiment Analysis with Mistral Voxtral
- Task 3: Amadeus API Integration for Booking
- Google Drive integration for photo import
- User authentication and profile saving
- Booking history and itinerary management
Backend won't start:
- Ensure Python virtual environment is activated
- Check that all dependencies are installed:
pip install -r requirements.txt - Verify
.envfile exists with valid API keys
Frontend can't connect to backend:
- Ensure Flask server is running on port 5000
- Check
NEXT_PUBLIC_API_URLinfrontend/.env.local - Disable any firewall/CORS blockers
Image analysis fails:
- Verify Gemini API key is valid
- Check image format (PNG, JPG, JPEG, GIF, HEIC)
- Ensure images are under 10MB each
- Check Flask console for error messages
Linter/TypeScript errors:
- Run
npm run buildto check for type errors - Install missing types:
npm install --save-dev @types/[package-name]
Built for educational purposes - Marriott International Codefest at Virginia Tech 2025.
Created for the "Booking to Belonging" theme at Marriott Codefest.
Happy Traveling!