尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
A 30-day accountability challenge. Sign in, tick off your daily check-ins, watch the leaderboard. No weight, no measurements, no body photos — just points, streaks, and a group chat.檢視完整 README ↗A 30-day accountability challenge. Sign in, tick off your daily check-ins, watch the leaderboard. No weight, no measurements, no body photos — just points, streaks, and a group chat.
supabase/schema.sql and click Run.settings, profiles, and entries tables with row-level security.challenge_start_date to whatever calendar date the group starts. (challenge_days defaults to 30.)The app uses email magic links. The link in the email needs to point back to where the app is hosted.
https://racetoabs.netlify.app or http://localhost:8000 for local).config.js:
window.RACE_CONFIG = {
SUPABASE_URL: "https://YOURPROJECT.supabase.co",
SUPABASE_ANON_KEY: "eyJhbGciOi...",
};
The anon key is safe to ship to the browser — RLS in schema.sql controls what users can read/write.
supabase/schema.sql is idempotent and carries its own migrations, so whenever
you pull new code, paste it into SQL Editor → New query → Run again. Your
data is left alone.
If you were running the app before per-challenge entries landed, re-run it now. The original schema declared
unique (user_id, date)onentries, which spanned every challenge — a member could only ever hold one row per calendar day in the whole table. Saving a day from one challenge overwrote the row belonging to another and re-stamped itschallenge_id, so that day vanished from the other leaderboard and the member's total looked like it had reset. The migration replaces that withunique (challenge_id, user_id, date).Days that were already re-stamped stay attached to whichever challenge saved them last; re-save them from the correct challenge to put them back. Once migrated, saving in one challenge never touches another.
The app is three static files (index.html, styles.css, app.js) plus config.js. It needs to be served over HTTP (not opened as file://) for magic-link auth to work.
Quick local test:
python3 -m http.server 8000
# open http://localhost:8000
Deploy: push the repo to GitHub and connect it to Netlify, Vercel, or Cloudflare Pages. No build step.
Every table is gated by row-level security, so this holds no matter what the client asks for:
| Visible to | |
|---|---|
| Challenge name, dates, invite code | its members only |
| Daily entries + points | its members only |
| Group chat + photos | its members only (plus whoever uploaded the photo) |
| Display name + custom goal | yourself, and people you share a challenge with |
A signed-in account that hasn't joined anything sees nothing but its own profile — no challenge list, no names, no photos. Joining requires the 6-character invite code; knowing a challenge's internal id is not enough.
| Item | Points |
|---|---|
| 30 minutes of exercise | 3 |
| Extra 5 minutes of core | 1 |
| Hit your nutrition goal | 3 |
| More than 7 hours of sleep | 2 |
| More than 60 oz of water | 2 |
| Stretched or foam rolled | 1 |
| No alcohol today | 2 |
| Less than 1 hr non-work screen time | 2 |
| Your custom goal (set per-user, e.g. "Read 30 mins") | 2 |
| Daily max | 18 |
| 30-day max | 540 |
Each user picks their own custom goal during onboarding and can change it anytime via the pencil icon on that row in the daily check-in.
To rebalance, edit the QUESTIONS array at the top of app.js.
Challenges are private. A signed-in user sees only the challenges they created or joined with an invite code — never anyone else's, and not their names, schedules, or codes.
?join=CODE pulls them straight in after sign-in), orGrab a code to share from the challenge pill in the header → Copy code or Copy link. Only members of a challenge can see its code, so an invite has to come from someone already in it.
Supabase setup tip: disable email confirmation under Authentication → Providers → Email → "Confirm email" so new users don't get a "check your email" speed bump. With it off, sign-ups create a session right away.
The app is a PWA, so it installs to the home screen and launches like a native app — no App Store, no TestFlight.
On iPhone Safari (must be Safari, not Chrome on iOS):
A blue/teal/green "RA" icon appears on the home screen. Tapping it launches the app full-screen with no Safari chrome — looks and feels native, with safe-area padding for the notch and home indicator.
index.html — markup for all four views (loading, sign-in, onboarding, app)styles.css — fitness-tracker dark themeapp.js — auth, data loading, rendering, points/streak mathconfig.js — your Supabase URL + anon key (you fill this in)supabase/schema.sql — tables, indexes, triggers, RLS policies