Cv builder
Use this skill to build a tailored, ATS-friendly CV as a 1-page or 2-page PDF using Pandoc and WeasyPrint. Trigger whenever someone wants to: create or update a CV/resume targeting a specific job or company, convert their work history into a polished PDF, customize their CV for a specific role, or generate a 1-pager or 2-pager from existing source materials. Also trigger when the user says 'apply for a job', 'tailor my resume', 'create my CV for [company]', or 'update my CV' — even if they don't mention PDF format explicitly.From its SKILL.md
npx -y skills add berkaybuharali/cv-builderAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.5 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it
CV Builder
Opinionated CV generation workflow: source materials → structured profile → job-tailored Markdown → PDF.
Dependencies
- Pandoc — pandoc.org/installing
- WeasyPrint —
pip install weasyprint(all platforms; see weasyprint docs for system dependencies)
IBM Plex Sans font — download from Google Fonts, place .ttf files in styles/fonts/:
IBMPlexSans-Regular.ttf, IBMPlexSans-Medium.ttf, IBMPlexSans-SemiBold.ttf, IBMPlexSans-Bold.ttf, IBMPlexSans-Italic.ttf
Project Structure
Scaffold once in the working directory:
sources/
cv_or_resume.* # existing CV (PDF, DOCX, or text)
linkedin_profile.pdf # LinkedIn export
notes.md # freeform notes — wins on any conflict
job_description.md # target JD, swapped per application
data/
profile.json # canonical profile (generated)
jd_analysis.json # per-application JD analysis (generated)
styles/
cv-onepage.css
cv-twopage.css
fonts/
scripts/
build_onepager.sh # see scripts/ in this skill
build_twopager.sh
Workflow
First: ask the user — 1-pager, 2-pager, or both?
Step 1 — Ingest & Profile
Read all files in sources/. notes.md overrides everything else on conflicts.
Extract data/profile.json:
{
"personal": { "name": "", "title": "", "email": "", "linkedin": "", "location": "" },
"experience": [{
"company": "", "company_context": "", "title": "",
"period": { "start": "MMM YYYY", "end": "MMM YYYY or Present" },
"location": "", "bullets": []
}],
"education": [{ "degree": "", "institution": "", "year": "" }],
"certifications": [{ "name": "", "issuer": "", "year": "" }],
"languages": []
}
Never invent data. Mark unknowns as "MISSING". Ask one clarifying question at a time.
Step 2 — JD Analysis
Read sources/job_description.md. Extract data/jd_analysis.json:
{
"company": "", "role_title": "",
"hard_skill_keywords": [],
"matching_candidate_strengths": [],
"missing_or_weak_matches": [],
"why_this_role_draft": ""
}
why_this_role_draft: ≤400 chars, no pronouns, ties 2–3 strengths to JD keywords.
Step 3 — Generate cv-{COMPANY}.md
Only Why This Role changes per application. Everything else is constant.
Sections in order:
- Name + title + contact
- Value Proposition (5–6 bullets, no pronouns, include any notable awards/certifications)
- Why This Role (≤400 chars, inside
.why-this-rolediv) - Experience (reverse chronological)
- Competency Matrix (EXPERT / PROFICIENT / FAMILIAR)
- Education
- Certifications
- Languages
Experience block format:
### [Title] | [Company] | [Period] | [Location]
*[One-line context: sector, team size, scale — no client-per-bullet attribution]*
- Action verb + what + metric/result
*[Sub-section italic label if grouping needed]:*
- ...
Competency Matrix format:
::: {.competency-matrix}
::: {.matrix-row}
::: {.matrix-label}
EXPERT
:::
::: {.matrix-items}
GCP (...), Kubernetes, Terraform, ...
:::
:::
... repeat for PROFICIENT, FAMILIAR ...
:::
Why This Role box:
::: {.why-this-role}
**WHY THIS ROLE**
[text, ≤400 chars]
:::
Step 4 — Approval Gate ⛔
Stop. Show the Markdown. Wait for explicit approval before building any PDF.
Iterate on content until approved. Do not run the build scripts without approval.
Step 5 — Build PDF
Generate CSS files (see references/css.md) and build scripts (see scripts/), then run:
bash scripts/build_onepager.sh {COMPANY} # for 1-pager
bash scripts/build_twopager.sh {COMPANY} # for 2-pager
Check page count:
# macOS
mdls -name kMDItemNumberOfPages cv-onepager-{COMPANY}-latest.pdf
# Linux / Windows (requires poppler-utils)
pdfinfo cv-onepager-{COMPANY}-latest.pdf | grep Pages
If page count is wrong, adjust CSS spacing — reduce margin-top on h2/h3 and margin-bottom on li first, before touching font size. Hard floor: 8.5pt for 1-pager, 9pt for 2-pager.
Rules
- No personal pronouns (I, my, me, we, our)
- No banned phrases: passionate, leveraged, spearheaded, dynamic, synergy, results-driven, detail-oriented, thought leader, cutting-edge, streamlined, robust, innovative, transformative, proactive
- Why This Role ≤400 characters (count exactly)
- All bullets start with action verbs
- Company context line on every detailed role
- No photo, no date of birth, no nationality
notes.mdalways wins on conflicts
ATS Check (before PDF)
- ≥70% of top-10 JD hard skills in CV
- Why This Role ≤400 chars
- No banned phrases, no personal pronouns
- All bullets start with action verbs
Per-application update
Only regenerate the Why This Role block. Re-run ATS check. Rebuild PDF.
Reference Files
references/css.md— Full CSS for both layouts with tuned values
What ships with it: 6 files
13.2 KB alongside SKILL.md, 2 of them executable
references/
- css.md7.7 KB
scripts/
- build_onepager.shruns540 B
- build_twopager.shruns540 B
- .gitignore143 B
- LICENSE.txt1.0 KB
- README.md3.2 KB
Gives 0 of the 12 instructions most hr recruiting skills give in ~1.3k tokens
Counted across 356 of the 357 authors here whose files we hold, read 2026-08-07
- Quantify achievements with specific metricsin 14 of 356, across 6 files
- Keep the resume under two pagesin 14 of 356, across 6 files
- Request the full job description if not providedin 12 of 356, across 4 files
- Extract keywords and prioritize job requirementsin 12 of 356, across 4 files
- Stop and ask for clarification if required inputs are missingin 12 of 356, across 5 files
- Map candidate experience to job requirementsin 11 of 356, across 3 files
- Ask if the user wants adjustmentsin 11 of 356, across 3 files
- Provide strengths and gap analysis after the resumein 10 of 356, across 2 files
- Request candidate background details if not providedin 10 of 356, across 2 files
- Format experience bullets as action verb plus resultin 10 of 356, across 2 files
- Ask for missing inputs before startingin 10 of 356, across 9 files
- Use exact job description terminologyin 9 of 356, across 1 file
Said here and by no other author read
- ask user for one-pager two-pager or both
- use notes.md to override conflicting data
- keep why this role under 400 characters
- stop and show markdown for explicit approval
- do not build pdf without explicit approval
- check pdf page count after generation
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.