# How the Career-Ops Cover Letter Generator Uses Keyword Mirroring for Personalized Applications

> Discover how the Career-Ops cover letter generator uses keyword mirroring to create ATS-optimized, personalized applications by matching your CV to job descriptions.

- Repository: [Santiago Fernández de Valderrama/career-ops](https://github.com/santifer/career-ops)
- Tags: deep-dive
- Published: 2026-07-03

---

**The cover letter generator in santifer/career-ops extracts 8-10 exact phrases from job descriptions and mirrors them around your existing CV achievements—without altering metrics—to create ATS-optimized, personalized cover letters.**

The **santifer/career-ops** repository provides a structured workflow for generating job application materials through a disciplined **keyword mirroring** process. Unlike generic templates that simply swap company names, this system analyzes the exact vocabulary used in job descriptions (JD) and strategically weaves those phrases into your authentic experience narrative. The result is a cover letter that satisfies applicant tracking systems (ATS) while reading naturally to human recruiters.

## What Is Keyword Mirroring in Career-Ops?

Keyword mirroring is the practice of extracting specific terminology from a job posting and reflecting it back in your application materials. In [`modes/cover.md`](https://github.com/santifer/career-ops/blob/main/modes/cover.md), the generator implements this through a strict **vocabulary-only** approach—mirroring exact wording around your selected CV bullets without ever modifying the underlying metrics or achievements.

## The 6-Step Keyword Mirroring Pipeline

The cover letter generator follows a mandatory sequence defined in [`modes/cover.md`](https://github.com/santifer/career-ops/blob/main/modes/cover.md) that ensures every mirrored keyword serves a specific purpose.

### JD Validation (Step 0)

Before any extraction occurs, the system confirms a job description is present. This gate ensures the subsequent mirroring has a concrete source of keywords rather than generic industry terms.

### Keyword Extraction (Step 4)

The parser identifies **8-10 exact phrases** from the JD, categorizing them into:

- **ATS-critical**: Technical titles, tool names, and methodologies that screening software scans for
- **Human-trust signals**: Action verbs, product nouns, and outcome language that demonstrate you read the posting

The extracted list displays to the user for confirmation before drafting begins, preventing off-target terminology from entering your letter.

### Application Rules and Constraints

Once keywords are locked, the generator enforces strict mirroring rules in [`modes/cover.md`](https://github.com/santifer/career-ops/blob/main/modes/cover.md):

- **Vocabulary only**: Exact wording injects **around** CV bullets, never inside metric numbers
- **Natural fit**: Keywords must flow fluidly; awkward matches are flagged for manual review
- **One-time use**: Each keyword appears at most once to avoid stuffing
- **Scope limitation**: Mirroring applies only to the opening paragraph, profile intro, and achievement bullets—**not** to the "why-this-role" or closing sections

These constraints preserve your authentic narrative while ticking ATS boxes.

### Achievement Selection (Step 7)

The system selects four to five bullets directly from [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) (or [`article-digest.md`](https://github.com/santifer/career-ops/blob/main/article-digest.md) for supplemental metrics). These achievements are then **re-phrased with JD keywords inserted around the original phrasing**, ensuring metrics remain untouched and verifiable.

### Draft Generation (Step 8)

The final letter assembles in chat, respecting your chosen tone (formal, direct, conversational, or "mirror the JD"). Because keywords are already woven into the draft, the letter demonstrates **keyword mirroring** without artificial density. Users review the draft before PDF generation.

### PDF Production (Step 9)

Upon approval, the payload—including mirrored keywords—passes to `generate-cover-letter.mjs`. This script reuses the same HTML + Playwright pipeline defined in [`modes/pdf.md`](https://github.com/santifer/career-ops/blob/main/modes/pdf.md) that powers the CV generator, yielding an A4 PDF that retains keyword-rich content for ATS parsing while preserving human-readable styling.

## Code Implementation: From JD to PDF

To initiate the keyword mirroring workflow:

```bash

# Start from a saved JD using slug mode

/career-ops cover 042-company-role

# Or start fresh with a new JD

/career-ops cover

```

After Step 4, the system displays extracted keywords for confirmation:

```text
Keywords I'll mirror from the JD:

ATS‑critical:
  • "data pipelines"
  • "Kubernetes"

Language signals:
  • "drive performance"
  • "collaborate across teams"

Anything missing or wrong? (user confirms)

```

The rephrased achievements maintain your original metrics while incorporating the mirrored vocabulary:

```markdown
• **Built**, data pipelines that processed >10 TB/day, improving throughput by 45%.

```

Finally, the payload JSON passed to `generate-cover-letter.mjs` contains the mirrored content:

```json
{
  "letter": {
    "role_title": "Senior Data Engineer",
    "company": "Acme Corp",
    "achievements": [
      { "lead": "Built", "impact": "data pipelines that processed >10 TB/day, improving throughput by 45%" }
    ],
    "opening": "I'm excited to bring my experience in building data pipelines to Acme's mission-driven team."
  }
}

```

The PDF generator processes this payload:

```bash
node generate-cover-letter.mjs --payload /tmp/cover-payload-acme.json

```

## Summary

- **Keyword mirroring** in santifer/career-ops extracts 8-10 exact phrases from job descriptions without altering your CV metrics
- The workflow in [`modes/cover.md`](https://github.com/santifer/career-ops/blob/main/modes/cover.md) enforces **vocabulary-only** substitution, **one-time use** per keyword, and **scope limitations** to prevent stuffing
- **ATS-critical** terms and **human-trust signals** are categorized and user-confirmed before drafting
- Achievements are selected from [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) or [`article-digest.md`](https://github.com/santifer/career-ops/blob/main/article-digest.md) and rephrased with mirrored keywords around original metrics
- Final output is generated via `generate-cover-letter.mjs` using the HTML + Playwright pipeline shared with the CV generator

## Frequently Asked Questions

### Does keyword mirroring change my actual achievements or metrics?

No. According to the application rules in [`modes/cover.md`](https://github.com/santifer/career-ops/blob/main/modes/cover.md), the system applies **vocabulary-only** mirroring. Keywords are inserted around your selected CV bullets—modifying the surrounding language—but your original metrics, percentages, and quantitative impacts remain completely untouched.

### How does the generator prevent keyword stuffing?

The system enforces three specific constraints: each keyword may be used **at most once**, only **8-10 exact phrases** are extracted from the JD, and mirroring is limited to specific sections (opening paragraph, profile intro, and achievement bullets). The "why-this-role" and closing sections remain free of mirrored terms to ensure natural flow.

### Can I review the keywords before they are used in my cover letter?

Yes. After Step 4 completes in [`modes/cover.md`](https://github.com/santifer/career-ops/blob/main/modes/cover.md), the generator displays the extracted **ATS-critical** and **human-trust signal** keywords for your confirmation. You can flag missing terms or remove inappropriate matches before the drafting phase begins, ensuring the final letter reflects accurate terminology.

### What files are involved in generating the final PDF?

The process involves [`modes/cover.md`](https://github.com/santifer/career-ops/blob/main/modes/cover.md) (workflow logic), [`cv.md`](https://github.com/santifer/career-ops/blob/main/cv.md) or [`article-digest.md`](https://github.com/santifer/career-ops/blob/main/article-digest.md) (source achievements), and `generate-cover-letter.mjs` (PDF generation). The PDF engine reuses the HTML + Playwright pipeline defined in [`modes/pdf.md`](https://github.com/santifer/career-ops/blob/main/modes/pdf.md), ensuring consistent styling between your CV and cover letter outputs.