Skip to content

Modernización completa: migración a Astro 5 + Tailwind + GitHub Pages#7

Open
kiro-agent[bot] wants to merge 13 commits into
masterfrom
modernizacion-astro
Open

Modernización completa: migración a Astro 5 + Tailwind + GitHub Pages#7
kiro-agent[bot] wants to merge 13 commits into
masterfrom
modernizacion-astro

Conversation

@kiro-agent

@kiro-agent kiro-agent Bot commented May 16, 2026

Copy link
Copy Markdown

This pull request was generated by @kiro-agent 👻

Comment with /kiro fix to address specific feedback or /kiro all to address everything.
Learn about Kiro autonomous agent


Resumen

Reescritura completa del sitio reemplazando el stack legacy (Jekyll + Materialize CSS + jQuery + deploy por FTP) por Astro 5 + Tailwind CSS 3 + TypeScript + GitHub Pages.

Motivación

El stack anterior tenía problemas críticos:

  • Materialize CSS abandonado desde 2021.
  • Deploy por FTP a hosting de pago.
  • API key de Google Maps expuesta en index1.md e index2.md (AIzaSyArCETPtmpt7r3Dxb9FjN0zg1nIY-ejWyc). Debe revocarse aparte por el maintainer.
  • Google Analytics y Disqus integrados (privacidad).
  • Sin SEO real (sin OG, sin sitemap, sin JSON-LD, sin RSS).
  • Contenido obsoleto (referencias a Java 8/9/10).
  • Bundle de ~330 KB de JS render-blocking (jQuery + Materialize + gmaps).
  • .idea/ versionado.

Cambios principales

Stack nuevo

  • Astro 5 con output: static, TypeScript strict, Content Collections con schemas Zod.
  • Tailwind CSS 3 vía @astrojs/tailwind, dark/light mode con clase dark y anti-flash inline script.
  • Integraciones oficiales: @astrojs/sitemap, @astrojs/rss, @astrojs/mdx.
  • Cero JavaScript runtime salvo el toggle de tema (~1 KB).

Páginas (todas en español)

  • Home, Blog (índice + [...slug]), Eventos (índice + [...slug]), Equipo, Acerca de, 404.

Contenido migrado

  • Los 2 posts existentes (welcome-to-perujug, java-day-2018) a src/content/blog/.
  • Java Day 2018 completo: 10 speakers (incluyendo Miguel Córdova), agenda de 11 slots, lugar (FISI UNMSM), coordenadas preservadas, mapa estático (sin API key).
  • Java Day 2019 con los 3 speakers anunciados.

SEO y accesibilidad

  • JSON-LD por tipo: Organization + WebSite (home), BlogPosting (posts), Event + Place + PostalAddress + GeoCoordinates (eventos).
  • OpenGraph, Twitter Card, canonical, meta descriptions.
  • Sitemap XML, RSS feed (/rss.xml), robots.txt.
  • Favicons completos (ico + 16/32/192/512 PNG + apple-touch-icon-180) y site.webmanifest PWA, generados con scripts/generate-favicons.mjs usando sharp.
  • WCAG AA: skip-link, aria-current="page" en nav, contraste validado (#3F6B85), aria-labels en botones de íconos, alt en imágenes.

Preservación de URLs legacy

  • /javaday/2018//eventos/javaday-2018/
  • /javaday/2019//eventos/javaday-2019/
  • /2016/05/20/welcome-to-peruJUG.html/blog/welcome-to-perujug/ (también clon en lowercase)
  • /2018/06/30/java-day-2018.html/blog/java-day-2018/

Los redirects .html Jekyll terminan sin trailing slash, formato que GitHub Pages no resuelve si Astro genera carpeta. Una integración custom (flattenLegacyHtmlRedirects en astro.config.mjs) aplana esos redirects post-build.

CI/CD

  • Workflow .github/workflows/deploy.yml: build + astro check + deploy a GitHub Pages vía actions/deploy-pages@v4.
  • Triggers en main y master para soportar el rename a main sin tocar el yaml.
  • Workflow viejo de FTP eliminado.

Restricciones cumplidas

  • Sin Disqus, sin Google Analytics, sin Google Maps API key.
  • Sin jQuery, sin Materialize.
  • .gitignore apropiado para Node/Astro, .idea/ eliminado del repo.
  • 13 commits descriptivos en español.
  • README en español con guía de contribución, scripts, agregar post, agregar evento, despliegue.

Verificación

  • npm run build (cache limpio): exit 0, 10 páginas + sitemap + rss + 4 redirects generados.
  • npx astro check: 0 errors / 0 warnings / 0 hints sobre 15 archivos.
  • 12/12 rutas clave retornan 200 en npm run preview.
  • JSON-LD validado manualmente.
  • grep AIzaSy en src/, public/ y dist/ no retorna nada.

Limitación conocida

Lighthouse > 95 no medido en sandbox: el ambiente no tiene GPU ni display server, Chrome falla con NO_FCP/segfault en headless. La verificación queda pendiente para post-deploy en infra real. Recomendación: agregar un step lighthouse-ci al workflow después del primer deploy exitoso.

Acción requerida del maintainer antes de mergear

  1. Revocar la API key de Google Maps (AIzaSyArCETPtmpt7r3Dxb9FjN0zg1nIY-ejWyc) en Google Cloud Console. Está expuesta en el historial git.
  2. En Settings → Pages, configurar Source: GitHub Actions.
  3. Si se usa dominio custom (perujug.org), configurar el CNAME desde Settings → Pages, no como archivo en el repo.
  4. Eliminar los secrets viejos del FTP (PERUJUG_FTP_CICD_*) en Settings → Secrets.
  5. Opcional: renombrar mastermain. El workflow ya lo soporta.

kiro-agent and others added 13 commits May 16, 2026 12:07
Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
…mode

Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
…lash

Astro materializa los redirects declarados como dist/<path>/index.html
(carpeta), formato que GitHub Pages no resuelve cuando el cliente solicita
la URL canonica Jekyll sin slash final
(/2016/05/20/welcome-to-peruJUG.html, /2018/06/30/java-day-2018.html).

Se anade una integracion ad-hoc 'flattenLegacyHtmlRedirects' que en el hook
astro:build:done convierte cada carpeta de redirect en un archivo .html plano
y, para el slug con casing mixto 'peruJUG', clona ademas la version en
minusculas para tolerar backlinks normalizados. Asi la cobertura SEO de URLs
historicas queda preservada sin tocar el resto de las rutas del sitio.

Atiende issues 1 y 3 del review v1.

Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
- on.push.branches: [main, master] para que el deploy automatico funcione
  tanto si el maintainer mantiene 'master' como rama default como si
  decide renombrar a 'main' (rename de la default branch en GitHub no
  rompe el workflow).
- Step 'Type and content check' (npm run check) antes del build para
  validar tipos TypeScript y schemas Zod de las content collections en
  cada PR, no solo en el build local del maintainer.

Atiende issues 2 y 9 del review v1.

Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
- Seccion 'Como contribuir': dejar de asumir 'main'; documentar que la
  rama por defecto actual es 'master' y que el maintainer puede
  renombrarla sin romper el workflow.
- Seccion 'Despliegue': describir el trigger sobre main o master e
  incluir la nota al maintainer con la opcion de simplificar.

Atiende issue 4 del review v1.

Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
- BaseLayout: helper isCurrent() que normaliza trailing slash y aplica
  aria-current='page' mas una clase activa (acento + underline en
  desktop, fondo elevado en mobile) tanto al nav desktop como al mobile.
  Ahora un usuario con lector de pantalla y un usuario vidente saben en
  que ruta estan.
- index.astro: el H1 deja de duplicar el kicker 'Peru Java User Group'
  y pasa a 'Comunidad Java de Peru'. El kicker se conserva como
  eyebrow/marca.

Atiende issues 5 y 6 del review v1.

Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
- javaday-2018.md: el speaker que abre la agenda ('Programando robots de
  Lego con Java y Kotlin') ahora aparece tambien en el array speakers
  con su foto miguelcordova.jpg ya presente en public/images/javadayperu/.
  La grilla de expositores pasa de 9 a 10 ponentes.
- config.ts: comentarios JSDoc sobre updatedDate, mapAddress, sponsors
  y registrationUrl explicando que son slots para eventos futuros (o
  datos historicos a recuperar) y por que se conservan aunque ningun
  contenido migrado los use hoy.

Atiende issues 7 y 8 del review v1.

Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
- Derivar targets automaticamente del mapa LEGACY_REDIRECTS filtrando
  entries que terminan en .html, eliminando la duplicacion entre
  redirects y la integracion (issue 1).
- Agregar guard fs.access antes del writeFile del clon lowercase para
  no sobreescribir un archivo distinto ya emitido, alineando codigo y
  comentario (issue 2).
- Reescribir el basename original por el lowercase en el HTML clonado
  para que el body cosmetico refleje la URL realmente solicitada
  (issue 3).

Co-authored-by: Ytalo Elias Borja Mori <ytaloborjam@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant