Hello friends! In October, we moved manner and layout off the chief thread, built a JavaScript JIT, replaced our WebAssembly engine, redesigned the browser UI, and passed Safari Technology Preview on Web Platform Tests. :^)
Ladybird is entirely funded by companies and individuals who accept in the open web. You can see everyone supporting the project on our sponsors page, and we’re grateful to all of them. If you’re curious in sponsoring, delight contact us.
Style and layout no longer delay for JavaScript
Browsers normally run JavaScript, style, and layout on one chief thread, one at a time. While a manuscript runs, the leaf can’t update. A few uncomplicated animations can keep going on the compositor, but everything alternatively has to wait.
We moved manner and layout to their own thread, and coat record to another (#12377, #12400). They now run at the identical period as JavaScript (#12396, #12432, #12460). If a manuscript asks for layout information, akin an element’s size, it waits until pending layout activity is finished, so it never gets old data.

So two things now activity during a lengthy script:
- CSS animations keep operating during JavaScript is busy. This includes animations that alter layout, akin width and font-size (#12433, #12447, #12451).
- :hover keeps operating during JavaScript is busy. The render thread finds the component under the mouse, applies its hover styles, starts any transitions, updates the cursor, and draws a new frame. When the manuscript ends, the chief thread catches up and fires the hover events (#12530).
As far as we know, no another browser can do this today. Here’s a content animation during JavaScript blocks the chief thread in 1.5 second bursts, alongside Ladybird in the top left:
And here’s :hover on a leaf operating JavaScript for 250ms at a time, alongside Ladybird on the remaining and Chrome on the right:
You can additionally try it yourself. The clasp blocks the chief thread for three seconds. Most browsers keep the quadrate spinning, but freeze the bar and the hover target.
A JavaScript JIT
On Linux and macOS, LibJS now compiles hot JavaScript to device code, on the two x86-64 and AArch64 (#12613).
We decided against a JIT in the past, and did what we could to shove and tune the translator instead. It’s already competitive, so making it twice as accelerated would be a huge effort, and that would lone rotate a 300ms suspend into a 150ms hang, which you’d motionless notice. So we needed an optimizing JIT.
The scheme is deliberately boring: speculative optimization according to runtime category profiling, akin another JavaScript engines. For now, we fair desire to go fairly fast.

While code warms up, we document things akin which types and entity shapes it sees (#12588). The compiled code uses those recordings to create guesses, akin “this value is continually an integer”, and inlines small functions (#12595, #12598).
To discover bugs during development, we used a fuzzer that ran the identical code in the JIT and the translator and compared the results (#12601).
A new WebAssembly motor
We replaced our C++ Wasm motor and Cranelift alongside a new motor that has its own translator and JIT (#12963). It supports newer parts of WebAssembly that the old motor didn’t, akin elimination handling and GC. On the JetStream 3 Wasm workloads the two engines can run, it scores concerning 7x higher.

In July, we built flap, a small tongue and compiler for penning LibJS’s interpreter. The Wasm translator is written in flap too, so one origin builds it for x86-64, AArch64, and Windows x64. Hot functions move from there to the JIT, equal in the center of a operating loop.
We’re making awesome advancement on performance. JSLinux, an x86 PC emulator, now boots Alpine Linux to a casing in 1.8 seconds, during Chrome takes 1.5.
Benchmarks

Web Platform Tests (WPT)
On October 26, we passed Safari Technology Preview on WPT. :^) We ended the duration at 2,184,722 subtests, a acquire of 75,650.

Most of that acquire came in five days, from concerning 2.12 myriad on October 22 to concerning 2.18 myriad on October 27. We pointed AI coding agents at WPT and asked them to inhabit in missing functionality. They made many of small fixes, and those added up. Our biggest gains for the duration were concerning 30,000 in /css and 10,000 in /editing.
A new browser UI

Until now, our UI had grown organically, alongside tinkering current and there. This was the archetypal period we sat downward and mapped out a complete design. We kept it humble and quiet, so the notice stays on the page.
It covers tabs, toolbars, menus, and our own about: pages on macOS and Linux, in light, dark, and a violet dreary theme for personal windows (#13271, #13169, #12815).

- Tabs: you can pin tabs, hunt all open tabs, and reconstruct your windows on initiate (#12757, #13271).
- Form controls got a new look, and date and period inputs got a picker (#13554).
- Scrolling: gentle mouse rotor scrolling (#12593), elastic overscroll on macOS (#12624), touchpad momentum on another platforms (#12345), and scrollbars that conceal until used (#12997).
Sites that activity improved
- Google Slides: presentations open alternatively of showing an error (#12497).
- GitHub: Mermaid diagrams render (#12383).
- ChatGPT: the content box grows as you category (#13050).
- nytimes.com and reuters.com get former their bot checks (#12718, #12188).
- Instagram: videos display their archetypal example alternatively of staying blank (#12898).
- Gmail: reloading no longer keeps the old leaf in recollection (#12689, #12660).
- x86CSS , an x86 emulator made of CSS, is now usable (#12911).
New browser features
- Screen readers: we’ve added archetypal assistance for VoiceOver on macOS and Orca on Linux (#9156). There’s motionless a lot of activity to do here.
- Spell checking in content sectors on macOS (#12638).
- Picture-in-Picture (#12542).
- Links to text: links can scroll to a part of content and emphasize it, and you can create them from the environment list (#11121, #12744).
- Permissions: sites can now ask for your location and microphone (#13336, #12604).
- DevTools: Inspect Element (#13348), console autocomplete (#13355), and expandable objects in the console (#13360).
- Smaller additions: Find in leaf can emphasize all matches (#12434), ad blocking can be turned off per location from the toolbar (#12695), and we added Reload Without Cache (#13056).
More of the web phase
We rendered this leaf in Ladybird, using features that landed in October:

From the top left, that’s multi-column (#13026), display: grid-lanes for masonry (#13236), MathML (#13062, #13141), corner-shape (#12942), CSS Motion Path (#13027), much additional of anchor positioning (#13021, #13079, #13166), and text-wrap: balance (#13461).
We additionally added:
- CSS: calc-size(), which lets heights enliven to and from car (#13006), affirmative vertical penning modes (#13103), zoom (#13237), the extend sizing keyword (#13006), shape() and border-shape (#12942), field-sizing (#13050), perspective advancement timelines and animation-range (#12943), and the commencement of SVG animation (#12823, #13498).
- Web APIs and more: the HTML Sanitizer API (#13185), Touch Events (#13249), Cross-Origin-Opener-Policy (#12296), Paint Timing, Event Timing, Largest Contentful Paint (#13110), WebVTT cues (#12895), wide-gamut canvases (#13097), WebDriver BiDi (#13167), JavaScript’s using and await using (#13102), and many execCommand and contenteditable fixes (#13186, #13038).
Security and procedure isolation
Web pages run in sandboxed renderer processes, so a malicious leaf that takes complete its renderer have to be stuck there.
We kept fixing safety issues from many sources, including ways about that sandbox. For example, a compromised renderer could ask the browser procedure to open any document on your computer. Now lone a renderer showing local records can peruse them (#12582, #12590). Renderers could additionally counterfeit a person click to open popups or peruse the clipboard. The browser procedure no longer trusts them on this (#12597).
We additionally divided the browser into additional processes, so a compromised one can attain less:

- Cross-site iframes get their own renderer by default (#12647), and so do cross-site popups (#12296).
- Each top-level location gets its own network process, and the HTTP cache and third-party cookies are kept distinct per location (#13144, #12424).
- Each renderer has its own audio procedure (#12604) and depiction decoder (#12437).
Media and Windows
On Windows, video now plays and YouTube plant (#12646, #13195). Hardware video decoding moved to its own procedure and now plant on Linux through Vulkan (#12868). We additionally peruse MP4 records ourselves now alternatively of using FFmpeg, which fixes problems alongside seeking and buffering (#12641).
More C++ moved to Rust
LibJS’s runtime moved from C++ to Rust fair before the JIT landed, so our JavaScript motor is now all Rust, distinct from its flap translator and the refuse collector (#12492). The new Wasm motor is Rust as well. WebGL, 2D canvas, IndexedDB, Streams, and URL additionally moved complete (#12699, #12935, #13287, #13083, #12998). We additionally deleted the C++ manner computation, so manner is now computed entirely in Rust (#12346).
Getting prepared for alpha
Our archetypal alpha is planned for afterward this year. This duration we added:
- Release builds: macOS archives, Linux tarballs, .deb and .rpm packages, and Flatpak bundles (#13176, #13313, #13340).
- Crash reports: following a crash, you can assessment a study and choose to dispatch it to us (#12298, #12342).
- A greeted leaf to choice your tab layout, hunt engine, and ad blocking (#12333).
- Reporting damaged sites from inner the browser (#12880).
That’s it for October. Thanks for reading, and we’ll see you next month!