Batch Ats Resume Screening: Score, Fix, and Rebuild It Against the Job (Free, On-Device)
Batch Score & Diagnose with Local LLMs
Install Ollama (ollama pull llama3.1:8b or phi3:mini for 4GB RAM). Create a prompt template that extracts: required skills (must-have), preferred skills (nice-to-have), experience years, certifications, and keyword density targets from the JD. Feed each resume through a structured JSON output schema: {"score": 0-100, "matched_required": [], "missing_required": [], "matched_preferred": [], "keyword_gaps": [], "format_issues": []}. Run batch via CLI loop: for f in resumes/*.pdf; do ollama run llama3.1:8b "$(cat prompt.txt | sed "s|{RESUME}|$(pdftotext $f -)|" | sed "s|{JD}|$(cat jd.txt)|")" --format json > "scored/$(basename $f .pdf).json"; done. Filter score < 70 or missing_required.length > 0 for rebuild queue. Use jq to aggregate missing keywords across the batch—those are your JD alignment gaps.
Fix & Rebuild Programmatically
For each flagged resume, run a second pass with a rewrite prompt: "Rewrite only bullet points to incorporate missing required keywords naturally. Preserve all facts, metrics, dates, and employer names. Output full resume in Markdown." Parse the Markdown with Pandoc to DOCX (pandoc resume.md -o resume_fixed.docx --reference-doc=ats_template.docx). Your ats_template.docx must use standard heading styles (Heading 1/2), no tables, no columns, no graphics, Calibri 11pt, 0.5" margins. Validate each rebuild with a local ATS simulator: python -m ats_simulator resume_fixed.docx jd.txt (open-source: pyats or resume-parser). Require keyword_coverage >= 90% on required, >= 60% on preferred, zero parsing errors. Commit original + fixed + score JSON to Git for audit trail. Schedule weekly re-score against updated JDs.
Try it free →