# ahljvanderplas/justfit architecture

> Architecture diagram of the GitHub repository ahljvanderplas/justfit, 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/ahljvanderplas/justfit
- Repository: https://github.com/ahljvanderplas/justfit

## Overview

JustFit is a privacy-first fitness PWA centered on an adaptive daily workout: users check in or rely on profile settings, receive an exercise plan, complete and adjust a session, then review progress. The client shell and API wrapper connect that experience to Pages Functions and D1. The README also documents coaching, sport-specific modes, trainer/gym features, legal and privacy flows, and integrations. Some subsystem links reflect documented capabilities and tree paths; unsampled implementation details are not inferred.

Main entry points: [`packages/client-app/src/apiClient.js`](https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/apiClient.js) (API client), [`packages/client-app/src/App.jsx`](https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/App.jsx) (App shell), [`functions/api/plan.js`](https://github.com/ahljvanderplas/justfit/blob/main/functions/api/plan.js) (Plan endpoint), [`workers/justfit-ops/src/index.js`](https://github.com/ahljvanderplas/justfit/blob/main/workers/justfit-ops/src/index.js) (Scheduled operations)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Client PWA"]
  node_app["App shell<br/>[App.jsx]"]
  node_api_client["API client<br/>[apiClient.js]"]
  node_workout["Workout coaching<br/>[WorkoutView.jsx]"]
  node_progress_views["Progress views<br/>[HistoryView.jsx]"]
  node_settings["Settings and coaches<br/>[SettingsView.jsx]"]
  node_message_policy["Safety messaging<br/>[messagePolicy.js]"]
end

subgraph group_fitness["Fitness planning"]
  node_plan_api["Plan endpoint<br/>[plan.js]"]
  node_rule_engine["Planner rules<br/>[rules.ts]"]
  node_sport_modes["Sport adaptations"]
end

subgraph group_services["API services"]
  node_checkin_api["Daily check-in<br/>[checkin.js]"]
  node_profile_api["Profile and preferences<br/>[profile.js]"]
  node_execution_api["Workout execution<br/>[execution.js]"]
  node_progression_api["Progression and score<br/>[progression.js]"]
  node_auth_api["Authentication<br/>[auth.js]"]
  node_client_services["Trainer and gym services"]
  node_legal_privacy["Consent and privacy"]
  node_exercises_api["Exercise library<br/>[exercises.js]"]
end

subgraph group_operations["Integrations and operations"]
  node_strava_api["Strava connection<br/>[strava-auth.js]"]
  node_payments["Mollie billing<br/>[mollie.js]"]
  node_database[("D1 database")]
  node_ops_worker["Scheduled operations<br/>[index.js]"]
  node_push_api["Push dispatch<br/>[push-dispatch.js]"]
end

node_user(("Member"))
node_strava["Strava"]
node_backup_store[("Backup object store")]

node_user -->|"uses"| node_app
node_app -->|"requests data"| node_api_client
node_app -->|"opens session"| node_workout
node_app -->|"shows progress"| node_progress_views
node_app -->|"configures"| node_settings
node_app -->|"interprets rule codes"| node_message_policy
node_api_client -->|"generates plan"| node_plan_api
node_api_client -->|"saves check-in"| node_checkin_api
node_api_client -->|"loads preferences"| node_profile_api
node_api_client -->|"syncs sessions"| node_execution_api
node_api_client -->|"loads progress"| node_progression_api
node_api_client -->|"authenticates"| node_auth_api
node_api_client -->|"requests coaching"| node_client_services
node_api_client -->|"requests privacy data"| node_legal_privacy
node_api_client -->|"loads exercises"| node_exercises_api
node_workout -->|"records session"| node_api_client
node_plan_api -->|"uses planner rules"| node_rule_engine
node_plan_api -->|"reads and writes"| node_database
node_plan_api -->|"applies sport context"| node_sport_modes
node_checkin_api -->|"reads and writes"| node_database
node_profile_api -->|"reads and writes"| node_database
node_execution_api -->|"reads and writes"| node_database
node_progression_api -->|"reads and writes"| node_database
node_auth_api -->|"reads and writes"| node_database
node_auth_api -->|"cancels subscription"| node_payments
node_client_services -->|"reads and writes"| node_database
node_legal_privacy -->|"reads and writes"| node_database
node_exercises_api -->|"queries exercises"| node_database
node_strava_api -->|"stores connection"| node_database
node_strava_api -.->|"exchanges tokens"| node_strava
node_ops_worker -->|"exports data"| node_database
node_ops_worker -->|"stores backups"| node_backup_store
node_ops_worker -->|"dispatches daily"| node_push_api

click node_app "https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/App.jsx"
click node_api_client "https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/apiClient.js"
click node_workout "https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/WorkoutView.jsx"
click node_progress_views "https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/HistoryView.jsx"
click node_settings "https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/SettingsView.jsx"
click node_message_policy "https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/messagePolicy.js"
click node_plan_api "https://github.com/ahljvanderplas/justfit/blob/main/functions/api/plan.js"
click node_rule_engine "https://github.com/ahljvanderplas/justfit/blob/main/packages/shared/src/rule-engine/rules.ts"
click node_sport_modes "https://github.com/ahljvanderplas/justfit/tree/main/functions/api/_shared"
click node_checkin_api "https://github.com/ahljvanderplas/justfit/blob/main/functions/api/checkin.js"
click node_profile_api "https://github.com/ahljvanderplas/justfit/blob/main/functions/api/profile.js"
click node_execution_api "https://github.com/ahljvanderplas/justfit/blob/main/functions/api/execution.js"
click node_progression_api "https://github.com/ahljvanderplas/justfit/blob/main/functions/api/progression.js"
click node_auth_api "https://github.com/ahljvanderplas/justfit/blob/main/functions/api/auth.js"
click node_client_services "https://github.com/ahljvanderplas/justfit/tree/main/functions/api/client"
click node_legal_privacy "https://github.com/ahljvanderplas/justfit/tree/main/functions/api/client/gdpr"
click node_exercises_api "https://github.com/ahljvanderplas/justfit/blob/main/functions/api/exercises.js"
click node_strava_api "https://github.com/ahljvanderplas/justfit/blob/main/functions/api/strava-auth.js"
click node_payments "https://github.com/ahljvanderplas/justfit/blob/main/functions/lib/mollie.js"
click node_ops_worker "https://github.com/ahljvanderplas/justfit/blob/main/workers/justfit-ops/src/index.js"
click node_push_api "https://github.com/ahljvanderplas/justfit/blob/main/functions/api/push-dispatch.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_api_client,node_workout,node_progress_views,node_settings,node_message_policy toneBlue
class node_plan_api,node_rule_engine,node_sport_modes,node_backup_store toneAmber
class node_checkin_api,node_profile_api,node_execution_api,node_progression_api,node_auth_api,node_client_services,node_legal_privacy,node_exercises_api toneMint
class node_strava_api,node_payments,node_database,node_ops_worker,node_push_api toneRose
class node_user,node_strava toneIndigo
```

## Components

### Client PWA

- [App shell](https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/App.jsx): `packages/client-app/src/App.jsx`
- [API client](https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/apiClient.js): `packages/client-app/src/apiClient.js`
- [Workout coaching](https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/WorkoutView.jsx): `packages/client-app/src/WorkoutView.jsx`
- [Progress views](https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/HistoryView.jsx): `packages/client-app/src/HistoryView.jsx`
- [Settings and coaches](https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/SettingsView.jsx): `packages/client-app/src/SettingsView.jsx`
- [Safety messaging](https://github.com/ahljvanderplas/justfit/blob/main/packages/client-app/src/messagePolicy.js): `packages/client-app/src/messagePolicy.js`

### Fitness planning

- [Plan endpoint](https://github.com/ahljvanderplas/justfit/blob/main/functions/api/plan.js): `functions/api/plan.js`
- [Planner rules](https://github.com/ahljvanderplas/justfit/blob/main/packages/shared/src/rule-engine/rules.ts): `packages/shared/src/rule-engine/rules.ts`
- [Sport adaptations](https://github.com/ahljvanderplas/justfit/tree/main/functions/api/_shared): `functions/api/_shared`

### API services

- [Daily check-in](https://github.com/ahljvanderplas/justfit/blob/main/functions/api/checkin.js): `functions/api/checkin.js`
- [Profile and preferences](https://github.com/ahljvanderplas/justfit/blob/main/functions/api/profile.js): `functions/api/profile.js`
- [Workout execution](https://github.com/ahljvanderplas/justfit/blob/main/functions/api/execution.js): `functions/api/execution.js`
- [Progression and score](https://github.com/ahljvanderplas/justfit/blob/main/functions/api/progression.js): `functions/api/progression.js`
- [Authentication](https://github.com/ahljvanderplas/justfit/blob/main/functions/api/auth.js): `functions/api/auth.js`
- [Trainer and gym services](https://github.com/ahljvanderplas/justfit/tree/main/functions/api/client): `functions/api/client`
- [Consent and privacy](https://github.com/ahljvanderplas/justfit/tree/main/functions/api/client/gdpr): `functions/api/client/gdpr`
- [Exercise library](https://github.com/ahljvanderplas/justfit/blob/main/functions/api/exercises.js): `functions/api/exercises.js`

### Integrations and operations

- [Strava connection](https://github.com/ahljvanderplas/justfit/blob/main/functions/api/strava-auth.js): `functions/api/strava-auth.js`
- [Mollie billing](https://github.com/ahljvanderplas/justfit/blob/main/functions/lib/mollie.js): `functions/lib/mollie.js`
- **D1 database**
- [Scheduled operations](https://github.com/ahljvanderplas/justfit/blob/main/workers/justfit-ops/src/index.js): `workers/justfit-ops/src/index.js`
- [Push dispatch](https://github.com/ahljvanderplas/justfit/blob/main/functions/api/push-dispatch.js): `functions/api/push-dispatch.js`

### Other components

- **Member**
- **Strava**
- **Backup object store**

## Connections

- Member → App shell: uses
- App shell → API client: requests data
- App shell → Workout coaching: opens session
- App shell → Progress views: shows progress
- App shell → Settings and coaches: configures
- App shell → Safety messaging: interprets rule codes
- API client → Plan endpoint: generates plan
- API client → Daily check-in: saves check-in
- API client → Profile and preferences: loads preferences
- API client → Workout execution: syncs sessions
- API client → Progression and score: loads progress
- API client → Authentication: authenticates
- API client → Trainer and gym services: requests coaching
- API client → Consent and privacy: requests privacy data
- API client → Exercise library: loads exercises
- Workout coaching → API client: records session
- Plan endpoint → Planner rules: uses planner rules
- Plan endpoint → D1 database: reads and writes
- Plan endpoint → Sport adaptations: applies sport context
- Daily check-in → D1 database: reads and writes
- Profile and preferences → D1 database: reads and writes
- Workout execution → D1 database: reads and writes
- Progression and score → D1 database: reads and writes
- Authentication → D1 database: reads and writes
- Authentication → Mollie billing: cancels subscription
- Trainer and gym services → D1 database: reads and writes
- Consent and privacy → D1 database: reads and writes
- Exercise library → D1 database: queries exercises
- Strava connection → D1 database: stores connection
- Strava connection → Strava: exchanges tokens
- Scheduled operations → D1 database: exports data
- Scheduled operations → Backup object store: stores backups
- Scheduled operations → Push dispatch: dispatches daily
