# kb-dhanush/resume-parser architecture

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

- Interactive diagram: https://gitdiagram.com/kb-dhanush/resume-parser
- Repository: https://github.com/kb-dhanush/resume-parser

## Overview

Plac1fy’s backend accepts student resumes and employer job descriptions, then matches them and notifies eligible students. The principal workflow extracts PDF text, structures resume data, persists student records, and indexes embeddings; the matching workflow embeds a job description, queries the index, applies a similarity threshold, and emails matches. The visible source also documents automatic JD parsing and a health endpoint. Excerpts omit some implementation details, so uncertain internal wiring is left out.

Main entry points: [`app/main.py`](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py) (Eligibility Check)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_intake["Document Intake"]
  node_resume_upload["Resume Upload<br/>[main.py]"]
  node_pdf_extract["PDF Text Extraction<br/>[main.py]"]
  node_resume_parse["Resume Parsing<br/>[main.py]"]
  node_student_store["Student Records<br/>[main.py]"]
  node_resume_embedding["Resume Embedding<br/>[main.py]"]
  node_jd_auto["Automatic JD Upload<br/>[main.py]"]
  node_jd_parse["JD Parsing<br/>[main.py]"]
end

subgraph group_matching["Eligibility Matching"]
  node_eligibility["Eligibility Check<br/>[main.py]"]
  node_jd_embedding["JD Embedding<br/>[main.py]"]
  node_similarity_filter["Similarity Threshold<br/>[main.py]"]
  node_notification["Email Notification<br/>[main.py]"]
  node_health["Health Endpoint<br/>[main.py]"]
end

subgraph group_services["External Services"]
  node_gemini["Gemini API"]
  node_firestore[("Firestore")]
  node_pinecone[("Pinecone Index")]
  node_smtp["SMTP Email"]
end

node_student(("Student"))
node_employer(("Employer"))

node_student -->|"uploads PDF"| node_resume_upload
node_resume_upload -->|"extracts text"| node_pdf_extract
node_resume_upload -->|"parses resume"| node_resume_parse
node_resume_parse -->|"requests parsing"| node_gemini
node_resume_upload -->|"saves record"| node_student_store
node_student_store -->|"writes student"| node_firestore
node_resume_upload -->|"builds embedding"| node_resume_embedding
node_resume_embedding -->|"upserts vector"| node_pinecone
node_employer -->|"uploads PDF"| node_jd_auto
node_jd_auto -->|"extracts text"| node_pdf_extract
node_jd_auto -->|"parses description"| node_jd_parse
node_jd_parse -->|"requests parsing"| node_gemini
node_jd_auto -->|"checks parsed JD"| node_eligibility
node_employer -->|"submits JD"| node_eligibility
node_eligibility -->|"builds embedding"| node_jd_embedding
node_eligibility -->|"queries matches"| node_pinecone
node_eligibility -->|"filters scores"| node_similarity_filter
node_eligibility -->|"emails eligible"| node_notification
node_notification -->|"sends email"| node_smtp
node_student -->|"checks status"| node_health

click node_resume_upload "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py"
click node_pdf_extract "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py"
click node_resume_parse "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py"
click node_student_store "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py"
click node_resume_embedding "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py"
click node_jd_auto "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py"
click node_jd_parse "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py"
click node_eligibility "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py"
click node_jd_embedding "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py"
click node_similarity_filter "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py"
click node_notification "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py"
click node_health "https://github.com/kb-dhanush/resume-parser/blob/main/app/main.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_resume_upload,node_pdf_extract,node_resume_parse,node_student_store,node_resume_embedding,node_jd_auto,node_jd_parse toneBlue
class node_eligibility,node_jd_embedding,node_similarity_filter,node_notification,node_health toneAmber
class node_gemini,node_firestore,node_pinecone,node_smtp toneMint
class node_student,node_employer toneIndigo
```

## Components

### Document Intake

- [Resume Upload](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`
- [PDF Text Extraction](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`
- [Resume Parsing](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`
- [Student Records](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`
- [Resume Embedding](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`
- [Automatic JD Upload](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`
- [JD Parsing](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`

### Eligibility Matching

- [Eligibility Check](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`
- [JD Embedding](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`
- [Similarity Threshold](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`
- [Email Notification](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`
- [Health Endpoint](https://github.com/kb-dhanush/resume-parser/blob/main/app/main.py): `app/main.py`

### External Services

- **Gemini API**
- **Firestore**
- **Pinecone Index**
- **SMTP Email**

### Other components

- **Student**
- **Employer**

## Connections

- Student → Resume Upload: uploads PDF
- Resume Upload → PDF Text Extraction: extracts text
- Resume Upload → Resume Parsing: parses resume
- Resume Parsing → Gemini API: requests parsing
- Resume Upload → Student Records: saves record
- Student Records → Firestore: writes student
- Resume Upload → Resume Embedding: builds embedding
- Resume Embedding → Pinecone Index: upserts vector
- Employer → Automatic JD Upload: uploads PDF
- Automatic JD Upload → PDF Text Extraction: extracts text
- Automatic JD Upload → JD Parsing: parses description
- JD Parsing → Gemini API: requests parsing
- Automatic JD Upload → Eligibility Check: checks parsed JD
- Employer → Eligibility Check: submits JD
- Eligibility Check → JD Embedding: builds embedding
- Eligibility Check → Pinecone Index: queries matches
- Eligibility Check → Similarity Threshold: filters scores
- Eligibility Check → Email Notification: emails eligible
- Email Notification → SMTP Email: sends email
- Student → Health Endpoint: checks status
