尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A personal Disney Parks planning tool that combines custom itineraries with live attraction wait times to suggest smarter day-of decisions.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
A mobile-first Disney park planning app focused on fast decisions, low cognitive load, and clean UX. Disney Wait Planner pairs live attraction wait times with a local-first, multi-day trip planner — and Tom, a built-in assistant that can answer Disney questions and read-only questions about what you've planned.檢視完整 README ↗A mobile-first Disney park planning app focused on fast decisions, low cognitive load, and clean UX. Disney Wait Planner pairs live attraction wait times with a local-first, multi-day trip planner — and Tom, a built-in assistant that can answer Disney questions and read-only questions about what you've planned.
Disney Wait Planner supports Disneyland Resort (DLR) and Walt Disney World (WDW). It combines live attraction wait times, a multi-day trip planner (attractions, dining, entertainment, and custom entries), Lightning Lane tracking, and a built-in assistant (Ask Tom) into a single mobile-first interface.
The system enforces a strict boundary between live data and local planner state, and all attraction/plan matching is canonical and deterministic — there is no fuzzy logic.
Tom is Disney Wait Planner's built-in assistant. Tom can:
GET /api/tom/showtimes, authenticated with DWP_CATALOG_API_KEY) that Tom calls with a structured park (and optionally a show name). Like all showtimes in the app, this is today-only and covers only curated, ThemeParks-mapped EntertainmentWhen an answer uses ThemeParks.wiki schedule data, the Tom page shows a linked "Powered by ThemeParks.wiki" attribution; planner-only answers show none.
Tom does not edit your plans, generate or optimize itineraries, reason about transportation or travel time, or make predictions/recommendations it isn't designed to support. Planner data shared with Tom is a compact, read-only summary — Tom cannot write back to your planner. See the in-app Tom Help Guide (/tom/help, linked from the Ask Tom Help modal) for the full, current list of what Tom can do.
Live attraction wait times are powered by the Queue-Times API, accessed through a server-side proxy rather than called directly from the browser. All wait data flows through a single unified path (liveWaitApi.ts), which returns the same shape regardless of source and falls back to a mock dataset if live data is disabled or unavailable — so the UI never breaks on a live-data outage.
Park hours and Entertainment showtimes come from the ThemeParks.wiki (Free API), accessed only server-side (themeParksApi.ts; the browser never calls the provider) and normalized before use (parkHours.ts, parkHoursService.ts, entertainmentShowtimes.ts). It is used for:
/api/park-hours)/api/entertainment/showtimes)ThemeParks.wiki does not replace Queue-Times for attraction waits, and it does not decide which attractions or Entertainment exist: the curated DWP catalog stays the canonical identity authority, and Entertainment is matched to the provider only through an explicit mapping. It needs no environment variables. Surfaces that display ThemeParks.wiki data show the linked attribution via components/ThemeParksAttribution.tsx ("Powered by ThemeParks.wiki").
apps/*, packages/*)localStorage is the source of truth, and cloud sync mirrors it when signed in/api/tom/ask) to the Tom Railway API — Tom credentials are never exposed to the browserFor implementation-level invariants, data flow details, and correctness constraints, see AGENTS.md.
This is a pnpm workspace:
apps/web — the Next.js frontend apppackages/shared — shared types and mock dataThe Next.js App Router lives at apps/web/src/app (not apps/web/app).
Development happens on feature branches; main is the production branch, and Vercel builds a preview deployment for every branch.
# Install dependencies
pnpm install
# Run the web app locally (http://localhost:3000)
pnpm --filter web dev
# Production build
pnpm --filter web build
# Run a production build
pnpm --filter web start
# Type-check the shared package
pnpm --filter @disney-wait-planner/shared typecheck
# Apply/migrate the Postgres schema (see apps/web/src/lib/db-schema.sql)
DATABASE_URL=... pnpm --filter web run db:migrate
Never run dev/build at the repo root without --filter web — the monorepo root has no app of its own to run.
db:migrate is safe to run repeatedly against a fresh or already-migrated
database (it's a no-op the second time) — see AGENTS.md's Deployment
section for the required production ordering (migrate schema, then deploy
app code) whenever db-schema.sql changes.
Live wait data
NEXT_PUBLIC_WAIT_API_ENABLED — true to enable live wait data; unset or false runs the app mock-onlyNEXT_PUBLIC_WAIT_API_BASE_URL — optional override for the wait API base URL; defaults to the same-origin proxyAuthentication & sync (optional; required for sign-in and cloud sync)
NEXTAUTH_URL — canonical app URL (e.g. https://your-app.vercel.app)NEXTAUTH_SECRET — random secret (openssl rand -base64 32)DATABASE_URL — Postgres connection string used by the auth adapter and syncEMAIL_SERVER, EMAIL_FROM — email provider settings for magic-link sign-inDaily park-hours refresh (server-only)
CRON_SECRET — required by /api/cron/park-hours (Vercel Cron, 02:00 UTC daily via apps/web/vercel.json); the route fails closed (500) when unset. Vercel sends it as Authorization: Bearer.Ask Tom (server-only — never expose these as NEXT_PUBLIC_*)
TOM_API_URL — Tom Railway API base URLTOM_API_KEY — Tom Railway API keyDWP_TOM_PROXY_KEY — shared secret used by the server-side Tom proxyDWP_CATALOG_API_KEY — shared secret Tom presents (via the
x-dwp-catalog-api-key header) to call the read-only
GET /api/catalog/query catalog lookup endpointSee AGENTS.md for repository conventions, scope discipline, and the correctness invariants (local-first/profile safety, canonical attraction identity, planned-closure enforcement, and Tom's read-only planner integration) that must be preserved when touching those areas.