Estrenando nuevo blog y nuevo dominio

  • astro
  • wordpress
  • github-pages
  • rss
  • inteligencia-artificial

Después de muchos años publicando en WordPress, hoy os traigo una pequeña noticia: el blog se ha mudado.

La nueva dirección es dicres.dev. He comprado el dominio para tener una dirección más sencilla y más mía, y de paso he aprovechado para darle una vuelta completa a la web.

El contenido sigue siendo el mismo, todos los artículos que había publicado hasta ahora están aquí, pero por debajo ha cambiado prácticamente todo.

Adiós WordPress, hola código

WordPress me ha acompañado durante mucho tiempo y ha cumplido perfectamente su función. Me ha permitido escribir, publicar y compartir lo que iba aprendiendo sin tener que preocuparme demasiado de la parte técnica de mantener una web.

Sin embargo, llevaba tiempo con ganas de que el blog fuese también un proyecto de código. Poder tenerlo en un repositorio, versionar cada cambio, modificar cualquier parte de la web cuando me apetezca y aprender cosas nuevas mientras lo mantengo me parecía una idea muy atractiva.

Además, estamos en un momento en el que las herramientas de IA pueden ayudar mucho en este tipo de proyectos. No me refiero solo a escribir código más rápido, sino a poder retomar el proyecto después de un tiempo, entender cómo está montado, hacer pequeños cambios de diseño, corregir algo que se ha quedado obsoleto o preparar una nueva entrada con menos fricción.

Mi intención es que todo esto me ayude a mantener el blog más vivo e intentar escribir algo más. Eso sí, a diferencia de antes, escribiré con menos periodicidad. Publicaré cuando me apetezca y encuentre el tiempo necesario para hacerlo.

Mi vida de padre me deja mucho menos tiempo libre que antes, y el que tengo quiero repartirlo también entre el resto de mis aficiones, la familia y los amigos. No prometo una entrada cada semana, porque ya sabemos cómo van estas cosas, pero al menos ahora tengo una excusa técnica más para volver por aquí.

La tecnología elegida

Para la nueva web he elegido Astro. Es un generador de sitios estáticos que encaja muy bien con un blog. El contenido se prepara en el momento de compilar la web y los lectores reciben HTML estático, rápido y sin necesidad de mantener un servidor o una base de datos.

Los artículos viven ahora en archivos Markdown dentro del repositorio. Cada uno tiene una cabecera con información como el título, la fecha, la descripción, las etiquetas o la imagen principal.

---
title: Título del artículo
description: Resumen que se muestra en el listado y en el feed
pubDate: '2026-09-09'
tags:
  - astro
  - wordpress
draft: false
---

Astro usa una colección de contenido para leer y validar esos archivos. De esta forma, si olvido un dato obligatorio al crear una entrada, el proyecto falla durante la compilación en lugar de publicar un artículo a medias.

La web se genera automáticamente con GitHub Actions. Cada vez que hay cambios en la rama principal, se publica en GitHub Pages. El proceso es bastante simple:

  1. Se descarga el código.
  2. Se instalan las dependencias.
  3. Se compila la web estática.
  4. Se publica el resultado.

Así que publicar una entrada nueva es tan sencillo como añadir o modificar un archivo Markdown, revisar el resultado y subir el cambio al repositorio.

Estadísticas con GoatCounter

Para saber cuánta gente visita el blog utilizo GoatCounter, una alternativa sencilla y respetuosa con la privacidad frente a otras herramientas de analítica. No necesito añadir código de seguimiento en cada página. He creado un componente de Astro que carga de forma asíncrona el script de GoatCounter y lo incluyo en el layout de las entradas y del resto de páginas.

La configuración se hace mediante la variable de entorno PUBLIC_GOATCOUNTER_CODE. Esta variable contiene el código que identifica mi cuenta, es decir, la parte que aparece antes de .goatcounter.com en la dirección del panel. El componente construye con ese valor la URL de recopilación de datos:

---
const goatCounterCode = import.meta.env.PUBLIC_GOATCOUNTER_CODE?.trim();
---

{
  goatCounterCode && (
    <script
      is:inline
      async
      data-goatcounter={`https://${goatCounterCode}.goatcounter.com/count`}
      src="https://gc.zgo.at/count.js"
    ></script>
  )
}

En local basta con definir PUBLIC_GOATCOUNTER_CODE en un archivo .env. Para la versión publicada, he creado esa misma variable como variable del repositorio en GitHub y el workflow de GitHub Actions la inyecta durante la compilación. De esta forma el código no queda escrito directamente en los ficheros del proyecto y las estadísticas se activan automáticamente al desplegar.

Migrando los artículos desde WordPress

Una de las cosas que más me preocupaban antes de empezar era la migración. Había bastantes artículos, con imágenes, enlaces, categorías y etiquetas, y no quería ir copiando y pegando uno a uno.

Por suerte el proceso ha sido mucho más sencillo de lo que esperaba. Primero exporté el contenido desde WordPress y utilicé wordpress-export-to-markdown para convertir las entradas en ficheros Markdown y descargar sus imágenes.

Después preparé un pequeño script en Node.js para adaptar ese resultado a la estructura del nuevo blog. El script hace varias cosas:

  • Lee los metadatos de cada artículo.
  • Genera un slug válido para la URL.
  • Conserva la fecha de publicación y convierte las categorías y etiquetas en etiquetas del nuevo blog.
  • Genera una descripción a partir del contenido cuando no existe una preparada.
  • Copia las imágenes al proyecto y actualiza las rutas que aparecen dentro de cada artículo.
  • Marca las entradas como publicadas para que aparezcan tanto en el listado como en el feed.

No ha sido una migración mágica al cien por cien. He revisado el resultado (aunque no he entrado a todos y cada uno de los posts) y algunos artículos necesitaban pequeños ajustes, sobre todo los que tenían formatos antiguos, imágenes insertadas, código… Aun así, convertir todo el contenido a Markdown y automatizar la adaptación me ha ahorrado muchísimo trabajo manual.

Y lo mejor es que ahora los artículos ya no dependen de una plataforma concreta. Son ficheros de texto que puedo editar con el editor que quiera, mover, versionar o reutilizar en otro sitio si algún día vuelvo a cambiar de tecnología.

Si estabas suscrito al feed

Este cambio tiene una pequeña consecuencia importante. Si seguías el blog mediante el feed de WordPress, tendrás que suscribirte de nuevo.

El nuevo feed está disponible en https://dicres.dev/rss.xml. Podéis copiar esa dirección en vuestro lector de RSS favorito o usar el enlace de suscripción que aparece al final de cualquier página del blog.

El feed incluye los artículos publicados y se actualizará cada vez que añada uno nuevo.

Una sección para mis side projects

También he añadido la sección Side projects. La idea es ir dejando allí algunos proyectos personales que voy creando, ya sea porque los necesito para mí o porque creo que pueden resultar útiles a alguien más.

El primero ya está publicado: Dicres Photos Uploader, una aplicación para subir fotos y vídeos a Google Photos respetando la organización de carpetas y creando un álbum por cada una.

No sé con qué frecuencia aparecerán nuevos proyectos, pero me apetecía tener un lugar en el que poder enseñar estas cosas sin que se pierdan entre las entradas del blog.

¿Me invitas a un café?

Por último, he añadido un botón de PayPal al final de los artículos para quien quiera invitarme a un café.

El blog y los proyectos que publique aquí seguirán siendo gratuitos. El botón es simplemente una forma opcional de apoyar el tiempo que dedico a escribir, mantener la web y crear pequeñas herramientas. Si alguna entrada o proyecto os resulta útil y os apetece colaborar, os lo agradeceré mucho. Y si no, que sigáis leyendo y compartiendo ya es un apoyo enorme.

Cierre

Estoy bastante contento con el resultado de esta nueva etapa. El blog tiene nuevo dominio, una base técnica que me apetece mantener y más espacio para compartir tanto artículos como proyectos personales.

Todavía habrá cosas que ir mejorando poco a poco, pero lo importante ya está hecho. Todo el contenido está disponible y listo para seguir creciendo.