Cómo está hecho este sitio
Este sitio también es una demo: un sitio estático en Cloudflare, una API en el edge y demos que corren de verdad. Cada pieza tiene una razón que dejé escrita. Aquí está el mapa, por qué es así y cómo sé que funciona.
La arquitectura
Toca o enfoca una pieza para ver qué hace y dónde se decidió.
Tu navegador
Páginas desde la red de Cloudflare y /api/* en el mismo dominio
Cloudflare
SQL por HTTPS y la API de Resend
Datos y correo
El navegador los llama directo, con CORS
Render, plan gratuito
Solo para diseñar, fuera de producción
El flujo exportado se compila con el sitio
Sitio estático
Cloudflare Pages
Astro arma cada página como HTML al compilar, en español y en inglés. Lo interactivo son islas de Preact que cargan solo su propio JavaScript. Cloudflare Pages lo sirve desde su red, gratis, con una política de seguridad de contenido (CSP) estricta: sin unsafe-inline ni unsafe-eval.
API en el edge
Hono en Pages Functions
Contactos, cotizador, login del panel, asistente, agente y automatización responden en /api/*, en el mismo dominio del sitio: gratis, sin arranque en frío y sin CORS. El plan gratuito da unos 10 ms de CPU por petición, así que nada de hashes de contraseña costosos: el panel entra con un código de un solo uso.
Se decidió en
Workers AI
Gemma 4
El asistente, el revisor de código y el agente con herramientas usan Gemma 4 por el binding de Workers AI: gratis (10.000 neurons al día), sin API key ni tarjeta. Un límite diario compartido cuida ese cupo, y el agente llama sus herramientas con function calling nativo.
@cf/google/gemma-4-26b-a4b-it
Se decidió en
Turnstile
Contra bots
Comprueba que del otro lado haya una persona. Protege el formulario de contacto, el login del panel, el asistente y la automatización en vivo. El edge verifica cada token con Cloudflare, y si Turnstile no responde, la API contesta 503 en vez de dejar pasar.
Se decidió en
Neon Postgres
Por HTTP
Guarda contactos, sesiones del panel, cupos y el registro de accesos. Cada sentencia viaja como una petición HTTPS con el driver serverless de Neon y Drizzle, sin conexión TCP que abrir. Lo que debe confirmarse junto va en una sola sentencia o en un lote.
Se decidió en
Resend
Correo
Envía el aviso de cada contacto nuevo y los códigos de un solo uso del login del panel (6 dígitos, 10 minutos, 5 intentos). En local, los mismos correos llegan a Mailpit.
Se decidió en
API Playground
NestJS en Render
NestJS es el centro de mi perfil y Cloudflare Workers no lo corre de forma fiable, así que vive en un contenedor Docker en el plan gratuito de Render. Se duerme sin uso y la demo avisa mientras despierta. Responde en el idioma de la página.
Se decidió en
Migrador en Python
FastAPI en Render
Da el mismo resultado que el migrador del navegador y suma lo que el navegador no hace bien: Excel, archivos más grandes y detección de codificación. Todo en memoria, sin guardar archivos. El contrato es de Zod, exportado a JSON Schema, y una prueba de paridad compara Python con TypeScript.
Se decidió en
n8n
Para diseñar el flujo
El flujo «Contacto → lead calificado» se diseña en n8n y se exporta al repositorio, pero n8n no corre en producción: el edge lo ejecuta con las mismas reglas en menos de 1 ms. Una grabación de n8n real (2.45.2) comprueba en la CI que los dos responden exactamente igual.
Se decidió en
Decisiones clave
Cada decisión quedó escrita con su contexto y las alternativas que descarté. Estas son las que más se notan.
DEC-002Cadena de suministro: versiones exactas y 14 días
Versiones exactas y nada publicado hace menos de 14 días, también en Python con uv. Solo un parche de seguridad puede saltarse la regla, y queda registrado.
Leer DEC-002 en GitHub (se abre en otra pestaña)DEC-003Monorepo y stack
pnpm y Turborepo, Astro con islas de Preact, NestJS y FastAPI: es mi stack de trabajo real, y cada pieza es parte de lo que el sitio demuestra. Next.js quedó fuera: más JavaScript en el navegador, sin ventaja para un sitio casi todo estático.
Leer DEC-003 en GitHub (se abre en otra pestaña)DEC-014API híbrida
Lo que usa cualquier visitante corre en Cloudflare Pages Functions: gratis, sin arranque en frío y sin CORS. NestJS queda en Render solo para su demo, donde esperar a que despierte es aceptable.
Leer DEC-014 en GitHub (se abre en otra pestaña)DEC-017Login propio del panel /admin
Correo y código de un solo uso en vez de contraseña, porque un hash seguro no cabe en la CPU gratuita de Workers. Tokens de corta vida en cookies HttpOnly, con rotación y detección de reutilización.
Leer DEC-017 en GitHub (se abre en otra pestaña)DEC-018Modelo gratuito para el Asistente IA
Gemma 4 en Workers AI es gratis y no pide key ni tarjeta. El adaptador de Claude sigue en el código: con una key de Anthropic, el asistente cambia sin tocar nada más.
Leer DEC-018 en GitHub (se abre en otra pestaña)DEC-019Content Security Policy estricta
Hashes de cada script y estilo en una <meta>, sin unsafe-inline ni unsafe-eval. Una prueba E2E abre las páginas y las demos y falla si el navegador reporta una violación.
Leer DEC-019 en GitHub (se abre en otra pestaña)DEC-023El flujo de la automatización corre en Cloudflare; n8n queda para diseñarlo
n8n en el plan gratuito de Render tardaba de 70 a 112 s en despertar. Ahora diseña el flujo y el edge lo ejecuta, con una prueba de paridad contra n8n real.
Leer DEC-023 en GitHub (se abre en otra pestaña)DEC-024Sitio en inglés
Todo el sitio en inglés, demos incluidas, bajo /en/ con rutas traducidas. Sin redirigir según el navegador: los buscadores ven las dos versiones y ninguna URL en español cambió.
Leer DEC-024 en GitHub (se abre en otra pestaña)DEC-027La API habla con Neon por HTTP
Abrir TCP y TLS hasta Neon en cada petición costaba más que la consulta. Con el driver HTTP cada sentencia es una petición; a cambio, lo atómico va en una sentencia o en un lote.
Leer DEC-027 en GitHub (se abre en otra pestaña)DEC-029Imagen para compartir por página
Cada página tiene su imagen para compartir, dibujada al compilar con Satori y sharp a partir de sus propias etiquetas: no cuesta nada al visitar y dice siempre lo mismo que la página.
Leer DEC-029 en GitHub (se abre en otra pestaña)DEC-031El panel /admin/ como CRM de contactos
El panel lleva el seguimiento de cada contacto: estados con historial escrito en la misma sentencia, notas internas, filtros en la URL y un CSV protegido contra la inyección de fórmulas.
Leer DEC-031 en GitHub (se abre en otra pestaña)DEC-032Visitante por red /64 y límites de la revisión OWASP
La revisión OWASP dejó reglas para toda ruta nueva: cuerpos de hasta 64 KB, límites por red /64 en IPv6 y logs sin datos personales.
Leer DEC-032 en GitHub (se abre en otra pestaña)DEC-033Agente de IA con herramientas en el Lab
Function calling nativo con cuatro herramientas de solo lectura y límites por ejecución. Los precios solo pueden salir de una herramienta.
Leer DEC-033 en GitHub (se abre en otra pestaña)
Calidad en números
Estos números salen del propio repositorio cada vez que el sitio se compila, así que no se quedan viejos. Los que dependen de una medición dicen cuándo se midieron.
Pruebas automáticas
2.312casos de pruebaen 213 archivos; la CI los corre en cada push y pull request
- Sitio webVitest, 113 archivos1.280
- E2E y accesibilidadPlaywright y axe, 38 archivos325
- API del edgeVitest con PGlite, 37 archivos447
- ContratosVitest, 10 archivos105
- API PlaygroundVitest, 7 archivos62
- Motor del flujoVitest, paridad con n8n, 2 archivos27
- Migrador en Pythonpytest, 6 archivos66
Contados en el código al compilar. Un caso que se repite por página, idioma o dato cuenta una vez, así que al correr son más: las E2E recorren cada página del build en celular y escritorio.
Lighthouse
- Rendimiento en celular
- 98–99
- Rendimiento en escritorio
- 100
- Accesibilidad, buenas prácticas y SEO
- 100
- Movimiento del diseño al cargar (CLS)
- 0,011
Medido el 8 de noviembre de 2026 contra aimweb-9hc.pages.dev: 13 páginas en los dos idiomas, mediana de 3 corridas, Lighthouse 13.5.0. Sin contar /admin/, que es privado y no se indexa.
Latencia
- 0,13 s
- Mediana de la API en producción, con Neon por HTTP. Antes, entre 1,6 y 2,5 s por petición.Medido el 8 de noviembre de 2026, DEC-027: La API habla con Neon por HTTP (se abre en otra pestaña)
- < 2 s
- Del clic al resultado en la Automatización en vivo: la API responde en unos 40 ms, con Turnstile incluido, y el flujo corre en menos de 1 ms.Medido el 7 de noviembre de 2026, DEC-023: El flujo de la automatización corre en Cloudflare; n8n queda para diseñarlo (se abre en otra pestaña)
Revisión de seguridad
0 hallazgos críticos o altos
- 4 medios, 3 corregidos
- 8 bajos o informativos, 2 corregidos
Revisión contra el OWASP Top 10:2025 del edge, la web, las dos APIs de Render y la cadena de suministro, el 8 de noviembre de 2026. Cada hallazgo corregido tiene una prueba que falló antes del cambio.
Leer el reporte completo (se abre en otra pestaña)Stack
Las versiones salen de los manifiestos del repositorio al compilar: siempre exactas (DEC-002).
- Sitio
- Astro 7.3.8
- Preact 10.29.8
- Tailwind CSS 4.3.3
- TypeScript 5.9.3
- Satori 0.63.2
- sharp 0.35.5
- API en el edge
- Cloudflare Pages Functions
- Hono 4.13.13
- Drizzle ORM 0.45.4
- @neondatabase/serverless 1.2.0
- Zod 4.6.7
- jose 6.2.13
- IA
- Cloudflare Workers AI
- Gemma 4
- Demos en Render
- NestJS 12.2.0
- FastAPI 0.161.1
- Python 3.12
- uv
- Docker
- Automatización
- n8n 2.45.2
- Pruebas y calidad
- Vitest 5.0.3
- Playwright 1.63.0
- axe-core 4.14.0
- PGlite 0.5.11
- pytest
- Lighthouse 13.5.0
- Biome 2.5.15
- Monorepo
- pnpm 10.26.1
- Turborepo 2.11.7
Código abierto
Este sitio es de código abierto.
El código, las pruebas, la CI y cada decisión con sus alternativas están en el repositorio. Los números de esta página se calculan a partir de él.
Ver el repositorio en GitHub (se abre en otra pestaña)¿Tienes una idea? Cuéntamela.
Escríbeme sin compromiso, estés donde estés. Te respondo con preguntas concretas y, si encaja, con una propuesta por escrito.