resume-rendering · git:20261024.48dd9f7 · 2026-10-24 · sha256 8d443630004d4e61

resume-rendering git:20261024.48dd9f7A

Immutable. This exact content never changes and is served at /api/v1/blob/8d443630004d4e61.

---
name: resume-rendering
title: "ATS-Friendly Resume PDF: Typeset Resumes with RenderCV"
description: "ATS-friendly resume PDF builder that ships the file, not just the text: the tailored resume as RenderCV YAML, typeset to a clean single-column PDF with an ATS-safe theme (plain-text links, no icon fonts, no header note), paper size by market, a page-count check, a text-layer check that shows what an applicant tracking system will parse, a DOCX twin for portals that want Word, and a matching cover-letter PDF. Use whenever a resume or CV has to be delivered as a PDF or Word file."
license: Apache-2.0
compatibility: "Requires: rendercv (installed with uv), poppler-utils; doc-export with pandoc and typst for the DOCX twin and cover letter. macOS/Linux."
capabilities: shell resume-render documents
domains: coach
rules:
  - session(resume)
  - content(rendercv)
  - match(\b(resume|cv|curriculum vitae)\s+(pdf|docx|word|file|template|format)\b)
  - semantic(make my resume into a pdf)
  - semantic(give me the tailored resume as a word document too)
---

## Overview

A tailored resume only helps once it is a file that parses cleanly and looks professional. This skill turns the tailored content into a typeset PDF with RenderCV, checks it the way an applicant tracking system reads it, and produces the Word twin and cover letter some portals ask for. It replaces hand-made HTML-to-PDF conversions and two-column templates whose text comes out scrambled.

## Mental model

- Content and design are separate. The candidate's facts live in `cv.sections` of a YAML file; the look lives in the `design:` block. Tailoring changes the content; the design stays fixed.
- The parser reads the text layer, not the picture. A resume is checked by extracting its text and reading it top to bottom.
- One source, three files: `<Name>_Resume.pdf`, the same content as `.docx`, and the cover letter as PDF.

## Rules

### Build the YAML

Start once with `rendercv new "Full Name" --theme engineeringresumes`, then replace the sample content. Structure:

```yaml
cv:
  name: Jane Doe
  location: Berlin, Germany
  email: jane@example.com
  phone: "+49 30 1234567"
  website: https://janedoe.dev/
  social_networks:
    - network: LinkedIn
      username: janedoe
  sections:
    summary:
      - Backend engineer, 7 years in payments; led the PSD3 migration at a 40-person fintech.
    experience:
      - company: Finly
        position: Senior Backend Engineer
        location: Berlin
        start_date: 2022-03
        end_date: present
        highlights:
          - Cut payment failure rate from 2.1% to 0.6% by redesigning retry logic (Go, Kafka)
    education:
      - institution: TU Munich
        area: Computer Science
        degree: MSc
        start_date: 2014-10
        end_date: 2017-03
    skills:
      - label: Languages
        details: Go, Python, SQL
design:
  theme: engineeringresumes
  page:
    size: a4
    show_top_note: false
    show_footer: false
  header:
    connections:
      show_icons: false
      phone_number_format: international
```

Section titles are free text (`experience`, `Projects`, `Berufserfahrung`); Markdown `**bold**` works inside entries. Dates as `YYYY-MM` or `present`.

### ATS-safe design

| Setting | Value | Why |
|---|---|---|
| `theme` | `engineeringresumes` (alternatives `sb2nov`, `ember`) | Single column, dates next to each entry, links printed as full URLs |
| `header.connections.show_icons` | `false` | Icon fonts put private-use characters into the text layer |
| `page.show_top_note`, `page.show_footer` | `false` | Otherwise "Last updated in ..." becomes the first line parsers read and "Name – 1/2" lands between sections |
| `header.connections.phone_number_format` | `international` for cross-border applications | Prints +49 30 ... instead of a national 030 ... |
| `page.size` | `us-letter` for US/Canada, `a4` elsewhere | Market convention; prints without scaling |
| Photo | Only where the market expects one | See the market's conventions |

Avoid `classic`, `engineeringclassic`, `opal`, `moderncv`, and `ink` for portal submissions: they render social links as bare usernames or icon glyphs, or move dates away from their entries.

### Render and check

```bash
rendercv render Jane_Doe_CV.yaml --pdf-path Jane_Doe_Resume.pdf --markdown-path Jane_Doe_Resume.md -nohtml -nopng
doc-export check Jane_Doe_Resume.pdf --max-pages 2 --text 40
```

Read the text output: name and contact first, then sections in order, each job's title, company, and dates together, no junk characters, no lost bullets. Column layouts can push a date away from its entry, mostly on sparse pages; if any date lands elsewhere (often at the end of the page), switch the theme to `sb2nov` or `ember`, re-render, and re-check. Cut content rather than shrink fonts when the page count is over the market's norm.

### Word twin and cover letter

- DOCX: replace the first line of the generated Markdown (`# Jane Doe's CV`) with `# Jane Doe`, then `doc-export docx Jane_Doe_Resume.md -o Jane_Doe_Resume.docx --font Calibri --size 10.5 --margins 0.75in --paper a4`.
- Cover letter: write `cover-letter.md`, then `doc-export pdf cover-letter.md -o Jane_Doe_Cover_Letter.pdf --font Calibri --size 11 --margins 1in --paper a4 --max-pages 1`.
- File names carry the candidate's name, never "resume_final_v3".

## Examples

### Example 1: icon theme

❌ `theme: classic` with icons on. `pdftotext` shows `` before the email and "janedoe" instead of the LinkedIn URL.

✅ `theme: engineeringresumes`, `show_icons: false`: the text layer starts `Jane Doe | Berlin, Germany | jane@example.com | linkedin.com/in/janedoe`.

### Example 2: two-column template

❌ A two-column HTML template printed to PDF: the parser reads the skills sidebar in the middle of the first job.

✅ RenderCV's single-column theme; the check shows each job's title, company, dates, and bullets together.

## Checklist

- [ ] Content in YAML matches the tailored resume exactly; nothing invented.
- [ ] `engineeringresumes` (or `sb2nov`/`ember`), icons, top note, and footer off, paper size for the market.
- [ ] `doc-export check` clean: within the page count, no private-use glyphs, text in reading order.
- [ ] DOCX twin when a portal or recruiter wants Word; cover letter PDF in the same style.
- [ ] Files named `<First>_<Last>_Resume.pdf` / `.docx` / `_Cover_Letter.pdf` and saved next to the YAML source.

## Composition / References

- `ats-optimization` — what goes into the content and how it is tailored.
- `resume-conventions` — market rules: length, photo, personal data, date formats.
- `document-export` — the DOCX and cover-letter exports and the PDF check.
- [RenderCV documentation](https://docs.rendercv.com)