An ATS-friendly CV/resume generator that renders structured YAML data into HTML and PDF.
One rendering pipeline. Templates control presentation only — data and layout are strictly separated. HTML is the canonical output; PDF is derived from that HTML via headless browser.
# 1. Install dependencies
npm install
# 2. Copy the sample CV and replace with your own information
cp sample-data/cv.yml cv.yml # Windows: copy sample-data\cv.yml cv.yml
# 3. Build your CV
npm run build -- --data cv.ymlOutput: output/cv.html and output/cv.pdf (ATS-compatible — all text is selectable, single-column layout, semantic HTML).
cv.ymlis gitignored — your personal data never gets committed.
# 1. Save the job description as a text file
# Create a jobs/ folder and paste the JD into a .txt file
# e.g. jobs/acme-engineer.txt
# 2. Score your CV against the JD
# Shows which bullets and skill categories match JD keywords
npm run tailor jobs/acme-engineer.txt -- --data cv.yml
# 3. (Optional) Create an overlay to tailor your CV for the role
# See sample-data/sample-overlay.yml for the full format
# Save your overlay to jobs/acme-engineer-overlay.yml
# 4. Build your tailored CV
npm run build -- --data cv.yml --overlay jobs/acme-engineer-overlay.ymlOutput is always written to output/cv.pdf and output/cv.html.
jobs/is gitignored — your applications stay private.
cv.yml (your data)
+ optional overlay.yml (job-specific tailoring)
--> src/generate.js
--> templates/default.html (Handlebars)
--> output/cv.html (ATS-optimized)
--> output/cv.pdf (Puppeteer → A4)
now-cv/
src/
generate.js # Main build script — reads YAML, renders HTML, generates PDF
tailor.js # Keyword analysis tool — scores CV content against a job description
templates/
default.html # Handlebars HTML template (ATS-compliant, single-column)
scripts/
sync-agent-files.js # Optional — syncs CLAUDE.md/AGENTS.md from MASTER.md
sample-data/
cv.yml # Sample CV with placeholder data — use as a starting point
sample-job-description.txt # Example job description for testing tailor.js
sample-overlay.yml # Example overlay showing how to tailor a CV
package.json
LICENSE # MIT
| Command | Description |
|---|---|
npm run build |
Generate CV from default data (sample-data/cv.yml) |
npm run build -- --data cv.yml |
Generate CV from your own data file |
npm run build -- --overlay jobs/myjd-overlay.yml |
Build with a job-specific overlay |
npm run build -- --html-only |
Generate HTML only (skip PDF) |
npm run tailor sample-data/sample-job-description.txt |
Score CV against a JD |
npm run tailor my-jd.txt --data cv.yml |
Score your CV against a JD |
Your CV is defined in a single YAML file. Every section is an ordered array. Dates are structured { year, month } — never free text.
CV
meta.sections[] # ordered, togglable section keys
personal # name, headline, email, phone, location, links[], summary
experience[] # company, role, location, start/end dates, bullets[]
education[] # institution, degree, field, dates
skills[] # category + items[] (plain strings)
certifications[] # title, issuer, date
projects[] # name, description, stack[], url, dates
Bullet points use markdown. Skill items and stack tags are plain strings. Templates own all formatting decisions.
- Run
npm run tailor <job-description.txt>to score your CV against the JD - Create an overlay YAML file with your customizations
- Run
npm run build -- --overlay <your-overlay.yml>
An overlay modifies the base CV at render time — it never changes your master data:
- Change the headline and summary
- Reorder sections and skill categories
- Reorder bullets within each role
- Rephrase bullets to adopt JD terminology
- Exclude skills, certifications, education entries, or experience
See sample-data/sample-overlay.yml for a complete example.
All templates must pass ATS parsing. Key rules:
- All content is real DOM text (no images, SVG, or canvas for text)
- Single-column layout only (ATS reads left-to-right, not multi-column)
- Semantic HTML:
<h1>for name,<h2>for section headers,<time>for dates - PDF generated via browser print-to-PDF (selectable text, not rasterized)
- No non-ASCII punctuation
- Copy
templates/default.htmland modify the HTML/CSS - Point the build at your template:
npm run build -- --template templates/my-theme.html
- Your template receives the full CV data object and owns all formatting
CLAUDE.md and AGENTS.md are included in this repo. When you open this project in an AI-assisted editor, the agent will automatically read these files and follow the workflow below — no prompting needed.
What the AI does when you paste a JD:
- Screens first — reads your
cv.ymland rates the fit as Tier A / B / C before touching anything - Reports across three lenses — ATS keyword scan, recruiter 6-second pass, hiring manager view
- Flags gaps — structural (hard to fix) vs fixable (missing keyword, weak bullet)
- Generates only if the fit is strong enough — or waits for your explicit go-ahead on Tier B/C
- Builds the tailored CV — writes an overlay, runs the build, outputs
output/cv.pdf
To use it:
# Open Claude Code in this project
claude .
# Then just paste the job description and say something like:
# "Here's a JD I want to apply for: <paste JD>"
# The AI handles screening, overlay generation, and build automatically.- Node.js 18+
- Puppeteer (installed automatically as a dependency — downloads Chromium)
MIT — see LICENSE for details.
This software is provided "as is" without warranty of any kind. The author is not responsible for any outcomes arising from its use, including but not limited to inaccuracies in generated documents, employment decisions, or legal issues. Users are solely responsible for the content of their CVs and compliance with applicable laws.
See CONTRIBUTING.md for guidelines on pull requests, coding conventions, and the contributor license agreement.