This Month in Ladybird: October 2025
October is in the bag, and we merged 217 PRs from 43 contributors. Let's look at some highlights!
Welcoming new sponsors
Ladybird is entirely funded by the generous support of companies and individuals who believe in the open web. This month, we're excited to welcome the following new sponsors:
- Axeptio with $10,000 (their announcement)
 - Gravwell with $5,000
 
We're incredibly grateful for their support. If you're interested in sponsoring the project, please contact us.
Web Platform Tests (WPT)
We've continued to make solid progress on WPT this month. There has been a significant increase in passing subtests, with 111,431 new passing subtests bringing our total to 1,964,649.
The majority of this increase comes from a large update to the test suite itself, with 100,751 subtests being added - mainly due to the Wasm core tests being updated to Wasm 3.0.
This bump has seen us pass over 90% of all WPT subtests for the first time! An important milestone, as this is one of the criteria Apple uses to determine eligibility for alternative browser engines on iOS.
For context, here are the current top 6 browser engines and their WPT scores today vs. one month ago.

HTTP disk cache
Last month, we enabled our in-memory HTTP cache. This cache lives in a single WebContent process, and does not persist across browser restarts.
We've now begun work on a persistent disk cache! (PRs #6435, #6487, #6579, and #6645). This provides a second layer of caching, which will make visits to the same websites much faster.
Performance work
We've made a number of performance improvements this month. Some examples:
- JS string performance optimizations (PRs #6396, #6400, #6401)
 - JS object property assignment optimization (PR #6413)
 - Inline caching for JS object property access in C++ (PR #6474)
 - Faster add/subtract/multiply of two Int32 values when result overflows (PR #6414)
 - Ignore repaints inside iframes with 
visibility: hidden(PR #6555) - Discard heavy UTF-32 buffers after parsing HTML (PR #6561)
 
Trusted Types in the DOM
Continuing work from previous months, Trusted Types support was added to several DOM APIs:
HTMLIFrameElement:srcdocElement:setAttribute,setAttributeNS,setHTMLUnsafe,innerHTML,outerHTML, andinsertAdjacentHTMLDocument:write,writeln, andparseHTMLUnsafeShadowRoot:setHTMLUnsafeandinnerHTMLDOMParser:parseFromStringRange:createContextualFragmentWorker,SharedWorker, andServiceWorkerconstructors
Initial support for XPath evaluations
Some basic support for XPathEvaluator, XPathExpression, XPathResult, XPathNSResolver, and Document.evaluate was added this month.
It uses libxml2 under the hood to run XPath evaluations on an XML tree compatible with the library that is created from our parsed XML tree. (PR #6342)
This is a short-term solution to bring initial support to these classes, because there are differences between the DOM and XML implementations of XPath that are not possible to work around with libxml2.
This enables the htmx library to work in Ladybird:

Audio/Video synchronization, multi-track support
Previously, our media playback implementation relied on separate, unrelated audio and video playback systems to play media files where both are present. This meant that it was possible for audio and video to desynchronize very easily, especially when their seeking behavior was inconsistent.
That implementation has now been replaced with a single new system that controls audio and video playback together, ensuring they remain in sync at all times. (PR #6410)
As part of this reimplementation, several aspects of playback have improved:
- Seeking is done asynchronously, and can therefore complete much faster. Scrubbing the timeline now previews the new playback position instantly, instead of waiting for the mouse button to be released.
 - Media elements now support the audioTracks and videoTracks properties, which allow scripts to interact with multiple audio or video tracks in a file, toggling them at will. The playback system mixes any enabled audio tracks into one output.
 - The fastSeek() function now follows spec with regard to seeking forward when the target is later than the current position.
 
Pinch-to-zoom support
Ladybird now supports pinch-to-zoom on macOS (AppKit UI). The VisualViewport API exposes the zoom transform.
Accessibility DevTools

Since switching away from our own inspector to using Firefox's developer tools, we've been missing a few features. This month we reimplemented inspection of the accessibility tree - a structure parallel to the usual element tree that represents how tools like screen readers see the page. We don't yet support such tools, but being able to examine what's going on inside Ladybird will make that easier. (PR #6462)
CSS Typed OM progress
Continuing from last month, we're still working on the CSS Typed OM API, which allows authors to get and set style
properties using objects instead of strings. Ladybird now supports setting style with most types of CSSStyleValue.
(PRs #6370, #6378, #6440, and #6466)
sibling-count() and sibling-index()
These are relatively new CSS functions that enable authors to style or animate elements differently depending on how many siblings they have and where they appear in that list. This month we implemented support for these. (PRs #6426 and #6526)
CSS and SVG gradients
This month we've improved support for both CSS repeating linear gradients and SVG gradients with coordinates expressed
in objectBoundingBox units. This results in many such gradients looking crisper and more correct! (PRs
6533,
6592)
CanvasPattern
We had preliminary support in place for CanvasPattern, a way to create an image pattern based on an arbitrary image
source such as a canvas, an <img> or even a video frame. We did not actually use this pattern in drawing commands
though, causing some significant graphical artifacts. We do now, which causes the background on
slither.io to finally render correctly!
(PR #6548)

Improved WebGL2 buffer support
We've improved support for the WebGL2 .readPixels() method and implemented the .getBufferSubData() method, which
are used to transfer pixel data between arbitrary buffers by libraries such as SparkJS. (PR
#6637)
Improved offscreen WebGL framebuffer support
An issue with offscreen framebuffers being cleared after frame presentation caused the demo on the PixiJS homepage not to display the masked/warped image of stars/nebulae. This has been fixed, so the demo appears correctly now:
WebGL progress on Google Maps
There were some targeted WebGL fixes for Google Maps Globe View, including:
- Respecting UNPACK_FLIP_Y_WEBGL
 - Returning null for missing uniforms instead of -1
 - Calculating the correct pitch for 16-bit textures
 
This resulted in far fewer visual issues in Globe View; the sky still does not render and remains the biggest outstanding issue.
(PR #6558)
Progress on Windows support
While Windows support is not the focus for the alpha release in 2026, the community has continued to improve it.
This month, Ladybird ran on Windows for the first time:

Here's the Gamepad API working on Windows as well:
(PR #5981)
Credits
We'd like to thank everyone who contributed code this month:
Adam Patterson, Adrian Kiezik, Ali Mohammad Pur, Aliaksandr Kalenik, Amish K. Naidu, Andreas Kling, aplefull, ayeteadoe, Ben Eidson, Callum Law, caztanj, Dave-London, Dowsley, Feng Yu, InvalidUsernameException, Jan Koudijs, Jelle Raaijmakers, Johannes Gustafsson, Julian Dominguez-Schatz, Junior Rantila, ljamar, Lorenz A, lukasxcs, Luke Wilde, Manuel Zahariev, mikiubo, Pavel Shliak, Psychpsyo, R-Goc, rmg-x, Rocco Corsi, Sam Atkins, ste, stelar7, Tete17, Tim Ledbetter, Timothy Flynn, Undefine, vedant-pandey, Zaggy1024