versión 3, todo junto
La versión 3 traía un mapa con cuatro direcciones: el blog se lee, el sitio se convierte en un lugar, el sistema se vigila a sí mismo, y todo el conjunto se vuelve permanente sin hacer ruido. La primera ola pequeña salió la semana pasada. Esto es todo lo demás, ocho cambios, llegados juntos.
El blog se lee. Ahora puedes suscribirte por correo, a cada entrada o a un resumen semanal, con un paso de confirmación y una baja de un solo clic que nunca te pide iniciar sesión. El blog también habla webmention ahora, así que cuando enlazo el sitio de alguien, su servidor se entera, y cuando alguien enlaza aquí, lo veo en una cola de moderación antes de que aparezca nada en una entrada. Y lo grande: el blog está en el fediverso. Puedes seguirlo desde Mastodon o cualquier cosa compatible, y las entradas publicadas llegan a tu feed como una nota. Todo lo que vuelve, respuestas, me gusta, impulsos, se guarda en privado para que yo lo lea y nunca se publica automáticamente. La pieza de federación corre como su propio servicio pequeño, así que si algún día quiero quitarla, paro un contenedor y el resto del sitio ni se entera.
El sitio se convierte en un lugar. Ahora hay una sección de rutas, turer, donde cada ruta es un track GPX dibujado sobre un mapa real, con distancia y desnivel calculados desde el archivo cuando lo subo. Los mosaicos del mapa vienen de OpenStreetMap y solo se cargan en esas páginas, algo que la página de privacidad ahora explica. Hay un registro de entrenamiento, entradas simples y estructuradas con un enlace a una entrada cuando una carrera merece palabras, y la entrada recibe a cambio una pequeña caja de estadísticas. Y los dibujos por fin tienen su propia sección en lugar de esconderse dentro de álbumes de fotos.

La nueva página de paneles: errores, tráfico, entradas más leídas, y cuándo envió cada servicio su última línea de registro.
El sistema se vigila a sí mismo. El panel de administración recibió paneles de control dibujados a partir de las analíticas y el almacén central de registros, gráficos SVG hechos a mano, sin librería de gráficos. Al lado está la alerta: cada servicio ahora envía una señal de vida, y si uno se queda callado, o los errores empiezan a dispararse, recibo un correo. Se configura desde el panel de ajustes, apagado por defecto, como todo lo demás aquí.
El botón de publicar es donde se encuentra toda la ola. Publicar una entrada ahora pone en cola los correos del boletín, pone en cola webmentions para cada enlace externo que contiene, y notifica a los seguidores en el fediverso, todo en la misma transición de estado:
if status == "published" && previousStatus != "published" {
if err := s.Queries.EnqueueNewsletterPost(ctx, updated.ID); err != nil {
recordErrorLog(r, http.StatusInternalServerError, "internal_error", ...)
}
if canonicalURL, err := s.Settings.GetString(ctx, "site.canonical_url"); err == nil {
webmention.EnqueueOutbound(ctx, s.Queries, updated.ID, canonicalURL, updated.Content)
}
go s.notifyFederationPublish(updated)
} else if previousStatus == "published" && status != "published" {
go s.notifyFederationUnpublish(updated)
}Ocho ramas fusionándose en una es donde viven los errores, y recogí unos cuantos. Dos funciones habían reclamado el mismo número de migración de base de datos, algo que la herramienta de migración trata como dos archivos que insisten en ser el paso 21; uno de ellos fue renumerado antes de que se ejecutara nada. El nuevo servicio de federación casi repite un fallo antiguo: hace meses el servicio de correo estuvo desactivado en silencio en producción porque una variable de entorno estaba vacía, y el cableado de federación tenía exactamente la misma variable vacía por defecto esperando para hacer exactamente lo mismo. Esta vez lo atrapé antes del despliegue. Y la propia configuración de despliegue se había olvidado de que el nuevo servicio existía, lo que habría hecho que el servidor intentara compilar código fuente que no tiene. La lección que enseñó la versión 2 sigue valiendo: que el código esté bien es la mitad del trabajo, el cableado alrededor es la otra mitad.
Eso es la versión 3. Al blog se le puede seguir, suscribir, y enlazar. El sitio tiene lugares para caminar, correr y dibujar. Y cuando algo se rompe a las tres de la madrugada, me manda un correo en lugar de esperar a que lo note.