尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Your world. Your journey. An interactive travel tracker where you mark countries, explore detailed region maps, track capitals and UNESCO sites, set goals, and unlock achievements. • World + Regional Maps — 20 tracker/map views across world, capitals, and country sub-trackers • UNESCO Overlay — optional UNESCO World Heritage layer with 270 sites • Bucket List Planner — add planned trips, target dates, and mark destinations complete • Travel Challenges — create personal or friend challenges with streak-friendly progress [README 설치·사용 부분 발췌] Quick Start (Docker)查看完整 README ↗
Your world. Your journey.
An interactive travel tracker where you mark countries, explore detailed region maps, track capitals and UNESCO sites, set goals, and unlock achievements.
→ Live App · ·
| Tracker | Regions | Mode |
|---|---|---|
| 🌍 World Map | 238 countries | Polygon |
| 🏛️ World Capitals | 192 capitals | Point |
| 🇨🇭 Switzerland | 26 cantons | Polygon |
| 🇺🇸 United States | 50 states + DC + PR | Polygon |
| 🏞️ US National Parks | 63 parks | Point |
| 🗽 NYC | 197 neighborhoods | Polygon |
| 🇳🇴 Norway | 15 counties + Svalbard | Polygon |
| 🇨🇦 Canada | 13 provinces & territories | Polygon |
| 🇯🇵 Japan | 47 prefectures | Polygon |
| 🇦🇺 Australia | 8 states & territories | Polygon |
| 🇵🇭 Philippines | 17 regions | Polygon |
| 🇧🇷 Brazil | 26 states + DF | Polygon |
| 🇫🇷 France | 13 regions | Polygon |
| 🇩🇪 Germany | 16 states | Polygon |
| 🇮🇹 Italy | 20 regions | Polygon |
| 🇪🇸 Spain | 17 autonomous communities | Polygon |
| 🇲🇽 Mexico | 32 states | Polygon |
| 🇬🇧 United Kingdom | 4 nations / regional view support | Polygon |
| 🇮🇳 India | 36 states & union territories | Polygon |
| 🇳🇿 New Zealand | 16 regions | Polygon |
| Layer | Technology |
|---|---|
| Frontend | React 18, Vite 6, Leaflet + react-leaflet |
| Backend | Python FastAPI, SQLAlchemy (async), PostgreSQL |
| Auth | Google Identity Services + JWT |
| Database (local) | PostgreSQL 16 (Docker) with asyncpg |
| Database (prod) | Neon serverless PostgreSQL with psycopg |
| Hosting | Vercel (frontend CDN + Python serverless functions) |
| Monitoring | Sentry (frontend), Vercel Analytics & Speed Insights |
| Container | Docker Compose (nginx + FastAPI + PostgreSQL) |
┌─────────────────────────────────────────────────────────┐
│ Two deployment modes │
├──────────────────────┬──────────────────────────────────┤
│ Docker Compose │ Vercel (production) │
│ │ │
│ nginx (port 8088) │ Vite static build → CDN │
│ ├─ static files │ api/index.py → Serverless Fn │
│ └─ /api → FastAPI │ └─ re-exports backend/main.py │
│ └─ asyncpg │ └─ psycopg (NullPool) │
│ └─ PG 16 │ └─ Neon PostgreSQL │
└──────────────────────┴──────────────────────────────────┘
docker compose up --build
http://localhost:8088 to Authorized JavaScript origins.env file:cp .env.example .env
# Edit .env and paste your Google Client ID + a random JWT secret
docker compose up --build
Open http://localhost:8088 in your browser.
# Frontend (Vitest)
npm test
# Backend (pytest)
pip install -r backend/requirements-dev.txt
cd backend && pytest -v
# E2E (Playwright)
npx playwright install chromium
npm run test:e2e
Create a free project at neon.tech and copy the pooled connection string from Connection Details.
In your Vercel project → Settings → Environment Variables:
| Variable | Required | Description |
|---|---|---|
DATABASE_URL | Yes | Neon pooled connection string |
GOOGLE_CLIENT_ID | Yes | Google OAuth 2.0 Client ID |
JWT_SECRET | Yes | Random secret (openssl rand -hex 32) |
ENCRYPTION_MASTER_KEY | Yes | Master key for data encryption (openssl rand -hex 32) |
ADMIN_EMAIL | Yes | Your email address (grants admin access) |
FRONTEND_URL | Yes | Your Vercel production URL |
VITE_SENTRY_DSN | No | Sentry DSN for error tracking |
In Google Cloud Console → Credentials → your OAuth Client ID, add your production URL to Authorized JavaScript origins.
vercel --prod
Or push to your connected Git repo — Vercel deploys automatically.
Visit https://your-app.vercel.app/api/health — should return {"status":"ok","database":"connected"}
| Variable | Used in | Purpose |
|---|---|---|
DATABASE_URL | Backend | PostgreSQL connection string |
POSTGRES_URL | Backend (fallback) | Auto-set by Vercel Neon integration |
GOOGLE_CLIENT_ID | Backend + Vite | Google OAuth verification |
VITE_GOOGLE_CLIENT_ID | Vite build | Auto-mapped from GOOGLE_CLIENT_ID in vite.config.js |
JWT_SECRET | Backend | JWT signing key |
ENCRYPTION_MASTER_KEY | Backend | Master key for encrypting user data |
ADMIN_EMAIL | Backend | Email address that gets admin access |
FRONTEND_URL | Backend | Allowed CORS origin |
VERCEL | Backend | Auto-set by Vercel — do not set manually |
VITE_SENTRY_DSN | Vite build | Sentry frontend error tracking |
fe_sendauth: no password supplied — Your DATABASE_URL is missing the password. Double-check the Neon connection string.
init_db skipped on serverless cold start — Expected on the very first cold-start request. Tables should already exist in Neon.
Cannot assign requested address (IPv6) — Use Neon's pooled connection string (contains -pooler in the hostname).
Health check returns "database": "unreachable" — Verify DATABASE_URL in Vercel env vars and that your Neon project is active.
Bug reports and pull requests are welcome! Please open an issue first to discuss major changes.
See SECURITY.md to report security vulnerabilities privately.
If you find this project useful, consider buying me a tea ☕