Este blog lo movía Blosxom, un motor en Perl de 2003 con una idea central: publicar consiste en dejar un fichero de texto en una carpeta. Sin base de datos, sin panel, sin instalación. La idea sigue siendo buena. Lo que ya no compensa es que un servidor ejecute código en cada visita para reconstruir una página que no cambia desde 2012.
Así que lo he reconstruido como sitio estático, conservando el flujo de trabajo y cambiando lo que hay debajo.
El rescate
Un guion de 162 líneas recorre el sitio publicado y extrae de cada página el título, la fecha, la hora, la categoría y el cuerpo. Otro de 308 los convierte a Markdown. Cada entrada queda con una cabecera de metadatos como esta, y la línea que importa es la última:
---
title: "Qué es la Web 2.0 en 5 minutos"
date: 2008-02-20
time: "20:26"
category: web20
slug: web20_in_5_minutes
source_url: https://.../blog/web20/web20_in_5_minutes.html
---
El source_url guarda la dirección que la entrada tenía publicada, y con ella el generador reproduce esa misma ruta. Una entrada que alguien enlazó en 2009 sigue estando donde estaba. Cambiar la tecnología de un sitio debería dejar intactos los enlaces que otros hicieron hacia él: el que se muda es uno, no ellos.
El generador
427 líneas de Python y una sola dependencia, la librería markdown con las extensiones extra y sane_lists. No hay motor de plantillas: el HTML se compone en funciones. Eso quita flexibilidad y ahorra un árbol de dependencias que mantener durante los próximos diez años.
Cada entrada se carga en una clase que resuelve los metadatos con valores de reserva, de modo que escribir cueste lo mínimo:
- si falta
category, se toma el nombre de la carpeta; - si falta
slug, el nombre del fichero; - si falta
date, la fecha de modificación del fichero, avisando por consola, porque esa suposición sí puede salir mal.
Escribir una entrada nueva se reduce, así, a crear posts/sistemas/lo-que-sea.md con un título y una fecha.
El resumen que aparece en la portada tiene más trabajo del que parece. Lo obvio (cortar los primeros 160 caracteres) falla en cuanto una entrada abre con una imagen, una cita o un bloque de código: el resumen sale vacío o lleno de sintaxis. Hay entonces una función que recorre los bloques y devuelve el primero que sea prosa, saltándose encabezados, listas, citas, tablas, imágenes y código; si no encuentra ninguno, devuelve el primero, sea lo que sea. Después se convierte a HTML, se le quitan las etiquetas y se recorta.
Las imágenes llevan otro arreglo pequeño. En el Markdown se escriben en relativo, images/foto.jpg, que es lo cómodo al redactar; una vez convertido, una sustitución las reescribe a /blog/images/foto.jpg. El fichero fuente no tiene que saber bajo qué prefijo se sirve el sitio.
Con todo eso, de 134 ficheros Markdown salen 134 entradas, 37 páginas de categoría, 84 índices por año y mes con su paginación, la portada y el RSS. Tarda menos de un segundo.
Los estilos
Una hoja con variables CSS, lo que permitió unificar la tipografía con el resto del sitio tocando dos bloques: la serif, la sans y la paleta. El resto de la hoja no se enteró.
Ahí apareció un problema que no esperaba. El banner de la cabecera es un PNG de 2007 con el fondo blanco pegado a la imagen. Mientras el blog fue blanco se fundía; al pasar el fondo a crema, el banner empezó a recortar un rectángulo. Se arregla desde el CSS, sin abrir el dibujo:
@media (prefers-color-scheme: light) {
header img { mix-blend-mode: multiply; }
}
multiply multiplica cada píxel por el del fondo. El blanco lo deja pasar tal cual y el resto del dibujo no se altera, así que el PNG de 2007 sigue siendo el de 2007 y es el fondo el que cambia debajo.
Queda un blog que se publica igual que en 2003, dejando un fichero de texto en una carpeta, y que no ejecuta ni una línea de código para servirse.

