# lissjackb/swat-hackro architecture

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

- Interactive diagram: https://gitdiagram.com/lissjackb/swat-hackro
- Repository: https://github.com/lissjackb/swat-hackro

## Overview

Hackro is a dining-hall meal planning and nutrition tracking app for Tri-Co students. A student enters profile, goal, and dietary constraints; the app combines dining-menu data with macro targets and optional Whoop recovery data to plan meals, then supports recording food eaten and reviewing progress. The shared planner serves both the UI and API, while routes handle persistence and integrations. Edges reflect README statements and supplied excerpts/index references; unsampled route and screen internals are not inferred.

Main entry points: [`src/lib/planner/plan.ts`](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/plan.ts) (Planner engine), [`src/lib/hackro/store.tsx`](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/hackro/store.tsx) (Client state), [`src/lib/db.ts`](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/db.ts) (SQLite database), [`src/app/api/nutrition/route.ts`](https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/nutrition/route.ts) (Nutrition lookup)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["Student experience"]
  node_app["Hackro app<br/>[page.tsx]"]
  node_onboarding["Profile setup<br/>[Onboarding.tsx]"]
  node_meal_screens["Meal screens<br/>[Today.tsx]"]
  node_tracking_screens["Tracking screens<br/>[Track.tsx]"]
  node_ui_primitives["UI primitives<br/>[ui.tsx]"]
  node_icons["Icon system<br/>[Icon.tsx]"]
  node_ui_styles["Style adapter<br/>[sx.ts]"]
  node_ai_ui["AI explanations<br/>[AiBits.tsx]"]
  node_client_store["Client state<br/>[store.tsx]"]
  node_client_state["State model<br/>[state.ts]"]
  node_client_api["Client API<br/>[api.ts]"]
end

subgraph group_planning["Meal planning"]
  node_planner["Planner engine<br/>[plan.ts]"]
  node_planner_context["Planning context<br/>[context.ts]"]
  node_planner_data["Menu and meal data<br/>[data.ts]"]
  node_planner_items["Menu item mapping<br/>[items.ts]"]
  node_planner_rules["Dietary restrictions<br/>[restrictions.ts]"]
  node_planner_targets["Planner targets<br/>[targets.ts]"]
  node_targets_logic["Macro calculations<br/>[targets.ts]"]
  node_progress_logic["Progress calculations<br/>[progress.ts]"]
end

subgraph group_services["Application services"]
  node_menu_api["Menu service<br/>[route.ts]"]
  node_plan_api["Plan service<br/>[route.ts]"]
  node_profile_api["Profile service<br/>[route.ts]"]
  node_targets_api["Target service<br/>[route.ts]"]
  node_nutrition_api["Nutrition lookup<br/>[route.ts]"]
  node_log_api["Food logging<br/>[route.ts]"]
  node_progress_api["Progress service<br/>[route.ts]"]
  node_ai_api["AI text service<br/>[route.ts]"]
  node_whoop_api["Whoop service<br/>[route.ts]"]
  node_whoop_auth["Whoop OAuth<br/>[whoop.ts]"]
  node_claude["Claude client<br/>[claude.ts]"]
end

subgraph group_data["Data and integrations"]
  node_menu_logic["Menu access<br/>[menu.ts]"]
  node_nutrition_logic["USDA lookup<br/>[usda.ts]"]
  node_database[("SQLite database<br/>[db.ts]")]
end

node_student(("Student"))

node_student -->|"uses"| node_app
node_app -->|"mounts"| node_client_store
node_app -->|"renders"| node_onboarding
node_app -->|"renders"| node_meal_screens
node_meal_screens -->|"reads state"| node_client_store
node_tracking_screens -->|"reads state"| node_client_store
node_onboarding -->|"updates state"| node_client_store
node_ai_ui -->|"reads state"| node_client_store
node_ai_ui -->|"requests text"| node_ai_api
node_meal_screens -->|"renders"| node_ui_primitives
node_ui_primitives -->|"renders"| node_icons
node_ui_primitives -->|"uses styles"| node_ui_styles
node_icons -->|"uses styles"| node_ui_styles
node_client_store -->|"uses model"| node_client_state
node_client_store -->|"loads menu"| node_client_api
node_client_store -->|"runs planner"| node_planner
node_client_api -->|"uses planner"| node_planner
node_client_api -->|"uses model"| node_client_state
node_planner -->|"normalizes context"| node_planner_context
node_planner -->|"uses menu data"| node_planner_data
node_planner -->|"maps items"| node_planner_items
node_planner -->|"applies rules"| node_planner_rules
node_planner -->|"calculates targets"| node_planner_targets
node_menu_api -->|"reads menu"| node_database
node_menu_api -->|"uses menu access"| node_menu_logic
node_plan_api -->|"reads data"| node_database
node_plan_api -->|"builds plan"| node_planner
node_profile_api -->|"reads and writes"| node_database
node_targets_api -->|"calculates targets"| node_targets_logic
node_nutrition_api -->|"reads items"| node_database
node_nutrition_api -->|"looks up nutrition"| node_nutrition_logic
node_nutrition_api -->|"uses menu access"| node_menu_logic
node_nutrition_api -->|"uses planner data"| node_planner_data
node_log_api -->|"reads and writes"| node_database
node_log_api -->|"calculates progress"| node_progress_logic
node_progress_api -->|"reads data"| node_database
node_progress_api -->|"calculates targets"| node_targets_logic
node_progress_api -->|"calculates progress"| node_progress_logic
node_ai_api -->|"generates text"| node_claude
node_whoop_api -->|"fetches recovery"| node_whoop_auth
node_whoop_api -->|"reads profile"| node_database
node_whoop_auth -->|"stores tokens"| node_database

click node_app "https://github.com/lissjackb/swat-hackro/blob/main/src/app/page.tsx"
click node_onboarding "https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/screens/Onboarding.tsx"
click node_meal_screens "https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/screens/Today.tsx"
click node_tracking_screens "https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/screens/Track.tsx"
click node_ui_primitives "https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/ui.tsx"
click node_icons "https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/Icon.tsx"
click node_ui_styles "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/hackro/sx.ts"
click node_ai_ui "https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/AiBits.tsx"
click node_client_store "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/hackro/store.tsx"
click node_client_state "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/hackro/state.ts"
click node_client_api "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/hackro/api.ts"
click node_planner "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/plan.ts"
click node_planner_context "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/context.ts"
click node_planner_data "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/data.ts"
click node_planner_items "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/items.ts"
click node_planner_rules "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/restrictions.ts"
click node_planner_targets "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/targets.ts"
click node_menu_api "https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/menu/route.ts"
click node_plan_api "https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/plan/route.ts"
click node_profile_api "https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/profile/route.ts"
click node_targets_api "https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/targets/route.ts"
click node_nutrition_api "https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/nutrition/route.ts"
click node_log_api "https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/log/route.ts"
click node_progress_api "https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/progress/route.ts"
click node_ai_api "https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/ai/route.ts"
click node_whoop_api "https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/whoop/route.ts"
click node_whoop_auth "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/whoop.ts"
click node_claude "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/claude.ts"
click node_targets_logic "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/targets.ts"
click node_progress_logic "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/progress.ts"
click node_menu_logic "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/menu.ts"
click node_nutrition_logic "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/usda.ts"
click node_database "https://github.com/lissjackb/swat-hackro/blob/main/src/lib/db.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_app,node_onboarding,node_meal_screens,node_tracking_screens,node_ui_primitives,node_icons,node_ui_styles,node_ai_ui,node_client_store,node_client_state,node_client_api toneBlue
class node_planner,node_planner_context,node_planner_data,node_planner_items,node_planner_rules,node_planner_targets,node_targets_logic,node_progress_logic toneAmber
class node_menu_api,node_plan_api,node_profile_api,node_targets_api,node_nutrition_api,node_log_api,node_progress_api,node_ai_api,node_whoop_api,node_whoop_auth,node_claude toneMint
class node_menu_logic,node_nutrition_logic,node_database toneRose
class node_student toneIndigo
```

## Components

### Student experience

- [Hackro app](https://github.com/lissjackb/swat-hackro/blob/main/src/app/page.tsx): `src/app/page.tsx`
- [Profile setup](https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/screens/Onboarding.tsx): `src/components/hackro/screens/Onboarding.tsx`
- [Meal screens](https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/screens/Today.tsx): `src/components/hackro/screens/Today.tsx`
- [Tracking screens](https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/screens/Track.tsx): `src/components/hackro/screens/Track.tsx`
- [UI primitives](https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/ui.tsx): `src/components/hackro/ui.tsx`
- [Icon system](https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/Icon.tsx): `src/components/hackro/Icon.tsx`
- [Style adapter](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/hackro/sx.ts): `src/lib/hackro/sx.ts`
- [AI explanations](https://github.com/lissjackb/swat-hackro/blob/main/src/components/hackro/AiBits.tsx): `src/components/hackro/AiBits.tsx`
- [Client state](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/hackro/store.tsx): `src/lib/hackro/store.tsx`
- [State model](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/hackro/state.ts): `src/lib/hackro/state.ts`
- [Client API](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/hackro/api.ts): `src/lib/hackro/api.ts`

### Meal planning

- [Planner engine](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/plan.ts): `src/lib/planner/plan.ts`
- [Planning context](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/context.ts): `src/lib/planner/context.ts`
- [Menu and meal data](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/data.ts): `src/lib/planner/data.ts`
- [Menu item mapping](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/items.ts): `src/lib/planner/items.ts`
- [Dietary restrictions](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/restrictions.ts): `src/lib/planner/restrictions.ts`
- [Planner targets](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/planner/targets.ts): `src/lib/planner/targets.ts`
- [Macro calculations](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/targets.ts): `src/lib/targets.ts`
- [Progress calculations](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/progress.ts): `src/lib/progress.ts`

### Application services

- [Menu service](https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/menu/route.ts): `src/app/api/menu/route.ts`
- [Plan service](https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/plan/route.ts): `src/app/api/plan/route.ts`
- [Profile service](https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/profile/route.ts): `src/app/api/profile/route.ts`
- [Target service](https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/targets/route.ts): `src/app/api/targets/route.ts`
- [Nutrition lookup](https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/nutrition/route.ts): `src/app/api/nutrition/route.ts`
- [Food logging](https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/log/route.ts): `src/app/api/log/route.ts`
- [Progress service](https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/progress/route.ts): `src/app/api/progress/route.ts`
- [AI text service](https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/ai/route.ts): `src/app/api/ai/route.ts`
- [Whoop service](https://github.com/lissjackb/swat-hackro/blob/main/src/app/api/whoop/route.ts): `src/app/api/whoop/route.ts`
- [Whoop OAuth](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/whoop.ts): `src/lib/whoop.ts`
- [Claude client](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/claude.ts): `src/lib/claude.ts`

### Data and integrations

- [Menu access](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/menu.ts): `src/lib/menu.ts`
- [USDA lookup](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/usda.ts): `src/lib/usda.ts`
- [SQLite database](https://github.com/lissjackb/swat-hackro/blob/main/src/lib/db.ts): `src/lib/db.ts`

### Other components

- **Student**

## Connections

- Student → Hackro app: uses (evidence: `README.md`)
- Hackro app → Client state: mounts (evidence: `src/app/page.tsx`)
- Hackro app → Profile setup: renders (evidence: `src/app/page.tsx`)
- Hackro app → Meal screens: renders (evidence: `src/app/page.tsx`)
- Meal screens → Client state: reads state (evidence: `src/components/hackro/screens/Today.tsx`)
- Tracking screens → Client state: reads state (evidence: `src/components/hackro/screens/Track.tsx`)
- Profile setup → Client state: updates state (evidence: `src/components/hackro/screens/Onboarding.tsx`)
- AI explanations → Client state: reads state (evidence: `src/components/hackro/AiBits.tsx`)
- AI explanations → AI text service: requests text (evidence: `src/components/hackro/AiBits.tsx`)
- Meal screens → UI primitives: renders (evidence: `src/components/hackro/screens/Today.tsx`)
- UI primitives → Icon system: renders (evidence: `src/components/hackro/ui.tsx`)
- UI primitives → Style adapter: uses styles (evidence: `src/components/hackro/ui.tsx`)
- Icon system → Style adapter: uses styles (evidence: `src/components/hackro/Icon.tsx`)
- Client state → State model: uses model (evidence: `src/lib/hackro/store.tsx`)
- Client state → Client API: loads menu (evidence: `src/lib/hackro/store.tsx`)
- Client state → Planner engine: runs planner (evidence: `src/lib/hackro/store.tsx`)
- Client API → Planner engine: uses planner (evidence: `src/lib/hackro/api.ts`)
- Client API → State model: uses model (evidence: `src/lib/hackro/api.ts`)
- Planner engine → Planning context: normalizes context (evidence: `src/lib/planner/index.ts`)
- Planner engine → Menu and meal data: uses menu data (evidence: `src/lib/planner/index.ts`)
- Planner engine → Menu item mapping: maps items (evidence: `src/lib/planner/index.ts`)
- Planner engine → Dietary restrictions: applies rules (evidence: `src/lib/planner/index.ts`)
- Planner engine → Planner targets: calculates targets (evidence: `src/lib/planner/index.ts`)
- Menu service → SQLite database: reads menu (evidence: `src/app/api/menu/route.ts`)
- Menu service → Menu access: uses menu access (evidence: `src/app/api/menu/route.ts`)
- Plan service → SQLite database: reads data (evidence: `src/app/api/plan/route.ts`)
- Plan service → Planner engine: builds plan (evidence: `src/app/api/plan/route.ts`)
- Profile service → SQLite database: reads and writes (evidence: `src/app/api/profile/route.ts`)
- Target service → Macro calculations: calculates targets (evidence: `src/app/api/targets/route.ts`)
- Nutrition lookup → SQLite database: reads items (evidence: `src/app/api/nutrition/route.ts`)
- Nutrition lookup → USDA lookup: looks up nutrition (evidence: `src/app/api/nutrition/route.ts`)
- Nutrition lookup → Menu access: uses menu access (evidence: `src/app/api/nutrition/route.ts`)
- Nutrition lookup → Menu and meal data: uses planner data (evidence: `src/app/api/nutrition/route.ts`)
- Food logging → SQLite database: reads and writes (evidence: `src/app/api/log/route.ts`)
- Food logging → Progress calculations: calculates progress (evidence: `src/app/api/log/route.ts`)
- Progress service → SQLite database: reads data (evidence: `src/app/api/progress/route.ts`)
- Progress service → Macro calculations: calculates targets (evidence: `src/app/api/progress/route.ts`)
- Progress service → Progress calculations: calculates progress (evidence: `src/app/api/progress/route.ts`)
- AI text service → Claude client: generates text (evidence: `src/app/api/ai/route.ts`)
- Whoop service → Whoop OAuth: fetches recovery (evidence: `src/app/api/whoop/route.ts`)
- Whoop service → SQLite database: reads profile (evidence: `src/app/api/whoop/route.ts`)
- Whoop OAuth → SQLite database: stores tokens (evidence: `src/lib/whoop.ts`)
