Spend less time planning, more time exploring. CitizenAI builds a smart, optimized local itinerary from your interests, budget, time and travel style — in seconds.
翻訳待ち
暮らしTypeScript · PLpgSQLGitHub @Hanumath1006オンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Loading the full README. The saved excerpt is shown below.
Your AI city companion — spend less time planning, more time exploring.
CitizenAI turns a few inputs (city, date, time window, budget, who you're with, how you get around, and what you love) into a fully sequenced, weather-aware, one-day itinerary of real venues — in seconds. Then refine it with one tap.
The core design principle: AI plans the shape, real APIs supply the facts.Read the full README ↗Your AI city companion — spend less time planning, more time exploring.
CitizenAI turns a few inputs (city, date, time window, budget, who you're with, how you get around, and what you love) into a fully sequenced, weather-aware, one-day itinerary of real venues — in seconds. Then refine it with one tap.
The core design principle: AI plans the shape, real APIs supply the facts.
gemini-3.6-flash) designs an optimized, ordered plan from your inputs.Every external step degrades gracefully — if a key isn't configured, the app falls back to the model's own estimates so you can still see it working.
npm install
Copy the template and fill in your keys:
cp .env.example .env.local
| Variable | Where to get it |
|---|---|
NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_ANON_KEY | Supabase → Project Settings → API |
SUPABASE_SERVICE_ROLE_KEY | Supabase → Project Settings → API (keep server-only) |
GEMINI_API_KEY | https://aistudio.google.com → Get API key |
GOOGLE_MAPS_API_KEY | Google Cloud Console — enable Places API (New) and Routes API |
OPENWEATHER_API_KEY | https://openweathermap.org/api |
NEXT_PUBLIC_SITE_URL | http://localhost:3000 in dev |
In the Supabase SQL editor, run the migration:
supabase/migrations/0001_init.sql
This creates the profiles, trips, stops, favorites, and saved_places
tables with row-level security, plus a trigger that auto-creates a profile row
on sign-up.
In Supabase → Authentication → Providers → Google, add your Google OAuth client ID and secret. Set the authorized redirect URL to:
https://<your-project>.supabase.co/auth/v1/callback
And in the Google Cloud OAuth consent screen, add http://localhost:3000 as an
authorized origin. The app's own callback route is /auth/callback.
npm run dev
Open http://localhost:3000.
| Route | Description |
|---|---|
/ | Landing page |
/login | Google sign-in |
/dashboard | Stats, upcoming/recent trips, weather, recommendations |
/plan | The planner input form |
/plan/result | Generated itinerary + one-tap refinement |
/trips · /trips/[id] | Saved trips list and detail |
/favorites · /saved | Bookmarked venues |
/profile · /settings | Defaults and account |
Host the app free on Vercel and point any domain (bought anywhere — Hostinger, GoDaddy, Cloudflare) at it.
.gitignore) and push..env.local:
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY,
SUPABASE_SERVICE_ROLE_KEY, GEMINI_API_KEY, GEMINI_MODEL,
GOOGLE_MAPS_API_KEY, OPENWEATHER_API_KEY, and NEXT_PUBLIC_SITE_URL
(set to the live URL).NEXT_PUBLIC_SITE_URL → https://yourdomain.com, then redeploy.https://yourdomain.com/** to Redirect URLs.src/
app/
(app)/ authenticated app shell (sidebar) + pages
api/ itinerary generation, trips, bookmarks, profile, photo proxy
auth/ OAuth callback + sign-out
login/ sign-in page
page.tsx landing page
components/ UI primitives, planner, itinerary, trips, bookmarks
lib/
ai/planner.ts Gemini itinerary generation
google/ Places + Routes
itinerary/ generation orchestrator
supabase/ browser/server clients + types
weather.ts OpenWeather forecast
supabase/migrations/ SQL schema