# sanjay-sahoo-0804/smart-resume-skill-gap-analyzer architecture

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

- Interactive diagram: https://gitdiagram.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer
- Repository: https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer

## Overview

The product is a Flask resume analyzer and job recommender. Its implemented request flow accepts a PDF and optional job description, extracts and cleans resume text, computes TF-IDF-based scores and skill gaps, ranks jobs, and renders results. The README also describes Sentence-BERT matching, but the sampled web route uses TF-IDF; the experimental semantic modules are shown as a separate, optional branch. Wiring beyond the sampled source is omitted.

Main entry points: [`app.py`](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/app.py) (Flask route), [`templates/result.html`](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/templates/result.html) (Results view), [`job_recommender.py`](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/job_recommender.py) (Job ranking), [`experimental/bert_model.py`](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/experimental/bert_model.py) (Sentence encoder)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web workflow"]
  node_flask["Flask route<br/>[app.py]"]
  node_upload["Resume form<br/>[index.html]"]
  node_results["Results view<br/>[result.html]"]
end

subgraph group_analysis["Resume analysis"]
  node_pdf["PDF extraction<br/>[pdf_reader.py]"]
  node_clean["Text cleaning<br/>[preprocess.py]"]
  node_jd_score["Job match score"]
  node_skill_data["Skill catalogue<br/>[skills_list.txt]"]
  node_skill_gap["Skill gap detection<br/>[skill_gap.py]"]
  node_skill_score["Skill match scores"]
end

subgraph group_recommend["Job recommendations"]
  node_job_recommender["Job ranking<br/>[job_recommender.py]"]
  node_jobs[("Job descriptions<br/>[jobs.json]")]
end

subgraph group_semantic["Experimental semantics"]
  node_bert["Sentence encoder<br/>[bert_model.py]"]
  node_semantic_match["Semantic similarity"]
  node_semantic_skills["Semantic skill scores"]
end

node_candidate(("Candidate"))

node_candidate -->|"submits resume"| node_upload
node_candidate -->|"sends request"| node_flask
node_flask -->|"extracts PDF"| node_pdf
node_flask -->|"cleans text"| node_clean
node_flask -->|"scores optional JD"| node_jd_score
node_flask -->|"loads skills"| node_skill_data
node_flask -->|"checks skills"| node_skill_gap
node_flask -->|"scores skills"| node_skill_score
node_flask -->|"requests rankings"| node_job_recommender
node_job_recommender -->|"reads jobs"| node_jobs
node_flask -->|"renders results"| node_results
node_results -->|"displays analysis"| node_candidate
node_semantic_match -.->|"encodes text"| node_bert
node_semantic_skills -.->|"encodes skills"| node_bert

click node_flask "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/app.py"
click node_upload "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/templates/index.html"
click node_results "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/templates/result.html"
click node_pdf "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/pdf_reader.py"
click node_clean "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/preprocess.py"
click node_jd_score "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/tfidf_similarity.py"
click node_skill_data "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/skills_list.txt"
click node_skill_gap "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/skill_gap.py"
click node_skill_score "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/tfidf_skill_match.py"
click node_job_recommender "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/job_recommender.py"
click node_jobs "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/jobs/jobs.json"
click node_bert "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/experimental/bert_model.py"
click node_semantic_match "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/experimental/semantic_similarity.py"
click node_semantic_skills "https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/experimental/semantic_skill_match.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_flask,node_upload,node_results toneBlue
class node_pdf,node_clean,node_jd_score,node_skill_data,node_skill_gap,node_skill_score toneAmber
class node_job_recommender,node_jobs toneMint
class node_bert,node_semantic_match,node_semantic_skills toneRose
class node_candidate toneIndigo
```

## Components

### Web workflow

- [Flask route](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/app.py): `app.py`
- [Resume form](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/templates/index.html): `templates/index.html`
- [Results view](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/templates/result.html): `templates/result.html`

### Resume analysis

- [PDF extraction](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/pdf_reader.py): `pdf_reader.py`
- [Text cleaning](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/preprocess.py): `preprocess.py`
- [Job match score](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/tfidf_similarity.py): `tfidf_similarity.py`
- [Skill catalogue](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/skills_list.txt): `skills_list.txt`
- [Skill gap detection](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/skill_gap.py): `skill_gap.py`
- [Skill match scores](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/tfidf_skill_match.py): `tfidf_skill_match.py`

### Job recommendations

- [Job ranking](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/job_recommender.py): `job_recommender.py`
- [Job descriptions](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/jobs/jobs.json): `jobs/jobs.json`

### Experimental semantics

- [Sentence encoder](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/experimental/bert_model.py): `experimental/bert_model.py`
- [Semantic similarity](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/experimental/semantic_similarity.py): `experimental/semantic_similarity.py`
- [Semantic skill scores](https://github.com/sanjay-sahoo-0804/smart-resume-skill-gap-analyzer/blob/main/experimental/semantic_skill_match.py): `experimental/semantic_skill_match.py`

### Other components

- **Candidate**

## Connections

- Candidate → Resume form: submits resume
- Candidate → Flask route: sends request
- Flask route → PDF extraction: extracts PDF
- Flask route → Text cleaning: cleans text
- Flask route → Job match score: scores optional JD
- Flask route → Skill catalogue: loads skills
- Flask route → Skill gap detection: checks skills
- Flask route → Skill match scores: scores skills
- Flask route → Job ranking: requests rankings
- Job ranking → Job descriptions: reads jobs
- Flask route → Results view: renders results
- Results view → Candidate: displays analysis
- Semantic similarity → Sentence encoder: encodes text
- Semantic skill scores → Sentence encoder: encodes skills
