Detrás del sitio
Colofón
Cómo está construido este sitio: el stack, los pipelines y las decisiones de ingeniería detrás de adrianromo.me.
Este sitio es un producto en funcionamiento, no un folleto estático. Todo lo que describo abajo sale de un único código base en Next.js que diseño, construyo y opero yo mismo — funciona también como un caso de estudio en vivo de cómo abordo los sistemas backend.
Stack
Next.js 14 (App Router) con TypeScript y Tailwind CSS, respaldado por Prisma sobre Postgres. Desplegado en Vercel; un stack de Docker Compose reproduce el entorno completo en local con un solo comando.
Pipeline de contenido
Los posts y proyectos viven en Postgres y se renderizan con un pipeline de markdown unified/remark/rehype. La búsqueda usa full-text search de Postgres. Las imágenes Open Graph se generan por ruta, el feed RSS y el sitemap se construyen con los mismos datos, y el PDF del currículum se renderiza en el servidor con PDFKit.
Asistente de IA
El widget de chat es un asistente con retrieval-augmented generation: el contenido del sitio se trocea y se embebe en pgvector, se recupera por pregunta y se responde con modelos de OpenAI. Incluye defensas contra prompt injection, límites de uso por IP y por visitante, un presupuesto diario de tokens y reindexado automático vía cron.
Internacionalización
Inglés, español y alemán. El contenido fuente se escribe en inglés; un pipeline de traducción con LLM genera los demás idiomas y detecta contenido desactualizado mediante hashes. Cada página emite metadatos canonical y hreflang.
Seguridad
Una Content-Security-Policy restrictiva (con nonces por petición en el área de administración), cabeceras de seguridad reforzadas, validación con Zod en cada frontera, rate limiting respaldado por Redis, un formulario de contacto protegido con honeypot y un área de administración detrás de credenciales más passkeys WebAuthn.
Operación
Plausible provee analítica sin cookies y respetuosa de la privacidad. El CI ejecuta linting, formato, chequeo de tipos y pruebas en cada commit. Las migraciones de base de datos se despliegan automáticamente con cada release.