A full-stack travel booking platform covering flights, hotels, cruises, vacation packages, visas, and rentals, plus an admin / quote / inquiry workflow. Built with a React (Vite) frontend and a Node.js / Express backend, backed by Supabase (auth + Postgres) and a range of travel/payment integrations.
Jetsetters lets users search and book travel across multiple surfaces and gives staff an admin panel to manage quotes, inquiries, and bookings. The codebase is ES modules throughout ("type": "module") and ships as a single Express app that can run as a monolith server, a dev backend, or a Vercel serverless function.
A companion React Native (Expo) mobile app lives in a sibling repository and consumes the same backend API.
βοΈ Flights β multi-city/round-trip/one-way search, fare options & upsells, seat and passenger handling (Amadeus inventory).- π¨ Hotels β property search, rates, and booking.
- π’ Cruises β cruise discovery, packages, and booking flows.
- π¦ Vacation Packages β bundled itineraries and deals.
- π Visas β visa requirements lookup and visa requests.
- π Rentals β vehicle rental flows.
- π§Ύ Quotes & Inquiries β request-a-quote workflow with admin review and expiry handling.
- π οΈ Admin Panel β manage bookings, quotes, inquiries, coupons, templates, and bulk uploads.
- π€ AI Chatbot β Google Gemini / LangChain assistant.
- π Auth β Supabase (primary) with Firebase (legacy flows), Google OAuth.
- π³ Payments β ARC Pay gateway integration.
- π§ / π± Messaging β transactional email (Resend) and SMS (Twilio).
| Layer | Technology |
|---|---|
| Frontend | React 18, React Router 7, Vite 7, Tailwind CSS 3, Headless UI, Lucide / FontAwesome / React Icons |
| Backend | Node.js, Express 4 |
| Auth & DB | Supabase (Postgres + Auth); Firebase (legacy); local SQLite for some scripts |
| Inventory | Amadeus (flights / hotels) |
| Payments | ARC Pay |
| AI | Google Gemini (@google/genai), LangChain |
| Messaging | Resend (email), Twilio (SMS) |
| Caching | Redis via ioredis |
| PDF / Files | jsPDF, html2canvas, Puppeteer, Multer, XLSX, PapaParse |
| Testing | Vitest (frontend / backend / integration), Testing Library, Supertest |
| Deploy | Vercel (primary), Render, Docker |
JETSET13/
βββ server.js # Production monolith server (npm start) β serves dist/ + /api/*
βββ frontend/
β βββ main.jsx # App entry
β βββ src/
β βββ app.jsx # Root app (BrowserRouter, Supabase/Location providers)
β βββ Pages/
β β βββ Common/ # Booking flows: cruise, flights, hotels, packages, visa, rentals, login
β β βββ Admin/ # Admin panel
β β βββ Profile/ # User profile
β β βββ Request/ # Quote / inquiry requests
β βββ components/ # Reusable UI
β βββ contexts/ # React contexts
β βββ hooks/ # Custom hooks
β βββ Services/ # Frontend API/service clients
β βββ utils/ # Helpers
βββ backend/
β βββ server.js # Dev backend (nodemon, extra middleware + jobs)
β βββ api/index.js # Vercel serverless handler (re-exported by api/index.js)
β βββ routes/ # Express routers (flights, hotels, cruise, quote, inquiry, β¦)
β βββ controllers/ # Request handlers
β βββ services/ # Integrations (amadeus, gemini, email, cache, sms, cdn, β¦)
β βββ models/ # Supabase-backed data models
β βββ middleware/ # auth (Supabase JWT), audit logging
β βββ jobs/ # Background jobs (workflow engine, data retention, quote expiry)
β βββ config/ # supabase.js, chatbot.js
βββ api/index.js # Vercel entry β re-exports backend/api/index.js
βββ scripts/ # Dev/build/start helpers, db SQL, maintenance
βββ supabase/migrations/ # SQL migrations
βββ tests/ # Vitest suites
βββ vite.config.js # Vite config + manualChunks + @ aliases
βββ vitest.config.js # Three test projects (frontend/backend/integration)
βββ vercel.json # Vercel routing (/api/* β single function)
βββ render.yaml # Render deploy config
βββ dockerfile / docker-compose.yml
This is the most important thing to know before editing routes:
server.js(root) β production monolith (npm start). Mounts/api/*, serves the built SPA fromdist/, and has its own direct/api/send-emailendpoint.backend/server.jsβ the dev backend (launched byscripts/start-dev.jsvia nodemon). Adds audit logging, redaction, and background jobs.backend/api/index.jsβ the Vercel serverless handler. Mounts every route twice (/api/*and/*) because Vercel rewrites/api/(.*)to this one function (12-function limit).
When adding a route, register it in all three places. The route file itself lives in
backend/routes/.
- Node.js 18+ and npm
- Git
- A Supabase project (auth + Postgres)
- API credentials for the integrations you intend to use (Amadeus, ARC Pay, Resend, Twilio, Gemini)
# 1. Clone
git clone https://github.com/Sahi0045/JETSET13.git
cd JETSET13
# 2. Install dependencies
npm install
# 3. Configure environment
cp .env.example .env
# then fill in the values (see Environment Variables below)
# 4. Start the dev environment
npm run devnpm run dev spawns the backend on :5004 and the Vite dev server on :5173; Vite proxies /api requests to the backend.
npm run build # vite build β dist/, then copy-public-assets
npm start # NODE_ENV=production node server.js# Dev
npm run dev # backend (:5004) + Vite (:5173) with /api proxy
npm run server # backend only (nodemon)
npm run client # Vite dev server only
# Build / prod
npm run build # production build into dist/
npm start # run the production monolith
# Tests (Vitest β three projects)
npm test # all projects
npm run test:frontend # jsdom (React)
npm run test:backend # node (controllers/services)
npm run test:integration # serial, supertest-driven API tests
npm run test:watch # watch mode
npm run test:coverage # coverage report
npx vitest run tests/path/to/file.test.js # single file
npx vitest run -t "behavior name" # filter by test name
# Standalone integration scripts (hit real APIs, not Vitest)
npm run test:hotel-api / test:direct-amadeus / test:supabase / test:chatbot ...There is no lint or typecheck script β this is a JS project with
jsconfig.jsononly.
Copy .env.example to .env and fill in your credentials. Key groups:
# Supabase (primary auth + database)
VITE_SUPABASE_URL=your_supabase_url
VITE_SUPABASE_ANON_KEY=your_supabase_anon_key
# Amadeus (flight/hotel inventory)
VITE_AMADEUS_CLIENT_ID=your_amadeus_client_id
VITE_AMADEUS_CLIENT_SECRET=your_amadeus_client_secret
# ARC Pay (payments)
ARC_PAY_MERCHANT_ID=your_merchant_id
ARC_PAY_API_PASSWORD=your_api_password
ARC_PAY_API_VERSION=100
ARC_PAY_BASE_URL=https://api.arcpay.travel/api/rest/version/100
# Email (Resend)
RESEND_API_KEY=your_resend_api_key
ADMIN_EMAIL=admin@yourcompany.com
# App
VITE_API_URL=http://localhost:5004/api
FRONTEND_URL=http://localhost:5173
# Firebase (legacy auth flows β optional)
VITE_FIREBASE_API_KEY=...
VITE_FIREBASE_AUTH_DOMAIN=...
VITE_FIREBASE_PROJECT_ID=...Twilio (SMS) and Gemini (chatbot) keys are also required if you use those features. Many services fail silently if misconfigured β
server.jslogs the presence of Amadeus keys on startup.
Supabase Postgres is the system of record. SQL schemas live in scripts/db/*.sql and supabase/migrations/; a local database/database.sqlite is used by some scripts.
Migrations are not auto-applied β apply them manually via Supabase or by running scripts in
scripts/maintenance/. Never reset or drop the database; use migrations for schema changes.
- Vercel (primary) β see
vercel.json. Builds withnpm run build, servesdist/, and routes/api/*to the single serverless functionapi/index.js. Long-running jobs / background workers belong in thebackend/server.jspath, not the serverless handler. - Render β see
render.yamlandrender-setup.js(npm run render-build). - Docker β
dockerfile,docker-compose.yml, andMakefilerun the fullserver.jsmonolith.
A separate React Native (Expo SDK 54, RN 0.81, React 19) client lives in a sibling directory (its own git repo) and consumes the same backend API. Backend changes that affect auth response shape, payment flows, or cruise/flight/hotel/request payloads should be sanity-checked against that repo's src/services/* layer.
- Create a feature branch (
git checkout -b feature/your-feature) - Make your changes following the project conventions (camelCase JS, PascalCase types, boolean prefixes
is/has/should/can, no hardcoded secrets, parameterized DB queries) - Add/update tests and run
npm test - Commit and open a Pull Request
See CLAUDE.md and .cursor/rules/software-engineering-standards.mdc for the full architecture notes and engineering standards.
ISC. See package.json for details.
Built by the Jetsetters team.