# attahdev/resume architecture

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

- Interactive diagram: https://gitdiagram.com/attahdev/resume
- Repository: https://github.com/attahdev/resume

## Overview

Resume Analyzer is a web application that compares an uploaded resume with a job description and returns a match score, skill gaps, and coaching suggestions. The main workflow runs from the React app through upload and analysis endpoints, then through document parsing, local NLP/scoring, and optional Groq-generated feedback; users can view results, compare analyses, and revisit history. Authentication and guest tracking support different access tiers. README capabilities inform the analysis stages, while unsampled router and service implementations limit certainty about their exact wiring.

Main entry points: [`backend/main.py`](https://github.com/attahdev/resume/blob/main/backend/main.py) (FastAPI app), [`backend/models`](https://github.com/attahdev/resume/tree/main/backend/models) (Persisted records), [`backend/routers/analyze.py`](https://github.com/attahdev/resume/blob/main/backend/routers/analyze.py) (Analysis endpoint), [`frontend/src/pages/AppPage.jsx`](https://github.com/attahdev/resume/blob/main/frontend/src/pages/AppPage.jsx) (Analysis workspace)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Web client"]
  node_app["React app<br/>[App.jsx]"]
  node_app_page["Analysis workspace<br/>[AppPage.jsx]"]
  node_upload_ui["Resume upload<br/>[UploadZone.jsx]"]
  node_job_ui["Job description<br/>[JobInput.jsx]"]
  node_score_ui["Score dashboard<br/>[ScoreDashboard.jsx]"]
  node_results_ui["Analysis details"]
  node_delta_ui["Comparison view<br/>[DeltaView.jsx]"]
  node_history_ui["Analysis history<br/>[HistoryPage.jsx]"]
  node_api_client["API client<br/>[client.js]"]
  node_auth_ui["Auth state<br/>[useAuth.jsx]"]
end

subgraph group_api["API and access"]
  node_api_main["FastAPI app<br/>[main.py]"]
  node_upload_api["Upload endpoint<br/>[upload.py]"]
  node_analyze_api["Analysis endpoint<br/>[analyze.py]"]
  node_results_api["Results endpoint<br/>[results.py]"]
  node_compare_api["Compare endpoint<br/>[compare.py]"]
  node_history_api["History endpoint<br/>[history.py]"]
  node_auth_api["Auth endpoints<br/>[auth.py]"]
end

subgraph group_analysis["Resume analysis"]
  node_parser["Document parser<br/>[parser.py]"]
  node_nlp["Local NLP<br/>[nlp.py]"]
  node_scorer["Match scorer<br/>[scorer.py]"]
  node_llm["Coaching feedback<br/>[llm.py]"]
end

subgraph group_state["Identity and state"]
  node_guest["Guest tracking<br/>[guest.py]"]
  node_models["Persisted records"]
  node_database[("SQL database<br/>[database.py]")]
end

node_user(("Candidate"))
node_groq{{"Groq LLM"}}

node_user -->|"uses"| node_app
node_app -->|"routes"| node_app_page
node_app -->|"provides auth"| node_auth_ui
node_app_page -->|"accepts resume"| node_upload_ui
node_app_page -->|"accepts job"| node_job_ui
node_app_page -->|"sends requests"| node_api_client
node_api_client -->|"calls API"| node_api_main
node_api_main -->|"dispatches"| node_upload_api
node_api_main -->|"dispatches"| node_analyze_api
node_api_main -->|"dispatches"| node_results_api
node_api_main -->|"dispatches"| node_compare_api
node_api_main -->|"dispatches"| node_history_api
node_api_main -->|"dispatches"| node_auth_api
node_upload_api -->|"parses files"| node_parser
node_analyze_api -->|"extracts text"| node_parser
node_analyze_api -->|"analyzes text"| node_nlp
node_analyze_api -->|"scores match"| node_scorer
node_analyze_api -->|"requests feedback"| node_llm
node_llm -.->|"requests generation"| node_groq
node_scorer -->|"uses NLP"| node_nlp
node_results_api -->|"returns scores"| node_score_ui
node_results_api -->|"returns findings"| node_results_ui
node_compare_api -->|"returns differences"| node_delta_ui
node_history_api -->|"returns history"| node_history_ui
node_auth_ui -->|"manages tokens"| node_api_client
node_auth_api -->|"reads/writes users"| node_models
node_upload_api -->|"stores resume data"| node_models
node_analyze_api -->|"stores analyses"| node_models
node_results_api -->|"reads analyses"| node_models
node_compare_api -->|"reads analyses"| node_models
node_history_api -->|"reads history"| node_models
node_models -->|"persists records"| node_database
node_api_main -->|"tracks guests"| node_guest

click node_app "https://github.com/attahdev/resume/blob/main/frontend/src/App.jsx"
click node_app_page "https://github.com/attahdev/resume/blob/main/frontend/src/pages/AppPage.jsx"
click node_upload_ui "https://github.com/attahdev/resume/blob/main/frontend/src/components/UploadZone.jsx"
click node_job_ui "https://github.com/attahdev/resume/blob/main/frontend/src/components/JobInput.jsx"
click node_score_ui "https://github.com/attahdev/resume/blob/main/frontend/src/components/ScoreDashboard.jsx"
click node_results_ui "https://github.com/attahdev/resume/blob/main/frontend/src/components/SectionBreakdown.jsx"
click node_delta_ui "https://github.com/attahdev/resume/blob/main/frontend/src/components/DeltaView.jsx"
click node_history_ui "https://github.com/attahdev/resume/blob/main/frontend/src/pages/HistoryPage.jsx"
click node_api_client "https://github.com/attahdev/resume/blob/main/frontend/src/api/client.js"
click node_auth_ui "https://github.com/attahdev/resume/blob/main/frontend/src/auth/useAuth.jsx"
click node_api_main "https://github.com/attahdev/resume/blob/main/backend/main.py"
click node_upload_api "https://github.com/attahdev/resume/blob/main/backend/routers/upload.py"
click node_analyze_api "https://github.com/attahdev/resume/blob/main/backend/routers/analyze.py"
click node_results_api "https://github.com/attahdev/resume/blob/main/backend/routers/results.py"
click node_compare_api "https://github.com/attahdev/resume/blob/main/backend/routers/compare.py"
click node_history_api "https://github.com/attahdev/resume/blob/main/backend/routers/history.py"
click node_auth_api "https://github.com/attahdev/resume/blob/main/backend/routers/auth.py"
click node_parser "https://github.com/attahdev/resume/blob/main/backend/services/parser.py"
click node_nlp "https://github.com/attahdev/resume/blob/main/backend/services/nlp.py"
click node_scorer "https://github.com/attahdev/resume/blob/main/backend/services/scorer.py"
click node_llm "https://github.com/attahdev/resume/blob/main/backend/services/llm.py"
click node_guest "https://github.com/attahdev/resume/blob/main/backend/services/guest.py"
click node_models "https://github.com/attahdev/resume/tree/main/backend/models"
click node_database "https://github.com/attahdev/resume/blob/main/backend/database.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_app_page,node_upload_ui,node_job_ui,node_score_ui,node_results_ui,node_delta_ui,node_history_ui,node_api_client,node_auth_ui toneBlue
class node_api_main,node_upload_api,node_analyze_api,node_results_api,node_compare_api,node_history_api,node_auth_api toneAmber
class node_parser,node_nlp,node_scorer,node_llm toneMint
class node_guest,node_models,node_database toneRose
class node_user,node_groq toneIndigo
```

## Components

### Web client

- [React app](https://github.com/attahdev/resume/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Analysis workspace](https://github.com/attahdev/resume/blob/main/frontend/src/pages/AppPage.jsx): `frontend/src/pages/AppPage.jsx`
- [Resume upload](https://github.com/attahdev/resume/blob/main/frontend/src/components/UploadZone.jsx): `frontend/src/components/UploadZone.jsx`
- [Job description](https://github.com/attahdev/resume/blob/main/frontend/src/components/JobInput.jsx): `frontend/src/components/JobInput.jsx`
- [Score dashboard](https://github.com/attahdev/resume/blob/main/frontend/src/components/ScoreDashboard.jsx): `frontend/src/components/ScoreDashboard.jsx`
- [Analysis details](https://github.com/attahdev/resume/blob/main/frontend/src/components/SectionBreakdown.jsx): `frontend/src/components/SectionBreakdown.jsx`
- [Comparison view](https://github.com/attahdev/resume/blob/main/frontend/src/components/DeltaView.jsx): `frontend/src/components/DeltaView.jsx`
- [Analysis history](https://github.com/attahdev/resume/blob/main/frontend/src/pages/HistoryPage.jsx): `frontend/src/pages/HistoryPage.jsx`
- [API client](https://github.com/attahdev/resume/blob/main/frontend/src/api/client.js): `frontend/src/api/client.js`
- [Auth state](https://github.com/attahdev/resume/blob/main/frontend/src/auth/useAuth.jsx): `frontend/src/auth/useAuth.jsx`

### API and access

- [FastAPI app](https://github.com/attahdev/resume/blob/main/backend/main.py): `backend/main.py`
- [Upload endpoint](https://github.com/attahdev/resume/blob/main/backend/routers/upload.py): `backend/routers/upload.py`
- [Analysis endpoint](https://github.com/attahdev/resume/blob/main/backend/routers/analyze.py): `backend/routers/analyze.py`
- [Results endpoint](https://github.com/attahdev/resume/blob/main/backend/routers/results.py): `backend/routers/results.py`
- [Compare endpoint](https://github.com/attahdev/resume/blob/main/backend/routers/compare.py): `backend/routers/compare.py`
- [History endpoint](https://github.com/attahdev/resume/blob/main/backend/routers/history.py): `backend/routers/history.py`
- [Auth endpoints](https://github.com/attahdev/resume/blob/main/backend/routers/auth.py): `backend/routers/auth.py`

### Resume analysis

- [Document parser](https://github.com/attahdev/resume/blob/main/backend/services/parser.py): `backend/services/parser.py`
- [Local NLP](https://github.com/attahdev/resume/blob/main/backend/services/nlp.py): `backend/services/nlp.py`
- [Match scorer](https://github.com/attahdev/resume/blob/main/backend/services/scorer.py): `backend/services/scorer.py`
- [Coaching feedback](https://github.com/attahdev/resume/blob/main/backend/services/llm.py): `backend/services/llm.py`

### Identity and state

- [Guest tracking](https://github.com/attahdev/resume/blob/main/backend/services/guest.py): `backend/services/guest.py`
- [Persisted records](https://github.com/attahdev/resume/tree/main/backend/models): `backend/models`
- [SQL database](https://github.com/attahdev/resume/blob/main/backend/database.py): `backend/database.py`

### Other components

- **Candidate**
- **Groq LLM**

## Connections

- Candidate → React app: uses
- React app → Analysis workspace: routes
- React app → Auth state: provides auth
- Analysis workspace → Resume upload: accepts resume
- Analysis workspace → Job description: accepts job
- Analysis workspace → API client: sends requests
- API client → FastAPI app: calls API
- FastAPI app → Upload endpoint: dispatches
- FastAPI app → Analysis endpoint: dispatches
- FastAPI app → Results endpoint: dispatches
- FastAPI app → Compare endpoint: dispatches
- FastAPI app → History endpoint: dispatches
- FastAPI app → Auth endpoints: dispatches
- Upload endpoint → Document parser: parses files
- Analysis endpoint → Document parser: extracts text
- Analysis endpoint → Local NLP: analyzes text
- Analysis endpoint → Match scorer: scores match
- Analysis endpoint → Coaching feedback: requests feedback
- Coaching feedback → Groq LLM: requests generation
- Match scorer → Local NLP: uses NLP
- Results endpoint → Score dashboard: returns scores
- Results endpoint → Analysis details: returns findings
- Compare endpoint → Comparison view: returns differences
- History endpoint → Analysis history: returns history
- Auth state → API client: manages tokens
- Auth endpoints → Persisted records: reads/writes users
- Upload endpoint → Persisted records: stores resume data
- Analysis endpoint → Persisted records: stores analyses
- Results endpoint → Persisted records: reads analyses
- Compare endpoint → Persisted records: reads analyses
- History endpoint → Persisted records: reads history
- Persisted records → SQL database: persists records
- FastAPI app → Guest tracking: tracks guests
