| name | resume-generator |
| description | Generate polished resume HTML or PDF from a PDF resume, scanned PDF with optional LiteParse OCR, Markdown resume, natural-language background description, existing ResumeData JSON, or Magic Resume template output. Use when the user wants PDF to ResumeData to PDF, Markdown to ResumeData to PDF, background text to ResumeData to PDF, optional OCR through LiteParse, template selection, A4 or Letter layout, spacing/font controls, or styles including swiss-single, swiss-two-column, modern, modern-two-column, latex, clean, vivid, magic-classic, magic-modern, magic-left-right, magic-timeline, magic-minimalist, magic-elegant, magic-creative, and magic-editorial. |
Resume Generator
Overview
Use this skill to create print-ready resume HTML/PDF while preserving a structured ResumeData JSON middle layer. The bundled scripts are standalone: they do not require the Resume Matcher FastAPI app, SQLite database, or Next.js frontend.
Supported input paths:
- PDF resume -> LiteParse text -> ResumeData JSON -> HTML/PDF
- scanned PDF resume -> LiteParse OCR text -> ResumeData JSON -> HTML/PDF
- Markdown resume -> ResumeData JSON -> HTML/PDF
- personal background text -> ResumeData JSON -> HTML/PDF
- existing ResumeData JSON -> HTML/PDF
- existing ResumeData JSON -> Magic ResumeData -> Magic Resume template PDF
Always keep extraction truthful. Do not invent personal information, employers, schools, dates, certifications, skills, awards, or metrics. If the source lacks a field, keep it empty or use the exact sparse source text as a conservative summary.
Do not write meta-notes or placeholders into the resume body. If a QR code, portfolio marker, unreadable image, or missing link cannot be rendered faithfully, omit it and explain that limitation only in the chat response.
Quick Start
For PDF, Markdown, or background text input, use the unified entry script:
node /Users/kaybee/.codex/skills/resume-generator/scripts/generate_resume_pdf.mjs /path/to/resume.md /path/to/resume.pdf --template clean
Write the normalized intermediate JSON when the user wants to inspect or edit it:
node /Users/kaybee/.codex/skills/resume-generator/scripts/generate_resume_pdf.mjs /path/to/resume.md /path/to/resume.pdf --template clean --json /path/to/resume-data.json
For a scanned/image-only PDF, request OCR explicitly and save the OCR text for review:
node /Users/kaybee/.codex/skills/resume-generator/scripts/generate_resume_pdf.mjs /path/to/scanned-resume.pdf /path/to/resume.pdf --template swiss-single --ocr auto --ocr-language chi_sim+eng --text-output /path/to/resume.ocr.txt --json /path/to/resume-data.json
Render an existing ResumeData JSON directly with the original renderer:
node /Users/kaybee/.codex/skills/resume-generator/scripts/render_resume_pdf.mjs /path/to/resume-data.json /path/to/resume.pdf --template swiss-single
Render with Magic Resume templates by using the magic-* aliases:
node /Users/kaybee/.codex/skills/resume-generator/scripts/generate_resume_pdf.mjs /path/to/resume.md /path/to/resume.pdf --template magic-modern --json /path/to/resume-data.json --locale zh
node /Users/kaybee/.codex/skills/resume-generator/scripts/render_resume_pdf.mjs /path/to/resume-data.json /path/to/resume.pdf --template-engine magic --template modern --locale zh
Emit inspectable HTML instead of, or alongside, PDF:
node /Users/kaybee/.codex/skills/resume-generator/scripts/generate_resume_pdf.mjs /path/to/resume.md /path/to/resume.html --template modern
node /Users/kaybee/.codex/skills/resume-generator/scripts/render_resume_pdf.mjs /path/to/resume-data.json /path/to/resume.pdf --template modern --html /path/to/resume.html
Input Workflows
PDF Resume
node /Users/kaybee/.codex/skills/resume-generator/scripts/generate_resume_pdf.mjs /path/to/resume.pdf /path/to/output.pdf --template swiss-two-column --json /path/to/output.json
The PDF path uses scripts/extract_resume_text.py, which calls the LiteParse Python package. LiteParse handles both PDF text extraction and OCR routing through its local PDFium/Tesseract pipeline. If liteparse is not installed, stop and ask the user to install it with pip install liteparse; do not generate a blank resume.
OCR is opt-in:
node /Users/kaybee/.codex/skills/resume-generator/scripts/generate_resume_pdf.mjs /path/to/scanned-resume.pdf /path/to/output.pdf --template swiss-single --ocr auto --ocr-language chi_sim+eng --text-output /path/to/output.ocr.txt --json /path/to/output.json
OCR modes:
--ocr none: default; use LiteParse with OCR disabled. Scanned/image-only PDFs fail clearly.
--ocr auto: let LiteParse OCR pages that need OCR.
--ocr lit and --ocr tesseract: deprecated compatibility values; use --ocr auto.
For Chinese resumes, pass --ocr-language chi_sim+eng and verify the saved --text-output file before trusting the generated ResumeData.
Markdown Resume
node /Users/kaybee/.codex/skills/resume-generator/scripts/generate_resume_pdf.mjs /Users/kaybee/.codex/skills/resume-generator/assets/sample-resume.md /private/tmp/resume-from-md.pdf --template clean
Use headings such as Summary, Work Experience, Education, Projects, Skills, Languages, Certifications, and Awards. Item headings are most reliable in this form:
### Title | Company | Location | Jan 2022 - Present
- Source-backed bullet
Background Description
node /Users/kaybee/.codex/skills/resume-generator/scripts/generate_resume_pdf.mjs --text-file /Users/kaybee/.codex/skills/resume-generator/assets/sample-background.txt /private/tmp/resume-from-text.pdf --template modern
Inline text is also supported:
node /Users/kaybee/.codex/skills/resume-generator/scripts/generate_resume_pdf.mjs --text "Name: Riley Patel
Title: Operations Analyst
Skills: SQL, Excel" /private/tmp/resume-from-text.pdf --template clean
Prefer labeled fields (Name:, Title:, Email:, Location:, Summary:, Skills:). For unlabeled background text, keep the original text as a conservative summary and leave unsupported sections empty.
Existing ResumeData JSON
node /Users/kaybee/.codex/skills/resume-generator/scripts/render_resume_pdf.mjs /Users/kaybee/.codex/skills/resume-generator/assets/sample-resume.json /private/tmp/resume-from-json.pdf --template vivid
This direct JSON path is the compatibility path from V1 and must remain stable.
Supported Templates
Use --template with one of:
swiss-single: dense single-column Swiss resume.
swiss-two-column: 65/35 layout with skills and education in a sidebar.
modern: single-column with accent headers.
modern-two-column: two-column layout with accent sidebar/rule.
latex: serif, compact academic layout with ruled section headings.
clean: understated sans layout with generous whitespace.
vivid: colorful two-column layout with accent bands and arrow bullets.
magic-classic: Magic Resume classic template.
magic-modern: Magic Resume modern sidebar template.
magic-left-right: Magic Resume left-right template.
magic-timeline: Magic Resume timeline template.
magic-minimalist: Magic Resume minimalist template.
magic-elegant: Magic Resume elegant template.
magic-creative: Magic Resume creative template.
magic-editorial: Magic Resume editorial template.
Default to swiss-single when the user does not specify a style. Use latex for academic/classic requests, clean for minimal requests, modern or vivid for more expressive resumes, and two-column variants when content is dense.
Use magic-* templates when the user asks for Magic Resume styles or names one of those templates. Magic Resume templates currently output PDF only; use native templates when the user needs HTML.
Options
Common renderer options:
--template swiss-single|swiss-two-column|modern|modern-two-column|latex|clean|vivid|magic-classic|magic-modern|magic-left-right|magic-timeline|magic-minimalist|magic-elegant|magic-creative|magic-editorial
--template-engine native|magic
--locale zh|en
--page-size A4|LETTER
--margin-top 10 --margin-right 10 --margin-bottom 10 --margin-left 10
--section-spacing 3 --item-spacing 2 --line-height 3
--font-size 3 --header-scale 3
--header-font serif|sans-serif|mono
--body-font serif|sans-serif|mono
--compact
--show-contact-icons
--accent-color blue|green|orange|red
--html output.html
generate_resume_pdf.mjs also supports:
--text "background description"
--text-file background.txt
--text-output extracted-or-liteparse-ocr-text.txt
--ocr none|auto
--ocr-language eng|chi_sim+eng
--json normalized-resume-data.json
Spacing, line-height, font-size, and header-scale are 1-5 levels. Margins are millimeters.
References
- Read
references/resume-data-schema.md when preparing or validating ResumeData.
- Read
references/input-normalization.md when parsing PDF, Markdown, or background text sources.
- Read
references/v2-roadmap.md only for remaining future work such as JD tailoring.
Quality Checks
After generating a resume, verify that:
- the PDF or HTML file exists and is non-empty
- the selected template name is valid
- parsed input produced ResumeData JSON before rendering
- personal/contact fields are not invented
- hidden sections are omitted
- generated resume body does not contain placeholders such as "QR code missing", "portfolio link later", "作品集待补充", or "无法展示"
- PDF input with no extractable text fails clearly instead of producing a blank resume
- OCR input writes reviewable text with
--text-output and does not invent content beyond OCR text
- long content does not visibly overflow; if it does, rerun with
--compact, smaller margins, a two-column template, or --font-size 2
- Magic
modern output keeps long company names fully visible; positions render on the next line by default