Version 0.3 · the format may change until 1.0
Weave static sites with PHP.
Ehundu turns Markdown, YAML data and Twig templates into a plain HTML site. From the terminal or from a web process, on any hosting that runs PHP.
composer require ehundu/ehundu
How it works
A folder goes in, a site comes out.
-
Write
Every page is a Markdown file with a short front matter. What all the pages in a folder share, such as their tag or their URL pattern, is written once in its _datos.yml.
structure mi-sitio/ sitio.yml contenido/ index.md blog/ _datos.yml primer-articulo.md plantillas/ pagina.twig publico/ img/ portada.jpg -
Compose
Templates are Twig, with collections and dates in each page's language. Shortcodes insert images, videos or documents without writing HTML in the text.
blog/primer-articulo.md --- titulo: Primer artículo fecha: 2026-10-01 --- Texto del artículo en **Markdown**. [imagen fichero="img/portada.jpg" alt="La portada"] -
Publish
One command builds the site as plain HTML and another uploads it to a folder, over FTP or SFTP, or to any S3-compatible storage. Only what has changed is uploaded.
terminal $ ehundu compilar mi-sitioCompilado: 2 páginas y 1 fichero en 0,09 s. $ ehundu desplegar mi-sitioCompilado: 2 páginas y 1 fichero en 0,07 s. subido img/portada.jpg subido blog/primer-articulo/index.html subido index.html subido sitemap.xmlDesplegado en sftp://yo@ejemplo.com/www: 4 ficheros (16 kB) subidos en 0,62 s.
What sets it apart
It also builds from the web.
The usual generators are designed for the command line. In Ehundu, the command is a thin layer over a library, and a PHP program can use that same library to build the site within a web request, on ordinary shared hosting.
So an editing tool can save a change and publish the site right away. And whoever prefers their text editor gets exactly the same result from the terminal. Errors and warnings point to the file and the line, ready to be shown as they are (for now, in Spanish).
use Ehundu\CompiladorEnProceso;
use Ehundu\Proyecto;
$proyecto = Proyecto::abrir('/ruta/a/mi-sitio');
$informe = (new CompiladorEnProceso())->compilar($proyecto);
echo $informe->resumen();
// Compilado: 2 páginas y 1 fichero en 0,09 s.
foreach ($informe->avisos as $aviso) {
echo $aviso; // con su fichero y su línea
}
Principles
Few pieces, all yours.
-
Plain PHP
It runs on PHP 8.4 or later and needs no external programs or unusual extensions. If a hosting runs PHP, it can run Ehundu.
-
Your content is files
Markdown, YAML, templates and static files. No database and no hidden state; a folder copied to another machine builds the same.
-
No service lock-in
It relies on free software that can be kept and maintained, never on services whose terms can change overnight. It publishes without any provider's own API.
-
In Spanish
Folders are called contenido, plantillas or publico, and fields titulo, fecha or etiquetas. The usual English field names are accepted, to make migrating from Eleventy or Lume easier.
The name
A needle in a haystack.
Ehundu is Basque for “to weave”. That is no accident: a web is literally a woven fabric, and a site generator does just that, interlacing content and templates until they form pages.
The needle in the logo has a name too. Nidel was in a haystack the day I adopted him, and the name sounds like needle. It was, quite literally, finding a needle in a haystack.
It is pronounced roughly “eh-OON-doo”.
Project status
Thread by thread.
Ehundu already builds, previews and publishes real sites, multilingual ones included. Until 1.0 the format may still change, and every change is recorded, with its reason, in the decision log. The documentation is in Spanish for now and will be available in English too.
-
Now
Version 0.3
Markdown, data and Twig templates, shortcodes, a preview that rebuilds only what changes, deployment to a folder, over FTP or SFTP or to S3, and multilingual sites.
-
Next
Version 1.0
A settled format, so that no later change forces existing sites to be touched, and batch builds for web processes with a time limit.
-
Later
What grows
Components with parameters, images in several sizes, paginated listings and search. The format already leaves room for all of them.