# mrdolph/af2s architecture

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

- Interactive diagram: https://gitdiagram.com/mrdolph/af2s
- Repository: https://github.com/mrdolph/af2s

## Overview

AF2S is an educational physics and mathematics site centered on interactive simulations: learners browse a catalog, open a topic, adjust parameters, and explore animated visualizations and readouts. Topic pages coordinate canvas components; sampled code shows simulation components calling physics helpers and reporting live values back to pages. The product also includes embeddable simulations, a passcode-gated Minitab area with visit analytics, and an AI prompt endpoint. The README is only the Next.js starter template, so broader capabilities are evidenced by the source tree and sampled catalog/page code; unsampled wiring is left out.

Main entry points: [`src/app/simulations/oscillations/page.tsx`](https://github.com/mrdolph/af2s/blob/main/src/app/simulations/oscillations/page.tsx) (Oscillations page), [`src/components/simulation`](https://github.com/mrdolph/af2s/tree/main/src/components/simulation) (Simulation canvases), [`src/app/minitab/page.tsx`](https://github.com/mrdolph/af2s/blob/main/src/app/minitab/page.tsx) (Minitab pages), [`src/lib/analytics/redis.ts`](https://github.com/mrdolph/af2s/blob/main/src/lib/analytics/redis.ts) (Analytics storage)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_learning["Learning experience"]
  node_catalog["Simulation catalog<br/>[page.tsx]"]
  node_topic["Oscillations page<br/>[page.tsx]"]
  node_mechanics["Motion topics<br/>[page.tsx]"]
  node_math["Mathematics pages<br/>[page.tsx]"]
  node_embed["Embed pages<br/>[layout.tsx]"]
end

subgraph group_simulation["Simulation runtime"]
  node_canvas["Simulation canvases"]
  node_graphs["Simulation graphs"]
  node_controls["Simulation controls"]
  node_physics["Physics models"]
  node_responsive["Canvas sizing"]
end

subgraph group_minitab["Minitab access and analytics"]
  node_minitab["Minitab pages<br/>[page.tsx]"]
  node_minitab_auth["Minitab authentication<br/>[route.ts]"]
  node_admin_auth["Admin authentication<br/>[route.ts]"]
  node_track["Visit tracking<br/>[route.ts]"]
  node_analytics_api["Analytics summary<br/>[route.ts]"]
end

subgraph group_services["API and integrations"]
  node_redis[("Analytics storage<br/>[redis.ts]")]
  node_ai_prompt["AI prompt bar<br/>[PromptBar.tsx]"]
  node_ai_api["AI prompt API<br/>[route.ts]"]
  node_prompt_parser["Prompt parser<br/>[parse-prompt.ts]"]
end

node_learner(("Learner"))

node_learner -->|"browse"| node_catalog
node_catalog -->|"opens topic"| node_topic
node_learner -->|"adjusts parameters"| node_topic
node_topic -->|"renders topic"| node_canvas
node_mechanics -->|"selects canvas"| node_canvas
node_topic -->|"renders graph"| node_graphs
node_topic -->|"uses controls"| node_controls
node_canvas -->|"calculates models"| node_physics
node_canvas -->|"reports ticks"| node_topic
node_topic -->|"sizes canvas"| node_responsive
node_math -->|"renders visuals"| node_canvas
node_embed -->|"renders visuals"| node_canvas
node_learner -->|"opens tools"| node_minitab
node_minitab -->|"submits login"| node_minitab_auth
node_minitab_auth -->|"records login"| node_redis
node_minitab -->|"tracks visit"| node_track
node_track -->|"records visit"| node_redis
node_minitab -->|"requests summary"| node_analytics_api
node_analytics_api -->|"reads summary"| node_redis
node_minitab -->|"submits admin login"| node_admin_auth
node_learner -->|"enters prompt"| node_ai_prompt
node_ai_prompt -->|"submits prompt"| node_ai_api
node_ai_api -->|"parses prompt"| node_prompt_parser

click node_catalog "https://github.com/mrdolph/af2s/blob/main/src/app/simulations/page.tsx"
click node_topic "https://github.com/mrdolph/af2s/blob/main/src/app/simulations/oscillations/page.tsx"
click node_mechanics "https://github.com/mrdolph/af2s/blob/main/src/app/simulations/consequences-of-motion/page.tsx"
click node_math "https://github.com/mrdolph/af2s/blob/main/src/app/mathematics/page.tsx"
click node_embed "https://github.com/mrdolph/af2s/blob/main/src/app/embed/layout.tsx"
click node_canvas "https://github.com/mrdolph/af2s/tree/main/src/components/simulation"
click node_graphs "https://github.com/mrdolph/af2s/tree/main/src/components/simulation"
click node_controls "https://github.com/mrdolph/af2s/blob/main/src/components/simulation/SimulationControls.tsx"
click node_physics "https://github.com/mrdolph/af2s/tree/main/src/lib/physics"
click node_responsive "https://github.com/mrdolph/af2s/blob/main/src/hooks/useResponsiveCanvasSize.ts"
click node_minitab "https://github.com/mrdolph/af2s/blob/main/src/app/minitab/page.tsx"
click node_minitab_auth "https://github.com/mrdolph/af2s/blob/main/src/app/api/minitab-auth/route.ts"
click node_admin_auth "https://github.com/mrdolph/af2s/blob/main/src/app/api/minitab-admin-auth/route.ts"
click node_track "https://github.com/mrdolph/af2s/blob/main/src/app/api/minitab-track/route.ts"
click node_analytics_api "https://github.com/mrdolph/af2s/blob/main/src/app/api/minitab-analytics/route.ts"
click node_redis "https://github.com/mrdolph/af2s/blob/main/src/lib/analytics/redis.ts"
click node_ai_prompt "https://github.com/mrdolph/af2s/blob/main/src/components/ai/PromptBar.tsx"
click node_ai_api "https://github.com/mrdolph/af2s/blob/main/src/app/api/ai/route.ts"
click node_prompt_parser "https://github.com/mrdolph/af2s/blob/main/src/lib/ai/parse-prompt.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_catalog,node_topic,node_mechanics,node_math,node_embed toneBlue
class node_canvas,node_graphs,node_controls,node_physics,node_responsive toneAmber
class node_minitab,node_minitab_auth,node_admin_auth,node_track,node_analytics_api toneMint
class node_redis,node_ai_prompt,node_ai_api,node_prompt_parser toneRose
class node_learner toneIndigo
```

## Components

### Learning experience

- [Simulation catalog](https://github.com/mrdolph/af2s/blob/main/src/app/simulations/page.tsx): `src/app/simulations/page.tsx`
- [Oscillations page](https://github.com/mrdolph/af2s/blob/main/src/app/simulations/oscillations/page.tsx): `src/app/simulations/oscillations/page.tsx`
- [Motion topics](https://github.com/mrdolph/af2s/blob/main/src/app/simulations/consequences-of-motion/page.tsx): `src/app/simulations/consequences-of-motion/page.tsx`
- [Mathematics pages](https://github.com/mrdolph/af2s/blob/main/src/app/mathematics/page.tsx): `src/app/mathematics/page.tsx`
- [Embed pages](https://github.com/mrdolph/af2s/blob/main/src/app/embed/layout.tsx): `src/app/embed/layout.tsx`

### Simulation runtime

- [Simulation canvases](https://github.com/mrdolph/af2s/tree/main/src/components/simulation): `src/components/simulation`
- [Simulation graphs](https://github.com/mrdolph/af2s/tree/main/src/components/simulation): `src/components/simulation`
- [Simulation controls](https://github.com/mrdolph/af2s/blob/main/src/components/simulation/SimulationControls.tsx): `src/components/simulation/SimulationControls.tsx`
- [Physics models](https://github.com/mrdolph/af2s/tree/main/src/lib/physics): `src/lib/physics`
- [Canvas sizing](https://github.com/mrdolph/af2s/blob/main/src/hooks/useResponsiveCanvasSize.ts): `src/hooks/useResponsiveCanvasSize.ts`

### Minitab access and analytics

- [Minitab pages](https://github.com/mrdolph/af2s/blob/main/src/app/minitab/page.tsx): `src/app/minitab/page.tsx`
- [Minitab authentication](https://github.com/mrdolph/af2s/blob/main/src/app/api/minitab-auth/route.ts): `src/app/api/minitab-auth/route.ts`
- [Admin authentication](https://github.com/mrdolph/af2s/blob/main/src/app/api/minitab-admin-auth/route.ts): `src/app/api/minitab-admin-auth/route.ts`
- [Visit tracking](https://github.com/mrdolph/af2s/blob/main/src/app/api/minitab-track/route.ts): `src/app/api/minitab-track/route.ts`
- [Analytics summary](https://github.com/mrdolph/af2s/blob/main/src/app/api/minitab-analytics/route.ts): `src/app/api/minitab-analytics/route.ts`

### API and integrations

- [Analytics storage](https://github.com/mrdolph/af2s/blob/main/src/lib/analytics/redis.ts): `src/lib/analytics/redis.ts`
- [AI prompt bar](https://github.com/mrdolph/af2s/blob/main/src/components/ai/PromptBar.tsx): `src/components/ai/PromptBar.tsx`
- [AI prompt API](https://github.com/mrdolph/af2s/blob/main/src/app/api/ai/route.ts): `src/app/api/ai/route.ts`
- [Prompt parser](https://github.com/mrdolph/af2s/blob/main/src/lib/ai/parse-prompt.ts): `src/lib/ai/parse-prompt.ts`

### Other components

- **Learner**

## Connections

- Learner → Simulation catalog: browse
- Simulation catalog → Oscillations page: opens topic
- Learner → Oscillations page: adjusts parameters
- Oscillations page → Simulation canvases: renders topic
- Motion topics → Simulation canvases: selects canvas
- Oscillations page → Simulation graphs: renders graph
- Oscillations page → Simulation controls: uses controls
- Simulation canvases → Physics models: calculates models
- Simulation canvases → Oscillations page: reports ticks
- Oscillations page → Canvas sizing: sizes canvas
- Mathematics pages → Simulation canvases: renders visuals
- Embed pages → Simulation canvases: renders visuals
- Learner → Minitab pages: opens tools
- Minitab pages → Minitab authentication: submits login
- Minitab authentication → Analytics storage: records login
- Minitab pages → Visit tracking: tracks visit
- Visit tracking → Analytics storage: records visit
- Minitab pages → Analytics summary: requests summary
- Analytics summary → Analytics storage: reads summary
- Minitab pages → Admin authentication: submits admin login
- Learner → AI prompt bar: enters prompt
- AI prompt bar → AI prompt API: submits prompt
- AI prompt API → Prompt parser: parses prompt
