Saltar al contenido
AIM Desarrollo y Automatizaciones

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.

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.