Ehundu, o por qué he acabado escribiendo mi propio generador de sitios estáticos

Ehundu es un generador de sitios estáticos en PHP, libre y con el formato en español. Qué es, por qué existe, qué hace ya en su versión 0.4 y todo lo que todavía le falta.

Ilustración de Nidel, el perro mascota de Ehundu, tecleando en un portátil con el logotipo de la aguja, junto a un ovillo de lana naranja y una taza de Ehundu, con Bilbao y el Guggenheim al fondo por la ventana

El mundo no necesitaba otro generador de sitios estáticos. Yo sí. Llevo años haciendo webs con Eleventy y con Lume, este mismo blog sale de Lume, y aun así a finales de agosto me puse a escribir uno propio. Se llama Ehundu, va por la versión 0.4, es software libre y tiene ya su casa en ehundu.com (abre en ventana nueva).

Como sé que la primera pregunta es «¿pero para qué?», voy a intentar contestarla con calma: qué es, por qué lo estoy creando, qué hay hecho y, sobre todo, qué falta.

Qué es Ehundu

Ehundu es un generador de sitios estáticos escrito en PHP. Le das una carpeta con el contenido en Markdown, los datos en YAML y las plantillas en Twig, y te devuelve un sitio web de HTML plano que se puede alojar en cualquier servidor, del más barato al más serio. Sin base de datos, sin nada que actualizar cada semana y sin nada que puedan hackear un domingo por la tarde.

Hasta ahí, nada que no hagan ya una docena de herramientas estupendas. Lo que tiene de particular está en dónde puede ejecutarse. Los generadores que conozco están pensados para la línea de comandos: los lanzas en tu ordenador o en un servicio de integración continua. Ehundu también funciona así, pero está diseñado para compilar además desde un proceso web, dentro de un alojamiento PHP corriente, con sus límites de tiempo y de memoria.

Dicho sin jerga: una página web puede pedirle a Ehundu que rehaga el sitio y lo publique, sin terminal de por medio.

Por qué otro generador de sitios estáticos

Mantengo unas cuantas decenas de webs de clientes, y mi sitio estático ideal siempre ha tropezado en el mismo punto: el día en que el cliente quiere cambiar un horario sin llamarme. Con las herramientas habituales, eso se resuelve encadenando piezas. Un editor que escribe en un repositorio Git en la nube, un servicio que detecta el cambio y compila, otro que aloja el resultado. Funciona, pero son tres servicios ajenos entre el cliente y su propia web.

Y de servicios ajenos he aprendido a desconfiar. He visto a más de un proveedor cambiar precios y condiciones de un día para otro, y cada vez toca decidir si tragas o si te mudas con todo a cuestas. De ahí sale el principio que gobierna el proyecto: dependencias de software libre, todas las que hagan falta, porque se pueden conservar y mantener; dependencias de servicio, las menos posibles. La prueba que le paso a cada pieza es cuántos proveedores ofrecen lo mismo con la misma interfaz y cuánto tardaría en irme.

Por eso Ehundu publica en una carpeta, por FTP, por SFTP o en cualquier almacenamiento compatible con S3, y no habla la API particular de ningún proveedor. Y por eso todo lo que define un sitio vive en su carpeta: copiada a otra máquina, compila igual.

Encima de este motor estoy construyendo una herramienta de edición para mis clientes, que es la que aprovecha lo de compilar desde la web. Esa pieza no será software libre y prefiero decirlo ya. Pero el contenido del cliente seguirá siendo una carpeta de ficheros que puede llevarse cuando quiera y seguir publicando con el motor libre, sin mí. Me parece la única forma decente de vender algo cerrado.

Un formato en español, a propósito

En un proyecto de Ehundu las carpetas se llaman contenido, plantillas y publico, y los campos de cada página titulo, fecha o etiquetas. Los mensajes de error están en español y señalan el fichero y la línea. Hasta el código por dentro está escrito en español, con clases que se llaman Pagina o Coleccion.

Es una decisión deliberada y de las pocas que no admiten discusión. La comunidad hispanohablante que hace webs es enorme y casi todas sus herramientas le hablan en inglés. Para quien venga de Eleventy o de Lume se aceptan los nombres ingleses de siempre (title, date, tags), así que migrar no obliga a reescribirlo todo.

El nombre, la aguja y Nidel

Ehundu significa «tejer» en euskera. Web, en inglés, es literalmente una tela, un tejido, y un generador de sitios hace justo eso: entrelazar contenido y plantillas hasta que sale una página. Se pronuncia más o menos «e-ún-du».

La aguja del logotipo también tiene nombre. Se llama Nidel, como mi perro, al que adopté cuando estaba en un pajar. Nidel suena a needle, «aguja» en inglés, así que el chiste de la aguja en el pajar venía hecho. No todos los proyectos de software pueden presumir de mascota con historia real.

Qué hay ya en la versión 0.4

Lo que hay compila sitios de verdad. Varias webs de clientes están ya publicadas con Ehundu, alguna en castellano y euskera, y la propia ehundu.com está hecha con él. Para comprobar que no me engañaba, los primeros sitios se migraron desde Eleventy comparando el HTML página a página, con cada diferencia explicada.

Tiene tres órdenes. compilar genera el sitio; servir lo previsualiza en el navegador y rehace solo lo que afecta a cada cambio, en décimas de segundo; desplegar sube lo nuevo, borra lo que ya no se genera y no toca nada más de lo que haya en el servidor.

php ehundu.phar compilar mi-sitio

Por el camino han ido entrando los sitios en varios idiomas, con un fichero por idioma y las traducciones enlazadas entre sí; un sitemap.xml y un feed; unos atajos para meter imágenes, vídeos o descargas en el texto sin ensuciar el Markdown; y la posibilidad de que una página salga además en PDF, que es justo lo que pide la carta de un restaurante. Todo ello con PHP 8.4 y sin programas externos, en un único fichero ehundu.phar o como paquete de Composer, bajo licencia MIT.

Cómo lo estoy construyendo

Para escribir el código de Ehundu me estoy apoyando en Claude Code, un asistente de programación con inteligencia artificial, y cada commit del repositorio lo dice. No quiero esconderlo ni venderlo como un mérito. Es, sencillamente, cómo lo estoy haciendo y me está permitiendo un ahorro considerable de tiempo.

Lo que sí he cuidado es el método. Antes de cada pieza de código hay una decisión escrita, numerada y con su motivo, en un documento que describe el formato y que manda sobre el código cuando no coinciden. Van más de cien. Detrás hay más de cuatrocientas pruebas automáticas, y una regla que me repito a menudo: si algo es ambiguo, se para, se decide, se anota y luego se programa.

Esta forma de trabajar ha tenido una consecuencia que no esperaba. Mi intención era alojar el código en Codeberg, que es europeo y sin ánimo de lucro, pero sus socios votaron en julio no admitir proyectos escritos en su mayor parte con IA generativa. Llegué a subir la primera versión antes de enterarme y la retiré el mismo día. El código vive en GitHub, que es precisamente el tipo de dependencia que quería evitar, aunque con Git mudarse consista en cambiar una dirección.

Qué falta

Falta bastante, y prefiero contarlo yo. Lo primero es llegar a la versión 1.0, que significa cerrar el formato: hasta entonces puede cambiar, y aunque cada cambio queda anotado, no es lo mismo. Con la 1.0 debería llegar también la compilación por lotes, que es lo que permitirá rehacer sitios grandes desde un proceso web sin chocar con los límites de tiempo.

Más adelante quedan los componentes con parámetros, las imágenes en varios tamaños, la paginación de listados y la búsqueda. Hoy Ehundu no procesa imágenes, no compila CSS ni JavaScript y no ejecuta código propio de cada sitio, y eso es a propósito: he preferido que haga pocas cosas y que el formato reserve ya el hueco de las que vendrán.

Falta documentación en inglés, que por ahora solo existe en español. Falta una web con una guía de verdad, porque la actual es poco más que una portada. Falta terminar la herramienta de edición, que está todavía en la mesa de diseño. Y falta lo más difícil de conseguir: que lo use alguien que no sea yo.

Para quién puede ser útil

Si haces webs pequeñas y medianas, te gustan los sitios estáticos, trabajas con alojamientos PHP de toda la vida y te cansa depender de una cadena de servicios para publicar una coma, puede que Ehundu te interese. Si necesitas un ecosistema maduro, con cientos de extensiones y una comunidad detrás, todavía no es tu herramienta, y no pasa nada por decirlo.

El código y la documentación están en GitHub (abre en ventana nueva) y la portada en ehundu.com (abre en ventana nueva). Si lo pruebas y algo no se entiende, o no funciona, o directamente te parece una mala idea, me encantará saberlo. Las telas salen mejor cuando alguien más tira del hilo.

···
Otras entradas