Resumed the foundation handoff on Opus (Sondra's call) and built out all Phase-1 features against the live free Supabase project zhcxygxjvcatvdodovtd.
app-v2/src/)lib/auth.tsx (AuthProvider + useAuth: session, profile, refresh, signOut) wired into main.tsx. pages/Login.tsx: Google button + email magic-link, friendly "Google not enabled yet" fallback.App.tsx gates on auth: no session โ Login only; signed-in but !onboarded โ Onboarding only; else the app shell. Added routes for Compounds + Settings; honest pages/Placeholder.tsx stubs for cycles/reminders/share/support so More never dead-ends.pages/Onboarding.tsx: 2-step (tracking_focus glp1/research/both โ name + weight units, weight only shown for glp1/both), writes profile + onboarded=true.pages/Compounds.tsx: add/edit/soft-delete, bulk multi-select delete, dose-history row inserted automatically when the dose changes. Soft-delete (active=false) so past injections/history survive.pages/Log.tsx + components/BodyMap.tsx: pick compound (prefills dose), optional "draw from" an in-use supply container, functional body map (abdomen quadrants + thighs) with LRU "next" suggestion (least-recently-used site), datetime, notes. On save: inserts injection, auto-decrements the in-use container and promotes a backup to in-use when it hits 0 (ยง5.4 #4). Recent list with bulk delete.pages/Supply.tsx: containers grouped by product, in-use vs backup with fridge/freezer location, doses-left (user-typed, never computed), low-stock "low" badge, quick "Use" (promote backup), add/edit sheet (form-adaptive: reconstitution fluid only for powder), multi-select bulk delete.pages/Settings.tsx: 3-way Light/Dark/System theme selector (syncs the theme context + persists to profiles.theme), units, free CSV export of injections (anti-hostage, ยง5.1), sign out, delete-all-my-data (double confirm).pages/Dashboard.tsx: real greeting, last-injection card, "Log an injection" CTA, running-low nudges. (The composite ring is Phase 2.)components/EmptyState.tsx, components/SelectableList.tsx (reusable multi-select+bulk-delete list, ยง5.4 #3), components/ui/field.tsx (Input/Textarea/Select/Field), components/ui/sheet.tsx (bottom-sheet dialog), lib/types.ts (row types).npx tsc -b --force โ clean. npm run build โ clean (dist built).app-v2/verify/pp-login-2026-07-07.png).user_id filter returns 0, and entitlements can't be self-granted (tamper-proof). Test users deleted; DB confirmed back to 0 rows across all tables (auto-profile trigger + delete-cascade both confirmed working).Dashboard ring + check-ins, body-map polish (illustrated art), reminders + push dispatcher that provably fire (ยง5.4 #1 โ the #1 must-fix), cycles. Then Phase 3 (Stripe money spine + premium gates + half-life curves + stacks + insight cards + share links + admin) and Phase 4 (landing, legal, support form, /app-safety-check, domain cutover).
types.ts is hand-written; regenerate from the live DB at launch.Generated for the CEO Dashboard · source: PROJECTS/Peptide Pal/handoffs/v2-phase1-features-2026-07-07.md ๐ค