Planova turns a simple location input into curated, budget-aware destination ideas. It mixes map data, flight/hotel cost estimation, and weather to surface the best-value trips with a clean Next.js experience.
- User enters a place/date/budget in the UI; the app calls the server route at
app/api/search/route.ts. searchServiceaggregates nearby places fromapp/api/places/search(Google Places when a key exists; falls back to OpenStreetMap/Nominatim).- For each destination, mock flight and hotel estimators plus weather are combined into a
valueScore, then filtered by the user’s budget. - Results are cached server-side to keep responses fast and reduce external calls.
- Destination search by coordinates, radius, and budget guardrails
- Google Places with OSM fallback for global coverage
- Estimated flights, hotels, and daily costs with value scoring
- Weather snapshot per destination
- Server-side caching for results and supporting lookups
- Next.js App Router, TypeScript, and Tailwind/PostCSS setup
app/– routes, API handlers, and pages (App Router)components/– UI elements (maps, search, cards, nav)lib/services/– search, destination lookup, budget, flights, hotels, weatherlib/utils/cache.ts– simple in-memory cache helperprisma/– schema placeholder for future persistence
- Node.js 18+
- npm (or pnpm/yarn/bun)
npm install
npm run dev
# visit http://localhost:3000Create .env.local with:
# Required for production to resolve internal API calls
NEXT_PUBLIC_BASE_URL=https://your-deployed-domain.com
# Search providers
NEXT_PUBLIC_GOOGLE_MAPS_API_KEY=your-google-key
GOOGLE_MAPS_API_KEY=your-google-key
# Auth (if enabling NextAuth)
NEXTAUTH_SECRET=your-secret
NEXTAUTH_URL=https://your-deployed-domain.com
# Optional integrations (currently mocked)
AMADEUS_CLIENT_ID=...
AMADEUS_CLIENT_SECRET=...
SKYSCANNER_API_KEY=...
KIWI_API_KEY=...
BOOKING_API_KEY=...
EXPEDIA_API_KEY=...
TICKETMASTER_API_KEY=...
EVENTBRITE_API_KEY=...
EXCHANGE_RATE_API_KEY=...
Notes:
NEXT_PUBLIC_BASE_URLis critical in production; without it the server fetches default tohttp://localhost:3000and destinations will be empty after deploy.- If you omit the Google key, searches fall back to OSM/Nominatim with reduced detail.
- Set all env vars in your hosting provider (at least
NEXT_PUBLIC_BASE_URL,NEXT_PUBLIC_GOOGLE_MAPS_API_KEY,NEXTAUTH_SECRET,NEXTAUTH_URL). - Build:
npm run build. - Deploy static output and serverless functions (Vercel recommended).
- No destinations in production: ensure
NEXT_PUBLIC_BASE_URLpoints to the live domain and the Google Maps key is present; redeploy after updating env vars. - Rate limits on OSM: supply a Google key to reduce reliance on Nominatim.
npm run dev– start local devnpm run build– production buildnpm run start– run built app
MITThis is a Next.js project bootstrapped with create-next-app.
First, run the development server:
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun devOpen http://localhost:3000 with your browser to see the result.
You can start editing the page by modifying app/page.tsx. The page auto-updates as you edit the file.
This project uses next/font to automatically optimize and load Geist, a new font family for Vercel.
To learn more about Next.js, take a look at the following resources:
- Next.js Documentation - learn about Next.js features and API.
- Learn Next.js - an interactive Next.js tutorial.
You can check out the Next.js GitHub repository - your feedback and contributions are welcome!
The easiest way to deploy your Next.js app is to use the Vercel Platform from the creators of Next.js.
Check out our Next.js deployment documentation for more details.