← Volver a los proyectos

myself-app

Este sitio: un perfil de desarrollador en inglés y español, exportado como archivos estáticos y construido sobre entifix.

Resumen

Este sitio es un perfil de desarrollador en inglés y español, reconstruido sobre entifix y exportado como archivos estáticos. Cada valor que muestra es contenido validado contra entidades en el build, leído con los mismos casos de uso que ejecutaría un backend.

También es donde se incuba el código destinado a entifix antes de mudarse allí, y donde cada decisión importante queda registrada como un ADR.

Patrones

  • Una exportación estática

    Next.js genera cada página una sola vez, en el build, como archivos servidos desde un bucket privado de S3 detrás de CloudFront. No hay servidor en tiempo de petición.

  • El contenido como entidades

    Cada valor del sitio es JSON validado contra entidades de entifix antes de generar cualquier página, así que un registro erróneo detiene el build con su ruta.

  • Paquetes por capas

    Dominio, contenido, una incubadora de código destinado a entifix e implementaciones de UI y adaptadores. El lint impone qué capa puede importar a cuál.

  • Un caso de uso, dos lugares

    Las páginas que filtran responden en el navegador con el mismo caso de uso de carga de entifix que ejecuta el build, sobre archivos JSON que el build escribe.

  • Decisiones registradas

    Cada decisión importante es un ADR cuya línea Read when nombra el síntoma que debe llevar a leerlo; así un agente encuentra la regla antes de romperla.

Estructura de archivos

  • apps/
    • myself-app/La app de Next.js: rutas, la raíz de composición y las fuentes del navegador.
    • myself-app-e2e/Recorridos de Playwright contra la exportación estática, nunca contra un servidor de Next.
    • infra/El programa de Pulumi: bucket, CloudFront, DNS y el rol de despliegue.
  • packages/
    • domain/Entidades, casos de uso y las reglas que solo conoce este sitio.
    • content/Un archivo JSON por entidad, el Markdown de los artículos y las copias de los ADR. No importa nada.
    • entifix-incubator/Código destinado a entifix, que no sabe nada de este sitio.
    • implementation/
      • adapters/De dónde se lee el contenido: los archivos del build y los del navegador.
      • ui/La UI del sitio, de átomos a plantillas, con su i18n y estilos.
  • tools/
    • conventions/Las convenciones del repositorio, verificadas: atribución, CI, capas.
  • docs/
    • adr/Los registros de decisiones, copiados al contenido por tools/sync-adrs.mjs.

Decisiones de arquitectura

Cada decisión importante queda registrada, con el síntoma que debe llevar a un lector —o a un agente— a leerla antes de romper la regla.

Los registros están escritos en inglés.

Cómo guían el trabajo los registros

Personas y agentes leen los mismos registros. Cada uno nombra el síntoma que debería llevar a alguien hasta él, para que una regla se encuentre antes de romperla, no después.

  1. 1DecidirUna decisión costosa de deshacer, o fácil de romper sin querer, recibe un registro numerado.
  2. 2RegistrarSu encabezado tiene un estado, una fecha, un área y una línea Read when: el síntoma que debería traer de vuelta a quien lee.
  3. 3SeñalarEl CLAUDE.md del repositorio envía cada sesión de un agente a docs/adr, cuyo README indexa los registros.
  4. 4ReconocerCuando una tarea se topa con un síntoma — una verificación que falla, un build extraño — el agente encuentra el registro cuyo Read when lo nombra, y sigue su regla.
  5. 5EvolucionarUn dato que cambia se corrige en su lugar, en una línea Revised. Una decisión que ya no vale recibe un registro nuevo que la reemplaza. Nada se borra.

Los registros de abajo se copian de cada repositorio con un script, y la CI de este repositorio falla cuando una copia se aparta de su registro.

Anatomía de un registro: el encabezado del ADR 0020, el más reciente con una línea Read when.
  1. # 20. Project pages, and decision records as contentUn número que nunca cambia, y la decisión en una línea. El README los lista.
  2. - Status: AcceptedEn qué estado está. Un registro reemplazado se queda, y nombra el que lo reemplazó.
  3. - Date: 2026-09-30Cuándo se decidió. Una corrección posterior agrega abajo una línea Revised, con su propia fecha.
  4. - Area: dataLa parte del sistema que gobierna.
  5. - Read when: a record in `docs/adr` changed and the site still shows the old one, the conventions spec says the ADR copies drift, a project's page is about to show something its repository does not have, a record fails `next build`, or a Spanish reader asks why the records are in EnglishContra lo que un agente compara: el síntoma que encontraría, no el tema.
  1. 0001A Next static export served from S3Aceptada

    0001A Next static export served from S3

    Leer cuandoreaching for a server feature — headers(), cookies, a proxy, a route handler — or wondering why this is Next rather than Vite

    La decisión

    • Next.js with output: 'export'. next build writes HTML, JavaScript and CSS into apps/myself-app/out, and that directory is the whole deployment.

    Aceptadaplatform

    Leer el registro →
  2. 0002A static adapter behind entifix's repository portAceptada
  3. 0003Pages render at build; interactive parts query in the browserAceptada
  4. 0004An Nx workspace: app, domain, static adapter, contentAceptada
  5. 0005English and Spanish, with localized content fieldsAceptada
  6. 0006Tailwind v4 and everything `@entifix/style` involvesAceptada
  7. 0007Hosting is deferred; the build stays host-neutralAceptada
  8. 0008A landing page of five static sectionsReemplazada en parte
  9. 0009The radar's maths is ported, and it runs at build timeAceptada
  10. 0010Content is checked from entity metadata, and every package ships `dist`Aceptada
  11. 0011A moving hero, a revealing nav and a blue themeAceptada
  12. 0012The CV as a paper sheet, in variants and two modesAceptada
  13. 0013CloudFront over a private bucket, defined in Pulumi, released on every mergeAceptada
  14. 0014A personal radar: rings for one person, editions in content, filtering over placed blipsAceptada
  15. 0015Customizing the CV in the browser: the URL holds what is hidden, a stylesheet hides itAceptada
  16. 0016entifix queries run in the browser too: one use case, two repositoriesAceptada
  17. 0017A blog of Markdown posts on entitiesAceptada
  18. 0018The incubator owns content mechanics; the app declares sources and rulesAceptada
  19. 0019Layered packages: domain, content, entifix-incubator, implementationAceptada
  20. 0020Project pages, and decision records as contentAceptada