尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Get it done. Beat your friends. A free, AI-powered to-do PWA where friends compete on a weekly leaderboard.
Stack: Next.js 16 (App Router, Cache Components) · TypeScript · Tailwind CSS v4 · Supabase (Postgres, Auth) · Vercel.
Build steps 1–7 of 12 from the build brief, plus onboarding (pulled forward from step 12).
1. Foundation
/brand: the brand and theme system sheet from the Claude Design handoffproxy.ts, email magic link sign-in (Google behind a flag)profiles table with RLS and a sign-up trigger; settings for theme, accent, coach, username, bio2. Tasks
tasks and subtasks tables with RLS, column grants and server-owned timestamps/add), task options sheet, swipe right to complete and left for options/task/[id]): title, difficulty, date and time, repeat, category, notes, steps, share toggle, delete3. AI
/api/ai: verifies the user, enforces 10 AI actions a day (reset at local midnight), JSON-only model calls4. Points, streaks and badges
point_events written only by database triggers: 5/10/20/35/50 by AI difficulty, +20% on or before the due dateOnboarding
5. Friends
/invite/[code], works signed out, joins after sign-in), WhatsApp, share sheet and an on-demand QR code6. Leaderboard
weekly_board(): you and your friends ranked by this week's points (ties share a rank); resets Monday 00:00 localclose_weeks() hourly via pg_cron records each finished week and awards Giant Slayer for finishing #17. Challenges
/challenge/new, and the full-screen trophy moment8. Feed
proofs bucket, +10 points and a verified tick/api/cron/cleanup-proofs runs daily (vercel.json) and deletes photos older than 7 days; the tick and points stay9. Coach and nudges
send_nudge)coach_recaps); the static lines are the fallback10. Notifications
push_queue), sent by /api/push/flush: right after the action, when anyone opens the app, and every minute from Supabase (supabase/push-schedule.sql)11. Focus timer and weekly recap
/focus: a 25-minute session timed by the server (+5 when it ends, up to 8 a day), from a task, its options, or the Me screen; keeps the screen awake, corrects for a phone clock that's off, and pays out even if you're on another screen (timer pill and toast)/recap: the 1080 × 1920 card from the design (rank, points, streak, top task, your theme and accent), drawn as a PNG by /api/recap/card; share straight to WhatsApp Status or Instagram Stories with your invite link, or download itNext: polish and launch (step 12).
supabase/migrations/ in order (SQL editor, or supabase db push). If you're not sure which have run, paste supabase/catch-up.sql into the SQL editor instead: it applies everything that's missing and is safe to run any number of times. Regenerate it after adding a migration.http://localhost:3000/auth/callback and your production https://…/auth/callback to the redirect URLs.NEXT_PUBLIC_GOOGLE_AUTH_ENABLED=true to show the button.cp .env.example .env.local and fill in the project URL and publishable key, plus SUPABASE_SECRET_KEY and GEMINI_API_KEY (and optionally GROQ_API_KEY) for AI, CRON_SECRET (any long random string) for the daily photo cleanup and push schedule, and the VAPID keys for push (npx web-push generate-vapid-keys). After deploying, fill in and run supabase/push-schedule.sql once. In Vercel, add the same as environment variables.npm install, then npm run dev./ and /brand work without Supabase; sign-in shows a setup note until the env vars are set.
Tokens live in app/globals.css as CSS variables, switched by data-theme and data-accent on <html>. An inline script in app/layout.tsx applies the saved cookie before first paint. The profile is the source of truth across devices (components/theme-sync.tsx).
| Tailwind | Token | Use |
|---|---|---|
bg-bg bg-surface bg-surface-2 | --bg --surface --surface-2 | Grounds, by depth |
border-line | --border | 1 px borders |
text-ink text-muted | --text --text-muted | Text |
bg-accent + text-on-accent | --accent --on-accent | Filled buttons and pills |
text-accent-text | --accent-text | Accent-coloured text (darker in light mode) |
shadow-glow | --accent-glow | Only on #1 and an active streak |
font-display font-sans font-mono | Space Grotesk · Inter · JetBrains Mono | |
text-caption … text-celebration | 12 → 64 px, in rem | Type scale |
rounded-chip rounded-card rounded-sheet | 12 · 16 · 24 px | Radius |
Accent-coloured text in dark mode uses each accent's base hex, except Nova, which uses #AE7BFF: base Nova is only 3.9:1 in a coach bubble and 4.2:1 on surface-2.
app/ routes: / · /login · /auth/* · (app)/ today, add, task/[id], board, feed, me · /settings · /brand
components/ brand/ (Logo, AppIcon, CoachBubble) · ui/ (Button) · install prompt · theme sync
lib/ theme, dates, auth data access, Supabase clients, tasks/ (offline store, types, points), ai/ (providers, prompts, redaction)
public/sw.js service worker (app shell and visited screens; task data syncs via lib/tasks/store.ts)
supabase/ SQL migrations
design/ Claude Design handoff bundle (prototypes, chats, design brief)