flybetter.ai
TAMUhack 2026 | Book your perfect trip with a single phone call or text message.
FlyBetter.ai is an intelligent travel planning platform that combines the power of AI with real-time inventory data to create personalized trip itineraries. Whether you prefer typing or talking, TripOwl makes booking flights, hotels, restaurants, and transportation seamless.
"Plan a 3-day trip to NYC from Houston, budget $400, I love Italian food and Broadway shows."
That's all it takes. TripOwl understands natural language, fetches real availability, and creates a complete itinerary—all in seconds. No forms, no endless scrolling, no decision fatigue.
| Text-Based Planning | Phone Booking |
|---|---|
| Send a free-text request via API | Call and speak naturally |
| Iterate with follow-ups like "make it cheaper" | AI asks for missing details |
| Perfect for developers and integrations | Just like calling a travel agent |
- Parse complex requests: "4-day trip to Paris next month, under $2000, prefer boutique hotels"
- Smart validation asks for missing info (destination, dates, budget, origin)
- Iterative refinement: "swap the hotel for something closer to downtown"
- Flights: Real flight numbers, times, airlines, and prices
- Hotels: Actual availability with ratings and amenities
- Restaurants: Curated options filtered by cuisine preferences
- Transport: Rideshare, rental, and transit options
- Optional preferences: activities, food, interests
- Budget-conscious planning that respects constraints
- Daily schedules with restaurant reservations timed perfectly
- Powered by ElevenLabs for natural conversation
- Multi-turn dialogue to gather trip details
- Speaks back flight, hotel, and cost summaries
- Confirm or cancel with voice commands
- No account required
- Temporary checkout tokens (30-minute expiry)
- Simple confirm/cancel flow
| Technology | Purpose |
|---|---|
| Node.js | Runtime environment |
| Express.js | REST API framework |
| MongoDB Atlas | Database for plans & sessions |
| Google Gemini AI | Natural language processing & plan generation |
| ElevenLabs API | Voice transcription & synthesis |
| Technology | Purpose |
|---|---|
| Next.js 15 | React framework with App Router |
| TypeScript | Type-safe development |
| Tailwind CSS | Styling |
| Auth0 | Authentication (optional) |
┌─────────────────────────────────────────────────────────────────┐
│ Frontend (Next.js) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Backend (Express.js) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Trip Routes │ │Phone Routes │ │ Inventory │ │
│ │ /api/trips │ /api/phone │ APIs │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Services Layer │ │
│ │ • geminiService (AI planning) │ │
│ │ • inventoryService (real data) │ │
│ │ • phoneService (voice flow) │ │
│ │ • elevenLabsService (transcription) │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ MongoDB Atlas │
│ • TripPlan (itineraries) │
│ • CheckoutSession (phone bookings) │
└─────────────────────────────────────────────────────────────────┘
# Create a new trip plan
POST /api/trips/plan
{ "requestText": "3-day NYC trip from Houston, $500 budget" }
# Iterate on existing plan
POST /api/trips/plan/:planId/iterate
{ "userText": "make it cheaper" }
# Get plan details
GET /api/trips/plan/:planId# Initial intake (text or audio)
POST /api/phone/intake
{ "requestText": "I want to plan a trip" }
# Provide additional info
POST /api/phone/checkout-session/:token/additional-info
{ "additionalText": "NYC, January 28th, $400, from Houston" }
# Get session status
GET /api/phone/checkout-session/:token
# Confirm booking
POST /api/phone/checkout-session/:token/confirm
# Cancel
POST /api/phone/checkout-session/:token/cancelGET /api/flights?date=2024-01-28&origin=IAH&destination=JFK&limit=5
GET /api/hotels?city=New%20York%20City&limit=5
GET /api/restaurants?city=New%20York%20City&cuisine=Italian&limit=8
GET /api/transport?city=New%20York%20City&limit=6- Node.js 18+
- MongoDB Atlas account
- Google AI Studio API key (Gemini)
- ElevenLabs API key (for voice)
# Clone the repository
git clone https://github.com/maybiiLen/TAMU-Hack-26.git
cd TAMU-Hack-26
# Install backend dependencies
cd backend
npm install
# Install frontend dependencies
cd ../frontend
npm installCreate backend/.env:
PORT=5001
NODE_ENV=development
MONGODB_URI=mongodb+srv://...
MONGODB_DB=tamuhack_db
GEMINI_API_KEY=your_gemini_key
ELEVENLABS_API_KEY=your_elevenlabs_key
NEXT_PUBLIC_API_URL=http://localhost:5001# Terminal 1: Start backend
cd backend
npm start
# Terminal 2: Start frontend
cd frontend
npm run dev- Backend: http://localhost:5001
- Frontend: http://localhost:3000
┌─────────────────────────────────────────────────────────────────┐
│ User calls │
│ "Hey, I want to plan a trip" │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Owen (AI) asks for required info │
│ "Where would you like to go? When? What's your budget? │
│ What city are you flying from?" │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ User provides details │
│ "New York, January 28th, under 400 dollars, from Houston" │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Owen asks for preferences (optional) │
│ "Any activities you enjoy? Food preferences? Or surprise you?" │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ User responds │
│ "I love Italian food and want to see a Broadway show" │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Owen reads back the plan │
│ "I found you a United flight at 8:45 AM for $180. │
│ You'll stay at Pod Times Square, $75/night. │
│ Total: $380, under your $400 budget! │
│ Would you like to confirm?" │
└─────────────────────────────────────────────────────────────────┘
# 1. Start with vague request
curl -X POST http://localhost:5001/api/phone/intake \
-H "Content-Type: application/json" \
-d '{"requestText": "I want to plan a trip"}'
# 2. Provide required details (use token from step 1)
curl -X POST http://localhost:5001/api/phone/checkout-session/TOKEN/additional-info \
-H "Content-Type: application/json" \
-d '{"additionalText": "New York, January 28th, $400 budget, from Houston"}'
# 3. Provide preferences
curl -X POST http://localhost:5001/api/phone/checkout-session/TOKEN/additional-info \
-H "Content-Type: application/json" \
-d '{"additionalText": "I love Italian food and Broadway shows"}'
# 4. Confirm
curl -X POST http://localhost:5001/api/phone/checkout-session/TOKEN/confirmcurl -X POST http://localhost:5001/api/trips/plan \
-H "Content-Type: application/json" \
-d '{"requestText": "Plan a 3-day trip to Miami from Dallas, budget $800, interested in beaches and nightlife"}'Built with the power of friendship at TAMUhack 2026
MIT License - feel free to use this for your own projects!