Servo 0.5.0 is out, gathering the 488 commits that landed in July, and the release reads like an engine crossing from demo to tool. The 2D canvas is now multithreaded, which the project measures at up to 55 percent better frame rates and up to 42 percent lower power per frame. Text rendering is up to 10 times faster when the same text is drawn at different font sizes. There are now Linux aarch64 binaries alongside x86_64, servoshell for Android dropped its floor from Android 13 to Android 10, and the DuckDuckGo landing page finally renders. If you have been watching Servo as an embeddable alternative rather than as a browser, this is the release to look at.
The short answer
Servo 0.5.0 collects the 488 commits that landed in July. The headline is a multithreaded 2D canvas worth up to 55 percent better frame rates and up to 42 percent lower power per frame, plus text rendering up to 10 times faster when the same string is drawn at several font sizes. Platform coverage widened with Linux aarch64 binaries and Android 10 support in servoshell, down from an Android 13 floor. Real world compatibility improved enough that the DuckDuckGo landing page renders and most of Gumroad went from not rendering at all to rendering almost perfectly. For embedders there is one breaking change, with webxr_registry() moving to a lazy registration call that halved servoshell startup time.
The way you judge a young browser engine is not by its benchmark scores. It is by what breaks when you point it at a real website, and whether the breakage is one bug or one missing subsystem. Servo 0.5.0, which gathers the 488 commits that landed during July, is the release where that answer got noticeably better.
Real sites, failing on findable bugs
The duck on the DuckDuckGo landing page did not render in Servo 0.4.0. In 0.5.0 it does, because someone found and fixed a preload bug affecting SVG images. That is one pull request between a broken page and a working one.
Gumroad is the better illustration. In 0.4.0 most of that site did not render at all. As of 0.5.0, pages like the Discover page and individual product pages render almost perfectly. The landing page is still an exception. Going from nothing to almost everything in a month is what happens when the underlying layout and painting are basically right and the gaps are individual, specific defects.
That distinction matters if you are evaluating Servo for anything. An engine that fails because it has no flexbox is years away. An engine that fails because of a preload path for one image type is a bug tracker away.
The canvas got threads, and that is the number to remember
2D canvas rendering is now multithreaded. The project measures it at up to 55 percent better frame rates and up to 42 percent lower power consumption per frame, with a separate change cutting memory use substantially as well.
Frame rate and power moving together in the same direction is the tell that this is real parallelism rather than a busier main thread. If you are embedding a web view to draw charts, maps, visualisations or any other canvas heavy surface, that is the single change in this release most likely to affect whether the thing feels acceptable on a modest device.
The text rendering figure needs a caveat. Text is up to 10 times faster for the case of the same text rendered at different font-size values, which arrived with the upgrade to Stylo 2026-07-01. Narrower than a blanket 10x, but that case is extremely common in practice: headings, responsive type scales, anything that repeats a label at multiple sizes.
Two smaller wins round it out. Flex layout benchmarks improved by up to 3 percent, and a change to getElementsByClassName() made some real websites up to 1 percent faster. Alongside those sit a long list of reductions in memory use, allocations and garbage collection rooting steps, plus fixes for a memory corruption crash regression and a batch of dynamic borrow crashes.
Two more platforms, and a lower Android floor
Servo now publishes binaries for Linux aarch64 alongside x86_64. If you have been building for arm64 Linux by hand, that step is gone.
On Android, servoshell dropped its requirement from Android 13 to Android 10. The project puts numbers on what that means: roughly 68 percent of devices at the old floor against roughly 91 percent at the new one. For anyone evaluating Servo as an embedded view on Android hardware, that is the difference between a third of the fleet being out of reach and almost none of it.
On Windows, servoshell now behaves properly when launched from a console window, so the command prompt waits for it to exit rather than returning immediately.
For embedders: one breaking change, better docs
The embedding API got documentation attention this cycle, both for the servo crate itself and for WebViewDelegate, which is the trait you implement when you host a web view.
There is one breaking change. ServoBuilder::webxr_registry() is removed. Use Servo::register_webxr_registry instead. The replacement is a lazy design, and the payoff is concrete: it allowed servoshell to halve its own startup time. If you construct Servo programmatically, this is a small edit with a real benefit attached.
The graphics translation layer also moved forward. ANGLE went from a version based on Firefox 115.x ESR to one based on Firefox 140.12.0 ESR, closing a large gap in how current that dependency is. Our earlier look at Servo 0.4 and its real world compatibility push covers where the project was one release ago, which makes the delta easier to see.
New surface on the web platform
Shipped and on by default: Cache-Control: stale-while-revalidate, text-decoration-thickness, and mostly complete implementations of box-decoration-break, @font-feature-values, font-language-override and font-variant-alternates.
The DOM additions are a mix of the modern and the archaeological. SubtleCrypto gained the Ed448, X448 and KMAC algorithms. document.execCommand() gained insertHorizontalRule, insertImage, insertText and forwardDelete, which is not where most people expect effort to go, but rich text editors that predate contenteditable alternatives still depend on it. There is a new AnimationEffect interface, an effect property on Animation, getKeyframes() and setKeyframes() on KeyframeEffect, a constructible Touch, a duplex property on Request, an id property on LargestContentfulPaint, and a read only CSSFontFeatureValuesRule.
DOM text selections are now visible, which sounds trivial until you try to use a browser where selecting text shows nothing. Interactive selection is still to come.
Behind preferences
The Stylo upgrade to 2026-07-01 brought CSS function changes. alpha() and progress() are now supported under their respective preferences. The ellipse() values closest-corner and farthest-corner were pulled back from stable because the specification is unsettled, and remain available experimentally. attr() is more conformant.
WebGPU content can use GPUExternalTexture and importExternalTexture() under dom_webgpu_enabled. IndexedDB gained the name property on IDBIndex. document.fonts now includes a FontFace for every valid @font-face rule under dom_fontface_enabled. All of these are on in servoshell experimental mode.
WebVTT is the interesting unfinished one. It is enabled by default with no preference, and Servo can now fetch each <track src>, parse the WebVTT it finds, and expose cues through the track property on HTMLTrackElement. Nothing renders on screen yet. The plumbing exists and the painting does not, which is a reasonable order to build it in.
Accessibility work in July went into performance rather than coverage. The accessibility tree now supports incremental updates, needs fewer hash map lookups and tree walks, and allows faster DOM mutations, all under accessibility_enabled. An accessibility tree that rebuilds itself wholesale on every mutation is the kind of thing that makes a feature technically present and practically unusable, so this is the right work.
The File and Directory Entries API has started, with webkitGetAsEntry() on DataTransferItem and minimal FileSystemEntry, FileSystemDirectoryEntry and FileSystemFileEntry support under dom_entries_api_enabled. The goal is uploading whole directories through a file input or by drag and drop.
The project behind it
Ten people landed their first Servo patch in July. Recurring donations reached 7,824 US dollars per month, up 1.8 percent from June, which the project says covers continuous integration and benchmarking servers, an Outreachy intern, and maintainer work aimed at making it easier for other people to contribute. Thirty five GitHub users sponsor Servo through thanks.dev.
Those are small numbers next to any funded browser engine, and worth keeping in mind when reading the release notes. A multithreaded canvas and a browser that renders Gumroad, produced at that scale, is a good month.
Sources and further reading
- July in Servo: more platforms, faster canvas, web fonts in SVG, and more, Servo blog, August 31, 2026
- Servo v0.5.0 release, GitHub
- Servo 0.5 Released: DuckDuckGo Properly Rendering, Up To 10x Faster Text Rendering, Phoronix, August 31, 2026
- Servo project homepage
Frequently asked questions
What exactly got faster in Servo 0.5?
Three measured things. The 2D canvas is now rendered on multiple threads, which the project reports as up to 55 percent better frame rates and up to 42 percent lower power consumption per frame, with a substantial memory reduction on top. Text rendering is up to 10 times faster in the specific case of the same text drawn at different font-size values, which comes out of the Stylo upgrade. Flex layout benchmarks improved by up to 3 percent, and a change to getElementsByClassName() made some real websites up to 1 percent faster. The canvas number is the one that changes what you can build. The text number is narrower than it sounds but hits a very common pattern in real pages.
Is Servo usable for embedding yet?
It is getting closer, and the project frames it explicitly as an alternative to embedding a full Chromium. This release improved the documentation for the servo crate and for WebViewDelegate, which is the surface you actually implement. There is one breaking change to know about: ServoBuilder::webxr_registry() is removed in favour of Servo::register_webxr_registry, a lazy design that let servoshell halve its own startup time. Platform coverage widened too, with Linux aarch64 binaries and Android 10 support. Whether it is ready depends entirely on what your embedded view needs to render, which is why the real world compatibility work matters more than any single feature.
What does the DuckDuckGo fix actually tell us?
That the remaining gaps are small and specific rather than architectural. The duck on the DuckDuckGo landing page did not appear in 0.4.0 because of a bug in how Servo preloaded SVG images. One fix, and the page renders. The Gumroad result is the more interesting one: most of that site did not render at all in 0.4.0, and in 0.5.0 pages like the Discover page and product pages render almost perfectly. That is the pattern you want to see from a young engine. Sites are failing on individual bugs that get found and fixed, not on entire missing subsystems.
Which new web platform features landed?
On the CSS side, text-decoration-thickness, mostly complete box-decoration-break, and mostly complete @font-feature-values, font-language-override and font-variant-alternates. Networking gained Cache-Control: stale-while-revalidate. The DOM additions include Ed448, X448 and KMAC algorithms in SubtleCrypto, an AnimationEffect interface with getKeyframes() and setKeyframes() on KeyframeEffect, the duplex property on Request, an id property on LargestContentfulPaint, a constructible Touch, and several document.execCommand() commands. Behind preferences there is WebGPU external texture support, a name property on IDBIndex, and document.fonts exposing a FontFace for every valid @font-face rule.
What is still experimental or unfinished?
Quite a lot, and the project is clear about it. WebVTT is started but does not render yet: Servo can fetch each track source, parse the WebVTT, and expose cues through the track property on HTMLTrackElement, but nothing appears on screen. DOM text selections are visible now, but interactive selection is still to come. The File and Directory Entries API has webkitGetAsEntry() on DataTransferItem plus minimal FileSystemEntry types behind a preference. Accessibility work in July was mostly performance rather than coverage, with the accessibility tree gaining incremental updates. Most of these sit behind --pref flags and are on in servoshell experimental mode.