Modo: pdf — Generación de PDF ATS-Optimizado
Modo: pdf — Generación de PDF ATS-Optimizado
Pipeline completo
- Lee
cv.mdcomo fuentes de verdad - Pide al usuario el JD si no está en contexto (texto o URL)
- Extrae 15-20 keywords del JD
- Detecta idioma del JD → idioma del CV (EN default)
- Detecta ubicación empresa → formato papel:
- US/Canada →
letter - Resto del mundo →
a4
- US/Canada →
- Detecta arquetipo del rol → adapta framing
- Reescribe Professional Summary inyectando keywords del JD + exit narrative bridge (“Built and sold a business. Now applying systems thinking to [domain del JD].”)
- Selecciona top 3-4 proyectos más relevantes para la oferta
- Reordena bullets de experiencia por relevancia al JD
- Construye competency grid desde requisitos del JD (6-8 keyword phrases)
- Inyecta keywords naturalmente en logros existentes (NUNCA inventa)
- Genera HTML completo desde template + contenido personalizado
- Escribe HTML a
/tmp/cv-candidate-{company}.html - Ejecuta:
node generate-pdf.mjs /tmp/cv-candidate-{company}.html output/cv-candidate-{company}-{YYYY-MM-DD}.pdf --format={letter|a4} - Reporta: ruta del PDF, nº páginas, % cobertura de keywords
Reglas ATS (parseo limpio)
- Layout single-column (sin sidebars, sin columnas paralelas)
- Headers estándar: “Professional Summary”, “Work Experience”, “Education”, “Skills”, “Certifications”, “Projects”
- Sin texto en imágenes/SVGs
- Sin info crítica en headers/footers del PDF (ATS los ignora)
- UTF-8, texto seleccionable (no rasterizado)
- Sin tablas anidadas
- Keywords del JD distribuidas: Summary (top 5), primer bullet de cada rol, Skills section
Diseño del PDF
- Fonts: Space Grotesk (headings, 600-700) + DM Sans (body, 400-500)
- Fonts self-hosted:
fonts/ - Header: nombre en Space Grotesk 24px bold + línea gradiente
linear-gradient(to right, hsl(187,74%,32%), hsl(270,70%,45%))2px + fila de contacto - Section headers: Space Grotesk 13px, uppercase, letter-spacing 0.05em, color cyan primary
- Body: DM Sans 11px, line-height 1.5
- Company names: color accent purple
hsl(270,70%,45%) - Márgenes: 0.6in
- Background: blanco puro
Orden de secciones (optimizado “6-second recruiter scan”)
- Header (nombre grande, gradiente, contacto, link portfolio)
- Professional Summary (3-4 líneas, keyword-dense)
- Core Competencies (6-8 keyword phrases en flex-grid)
- Work Experience (cronológico inverso)
- Projects (top 3-4 más relevantes)
- Education & Certifications
- Skills (idiomas + técnicos)
Estrategia de keyword injection (ético, basado en verdad)
Ejemplos de reformulación legítima:
- JD dice “RAG pipelines” y CV dice “LLM workflows with retrieval” → cambiar a “RAG pipeline design and LLM orchestration workflows”
- JD dice “MLOps” y CV dice “observability, evals, error handling” → cambiar a “MLOps and observability: evals, error handling, cost monitoring”
- JD dice “stakeholder management” y CV dice “collaborated with team” → cambiar a “stakeholder management across engineering, operations, and business”
NUNCA añadir skills que el candidato no tiene. Solo reformular experiencia real con el vocabulario exacto del JD.
Template HTML
Usar el template en cv-template.html. Reemplazar los placeholders `` con contenido personalizado:
| Placeholder | Contenido |
|---|---|
| `` | en o es |
| `` | 8.5in (letter) o 210mm (A4) |
| `` | (from profile.yml) |
| `` | (from profile.yml) |
| `` | [from profile.yml] |
| `` | [from profile.yml] |
| `` | [from profile.yml] (o /es según idioma) |
| `` | [from profile.yml] (o /es según idioma) |
| `` | [from profile.yml] |
| `` | Professional Summary / Resumen Profesional |
| `` | Summary personalizado con keywords |
| `` | Core Competencies / Competencias Core |
| `` | <span class="competency-tag">keyword</span> × 6-8 |
| `` | Work Experience / Experiencia Laboral |
| `` | HTML de cada trabajo con bullets reordenados |
| `` | Projects / Proyectos |
| `` | HTML de top 3-4 proyectos |
| `` | Education / Formación |
| `` | HTML de educación |
| `` | Certifications / Certificaciones |
| `` | HTML de certificaciones |
| `` | Skills / Competencias |
| `` | HTML de skills |
Post-generación
Actualizar tracker si la oferta ya está registrada: cambiar PDF de ❌ a ✅.
