# prashik007-sudo/ai-resume-analyzer architecture

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

- Interactive diagram: https://gitdiagram.com/prashik007-sudo/ai-resume-analyzer
- Repository: https://github.com/prashik007-sudo/ai-resume-analyzer

## Overview

AI Resume Analyzer is a FastAPI backend for extracting structured resume and job-description data, scoring resumes for ATS readiness, and comparing resumes with job requirements. The main workflow is PDF upload, text extraction and AI parsing, then ATS scoring; job matching combines rule-based comparisons with Gemini analysis. The README also documents role prediction, career guidance, and cover-letter generation, but the sampled source does not establish their implementation or wiring. The tree and excerpts support the core services and integrations shown; uncertain connections are omitted.

Main entry points: [`backend/app/services/resume_services.py`](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/resume_services.py) (Resume service), [`backend/app/ai/gemini_service.py`](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/ai/gemini_service.py) (Gemini service), [`backend/app/services/ats_score_service.py`](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/ats_score_service.py) (ATS scoring), [`backend/app/services/job_matching_service.py`](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/job_matching_service.py) (Job matching)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["API entrypoints"]
  node_fastapi["FastAPI app<br/>[main.py]"]
  node_resume_routes["Resume routes<br/>[resume.py]"]
  node_jd_routes["Job routes<br/>[jd.py]"]
end

subgraph group_resume["Resume analysis"]
  node_resume_service["Resume service<br/>[resume_services.py]"]
  node_resume_files["Uploaded PDFs<br/>[resume_services.py]"]
  node_text_cleaner["Text cleaner<br/>[text_cleaner.py]"]
  node_resume_parser["Resume parser<br/>[resume_parser.py]"]
  node_resume_schema["Resume schema<br/>[resume_schema.py]"]
  node_ats_service["ATS scoring"]
  node_ats_config["ATS scoring rules<br/>[ats_config.py]"]
  node_skill_categories["Skill categories"]
  node_skill_normalizer["Skill normalizer"]
end

subgraph group_matching["Job matching"]
  node_jd_service["JD extraction<br/>[jd_service.py]"]
  node_jd_schema["JD schema<br/>[jd_schema.py]"]
  node_matching_service["Job matching"]
  node_matching_utils["Rule comparisons<br/>[matching_utils.py]"]
  node_matching_schema["Match schema<br/>[matching_schema.py]"]
  node_documented_features["Role, guidance &amp; letters"]
end

subgraph group_ai["AI integration"]
  node_gemini["Gemini service<br/>[gemini_service.py]"]
  node_prompts["AI prompts"]
  node_response_parser["Response parser<br/>[response_parser.py]"]
end

node_user(("Applicant"))
node_gemini_api["Gemini API"]

node_user -->|"sends requests"| node_fastapi
node_fastapi -->|"mounts routes"| node_resume_routes
node_fastapi -->|"mounts routes"| node_jd_routes
node_resume_routes -->|"calls upload/extract"| node_resume_service
node_resume_routes -->|"calls scoring"| node_ats_service
node_resume_service -->|"writes/reads PDFs"| node_resume_files
node_resume_service -->|"cleans text"| node_text_cleaner
node_resume_service -->|"extracts contacts"| node_resume_parser
node_resume_service -->|"requests extraction"| node_gemini
node_resume_service -->|"builds response"| node_resume_schema
node_ats_service -->|"reads score rules"| node_ats_config
node_ats_service -->|"reads categories"| node_skill_categories
node_ats_service -->|"normalizes skills"| node_skill_normalizer
node_jd_routes -->|"calls extraction"| node_jd_service
node_jd_service -->|"requests extraction"| node_gemini
node_jd_service -->|"builds response"| node_jd_schema
node_matching_service -->|"runs comparisons"| node_matching_utils
node_matching_service -->|"requests semantic match"| node_gemini
node_matching_service -->|"builds result"| node_matching_schema
node_gemini -->|"formats prompts"| node_prompts
node_gemini -->|"generates content"| node_gemini_api
node_gemini -->|"parses response"| node_response_parser

click node_fastapi "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/main.py"
click node_resume_routes "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/routers/resume.py"
click node_jd_routes "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/routers/jd.py"
click node_resume_service "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/resume_services.py"
click node_resume_files "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/resume_services.py"
click node_text_cleaner "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/utils/text_cleaner.py"
click node_resume_parser "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/resume_parser.py"
click node_resume_schema "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/schemas/resume_schema.py"
click node_ats_service "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/ats_score_service.py"
click node_ats_config "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/config/ats_config.py"
click node_skill_categories "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/config/skill_categories.py"
click node_skill_normalizer "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/utils/skill_normalizer.py"
click node_jd_service "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/jd_service.py"
click node_jd_schema "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/schemas/jd_schema.py"
click node_matching_service "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/job_matching_service.py"
click node_matching_utils "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/matching_utils.py"
click node_matching_schema "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/schemas/matching_schema.py"
click node_gemini "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/ai/gemini_service.py"
click node_prompts "https://github.com/prashik007-sudo/ai-resume-analyzer/tree/main/backend/app/ai/prompts"
click node_response_parser "https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/ai/response_parser.py"
click node_documented_features "https://github.com/prashik007-sudo/ai-resume-analyzer/tree/main/backend/app/services"

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_fastapi,node_resume_routes,node_jd_routes toneBlue
class node_resume_service,node_resume_files,node_text_cleaner,node_resume_parser,node_resume_schema,node_ats_service,node_ats_config,node_skill_categories,node_skill_normalizer toneAmber
class node_jd_service,node_jd_schema,node_matching_service,node_matching_utils,node_matching_schema,node_documented_features,node_gemini_api toneMint
class node_gemini,node_prompts,node_response_parser toneRose
class node_user toneIndigo
```

## Components

### API entrypoints

- [FastAPI app](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/main.py): `backend/app/main.py`
- [Resume routes](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/routers/resume.py): `backend/app/routers/resume.py`
- [Job routes](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/routers/jd.py): `backend/app/routers/jd.py`

### Resume analysis

- [Resume service](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/resume_services.py): `backend/app/services/resume_services.py`
- [Uploaded PDFs](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/resume_services.py): `backend/app/services/resume_services.py`
- [Text cleaner](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/utils/text_cleaner.py): `backend/app/utils/text_cleaner.py`
- [Resume parser](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/resume_parser.py): `backend/app/services/resume_parser.py`
- [Resume schema](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/schemas/resume_schema.py): `backend/app/schemas/resume_schema.py`
- [ATS scoring](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/ats_score_service.py): `backend/app/services/ats_score_service.py`
- [ATS scoring rules](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/config/ats_config.py): `backend/app/config/ats_config.py`
- [Skill categories](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/config/skill_categories.py): `backend/app/config/skill_categories.py`
- [Skill normalizer](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/utils/skill_normalizer.py): `backend/app/utils/skill_normalizer.py`

### Job matching

- [JD extraction](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/jd_service.py): `backend/app/services/jd_service.py`
- [JD schema](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/schemas/jd_schema.py): `backend/app/schemas/jd_schema.py`
- [Job matching](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/job_matching_service.py): `backend/app/services/job_matching_service.py`
- [Rule comparisons](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/services/matching_utils.py): `backend/app/services/matching_utils.py`
- [Match schema](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/schemas/matching_schema.py): `backend/app/schemas/matching_schema.py`
- [Role, guidance & letters](https://github.com/prashik007-sudo/ai-resume-analyzer/tree/main/backend/app/services): `backend/app/services`

### AI integration

- [Gemini service](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/ai/gemini_service.py): `backend/app/ai/gemini_service.py`
- [AI prompts](https://github.com/prashik007-sudo/ai-resume-analyzer/tree/main/backend/app/ai/prompts): `backend/app/ai/prompts`
- [Response parser](https://github.com/prashik007-sudo/ai-resume-analyzer/blob/main/backend/app/ai/response_parser.py): `backend/app/ai/response_parser.py`

### Other components

- **Applicant**
- **Gemini API**

## Connections

- Applicant → FastAPI app: sends requests
- FastAPI app → Resume routes: mounts routes
- FastAPI app → Job routes: mounts routes
- Resume routes → Resume service: calls upload/extract
- Resume routes → ATS scoring: calls scoring
- Resume service → Uploaded PDFs: writes/reads PDFs
- Resume service → Text cleaner: cleans text
- Resume service → Resume parser: extracts contacts
- Resume service → Gemini service: requests extraction
- Resume service → Resume schema: builds response
- ATS scoring → ATS scoring rules: reads score rules
- ATS scoring → Skill categories: reads categories
- ATS scoring → Skill normalizer: normalizes skills
- Job routes → JD extraction: calls extraction
- JD extraction → Gemini service: requests extraction
- JD extraction → JD schema: builds response
- Job matching → Rule comparisons: runs comparisons
- Job matching → Gemini service: requests semantic match
- Job matching → Match schema: builds result
- Gemini service → AI prompts: formats prompts
- Gemini service → Gemini API: generates content
- Gemini service → Response parser: parses response
