# devbjack/bismillah-fix-resume-reviewer architecture

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

- Interactive diagram: https://gitdiagram.com/devbjack/bismillah-fix-resume-reviewer
- Repository: https://github.com/devbjack/bismillah-fix-resume-reviewer

## Overview

Resume Reviewer is a local HR application for extracting job requirements, reviewing them, batch-scoring resume PDFs, and inspecting ranked applicants with requirement probabilities and evidence. HR uploads a job PDF, confirms extracted must-have/nice-to-have requirements, then uploads resumes; a background worker extracts text, retrieves relevant passages, asks a local LLM for match probabilities, scores applicants, and saves results for review and export. The graph follows documented capabilities and indexed imports; unsampled API, extraction, and UI internals are represented at their source paths without asserting unshown call details.

Main entry points: [`frontend/src/api.ts`](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/api.ts) (Typed API client), [`backend/app/main.py`](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/main.py) (Runtime wiring), [`backend/app/api.py`](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/api.py) (HTTP API), [`frontend/src/pages/JobPage.tsx`](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/pages/JobPage.tsx) (Job workspace)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["HR interface"]
  node_jobs_ui["Job listing<br/>[JobsPage.tsx]"]
  node_job_ui["Job workspace<br/>[JobPage.tsx]"]
  node_setup_ui["Requirements and upload<br/>[SetupView.tsx]"]
  node_requirements_ui["Requirements editor"]
  node_resume_ui["Resume upload<br/>[ResumeUpload.tsx]"]
  node_file_drop["File drop<br/>[FileDrop.tsx]"]
  node_applicant_list["Applicant ranking<br/>[ApplicantList.tsx]"]
  node_overview["Job analytics<br/>[Overview.tsx]"]
  node_applicant_review["Evidence review"]
  node_api_client["Typed API client<br/>[api.ts]"]
end

subgraph group_entry["Application entry"]
  node_api["HTTP API<br/>[api.py]"]
  node_main["Runtime wiring<br/>[main.py]"]
end

subgraph group_workflow["Review workflow"]
  node_worker["Scoring worker<br/>[worker.py]"]
  node_pdf_text["PDF text extraction<br/>[pdf_text.py]"]
  node_req_extract["Requirement extraction<br/>[req_extract.py]"]
  node_pipeline["Resume review pipeline<br/>[pipeline.py]"]
  node_chunker["Section chunking<br/>[chunker.py]"]
  node_retriever["Hybrid retrieval<br/>[retriever.py]"]
  node_decider["LLM decision<br/>[decider.py]"]
  node_scorer["Weighted scoring<br/>[scorer.py]"]
end

subgraph group_persistence["Job data"]
  node_store[("SQLite store<br/>[store.py]")]
end

node_hr(("HR user"))
node_ollama{{"Local Ollama"}}
node_embedding_model{{"Embedding model"}}

node_hr -->|"manages jobs"| node_jobs_ui
node_hr -->|"configures review"| node_setup_ui
node_hr -->|"uploads resumes"| node_resume_ui
node_jobs_ui -->|"lists and creates"| node_api_client
node_job_ui -->|"loads job data"| node_api_client
node_job_ui -->|"renders ranking"| node_applicant_list
node_job_ui -->|"renders details"| node_applicant_review
node_job_ui -->|"renders analytics"| node_overview
node_job_ui -->|"renders setup"| node_setup_ui
node_setup_ui -->|"edits requirements"| node_requirements_ui
node_setup_ui -->|"uploads resumes"| node_resume_ui
node_resume_ui -->|"accepts files"| node_file_drop
node_requirements_ui -->|"saves requirements"| node_api_client
node_resume_ui -->|"sends resumes"| node_api_client
node_applicant_list -->|"loads applicants"| node_api_client
node_overview -->|"loads summary"| node_api_client
node_applicant_review -->|"loads evidence"| node_api_client
node_api_client -->|"requests data"| node_api
node_main -->|"creates app"| node_api
node_main -->|"starts worker"| node_worker
node_main -->|"creates store"| node_store
node_main -->|"configures Ollama"| node_decider
node_main -->|"configures extraction"| node_req_extract
node_main -->|"loads model"| node_embedding_model
node_api -->|"manages job data"| node_store
node_api -->|"queues scoring"| node_worker
node_api -->|"extracts job text"| node_pdf_text
node_api -->|"extracts requirements"| node_req_extract
node_worker -->|"loads and saves"| node_store
node_worker -->|"extracts resume text"| node_pdf_text
node_worker -->|"reviews resume"| node_pipeline
node_pipeline -->|"chunks text"| node_chunker
node_pipeline -->|"ranks passages"| node_retriever
node_pipeline -->|"evaluates evidence"| node_decider
node_pipeline -->|"calculates score"| node_scorer
node_decider -->|"queries local model"| node_ollama
node_retriever -->|"embeds passages"| node_embedding_model

click node_jobs_ui "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/pages/JobsPage.tsx"
click node_job_ui "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/pages/JobPage.tsx"
click node_setup_ui "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/SetupView.tsx"
click node_requirements_ui "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/RequirementsEditor.tsx"
click node_resume_ui "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/ResumeUpload.tsx"
click node_file_drop "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/FileDrop.tsx"
click node_applicant_list "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/ApplicantList.tsx"
click node_overview "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/Overview.tsx"
click node_applicant_review "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/ApplicantReview.tsx"
click node_api_client "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/api.ts"
click node_api "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/api.py"
click node_main "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/main.py"
click node_worker "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/worker.py"
click node_pdf_text "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/pdf_text.py"
click node_req_extract "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/req_extract.py"
click node_pipeline "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/pipeline.py"
click node_chunker "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/chunker.py"
click node_retriever "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/retriever.py"
click node_decider "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/decider.py"
click node_scorer "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/scorer.py"
click node_store "https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/store.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_jobs_ui,node_job_ui,node_setup_ui,node_requirements_ui,node_resume_ui,node_file_drop,node_applicant_list,node_overview,node_applicant_review,node_api_client,node_hr toneBlue
class node_api,node_main toneAmber
class node_worker,node_pdf_text,node_req_extract,node_pipeline,node_chunker,node_retriever,node_decider,node_scorer toneMint
class node_store toneRose
class node_ollama,node_embedding_model toneIndigo
```

## Components

### HR interface

- [Job listing](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/pages/JobsPage.tsx): `frontend/src/pages/JobsPage.tsx`
- [Job workspace](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/pages/JobPage.tsx): `frontend/src/pages/JobPage.tsx`
- [Requirements and upload](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/SetupView.tsx): `frontend/src/components/SetupView.tsx`
- [Requirements editor](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/RequirementsEditor.tsx): `frontend/src/components/RequirementsEditor.tsx`
- [Resume upload](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/ResumeUpload.tsx): `frontend/src/components/ResumeUpload.tsx`
- [File drop](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/FileDrop.tsx): `frontend/src/components/FileDrop.tsx`
- [Applicant ranking](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/ApplicantList.tsx): `frontend/src/components/ApplicantList.tsx`
- [Job analytics](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/Overview.tsx): `frontend/src/components/Overview.tsx`
- [Evidence review](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/components/ApplicantReview.tsx): `frontend/src/components/ApplicantReview.tsx`
- [Typed API client](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/frontend/src/api.ts): `frontend/src/api.ts`

### Application entry

- [HTTP API](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/api.py): `backend/app/api.py`
- [Runtime wiring](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/main.py): `backend/app/main.py`

### Review workflow

- [Scoring worker](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/worker.py): `backend/app/worker.py`
- [PDF text extraction](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/pdf_text.py): `backend/app/pdf_text.py`
- [Requirement extraction](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/req_extract.py): `backend/app/req_extract.py`
- [Resume review pipeline](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/pipeline.py): `backend/app/pipeline.py`
- [Section chunking](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/chunker.py): `backend/app/chunker.py`
- [Hybrid retrieval](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/retriever.py): `backend/app/retriever.py`
- [LLM decision](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/decider.py): `backend/app/decider.py`
- [Weighted scoring](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/scorer.py): `backend/app/scorer.py`

### Job data

- [SQLite store](https://github.com/devbjack/bismillah-fix-resume-reviewer/blob/main/backend/app/store.py): `backend/app/store.py`

### Other components

- **HR user**
- **Local Ollama**
- **Embedding model**

## Connections

- HR user → Job listing: manages jobs (evidence: `frontend/src/pages/JobsPage.tsx`)
- HR user → Requirements and upload: configures review (evidence: `README.md`)
- HR user → Resume upload: uploads resumes (evidence: `README.md`)
- Job listing → Typed API client: lists and creates (evidence: `frontend/src/pages/JobsPage.tsx`)
- Job workspace → Typed API client: loads job data (evidence: `frontend/src/pages/JobPage.tsx`)
- Job workspace → Applicant ranking: renders ranking (evidence: `frontend/src/pages/JobPage.tsx`)
- Job workspace → Evidence review: renders details (evidence: `frontend/src/pages/JobPage.tsx`)
- Job workspace → Job analytics: renders analytics (evidence: `frontend/src/pages/JobPage.tsx`)
- Job workspace → Requirements and upload: renders setup (evidence: `frontend/src/pages/JobPage.tsx`)
- Requirements and upload → Requirements editor: edits requirements (evidence: `frontend/src/components/SetupView.tsx`)
- Requirements and upload → Resume upload: uploads resumes (evidence: `frontend/src/components/SetupView.tsx`)
- Resume upload → File drop: accepts files (evidence: `frontend/src/components/ResumeUpload.tsx`)
- Requirements editor → Typed API client: saves requirements (evidence: `frontend/src/components/RequirementsEditor.tsx`)
- Resume upload → Typed API client: sends resumes (evidence: `frontend/src/components/ResumeUpload.tsx`)
- Applicant ranking → Typed API client: loads applicants (evidence: `frontend/src/components/ApplicantList.tsx`)
- Job analytics → Typed API client: loads summary (evidence: `frontend/src/components/Overview.tsx`)
- Evidence review → Typed API client: loads evidence (evidence: `frontend/src/components/ApplicantReview.tsx`)
- Typed API client → HTTP API: requests data (evidence: `frontend/src/api.ts`)
- Runtime wiring → HTTP API: creates app (evidence: `backend/app/main.py`)
- Runtime wiring → Scoring worker: starts worker (evidence: `backend/app/main.py`)
- Runtime wiring → SQLite store: creates store (evidence: `backend/app/main.py`)
- Runtime wiring → LLM decision: configures Ollama (evidence: `backend/app/main.py`)
- Runtime wiring → Requirement extraction: configures extraction (evidence: `backend/app/main.py`)
- Runtime wiring → Embedding model: loads model (evidence: `backend/app/main.py`)
- HTTP API → SQLite store: manages job data (evidence: `backend/app/api.py`)
- HTTP API → Scoring worker: queues scoring (evidence: `backend/app/api.py`)
- HTTP API → PDF text extraction: extracts job text (evidence: `backend/app/api.py`)
- HTTP API → Requirement extraction: extracts requirements (evidence: `backend/app/api.py`)
- Scoring worker → SQLite store: loads and saves (evidence: `backend/app/worker.py`)
- Scoring worker → PDF text extraction: extracts resume text (evidence: `backend/app/worker.py`)
- Scoring worker → Resume review pipeline: reviews resume (evidence: `backend/app/worker.py`)
- Resume review pipeline → Section chunking: chunks text (evidence: `backend/app/pipeline.py`)
- Resume review pipeline → Hybrid retrieval: ranks passages (evidence: `backend/app/pipeline.py`)
- Resume review pipeline → LLM decision: evaluates evidence (evidence: `backend/app/pipeline.py`)
- Resume review pipeline → Weighted scoring: calculates score (evidence: `backend/app/pipeline.py`)
- LLM decision → Local Ollama: queries local model (evidence: `README.md`)
- Hybrid retrieval → Embedding model: embeds passages (evidence: `README.md`)
