David Novella

Una web estática hecha con Swift

Existiendo Hugo, Eleventy, Astro y una docena más de generadores de sitios estáticos bien mantenidos, he montado esta web con Publish, de John Sundell. Es una decisión discutible, así que la explico.

El motivo, además de no querer hacer nada con Wordpress

Publish me deja definir la web como un struct:

struct DavidNovella: Website {
    enum SectionID: String, WebsiteSectionID {
        case apps
        case blog
    }

    var url = URL(string: "https://davidnovella.es")!
    var name = "David Novella"
    var language: Language { .spanish }
}

Y el tema como funciones que devuelven HTML, con el compilador vigilando:

func makeItemHTML(for item: Item<Site>,
                  context: PublishingContext<Site>) throws -> HTML {
    HTML(
        .lang(context.site.language),
        .head(for: item, on: context.site),
        .body {
            SiteHeader(currentPath: item.path)
            Wrapper {
                H1(item.title)
                Div(item.body).class("content")
            }
        }
    )
}

No hay plantillas con llaves dobles ni errores que aparezcan al generar. Si me invento un campo de metadatos, no compila. Es la misma sensación que trabajar con SwiftUI, aplicada a HTML.

Los inconvenientes

Conviene decirlos:

  • Publish lleva tiempo sin actualizarse. La última versión etiquetada es la 0.9.0. Compila sin problemas con Swift 6.4, pero no esperes correcciones.
  • La comunidad es pequeña. Comparado con Hugo, aquí hay poco escrito y pocos temas que copiar.
  • El ecosistema de plugins es mínimo. Lo que necesites, probablemente tengas que escribirlo tú, aunque escribir un PublishingStep es sorprendentemente poco código.

Conclusión

Como ejercicio para crear una web que me resulte mantenible con poco esfuerzo creo que es un buen comienzo. Más adelante veré si me toca cambiar a otra herramienta de generación o si hago un fork de Publish y cambio alguna cosa.