AI resume parsing & JD matching
Extract structured candidate profiles from resumes and rank applicants against the job spec.
How to use
- Open a job in /admin/recruitment.
- Click Parse all resumes — every unparsed application is scored against the JD.
- Each application now shows a 0-100 match score + skill match breakdown.
- Sort the application list by score to surface the top 10% in seconds.
- If you update the JD (requirements / experience range / skills), click Rescore to refresh scores without re-parsing resumes.
What the parser extracts
- Contact: name, email, phone
- Skills: tech + functional (~60 keywords + AI-extracted in upgrade mode)
- Experience: years of total experience
- Education: degree + institute + year (best-effort)
- Current role and a short summary
How the score is computed
0-100 with three components:
- Skills (up to 70 pts): % of job's required skills that appear in the resume.
- Experience (up to 25 pts): full marks when candidate's years fall in the job's range; penalised below or way-above.
- Presence (up to 5 pts): bonus for valid email, phone, education entry.
Skill source: comma-separated Job.skills field first; if empty, any heuristic-detected skill that also appears in requirements / description.
Two-tier extraction
Heuristic mode (always on): regex + curated 60-word skill bag. Free, instant, ~70% accuracy on text resumes.
Gemini upgrade (when GEMINI_API_KEY is set): structured JSON extraction via Gemini 2.0 Flash. Better at synonyms, niche skills, and free-form education sections. Falls back silently if the API call fails.
Limitations
- PDF text extraction is best-effort — text-PDFs work, scanned/image-only PDFs don't until an OCR pass is added.
- For non-text resumes, paste the text via the "Parse with pasted text" option.
- Match scoring is deterministic on the inputs — same JD + same resume = same score every run. Useful for audit / bias review.