Architecture
Five stages. Each is independent, testable, and replaceable.
1. PDF → Markdown
pymupdf_rag.py and pdf.py turn PDF pages into Markdown using PyMuPDF. Headings, links, tables — everything survives.
2. Markdown → JSON
pdf.py sends each section (work, education, skills, etc.) to the LLM via Jinja templates in prompts/templates/. Results assemble into a typed JSONResume object.
3. GitHub enrichment
github.py finds the candidate's GitHub handle, fetches profile and repos, classifies projects, and asks the LLM to pick the 7 most meaningful ones.
4. Evaluation
evaluator.py scores across four axes — open source, personal projects, production experience, technical skills — with bonus marks, deductions, and cited evidence.
5. Output
score.py prints a readable summary. With DEVELOPMENT_MODE=True it also caches results and appends to resume_evaluations.csv.
Key modules
| Module | Role |
|---|---|
models.py |
Pydantic schemas + LLM provider interfaces |
llm_utils.py |
Provider init + response cleanup |
transform.py |
Normalises LLM JSON to JSON Resume format |
prompt.py |
Routes to the right prompt templates |
prompts/ |
All Jinja templates for extraction + scoring |
config.py |
Dev mode toggle (caching + CSV) |