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

Escribo Swift todo el día. Publish me deja definir la web como un tipo:

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.

Para quién tiene sentido

Si escribes Swift a diario y tu web es pequeña, la balanza sale a favor: montarla es cuestión de una tarde y el mantenimiento es escribir Markdown. Si no, casi cualquier otro generador te va a dar menos trabajo.