# reiides/suppliwise architecture

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

- Interactive diagram: https://gitdiagram.com/reiides/suppliwise
- Repository: https://github.com/reiides/suppliwise

## Overview

SuppliWise is a personalized supplement-advice application: users create an account, complete a four-step health assessment, receive AI-backed recommendations, and can follow a supplement plan over time. The product also includes assessment history, intake tracking, insights, profile management, health chat, and PDF reports. The graph follows documented capabilities and sampled routing; API-client internals and several route implementations were not sampled, so uncertain service-level wiring is omitted.

Main entry points: [`my-react-app/src/App.jsx`](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/App.jsx) (App Router), [`server/index.js`](https://github.com/reiides/suppliwise/blob/main/server/index.js) (Express API), [`my-react-app/src/api.js`](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/api.js) (API Client), [`server/routes/recommend.js`](https://github.com/reiides/suppliwise/blob/main/server/routes/recommend.js) (Recommendation Service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Web and Mobile"]
  node_app["App Router<br/>[App.jsx]"]
  node_profile_ui["Profile Management<br/>[ProfilePage.jsx]"]
  node_api["API Client<br/>[api.js]"]
end

subgraph group_assessment["Assessment and Advice"]
  node_assessment_page["Health Assessment<br/>[AssessmentPage.jsx]"]
  node_results["Recommendations"]
  node_results_page["Results<br/>[ResultsPage.jsx]"]
  node_detail["Supplement Details"]
  node_pdf["PDF Report<br/>[exportPDF.js]"]
  node_chat_ui["Health Chat<br/>[ChatAssistant.jsx]"]
end

subgraph group_wellness["Tracking and History"]
  node_dashboard["Dashboard<br/>[DashboardPage.jsx]"]
  node_intake_ui["Intake Tracking"]
  node_insights_ui["Health Insights<br/>[InsightsPage.jsx]"]
  node_history_ui["Assessment History<br/>[HistoryPage.jsx]"]
end

subgraph group_service["Backend Services"]
  node_server["Express API<br/>[index.js]"]
  node_auth["Authentication and OTP<br/>[auth.js]"]
  node_assess_route["Assessment Service<br/>[assessment.js]"]
  node_recommend_route["Recommendation Service<br/>[recommend.js]"]
  node_chat_route["Chat Service<br/>[chat.js]"]
  node_dashboard_route["Dashboard Service<br/>[dashboard.js]"]
  node_insights_route["Insights Service<br/>[insights.js]"]
  node_sanitize["Input Sanitization<br/>[sanitize.js]"]
end

subgraph group_state["Persistent State"]
  node_user_model[("User Records<br/>[User.js]")]
  node_assessment_model[("Assessment Records<br/>[Assessment.js]")]
  node_intake_model[("Intake Records<br/>[IntakeRecord.js]")]
  node_metrics_model[("Dashboard Metrics")]
  node_supplement_model[("Supplement Details")]
end

node_user(("User"))
node_mongo[("MongoDB")]
node_ai["OpenRouter AI"]
node_email["Email Delivery"]

node_user -->|"uses"| node_app
node_app -->|"routes"| node_assessment_page
node_app -->|"routes"| node_results
node_app -->|"routes"| node_dashboard
node_app -->|"routes"| node_intake_ui
node_app -->|"routes"| node_insights_ui
node_app -->|"routes"| node_history_ui
node_app -->|"routes"| node_profile_ui
node_assessment_page -->|"saves and requests"| node_api
node_results -->|"requests details"| node_api
node_dashboard -->|"loads dashboard"| node_api
node_intake_ui -->|"records intake"| node_api
node_insights_ui -->|"loads insights"| node_api
node_history_ui -->|"loads history"| node_api
node_profile_ui -->|"updates profile"| node_api
node_chat_ui -->|"sends prompts"| node_api
node_results_page -->|"exports report"| node_pdf
node_history_ui -->|"exports report"| node_pdf
node_api -->|"sends requests"| node_server
node_server -->|"mounts auth"| node_auth
node_server -->|"mounts assessment"| node_assess_route
node_server -->|"mounts recommendations"| node_recommend_route
node_server -->|"mounts chat"| node_chat_route
node_server -->|"mounts dashboard"| node_dashboard_route
node_server -->|"mounts insights"| node_insights_route
node_assess_route -->|"cleans input"| node_sanitize
node_recommend_route -->|"cleans input"| node_sanitize
node_recommend_route -->|"requests plan"| node_ai
node_chat_route -->|"requests answers"| node_ai
node_auth -->|"sends OTP"| node_email
node_auth -->|"reads and writes"| node_user_model
node_assess_route -->|"stores assessments"| node_assessment_model
node_recommend_route -->|"stores results"| node_assessment_model
node_dashboard_route -->|"reads intake"| node_intake_model
node_dashboard_route -->|"reads metrics"| node_metrics_model
node_insights_route -->|"reads assessments"| node_assessment_model
node_insights_route -->|"reads intake"| node_intake_model
node_detail -->|"reads details"| node_supplement_model
node_server -->|"connects"| node_mongo
node_user_model -->|"persists"| node_mongo
node_assessment_model -->|"persists"| node_mongo
node_intake_model -->|"persists"| node_mongo
node_metrics_model -->|"persists"| node_mongo
node_supplement_model -->|"persists"| node_mongo

click node_app "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/App.jsx"
click node_assessment_page "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/AssessmentPage.jsx"
click node_results "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/RecommendationsPage.jsx"
click node_results_page "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/ResultsPage.jsx"
click node_detail "https://github.com/reiides/suppliwise/blob/main/server/routes/supplement_detail.js"
click node_pdf "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/utils/exportPDF.js"
click node_chat_ui "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/ChatAssistant.jsx"
click node_dashboard "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/DashboardPage.jsx"
click node_intake_ui "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/TrackIntakePage.jsx"
click node_insights_ui "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/InsightsPage.jsx"
click node_history_ui "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/HistoryPage.jsx"
click node_profile_ui "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/ProfilePage.jsx"
click node_api "https://github.com/reiides/suppliwise/blob/main/my-react-app/src/api.js"
click node_server "https://github.com/reiides/suppliwise/blob/main/server/index.js"
click node_auth "https://github.com/reiides/suppliwise/blob/main/server/routes/auth.js"
click node_assess_route "https://github.com/reiides/suppliwise/blob/main/server/routes/assessment.js"
click node_recommend_route "https://github.com/reiides/suppliwise/blob/main/server/routes/recommend.js"
click node_chat_route "https://github.com/reiides/suppliwise/blob/main/server/routes/chat.js"
click node_dashboard_route "https://github.com/reiides/suppliwise/blob/main/server/routes/dashboard.js"
click node_insights_route "https://github.com/reiides/suppliwise/blob/main/server/routes/insights.js"
click node_sanitize "https://github.com/reiides/suppliwise/blob/main/server/utils/sanitize.js"
click node_user_model "https://github.com/reiides/suppliwise/blob/main/server/models/User.js"
click node_assessment_model "https://github.com/reiides/suppliwise/blob/main/server/models/Assessment.js"
click node_intake_model "https://github.com/reiides/suppliwise/blob/main/server/models/IntakeRecord.js"
click node_metrics_model "https://github.com/reiides/suppliwise/blob/main/server/models/DashboardMetrics.js"
click node_supplement_model "https://github.com/reiides/suppliwise/blob/main/server/models/SupplementDetail.js"

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_app,node_profile_ui,node_api,node_user toneBlue
class node_assessment_page,node_results,node_results_page,node_detail,node_pdf,node_chat_ui,node_mongo toneAmber
class node_dashboard,node_intake_ui,node_insights_ui,node_history_ui,node_ai toneMint
class node_server,node_auth,node_assess_route,node_recommend_route,node_chat_route,node_dashboard_route,node_insights_route,node_sanitize toneRose
class node_user_model,node_assessment_model,node_intake_model,node_metrics_model,node_supplement_model,node_email toneIndigo
```

## Components

### Web and Mobile

- [App Router](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/App.jsx): `my-react-app/src/App.jsx`
- [Profile Management](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/ProfilePage.jsx): `my-react-app/src/Pages/ProfilePage.jsx`
- [API Client](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/api.js): `my-react-app/src/api.js`

### Assessment and Advice

- [Health Assessment](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/AssessmentPage.jsx): `my-react-app/src/Pages/AssessmentPage.jsx`
- [Recommendations](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/RecommendationsPage.jsx): `my-react-app/src/Pages/RecommendationsPage.jsx`
- [Results](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/ResultsPage.jsx): `my-react-app/src/Pages/ResultsPage.jsx`
- [Supplement Details](https://github.com/reiides/suppliwise/blob/main/server/routes/supplement_detail.js): `server/routes/supplement_detail.js`
- [PDF Report](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/utils/exportPDF.js): `my-react-app/src/utils/exportPDF.js`
- [Health Chat](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/ChatAssistant.jsx): `my-react-app/src/Pages/ChatAssistant.jsx`

### Tracking and History

- [Dashboard](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/DashboardPage.jsx): `my-react-app/src/Pages/DashboardPage.jsx`
- [Intake Tracking](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/TrackIntakePage.jsx): `my-react-app/src/Pages/TrackIntakePage.jsx`
- [Health Insights](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/InsightsPage.jsx): `my-react-app/src/Pages/InsightsPage.jsx`
- [Assessment History](https://github.com/reiides/suppliwise/blob/main/my-react-app/src/Pages/HistoryPage.jsx): `my-react-app/src/Pages/HistoryPage.jsx`

### Backend Services

- [Express API](https://github.com/reiides/suppliwise/blob/main/server/index.js): `server/index.js`
- [Authentication and OTP](https://github.com/reiides/suppliwise/blob/main/server/routes/auth.js): `server/routes/auth.js`
- [Assessment Service](https://github.com/reiides/suppliwise/blob/main/server/routes/assessment.js): `server/routes/assessment.js`
- [Recommendation Service](https://github.com/reiides/suppliwise/blob/main/server/routes/recommend.js): `server/routes/recommend.js`
- [Chat Service](https://github.com/reiides/suppliwise/blob/main/server/routes/chat.js): `server/routes/chat.js`
- [Dashboard Service](https://github.com/reiides/suppliwise/blob/main/server/routes/dashboard.js): `server/routes/dashboard.js`
- [Insights Service](https://github.com/reiides/suppliwise/blob/main/server/routes/insights.js): `server/routes/insights.js`
- [Input Sanitization](https://github.com/reiides/suppliwise/blob/main/server/utils/sanitize.js): `server/utils/sanitize.js`

### Persistent State

- [User Records](https://github.com/reiides/suppliwise/blob/main/server/models/User.js): `server/models/User.js`
- [Assessment Records](https://github.com/reiides/suppliwise/blob/main/server/models/Assessment.js): `server/models/Assessment.js`
- [Intake Records](https://github.com/reiides/suppliwise/blob/main/server/models/IntakeRecord.js): `server/models/IntakeRecord.js`
- [Dashboard Metrics](https://github.com/reiides/suppliwise/blob/main/server/models/DashboardMetrics.js): `server/models/DashboardMetrics.js`
- [Supplement Details](https://github.com/reiides/suppliwise/blob/main/server/models/SupplementDetail.js): `server/models/SupplementDetail.js`

### Other components

- **User**
- **MongoDB**
- **OpenRouter AI**
- **Email Delivery**

## Connections

- User → App Router: uses
- App Router → Health Assessment: routes
- App Router → Recommendations: routes
- App Router → Dashboard: routes
- App Router → Intake Tracking: routes
- App Router → Health Insights: routes
- App Router → Assessment History: routes
- App Router → Profile Management: routes
- Health Assessment → API Client: saves and requests
- Recommendations → API Client: requests details
- Dashboard → API Client: loads dashboard
- Intake Tracking → API Client: records intake
- Health Insights → API Client: loads insights
- Assessment History → API Client: loads history
- Profile Management → API Client: updates profile
- Health Chat → API Client: sends prompts
- Results → PDF Report: exports report
- Assessment History → PDF Report: exports report
- API Client → Express API: sends requests
- Express API → Authentication and OTP: mounts auth
- Express API → Assessment Service: mounts assessment
- Express API → Recommendation Service: mounts recommendations
- Express API → Chat Service: mounts chat
- Express API → Dashboard Service: mounts dashboard
- Express API → Insights Service: mounts insights
- Assessment Service → Input Sanitization: cleans input
- Recommendation Service → Input Sanitization: cleans input
- Recommendation Service → OpenRouter AI: requests plan
- Chat Service → OpenRouter AI: requests answers
- Authentication and OTP → Email Delivery: sends OTP
- Authentication and OTP → User Records: reads and writes
- Assessment Service → Assessment Records: stores assessments
- Recommendation Service → Assessment Records: stores results
- Dashboard Service → Intake Records: reads intake
- Dashboard Service → Dashboard Metrics: reads metrics
- Insights Service → Assessment Records: reads assessments
- Insights Service → Intake Records: reads intake
- Supplement Details → Supplement Details: reads details
- Express API → MongoDB: connects
- User Records → MongoDB: persists
- Assessment Records → MongoDB: persists
- Intake Records → MongoDB: persists
- Dashboard Metrics → MongoDB: persists
- Supplement Details → MongoDB: persists
