Skill detail
cover-letter
Produces tailored job cover letters from resume and job-description inputs.
Inspect before use
Automated review checks relevance, not safety or endorsement. Read the source instructions before using this skill.
SKILL.md
The saved excerpt is a snapshot from review. The external source remains the complete and most current version.
---
name: cover-letter
description: Generate a polished LaTeX cover letter from a resume, a job description, and applicant info. Produces a PDF with three clearly highlighted sections — About Me, Why <Company>, Why I'd Be a Good Fit. Use when the user asks to "write a cover letter", "apply to <company>", "draft a CL", etc.
---
# Cover Letter
Generate a tailored LaTeX cover letter from three inputs: resume, job description, and applicant contact info. Output is a compiled PDF with three highlighted sections.
## Tooling location
- `~/.claude/skills/cover-letter/template.tex` — LaTeX template with `{{PLACEHOLDERS}}`
- `~/.claude/skills/cover-letter/render.py` — substitutes placeholders, compiles via `latexmk -xelatex`
- `~/.claude/skills/cover-letter/count_tokens.py` — estimates token usage for the run
## How to use this skill
1. **Collect inputs.** Ask the user for whatever isn't already in hand:
- Resume (path to `.tex`, `.md`, `.txt`, or `.pdf`)
- Job description (path or pasted text — save to a temp `.txt` if pasted)
- Company name, role title, hiring manager (if known)
- Applicant name, email, phone, location
- Output directory (default: current working dir)
2. **Read the resume and JD thoroughly.** Extract:
- From resume: title, years of experience, top 3-5 concrete achievements, technical skills that overlap the JD
- From JD: company name, exact role title, top 3 required qualifications, anything distinctive about the company / role / mission
3. **Write the three sections.** First-person, professional register. No corporate-speak boilerplate. Specific over generic. Target lengths:
- **About Me** — 3-5 sentences. Who I am, what I do, why I'm writing.
- **Why \<Company\>** — 3-5 sentences. Something specific about the company / role / product. Not "I admire your innovation."
- **Why I'd Be a Good Fit** — 5-7 sentences. Map 2-3 concrete resume achievements to 2-3 specific JD requirements. Quantify where possible.
4. **Build the data JSON.** Write a JSON file with the substitution values:
```json
{
"name": "Daniel Walsh",
"email": "[email protected]",
"phone": "+1 (438) 336-2382",
"location": "Montreal, QC",
"date": "May 11, 2026",
"company": "Ciena",
"company_address": "Ottawa, ON",
"recipient": "Hiring Manager",
"role": "Analog/Mixed Signal Design Engineer",
"about_me": "First section content...",
"why_company": "Second section content...",
"why_fit": "Third section content...",
"closing": "Sincerely"
}
```
Leave `recipient` as `"Hiring Manager"` if no name is known. `closing` defaults to `"Sincerely"`.
5. **Render the PDF.**
```bash
python3 ~/.claude/skills/cover-letter/render.py data.json --out cover-letter-<company>.pdf
```
The script substitutes into `template.tex`, runs `latexmk -xelatex` in a temp dir, copies the PDF out, and prints a one-line summary.
6. **Report token usage** (optional but recommended):
```bash
python3 ~/.claude/skills/cover-letter/count_tokens.py \
--resume resume.tex --jd jd.txt --output cover-letter-<company>.tex
```
Prints input/output token estimates and API-equivalent cost at current Claude prices.
7. **Optionally chain into `humanize`.** If the user wants to lower the AI-detector score, hand the rendered `.tex` body (or extract the prose) to the `humanize` skill. **Preserve formal first-person register** — cover letters are professional, not casual.
## Section style
- Use **active voice** and concrete verbs ("designed", "led", "shipped"), not passive ("was responsible for").
- **Numbers carry weight.** "Led power electronics for 4 spacecraft programs" beats "extensive aerospace experience."
- **Don't repeat the resume.** The letter should tell the story the resume can't — motivation, judgment, fit.
- **No "I am writing to apply for…"** as the opener. Start with something interesting.
## Gotchas
- The LaTeX template uses `xelatex` Read the full source on GitHub (opens external page)