Quick start
Install the VeriWorkly ATS Engine, score pasted text, add a job description, read a PDF in Node, and know which part of the report to read first.
This page takes a resume from text to a report in a few minutes. You need Node 22.12 or later.
Install
npm install @veriworkly/ats-engineThe package is ESM only. To read PDF and DOCX files on Node, also install the optional peers: pdf-parse@2, [email protected] and mammoth.
npm install pdf-parse@2 [email protected] mammothScore pasted text
check takes resume text and returns a report. It scores with DEFAULT_POLICY, the community policy. The CLI and MCP server also attach the built-in language and region packs; to match them, pass withLocales(DEFAULT_POLICY, BUILT_IN_LOCALES) from @veriworkly/ats-engine/locales.
import { check, DEFAULT_POLICY } from "@veriworkly/ats-engine";
const report = check(resumeText, DEFAULT_POLICY);
console.log(report.readinessScore);
for (const failed of report.failedChecks) {
console.log(`${failed.severity}: ${failed.evidence}\n Fix: ${failed.fix}`);
}Pasted text has no page, so the layout rules (columns, tables, photo, hidden text, pages with no text layer) are left out of the report rather than guessed. See How a resume is read.
Add a job description
Pass the posting's text as jobDescription. The report gains a job match score, a status for each requirement, and the keywords the resume lacks.
import { check, DEFAULT_POLICY } from "@veriworkly/ats-engine";
const report = check(resumeText, DEFAULT_POLICY, { jobDescription: postingText });
console.log(report.jobMatchScore); // 0-100, or null without a posting
for (const requirement of report.requirements) {
console.log(`[${requirement.status}] ${requirement.text}`);
}
console.log(report.missingKeywordGroups); // { hard: [...], soft: [...] }Read a PDF in Node
readResumeFile reads a file from a path, extracts its text and layout, and returns what check needs. It needs the peers above for PDF and DOCX.
import { check, DEFAULT_POLICY } from "@veriworkly/ats-engine";
import { readResumeFile } from "@veriworkly/ats-engine/node";
const { input, layout, file } = await readResumeFile("resume.pdf");
const report = check(input, DEFAULT_POLICY, { layout, file });
console.log(report.readinessScore);layout switches on the layout rules. file (name, size, format) only feeds the advice and never changes a score. For uploads in a web server, see Files in Node.
Or use the CLI
PDF and DOCX files need the optional readers, which npx does not install on its own, so name them:
npx -p @veriworkly/ats-engine -p pdf-parse@2 -p [email protected] -p mammoth ats-engine check resume.pdfA .txt, .md, .html or .json resume needs none of them:
npx @veriworkly/ats-engine check resume.md --job posting.txtSee CLI for every option.
What to read first
readinessScoreandfailedChecks. Each failed check has aseverity(error,warningorinfo), theevidencethat was found, the points it cost inscoreImpact, and afix.prioritizedFixes: the fixes of the failed checks, costliest first, at most 6.parsingWarnings: the failed checks that stop an ATS reading the file at all.parsed: the name, contact details, roles, education, skills, certifications and languages an ATS would store. An empty employer or a missing date range here is a column a recruiter's filter cannot match.requirementsandmissingKeywordGroups, when you passed a posting.advice, which is never scored.