← StafFixHR home

AI resume parsing & JD matching

Extract structured candidate profiles from resumes and rank applicants against the job spec.

How to use

  1. Open a job in /admin/recruitment.
  2. Click Parse all resumes — every unparsed application is scored against the JD.
  3. Each application now shows a 0-100 match score + skill match breakdown.
  4. Sort the application list by score to surface the top 10% in seconds.
  5. 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.