IEM

Aquest portafolis

En línia
  • Portada amb el nom en dues línies, el rol, la situació laboral, els botons de descarregar el CV i escriure, i el retrat a la dreta.
    La portada: qui és, què busca i les dues formes de seguir
  • Secció de projectes amb tres targetes en fila, cadascuna amb miniatura, títol, estat i resum, i un «Veure 5 més» a sota.
    Tres destacats a la vista; la resta, a un clic
  • Panell de l'assistent obert sobre la portada, amb una pregunta escrita i la seva resposta en text monoespaiat.
    L'assistent respon sobre el CV, en streaming i amb l'expedient al servidor
  • Fitxa d'un projecte en tema fosc, amb dues captures en tira, el resum tècnic, els assoliments i els xips de tecnologia.
    Una fitxa de projecte, en tema fosc

Lloc estàtic en Astro sobre Cloudflare Pages, trilingüe i sense framework d'interfície. Un sol cv.json alimenta les pàgines, el PDF de cada idioma, el JSON-LD i els endpoints per a màquines; el dinàmic són Pages Functions.

  • CSP per hashes i sense unsafe-inline, recalculada des de l'HTML a cada build.
  • Pressupostos d'HTML, DOM, CSS i JS que fan fallar el build; Lighthouse bloqueja si l'LCP passa de 2,5 s.
  • El PDF es genera i es comprova a cada build: un full A4 i text extraïble amb dos motors.
  • Límits d'ús atòmics a D1, provats contra una base real.

El problema

Un CV en PDF es queda curt per a una candidatura tècnica —no es pot enllaçar, no el llegeix un cercador i no demostra res sobre com treballes— però continua sent el que et demanen. I mantenir a mà el web, el PDF i el perfil de cada portal significa que els tres acaben dient coses diferents. La idea era tenir una sola font i que tota la resta en sortís.

El meu paper

Tot: el disseny, el codi, la infraestructura i el contingut. No hi ha plantilla de partida ni framework d'interfície; el que es descarrega al navegador són mòduls propis.

Decisions

  1. Un sol `cv.json`, i tota la resta derivada

    L'arxiu segueix l'esquema de JSON Resume i el build valida contra ell. D'aquí surten les pàgines en tres idiomes, un PDF d'un full per idioma, el JSON-LD dels cercadors i `/cv.json`, `/cv.md` i `/llms.txt`. L'alternativa —mantenir el web i el PDF per separat— és la que produeix currículums que es contradiuen, i a més obliga a repetir cada correcció tres vegades.

  2. La qualitat es comprova al build, no a la revisió

    El build falla si una pàgina passa del seu pressupost d'HTML, DOM, CSS o JavaScript, si un `<style>` no té el seu hash a la política de seguretat, si el PDF ocupa més d'un full o si el seu text no es pot extreure. I una feina de Lighthouse bloqueja el desplegament si la portada passa de 2,5 s d'LCP. Revisar a ull funciona una vegada; un sostre que falla funciona sempre, i a més explica què s'ha trencat.

  3. Res de mesurar en local: només compta la CI

    Les dues mesures que importen —l'LCP simulat i les referències visuals— depenen del renderitzat de text i de la CPU de la màquina. En local, a més, un bloquejador d'anuncis filtra les peticions de qualsevol navegador, inclòs el de les proves. Les referències es generen al contenidor fixat de Playwright i Lighthouse corre a la mateixa imatge a la CI: tres tandes i la mediana.

  4. L'assistent deixa l'expedient al servidor

    Respon preguntes sobre el CV amb un model, i això obre dos problemes: el que se li envia es pot sonsacar, i una API de pagament oberta a internet es pot esgotar. El primer es resol no enviant res que no diria en una entrevista, i escrivint les regles en positiu: una regla «no parlis de X» publica que X existeix. El segon, amb límits per IP a D1, atòmics perquè dues peticions alhora no comptin com una.

Resultat

  • La portada carrega en 2,1 s d'LCP simulat a la CI, amb 21 peticions i 166 KB. El JavaScript total són 17 KB amb gzip, repartits en nou mòduls propis.
  • Zero violacions d'accessibilitat amb axe a les sis pàgines, i una política de seguretat sense `unsafe-inline` que el build torna a calcular des de l'HTML servit.
  • El mateix currículum se serveix en sis formats sense escriure'l dues vegades: tres idiomes de pàgina, tres de PDF, `/cv.json`, `/cv.md`, `/llms.txt` i el JSON-LD.

Què canviaria

Vaig construir de més abans de mirar qui entrava. Hi va haver una consola interactiva, una vista en Markdown i una paleta d'ordres; entre les tres, quaranta dies de dades van donar 69 usos davant de 383 visites de la portada, i costaven unes 5 500 línies. Les vaig retirar, i amb elles se'n va anar la meitat del JavaScript. Avui començaria per la mesura: primer saber què s'usa, i construir el següent amb aquesta resposta al davant.

  • Astro
  • TypeScript
  • Cloudflare Workers
  • D1
  • Playwright
  • Vitest