# jaharcla/studyai architecture

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

- Interactive diagram: https://gitdiagram.com/jaharcla/studyai
- Repository: https://github.com/jaharcla/studyai
- Video tour (about a minute): https://gitdiagram.com/jaharcla/studyai/video

## Overview

StudyAI is a local, single-user study workspace for AI tutoring, course materials, interactive scientific canvases, and structured learning activities. The visible workflow centers on a learner using the workspace to study a lesson, work with documents or canvas content, and practice activities; the README also identifies Ollama as required for AI tutoring. The graph preserves these product areas and key internal layers. Some server routes and orchestration were not sampled, so unsupported client-to-server connections are omitted.

Main entry points: [`src/App.tsx`](https://github.com/jaharcla/studyai/blob/main/src/App.tsx) (Workspace UI), [`src/canvas/model.ts`](https://github.com/jaharcla/studyai/blob/main/src/canvas/model.ts) (Canvas Model), [`src/canvas/CanvasStudio.tsx`](https://github.com/jaharcla/studyai/blob/main/src/canvas/CanvasStudio.tsx) (Canvas Studio), [`server/learning/activities/service.ts`](https://github.com/jaharcla/studyai/blob/main/server/learning/activities/service.ts) (Activity Service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workspace["Study Workspace"]
  node_app["Workspace UI<br/>[App.tsx]"]
  node_study["Study Panel<br/>[StudyPanel.tsx]"]
  node_api_client["API Client<br/>[api.ts]"]
end

subgraph group_canvas["Scientific Canvas"]
  node_canvas_ui["Canvas Studio<br/>[CanvasStudio.tsx]"]
  node_canvas_model["Canvas Model<br/>[model.ts]"]
  node_canvas_scene["Scene Geometry<br/>[scene.ts]"]
  node_canvas_math["Math Workspace<br/>[math-workspace.ts]"]
  node_canvas_actions["Canvas Actions<br/>[canvas-actions.ts]"]
end

subgraph group_documents["Course Documents"]
  node_document_ui["Document Library"]
  node_document_viewer["Document Viewer<br/>[DocumentViewer.tsx]"]
  node_document_api["Document API<br/>[api.ts]"]
end

subgraph group_learning["Learning Activities"]
  node_activity_library["Activity Library"]
  node_activity_task["Activity Task"]
  node_activity_contracts["Activity Contracts<br/>[contracts.ts]"]
end

subgraph group_server["Server Intelligence"]
  node_canvas_persistence[("Canvas Persistence<br/>[service.ts]")]
  node_canvas_analysis["Canvas Analysis<br/>[contract.ts]"]
  node_canvas_intelligence["Canvas Intelligence<br/>[service.ts]"]
  node_document_service["Document Service<br/>[service.ts]"]
  node_document_extract["Text Extraction<br/>[extract.ts]"]
  node_document_retrieval["Document Retrieval<br/>[retrieval-tool.ts]"]
  node_activity_service["Activity Service<br/>[service.ts]"]
  node_learning_service["Learning Service<br/>[service.ts]"]
end

node_learner(("Learner"))
node_ollama{{"Ollama"}}

node_learner -->|"uses"| node_app
node_app -->|"opens"| node_study
node_app -->|"opens"| node_activity_library
node_app -->|"renders"| node_canvas_ui
node_app -->|"imports"| node_document_api
node_activity_library -->|"uses"| node_api_client
node_activity_library -->|"uses"| node_activity_contracts
node_activity_task -->|"uses"| node_api_client
node_activity_task -->|"uses"| node_activity_contracts
node_canvas_ui -->|"resolves scenes"| node_canvas_scene
node_canvas_ui -->|"applies proposals"| node_canvas_actions
node_canvas_ui -->|"uses"| node_canvas_model
node_canvas_scene -->|"uses"| node_canvas_model
node_canvas_math -->|"uses"| node_canvas_model
node_canvas_persistence -->|"parses"| node_canvas_model
node_canvas_intelligence -->|"supplies analysis"| node_canvas_analysis
node_canvas_intelligence -.->|"requests inference"| node_ollama
node_document_ui -->|"fetches data"| node_document_api
node_document_viewer -->|"fetches data"| node_document_api
node_document_service -->|"extracts text"| node_document_extract
node_document_retrieval -->|"retrieves from"| node_document_service
node_activity_service -->|"validates"| node_activity_contracts
node_activity_service -->|"saves canvas"| node_canvas_persistence
node_activity_service -->|"uses"| node_learning_service
node_learning_service -->|"parses canvas"| node_canvas_model

click node_app "https://github.com/jaharcla/studyai/blob/main/src/App.tsx"
click node_study "https://github.com/jaharcla/studyai/blob/main/src/learning/StudyPanel.tsx"
click node_api_client "https://github.com/jaharcla/studyai/blob/main/src/api.ts"
click node_canvas_ui "https://github.com/jaharcla/studyai/blob/main/src/canvas/CanvasStudio.tsx"
click node_canvas_model "https://github.com/jaharcla/studyai/blob/main/src/canvas/model.ts"
click node_canvas_scene "https://github.com/jaharcla/studyai/blob/main/src/canvas/scene.ts"
click node_canvas_math "https://github.com/jaharcla/studyai/blob/main/src/canvas/math-workspace.ts"
click node_canvas_actions "https://github.com/jaharcla/studyai/blob/main/src/canvas/ai/canvas-actions.ts"
click node_canvas_persistence "https://github.com/jaharcla/studyai/blob/main/server/canvas-persistence/service.ts"
click node_canvas_analysis "https://github.com/jaharcla/studyai/blob/main/server/canvas-analysis/contract.ts"
click node_canvas_intelligence "https://github.com/jaharcla/studyai/blob/main/server/canvas-intelligence/service.ts"
click node_document_ui "https://github.com/jaharcla/studyai/blob/main/src/components/document-intelligence/DocumentLibrary.tsx"
click node_document_viewer "https://github.com/jaharcla/studyai/blob/main/src/components/document-intelligence/DocumentViewer.tsx"
click node_document_api "https://github.com/jaharcla/studyai/blob/main/src/components/document-intelligence/api.ts"
click node_document_service "https://github.com/jaharcla/studyai/blob/main/server/document-intelligence/service.ts"
click node_document_extract "https://github.com/jaharcla/studyai/blob/main/server/document-intelligence/extract.ts"
click node_document_retrieval "https://github.com/jaharcla/studyai/blob/main/server/document-intelligence/retrieval-tool.ts"
click node_activity_library "https://github.com/jaharcla/studyai/blob/main/src/learning/ActivityLibrary.tsx"
click node_activity_task "https://github.com/jaharcla/studyai/blob/main/src/learning/ActivityTaskPanel.tsx"
click node_activity_contracts "https://github.com/jaharcla/studyai/blob/main/src/learning/activities/contracts.ts"
click node_activity_service "https://github.com/jaharcla/studyai/blob/main/server/learning/activities/service.ts"
click node_learning_service "https://github.com/jaharcla/studyai/blob/main/server/learning/service.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_study,node_api_client toneBlue
class node_canvas_ui,node_canvas_model,node_canvas_scene,node_canvas_math,node_canvas_actions toneAmber
class node_document_ui,node_document_viewer,node_document_api toneMint
class node_activity_library,node_activity_task,node_activity_contracts toneRose
class node_canvas_persistence,node_canvas_analysis,node_canvas_intelligence,node_document_service,node_document_extract,node_document_retrieval,node_activity_service,node_learning_service,node_learner,node_ollama toneIndigo
```

## Components

### Study Workspace

- [Workspace UI](https://github.com/jaharcla/studyai/blob/main/src/App.tsx): `src/App.tsx`
- [Study Panel](https://github.com/jaharcla/studyai/blob/main/src/learning/StudyPanel.tsx): `src/learning/StudyPanel.tsx`
- [API Client](https://github.com/jaharcla/studyai/blob/main/src/api.ts): `src/api.ts`

### Scientific Canvas

- [Canvas Studio](https://github.com/jaharcla/studyai/blob/main/src/canvas/CanvasStudio.tsx): `src/canvas/CanvasStudio.tsx`
- [Canvas Model](https://github.com/jaharcla/studyai/blob/main/src/canvas/model.ts): `src/canvas/model.ts`
- [Scene Geometry](https://github.com/jaharcla/studyai/blob/main/src/canvas/scene.ts): `src/canvas/scene.ts`
- [Math Workspace](https://github.com/jaharcla/studyai/blob/main/src/canvas/math-workspace.ts): `src/canvas/math-workspace.ts`
- [Canvas Actions](https://github.com/jaharcla/studyai/blob/main/src/canvas/ai/canvas-actions.ts): `src/canvas/ai/canvas-actions.ts`

### Course Documents

- [Document Library](https://github.com/jaharcla/studyai/blob/main/src/components/document-intelligence/DocumentLibrary.tsx): `src/components/document-intelligence/DocumentLibrary.tsx`
- [Document Viewer](https://github.com/jaharcla/studyai/blob/main/src/components/document-intelligence/DocumentViewer.tsx): `src/components/document-intelligence/DocumentViewer.tsx`
- [Document API](https://github.com/jaharcla/studyai/blob/main/src/components/document-intelligence/api.ts): `src/components/document-intelligence/api.ts`

### Learning Activities

- [Activity Library](https://github.com/jaharcla/studyai/blob/main/src/learning/ActivityLibrary.tsx): `src/learning/ActivityLibrary.tsx`
- [Activity Task](https://github.com/jaharcla/studyai/blob/main/src/learning/ActivityTaskPanel.tsx): `src/learning/ActivityTaskPanel.tsx`
- [Activity Contracts](https://github.com/jaharcla/studyai/blob/main/src/learning/activities/contracts.ts): `src/learning/activities/contracts.ts`

### Server Intelligence

- [Canvas Persistence](https://github.com/jaharcla/studyai/blob/main/server/canvas-persistence/service.ts): `server/canvas-persistence/service.ts`
- [Canvas Analysis](https://github.com/jaharcla/studyai/blob/main/server/canvas-analysis/contract.ts): `server/canvas-analysis/contract.ts`
- [Canvas Intelligence](https://github.com/jaharcla/studyai/blob/main/server/canvas-intelligence/service.ts): `server/canvas-intelligence/service.ts`
- [Document Service](https://github.com/jaharcla/studyai/blob/main/server/document-intelligence/service.ts): `server/document-intelligence/service.ts`
- [Text Extraction](https://github.com/jaharcla/studyai/blob/main/server/document-intelligence/extract.ts): `server/document-intelligence/extract.ts`
- [Document Retrieval](https://github.com/jaharcla/studyai/blob/main/server/document-intelligence/retrieval-tool.ts): `server/document-intelligence/retrieval-tool.ts`
- [Activity Service](https://github.com/jaharcla/studyai/blob/main/server/learning/activities/service.ts): `server/learning/activities/service.ts`
- [Learning Service](https://github.com/jaharcla/studyai/blob/main/server/learning/service.ts): `server/learning/service.ts`

### Other components

- **Learner**
- **Ollama**

## Connections

- Learner → Workspace UI: uses
- Workspace UI → Study Panel: opens (evidence: `src/App.tsx`)
- Workspace UI → Activity Library: opens (evidence: `src/App.tsx`)
- Workspace UI → Canvas Studio: renders (evidence: `src/App.tsx`)
- Workspace UI → Document API: imports (evidence: `src/App.tsx`)
- Activity Library → API Client: uses (evidence: `src/learning/ActivityLibrary.tsx`)
- Activity Library → Activity Contracts: uses (evidence: `src/learning/ActivityLibrary.tsx`)
- Activity Task → API Client: uses (evidence: `src/learning/ActivityTaskPanel.tsx`)
- Activity Task → Activity Contracts: uses (evidence: `src/learning/ActivityTaskPanel.tsx`)
- Canvas Studio → Scene Geometry: resolves scenes (evidence: `src/canvas/CanvasStudio.tsx`)
- Canvas Studio → Canvas Actions: applies proposals (evidence: `src/canvas/CanvasStudio.tsx`)
- Canvas Studio → Canvas Model: uses (evidence: `src/canvas/CanvasStudio.tsx`)
- Scene Geometry → Canvas Model: uses (evidence: `src/canvas/scene.ts`)
- Math Workspace → Canvas Model: uses (evidence: `src/canvas/math-workspace.ts`)
- Canvas Persistence → Canvas Model: parses (evidence: `server/canvas-persistence/service.ts`)
- Canvas Intelligence → Canvas Analysis: supplies analysis (evidence: `server/canvas-analysis/producer.ts`)
- Canvas Intelligence → Ollama: requests inference
- Document Library → Document API: fetches data (evidence: `src/components/document-intelligence/DocumentLibrary.tsx`)
- Document Viewer → Document API: fetches data (evidence: `src/components/document-intelligence/DocumentViewer.tsx`)
- Document Service → Text Extraction: extracts text (evidence: `server/document-intelligence/service.ts`)
- Document Retrieval → Document Service: retrieves from (evidence: `server/document-intelligence/retrieval-tool.ts`)
- Activity Service → Activity Contracts: validates (evidence: `server/learning/activities/service.ts`)
- Activity Service → Canvas Persistence: saves canvas (evidence: `server/learning/activities/service.ts`)
- Activity Service → Learning Service: uses (evidence: `server/learning/activities/service.ts`)
- Learning Service → Canvas Model: parses canvas (evidence: `server/learning/service.ts`)
