# anonymous3813/essaygrader architecture

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

## Overview

EssayGrader is a web app for building or selecting an essay rubric, submitting an essay for evaluation, and viewing a grading report. The frontend includes rubric browsing, detail, creation, and editing screens; its grading API route proxies requests to a FastAPI backend. The backend formats the rubric and prompt, retrieves calibration examples, and asks Gemini for a structured report. Backend calls are supported by excerpts; frontend route relationships beyond the shown proxy and rubric dropdown are uncertain because their implementations were not excerpted.

Main entry points: [`essay-grader-backend/services/grader.py`](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/services/grader.py) (Prompt and grading service), [`essay-grader-backend/routers/grader.py`](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/routers/grader.py) (Grading endpoint), [`essay-grader-backend/config.py`](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/config.py) (Provider configuration), [`essay-grader-backend/models/schemas.py`](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/models/schemas.py) (Request and report models)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["EssayGrader frontend"]
  node_home["Home screen<br/>[+page.svelte]"]
  node_grade_ui["Essay submission<br/>[+page.svelte]"]
  node_grade_proxy["Grading API proxy<br/>[+server.ts]"]
  node_results["Grading results<br/>[+page.svelte]"]
end

subgraph group_rubrics["Rubric management"]
  node_rubric_list["Rubric catalog<br/>[+page.svelte]"]
  node_rubric_detail["Rubric details<br/>[+page.svelte]"]
  node_rubric_create["Rubric creation<br/>[+page.svelte]"]
  node_rubric_edit["Rubric editing<br/>[+page.svelte]"]
  node_rubric_builder["Rubric builder"]
  node_template_dropdown["Template selector"]
end

subgraph group_backend["Grading backend"]
  node_api_app["FastAPI application<br/>[main.py]"]
  node_grader_route["Grading endpoint<br/>[grader.py]"]
  node_schemas["Request and report models<br/>[schemas.py]"]
  node_grading_service["Prompt and grading service<br/>[grader.py]"]
  node_configuration["Provider configuration<br/>[config.py]"]
  node_grading_style["Grading instructions<br/>[grading_style.md]"]
end

subgraph group_integrations["External services"]
  node_gemini{{"Gemini API"}}
  node_supabase[("Supabase reference search")]
end

node_user(("Essay author"))

node_rubric_builder -->|"renders selector"| node_template_dropdown
node_grade_proxy -->|"forwards request"| node_grader_route
node_api_app -->|"registers router"| node_grader_route
node_grader_route -->|"validates and returns"| node_schemas
node_grader_route -->|"invokes grading"| node_grading_service
node_grading_service -->|"uses report models"| node_schemas
node_grading_service -->|"uses clients and path"| node_configuration
node_configuration -->|"creates client"| node_gemini
node_configuration -->|"creates client"| node_supabase
node_grading_service -->|"embeds and grades"| node_gemini
node_grading_service -->|"searches examples"| node_supabase
node_grading_service -->|"loads instructions"| node_grading_style

click node_home "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/%2Bpage.svelte"
click node_grade_ui "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/grade/%2Bpage.svelte"
click node_grade_proxy "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/api/grade/%2Bserver.ts"
click node_results "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/results/%2Bpage.svelte"
click node_rubric_list "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/rubrics/%2Bpage.svelte"
click node_rubric_detail "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/rubrics/%5Bid%5D/%2Bpage.svelte"
click node_rubric_create "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/rubrics/new/%2Bpage.svelte"
click node_rubric_edit "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/rubrics/edit/%5Bid%5D/%2Bpage.svelte"
click node_rubric_builder "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/lib/components/RubricBuilder.svelte"
click node_template_dropdown "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/lib/components/TemplateDropdown.svelte"
click node_api_app "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/main.py"
click node_grader_route "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/routers/grader.py"
click node_schemas "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/models/schemas.py"
click node_grading_service "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/services/grader.py"
click node_configuration "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/config.py"
click node_grading_style "https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/prompts/grading_style.md"

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_home,node_grade_ui,node_grade_proxy,node_results toneBlue
class node_rubric_list,node_rubric_detail,node_rubric_create,node_rubric_edit,node_rubric_builder,node_template_dropdown toneAmber
class node_api_app,node_grader_route,node_schemas,node_grading_service,node_configuration,node_grading_style toneMint
class node_gemini,node_supabase toneRose
class node_user toneIndigo
```

## Components

### EssayGrader frontend

- [Home screen](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/%2Bpage.svelte): `essay-grader-frontend/src/routes/+page.svelte`
- [Essay submission](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/grade/%2Bpage.svelte): `essay-grader-frontend/src/routes/grade/+page.svelte`
- [Grading API proxy](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/api/grade/%2Bserver.ts): `essay-grader-frontend/src/routes/api/grade/+server.ts`
- [Grading results](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/results/%2Bpage.svelte): `essay-grader-frontend/src/routes/results/+page.svelte`

### Rubric management

- [Rubric catalog](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/rubrics/%2Bpage.svelte): `essay-grader-frontend/src/routes/rubrics/+page.svelte`
- [Rubric details](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/rubrics/%5Bid%5D/%2Bpage.svelte): `essay-grader-frontend/src/routes/rubrics/[id]/+page.svelte`
- [Rubric creation](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/rubrics/new/%2Bpage.svelte): `essay-grader-frontend/src/routes/rubrics/new/+page.svelte`
- [Rubric editing](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/routes/rubrics/edit/%5Bid%5D/%2Bpage.svelte): `essay-grader-frontend/src/routes/rubrics/edit/[id]/+page.svelte`
- [Rubric builder](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/lib/components/RubricBuilder.svelte): `essay-grader-frontend/src/lib/components/RubricBuilder.svelte`
- [Template selector](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-frontend/src/lib/components/TemplateDropdown.svelte): `essay-grader-frontend/src/lib/components/TemplateDropdown.svelte`

### Grading backend

- [FastAPI application](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/main.py): `essay-grader-backend/main.py`
- [Grading endpoint](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/routers/grader.py): `essay-grader-backend/routers/grader.py`
- [Request and report models](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/models/schemas.py): `essay-grader-backend/models/schemas.py`
- [Prompt and grading service](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/services/grader.py): `essay-grader-backend/services/grader.py`
- [Provider configuration](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/config.py): `essay-grader-backend/config.py`
- [Grading instructions](https://github.com/anonymous3813/essaygrader/blob/main/essay-grader-backend/prompts/grading_style.md): `essay-grader-backend/prompts/grading_style.md`

### External services

- **Gemini API**
- **Supabase reference search**

### Other components

- **Essay author**

## Connections

- Rubric builder → Template selector: renders selector (evidence: `essay-grader-frontend/src/lib/components/RubricBuilder.svelte`)
- Grading API proxy → Grading endpoint: forwards request (evidence: `essay-grader-frontend/src/routes/api/grade/+server.ts`)
- FastAPI application → Grading endpoint: registers router (evidence: `essay-grader-backend/main.py`)
- Grading endpoint → Request and report models: validates and returns (evidence: `essay-grader-backend/routers/grader.py`)
- Grading endpoint → Prompt and grading service: invokes grading (evidence: `essay-grader-backend/routers/grader.py`)
- Prompt and grading service → Request and report models: uses report models (evidence: `essay-grader-backend/services/grader.py`)
- Prompt and grading service → Provider configuration: uses clients and path (evidence: `essay-grader-backend/services/grader.py`)
- Provider configuration → Gemini API: creates client (evidence: `essay-grader-backend/config.py`)
- Provider configuration → Supabase reference search: creates client (evidence: `essay-grader-backend/config.py`)
- Prompt and grading service → Gemini API: embeds and grades (evidence: `essay-grader-backend/services/grader.py`)
- Prompt and grading service → Supabase reference search: searches examples (evidence: `essay-grader-backend/services/grader.py`)
- Prompt and grading service → Grading instructions: loads instructions (evidence: `essay-grader-backend/services/grader.py`)
