Modo: pdf — Generación de PDF ATS-Optimizado

Modo: pdf — Generación de PDF ATS-Optimizado

Pipeline completo

  1. Lee cv.md como fuentes de verdad
  2. Pide al usuario el JD si no está en contexto (texto o URL)
  3. Extrae 15-20 keywords del JD
  4. Detecta idioma del JD → idioma del CV (EN default)
  5. Detecta ubicación empresa → formato papel:
    • US/Canada → letter
    • Resto del mundo → a4
  6. Detecta arquetipo del rol → adapta framing
  7. Reescribe Professional Summary inyectando keywords del JD + exit narrative bridge (“Built and sold a business. Now applying systems thinking to [domain del JD].”)
  8. Selecciona top 3-4 proyectos más relevantes para la oferta
  9. Reordena bullets de experiencia por relevancia al JD
  10. Construye competency grid desde requisitos del JD (6-8 keyword phrases)
  11. Inyecta keywords naturalmente en logros existentes (NUNCA inventa)
  12. Genera HTML completo desde template + contenido personalizado
  13. Escribe HTML a /tmp/cv-candidate-{company}.html
  14. Ejecuta: node generate-pdf.mjs /tmp/cv-candidate-{company}.html output/cv-candidate-{company}-{YYYY-MM-DD}.pdf --format={letter|a4}
  15. 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”)

  1. Header (nombre grande, gradiente, contacto, link portfolio)
  2. Professional Summary (3-4 líneas, keyword-dense)
  3. Core Competencies (6-8 keyword phrases en flex-grid)
  4. Work Experience (cronológico inverso)
  5. Projects (top 3-4 más relevantes)
  6. Education & Certifications
  7. 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:

PlaceholderContenido
``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 ✅.