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