Sitio estático (GitHub Pages) que funciona como CV interactivo + plataforma de evidencia profesional, con versión en inglés y CVs ejecutivos ATS descargables por macroperfil.
- Repo / hosting:
jaforero/jaforero.github.io→ GitHub Pages → dominiocv.javierforero.co - Stack: HTML + CSS + JavaScript vanilla, todo en un solo archivo (
index.html). Sin framework. - Idiomas: español (página principal, con toggle ES/EN client-side) e inglés estático (
en.html).
| Archivo / carpeta | Qué es |
|---|---|
index.html |
Página principal (ES). Contiene HTML, CSS y JS embebidos, e IgraSans en base64. |
en.html |
Versión 100% estática en inglés (generada, no editar a mano). |
cv/ |
CVs en PDF: 2 maestros (ES/EN) + 10 ejecutivos ATS (5 macroperfiles × ES/EN). |
sitemap.xml, robots.txt |
SEO. El sitemap incluye / y /en.html con hreflang. |
og-image.jpg, favicon.ico, apple-touch-icon.png, icon-512.png, qr-cv.png, inflacion-latam-hero.jpg |
Assets referenciados por las páginas. |
CNAME |
Dominio personalizado (no borrar). |
| Archivo | Qué hace |
|---|---|
regen-projects.js |
Regenera las tarjetas de proyecto estáticas + el JSON-LD desde el array PROJECTS. |
build-en.js |
Genera en.html desde index.html (usa cheerio). |
build-cvs.py |
Genera los 10 PDFs ATS en cv/ (usa weasyprint + IgraSans.woff2). |
IgraSans.otf |
Fuente de marca con ligaduras (la usa build-cvs.py; en el HTML va embebida en base64). Ojo: IgraSans.woff2 es un subset SIN la ligadura F_O_R — no usarlo para los PDFs. |
node_modules/yCV_ATS/(carpeta vieja) NO se publican ni se versionan.
- Fuente de verdad de proyectos: el array
const PROJECTS = [...]dentro del<script>deindex.html. La capa inglesa está enconst PROJ_EN = {...}. Todo lo demás se deriva de ahí. - Tarjetas de proyecto: se renderizan por JS (
cardHTML) y están pre-renderizadas en estático entre los marcadores<!-- PROJECTS:START -->/<!-- PROJECTS:END -->dentro de#projGrid(para crawlers/lectores sin JS). Si editasPROJECTS, correregen-projects.js. - i18n: atributos
data-en/data-en-html/data-en-attr/data-en-tip. La funciónapplyLang('en')los intercambia en vivo.build-en.js"hornea" ese intercambio en estático. - Vista rápida para reclutadores (
#reclutadores): selector de 5 rutas (objetoRV), con encaje + evidencia + skills (objetoSK) + descarga del PDF de la ruta (objetoPDF). Deep-links?view=<slug>(ai-data-leadership, genai-automation, data-products, consulting, education). - Descargas:
downloadCV()baja el CV maestro (cv/...); cada ruta baja su PDF de macroperfil (cv/Javier_Forero_CV_<Perfil>_<ES|EN>.pdf). - Marca: morado
#4e00ff, azul profundo#041c59, fuente IgraSans. El nombre "JAVIER FORERO" usa la ligaduraF_O_Rde IgraSans (requiere texto en mayúsculas,font-feature-settings:"liga"y sinletter-spacing). - Regla de honestidad en métricas: nunca presentar objetivos/criterios de MVP como resultados cerrados (p. ej. Preflex se marca como "criterio objetivo del MVP").
npm install cheerio # para build-en.js
pip install weasyprint --break-system-packages # para build-cvs.py
# build-cvs.py necesita IgraSans.otf en la misma carpeta (trae las ligaduras de marca)-
Edita
index.html(única fuente; nunca editesen.htmla mano). -
Corre los tres builds:
node regen-projects.js # tarjetas/JSON-LD ES sincronizados node build-en.js # regenera en.html python3 build-cvs.py # regenera los 10 PDFs en cv/
Verificación rápida (no escriben si ya está sincronizado):
node regen-projects.js --check node build-en.js --check
-
Publica (ver sección 5).
Respaldo: existe el Release "Versión Estandar Inicial" (tag
CV) como punto de restauración.
git switch -c mejoras-AAAA-MM # trabaja en una rama, no en main
git add index.html en.html sitemap.xml cv/
git commit -m "Actualizacion de contenido"
git push -u origin mejoras-AAAA-MM
# revisa y haz merge a main en GitHub (Pages despliega main)Verificar tras el deploy (1–2 min):
https://cv.javierforero.co/yhttps://cv.javierforero.co/en.htmlhttps://cv.javierforero.co/?view=genai-automation→ selecciona ruta + descarga su PDFhttps://cv.javierforero.co/cv/Javier_Forero_CV_AI_Data_Leadership_EN.pdf
No borrar CNAME ni .github/. No publicar node_modules/ ni CV_ATS/.
| Perfil | Archivo (ES / EN) |
|---|---|
| AI & Data Strategy Leadership | Javier_Forero_CV_AI_Data_Leadership_{ES,EN}.pdf |
| GenAI & Automation | Javier_Forero_CV_GenAI_Automation_{ES,EN}.pdf |
| Analytics Products & BI | Javier_Forero_CV_Analytics_Products_BI_{ES,EN}.pdf |
| Senior Consulting & Advisory | Javier_Forero_CV_Senior_Consulting_{ES,EN}.pdf |
| Executive AI Education | Javier_Forero_CV_Executive_Education_{ES,EN}.pdf |
Los 5 comparten experiencia/educación reales; cambian título, perfil, casos y skills clave por
macroperfil. Una columna, A4, texto seleccionable (ATS), paleta de marca. Se editan en build-cvs.py
(diccionarios L para contenido común y PROFILES para el tailoring).
Property G-MQ3K8EVKV0. El objetivo no es solo medir visitas sino qué ángulo profesional convierte.
Eventos clave (se disparan vía gtag/window.__track):
| Evento | Qué mide |
|---|---|
download_cv_general_es / _en |
Descarga del CV maestro (por idioma) |
download_cv_ai_strategy, _genai, _data_products, _consulting, _education |
Descarga del CV por macroperfil (interés de rol) |
select_recruiter_view (param view) |
Uso del selector y ángulo elegido |
open_project_case (param project_id) |
Interés por un caso |
click_contact_email / click_linkedin / click_contact_phone / click_portfolio |
Conversión directa y validación social |
change_language_en / _es |
Interés internacional |
save_vcard |
Señal de contacto |
| Extras | anchor_case_open, project_filter, project_search, scroll_depth, cert_filter, skill_tab |
En GA4, marcar como conversiones los
download_cv_*,select_recruiter_view,click_contact_emailysave_vcardpara medir el embudo de intención por ángulo profesional.