Summary
The resume tooling has a Gemini-based /analyze endpoint, but it needs a PDF upload, calls an external API (rate-limited), and is non-deterministic. There's no quick, free way for a user to sanity-check "does my resume cover this job description?"
Proposal
Add POST /api/resume/ats-match — takes { resumeText, jobDescription } and returns a deterministic ATS-style keyword-overlap score (0–100) plus matched / missing keyword lists. No AI, no file upload — instant and free.
- Keyword extraction is a pure helper (
utils/atsKeywordMatch.js), unit-testable, and keeps tech tokens like c++, c#, node.js intact.
- The JD drives the keyword set;
matched = JD keywords present in the resume, missing = the rest.
Acceptance criteria
Contributing as part of Elite Coders Summer of Code (ECSoC 2026).
Summary
The resume tooling has a Gemini-based
/analyzeendpoint, but it needs a PDF upload, calls an external API (rate-limited), and is non-deterministic. There's no quick, free way for a user to sanity-check "does my resume cover this job description?"Proposal
Add
POST /api/resume/ats-match— takes{ resumeText, jobDescription }and returns a deterministic ATS-style keyword-overlapscore(0–100) plusmatched/missingkeyword lists. No AI, no file upload — instant and free.utils/atsKeywordMatch.js), unit-testable, and keeps tech tokens likec++,c#,node.jsintact.matched= JD keywords present in the resume,missing= the rest.Acceptance criteria
POST /api/resume/ats-matchreturns{ score, matched, missing, totalKeywords }Contributing as part of Elite Coders Summer of Code (ECSoC 2026).