Apex Pulse

React 18TypeScriptViteSUSupabase (PostgreSQL + Auth + RLS)Tailwind CSSREReact Router v6RCRechartsLULucide React@D@dnd-kit (drag-and-drop)@A@anthropic-ai/sdk (AI plan generator)@Z@zxing/browser (barcode fallback Safari)StripePWPWA (vite-plugin-pwa)VIVitest

Features

12 shipped6 in progress

Shipped12

  • Auth
  • Dashboard
  • Antrenamente — Liste Planuri
  • Antrenamente — Plan Detail
  • Antrenamente — Quick Start
  • Antrenamente — Statistici
  • Sesiune Activă
  • Exerciții
  • Istoric
  • Progres
  • Profil
  • Generare Plan AI

In Progress6

  • Nutriție — Log Zilnic
  • Nutriție — Scanare Cod de Bare
  • Nutriție — Obiectiv Caloric
  • Nutriție — Hidratare
  • Nutriție — Split Macro
  • Subscripții Stripe

Database schema

exercises7 fields
iduuid
nametext
muscle_grouptext
equipmenttext
is_customboolean
user_iduuid → auth.users

Global exercise library (user_id = null) + user-created custom exercises (is_custom = true). Pre-seeded with ~46 global exercises.

workout_plans6 fields
iduuid
user_iduuid → auth.users
nametext
descriptiontext
created_attimestamptz
updated_attimestamptz

User-created workout plans.

workout_exercises8 fields
iduuid
workout_plan_iduuid → workout_plans
exercise_iduuid → exercises
setsint
repsint
rest_secondsint

Junction table: exercises within a plan with sets, reps, rest, and display order.

sessions7 fields
iduuid
user_iduuid → auth.users
workout_plan_iduuid → workout_plans
started_attimestamptz
finished_attimestamptz
notestext

A single workout session. finished_at = null means in-progress. workout_plan_id = null for free/unplanned sessions.

session_logs9 fields
iduuid
session_iduuid → sessions
exercise_iduuid → exercises
workout_exercise_iduuid → workout_exercises
weightnumeric(6,2)
repsint

Per-set logs within a session. weight = null for bodyweight. RPE range 6.0–10.0.

body_weight5 fields
iduuid
user_iduuid → auth.users
weightnumeric(5,2)
recorded_atdate
created_attimestamptz

Daily body weight entries in kg.

profiles7 fields
iduuid → auth.users
stripe_customer_idtext
subscription_statusenum (free | active | past_due | canceled | trialing)
subscription_idtext
subscription_plantext
current_period_endtimestamptz

User profile extended with Stripe subscription data. subscription_status defaults to 'free'.

stripe_events4 fields
idtext
typetext
processed_attimestamptz
payloadjsonb

Stripe webhook idempotency log. id = Stripe evt_xxx. No RLS for frontend; service_role only.

food_cache21 fields
fdc_idtext
user_iduuid → auth.users
nametext
name_rotext
brandtext
barcodetext

Cached food items from USDA FDC and Open Food Facts. barcode stores EAN-13/UPC-A for barcode scan lookup. user_id = null for shared cache.

nutrition_logs14 fields
iduuid
user_iduuid → auth.users
log_datedate
total_caloriesnumeric(8,2)
total_protein_gnumeric(8,2)
total_carbs_gnumeric(8,2)

Daily nutrition totals per user. UNIQUE(user_id, log_date). Totals auto-updated by trigger on meal_entries.

meal_entries14 fields
iduuid
user_iduuid → auth.users
log_iduuid → nutrition_logs
fdc_idtext → food_cache
meal_typeenum (mic_dejun | pranz | cina | gustare)
quantitynumeric(7,2)

Individual food entries per meal within a nutrition log. Soft-deleted via deleted_at. Trigger updates parent nutrition_logs totals.

nutrition_goals12 fields
user_iduuid → auth.users
goal_typeenum (mentinere | deficit_usor | deficit_moderat | surplus)
tdee_estimatedint
tdee_calculated_attimestamptz
tdee_warningboolean
target_caloriesint

User calorie and macro goals (one row per user). protein_pct + carbs_pct + fat_pct must equal 100.

food_frequency4 fields
user_iduuid → auth.users
fdc_idtext → food_cache
use_countint
last_usedtimestamptz

Tracks how often each user uses a food item. Updated by trigger on meal_entries insert. Powers 'frequent foods' suggestions.