尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Things to do in Newton, Massachusetts — events, restaurants, parks, seasonal activities and hidden gems across all 13 villages, filterable by village, category, date, price and distance.
Built with Next.js 15 (App Router), TypeScript, Tailwind CSS and Supabase.
npm install
npm run dev
Open http://localhost:3000.
No credentials needed. With no Supabase environment variables set, the app runs in demo mode: it serves the bundled seed dataset (64 activities across all 13 villages, each pictured with a real, verified Wikimedia Commons photo) and every page works. Accounts, favorites, reviews and the moderation queue show a friendly "needs Supabase" notice instead of erroring.
.env.example to .env.local and fill in:NEXT_PUBLIC_SUPABASE_URL=https://your-project-ref.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
NEXT_PUBLIC_SITE_URL=http://localhost:3000
Find all three under Project Settings → API. The service-role key is server
only — never prefix it with NEXT_PUBLIC_.
Paste supabase/migrations/0001_init.sql into the Supabase SQL Editor and
run it. This creates all nine tables, the enums, the triggers that maintain
rating/save counters, the RPC functions, and row-level security policies on
every table.
Or, with the Supabase CLI:
npx supabase link --project-ref <your-ref>
npx supabase db push
npm run seed
This regenerates supabase/seed.sql from src/lib/data/*.ts and — if
SUPABASE_SERVICE_ROLE_KEY is set — pushes 13 villages, 8 categories and 65
activities straight to your database. Re-running is safe; everything upserts on
slug.
Without the service key, paste supabase/seed.sql into the SQL Editor instead.
Email/password works immediately.
Google OAuth:
https://<your-project-ref>.supabase.co/auth/v1/callbackhttp://localhost:3000/auth/callbackhttps://ntactivity.space/auth/callbackSign up through the app, then in the SQL Editor:
update public.profiles
set is_admin = true
where id = (select id from auth.users where email = '[email protected]');
/admin is now available: moderation queue, listing management, and analytics.
Admin status is deliberately not self-assignable. A trigger blocks any change to
profiles.is_adminthat does not come from the service role.
npm i -g vercel
vercel # link the project
vercel --prod
Or push to GitHub and import the repo at https://vercel.com/new. Framework
detection picks up Next.js automatically; no vercel.json is required.
Add these in Vercel → Project → Settings → Environment Variables (Production and Preview):
| Name | Value |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | your Supabase URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | your anon key |
SUPABASE_SERVICE_ROLE_KEY | your service-role key (not public) |
NEXT_PUBLIC_SITE_URL | https://ntactivity.space |
Then pull them locally with:
vercel env pull .env.local
ntactivity.space under Settings → Domains.NEXT_PUBLIC_SITE_URL to the final origin — it drives canonical URLs,
OpenGraph tags, the sitemap and calendar links.https://ntactivity.space/auth/callback to Supabase's allowed redirect
URLs.https://ntactivity.space/sitemap.xml to Google Search Console.Pages
/activities — search with village, category, date-range, free/paid and distance filters/activities/[slug] — photos, embedded map, add-to-calendar (.ics + Google), reviews, related listings/villages and /villages/[slug] — a page per village with local trivia and its own filters/categories and /categories/[slug] — eight browse categories/submit — public submission form feeding the moderation queue/admin — approve/reject submissions, hide/delete listings, view analytics/favorites, /login, /signupFeatures
sitemap.xml, robots.txt, and schema.org
Event / Place JSON-LD for rich resultsAccessibility & performance
aria-* on interactive elementsnext/image optimization with a graceful fallback for dead photo URLs.dark to <html> to enable a toggle)npm run dev # dev server
npm run build # production build
npm run start # serve the production build
npm run typecheck # tsc --noEmit
npm run lint # next lint
npm run seed # regenerate supabase/seed.sql (+ push if service key present)
See CLAUDE.md for architecture, the database schema reference,
the demo-mode contract, design tokens and coding conventions.
Landmarks are real Newton fixtures — Crystal Lake, Echo Bridge, Hemlock Gorge, Cold Spring Park, Nahanton Park, Newton Community Farm, the West Newton Cinema, Nonantum's St. Mary of Carmen Festival. Hours, prices and specific event times are illustrative placeholders for demonstrating the app, not verified listings. Replace them with real submissions before launch.