DevOps

Servo 0.6.0: CSS Grid por defecto, SpiderMonkey 153 y Clang 19 obligatorio

Servo es el motor de navegador open source escrito en Rust que está detrás de la librería libservo y de servoshell, el navegador de demostración que permite probarlo sin construir nada encima. El 18 de octubre Michael Larabel publicó en Phoronix el resumen del reporte de estado de agosto, que llegó acompañado del tag v0.6.0 (LTS) publicado el 29 de septiembre. Para un administrador de sistemas Linux, este release importa por tres razones concretas: el motor ahora activa CSS Grid por defecto, el motor de JavaScript subió de SpiderMonkey ESR 140 a ESR 153, y el build exige Clang 19 como mínimo en todas las plataformas. Ese último punto es el que rompe pipelines de CI Overnight sin avisar.

TL;DR — Lo que vas a tener al final

  • CSS Grid por defecto: sitios con layout moderno que antes se renderizaban rotos ahora se ven bien, sin flags experimentales.
  • Clang 19 mínimo en todas las plataformas: requisito duro de build. Si tu imagen de CI tiene Clang 15 o 18, la compilación falla.
  • SpiderMonkey v153: sube el motor de JavaScript de la rama ESR 140 a ESR 153, con fixes de seguridad y de crashes.
  • 417 commits acumulados en el release, todos los cambios de agosto más trabajo previo sin tag formal.
  • Cambios que rompen API de embedding: toggle_sampling_profiler eliminado y variantes de MouseButton renombradas.
  • Preferencias renombradas o eliminadas: Servo entra en panic si le pasas una preferencia que ya no existe. Valida tus overrides antes de desplegar.

Servo 0.6.0: los números del release

El tag v0.6.0 se publicó el 29 de septiembre de 2026 sobre el commit c78d2c2 y quedó marcado como LTS. No es un release mayor de functionality interna: es el corte que empaqueta todo el trabajo de agosto, que el equipo del proyecto resume en 417 commits según el reporte publicado el 9 de octubre.

Dato Valor Qué implica para operación
Tag v0.6.0 (LTS), 29 sep 2026 Base del próximo ciclo de soporte largo, solo receives security fixes.
Commits acumulados 417 (agosto) Volumen alto: hay regresiones posibles en cualquier área.
Motor JavaScript SpiderMonkey v153 (desde ESR 140) Salto de rama ESR: fixes de seguridad y de crashes de upstream.
Compilador mínimo Clang 19 en todas las plataformas Requisito duro. Verifica tu imagen base de build antes de actualizar.
MSRV Rust 1.88 El árbol trabaja con Rust 1.97.1; 1.88 es el mínimo soportado.
CSS Grid Activado por defecto Sin flag. Cambia el render de sitios con grid, no la configuración.
Threadboost Experimental, +50% en Speedometer Inicialmente solo OpenHarmony. No esperes el gain en Linux todavía.
Caché HTTP en disco Opt-in, sin forma de limpiar Flag --pref network_http_disk_cache. Cuidado con crecimiento de disco.
Donaciones 8.128 USD/mes (+3%) Sostenimiento del proyecto vía CI y benchmarking.

Avances de agosto en Servo

CSS Grid activado por defecto

Es el cambio funcional más visible del mes. El pull request #45621 de @nicoburns activa el soporte de CSS Grid a enabled por defecto, así que no hace falta pasar ninguna bandera de línea de comandos. El equipo del proyecto muestra comparativas antes/después de v0.5.0 y v0.6.0 en sitios como 2026.rustweek.org y labs.jensimmons.com, y el resultado es que el layout tradicional con grid pasa de roto a correcto.

Para un sysadmin esto no cambia la configuración del motor, pero sí cambia el comportamiento de cualquier cosa que renderices: capturas de pantalla de tus servicios internos, PDFs generados desde HTML, o un pipeline de scraping visual. Si tienes tests de regresión visual, el diff de imágenes va a ser grande en la primera corrida después del upgrade. No es un bug, es el grid dejando de estar roto.

El soporte no se quedó en el interruptor. La actualización a Taffy 0.14 eliminó varios crashes de CSS Grid, añadió soporte de nombres de grid, mejoró el dimensionamiento intrínseco y el rendimiento del path de layout. También se corrigieron issues de baseline en la integración de Taffy con grid.

SpiderMonkey 153: el cambio de seguridad

Servo subió su motor de JavaScript de la rama ESR 140 a SpiderMonkey v153 (PR #47489, @sagudev y @Gae24). El reporte de agosto lo describe textualmente como un cambio que trae muchos fixes de seguridad y de crashes en la integración del motor JS.

Este es el motivo principal para actualizar si vienes de una versión antigua, y el motivo por el que el tag se marcó LTS: la rama ESR de Mozilla es la que recibe backports de CVE. Quedarse en ESR 140 te deja fuera de los patches de seguridad upstream aunque el resto de Servo esté al día.

El proyecto también siguió limpiando la integración con Rust para que sea más segura y fiable, y theres un trabajo en curso para impedir estáticamente un footgun que provoca ciclos de GC no recolectables y fugas de memoria. Si tienes un embedder de libservo en producción, ese punto es el que hay que vigilar en el monitoreo de memoria.

Caché HTTP respaldada en disco

Servo ahora soporta una caché HTTP en disco que se activa con --pref network_http_disk_cache (PR #43819, @Narfinger). La caché persiste entre ejecuciones, lo cual es útil cuando automatizas navegación repetida contra los mismos recursos y quieres evitar tráfico de red redundante.

El detalle operativo importante está en el propio reporte de agosto y conviene repetirlo: no hay todavía ninguna forma de limpiar esa caché. No hay flag, no hay comando, no hay endpoint. Para un sysadmin esto significa que el directorio de caché tiene que entrar en tu rotación normal de archivos temporales, porque nada dentro de Servo lo va a limpiar por ti. Si lo montas dentro de un contenedor, el límite de tamaño lo tienes que poner tú con tmpfs o con --tmpfs.

Threadboost: el Experimental de performance

Threadboost es un mecanismo experimental que el equipoLQ reporta como capaz de mejorar los resultados de Speedometer en un 50% y permitir que el renderizado en canvas llegue a 60 FPS. Viene de los PRs #46843 y #47027.

Si estás desplegando en Linux, el dato relevante es este: threadboost está habilitado inicialmente solo para OpenHarmony, y se espera expandirlo a otras plataformas basadas en Linux. Traducido: el +50% es real pero todavía no es un número que puedas prometer en tu infraestructura. Trátalo como resultado preliminar promisorio, no como una ganancia consolidada.

El resto del trabajo de performance del mes sí es general: remoción de asignaciones innecesarias, reducción de interacciones con el garbage collector para mejorar el performance JS, savings en el tamaño final del binario, memory-mapping de datos de fuentes en plataformas como macOS y OpenHarmony, y sacar la lectura de fuentes del sistema del critical path de arranque del motor. También se agregó la preferencia thread_pool_canvas_workers para ajustar los hilos del renderer de canvas según lo que necesite cada embedder.

APIs nuevas de plataforma web

La lista de agosto es larga y conviene revisarla completa porque varios de estos cambios cambian comportamiento observable en automatizaciones:

  • CSS: soporte de touch-action, animation-composition, color-scheme, y valores nuevos de text-transform (full-width, math-auto, full-size-kana).
  • DOM: requestAnimationFrame() en DedicatedWorkerGlobalScope, ancestorOrigins en Location, imagesrcset e imagesizes en <link rel=preload as=image>, style en CSSFontFaceRule, isReloadNavigation e isHistoryNavigation en Request, name=color-scheme en <meta>, eventos focusin y focusout, y el constructor new TextEvent().
  • Workers: la animación de workers ahora entrega frames de animación, lo que abre la puerta a animaciones CSS dentro de workers.
  • ServiceWorker: la interfaz CookieStore detrás de --pref dom_cookiestore_enabled, más la interfaz Cache.
  • Audio: PeriodicWave y createPeriodicWave en BaseAudioContext, más trabajo preparatorio para AudioWorklet que todavía no está habilitado en este release.

Accesibilidad y la métrica LCP

La accesibilidad se habilita con --pref accessibility_enabled. Dos avances concretos: el árbol de accesibilidad ahora reporta posiciones y tamaños de los elementos (PR #46996), lo que hace que macOS VoiceOver funcione de forma bastante más confiable, y se reportan muchos más roles ARIA, incluyendo alert, application, banner, caption, code, complementary, contentinfo, definition, figure, generic, main, navigation, note, search, status, timer y time.

El soporte de Document.execCommand() mejora rápidamente y se activa con --pref dom_exec_command_enabled, aunque sigue siendo una API obsoleta de la que conviene huir en código nuevo.

Para performance web, hubo progreso grande en LargestContentfulPaint detrás de --pref largest_contentful_paint_enabled: soporte de los atributos element y loadTime, URLs de poster en elementos video, información de tamaño precisa, y pintado de nodos de texto. También hay una mejora práctica para cualquiera que diagnostique memory: about:memory ahora desglosa el uso por árbol de documentos, interfaces que no son DOM, base de datos de cookies del stack de red, y backend del renderer de canvas, en lugar de reportarlo todo como un único número js/malloc-heap sin diferenciar.

Navegación, about:blank e iframes

Esta es la parte menos vistosa pero la que más afecta a las integraciones reales. El reporte de agosto llama a la navegación, la carga de documentos y el session history “some of the gnarliest parts of the HTML specification”, y el resultado acumulado es que las páginas que abren ventanas adicionales o incluyen iframes ahora funcionan de forma mucho más confiable.

Los cambios concretos incluyen: las traversals de session history ahora esperan a que la traversal en curso termine, las navegaciones a about:blank se saltan si el documento about:blank inicial está presente, esos documentos ya no usan el parser HTML asíncrono ni reportan readyState de LOADING, y abrir ventanas auxiliares espera a despachar el evento load hasta que el about:blank inicial fue reemplazado. También se mejoró canPlayType() en HTMLMediaElement para que Servo reporte correctamente que el contenido MP4 es reproducible.

Otros arreglos relevantes para scraping y crawling: se corrigieron hyperlinks de URLs blob:, el Get Element Tag Name de WebDriver, los fallos de fetch de módulos JS ahora pueden reintentarse, y cancelar solicitudes de red en curso al navegar.

Android pasa a Kotlin y Compose

El port de Android se convirtió a Kotlin con Compose UI (PRs de @veyndan), y se le quitó de encima una Responsabilidad a los consumidores de la librería: ya no son responsables de implementar soporte de pause y resume. Además, el device_pixel_ratio_override ya no se ignora en Android y OpenHarmony. También hay mejores fallbacks de fuentes para caracteres CJK.

Lo que rompe tu pipeline de build

Esta es la sección que importa si tienes un embedder de libservo en producción. Son cambios de API, no de comportamiento, y todos landed en 0.6.0.

Clang 19 es ahora obligatorio

El PR #47421 de @jschwe establece que construir Servo requiere al menos Clang 19 en todas las plataformas. Esta es la razón más común por la que un build que funcionaba en 0.5.x falla de la noche a la mañana. Si tu Dockerfile base tiene Clang 18 de Debian bookworm o de Ubuntu LTS, ahí está tu fallo. Verifica el compilador antes de tocar nada más.

Preferencias renombradas o eliminadas: Servo hace panic

Este es el detalle que más problemas causa en despliegues automatizados. El reporte de la rama LTS es explícito: “Several Preferences were renamed or removed. If you use a preference that doesn’t exist servo will panic.” Traducido: Servo no ignora silenciosamente una preferencia desconocida, aborta el proceso. Antes de actualizar cualquier nodo que pase flags --pref a Servo, valida que todas las que usas siguen existiendo en el tag nuevo.

Cambios que rompen la API de embedding

  • WebView::toggle_sampling_profiler fue eliminado (PR #47014). Para hacer sampling profiling, sigue las instrucciones del capítulo de profiling del Servo Book.
  • Las variantes de MouseButton fueron renombradas: Left/Middle/Right pasaron a Primary/Secondary/Auxiliary (PR #47327).
  • webxr_registry se movió de ServoBuilder a Servo::register_webxr_registry.
  • Nuevo variante de recursos JsonViewerHTML que debes proveer si no usas el feature bundled de recursos baked-in.

Nuevos features de Cargo

Si compilas con features explícitos, estos son los nuevos (todos del PR #44032 y los relacionados con #47197, #47198 y #47200):

  • default_web_features: incluye las features opcionales de plataforma web (WebXR, WebGPU y compañía) en el build. Si venías de 0.1 LTS y no habilitas explícitamente este grupo, upgradeando puedes perder features que antes venían por defecto.
  • bundled: incluye los recursos requeridos dentro del binario.
  • brotli-compression-stream: soporte de contenido brotli en CompressionStream/DecompressionStream.
  • webcrypto: habilita las APIs Crypto y WebCrypto.
  • webgl: habilita WebGL.

El caso especial de ARM64 y jemalloc

Los builds de linux-arm64 fueron customizados para funcionar en Raspberry Pi 5 (PR #47113), configurando jemalloc con páginas de 64KB. El reporte advierte explícitamente: cualquier embedder de libservo que apunte a la misma plataforma necesita un cambio similar si usa jemalloc. Si despliegas en ARM64 con jemalloc, no es opcional, es requisito.

Por cierto, el reporte de Phoronix menciona que threadboost “ofrece speed-ups importantes”, pero el dato del blog del proyecto es más preciso y menos ambiguo: el mecanismo está inicialmente para OpenHarmony. La expansión a otras plataformas Linux está esperada, no entregada.

Instalar Servo 0.6 en Linux

Ruta rápida: binarios nightly

Si lo que quieres es probar sin compilar, el proyecto publica snapshots precompilados diarios con checksum sha256 para x86_64 y aarch64 en download.servo.org. El flujo documentado es:

# Descargar el tarball nightly para tu arquitectura
# x86_64: servo-x86_64-linux-gnu.tar.gz
# aarch64: servo-aarch64-linux-gnu.tar.gz
tar zxf servo-x86_64-linux-gnu.tar.gz
cd servo
./servo https://example.com

Tres errores documentados que vas a ver si te faltan dependencias en runtime, con su solución:

# error while loading shared libraries: libgstwebrtc-1.0.so.0
sudo apt install libgstreamer-plugins-bad1.0-0
# symbol lookup error: undefined symbol: gst_webrtc_data_channel_state_get_type
# -> necesitas GStreamer 1.16+ y gst-plugins-bad 1.16+
# error while loading shared libraries: libunwind-x86_64.so.8
sudo apt install libunwind8

El propio sitio de descargas advierte, en mayúsculas, que no uses Servo para iniciar sesión en tu banco todavía. Trátalo como un motor en evaluación, no como un navegador de producción para contenido no confiable. El proyecto también es explícito sobre el perfil de riesgo: renderizar contenido conocido y confiable es un caso muy distinto de usarlo como navegador para renderizar contenido arbitrario.

Ruta seria: compilar desde fuente

Compilar Servo no se hace con cargo build. El proyecto usa mach, un programa en Python que orchestra el build, los tests y la actualización de dependencias. El flujo completo en una máquina Debian o Ubuntu:

# 1. Dependencias base
sudo apt install curl
curl -LsSf https://astral.sh/uv/install.sh | sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# reinicia la shell para tener cargo disponible
git clone https://github.com/servo/servo.git
cd servo
# 2. Dependencias de sistema las resuelve mach
./mach bootstrap
# 3. Compilar
./mach build
# 4. Ejecutar servoshell
./mach run -d -- https://demo.servo.org

Si ./mach bootstrap reporta que tu distribución no está soportada, las dependencias hay que instalarlas a mano. La lista oficial para sistemas Debian-based es larga e incluye build-essential, clang, cmake, gperf, gstreamer1.0-plugins-{base,good,bad,ugly}, libegl1-mesa-dev, libgles2-mesa-dev, libharfbuzz-dev, libunwind-dev, libxmu-dev, llvm-dev, mesa y los headers de X11. Si usas Ubuntu, el book insiste en añadir libgstreamer-plugins-good1.0-dev además de la lista base.

Los perfiles de build disponibles son debug (por defecto, con depurador y aserciones), release (optimizado, más lento de compilar) y production (solo para releases oficiales). Para tus purposes de servidor, casi siempre quieres release o superior.

Upgrade desde una compilación previa

Si ya tienes Servo clonado y compilado, el upgrade en sí es directo. El riesgo está todo en la validación previa:

cd servo
git fetch --tags
git checkout v0.6.0
# Validar que tu Clang cumple el mínimo nuevo
clang --version   # debe ser 19 o superior
# Recompilar
./mach build -r
# Y sobre todo: audita tus preferencias antes de arrancar

La lista de verificación antes de hacer el deploy en un nodo que renderiza contenido para tus usuarios:

  1. Clang ≥ 19 en el entorno de build. Sin esto, no compila.
  2. Barrer tus flags --pref: los que ya no existen matan el proceso con panic.
  3. Revisar el uso de la API de embedding: toggle_sampling_profiler y las variantes de MouseButton son los dos cambios que compilan con error y son triviales de arreglar, pero hay que saber que existen.
  4. Decidir el feature group: si venías de 0.1 LTS, habilita default_web_features explícitamente o perderás features opcionales.
  5. Si usas jemalloc en ARM64: aplica el ajuste de páginas de 64KB.
  6. Regenerar tus tests de regresión visual: CSS Grid por defecto cambia el render de sitios con grid de forma intentional.
  7. Presupuestar disco para la caché HTTP si activas --pref network_http_disk_cache, porque nada en Servo la limpia.

Errores conocidos y cómo evitarlos

  • El panic de preferencias inexistentes: es el footgun más peligroso del release porque es un fallo duro en arranque, no un warning. Automatiza la validación de tus flags en el pipeline de deploy.
  • La caché en disco que no se limpia: nada dentro de Servo la borra. Pon un tmpfs con límite o una regla de rotación que apunte al directorio de caché.
  • Threadboost no está en Linux todavía: está inicialmente habilitado para OpenHarmony. No lo pongas en un SLA.
  • AudioWorklet sigue sin estar: hay trabajo preparatorio landed en el release pero la API no está habilitada. No cuentes con ella.
  • Prefs de WIP no estables: accessibility_enabled, dom_serviceworker_enabled, dom_exec_command_enabled, largest_contentful_paint_enabled, network_http_disk_cache y dom_cookiestore_enabled son pref de trabajo en progreso. Espérate a que cambien o se renombren.
  • Regresiones de render en sitios con grid: CSS Grid por defecto arregla mucho y puede destapar casos raros. Prueba tus sitios concretos antes de migrar todo el pipeline.

Veredicto para sysadmin

Si mantienes un embedder de libservo: el upgrade a 0.6.0 está justificado por SpiderMonkey ESR 153 y es la base del próximo LTS. Pero no lo saltes: Clang 19, el barrido de preferencias y los cambios de la API de embedding son trabajo real de migración. Hazlo en un environment de pruebas primero.

Si lo estás evaluando como motor ligero de renderizado: CSS Grid por defecto y la selección de texto interactiva cambian la ecuación de “no renderiza sitios reales”. Sigue sin ser un reemplazo de Chromium para producción con usuarios finales, pero para homelab, generación de PDFs desde HTML, o capturas de tus propios servicios ya es una opción seria con una huella de memoria mucho menor.

Si lo quieres para scraping headless: la mejora en iframes, ventanas auxiliares y blob: URLs ataca exactamente los casos que rompían los scrapers. Combínalo con la caché en disco y tienes un pipeline más eficiente, asumiendo que gestionas la limpieza del directorio de caché por tu cuenta.

El proyecto mantiene 8.128 USD mensuales en donaciones, +3% desde julio, que cubren los servidores de CI y de benchmarking, una becaria de Outreachy y el trabajo de los maintainers. Si tu empresa usa Servo, hay programas de thanks.dev y niveles de patrocinio con reconocimiento público.

Preguntas frecuentes

¿Necesito recompilar Servo para usar CSS Grid?

No. CSS Grid está habilitado por defecto en el binario. Solo necesitas una versión que incluya el PR #45621, es decir 0.6.0 o superior. No hay flag que activar.

¿Qué pasa si mi Clang es menor a 19?

La compilación falla. Servo 0.6.0 requiere Clang 19 como mínimo en todas las plataformas. Este es el cambio más disruptive del release para pipelines de CI Overnight. Verifica clang --version en tu imagen base antes de actualizar.

¿Cómo limpio la caché HTTP en disco de Servo?

No puedes, desde el binario. No hay ninguna forma de limpiarla en 0.6.0. Tienes que borrarla tú manualmente desde el sistema de archivos, así que intégrala en tu rotación de temporales.

¿Servo hace panic si le paso una preferencia que no existe?

Sí. Si usas una preferencia renombrada o eliminada, Servo aborta. Esta es una razón concreta para auditar tus flags --pref antes de hacer upgrade, porque el fallo aparece en el arranque, no en la compilación.

¿Threadboost da el +50% de Speedometer en mi servidor Linux?

Todavía no. El mecanismo está inicialmente habilitado solo para OpenHarmony. El proyecto espera expandirlo a otras plataformas Linux, así que trátalo como un resultado experimental y no como una garantía de performance.

¿Puedo actualizar de 0.1 LTS directo a 0.6 sin pasos intermedios?

La documentación de la rama LTS dice que hay demasiados cambios para enumerarlos. Los más grandes para un embedder son los features que ahora están detrás de flags (activa default_web_features explícitamente), el renombrado de preferencias, MouseButton::{Left,Middle,Right} que pasó a Primary/Secondary/Auxiliary, el movimiento de webxr_registry, y el nuevo recurso JsonViewerHTML. La guía recomienda habilitar el nuevo feature group y validar todas tus preferencias.

¿Puedo usar Servo para producción con usuarios finales?

El proyecto es explícito: Servo no tiene todavía release 1.0, y el perfil de riesgo de renderizar contenido conocido y confiable es muy distinto de usarlo como navegador para renderizar contenido arbitrario. Como motor embebido para tus propios contenidos, la evaluación es mucho más favorable. El sitio de descargas advierte expresamente no usarlo todavía para iniciar sesión en tu banco.

Lee también

Alfonso Moreno | Sysadmin Senior

Soy Alfonso, sysadmin senior con RHCE y más de 10 años administrando sistemas Linux para empresas y proyectos personales. Me especializo en infraestructura, redes, virtualización, monitoring, automation y self-hosting. Sobre SoyLinux.com SoyLinux.com es un blog técnico en español sobre Linux, software libre y self-hosting. Lo mantengo en mi tiempo libre. Áreas de expertise - Linux server administration: RHEL, CentOS, Rocky, Alma, Fedora, Debian, Ubuntu - Network services: Postfix, BIND, Samba, NFS, Squid - Virtualización y containers: KVM, Proxmox, Docker, Podman - Monitoring: Prometheus, Grafana, Zabbix - Automation: Ansible, Bash scripting - Self-hosting: Vaultwarden, Nextcloud, Jellyfin, Immich, Homelab Contacto - Email: [email protected]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *