Scan a plate, scan a menu, ask a coach — honest calorie ranges built for the Gulf. Not fake precision.
HealthTypeScript · CSSGitHub @BasemhosnOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
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.Read the full 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.