GymCoach
근력 트레이닝 기록 및 개인 AI 코치
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
AI food & fitness coach — marketing site, waitlist, web product, and a
native iOS/Android app via Expo. All three vision features are live
(plate / menu / body) on both surfaces.
Built on Next.js App Router. Deployed to Vercel. Data + auth in Supabase.
Vision via Vercel AI Gateway → Anthropic Claude.
The web's /api/* routes accept either session cookies (web caller) or
Authorization: Bearer (mobile caller), so the two
surfaces share the same backend.README 전문 보기 ↗AI food & fitness coach — marketing site, waitlist, web product, and a native iOS/Android app via Expo. All three vision features are live (plate / menu / body) on both surfaces.
Built on Next.js App Router. Deployed to Vercel. Data + auth in Supabase. Vision via Vercel AI Gateway → Anthropic Claude.
/ ← Next.js web app (marketing + product)
apps/
mobile/ ← Expo native app (see apps/mobile/README.md)
supabase/migrations/ ← SQL — shared between web and mobile
The web's /api/* routes accept either session cookies (web caller) or
Authorization: Bearer <access_token> (mobile caller), so the two
surfaces share the same backend.
/ ← marketing landing + waitlist
/privacy ← privacy policy
/login ← magic-link sign in
/onboarding ← first-login profile form (gated)
/dashboard ← targets + today's ledger + weight log (gated)
/scan/plate ← camera upload + macro review + add-to-log (gated)
/scan/menu ← menu photo + dish ranking against today's budget (gated)
/scan/body ← body-fat range + weeks-to-goal; photo NOT stored (gated)
/auth/callback ← Supabase magic-link return
/api/profile ← POST onboarding, computes + saves targets
/api/weight ← POST weight log, retunes targets
/api/scan/plate ← POST plate image, runs vision, persists scan
/api/scan/menu ← POST menu image, runs vision + budget-aware ranking
/api/scan/body ← POST body image, runs vision; image NEVER stored
/api/ledger/add ← POST selected items to today's log
/api/ledger/today ← GET today's totals + remaining vs targets
Route groups: app/(marketing) holds the public site, app/(app) holds the
gated product surface. Both render at the root URL — route groups don't add
URL segments.
npm install
cp .env.example .env.local # fill in Supabase + AI Gateway keys
npm run dev
Requires Node ≥ 20.6.
Run the migrations once against your Supabase project (paste into SQL editor):
supabase/migrations/0001_phase0.sql ← profiles, weight_logs, RLS, triggers
supabase/migrations/0002_phase1.sql ← scans, meal_items, plate-scans bucket
supabase/migrations/0003_phase2.sql ← menu-scans bucket
Enable magic-link auth in Supabase: Auth → Providers → Email → Magic Link.
Add redirect URLs (Auth → URL Configuration → Redirect URLs) for both
http://localhost:3000/auth/callback and https://se7a.app/auth/callback.
Get an AI Gateway key from vercel.com/dashboard → AI Gateway → API Keys
and put it in .env.local as AI_GATEWAY_API_KEY. On Vercel deployments this
is automatic via OIDC — no key needed in env vars.
npm test # node --test, tsx loader — macro math coverage
npm run typecheck # tsc --noEmit
npm run build # production compile
lib/macros.ts is pure functions; lib/macros.test.ts covers BMR
(Mifflin-St Jeor), TDEE multipliers, kcal-floor clamps, lean-mass refinement,
and the full computeTargets integration. 18 tests, all green.
Push to main → Vercel auto-deploys.
Required env vars on Vercel (Production + Preview):
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYAI_GATEWAY_API_KEY is auto-injected on Vercel; no manual config needed.
app/
(marketing)/ public landing + privacy
(app)/ gated: /login, /onboarding, /dashboard, /scan/plate
auth/callback/ magic-link return
api/
profile/ POST onboarding
weight/ POST weight log + retune
scan/plate/ POST plate image → AI → persist
ledger/{add,today}/ POST log items, GET today's totals
components/ shared (Waitlist)
lib/
supabase/ SSR + browser + middleware clients
schemas/ Zod input + scan-result schemas
prompts/ versioned prompt strings (plate.v1, …)
macros.ts BMR, TDEE, macro split, age math
macros.test.ts node:test coverage
ai.ts AI Gateway model registry + prompt versions
ledger.ts today's totals + remaining-budget helpers
middleware.ts refreshes Supabase session each request
supabase/migrations/ SQL — run against the prod Supabase project
Outputs are ranges, never point values. Every macro returned from a
vision scan has a _low and _high. The model is prompted to surface
"invisible costs" (oil, butter, hidden sugars). Confidence is enforced as
low | medium | high. A photo can't see the oil; we don't pretend it can.
apps/mobile). Same backend, native camera, magic-link via se7a:// deep links. EAS-ready for TestFlight; see apps/mobile/README.md.