# enkheeboldu05/quiz architecture

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

- Interactive diagram: https://gitdiagram.com/enkheeboldu05/quiz
- Repository: https://github.com/enkheeboldu05/quiz

## Overview

Lecture Quiz is a server-rendered study application: students authenticate, upload lecture PDFs, configure question generation, take saved quizzes, and review scored attempts. The main request handler coordinates PDF extraction, duplicate-material lookup, model generation, persistence, and quiz submission; authentication routes separately manage accounts and sessions. SQLite also supports private dashboards, collections, and legacy quiz claiming. The README describes some older limitations that conflict with the sampled implementation; this map follows the source excerpts and uses README statements only where they agree. Unsampled page and provider details are shown only at documented subsystem level.

Main entry points: [`src/app.js`](https://github.com/enkheeboldu05/quiz/blob/main/src/app.js) (Request workflow), [`src/providers/huggingface-provider.js`](https://github.com/enkheeboldu05/quiz/blob/main/src/providers/huggingface-provider.js) (Hugging Face provider), [`src/providers/index.js`](https://github.com/enkheeboldu05/quiz/blob/main/src/providers/index.js) (Provider selection), [`src/providers/ollama-provider.js`](https://github.com/enkheeboldu05/quiz/blob/main/src/providers/ollama-provider.js) (Ollama provider)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web workflow"]
  node_webapp["Request workflow<br/>[app.js]"]
  node_pages["Quiz pages"]
  node_browser["Browser assets<br/>[app.js]"]
  node_pdf["PDF extraction<br/>[pdf.js]"]
  node_logger["Event logger<br/>[logger.js]"]
  node_config["Runtime configuration<br/>[config.js]"]
end

subgraph group_identity["Identity"]
  node_authroutes["Account routes<br/>[auth.js]"]
  node_authguard["Session guards<br/>[auth.js]"]
end

subgraph group_generation["Question generation"]
  node_settings["Generation settings"]
  node_factory["Provider selection<br/>[index.js]"]
  node_contract["LLM contract<br/>[llm-provider.js]"]
  node_huggingface["Hugging Face provider"]
  node_ollama["Ollama provider<br/>[ollama-provider.js]"]
  node_prompts["Prompt templates"]
  node_schema["Question schema<br/>[question-schema.js]"]
  node_parser["Question validation<br/>[parse-questions.js]"]
end

subgraph group_study["Study library"]
  node_database[("Study data store<br/>[db.js]")]
  node_sqlite[("SQLite")]
end

node_student(("Student"))
node_hostedmodel{{"Hugging Face API"}}
node_localmodel{{"Ollama service"}}

node_student -->|"uses"| node_webapp
node_webapp -->|"renders"| node_pages
node_webapp -->|"serves assets"| node_browser
node_webapp -->|"mounts routes"| node_authroutes
node_webapp -->|"guards requests"| node_authguard
node_authroutes -->|"redirects sessions"| node_authguard
node_authroutes -->|"reads and writes"| node_database
node_webapp -->|"reads and writes"| node_database
node_database -->|"persists records"| node_sqlite
node_webapp -->|"extracts text"| node_pdf
node_webapp -->|"normalizes choices"| node_settings
node_webapp -->|"creates provider"| node_factory
node_factory -->|"selects from"| node_config
node_factory -->|"selects"| node_huggingface
node_factory -->|"selects"| node_ollama
node_huggingface -->|"extends"| node_contract
node_ollama -->|"extends"| node_contract
node_huggingface -->|"normalizes settings"| node_settings
node_huggingface -->|"builds prompt"| node_prompts
node_huggingface -->|"formats response"| node_schema
node_huggingface -->|"validates output"| node_parser
node_ollama -->|"validates output"| node_parser
node_parser -->|"checks distribution"| node_settings
node_huggingface -->|"requests completions"| node_hostedmodel
node_ollama -->|"requests generation"| node_localmodel
node_webapp -->|"records events"| node_logger
node_webapp -->|"uses settings"| node_config

click node_webapp "https://github.com/enkheeboldu05/quiz/blob/main/src/app.js"
click node_pages "https://github.com/enkheeboldu05/quiz/tree/main/views"
click node_browser "https://github.com/enkheeboldu05/quiz/blob/main/public/app.js"
click node_authroutes "https://github.com/enkheeboldu05/quiz/blob/main/src/routes/auth.js"
click node_authguard "https://github.com/enkheeboldu05/quiz/blob/main/src/middleware/auth.js"
click node_database "https://github.com/enkheeboldu05/quiz/blob/main/src/db.js"
click node_pdf "https://github.com/enkheeboldu05/quiz/blob/main/src/services/pdf.js"
click node_settings "https://github.com/enkheeboldu05/quiz/blob/main/src/providers/generation-settings.js"
click node_factory "https://github.com/enkheeboldu05/quiz/blob/main/src/providers/index.js"
click node_contract "https://github.com/enkheeboldu05/quiz/blob/main/src/providers/llm-provider.js"
click node_huggingface "https://github.com/enkheeboldu05/quiz/blob/main/src/providers/huggingface-provider.js"
click node_ollama "https://github.com/enkheeboldu05/quiz/blob/main/src/providers/ollama-provider.js"
click node_prompts "https://github.com/enkheeboldu05/quiz/blob/main/src/providers/prompt-templates.js"
click node_schema "https://github.com/enkheeboldu05/quiz/blob/main/src/providers/question-schema.js"
click node_parser "https://github.com/enkheeboldu05/quiz/blob/main/src/providers/parse-questions.js"
click node_logger "https://github.com/enkheeboldu05/quiz/blob/main/src/services/logger.js"
click node_config "https://github.com/enkheeboldu05/quiz/blob/main/src/config.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_webapp,node_pages,node_browser,node_pdf,node_logger,node_config toneBlue
class node_authroutes,node_authguard toneAmber
class node_settings,node_factory,node_contract,node_huggingface,node_ollama,node_prompts,node_schema,node_parser,node_hostedmodel toneMint
class node_database,node_sqlite toneRose
class node_student,node_localmodel toneIndigo
```

## Components

### Web workflow

- [Request workflow](https://github.com/enkheeboldu05/quiz/blob/main/src/app.js): `src/app.js`
- [Quiz pages](https://github.com/enkheeboldu05/quiz/tree/main/views): `views`
- [Browser assets](https://github.com/enkheeboldu05/quiz/blob/main/public/app.js): `public/app.js`
- [PDF extraction](https://github.com/enkheeboldu05/quiz/blob/main/src/services/pdf.js): `src/services/pdf.js`
- [Event logger](https://github.com/enkheeboldu05/quiz/blob/main/src/services/logger.js): `src/services/logger.js`
- [Runtime configuration](https://github.com/enkheeboldu05/quiz/blob/main/src/config.js): `src/config.js`

### Identity

- [Account routes](https://github.com/enkheeboldu05/quiz/blob/main/src/routes/auth.js): `src/routes/auth.js`
- [Session guards](https://github.com/enkheeboldu05/quiz/blob/main/src/middleware/auth.js): `src/middleware/auth.js`

### Question generation

- [Generation settings](https://github.com/enkheeboldu05/quiz/blob/main/src/providers/generation-settings.js): `src/providers/generation-settings.js`
- [Provider selection](https://github.com/enkheeboldu05/quiz/blob/main/src/providers/index.js): `src/providers/index.js`
- [LLM contract](https://github.com/enkheeboldu05/quiz/blob/main/src/providers/llm-provider.js): `src/providers/llm-provider.js`
- [Hugging Face provider](https://github.com/enkheeboldu05/quiz/blob/main/src/providers/huggingface-provider.js): `src/providers/huggingface-provider.js`
- [Ollama provider](https://github.com/enkheeboldu05/quiz/blob/main/src/providers/ollama-provider.js): `src/providers/ollama-provider.js`
- [Prompt templates](https://github.com/enkheeboldu05/quiz/blob/main/src/providers/prompt-templates.js): `src/providers/prompt-templates.js`
- [Question schema](https://github.com/enkheeboldu05/quiz/blob/main/src/providers/question-schema.js): `src/providers/question-schema.js`
- [Question validation](https://github.com/enkheeboldu05/quiz/blob/main/src/providers/parse-questions.js): `src/providers/parse-questions.js`

### Study library

- [Study data store](https://github.com/enkheeboldu05/quiz/blob/main/src/db.js): `src/db.js`
- **SQLite**

### Other components

- **Student**
- **Hugging Face API**
- **Ollama service**

## Connections

- Student → Request workflow: uses (evidence: `README.md`)
- Request workflow → Quiz pages: renders (evidence: `src/app.js`)
- Request workflow → Browser assets: serves assets (evidence: `src/app.js`)
- Request workflow → Account routes: mounts routes (evidence: `src/app.js`)
- Request workflow → Session guards: guards requests (evidence: `src/app.js`)
- Account routes → Session guards: redirects sessions (evidence: `src/routes/auth.js`)
- Account routes → Study data store: reads and writes (evidence: `src/routes/auth.js`)
- Request workflow → Study data store: reads and writes (evidence: `src/app.js`)
- Study data store → SQLite: persists records (evidence: `src/db.js`)
- Request workflow → PDF extraction: extracts text (evidence: `src/app.js`)
- Request workflow → Generation settings: normalizes choices (evidence: `src/app.js`)
- Request workflow → Provider selection: creates provider (evidence: `src/app.js`)
- Provider selection → Runtime configuration: selects from (evidence: `src/providers/index.js`)
- Provider selection → Hugging Face provider: selects (evidence: `src/providers/index.js`)
- Provider selection → Ollama provider: selects (evidence: `src/providers/index.js`)
- Hugging Face provider → LLM contract: extends (evidence: `src/providers/huggingface-provider.js`)
- Ollama provider → LLM contract: extends (evidence: `src/providers/ollama-provider.js`)
- Hugging Face provider → Generation settings: normalizes settings (evidence: `src/providers/huggingface-provider.js`)
- Hugging Face provider → Prompt templates: builds prompt (evidence: `src/providers/huggingface-provider.js`)
- Hugging Face provider → Question schema: formats response (evidence: `src/providers/huggingface-provider.js`)
- Hugging Face provider → Question validation: validates output (evidence: `src/providers/huggingface-provider.js`)
- Ollama provider → Question validation: validates output (evidence: `src/providers/ollama-provider.js`)
- Question validation → Generation settings: checks distribution (evidence: `src/providers/parse-questions.js`)
- Hugging Face provider → Hugging Face API: requests completions (evidence: `src/providers/huggingface-provider.js`)
- Ollama provider → Ollama service: requests generation (evidence: `src/providers/ollama-provider.js`)
- Request workflow → Event logger: records events (evidence: `src/app.js`)
- Request workflow → Runtime configuration: uses settings (evidence: `src/app.js`)
