Odyssey is a React + Vite app for planning trips, saving memories, and discovering smart suggestions near your points of interest. It features a starry background, itinerary builder with autosuggestions, and a memories section backed by AWS APIs and S3.
- Starry background with twinkling stars (disabled on Help; visible on Sign-in via lighter overlays)
- Sign-in/Sign-up with token storage in
sessionStorage - Store signed-in user email for API calls
- Trip planner with:
- Smart auto-suggestions for places near the selected start location or stops
- Ability to add suggestions directly to the itinerary
- Save itinerary to backend (
/api/prod/trip/save) and locally
- Memories:
- Upload photos (kept in memory for current session to avoid
localStoragequota) - Save memories to backend (
/api/prod/memory) with tripId, email, images, notes - View memories list from backend (
/api/prod/getmemory?email=...) with expandable details - Display images via signed S3 URLs with graceful fallbacks
- Upload photos (kept in memory for current session to avoid
- Vite dev proxy configured to avoid CORS for AWS endpoints
- React 18, Vite, Tailwind CSS
- React Router
- Motion for animations
- AWS API Gateway + Lambda (proxied via Vite)
- AWS S3 for images
- Node.js 18+ and npm
cd frontend
npm installcd frontend
npm run devThe Vite dev server starts at http://localhost:5173.
Vite proxy is set in frontend/vite.config.js to route API calls and bypass CORS:
/api→https://721inkpci4.execute-api.us-east-2.amazonaws.com/places→https://places.geo.us-east-2.api.aws/serpapi→https://serpapi.com
In the app, always call APIs with the proxied path, e.g. /api/prod/memory.
- Sign-in stores:
access_tokeninsessionStorageuser_emailinsessionStorage
- Use
sessionStorage.getItem("user_email")for API calls instead of hardcoding - Avoid saving base64 images to
localStorage(quota issues). Photos are kept only in component state during a session.
- Save itinerary:
POST /api/prod/trip/save- Body:
{ tripId, email, userId }
- Body:
- Save memory:
POST /api/prod/memory- Body:
{ tripId, email, images: string[], additionalInfo }
- Body:
- Get memories:
GET /api/prod/getmemory?email=<email>
- Stars background is rendered globally in
App.jsx; lighter overlays on login keep stars visible - Help page intentionally hides the star background
- Memories page uses a repeating
doodles.pngbackground - Each polaroid has an X (remove) control; photos can be removed locally
- CORS errors: ensure you use proxied paths (
/api/...) while running via Vite dev server - 500 errors from memory save: check backend logs; frontend saves a minimal local backup (metadata only)
- Images not showing: backend should return signed URLs; otherwise ensure bucket, region, and permissions are correct
- Fork the repo
- Create a branch:
git checkout -b feat/your-feature - Commit changes:
git commit -m "feat: your feature" - Push to your fork:
git push -u fork feat/your-feature - Open a Pull Request
MIT