CleanFrame
삼성 The Frame용 개인 홈 화면, 포크와 맞춤을 위한 시작점
13개 마을의 행사·식당·공원·숨은 명소를 마을·카테고리·날짜·가격으로 검색
Events, restaurants, parks and hidden gems across all 13 Newton villages — searchable by village, category, date and price.
라이프스타일TypeScript · PLpgSQLGitHub @brandonrfung1-collab온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.