尚未检测到更新。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.