# nhatquang2288/nutriboost-project architecture

> Architecture diagram of the GitHub repository nhatquang2288/nutriboost-project, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/nhatquang2288/nutriboost-project
- Repository: https://github.com/nhatquang2288/nutriboost-project

## Overview

NutriBoost is a Vietnamese, mobile-first nutrition coaching PWA for clients and personal trainers. The client journey covers sign-in, onboarding and energy goals, daily meal logging, meal and workout plans, progress, and AI assistance; the PT console adds invitations, client management, and plan review. The README documents a deterministic nutrition layer and a unified AI gateway. Some route and subsystem implementations were not sampled, so only documented capabilities and evidenced connections are shown; Supabase and the model provider are external services.

Main entry points: [`apps/web/src/app/api/ai/chat/route.ts`](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/api/ai/chat/route.ts) (Chat API orchestrator), [`apps/web/src/lib/supabase/server.ts`](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/supabase/server.ts) (Supabase server client), [`apps/web/src/app/auth/callback/route.ts`](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/auth/callback/route.ts) (Auth callback), [`apps/web/src/app/onboarding/OnboardingFlow.tsx`](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/onboarding/OnboardingFlow.tsx) (Onboarding flow)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Client experience"]
  node_onboarding["Onboarding flow<br/>[OnboardingFlow.tsx]"]
  node_today["Daily dashboard<br/>[page.tsx]"]
  node_meal_log["Meal logging<br/>[page.tsx]"]
  node_meal_plan["Seven-day meal plan<br/>[page.tsx]"]
  node_workout["Workout calendar<br/>[page.tsx]"]
  node_progress["Progress tracking<br/>[page.tsx]"]
end

subgraph group_nutrition["Nutrition and plans"]
  node_onboarding_actions["Onboarding actions<br/>[onboarding.ts]"]
  node_nutrition_math["Nutrition calculations<br/>[index.ts]"]
  node_meal_actions["Meal actions<br/>[meals.ts]"]
  node_nutrition_safety["Safety assessment<br/>[safety.ts]"]
  node_plan_actions["Plan actions<br/>[plans.ts]"]
end

subgraph group_assistant["AI assistant"]
  node_chat_ui["Assistant interface"]
  node_chat_api["Chat API orchestrator<br/>[route.ts]"]
  node_ai_gateway["AI gateway<br/>[gateway.ts]"]
  node_model_client["Gemini model client<br/>[client.ts]"]
  node_ai_store["AI data store adapter<br/>[store.ts]"]
end

subgraph group_pt["PT console"]
  node_pt_home["PT overview<br/>[page.tsx]"]
  node_invites["Invite management<br/>[InviteManager.tsx]"]
  node_invite_actions["Invite actions<br/>[invites.ts]"]
  node_pt_client["Client profile<br/>[page.tsx]"]
  node_approval["Plan approval queue<br/>[page.tsx]"]
end

subgraph group_platform["Identity and data"]
  node_signin["Magic-link sign-in<br/>[page.tsx]"]
  node_magic_link["Magic-link API<br/>[route.ts]"]
  node_callback["Auth callback<br/>[route.ts]"]
  node_supabase_server["Supabase server client<br/>[server.ts]"]
  node_db_types["Shared database types<br/>[database.types.ts]"]
end

node_client_user(("Client"))
node_pt_user(("Personal trainer"))
node_supabase[("Supabase Auth and database")]
node_ai_provider{{"Google Gemini"}}

node_client_user -->|"requests sign-in"| node_signin
node_signin -->|"sends email"| node_magic_link
node_magic_link -->|"creates client"| node_supabase_server
node_supabase_server -->|"authenticates with"| node_supabase
node_supabase -->|"returns link"| node_callback
node_callback -->|"exchanges code"| node_supabase_server
node_callback -->|"routes new users"| node_onboarding
node_client_user -->|"enters profile"| node_onboarding
node_onboarding -->|"submits answers"| node_onboarding_actions
node_onboarding_actions -->|"uses calculations"| node_nutrition_math
node_client_user -->|"views daily status"| node_today
node_client_user -->|"records meals"| node_meal_log
node_meal_log -->|"submits meal"| node_meal_actions
node_client_user -->|"views plan"| node_meal_plan
node_client_user -->|"views schedule"| node_workout
node_client_user -->|"views progress"| node_progress
node_client_user -->|"asks assistant"| node_chat_ui
node_chat_ui -->|"sends messages"| node_chat_api
node_chat_api -->|"checks safety"| node_nutrition_safety
node_chat_api -->|"builds chat response"| node_ai_gateway
node_ai_gateway -->|"requests generation"| node_model_client
node_model_client -.->|"calls model"| node_ai_provider
node_chat_api -->|"creates AI store"| node_ai_store
node_ai_store -->|"uses persistence"| node_supabase
node_chat_api -->|"gets session client"| node_supabase_server
node_pt_user -->|"manages clients"| node_pt_home
node_pt_user -->|"manages invitations"| node_invites
node_invites -->|"creates or revokes"| node_invite_actions
node_invite_actions -->|"uses data access"| node_supabase_server
node_pt_user -->|"opens client"| node_pt_client
node_pt_user -->|"reviews plans"| node_approval
node_pt_client -->|"requests plan draft"| node_plan_actions
node_approval -->|"reviews plan"| node_plan_actions
node_db_types -.->|"defines shared shapes"| node_supabase

click node_signin "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/dang-nhap/page.tsx"
click node_magic_link "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/api/auth/magic-link/route.ts"
click node_callback "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/auth/callback/route.ts"
click node_supabase_server "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/supabase/server.ts"
click node_onboarding "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/onboarding/OnboardingFlow.tsx"
click node_onboarding_actions "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/actions/onboarding.ts"
click node_nutrition_math "https://github.com/nhatquang2288/nutriboost-project/blob/main/packages/nutrition/src/index.ts"
click node_today "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(app)/hom-nay/page.tsx"
click node_meal_log "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(app)/ghi-nhan/page.tsx"
click node_meal_actions "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/actions/meals.ts"
click node_meal_plan "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(app)/ke-hoach/page.tsx"
click node_workout "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(app)/lich-tap/page.tsx"
click node_progress "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(app)/tien-do/page.tsx"
click node_chat_ui "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/components/assistant/AssistantProvider.tsx"
click node_chat_api "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/api/ai/chat/route.ts"
click node_ai_gateway "https://github.com/nhatquang2288/nutriboost-project/blob/main/packages/ai/src/gateway.ts"
click node_model_client "https://github.com/nhatquang2288/nutriboost-project/blob/main/packages/ai/src/client.ts"
click node_nutrition_safety "https://github.com/nhatquang2288/nutriboost-project/blob/main/packages/nutrition/src/safety.ts"
click node_ai_store "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/ai/store.ts"
click node_pt_home "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(pt)/pt/page.tsx"
click node_invites "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(pt)/pt/loi-moi/InviteManager.tsx"
click node_invite_actions "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/actions/invites.ts"
click node_pt_client "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(pt)/pt/khach/%5BclientId%5D/page.tsx"
click node_plan_actions "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/actions/plans.ts"
click node_approval "https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(pt)/pt/duyet/page.tsx"
click node_db_types "https://github.com/nhatquang2288/nutriboost-project/blob/main/packages/db/src/database.types.ts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_onboarding,node_today,node_meal_log,node_meal_plan,node_workout,node_progress,node_client_user toneBlue
class node_onboarding_actions,node_nutrition_math,node_meal_actions,node_nutrition_safety,node_plan_actions,node_supabase toneAmber
class node_chat_ui,node_chat_api,node_ai_gateway,node_model_client,node_ai_store toneMint
class node_pt_home,node_invites,node_invite_actions,node_pt_client,node_approval toneRose
class node_signin,node_magic_link,node_callback,node_supabase_server,node_db_types,node_pt_user,node_ai_provider toneIndigo
```

## Components

### Client experience

- [Onboarding flow](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/onboarding/OnboardingFlow.tsx): `apps/web/src/app/onboarding/OnboardingFlow.tsx`
- [Daily dashboard](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(app)/hom-nay/page.tsx): `apps/web/src/app/(app)/hom-nay/page.tsx`
- [Meal logging](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(app)/ghi-nhan/page.tsx): `apps/web/src/app/(app)/ghi-nhan/page.tsx`
- [Seven-day meal plan](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(app)/ke-hoach/page.tsx): `apps/web/src/app/(app)/ke-hoach/page.tsx`
- [Workout calendar](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(app)/lich-tap/page.tsx): `apps/web/src/app/(app)/lich-tap/page.tsx`
- [Progress tracking](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(app)/tien-do/page.tsx): `apps/web/src/app/(app)/tien-do/page.tsx`

### Nutrition and plans

- [Onboarding actions](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/actions/onboarding.ts): `apps/web/src/lib/actions/onboarding.ts`
- [Nutrition calculations](https://github.com/nhatquang2288/nutriboost-project/blob/main/packages/nutrition/src/index.ts): `packages/nutrition/src/index.ts`
- [Meal actions](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/actions/meals.ts): `apps/web/src/lib/actions/meals.ts`
- [Safety assessment](https://github.com/nhatquang2288/nutriboost-project/blob/main/packages/nutrition/src/safety.ts): `packages/nutrition/src/safety.ts`
- [Plan actions](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/actions/plans.ts): `apps/web/src/lib/actions/plans.ts`

### AI assistant

- [Assistant interface](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/components/assistant/AssistantProvider.tsx): `apps/web/src/components/assistant/AssistantProvider.tsx`
- [Chat API orchestrator](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/api/ai/chat/route.ts): `apps/web/src/app/api/ai/chat/route.ts`
- [AI gateway](https://github.com/nhatquang2288/nutriboost-project/blob/main/packages/ai/src/gateway.ts): `packages/ai/src/gateway.ts`
- [Gemini model client](https://github.com/nhatquang2288/nutriboost-project/blob/main/packages/ai/src/client.ts): `packages/ai/src/client.ts`
- [AI data store adapter](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/ai/store.ts): `apps/web/src/lib/ai/store.ts`

### PT console

- [PT overview](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(pt)/pt/page.tsx): `apps/web/src/app/(pt)/pt/page.tsx`
- [Invite management](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(pt)/pt/loi-moi/InviteManager.tsx): `apps/web/src/app/(pt)/pt/loi-moi/InviteManager.tsx`
- [Invite actions](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/actions/invites.ts): `apps/web/src/lib/actions/invites.ts`
- [Client profile](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(pt)/pt/khach/%5BclientId%5D/page.tsx): `apps/web/src/app/(pt)/pt/khach/[clientId]/page.tsx`
- [Plan approval queue](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/(pt)/pt/duyet/page.tsx): `apps/web/src/app/(pt)/pt/duyet/page.tsx`

### Identity and data

- [Magic-link sign-in](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/dang-nhap/page.tsx): `apps/web/src/app/dang-nhap/page.tsx`
- [Magic-link API](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/api/auth/magic-link/route.ts): `apps/web/src/app/api/auth/magic-link/route.ts`
- [Auth callback](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/app/auth/callback/route.ts): `apps/web/src/app/auth/callback/route.ts`
- [Supabase server client](https://github.com/nhatquang2288/nutriboost-project/blob/main/apps/web/src/lib/supabase/server.ts): `apps/web/src/lib/supabase/server.ts`
- [Shared database types](https://github.com/nhatquang2288/nutriboost-project/blob/main/packages/db/src/database.types.ts): `packages/db/src/database.types.ts`

### Other components

- **Client**
- **Personal trainer**
- **Supabase Auth and database**
- **Google Gemini**

## Connections

- Client → Magic-link sign-in: requests sign-in
- Magic-link sign-in → Magic-link API: sends email
- Magic-link API → Supabase server client: creates client
- Supabase server client → Supabase Auth and database: authenticates with
- Supabase Auth and database → Auth callback: returns link
- Auth callback → Supabase server client: exchanges code
- Auth callback → Onboarding flow: routes new users
- Client → Onboarding flow: enters profile
- Onboarding flow → Onboarding actions: submits answers
- Onboarding actions → Nutrition calculations: uses calculations
- Client → Daily dashboard: views daily status
- Client → Meal logging: records meals
- Meal logging → Meal actions: submits meal
- Client → Seven-day meal plan: views plan
- Client → Workout calendar: views schedule
- Client → Progress tracking: views progress
- Client → Assistant interface: asks assistant
- Assistant interface → Chat API orchestrator: sends messages
- Chat API orchestrator → Safety assessment: checks safety
- Chat API orchestrator → AI gateway: builds chat response
- AI gateway → Gemini model client: requests generation
- Gemini model client → Google Gemini: calls model
- Chat API orchestrator → AI data store adapter: creates AI store
- AI data store adapter → Supabase Auth and database: uses persistence
- Chat API orchestrator → Supabase server client: gets session client
- Personal trainer → PT overview: manages clients
- Personal trainer → Invite management: manages invitations
- Invite management → Invite actions: creates or revokes
- Invite actions → Supabase server client: uses data access
- Personal trainer → Client profile: opens client
- Personal trainer → Plan approval queue: reviews plans
- Client profile → Plan actions: requests plan draft
- Plan approval queue → Plan actions: reviews plan
- Shared database types → Supabase Auth and database: defines shared shapes
