npm installnpm run build:en && npm run build:frpublic-cv/
├── resumes/
│ ├── en.json
│ └── fr.json
├── .github/
│ └── workflows/
│ └── build-resume.yml
├── .gitignore
└── package.json (for json-resume dependencies)
resumes/us.json is a variant targeted at US applications: one headline role per
entry, impact-led highlights, no address or photo, and the earlier roles folded
into a single line. It is rendered to PDF and published at a stable URL,
https://ndreno.github.io/public-cv/us.pdf, deliberately absent from the
language switcher: it is a target market, not a language. US applications want a
file upload rather than a link, so the usual path is still to attach the PDF.
npm run build:pdf # build/us.pdf, rendered with Typst
npm run ats # ATS readiness gateRendering uses Typst and the unbranded template
in typst/resume.typ.
There is no universal ATS score: Greenhouse, Lever and Workday all parse
differently. scripts/ats-check.mjs checks the two things that are actually
deterministic:
- Parseability, the failure modes that break real parsers: a missing email,
dates that are not
YYYY-MM, a role with no title, an unextractable PDF, or a resume running past three pages. - Keyword coverage against a posting described in
jobs/<role>.json, which lists itsmust_haveandnice_to_haveterms. A missing required term fails the build.
Add a posting by dropping a new file in jobs/. CI checks the resume against all
of them on every change.