1 puntos por GN⁺ 1 시간 전 | 1 comentarios | Compartir por WhatsApp
  • En abril, Ladybird fusionó 333 PR de 35 contribuidores y recibió nuevas donaciones de 50,000 dólares de Human Rights Foundation y 1,000 dólares de Jakub Stęplowski
  • Se añadieron un visor de PDF en línea, autocompletado de la barra de direcciones basado en historial, un frontend de Linux con GTK4/libadwaita y una UI de administración about:bookmarks, ampliando las funciones de navegación y la UI de escritorio
  • El parser HTML ahora analiza progresivamente el cuerpo de la respuesta y el parser especulativo precarga recursos, mientras que la compilación de nivel superior de JavaScript se movió a un hilo en segundo plano, reduciendo unos 200 ms de tiempo del hilo principal al cargar YouTube
  • El motor de JavaScript mejoró el rendimiento de Speedometer y la carga de sitios reales con caché for-in, un asignador de registros O(1), compartición de identificadores zero-copy, JS::Substring lazy y mejoras en la caché de vistas typed-array
  • Se incluyeron Cache/CacheStorage, image-set(), CSS anchor positioning, DNS asíncrono, renderizado GPU basado en dmabuf, mimalloc por defecto y Rust obligatorio, y la puntuación de WPT subió de 2,003,537 a 2,067,263

Escala de desarrollo y patrocinio

  • En abril, Ladybird fusionó 333 PR de 35 contribuidores, de los cuales 7 hicieron su primer commit en Ladybird
  • Como nuevos patrocinadores, Human Rights Foundation donó 50,000 dólares a través de su programa “AI for Individual Rights”, y Jakub Stęplowski aportó 1,000 dólares
  • Ladybird se financia por completo con el apoyo de empresas y personas que respaldan la web abierta

Funciones de navegación y frontends

  • Visor de PDF en línea

    • Los PDF ahora se renderizan en línea mediante el visor pdf.js incluido (#9132)
    • pdf.js es un visor de PDF escrito solo con JavaScript, HTML y CSS, y ofrece navegación de páginas, selección de texto, zoom y búsqueda dentro del documento
    • Al cargar el Intel ISA Manual con pdf.js, salieron a la luz áreas de mejora en la caché de vistas typed-array y en la invalidación de :has()
  • Historial y autocompletado de la barra de direcciones

    • Al escribir en la barra de direcciones, se muestran sugerencias enriquecidas basadas en el historial, incluyendo favicons y títulos de páginas visitadas anteriormente, atajos de motores de búsqueda y autocompletado general de URL (#8933)
    • HistoryStore, basado en SQLite, guarda el título, favicon, cantidad de visitas y hora de la última visita de toda la navegación
    • La opción “Clear browsing history” quedó conectada en la página de configuración de privacidad, y tanto la UI de Qt como la de AppKit renderizan las nuevas filas enriquecidas
  • Frontend GTK4 / libadwaita

    • Se añadió a Ladybird un nuevo frontend de Linux basado en GTK4 y libadwaita, ofrecido junto al frontend existente de Qt (#8691)
    • Está inspirado en GNOME Web (Epiphany) y, siguiendo las guías de diseño de GNOME, usa un menú hamburguesa y pestañas AdwTabView sin barra de menús
    • Ofrece autocompletado de la barra de URL e icono de seguridad, búsqueda dentro de la página, pantalla completa, menú contextual, diálogos alert/confirm/prompt/color/file, portapapeles, múltiples ventanas, tema claro/oscuro y escalado DPR
    • Aún está en una etapa inicial, por lo que no ha alcanzado la paridad funcional con los frontends de Qt y AppKit
  • Marcadores

    • A los marcadores añadidos el mes pasado se les sumó una UI de administración
    • La página about:bookmarks permite administrar marcadores y carpetas (#8825)
    • La nueva página admite importar y exportar marcadores (#8938)
    • Se añadieron menús contextuales para editar marcadores y carpetas (#8715)
    • Se añadió una marca de tiempo date_added a todos los marcadores y carpetas (#8867)
    • La barra de marcadores permite abrir en pestaña nueva, copiar URL y abrir en pestaña nueva con clic central y Ctrl/Cmd+clic (#8758)
    • Se conectó la API de drag and drop de HTML5, about:bookmarks la usa para reordenar y también funciona en páginas web normales (#8783)

Parsing de HTML, ejecución de scripts y pipeline de renderizado

  • Parsing de HTML especulativo y progresivo

    • El parser de HTML ahora consume el cuerpo de la respuesta de forma progresiva(#9151)
    • Los bytes pasan por un decodificador de texto en streaming y luego entran al tokenizador por fragmentos; si falta entrada, el tokenizador se detiene y luego se reanuda cuando llega más
    • Sustituye el modelo anterior, que esperaba a recibir todo el cuerpo antes de empezar a parsear
    • También se implementó un parser de HTML especulativo(#9114)
    • Cuando el parser principal se bloquea en un script externo síncrono, un tokenizador separado escanea por adelantado la entrada aún no parseada y emite fetches especulativos de recursos <script src>, <link rel=stylesheet|preload> y <img src>
    • Hace seguimiento de <base href> y omite correctamente el interior de templates y foreign content
    • El parser especulativo ahora está conectado al preload map del documento, por lo que los recursos descubiertos especulativamente se deduplican frente a fetches posteriores del parser normal(#9164)
  • Compilación de JavaScript fuera del hilo principal

    • La generación de bytecode del código de nivel superior de los scripts descargados se ejecuta en un pool de hilos en segundo plano(#9118)
    • Los hilos worker crean el bytecode y los datos necesarios para generar Executable, mientras que el trabajo que toca la VM o el heap del GC permanece en el hilo principal
    • Maneja classic script, module y IIFE de nivel superior, y solo la carga de YouTube ya mueve unos 200ms de tiempo del hilo principal a hilos en segundo plano
  • Rasterización por Navigable

    • Cada Navigable se rasteriza de forma independiente en su propio hilo(#8793)
    • Antes, los iframe se pintaban de forma síncrona como display lists anidadas dentro de la display list del padre, por lo que solo estaba activo el hilo de renderizado del traversable de nivel superior
    • La display list del padre ahora hace referencia a la salida rasterizada de cada iframe mediante ExternalContentSource, por lo que invalidar un iframe no requiere regrabar el padre
    • Además del paralelismo, esto también es trabajo preparatorio para mover los iframe a procesos sandbox separados
  • Pintado por GPU basado en dmabuf en Linux

    • En los builds de Vulkan para Linux, WebContent pintaba sobre una surface de Skia respaldada por GPU, pero como el búfer compartido con el proceso de UI era un bitmap de CPU, en cada flush se producía un readback de GPU a CPU
    • SharedImage ahora puede contener handles dmabuf de Linux, de modo que los búferes frontal y trasero permanecen en la GPU hasta el proceso de UI(#8917, #8920)

Rendimiento y compatibilidad del motor de JavaScript

  • Optimización de llamadas JS-a-JS

    • Se aplicaron varios PR para que las instrucciones Call, Return y End permanezcan dentro del intérprete de ensamblador AsmInt en los casos habituales (#8891, #8909, #8912)
    • Para guardar/restaurar registros se usan instrucciones ARM64 paired load/store (ldp/stp) ajustadas manualmente
    • Las llamadas a native function también se despachan directamente desde AsmInt mediante una nueva variante RawNativeFunction que contiene punteros a funciones normales en lugar de AK::Function (#8922)
  • Asignador de registros de bytecode O(1)

    • Generator::allocate_register estaba diseñado para escanear el pool disponible y encontrar el registro con el número más bajo, y solo esta función consumía unos 800ms durante la carga de x.com
    • Después de que terminó el período de equivalencia del pipeline C++/Rust, el asignador se cambió por una simple pila LIFO (#9007)
  • Iteración for-in con caché

    • La ubicación de for (key in obj) almacena en caché una instantánea aplanada de las enumerable keys y la reutiliza mientras se mantengan la shape del receiver, el indexed storage y la prototype chain (#8856)
    • Speedometer 2 subió de 67.7 → 73.6 y Speedometer 3 de 4.11 → 4.22
  • Otras mejoras del motor

    • El parser ahora comparte nombres de identificadores con zero-copy entre el lexer, parser y scope collector, lo que hace que el parsing sea 1.14 veces más rápido en un corpus de JS de sitios web y reduce el RSS en 282MB (#8801)
    • La concatenación de strings cortos omite la representación rope cuando de todos modos el resultado se observará como un flat string, logrando una mejora de 2.13 veces en loops densos de a + b (#9184)
    • Las arrow function con lexical-this ya no asignan un function environment en cada llamada, con una mejora de 2.13 veces en microbenchmarks (#9192)
    • Los sparse array ya no pagan un costo inmediato por los holes, y Array(20_000_000) se mantiene mayormente como metadatos en lugar de realizar trabajo proporcional a 20 millones de elementos virtuales (#8847)
    • El nuevo tipo lazy JS::Substring respalda regexp capture y builtins de strings como slice, split y indexed access, con una mejora de 1.066 veces en el benchmark regexp de Octane (#8863)
    • En el source map de bytecode, la source position ahora se conserva de punta a punta, lo que ahorra unos 250ms en x.com (#9027)
    • TransferArrayBuffer con zero-copy ahorra unos 130ms al cargar YouTube (#9088)
    • La cached typed-array view cambió de WeakHashSet a una intrusive list, ahorrando unos 250ms al cargar el PDF Intel ISA en pdf.js (#9180)
    • Todos los Promise antes asignaban 2 celdas PromiseResolvingFunction con closures AK::Function sin capturas; ahora eso cambió a static functions despachadas mediante un enum Kind, eliminando las asignaciones por resolver (#9188)
    • Al omitir el property-table marking de las shape no dictionary, el tiempo de GC durante la carga de maptiler.com se redujo en 1.3 segundos (#9044)
    • Se agregó un fast path para Array.prototype.indexOf en packed arrays (#9123)
    • Array.prototype.sort ahora reutiliza UTF-16 en caché en vez de retranscodificar en cada comparación (#9036)
    • Se agregaron imports de WASM, JSON y módulos CSS (#6029)
    • Se eliminó el soporte para la propuesta ShadowRealm porque su proceso de estandarización se estancó (#8753)

API de la plataforma web y CSS

  • Cache y CacheStorage

    • Cache y CacheStorage se implementaron de extremo a extremo (#8745)
    • 9 métodos, entre ellos open, has, delete, keys, match, matchAll, add, addAll y put, funcionan sobre un almacenamiento temporal en memoria
  • Funciones de CSS y correcciones de renderizado

    • Se agregó soporte básico para las formas estándar y con prefijo -webkit- de image-set(); al pintar, se elige el candidato de resolución que mejor coincide con la relación de píxeles del dispositivo y se omiten los tipos MIME no compatibles (#9090)
    • Gracias al soporte de image-set(), ahora se muestra la imagen del encabezado de gocomics.com
    • Se agregó soporte inicial para position-anchor y el posicionamiento con anclas de CSS, lo que corrige la posición de la mano y el arma en cssdoom.wtf (#8686)
    • La interpolación de colores se reescribió para ajustarse a css-color-4, interpolando en float en lugar de u8 y manejando de forma consistente componentes missing/powerless, sRGB fuera de gamut y el multiplicador alpha (#8934)
    • Los atributos HTML presentacionales heredados como align y bgcolor ya no escriben propiedades en cascada directamente, sino que pasan por la cascada como declaraciones normales del autor, de modo que la sustitución de var() y el fallback invalid-at-computed-value-time funcionen correctamente (#9176)
    • El cambio en la cascada de presentational hints corrigió un crash en html.spec.whatwg.org
    • <thead>, <tbody>, <tfoot> y <tr> ahora reflejan el atributo presentacional align, lo que corrige la distribución de botones en bricklink.com (#9177)
    • La interpolación de stroke-dasharray permite que los trazos discontinuos de SVG se animen suavemente (#9133)
    • Los elementos con el atributo autofocus ahora reciben foco realmente al cargar la página (#9016)
    • Los marcadores de lista del texto RTL ahora se colocan a la derecha, corrigiendo el renderizado de listas en la Wikipedia en árabe (#9099)
    • La línea base de los contenedores inline flex/grid ahora se deriva de la primera caja de línea del hijo, y no de la última línea envuelta, corrigiendo la alineación del texto de enlaces y los íconos en nos.nl (#9183)

Redes e invalidación de estilos

  • Redes

    • getaddrinfo ya no bloquea el event loop
    • LibDNS ahora ejecuta las búsquedas en el thread pool, emite consultas A y AAAA en paralelo, y fusiona las búsquedas simultáneas del mismo nombre (#9109)
    • Se corrigió la ruta de preconnect de RequestServer para que, en lugar de saltarse el resolver y hacer que el threaded resolver de libcurl provocara pthread_join en el main thread, se enrute por la misma ruta del pool de DNS (#9109)
    • Cuando WebContent iba más lento que la red, el vaciado de datos de respuesta en cola en RequestServer era O(n²), y al abrir un video de YouTube se gastaban unos 30 segundos en memcpy y 3 segundos en Vector::remove
    • AllocatingMemoryStream cambió a una lista de chunks enlazada simple, por lo que el consumo pasó a ser O(1) (#9028)
    • El header Accept de las solicitudes de imágenes ahora anuncia AVIF y WebP para alinearse con otros motores; algunos CDN usan este header para decidir si entregan formatos modernos o un fallback en JPEG (#9046)
  • Invalidación de estilos

    • La invalidación de selectores existente era simple bajo la suposición de que los selectores solo miraban hacia abajo, pero con :host y :has(), los cambios en descendants pueden alterar el resultado de :has() en un ancestor, así que se necesitó un recorrido hacia arriba
    • Se evitó reconstruir toda la caché de style scopes cuando una mutación de stylesheet solo cambiaba un scope, reduciendo la reconstrucción de caché de reglas en Reddit de 13.2 s a 3.2 s (#9138)
    • La invalidación estructural entre siblings ya no se propaga a descendants que no observan la posición, lo que redujo en 11% los recálculos innecesarios en el infinite scroll de Reddit (#9155)
    • La invalidación por mutación de :has() ahora omite anchors no afectados, y se midió una reducción importante en azure.com (#9168)
    • En el PDF de Intel ISA, las visitas a la child-list de :has() bajaron de 71k a 1.6k, lo que ahorra unos 650 ms al cargar pdf.js (#9179)
    • Un nuevo conjunto de pruebas de invalidación estructural reveló varios casos donde faltaba invalidación, y ya fueron corregidos (#9095)
    • También se incluyen mejoras pequeñas alrededor de hover, scope de mutación de stylesheet, mapa de custom properties y diffing de computed styles (#9077, #9049, #9079, #9080, #9141)

Asignación de memoria y sistema de compilación

  • mimalloc como asignador predeterminado

    • El código en C++ y Rust ahora comparte una sola instancia de allocator de mimalloc v2 sin pasar cada uno por el system allocator (#8752)
    • Como no se hace override de malloc() en todo el sistema, las bibliotecas de terceros conservan su propio contrato de allocator
    • Los benchmarks de JS mejoraron en general
  • Rust obligatorio y limpieza del sistema de compilación

    • Se eliminó la opción de compilación ENABLE_RUST, por lo que Rust pasó a ser obligatorio (#8742)
    • El sistema de compilación GN se eliminó por completo y CMake quedó como la única referencia (#8931)
  • Cambios relacionados con GC y memoria

    • Ahora se compila con -ftrivial-auto-var-init=zero para sobrescribir con 0 los punteros viejos de GC al entrar a una función, haciendo que el scanner conservador de stack los encuentre menos (#9171)
    • La propiedad UsedValues, usada rara vez, se movió detrás de un lazy pointer, reduciendo la struct de 424 bytes a 176 bytes, y durante la carga de sainsburys.co.uk LayoutState::populate_node_from() bajó de 139 ms a 65 ms (#9104)
    • Los chunks del cuerpo de fetch, que antes asignaban 7 objetos de GC por chunk al pasar por la ruta de pull-promise, ahora van directo al byte stream controller (#9169)

Mejor comportamiento de los sitios

  • Reddit

    • El carrusel de la galería de imágenes de Reddit ahora funciona, y se corrigieron 2 bugs de layout no relacionados alrededor de ::slotted() matching y de un descendiente con position: absolute dentro de un split inline (#9148)
    • Gracias a TextDecoderStream, la SPA ya no se traga los clics en enlaces y se pueden abrir los comentarios
    • El infinite scroll también se ve afectado por el trabajo de invalidación estructural
  • YouTube

    • YouTube se beneficia de la compilación de JS de nivel superior fuera del hilo principal, de la descompresión WOFF2 fuera del hilo principal, de la reducción del fanout de fetch de @font-face, de una corrección del memory churn de RequestServer y de TransferArrayBuffer zero-copy
    • La descompresión WOFF2 fuera del hilo principal también ahorra unos 170 ms en Gmail (#8976)
    • En la carga inicial, el fanout de fetch de @font-face se redujo de 177 → alrededor de 9 (#9032)
  • Otros sitios

    • En gocomics.com, la imagen del encabezado ahora se muestra gracias a image-set()
    • En yandex.com/maps, el renderizado WebGL de vector tiles funciona gracias a correcciones de WebGL, incluida la extensión WEBGL_debug_renderer_info (#9043)
    • En strava.com, el inicio de sesión funciona porque Navigator.getBattery ahora lanza el tipo de error exigido por la spec en lugar de un error propio (#8770)
    • GitHub Insights carga unos 100 ms más rápido gracias al caché de selectores de Element.matches() y .closest() (#8987)
    • La página de comparación de laptops de tweakers.net es aproximadamente 31% más rápida gracias a la búsqueda indexada de nombres de propiedades de HTMLFormElement (#9009)
    • neon.com ya no se cae (#8812)
    • En channel4.com, se resolvió un problema de alineación vertical del texto de categoría con una corrección en la resolución de auto-margins de flex (#9050)
    • Cloudflare Turnstile todavía no se supera, pero ahora falla mucho más rápido gracias al manejo de auth-scheme, a una optimización de Array.prototype.shift() y al hardening del UA event handler para elementos <input> de tipo range y number (#9063)

WPT y otros cambios de plataforma

  • Web Platform Tests

    • La puntuación de WPT subió de 2,003,537 → 2,067,263, lo que representa un aumento de 63,726 subtests este mes
    • Sin embargo, WPT incorporó desde upstream test262, la suite oficial de conformidad de ECMAScript, y con eso se añadieron 53,207 subtests de JavaScript
    • Ladybird lleva años ejecutando test262 por separado, y como la conformidad de LibJS es buena, pasa 52,045 de ellos, es decir, 97.8%
    • De los 63.7k de aumento, alrededor de 52k provienen de la importación de test262, y los aproximadamente 11.7k restantes sí representan avance real de la plataforma del navegador
    • Con la importación de test262, WPT ahora mide la conformidad de JavaScript junto con el resto de la plataforma
  • Texto, layout, procesos e interfaz

    • La selección y el hit testing de texto con ligaduras dejaron atrás una estructura que asumía una code unit por glyph, y ahora recorren grapheme clusters y reparten el avance del glyph entre esos graphemes (#8829)
    • Establecer innerHTML en un shadow root ya no invalida todo el árbol de layout del documento, y en pomax.github.io/bezierinfo el tiempo de layout-and-paint se redujo en 21% (#9191)
    • Navegar una pestaña emergente a otro sitio ya no termina el proceso WebContent del padre (#8730)
    • En la UI de Qt, Ctrl+Tab y Ctrl+Shift+Tab permiten recorrer las pestañas abiertas (#8704)
    • Se puede hacer scroll arrastrando con el botón central del mouse presionado, o entrar al modo de autoscroll con un clic sin mover el cursor (#8881, #8928)
    • Cuando lo escrito en la barra de direcciones no puede sanearse como URL o consulta de búsqueda, ahora se muestra una página de error adecuada en lugar de descartar la entrada en silencio (#9072)
    • Se implementó TextDecoderStream, la contraparte de streaming de TextDecoder, que retiene UTF-8 parcial en los límites entre chunks y permite editar comentarios en Reddit (#9143)
    • Los mensajes de BroadcastChannel entre procesos ahora se enrutan por IPC entre los procesos WebContent y WebWorker, de modo que funcionan igual que en otros navegadores sin importar en qué proceso esté el listener (#8865)

1 comentarios

 
GN⁺ 1 시간 전
Comentarios de Hacker News
  • Si quieres usar un navegador sin JavaScript, el prototipo de navegador que está haciendo Dioxus también está mejorando bastante.
    Dioxus, un framework GUI en Rust, lo está desarrollando como parte de su renderizador nativo; la dirección es parecida a Flutter en el sentido de crear directamente una alternativa a Skia, pero en la web funciona con los estándares HTML/CSS en lugar de usar solo canvas como Flutter web.
    No depende de código existente de navegadores como Chromium, Gecko o WebKit, y está más cerca de una implementación hecha casi desde cero usando crates de Rust como stylo y taffy, que también usa Servo: https://github.com/DioxusLabs/blitz (/apps/browser)
  • La parte más difícil del desarrollo de navegadores siempre ha sido la compatibilidad web artificial.
    Muchos sitios bloquean a la fuerza la carga en ciertos navegadores y solo permiten Chromium; esa es la realidad con la que se va a topar Ladybird, y es un factor importante que frena la competencia de nuevos navegadores.
    También es muy difícil para un navegador nuevo conseguir DRM Widevine, y ni siquiera Zen Browser, con 10 millones de usuarios, lo ha logrado.
    • Lamentablemente, la nueva generación no aprendió la lección de IE, y termina siendo la primera en quejarse si el otro lado no sigue los vientos de la Chrome OS Platform.
    • No sé qué tan común sea realmente ese tipo de bloqueo.
      He usado Firefox durante los últimos 20 años y nunca me he topado con un sitio que me exija cambiarme a Chromium por compatibilidad.
    • Si ese tipo de barreras artificiales afecta tanto la interoperabilidad, entonces ya se superó el 99% del obstáculo, y la mayor parte puede pasarse disfrazando la cadena User-Agent.
      Widevine sí es una barrera real, pero en la práctica más bien bloquea la reproducción en 4K en algunos sitios de streaming como Netflix o Disney.
      Viendo que Zen reunió 10 millones de usuarios incluso sin Widevine, tampoco parece algo absolutamente crítico.
    • Ladybird justo por esta razón empezó recientemente a identificarse como Chrome.
    • Para fines de pruebas de compatibilidad, se puede imitar el User-Agent.
      Si controlas el navegador mismo, aparte de los problemas relacionados con DRM, casi no hay nada imposible.
  • Parece que ya se está volviendo bastante usable.
    Este tipo de publicaciones me recuerda lo divertido que es leer actualizaciones de emuladores de juegos.
    Algo como “arreglamos el bug X para que Y funcione bien, y como resultado ahora corre el juego Z”; una de las cosas que arreglaron esta vez fue CSS Doom, así que sí hay cierto traslape con el mundo de los juegos.
    • Es una analogía acertada.
      He escuchado a Andreas decir varias veces que hacer un navegador es como hacer un emulador.
      Cada sitio web usa funciones distintas de maneras distintas, y él compara los sitios web con ROMs.
  • Ladybird de verdad va avanzando muy bien.
    Soy usuario veterano de Firefox, pero cuando Ladybird entre en una alfa muy temprana y empiecen a salir builds precompilados, definitivamente quiero probarlo desde el inicio.
    • Si quieres probarlo ahora mismo, es fácil hacer una build local; solo hacen falta unos cuantos comandos para instalar dependencias y ejecutar el script de compilación: https://github.com/LadybirdBrowser/ladybird/blob/master/Docu...
    • Mozilla al menos necesita un buen sacudón.
    • Compilarlo uno mismo también es bastante fácil, especialmente si le pides a Claude Code que lo haga.
  • Qué bien lo de un GTK4 / libadwaita frontend.
    Prefiero la UI/UX de GTK sobre Qt, así que me entusiasma ver avanzar ese lado.
  • strava.com : Login works now that Navigator.getBattery throws the spec-mandated error type instead of one of our own (#8770).
    ¿Por qué Strava querría saber cuánta batería me queda?
    • Lo más probable es que sea para generar una huella digital única para rastreo.
    • También podría estar usando la API de batería como heurística para elegir una versión de sitio de bajo consumo.
      Tal vez haya una versión web orientada a países en desarrollo, o quizá quieran reducir la frecuencia de consulta de ubicación cuando la batería está baja para ahorrar energía.
      Es pura especulación, pero que un sitio como Strava pida información de batería no es algo totalmente absurdo, aunque en general sí se ve un poco sospechoso.
    • Strava es un servicio de seguimiento de rutas.
      Si asumimos que también puede usarse desde el sitio web, es muy probable que intenten ajustar la frecuencia de consulta de ubicación para equilibrar precisión y consumo de energía.
    • Los bots que intentan hacer fuerza bruta sobre cuentas quizá no implementen esa API como lo haría un dispositivo real.
  • Artículo anterior: https://news.ycombinator.com/item?id=47985497
  • Me gusta mucho la dirección que busca SerenityOS, y ojalá mantengan ese enfoque también en el navegador Ladybird.
  • Felicidades.
    Pero la captura de los marcadores de lista en texto RTL se sigue viendo igual.
    En ambos casos, los marcadores de lista están a la izquierda.
  • https://ladybird.org/assets/img/newsletter-apr-2026-reddit-g...
    De verdad respeto a la persona que usó Evangelion r/unixporn en la prueba de Reddit de Ladybird.
    No he visto tanto Evangelion, pero sí he visto muchísimos documentales explicativos y me gusta tanto que hasta lo usé un tiempo como fondo de pantalla.
    El punto clave es que Reddit funciona en Ladybird, y eso es impresionante.
    No sé si YouTube funcione, pero ojalá también, porque ya da la impresión de que Ladybird se está volviendo realmente usable.
    También gracias a https://jakubsteplow.ski/ por apoyar a Ladybird.
    Me gustaría que se diera más visibilidad, y de una forma mejor que anuncios de Google, a la gente que dona a proyectos de código abierto; ojalá a Jakub le vaya muy bien, y ojalá más personas apoyen de forma independiente proyectos como Ladybird.
    También gracias a la https://hrf.org/program/ai-for-individual-rights/ de Human Rights Foundation.
    Es sorprendente e inspirador que una sola persona haya logrado llegar tan lejos en un mundo de navegadores que estaba casi en un estado de monopolio/oligopolio.
    • Me gusta EVA, pero la recomiendo con cierta cautela.
      Tiene básicamente dos caras: una es una ciencia ficción de mechas/alienígenas/monstruos con una estética increíble, y la otra es un drama personal centrado en el auto-odio y la soledad.
      A la mayoría probablemente le atraiga más la primera cara, pero la que sigue permaneciendo hasta hoy es la segunda.
      Si la vas a ver, hay que tener cuidado con el orden.
      Está la línea temporal de la serie original de TV que continúa con la película “End of Evangelion”, y aparte está la serie de películas “Rebuild of Eva”, que empieza como un reboot completo pero de algún modo termina siendo el reboot/remake/secuela final de la obra original.
    • https://ladybird.org/#about
      Como respuesta a “¿cuántas personas trabajan hoy en navegadores?”, actualmente Ladybird dice que tiene 8 ingenieros full-time pagados y además una gran comunidad de contribuyentes voluntarios.
    • YouTube sí funciona en Ladybird.
      La mayor parte también funciona, pero además de la velocidad, el problema más grande es que muchas verificaciones de ‘eres humano’ no funcionan bien en Ladybird.