# ligphidonk/academic-figure-generator architecture

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

- Interactive diagram: https://gitdiagram.com/ligphidonk/academic-figure-generator
- Repository: https://github.com/ligphidonk/academic-figure-generator

## Overview

Academic Figure Generator is a local web application for organizing research projects, analyzing uploaded papers into figure prompts, and generating or editing academic illustrations. Its main workflow runs from the browser through FastAPI document parsing and Claude-assisted prompt generation, then through image generation and local storage; project management, color schemes, and quick generation are additional product branches. The README documents the end-to-end stages, while source excerpts confirm app registration, image generation/storage, and selected frontend calls; links involving unsampled routes and services are marked unverified.

Main entry points: [`backend/app/main.py`](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/main.py) (FastAPI application), [`frontend/src/App.tsx`](https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/App.tsx) (Application routes), [`backend/app/models/database.py`](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/models/database.py) (SQLite metadata), [`frontend/src/lib/api.ts`](https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/lib/api.ts) (API client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Browser application"]
  node_app["Application routes<br/>[App.tsx]"]
  node_projects["Project management<br/>[Projects.tsx]"]
  node_workspace["Project workspace"]
  node_quickgen["Quick generation<br/>[Generate.tsx]"]
  node_schemesui["Color scheme UI<br/>[ColorSchemes.tsx]"]
  node_settingsui["Settings UI<br/>[Settings.tsx]"]
  node_api_client["API client<br/>[api.ts]"]
  node_blob["Image downloads<br/>[blob.ts]"]
  node_primitives["UI primitives"]
end

subgraph group_api["API and workflow"]
  node_server["FastAPI application<br/>[main.py]"]
  node_project_routes["Project routes<br/>[projects.py]"]
  node_document_routes["Document routes<br/>[documents.py]"]
  node_prompt_routes["Prompt routes<br/>[prompts.py]"]
  node_image_routes["Image routes<br/>[images.py]"]
  node_scheme_routes["Color scheme routes<br/>[color_schemes.py]"]
  node_document_parse["Document parsing"]
  node_ocr["OCR processing<br/>[ocr_service.py]"]
  node_prompt_service["Prompt management<br/>[prompt_service.py]"]
end

subgraph group_ai["AI services"]
  node_claude["Claude analysis"]
  node_image_service["Image generation<br/>[image_service.py]"]
  node_color_prompts["Prompt templates"]
end

subgraph group_state["Persistence and files"]
  node_database[("SQLite metadata<br/>[database.py]")]
  node_storage_service["Local file storage"]
  node_filesystem[("Local data files")]
end

node_researcher(("Researcher"))
node_external_claude{{"Claude Agent SDK"}}
node_image_api{{"NanoBanana API"}}

node_researcher -->|"uses"| node_app
node_app -->|"routes to"| node_projects
node_app -->|"routes to"| node_workspace
node_app -->|"routes to"| node_quickgen
node_app -->|"routes to"| node_schemesui
node_app -->|"routes to"| node_settingsui
node_projects -->|"requests"| node_api_client
node_workspace -->|"requests"| node_api_client
node_quickgen -->|"requests"| node_api_client
node_schemesui -->|"requests"| node_api_client
node_workspace -->|"downloads"| node_blob
node_projects -->|"renders"| node_primitives
node_workspace -->|"renders"| node_primitives
node_quickgen -->|"renders"| node_primitives
node_schemesui -->|"renders"| node_primitives
node_api_client -.->|"HTTP requests"| node_server
node_server -->|"registers"| node_project_routes
node_server -->|"registers"| node_document_routes
node_server -->|"registers"| node_prompt_routes
node_server -->|"registers"| node_image_routes
node_server -->|"registers"| node_scheme_routes
node_document_routes -.->|"parses papers"| node_document_parse
node_document_parse -.->|"uses OCR"| node_ocr
node_prompt_routes -.->|"generates prompts"| node_claude
node_claude -->|"analyzes with"| node_external_claude
node_prompt_routes -.->|"manages prompts"| node_prompt_service
node_claude -.->|"uses templates"| node_color_prompts
node_image_routes -->|"generates images"| node_image_service
node_image_service -->|"calls"| node_image_api
node_image_routes -->|"stores images"| node_storage_service
node_storage_service -->|"reads and writes"| node_filesystem
node_server -->|"initializes tables"| node_database
node_image_routes -.->|"persists metadata"| node_database
node_project_routes -.->|"persists projects"| node_database
node_document_routes -.->|"persists documents"| node_database
node_prompt_routes -.->|"persists prompts"| node_database
node_scheme_routes -.->|"persists schemes"| node_database

click node_app "https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/App.tsx"
click node_projects "https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/pages/Projects.tsx"
click node_workspace "https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/pages/ProjectWorkspace.tsx"
click node_quickgen "https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/pages/Generate.tsx"
click node_schemesui "https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/pages/ColorSchemes.tsx"
click node_settingsui "https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/pages/Settings.tsx"
click node_api_client "https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/lib/api.ts"
click node_blob "https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/lib/blob.ts"
click node_primitives "https://github.com/ligphidonk/academic-figure-generator/tree/main/frontend/src/components/ui"
click node_server "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/main.py"
click node_project_routes "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/api/v1/projects.py"
click node_document_routes "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/api/v1/documents.py"
click node_prompt_routes "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/api/v1/prompts.py"
click node_image_routes "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/api/v1/images.py"
click node_scheme_routes "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/api/v1/color_schemes.py"
click node_document_parse "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/document_service.py"
click node_ocr "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/ocr_service.py"
click node_prompt_service "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/prompt_service.py"
click node_claude "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/claude_code_service.py"
click node_image_service "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/image_service.py"
click node_color_prompts "https://github.com/ligphidonk/academic-figure-generator/tree/main/backend/app/core/prompts"
click node_database "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/models/database.py"
click node_storage_service "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/local_storage_service.py"
click node_filesystem "https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/local_storage_service.py"

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_projects,node_workspace,node_quickgen,node_schemesui,node_settingsui,node_api_client,node_blob,node_primitives toneBlue
class node_server,node_project_routes,node_document_routes,node_prompt_routes,node_image_routes,node_scheme_routes,node_document_parse,node_ocr,node_prompt_service toneAmber
class node_claude,node_image_service,node_color_prompts,node_image_api toneMint
class node_database,node_storage_service,node_filesystem toneRose
class node_researcher,node_external_claude toneIndigo
```

## Components

### Browser application

- [Application routes](https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/App.tsx): `frontend/src/App.tsx`
- [Project management](https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/pages/Projects.tsx): `frontend/src/pages/Projects.tsx`
- [Project workspace](https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/pages/ProjectWorkspace.tsx): `frontend/src/pages/ProjectWorkspace.tsx`
- [Quick generation](https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/pages/Generate.tsx): `frontend/src/pages/Generate.tsx`
- [Color scheme UI](https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/pages/ColorSchemes.tsx): `frontend/src/pages/ColorSchemes.tsx`
- [Settings UI](https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/pages/Settings.tsx): `frontend/src/pages/Settings.tsx`
- [API client](https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/lib/api.ts): `frontend/src/lib/api.ts`
- [Image downloads](https://github.com/ligphidonk/academic-figure-generator/blob/main/frontend/src/lib/blob.ts): `frontend/src/lib/blob.ts`
- [UI primitives](https://github.com/ligphidonk/academic-figure-generator/tree/main/frontend/src/components/ui): `frontend/src/components/ui`

### API and workflow

- [FastAPI application](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/main.py): `backend/app/main.py`
- [Project routes](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/api/v1/projects.py): `backend/app/api/v1/projects.py`
- [Document routes](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/api/v1/documents.py): `backend/app/api/v1/documents.py`
- [Prompt routes](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/api/v1/prompts.py): `backend/app/api/v1/prompts.py`
- [Image routes](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/api/v1/images.py): `backend/app/api/v1/images.py`
- [Color scheme routes](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/api/v1/color_schemes.py): `backend/app/api/v1/color_schemes.py`
- [Document parsing](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/document_service.py): `backend/app/services/document_service.py`
- [OCR processing](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/ocr_service.py): `backend/app/services/ocr_service.py`
- [Prompt management](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/prompt_service.py): `backend/app/services/prompt_service.py`

### AI services

- [Claude analysis](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/claude_code_service.py): `backend/app/services/claude_code_service.py`
- [Image generation](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/image_service.py): `backend/app/services/image_service.py`
- [Prompt templates](https://github.com/ligphidonk/academic-figure-generator/tree/main/backend/app/core/prompts): `backend/app/core/prompts`

### Persistence and files

- [SQLite metadata](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/models/database.py): `backend/app/models/database.py`
- [Local file storage](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/local_storage_service.py): `backend/app/services/local_storage_service.py`
- [Local data files](https://github.com/ligphidonk/academic-figure-generator/blob/main/backend/app/services/local_storage_service.py): `backend/app/services/local_storage_service.py`

### Other components

- **Researcher**
- **Claude Agent SDK**
- **NanoBanana API**

## Connections

- Researcher → Application routes: uses (evidence: `README.md`)
- Application routes → Project management: routes to (evidence: `frontend/src/App.tsx`)
- Application routes → Project workspace: routes to (evidence: `frontend/src/App.tsx`)
- Application routes → Quick generation: routes to (evidence: `frontend/src/App.tsx`)
- Application routes → Color scheme UI: routes to (evidence: `frontend/src/App.tsx`)
- Application routes → Settings UI: routes to (evidence: `frontend/src/App.tsx`)
- Project management → API client: requests (evidence: `frontend/src/pages/Projects.tsx`)
- Project workspace → API client: requests (evidence: `frontend/src/pages/ProjectWorkspace.tsx`)
- Quick generation → API client: requests (evidence: `frontend/src/pages/Generate.tsx`)
- Color scheme UI → API client: requests (evidence: `frontend/src/pages/ColorSchemes.tsx`)
- Project workspace → Image downloads: downloads (evidence: `frontend/src/pages/ProjectWorkspace.tsx`)
- Project management → UI primitives: renders (evidence: `frontend/src/pages/Projects.tsx`)
- Project workspace → UI primitives: renders (evidence: `frontend/src/pages/ProjectWorkspace.tsx`)
- Quick generation → UI primitives: renders (evidence: `frontend/src/pages/Generate.tsx`)
- Color scheme UI → UI primitives: renders (evidence: `frontend/src/pages/ColorSchemes.tsx`)
- API client → FastAPI application: HTTP requests (evidence: `README.md`)
- FastAPI application → Project routes: registers (evidence: `backend/app/main.py`)
- FastAPI application → Document routes: registers (evidence: `backend/app/main.py`)
- FastAPI application → Prompt routes: registers (evidence: `backend/app/main.py`)
- FastAPI application → Image routes: registers (evidence: `backend/app/main.py`)
- FastAPI application → Color scheme routes: registers (evidence: `backend/app/main.py`)
- Document routes → Document parsing: parses papers (evidence: `README.md`)
- Document parsing → OCR processing: uses OCR
- Prompt routes → Claude analysis: generates prompts (evidence: `README.md`)
- Claude analysis → Claude Agent SDK: analyzes with (evidence: `README.md`)
- Prompt routes → Prompt management: manages prompts (evidence: `README.md`)
- Claude analysis → Prompt templates: uses templates
- Image routes → Image generation: generates images (evidence: `backend/app/api/v1/images.py`)
- Image generation → NanoBanana API: calls (evidence: `backend/app/services/image_service.py`)
- Image routes → Local file storage: stores images (evidence: `backend/app/api/v1/images.py`)
- Local file storage → Local data files: reads and writes (evidence: `backend/app/services/local_storage_service.py`)
- FastAPI application → SQLite metadata: initializes tables (evidence: `backend/app/main.py`)
- Image routes → SQLite metadata: persists metadata (evidence: `README.md`)
- Project routes → SQLite metadata: persists projects (evidence: `README.md`)
- Document routes → SQLite metadata: persists documents (evidence: `README.md`)
- Prompt routes → SQLite metadata: persists prompts (evidence: `README.md`)
- Color scheme routes → SQLite metadata: persists schemes
