Skill detail

resume-pdf

Regenerates a resume PDF from existing markdown but does not build resume content.

MatchPossibleReviewed for resume building
Sourcelix42/portfolioExternal source
Reported installs1Popularity signal only

Inspect before use

Automated review checks relevance, not safety or endorsement. Read the source instructions before using this skill.

Saved source preview

SKILL.md

The saved excerpt is a snapshot from review. The external source remains the complete and most current version.

---
name: resume-pdf
description: Build a styled PDF resume from a markdown source file via headless Chrome. Use when the user wants to regenerate, recreate, or rebuild the resume PDF, update the PDF after editing the resume markdown, or convert a resume .md to .pdf. Default source is resume/Lix-Resume.md -> resume/Lix-Resume.pdf.
---

# Build Resume PDF

Convert a structured resume markdown file into a polished PDF. The pipeline is:
markdown → HTML (`md_to_html.py` + `resume.css`) → PDF (headless Chrome `--print-to-pdf`).

This matches how the original `Lix-Resume.pdf` was produced (headless Chrome / Skia, Helvetica Neue).

## Usage

Run the build script from the repo root:

```bash
.claude/skills/resume-pdf/build-resume.sh resume/Lix-Resume.md resume/Lix-Resume.pdf
```

- Arg 1 (required): input markdown path.
- Arg 2 (optional): output PDF path. Defaults to the input path with `.pdf`.
- `CHROME_BIN` env var overrides Chrome auto-detection.

The script writes the PDF and prints `Built: <path> (<bytes> bytes)`. It uses a temp
directory for the intermediate HTML and cleans it up automatically — no stray files.

## Default paths

- Source: `resume/Lix-Resume.md`
- Output: `resume/Lix-Resume.pdf`

When the user says "rebuild/recreate/regenerate the resume PDF" without specifying paths,
use these defaults.

## Markdown contract

`md_to_html.py` expects this structure (the styling depends on it):

```markdown
# Full Name
- 555-555-5555
- [email protected]
- City, ST 00000
- [linkedin.com/in/handle](https://www.linkedin.com/in/handle/)

## Senior Frontend Engineer        <- FIRST H2 becomes the title line
One-paragraph professional summary.  <- paragraph(s) until the next H2

## Skills                           <- later H2s are section headers
- **Languages:** TypeScript, JavaScript
- **Frameworks:** React, TanStack Query

## Experience
### Company — Role                  <- H3 = a job; split on em/en dash or hyphen
*Mon YYYY – Present*                 <- italic line = the date range (right-aligned)
- Accomplishment bullet.
- Accomplishment bullet.
```

Inline markdown supported anywhere: `**bold**`, `` `code` ``, `[text](url)`.

Rules the parser relies on:
- The **first** `## ` heading is treated as the title/role line, not a section.
- All later `## ` headings are section headers.
- A section containing `### ` entries renders as experience (company/role + dates + bullets).
- A section containing only `- ` items renders as a list (e.g. Skills); a leading
  `**Label:**` is bolded automatically.

## Verifying the result

Headless Chrome output isn't plain-text greppable. To confirm content rendered:

1. Copy the PDF into an MCP-accessible dir if needed (e.g. `~/Downloads`), since the
   PDF Tools extension is sandboxed to Documents/Downloads/Desktop.
2. Use the PDF Tools MCP `read_pdf_content` to spot-check the text, then delete the copy.

Or check page count without rendering:

```bash
strings <output.pdf> | grep -c "/Type /Page$"
```

## Styling changes

Edit `resume.css` to adjust fonts, spacing, margins, or colors. The `@page` rule controls
paper size and margins. Page font is Helvetica Neue to match the original. After any CSS
edit, re-run the build script to regenerate the PDF.
Read the full source on GitHub (opens external page)
Context

Related work