Llevo tiempo queriendo tener un espacio propio donde escribir sobre lo que aprendo. Esta vez decidí construirlo yo mismo, eligiendo cada pieza con cuidado. Aquí están las decisiones.

Por qué Astro

Tenía claro que no quería un CMS pesado ni un framework que añadiera JavaScript innecesario. Quería páginas HTML estáticas, rápidas, con cero JavaScript en el cliente salvo cuando fuera imprescindible.

Astro cumple exactamente eso. Su modelo de “islas” permite mezclar componentes interactivos solo donde se necesiten, y el resto se renderiza como HTML puro en build time.

El soporte nativo de Content Collections hace que gestionar artículos en Markdown sea directo: tipado, validación de frontmatter y autocompletado sin configuración extra.

Hosting y deploy

El blog corre en un VPS propio. El deploy lo gestiona GitHub Actions con un runner self-hosted en producción:

  1. Se lanza manualmente desde Actions, eligiendo la versión (un tag git).
  2. La action hace checkout de ese tag, instala dependencias y ejecuta astro build.
  3. El artefacto resultante se despliega directamente en el servidor.

Sin magia, sin plataforma intermediaria.

La página de notas

La idea de tener una sección de notas cortas surgió leyendo el blog de mi colega Iker: ver su forma de publicar pensamientos cortos me animó a crear un espacio similar, sin la presión de un post completo.

La página de notas funciona de forma distinta al resto del blog. En lugar de Markdown en el repositorio, las notas viven en una base de datos de Notion. Escribo ahí, y aparecen en el blog sin tocar código ni hacer ningún deploy.

El puente es una API propia en Express. Cuando el frontend carga la página, hace una petición a esa API, que consulta la base de datos de Notion, normaliza el resultado y lo devuelve. Para no llamar a Notion en cada visita, la API tiene una caché en memoria con TTL.

En el cliente, todo el filtrado (búsqueda por texto, rango de fechas, tags) ocurre en JavaScript sin roundtrips adicionales. Las notas llegan todas de una vez y el navegador las filtra.

El resultado práctico: para publicar una nota abro Notion, la escribo, le añado tags y fecha, y ya está visible. Sin commits, sin pipeline.

El flujo de trabajo

Para construir esto usé Claude Code desde la terminal, que es básicamente tener un agente con acceso directo al repositorio. Describes lo que quieres, lo implementa, puedes revisar el diff y seguir. La página de notas con filtros, el sistema de rutas, el diseño: todo salió de esas conversaciones, ajustando hasta que el resultado cuadraba.

Es el mismo ciclo de siempre: contexto, iteración, revisión. Solo que en lugar de alternar entre documentación y editor, alternas entre lo que quieres y lo que ya funciona.

Diseño

Sin librerías de UI. CSS custom properties, un reset mínimo y tipografía de sistema son suficientes para un blog legible. El modo oscuro viene gratis con prefers-color-scheme.

Lo que viene

  • Página de tags/categorías
  • Feed RSS
  • Búsqueda en el cliente

Por ahora, esto es suficiente para empezar a escribir. El mejor blog es el que funciona.