Deconstruyendo esta web
Si te cuentan cómo trabajan y no pueden enseñarte el taller, desconfía. Este es el nuestro.
El recorrido va hacia abajo, del punto de presencia que respondió a tu petición al commit que autorizó estas palabras. Cada capa se abre si quieres el detalle, y todo lo que se afirma aquí está en el repositorio.
La arquitectura
No hay servidores que cuidar, y eso es lo de menos. Importa dónde se fabricó la respuesta que estás leyendo: en el edge, sobre Cloudflare Workers. Delante hay caché, y cuando acierta el código ni se ejecuta.
Debajo, el CMS es EmDash, que Cloudflare publicó con licencia MIT como sucesor de WordPress, y no un servicio al que llamar por red: es la misma aplicación, servida por el mismo worker. Y al final del descenso no hay base de datos, hay un fichero de texto en Git.
L5el bordeWorkers · caché delanteUn acierto devuelve la página sin ejecutar código.
La caché de
Workersse sienta delante delworker, así que un acierto responde sin ejecutar nada. Por defecto no se cachea: una página solo entra si ella misma lo pide. Cuando entra dura una hora, y al publicar se purga por etiquetas.L4la puertamiddlewareDecide qué se cachea y añade las cabeceras de seguridad.
Un único middleware para todas las respuestas: resuelve el idioma, carga las etiquetas de accesibilidad, decide la política de caché y estampa siete cabeceras de seguridad. El panel de edición queda fuera, porque trae las suyas.
L3el renderAstro SSRConstruye el HTML en el mismo
workerque recibió la petición.26 rutas públicas, 24 componentes y 12 hojas de estilo, con render bajo demanda de
Astro, que también es de Cloudflare desde enero de 2026. Los idiomas no se separan por prefijo sino por slug traducido, así que la ruta alterna se resuelve contra el CMS y nunca se adivina: adivinarla devuelve un 404.L2el CMSEmDashCorre dentro del mismo
worker: no hay servicio externo al que llamar.EmDashno es un servicio contratado: es el CMS que Cloudflare publicó en abril de 2026 con licencia MIT como sucesor de WordPress, y que usa en su propio blog desde el 12 de agosto. Aquí inyecta 183 rutas bajo/_emdashen esta misma aplicación, con 7 colecciones y 43 entradas: mismo script, mismos enlaces de recursos, ninguna llamada de red. Los plugins de terceros son la excepción deliberada, y corren en un aislado aparte con Worker Loader, sin salida a internet.
El panel, editando esta página. Corre en el mismo worker que acaba de servírtela. L0el origenseed.json · markdownLo que escribe una persona. Todo lo de encima se deriva de aquí.
Un fichero de texto en Git, más los cuerpos de los servicios en
markdown. De ahí sale la web entera en una reconstrucción desde cero, que es lo que hace la integración continua antes de cada fusión.
Contenido como código
Casi cada texto vive en seed/seed.json, y los cuerpos de los servicios en markdown: el nombre del fichero es el slug, el directorio es el idioma. Una reconstrucción desde cero rehace la web entera, y eso lo comprueba la integración continua antes de cada fusión.
La caché hereda la disciplina: una página solo se cachea si lo pide, y al publicar se purga por etiquetas. Queda un hueco y conviene decirlo: los menús y los ajustes no emiten evento, así que su desfase lo acota el TTL de una hora.
➜ serverstartup.io reconstruir --desde-cero
base de datos creada, vacía
semillas aplicadas: 43 entradas, dos idiomas
copia congelada: 26 rutas
copia renderizada: coincide con la congelada
╰─ listo. La reconstrucción es la prueba, y corre antes de cada fusión.
Los agentes
Que un modelo redacte el primer borrador no tiene mérito ni misterio. Lo que decide si esto es serio es quién tiene autoridad para qué.
El agente propone y no fusiona. Las comprobaciones rechazan y no escriben: su credencial es de solo lectura. La persona puede las dos cosas, y por eso es la única que puede equivocarse con nombre y apellidos. La letra pequeña: que el agente no fusione es una regla escrita, no un candado del servidor.
Antes de preguntarle nada a una persona, la rama pasa por dieciséis pasos que pueden fallar. Se niegan a dejar pasar lo que una revisión a ojo no ve:
Un guardia solo vale si puede fallar, y uno que no encuentra nada se ve igual que uno que no puede. Los más delicados llevan un control positivo que los revienta si dejan de mirar. La última puerta tampoco es automática: producción se despliega a mano.
publicar sin que nadie lo lea
Nombres no citables: un cliente que no puede salir en un repositorio público.
Textos fuera del CMS: una etiqueta que solo existe en un idioma, o una frase escrita a fuego en la plantilla.
Colores fuera del sistema: un literal o una anchura nueva, que es como vuelven las siete medidas distintas.
Caché en el sitio equivocado: una llamada puesta donde las cabeceras ya se han ido, que no cachea nada y lo parece.
Copia que cambia sola: el texto renderizado de 26 rutas está congelado.
Imágenes que se piden a sí mismas: una URL absoluta a nuestro propio dominio, que en Cloudflare no puede funcionar y en local no se nota.
Accesibilidad y contraste: tabulador, reflujo a 320 píxeles y validación del W3C.
All checks have passed — quality-gates / gates
✓ gitleaks✓ citabilidad✓ astro check✓ esquema de semillas✓ textos del CMS✓ tokens de diseño✓ pistas de caché✓ tests unitarios✓ construcción✓ arranque de la pila✓ html-validate✓ copia congelada✓ cabeceras✓ hrefs de imagen✓ accesibilidad✓ LighthouseLos números
Un número sin fecha es el peor sitio para la deriva, así que aquí hay dos clases y no se mezclan. El umbral vive en un fichero: 95 o más en rendimiento, cien en accesibilidad, buenas prácticas y SEO, sobre la mediana de tres pasadas con emulación móvil.
La medición lleva su fecha. El 24 de agosto de 2026, sobre la construcción de producción: cien en las cuatro categorías y en las cinco direcciones, con el mayor contenido pintado por debajo de 1,6 segundos. Es la mediana de cada una, y la cota es la peor de las cinco.
El taller, a la vista
El repositorio es público y se sincroniza con cada cambio en la rama principal, con la historia entera y sin filtrar. Publicar así tiene un coste: por eso existe el guardia de nombres no citables.
Código, semillas, comprobaciones y despliegues: está todo. Mira dentro y dinos si harías algo distinto.
PIEZAS INCLUIDAS
- el borde ×1el
workerque respondesrc/worker.ts - la puerta ×7las cabeceras de seguridadsrc/middleware.ts
- el render ×26las rutas públicassrc/pages/
- el CMS ×5un plugin nuestro con la API de
EmDashsrc/plugins/cache-purge.ts - los datos ×3
D1,R2yKVwrangler.jsonc - el origen ×43el corpus enteroseed/seed.json
- los ingenieros ×3no incluidos: ya estaban
MONTAJE
- 01escribe las semillas
- 02la skill fija la voz
- 03el agente redacta
- 04revisión humana ✋
- 05pull request y merge
- 06deploy al edge
No montar sin el paso 04. El agente redacta, el humano firma.
El paso 03 nunca hace merge. Nunca.
Tiempo de montaje: tres semanas a ratos.
Tornillería incluida: cero traspasos.
Hablemos de ingeniero a ingeniero.
Trae el problema como esté. Te responde quien va a escribir el código.
Cuéntanos tu proyecto