#mrobinson
COVER REVEAL

HEAR NO PROMISES (The Blood Oath Brotherhood 2) by #MRobinson

Release: November 13, 2026

PRE-ORDER HERE: geni.us/MRHNP
November 3, 2026 at 8:57 PM
COVER REVEAL

HEAR NO PROMISES (The Blood Oath Brotherhood 2) by #MRobinson
Release: November 13, 2026

PRE-ORDER HERE: geni.us/MRHNP
Hear No Promises (BOB BOOK TWO)
Get it now:
geni.us
November 3, 2026 at 8:57 PM
October 16, 2026 at 2:27 PM
July in Servo: more platforms, faster canvas, web fonts in SVG, and more!
Servo 0.5.0 contains all of the changes we landed in July, which came out to **488 commits** , and we now publish binaries for **Linux aarch64** (@mukilan, #46760)! **DOM text selections** are now visible (@mrobinson, @SimonSapin, #46698, #46864, #46742, #46889, #46126). Interactive selection is coming soon! For security fixes, see § Security. We’ve shipped several new web platform features: * **‘Cache-Control: stale-while-revalidate’** (@arayaryoma, #46060) * **‘text-decoration-thickness’** (@nicoburns, #46592) * **‘box-decoration-break’** , for the most part (@Psychpsyo, #45492) * **‘@font-feature-values’** , for the most part (@simonwuelker, #45308) * **‘font-language-override’** , for the most part (@simonwuelker, #46618) * **‘font-variant-alternates’** , for the most part (@simonwuelker, #45308) Plus a bunch of new DOM APIs: * Ed448, X448, and KMAC algorithms in **Subtle­Crypto** (@kkoyung, #46402, #46141, #46180, #46583, #46606, #46622, #46334, #46376) * **‘insert­Horizontal­Rule’** , **‘insert­Image’** , **‘insert­Text’** , and **‘forward­Delete’** commands in **document.exec­Command()** (@Psychpsyo, #46608, #46597, #46538, #46838) * **Animation­Effect** (@simonwuelker, #46677) * **new Touch()** (@yezhizhen, #46741) * **duplex** property on **Request** (@Taym95, #46858) * **effect** property on **Animation** (@simonwuelker, #46677) * **get­Keyframes()** and **set­Keyframes()** on **Keyframe­Effect** (@simonwuelker, #46118) * **id** property on **Largest­Contentful­Paint** (@shubhamg13, #46828) * read-only **CSS­Font­Feature­Values­Rule** (@simonwuelker, #46728) This is another big update, so here’s an outline: * You can help! * Security * Real world compat * Work in progress * Embedding API * For users and developers * More on the web platform * Performance and stability * New contributors ## You can help! If you’re working on a pull request that you think might be interesting for the next monthly update, even if you’re not 100% sure, tell us about it by following the steps below: 1. You add the monthly update label to your pull request, or comment `@servo-highfive monthly update` 2. Highfive posts a comment asking you some questions 3. You answer those questions in a comment containing `@servo-highfive monthly update answer` ## Security Servo was potentially affected by vulnerabilities in quick-xml and crossbeam-epoch that have been fixed in Servo 0.5.0 (@atouchet, @Loirooriol, #46737, #46324). For more details, see RUSTSEC-2026-0194, RUSTSEC-2026-0195, and RUSTSEC-2026-0204. We’ve updated **ANGLE** from a version based on Firefox 115.x ESR (02755361e26d8) to a version based on Firefox 140.12.0 ESR (f8025617e815f), which likely includes many security fixes (@jschwe, @sagudev, #46455, mozangle#100). ## Real world compat The duck on the **DuckDuckGo (duckduckgo.com)** landing page now renders in v0.5.0, after we fixed a preload bug that affected SVG images (@jdm, #46668). v0.4.0 v0.5.0 duckduckgo.com Most of **Gumroad (gumroad.com)** , except for the landing page, did not render at all in v0.4.0, but as of v0.5.0, pages like the Discover page or this product page render almost perfectly. v0.4.0 v0.5.0 gumroad.com v0.4.0 v0.5.0 gumroad.com We’re interested to hear how well your favourite websites run in Servo! Report successes in this Zulip thread, and failures in our GitHub issues. ## Work in progress The upgrade to Stylo 2026-07-01 brings several changes to built-in **CSS functions** (@Loirooriol, #46129): * **‘alpha()’** is now supported, under `--pref layout­_css­_alpha­_color­_function­_enabled` * **‘progress()’** is now supported, under `--pref layout­_css­_progress­_function­_enabled` * **‘ellipse()’** values **‘closest-corner’** and **‘farthest-corner’** are no longer stable due to spec uncertainty, but they are still experimental, under `--pref layout­_css­_ellipse­_corners­_enabled` * **‘attr()’** is more conformant, under `--pref layout­_css­_attr­_enabled` **Web­GPU** content can now enjoy better conformance and use **GPU­External­Texture** and **import­External­Texture()** on **GPU­Device** , under `--pref dom­_webgpu­_enabled` (@sagudev, #45873, #46178, #46286). **Indexed­DB** content can now use the **name** property on **IDB­Index** , under `--pref dom­_indexeddb­_enabled` (@skyz1, #45512). **document.fonts** now includes a **Font­Face** for each valid **‘@font-face’** , under `--pref dom­_fontface­_enabled` (@simonwuelker, #46509, #46537). All of the features above are enabled in servoshell’s experimental mode. We’ve started implementing **WebVTT** for native **subtitles** and **captions** , enabled by default (no `--pref`). While they don’t render just yet, we can now fetch each <track src>, parse the WebVTT, and expose cues via the **track** property on **HTML­Track­Element** (@TimvdLippe, #46289, #46383). July was a big month for **accessibility** in Servo, under `--pref accessibility­_enabled`. The focus for this month has been on **performance** , with the accessibility tree now supporting **incremental updates** (@alice, @delan, #45578, #45971, #46589, #46691, #46385), requiring **fewer HashMap lookups** and **tree walks** (@alice, @delan, #45798, #46740, #46348), and allowing for **faster DOM mutations** (@alice, #46348, #46530). We’ve also started working on the File and Directory Entries API, to allow users to **select** and **upload entire directories** via **< input type=file>** and **drag-and-drop**. To that end, we now have **webkit­Get­As­Entry()** on **Data­Transfer­Item** , plus minimal support for **File­System­Entry** , **File­System­Directory­Entry** , and **File­System­File­Entry** , under `--pref dom­_entries­_api­_enabled` (@yezhizhen, #46456, #46879, #46832). ## Embedding API We’ve improved the docs for the servo crate, and for Web­View­Delegate (@mukilan, #46193). **Breaking change:** Servo­Builder::`webxr­_registry()` has been **removed**. Instead use the new Servo::register­_webxr­_registry, which is a **lazy** design that has allowed servoshell to **halve its startup time** (@Narfinger, #46494). ## For users and developers **servoshell** for **Android** now runs on **Android 10+** (91% market share), not just Android 13+ (68% market share), improving adaptability and reducing waste (@jschwe, #46142, #46308). We’ve also fixed a problem with building for Android on macOS (@jschwe, #46128). **servoshell** for **Windows** is now better behaved when run in a console window, making the command prompt wait until servoshell exits (@yezhizhen, #43010). When using the Firefox **DevTools** , the **Console** tab now supports some basic **autocomplete** (@freyacodes, #46382). We’ve finished modernising servoshell for Android to use Compose UI (@veyndan, #46085, #46164, #46253, #46257, #46317, #46353, #46565, #46612, #46626, #46666, #46663, #46700), and we’re now migrating Servo as a library to use Kotlin (@veyndan, #46817, #46895, #46772). ## More on the web platform **Inline SVG** can now use **web fonts** defined in the containing page (@yodalee, #45979). We’re also implementing the **SVG DOM** , starting with stub interfaces for **SVG­Element** , SVG­Circle­Element, SVG­Defs­Element, SVG­Ellipse­Element, SVG­Line­Element, SVG­Linear­Gradient­Element, SVG­Path­Element, SVG­Polygon­Element, SVG­Polyline­Element, SVG­Radial­Gradient­Element, SVG­Stop­Element, SVG­Rect­Element, SVG­Symbol­Element, and SVG­Use­Element (@mu-mostafa98, #46558). **< button>** now **vertically centers** its contents (@Loirooriol, @mrobinson, #46590), and behaves better with ‘display: block’ and ‘display: inline’ (@Loirooriol, #46536). We’ve improved the conformance of **< form>** without **< form action>** (@kevlu93, #46860), **< color> values** (@Loirooriol, #46129), **Gamepad­Event** (@log101, #46788), **document.execCommand(“delete”)** (@Psychpsyo, #46539), the **selector­Text** property on **CSS­Style­Rule** (@simonwuelker, #46687), and **Set Window Rect** in WebDriver (@janeoa, #46475, #46477). We’ve fixed bugs related to **< iframe>** (@jschwe, @jdm, #46587), **< img>** (@yodalee, #46892), **< textarea>** (@SimonSapin, @mrobinson, #46309), **custom properties** (@Loirooriol, #46129), **‘::before’** and **‘::after’** (@Loirooriol, #46640), **‘flex-direction: column’** (@simonwuelker, #46697), **‘float’** (@Loirooriol, @mrobinson, #46407, #46500, #46505), **‘@font-face’** (@simonwuelker, #46568, #46271, #46436), **‘position: absolute’** (@simonwuelker, #46358, #46637), **Blob** (@jdm, #46881), **IDB­Database** and **IDB­Object­Store** and **IDB­Index** (@mrobinson, #46615), the **adopted­Style­Sheets** property on **Shadow­Root** (@simonwuelker, #46738), **delete()** on **Font­Face­Set** (@simonwuelker, #46634), **move­Before()** on **Element** (@mrobinson, #46599), **resize­To()** on **Window** (@janeoa, #46477), the **selected** property on **HTML­Option­Element** (@rhit-kapilaar, #46386), and the **value** property on **HTML­Select­Element** (@simonwuelker, #46230). ## Performance and stability **2D canvas** rendering is now **multithreaded** , improving frame rates by **up to 55%** and power consumption per frame by **up to 42%** (@yezhizhen, #46410), and should use a lot less memory too (@jschwe, @sagudev, #46786). **Text rendering** is **up to 10x faster** for cases with the same text and different ‘font-size’ (@Loirooriol, #46129). **Flex layout** benchmarks are up to **3%** faster, and an improvement to **get­Elements­By­Class­Name()** has made some websites up to **1%** faster (@Narfinger, @jdm, #46563, #46595, #46594). We’ve also reduced memory usage, allocations, GC rooting steps, and other operations in many parts of Servo (@mrobinson, @jdm, @yezhizhen, @Narfinger, @Gae24, @SimonSapin, @Taym95, @cychronex-labs, @arayaryoma, #46499, #46411, #46659, #45974, #46377, #45758, #46440, #46762, #46301, #46349, #46419, #46418, #46420, #46460, #46633, #46638, #46690, #46745, #46726, #46564, #46144, #46664, #46462, #46139, #46430, #46446, #46498, #46548, #46598, #46632, #46656, #46678, #46718, #46722, #46238, #46072, #46408, #46438, #46437, #46528, #46124, #46330, #46412, #46807). We’ve fixed a crash regression with memory corruption (@mrobinson, #46316), several dynamic-borrow-related crashes (@Narfinger, @SharanRP, @Taym95, @agrawalx, @amittenak47, @sungmen, #46381, #46384, #46405, #46684, #46452, #46770, #46830, #46763), plus crashes related to: * **< area>** without **< area href>** (@simonwuelker, #46341) * **< progress>** or shadow DOM (@mrobinson, @simonwuelker, #46188) * **< table>** layout (@mrobinson, #46775) * **< td rowspan>** (@mrobinson, #46841) * **< svg>** without **< svg viewBox>** (@Narfinger, @mrobinson, #46199) * **< use>** in SVG (@mrobinson, @Loirooriol, #46261) * **‘animation’** (@mrobinson, @Loirooriol, #46689) * **‘content’** (@Loirooriol, @mrobinson, #46314) * **‘mix-blend-mode’** (@mrobinson, #45624) * **Array­Buffer** (@jdm, #46504) * **adopted­Style­Sheets** on **Document** (@TimvdLippe, #46373) * **exec­Command(`"delete"`)** on **Document** (@TimvdLippe, #46265) * removing DOM nodes (@SimonSapin, #46866) We’ve continued our long-running effort to use the Rust type system to make Servo’s integration with SpiderMonkey safer and more reliable (@Gae24, @Narfinger, @TimvdLippe, @jdm, @kunalmohan, @lumiscosity, @simonwuelker, #46191, #46777, #46890, #46243, #46248, #46246, #46310, #46312, #46333, #46147, #46150, #46151, #46229, #46262, #46375, #46374, #46529, #46584, #46585, #46593, #46693, #46166, #46156, #46254, #46267, #46268, #46269, #46270, #46284, #46285, #46318, #46435, #46461). ## New contributors A special thanks to the following people for landing their first patch in Servo: * Umut Cevdet Koçak (@UMCEKO, #46256) * Yash Agrawal (@agrawalx, #46770) * amittenak47 (@amittenak47, #46743) * Apoorva Pendse (@apoorvapendse, #46739) * dDostalker (@dDostalker, #46181) * Oisín Ó Maolchathail (@eachra-bawn, #46478) * Kevin Lu (@kevlu93, #46860) * Mohamed Mostafa (@mu-mostafa98, #45405) * SeongMan Jeon (@sungmen, #46763) * Yoda Lee (@yodalee, #45979) Interested in helping build a web browser? Take a look at our curated list of issues that are good for new contributors! ## Donations Thanks again for your generous support! We are now receiving **7824 USD/month** (+1.8% from June) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers** , one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo. Servo is also on thanks.dev, and already **35 GitHub users** (same as June) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. We now have sponsorship tiers that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. If you’re interested in this kind of sponsorship, please contact us at join@servo.org. **7824** USD/month **10000** Use of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page.
servo.org
August 31, 2026 at 2:14 PM
Why is he logging in to *work* meetings with his personal handle instead of, like, mrobinson or markr or something, anyway?
December 17, 2024 at 7:31 PM
THREAD: Taking a shot at a #USMNT World Cup squad forecast...

Balogun
Wright
Pepi
Pulisic
Weah
Zendejas
Tillman
Luna
Reyna
McKennie
Musah
Aaronson
Roldan
Tessmann
Adams
Dest
ARobinson
Arfsten
Richards
Ream
McKenzie
MRobinson
Carter-Vickers
Freese
Turner
Steffen
October 15, 2025 at 3:04 PM
💜💜 COVER REVEAL 💜💜

Get ready for SPEAK NO CLAIM by M. Robinson, coming June 29! A dark academia romance dripping with obsession, elite power, dangerous secrets, and a villain you'll love to hate.

Preorder link: geni.us/MRSNC

#mrobinson #coverreveal #darkromance #wildfiremarketingsolutions
June 7, 2026 at 5:02 PM
Servo led by Igalia's Martin Robinson

more info and meeting link: github.com/Igalia/weben...
Servo · Issue #57 · Igalia/webengineshackfest
Logistics Date & Time: Wednesday 4th June at 12:00 CEST (local time) URL: https://meet.jit.si/WEH2025-Servo Notes: https://hackmd.io/@rego/WEH2025-Servo/edit Room: CSS Facilitator(s) @mrobinson (Ig...
github.com
June 4, 2025 at 9:59 AM
My USMNT Player Ratings
USA 3-2 SENEGAL
Sun May 31 2026
Friendly
Charlotte NC

GREAT: Dest, Pepi, Pulisic, Balogan
GOOD: Tillman
OK: Turner, Freeman, McKenzie, Ream, Berhalter, ARobinson, Trusty, Scally, Rodan, Arfsten, Weah, McKennie, Zendejas
BAD: Adams, Reyna, Brady, MRobinson
WOOF: -
June 1, 2026 at 8:48 PM
April in Servo: new Android UI, focus, forms, security fixes, and more!
Servo 0.2.0 contains all of the changes we landed in April, which came out to yet another record **534 commits** (March: 530). For security fixes, see § Security. **Note:** the GitHub release is available now, but the crates.io release is not yet complete. We expect to publish it some time **next week**. We’ve shipped several new web platform features: * **< select multiple>** (@lukewarlow, @mrobinson, #43189) * **< template shadowrootslotassignment>** (@simonwuelker, #44246) * **< video>** playback on OpenHarmony (@rayguo17, #43208) * **‘minimum-scale’** and **‘maximum-scale’** values in **< meta name=viewport>** (@shubhamg13, #40098, #43715) * **‘color-mix()’** with **any number of <color> values** (@Loirooriol, #43890) * **‘ &::before’** and **‘ &::after’** in **‘::details-content’** (@Loirooriol, #43878) * **‘revert-rule’** (@Loirooriol, #43878) * **‘tab-size’** (@mrobinson, @SimonSapin, #44480) * **‘text-align: match-parent’** (@TG199, #44073) * **new Worker()** with **blob URLs** (@jdm, #44004) * **get­Context(`"webgl"`)** on **Offscreen­Canvas** (@niyabits, #44159) * the **detail** property on **Performance­Mark** and **Performance­Measure** (@shubhamg13, #44289, #44272) Plus a bunch of new DOM APIs: * **‘selectionchange’** events on <input> and <textarea> (@TimvdLippe, #44461) * **Storage­Manager** , in experimental mode (@Taym95, #43976) * **active­Element** on **Document** and **Shadow­Root** (@mrobinson, #43861) * **crypto.subtle.supports()** (@kkoyung, #43703) – Servo is the first major browser engine to support this! * **cell­Padding** , **cell­Spacing** , and **align** properties on **HTML­Table­Element** (@mrobinson, #43903) – previously supported in HTML only * **related­Target** on **‘focus’** and **‘blur’** events (@mrobinson, #43926) * **transfer­From­Image­Bitmap()** on **Image­Bitmap­Rendering­Context** (@Messi002, #43984) Servo’s support for text in **Chinese** , **Japanese** , and **Korean** languages has improved, with correct wrapping in the layout engine (@SharanRP, #43744), and CJK fonts now enabled in servoshell’s browser UI on Windows, Linux, and FreeBSD (@yezhizhen, @CynthiaOketch, @nortti0, #44055, #44138, #44514). Navigating to a **JSON file** as the top-level document now renders the JSON with an **interactive pretty-printer** (@webbeef, @TimvdLippe, #43702). April was a big milestone for Servo, with some automated tests failing because they had hard-coded cookie expiry dates set to April 2016 plus ten years. Surprise! We’re still here. Here’s to the next 100 years of Servo (@jdm, #44341). This is another big update, so here’s an outline: * Security * Work in progress * servoshell * For developers * Embedding API * More on the web platform * Performance and stability ## Security **Crypto­Key** now zeroes buffers containing key material after use (@kkoyung, #44597). With only a few exceptions, you can only access DOM APIs in another document if that document is in the **same origin**. But if that document is in the same _site_ with a different port number, Servo currently allows these accesses even though it shouldn’t. We’ve fixed some (but not all) of these incorrect accesses, specifically those that involve binding a Window or Location method in this document with a `this` from the other document (@yvt, @jdm, #28583). We’ve fixed a bug where **local­Storage** and **session­Storage** were usable in **sandboxed <iframe>** and shared with every other sandboxed <iframe>, rather than throwing Security­Error (@Taym95, #44002). We’ve fixed a bug where **local­Storage** and **session­Storage** were shared between all **< iframe srcdoc> documents**, rather than isolated using the origin of the containing document (@niyabits, #43988, #44038). We’ve fixed a bug where **IndexedDB** was usable in **sandboxed <iframe>** and **data: URL web workers** (@Taym95, #44088). We’ve fixed a bug where pages in some **IP address origins** can evict cookies from other IP address origins (@officialasishkumar, #44152). Only evicting cookies was possible, not reading or writing them. We’ve fixed an **out-of-bounds memory read** in **tex­Image3D()** on **Web­GL2­Rendering­Context** (@simartin, #44270), and fixed some undefined behaviour in servoshell’s signal handler (@Narfinger, #43891). ## Work in progress **IndexedDB** is now enabled in servoshell’s experimental mode (@arihant2math, #44245). As always, embedders can enable it with Preferences::dom­_indexeddb­_enabled (@arihant2math, #44245, #44283). IndexedDB now uses Servo’s new **“client storage”** system, which is based on the Storage Standard and will allow us to have a unified on-disk format and quota management for all web platform features that persistently store data (@gterzian, #44374, #43900). We’ve also made key range queries more efficient (@arihant2math, #39009), landed improvements to IDB­Database, IDB­Object­Store, IDB­Cursor, IDB­Key­Range, IDB­Request, and to the handling of transactions, keys, values, and exceptions (@Taym95, #44128, #43901, #44009, #43914, #44161, #44183, #44059, #44215, #42998, #43805). We’ve made more progress on the **Intersection­Observer API** , under `--pref dom­_intersection­_observer­_enabled` (@stevennovaryo, @jdm, #42204). We’re continuing to implement **document.exec­Command()** for **rich text editing** (@TimvdLippe, #44529), under `--pref dom­_exec­_command­_enabled`. This release adds support for the **‘bold’** , **‘font­Name’** , **‘font­Size’** , **‘italic’** , **‘strikethrough’** , and **‘underline’** commands (@TimvdLippe, @jdm, @mrobinson, #44511, #43287, #44432, #44410, #44194, #44030, #44039, #44041, #44075, #44234, #44250, #44331, #44390, #44137, #44293, #44312, #44347). All of the features above are enabled in servoshell’s experimental mode. Servo can now build a very basic **accessibility tree** for web contents, under `--pref accessibility­_enabled` (@alice, @delan, @lukewarlow, #42338, #43558, #44437, #44438). This includes text runs, plus nine other non-interactive accessibility roles (@alice, @delan, #44255). We’ve also fixed a crash when reloading pages with accessibility enabled (@alice, #44473), and made accessibility tree updates more efficient (@alice, #44208). We’ve started implementing the **Sanitizer API** , under `--pref dom­_sanitizer­_enabled` (@kkoyung, #44198, #44290, #44335, #44421, #44452, #44481, #44585, #44594). We’ve also started implementing **Shared­Worker** , under `--pref dom­_sharedworker­_enabled` (@Taym95, #44375, #44440). We’re working on the **Wake­Lock API** too, under `--pref dom­_wakelock­_enabled` (@TG199, @rovertrack, #43617, #44343). ## servoshell servoshell for Android now has a **revamped browser UI** , including a new **history view** (@espy, #43795), the **apk is 30% smaller** (@jschwe, #44278, #44182), and we’ve fixed the black screen bug when closing settings or switching back from another app (@yezhizhen, #44327). You can now close tabs on OpenHarmony too (@Narfinger, #42713). As for servoshell on desktop platforms, we’ve fixed some focus- and IME-related bugs (@mrobinson, #43872, #43932), and on Windows, we now install a normal shortcut without the strange behaviour of an “advertised” shortcut (@yezhizhen, #44223). ## For developers When using the **Inspector** tab in the Firefox **DevTools** , the **Rules** panel now includes declarations in **‘@layer’ rules** (@arabson99, #43912). When **logging expressions** in the **Console** tab, and when **hovering over symbols** in the **Debugger** tab, you can now get more information about the contents of functions, arrays, objects, and other values (@atbrakhi, @eerii, #44172, #44173, #44022, #44233, #44196, #44181, #44064, #44023, #44164, #44369, #44262). When using the **Debugger** tab, you can now use the **Scopes** panel to inspect local and global variables (@eerii, @atbrakhi, #43792, #43791), you can now debug **web worker** scripts (@atbrakhi, #43981), and we’ve started implementing **blackboxing** , aka the **Ignore source** button (@freyacodes, #44142). We’ve also landed some initial support for the **Style Editor** tab (@rovertrack, #44517, #44462). We’re working towards re-enabling our automated DevTools tests in CI, which should make the feature more reliable (@freyacodes, #44577), and we’ve landed a small build reproducibility fix too (@jschwe, #44459). For developers of Servo itself, please note that the **Cargo ‘release’ profile** is no longer `#[cfg(debug­_assertions)]` (@jschwe, @mrobinson, #44177). If you’ve been using ‘release’ as a “faster ‘debug’ with assertions” build locally, consider switching to ‘checked-release’ or ‘medium’. The pull request template has been updated (@mrobinson, #44135). **‘Testing’** and **‘Fixes’** should go at the _bottom_ of the PR description, and **‘Testing’** is about automated tests, not how you tested the PR locally. We’ve made more progress on the new dev container, which will provide an alternative to our usual procedures for setting up a Servo build environment (@jschwe, @sagudev, #44126, #44111, #44162, #44641, #44109). Keep an eye out for that in the book! In the meantime, did you know that you can use Lix or Nix to build Servo on Linux with a lot less hassle, _even if_ you’re not using NixOS? For now at least, head to the NixOS page in the book to learn more. We’ve also fixed a regression that made `--debug-mozjs` and `MOZJS­_FROM­_SOURCE` builds take much longer to complete on Linux when not using Nix (@jschwe, #44346). We’ve fixed building Servo with the **‘jitspew’ feature** in mozjs, allowing you to set **IONFLAGS** to enable JIT logging (@simonwuelker, #44010). We’ve also fixed build issues on Windows and FreeBSD (@zhangxichang, @mrobinson, #44264, #44591). ## Embedding API With this second monthly release of the Servo library, we have some quick notes about **API stability** and **semver compatibility** : * **The ‘servo’ package** follows Cargo’s rules for semver compatibility. 0.1.1 is compatible with version 0.1.0, but 0.2.0 is a breaking update. * Until we integrate semver analysis into our release process, each monthly release will have a breaking version number, while non-breaking version numbers may be used for LTS updates. * In general, **dependencies of ‘servo’** , like ‘servo-base’ and ‘servo-script’, **do not use semver**. Any release may include breaking changes. We’ve fixed a **build failure** affecting embedders with a **new or updated Cargo.lock** (@jschwe, #44093), and landed several other changes to help us with the Servo library release process (@jschwe, @mukilan, #43972, #44642, #43182, #43866, #44086, #43797). Breaking changes: * Web­View::animating now takes `&self` instead of `self`, so you can call it without cloning the handle (@JavaDerg, #44253) * Servo::site­_data­_manager now returns `&SiteDataManager` instead of `Ref<'_, SiteDataManager>` (@sabbCodes, #44116) * Web­View­Delegate::`play­_gamepad­_haptic­_effect` and `stop­_gamepad­_haptic­_effect` have been removed (@mrobinson, #43895), but they have not worked since February 2026 – use Gamepad­Delegate instead You can now load a URL with **custom request headers** by calling Web­View::load­_request (@Narfinger, @longvatrong111, @mrobinson, #43338). You can now **retrieve cookies asynchronously** by calling Site­Data­Manager::cookies­_for­_url­_async (@longvatrong111, #43794). The synchronous version of that method, Site­Data­Manager::cookies­_for­_url, was previously not callable because Cookie­Source was not exposed to the public API, but we’ve fixed that now (@TG199, #44124). You can now **clear session cookies** without clearing permanent cookies by calling Site­Data­Manager::clear­_session­_cookies (@longvatrong111, #44166). When **intercepting requests** with Servo­Delegate:: and Web­View­Delegate::load­_web­_resource, we now include a destination and referrer­_url in the Web­Resource­Request, which can be helpful if you’re implementing **ad blocking** (@webbeef, #44493). You can configure Servo to **write all of its storage to a unique directory** for that session by enabling Opts::temporary­_storage (@janvarga, #44433). Note that these unique directories currently persist after Servo exits, so it’s an isolation feature, not a privacy feature. Window­Rendering­Context::new and Software­Rendering­Context::new now return an error if the given `size` is less than 1x1 (@freyacodes, @mrobinson, #44011). We’ve improved our API docs for Web­View, Web­View­Builder, Web­View­Delegate, ServoDelegate, Prompt­Dialog, Web­Resource­Load, Web­Xr­Registry, Preferences, and servoshell’s EXPERIMENTAL­_PREFS (@simonwuelker, @TG199, @sabbCodes, @jdm, @rovertrack, #43892, #43787, #44171, #43947). We’ve also improved our API docs for Opts, Output­Options, Diagnostics­Logging, Pref­Value, servo::opts, and servo­_config (@mukilan, #43802). ## More on the web platform **`Tab` navigation** now works across **< iframe>** boundaries (@mrobinson, #44397), and **`Ctrl` +`Backspace`** (or **`⌥`` ⌫`**) now **deletes a whole word** in input fields (@mrobinson, #43940). **Tab characters** are now rendered correctly in **< pre>** (and other elements with **‘white-space: pre’**), with proper tab stops (@mrobinson, @SimonSapin, #44480). **Spaces** are now rendered correctly in **2D <canvas>**, instead of twice as wide as they should be (@mrobinson, #43899). **< a href>** now correctly resolves the URL with the page encoding (@sabbCodes, #43822). We’ve improved the default appearance of **< input type=file>** (@sabbCodes, #44496) and **< textarea placeholder>** (@mrobinson, #43770). All **keyboard events** , **mouse events** , **wheel events** , and **pointer events** , other than **‘pointerenter’** and **‘pointerleave’** , now **bubble out of shadow roots** (@simonwuelker, @webbeef, #43799, #44094). **‘error’ events** on **Window** now report the correct **filename** (**source** in **onerror**) and **lineno** (@Gae24, #43632). **console.log()** and friends now support **printf-style formatting directives** , although for now `%c` is ignored (@TG199, #43897). **file: URLs** are now considered **secure contexts** , so they can now use features like **crypto.subtle** and **crypto.random­UUID** (@simonwuelker, #43989). **Exception messages** have improved in Location, Static­Range, and the HTML­Element family of types (@arihant2math, @MuhammadMouostafa, @treetmitterglad, #44282, #43260, #43882). We’ve improved the conformance of **fetch algorithms** (@yezhizhen, #43970, #43798), **focus** and **tab navigation** (@mrobinson, #43842, #44029, #44360, #43859, #44535), **form submission** (@TG199, #43700), **JS modules** (@elomscansio, @Gae24, #43741, #44179, #44042), **page navigation** (@TimvdLippe, #43857), **< svg view­Box>** (@yezhizhen, #44420), **‘attr()’** (@Loirooriol, #43878), **‘:focus’** (@mrobinson, #43873), **‘font’** (@RichardTjokroutomo, #44061), **‘@keyframes’** (@simonwuelker, #43461), **‘@property’** (@Loirooriol, #43878), **‘load’** events (@jdm, @arabson99, #43807, #44046), **fetch­Later()** (@TimvdLippe, #43627), **axes** and **buttons** on **Gamepad** (@log101, @rovertrack, #44411, #44357), **copy­Tex­Image­2D()** on **Web­GL­Rendering­Context** (@simartin, @mrobinson, #43608), **tex­Image3D()** on **Web­GL2­Rendering­Context** (@simartin, #44367), **environment­Blend­Mode** on **XR­Session** (@msub2, #44155), **mark()** and **measure()** on **Performance** (@shubhamg13, @simonwuelker, #44471, #44199, #43990, #43753), and **Performance­Resource­Timing** (@shubhamg13, #44228). We’ve fixed bugs related to **console logging** (@sabbCodes, #44243), **‘animation’** (@mrobinson, #44299), **‘box-shadow’** (@yezhizhen, #44474, #44457), **‘display: contents’** (@Loirooriol, @mrobinson, #44551, #44299), **‘display: inline-flex’** (@SimonSapin, #44281), **‘display: table-cell’** (@Loirooriol, #44550), **‘display: table-row-group’** (@Veercodeprog, #43674), **‘overflow-x: clip’** and **‘overflow-y: clip’** (@Messi002, #43620), **‘position: absolute’** on grid items (@nicoburns, #44324), **‘word-spacing: <percentage>’** (@sabbCodes, #44031), **remove­Child()** on **Document** (@rovertrack, #44133), and **URL.revoke­Object­URL()** (@simonwuelker, @jdm, #43746, #43977, #44035). ## Performance and stability We’ve fixed some big inefficiencies in Servo. **append­Child()** with nested shadow roots is no longer O(2n) (@yezhizhen, @webbeef, #44016), and we’ve halved the time it takes to load the ECMAScript spec by fixing the O(whole DOM tree) processing of **‘id’** and **‘name’ attributes** (@simonwuelker, #44120, #44127, #44117). Servo makes its **first TLS connection** in each session **30–60 ms faster** (@jschwe, #44242), and we’ve instrumented the Servo and servoshell startup processes to find more opportunities for optimisation (@jschwe, #44443, #44456). Like most browser engines, Servo is a multi-threaded (and sometimes multi-process) system requiring a great deal of IPC messages to keep everything connected. Two key components of this system are the **constellation** thread, which manages the engine as a whole, and the **script threads** (or web processes), which render the web pages. Sending these messages can be expensive though, so to **reduce unnecessary IPC traffic** , we’ve landed an optimisation that allows script threads to selectively receive only the relevant messages from the constellation (@webbeef, #43124). We’ve reduced the **memory usage** of each **Attr** , **Text** , and **Character­Data** node in the DOM by 16 bytes (@mrobinson, @Loirooriol, #44074), and **fixed a memory leak** when deleting **< video controls>** or **< audio controls>** (@Messi002, #43983). Our **about:memory** page is more accurate now too, with new tracking of **libc memory allocations** on macOS, improved tracking of libc memory allocations on Linux (@jschwe, #44037), and more accurate tracking of Path­Buf and types in `tokio`, `http`, `data­_url`, and `urlpattern` (@Narfinger, #43858). Less memory usage isn’t always better in browser engines though, because there are many kinds of caches and other optimisations we can do to make browsing the web faster, at the expense of increased memory usage. For example, we can greatly speed up **prototype checks** for DOM objects by storing a number in each object that identifies the concrete type, at the expense of making each DOM object 64 bits larger (@webbeef, #44364). Layout can now **reuse fragments** in later reflows, in many cases that involve block layout or ‘position: absolute’ (@mrobinson, @lukewarlow, @Loirooriol, #42904, #44231). We’re also working on **reusing shaping results** in later reflows, and making inline layout more efficient (@mrobinson, #44370, #43974, #44436). We’ve landed several changes that should reduce the **binary size** of Servo (@rovertrack, @mrobinson, @nicoburns, @Narfinger, #44227, #44221, #44303, #44338, #44428, #44134). We’ve also reduced clones, allocations, borrow checks, GC rooting steps, and other operations in many parts of Servo (@rovertrack, @Narfinger, @Loirooriol, @yezhizhen, @simonwuelker, #44008, #44544, #44271, #44279, #43826, #44052, #44139). Several crashes have been fixed: * in compressed­Tex­Sub­Image2D() on Web­GL­Rendering­Context (@thebabalola, #44050) * in console.log() (@thebabalola, #43844) * in get­Data() on Data­Transfer (@SimonSapin, #44607) * in remove() on Element (@SimonSapin, #44435) * in replace­With() on Element (@yezhizhen, #44503) * in `--debug-mozjs` builds (@jdm, #44386, #44573, #44581) * in flex and grid layout (@mrobinson, @nicoburns, #44424, #44203) * in layout queries like `offset­Height` (@mrobinson, #44560) * in the devtools Debugger tab, when stepping and when inspecting nested values (@atbrakhi, @eerii, #44024, #43995) * when removing <colgroup> from the DOM (@Loirooriol, #43846) * when running garbage collection (@drasticactions, #43933) * when running servoshell with a u64 `--pref` (@yezhizhen, #44079) * when shadow roots are deeply nested, or when calling attach­Shadow() removes elements from the flat tree (@yezhizhen, @mrobinson, #43888, #43930, #44259) * when web storage features fail to write to disk or encounter SQLite errors (@arihant2math, @sabbCodes, #43918, #43949) We fixed a crash in servoshell when pressing keys like Ctrl+2 or ⌘2 with not enough tabs open (@mrobinson, #44070). **DOM data structures** (`#[dom­_struct]`) can refer to one another, with the help of garbage collection. But when DOM objects are being destroyed, those references can become invalid for a brief moment, depending on the order the GC finalizers run in. This can be unsound if those references are accessed, which is a very easy mistake to make if the type has an `impl Drop`. To help prevent that class of bug, we’re reworking our DOM types so that none of them have `#[dom­_struct]` and `impl Drop` at the same time (@willypuzzle, #44119, #44501, #44513). We’ve improved our static analysis for GC rooting (@officialasishkumar, #44489), and we’ve continued our long-running effort to **use the Rust type system** to make certain kinds of dynamic borrow failures impossible (@sagudev, @TimvdLippe, @Narfinger, @elomscansio, @Gae24, @rovertrack, @yezhizhen, @nodelpit, #43174, #43524, #43928, #43943, #43942, #43944, #43946, #43952, #43975, #44018, #44175, #44241, #44368, #44406, #44441, #44422, #44475, #44478, #44484, #44476, #44490, #44477, #44494, #44497, #44498, #44495, #44505, #44506, #44507, #44508, #44509, #44510, #44512, #44482, #44527, #44528, #44531, #44534, #44542, #44533, #44543, #44553, #44547, #44563, #44562, #44565, #44558, #44583, #44606, #44605, #44608, #44602, #44584, #44620, #44590, #44254, #44628, #44629, #44638, #44626, #44081). Thanks to a wide range of people, we’ve also landed a bunch of cleanups and refactors (@delan, @alice, @Skgland, @atbrakhi, @eerii, @sabbCodes, @jdm, @thebabalola, @CynthiaOketch, @kkoyung, @TimvdLippe, @rovertrack, @webbeef, @arabson99, @yezhizhen, @simonwuelker, @mrobinson, @nicoburns, @longvatrong111, @niyabits, @treetmitterglad, @foresterre, @mukilan, @elomscansio, @freyacodes, @StaySafe020, @TG199, #43772, #44006, #43860, #44121, #44160, #43884, #44154, #44569, #43939, #44003, #44110, #44122, #43824, #44635, #44103, #43978, #44092, #44114, #44277, #44454, #44274, #44237, #44232, #44167, #44214, #43820, #43825, #43810, #43838, #43841, #43847, #43875, #43876, #43889, #43893, #43896, #43881, #43906, #43913, #43908, #43917, #43910, #43921, #43924, #43925, #43907, #43923, #43916, #43909, #43911, #43957, #43969, #43967, #43915, #43954, #43963, #43959, #43955, #44067, #44068, #44071, #44084, #44265, #44115, #44358, #43848). ## Donations Thanks again for your generous support! We are now receiving **7349 USD/month** (+2.5% from March) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers** , one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo. Servo is also on thanks.dev, and already **33 GitHub users** (−4 from March) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. We now have sponsorship tiers that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. If you’re interested in this kind of sponsorship, please contact us at join@servo.org. **7349** USD/month **10000** Use of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page.
servo.org
May 31, 2026 at 6:02 PM
April in Servo: new Android UI, focus, forms, security fixes, and more!
Servo 0.2.0 contains all of the changes we landed in April, which came out to yet another record **534 commits** (March: 530). For security fixes, see § Security. **Note:** the GitHub release is available now, but the crates.io release is not yet complete. We expect to publish it some time **next week**. We’ve shipped several new web platform features: * **< select multiple>** (@lukewarlow, @mrobinson, #43189) * **< template shadowrootslotassignment>** (@simonwuelker, #44246) * **< video>** playback on OpenHarmony (@rayguo17, #43208) * **‘minimum-scale’** and **‘maximum-scale’** values in **< meta name=viewport>** (@shubhamg13, #40098, #43715) * **‘color-mix()’** with **any number of <color> values** (@Loirooriol, #43890) * **‘ &::before’** and **‘ &::after’** in **‘::details-content’** (@Loirooriol, #43878) * **‘revert-rule’** (@Loirooriol, #43878) * **‘tab-size’** (@mrobinson, @SimonSapin, #44480) * **‘text-align: match-parent’** (@TG199, #44073) * **new Worker()** with **blob URLs** (@jdm, #44004) * **get­Context(`"webgl"`)** on **Offscreen­Canvas** (@niyabits, #44159) * the **detail** property on **Performance­Mark** and **Performance­Measure** (@shubhamg13, #44289, #44272) Plus a bunch of new DOM APIs: * **‘selectionchange’** events on <input> and <textarea> (@TimvdLippe, #44461) * **Storage­Manager** , in experimental mode (@Taym95, #43976) * **active­Element** on **Document** and **Shadow­Root** (@mrobinson, #43861) * **crypto.subtle.supports()** (@kkoyung, #43703) – Servo is the first major browser engine to support this! * **cell­Padding** , **cell­Spacing** , and **align** properties on **HTML­Table­Element** (@mrobinson, #43903) – previously supported in HTML only * **related­Target** on **‘focus’** and **‘blur’** events (@mrobinson, #43926) * **transfer­From­Image­Bitmap()** on **Image­Bitmap­Rendering­Context** (@Messi002, #43984) Servo’s support for text in **Chinese** , **Japanese** , and **Korean** languages has improved, with correct wrapping in the layout engine (@SharanRP, #43744), and CJK fonts now enabled in servoshell’s browser UI on Windows, Linux, and FreeBSD (@yezhizhen, @CynthiaOketch, @nortti0, #44055, #44138, #44514). Navigating to a **JSON file** as the top-level document now renders the JSON with an **interactive pretty-printer** (@webbeef, @TimvdLippe, #43702). April was a big milestone for Servo, with some automated tests failing because they had hard-coded cookie expiry dates set to April 2016 plus ten years. Surprise! We’re still here. Here’s to the next 100 years of Servo (@jdm, #44341). This is another big update, so here’s an outline: * Security * Work in progress * servoshell * For developers * Embedding API * More on the web platform * Performance and stability ## Security **Crypto­Key** now zeroes buffers containing key material after use (@kkoyung, #44597). With only a few exceptions, you can only access DOM APIs in another document if that document is in the **same origin**. But if that document is in the same _site_ with a different port number, Servo currently allows these accesses even though it shouldn’t. We’ve fixed some (but not all) of these incorrect accesses, specifically those that involve binding a Window or Location method in this document with a `this` from the other document (@yvt, @jdm, #28583). We’ve fixed a bug where **local­Storage** and **session­Storage** were usable in **sandboxed <iframe>** and shared with every other sandboxed <iframe>, rather than throwing Security­Error (@Taym95, #44002). We’ve fixed a bug where **local­Storage** and **session­Storage** were shared between all **< iframe srcdoc> documents**, rather than isolated using the origin of the containing document (@niyabits, #43988, #44038). We’ve fixed a bug where **IndexedDB** was usable in **sandboxed <iframe>** and **data: URL web workers** (@Taym95, #44088). We’ve fixed a bug where pages in some **IP address origins** can evict cookies from other IP address origins (@officialasishkumar, #44152). Only evicting cookies was possible, not reading or writing them. We’ve fixed an **out-of-bounds memory read** in **tex­Image3D()** on **Web­GL2­Rendering­Context** (@simartin, #44270), and fixed some undefined behaviour in servoshell’s signal handler (@Narfinger, #43891). ## Work in progress **IndexedDB** is now enabled in servoshell’s experimental mode (@arihant2math, #44245). As always, embedders can enable it with Preferences::dom­_indexeddb­_enabled (@arihant2math, #44245, #44283). IndexedDB now uses Servo’s new **“client storage”** system, which is based on the Storage Standard and will allow us to have a unified on-disk format and quota management for all web platform features that persistently store data (@gterzian, #44374, #43900). We’ve also made key range queries more efficient (@arihant2math, #39009), landed improvements to IDB­Database, IDB­Object­Store, IDB­Cursor, IDB­Key­Range, IDB­Request, and to the handling of transactions, keys, values, and exceptions (@Taym95, #44128, #43901, #44009, #43914, #44161, #44183, #44059, #44215, #42998, #43805). We’ve made more progress on the **Intersection­Observer API** , under `--pref dom­_intersection­_observer­_enabled` (@stevennovaryo, @jdm, #42204). We’re continuing to implement **document.exec­Command()** for **rich text editing** (@TimvdLippe, #44529), under `--pref dom­_exec­_command­_enabled`. This release adds support for the **‘bold’** , **‘font­Name’** , **‘font­Size’** , **‘italic’** , **‘strikethrough’** , and **‘underline’** commands (@TimvdLippe, @jdm, @mrobinson, #44511, #43287, #44432, #44410, #44194, #44030, #44039, #44041, #44075, #44234, #44250, #44331, #44390, #44137, #44293, #44312, #44347). All of the features above are enabled in servoshell’s experimental mode. Servo can now build a very basic **accessibility tree** for web contents, under `--pref accessibility­_enabled` (@alice, @delan, @lukewarlow, #42338, #43558, #44437, #44438). This includes text runs, plus nine other non-interactive accessibility roles (@alice, @delan, #44255). We’ve also fixed a crash when reloading pages with accessibility enabled (@alice, #44473), and made accessibility tree updates more efficient (@alice, #44208). We’ve started implementing the **Sanitizer API** , under `--pref dom­_sanitizer­_enabled` (@kkoyung, #44198, #44290, #44335, #44421, #44452, #44481, #44585, #44594). We’ve also started implementing **Shared­Worker** , under `--pref dom­_sharedworker­_enabled` (@Taym95, #44375, #44440). We’re working on the **Wake­Lock API** too, under `--pref dom­_wakelock­_enabled` (@TG199, @rovertrack, #43617, #44343). ## servoshell servoshell for Android now has a **revamped browser UI** , including a new **history view** (@espy, #43795), the **apk is 30% smaller** (@jschwe, #44278, #44182), and we’ve fixed the black screen bug when closing settings or switching back from another app (@yezhizhen, #44327). You can now close tabs on OpenHarmony too (@Narfinger, #42713). As for servoshell on desktop platforms, we’ve fixed some focus- and IME-related bugs (@mrobinson, #43872, #43932), and on Windows, we now install a normal shortcut without the strange behaviour of an “advertised” shortcut (@yezhizhen, #44223). ## For developers When using the **Inspector** tab in the Firefox **DevTools** , the **Rules** panel now includes declarations in **‘@layer’ rules** (@arabson99, #43912). When **logging expressions** in the **Console** tab, and when **hovering over symbols** in the **Debugger** tab, you can now get more information about the contents of functions, arrays, objects, and other values (@atbrakhi, @eerii, #44172, #44173, #44022, #44233, #44196, #44181, #44064, #44023, #44164, #44369, #44262). When using the **Debugger** tab, you can now use the **Scopes** panel to inspect local and global variables (@eerii, @atbrakhi, #43792, #43791), you can now debug **web worker** scripts (@atbrakhi, #43981), and we’ve started implementing **blackboxing** , aka the **Ignore source** button (@freyacodes, #44142). We’ve also landed some initial support for the **Style Editor** tab (@rovertrack, #44517, #44462). We’re working towards re-enabling our automated DevTools tests in CI, which should make the feature more reliable (@freyacodes, #44577), and we’ve landed a small build reproducibility fix too (@jschwe, #44459). For developers of Servo itself, please note that the **Cargo ‘release’ profile** is no longer `#[cfg(debug­_assertions)]` (@jschwe, @mrobinson, #44177). If you’ve been using ‘release’ as a “faster ‘debug’ with assertions” build locally, consider switching to ‘checked-release’ or ‘medium’. The pull request template has been updated (@mrobinson, #44135). **‘Testing’** and **‘Fixes’** should go at the _bottom_ of the PR description, and **‘Testing’** is about automated tests, not how you tested the PR locally. We’ve made more progress on the new dev container, which will provide an alternative to our usual procedures for setting up a Servo build environment (@jschwe, @sagudev, #44126, #44111, #44162, #44641, #44109). Keep an eye out for that in the book! In the meantime, did you know that you can use Lix or Nix to build Servo on Linux with a lot less hassle, _even if_ you’re not using NixOS? For now at least, head to the NixOS page in the book to learn more. We’ve also fixed a regression that made `--debug-mozjs` and `MOZJS­_FROM­_SOURCE` builds take much longer to complete on Linux when not using Nix (@jschwe, #44346). We’ve fixed building Servo with the **‘jitspew’ feature** in mozjs, allowing you to set **IONFLAGS** to enable JIT logging (@simonwuelker, #44010). We’ve also fixed build issues on Windows and FreeBSD (@zhangxichang, @mrobinson, #44264, #44591). ## Embedding API With this second monthly release of the Servo library, we have some quick notes about **API stability** and **semver compatibility** : * **The ‘servo’ package** follows Cargo’s rules for semver compatibility. 0.1.1 is compatible with version 0.1.0, but 0.2.0 is a breaking update. * Until we integrate semver analysis into our release process, each monthly release will have a breaking version number, while non-breaking version numbers may be used for LTS updates. * In general, **dependencies of ‘servo’** , like ‘servo-base’ and ‘servo-script’, **do not use semver**. Any release may include breaking changes. We’ve fixed a **build failure** affecting embedders with a **new or updated Cargo.lock** (@jschwe, #44093), and landed several other changes to help us with the Servo library release process (@jschwe, @mukilan, #43972, #44642, #43182, #43866, #44086, #43797). Breaking changes: * Web­View::animating now takes `&self` instead of `self`, so you can call it without cloning the handle (@JavaDerg, #44253) * Servo::site­_data­_manager now returns `&SiteDataManager` instead of `Ref<'_, SiteDataManager>` (@sabbCodes, #44116) * Web­View­Delegate::`play­_gamepad­_haptic­_effect` and `stop­_gamepad­_haptic­_effect` have been removed (@mrobinson, #43895), but they have not worked since February 2026 – use Gamepad­Delegate instead You can now load a URL with **custom request headers** by calling Web­View::load­_request (@Narfinger, @longvatrong111, @mrobinson, #43338). You can now **retrieve cookies asynchronously** by calling Site­Data­Manager::cookies­_for­_url­_async (@longvatrong111, #43794). The synchronous version of that method, Site­Data­Manager::cookies­_for­_url, was previously not callable because Cookie­Source was not exposed to the public API, but we’ve fixed that now (@TG199, #44124). You can now **clear session cookies** without clearing permanent cookies by calling Site­Data­Manager::clear­_session­_cookies (@longvatrong111, #44166). When **intercepting requests** with Servo­Delegate:: and Web­View­Delegate::load­_web­_resource, we now include a destination and referrer­_url in the Web­Resource­Request, which can be helpful if you’re implementing **ad blocking** (@webbeef, #44493). You can configure Servo to **write all of its storage to a unique directory** for that session by enabling Opts::temporary­_storage (@janvarga, #44433). Note that these unique directories currently persist after Servo exits, so it’s an isolation feature, not a privacy feature. Window­Rendering­Context::new and Software­Rendering­Context::new now return an error if the given `size` is less than 1x1 (@freyacodes, @mrobinson, #44011). We’ve improved our API docs for Web­View, Web­View­Builder, Web­View­Delegate, ServoDelegate, Prompt­Dialog, Web­Resource­Load, Web­Xr­Registry, Preferences, and servoshell’s EXPERIMENTAL­_PREFS (@simonwuelker, @TG199, @sabbCodes, @jdm, @rovertrack, #43892, #43787, #44171, #43947). We’ve also improved our API docs for Opts, Output­Options, Diagnostics­Logging, Pref­Value, servo::opts, and servo­_config (@mukilan, #43802). ## More on the web platform **`Tab` navigation** now works across **< iframe>** boundaries (@mrobinson, #44397), and **`Ctrl` +`Backspace`** (or **`⌥`` ⌫`**) now **deletes a whole word** in input fields (@mrobinson, #43940). **Tab characters** are now rendered correctly in **< pre>** (and other elements with **‘white-space: pre’**), with proper tab stops (@mrobinson, @SimonSapin, #44480). **Spaces** are now rendered correctly in **2D <canvas>**, instead of twice as wide as they should be (@mrobinson, #43899). **< a href>** now correctly resolves the URL with the page encoding (@sabbCodes, #43822). We’ve improved the default appearance of **< input type=file>** (@sabbCodes, #44496) and **< textarea placeholder>** (@mrobinson, #43770). All **keyboard events** , **mouse events** , **wheel events** , and **pointer events** , other than **‘pointerenter’** and **‘pointerleave’** , now **bubble out of shadow roots** (@simonwuelker, @webbeef, #43799, #44094). **‘error’ events** on **Window** now report the correct **filename** (**source** in **onerror**) and **lineno** (@Gae24, #43632). **console.log()** and friends now support **printf-style formatting directives** , although for now `%c` is ignored (@TG199, #43897). **file: URLs** are now considered **secure contexts** , so they can now use features like **crypto.subtle** and **crypto.random­UUID** (@simonwuelker, #43989). **Exception messages** have improved in Location, Static­Range, and the HTML­Element family of types (@arihant2math, @MuhammadMouostafa, @treetmitterglad, #44282, #43260, #43882). We’ve improved the conformance of **fetch algorithms** (@yezhizhen, #43970, #43798), **focus** and **tab navigation** (@mrobinson, #43842, #44029, #44360, #43859, #44535), **form submission** (@TG199, #43700), **JS modules** (@elomscansio, @Gae24, #43741, #44179, #44042), **page navigation** (@TimvdLippe, #43857), **< svg view­Box>** (@yezhizhen, #44420), **‘attr()’** (@Loirooriol, #43878), **‘:focus’** (@mrobinson, #43873), **‘font’** (@RichardTjokroutomo, #44061), **‘@keyframes’** (@simonwuelker, #43461), **‘@property’** (@Loirooriol, #43878), **‘load’** events (@jdm, @arabson99, #43807, #44046), **fetch­Later()** (@TimvdLippe, #43627), **axes** and **buttons** on **Gamepad** (@log101, @rovertrack, #44411, #44357), **copy­Tex­Image­2D()** on **Web­GL­Rendering­Context** (@simartin, @mrobinson, #43608), **tex­Image3D()** on **Web­GL2­Rendering­Context** (@simartin, #44367), **environment­Blend­Mode** on **XR­Session** (@msub2, #44155), **mark()** and **measure()** on **Performance** (@shubhamg13, @simonwuelker, #44471, #44199, #43990, #43753), and **Performance­Resource­Timing** (@shubhamg13, #44228). We’ve fixed bugs related to **console logging** (@sabbCodes, #44243), **‘animation’** (@mrobinson, #44299), **‘box-shadow’** (@yezhizhen, #44474, #44457), **‘display: contents’** (@Loirooriol, @mrobinson, #44551, #44299), **‘display: inline-flex’** (@SimonSapin, #44281), **‘display: table-cell’** (@Loirooriol, #44550), **‘display: table-row-group’** (@Veercodeprog, #43674), **‘overflow-x: clip’** and **‘overflow-y: clip’** (@Messi002, #43620), **‘position: absolute’** on grid items (@nicoburns, #44324), **‘word-spacing: <percentage>’** (@sabbCodes, #44031), **remove­Child()** on **Document** (@rovertrack, #44133), and **URL.revoke­Object­URL()** (@simonwuelker, @jdm, #43746, #43977, #44035). ## Performance and stability We’ve fixed some big inefficiencies in Servo. **append­Child()** with nested shadow roots is no longer O(2n) (@yezhizhen, @webbeef, #44016), and we’ve halved the time it takes to load the ECMAScript spec by fixing the O(whole DOM tree) processing of **‘id’** and **‘name’ attributes** (@simonwuelker, #44120, #44127, #44117). Servo makes its **first TLS connection** in each session **30–60 ms faster** (@jschwe, #44242), and we’ve instrumented the Servo and servoshell startup processes to find more opportunities for optimisation (@jschwe, #44443, #44456). Like most browser engines, Servo is a multi-threaded (and sometimes multi-process) system requiring a great deal of IPC messages to keep everything connected. Two key components of this system are the **constellation** thread, which manages the engine as a whole, and the **script threads** (or web processes), which render the web pages. Sending these messages can be expensive though, so to **reduce unnecessary IPC traffic** , we’ve landed an optimisation that allows script threads to selectively receive only the relevant messages from the constellation (@webbeef, #43124). We’ve reduced the **memory usage** of each **Attr** , **Text** , and **Character­Data** node in the DOM by 16 bytes (@mrobinson, @Loirooriol, #44074), and **fixed a memory leak** when deleting **< video controls>** or **< audio controls>** (@Messi002, #43983). Our **about:memory** page is more accurate now too, with new tracking of **libc memory allocations** on macOS, improved tracking of libc memory allocations on Linux (@jschwe, #44037), and more accurate tracking of Path­Buf and types in `tokio`, `http`, `data­_url`, and `urlpattern` (@Narfinger, #43858). Less memory usage isn’t always better in browser engines though, because there are many kinds of caches and other optimisations we can do to make browsing the web faster, at the expense of increased memory usage. For example, we can greatly speed up **prototype checks** for DOM objects by storing a number in each object that identifies the concrete type, at the expense of making each DOM object 64 bits larger (@webbeef, #44364). Layout can now **reuse fragments** in later reflows, in many cases that involve block layout or ‘position: absolute’ (@mrobinson, @lukewarlow, @Loirooriol, #42904, #44231). We’re also working on **reusing shaping results** in later reflows, and making inline layout more efficient (@mrobinson, #44370, #43974, #44436). We’ve landed several changes that should reduce the **binary size** of Servo (@rovertrack, @mrobinson, @nicoburns, @Narfinger, #44227, #44221, #44303, #44338, #44428, #44134). We’ve also reduced clones, allocations, borrow checks, GC rooting steps, and other operations in many parts of Servo (@rovertrack, @Narfinger, @Loirooriol, @yezhizhen, @simonwuelker, #44008, #44544, #44271, #44279, #43826, #44052, #44139). Several crashes have been fixed: * in compressed­Tex­Sub­Image2D() on Web­GL­Rendering­Context (@thebabalola, #44050) * in console.log() (@thebabalola, #43844) * in get­Data() on Data­Transfer (@SimonSapin, #44607) * in remove() on Element (@SimonSapin, #44435) * in replace­With() on Element (@yezhizhen, #44503) * in `--debug-mozjs` builds (@jdm, #44386, #44573, #44581) * in flex and grid layout (@mrobinson, @nicoburns, #44424, #44203) * in layout queries like `offset­Height` (@mrobinson, #44560) * in the devtools Debugger tab, when stepping and when inspecting nested values (@atbrakhi, @eerii, #44024, #43995) * when removing <colgroup> from the DOM (@Loirooriol, #43846) * when running garbage collection (@drasticactions, #43933) * when running servoshell with a u64 `--pref` (@yezhizhen, #44079) * when shadow roots are deeply nested, or when calling attach­Shadow() removes elements from the flat tree (@yezhizhen, @mrobinson, #43888, #43930, #44259) * when web storage features fail to write to disk or encounter SQLite errors (@arihant2math, @sabbCodes, #43918, #43949) We fixed a crash in servoshell when pressing keys like Ctrl+2 or ⌘2 with not enough tabs open (@mrobinson, #44070). **DOM data structures** (`#[dom­_struct]`) can refer to one another, with the help of garbage collection. But when DOM objects are being destroyed, those references can become invalid for a brief moment, depending on the order the GC finalizers run in. This can be unsound if those references are accessed, which is a very easy mistake to make if the type has an `impl Drop`. To help prevent that class of bug, we’re reworking our DOM types so that none of them have `#[dom­_struct]` and `impl Drop` at the same time (@willypuzzle, #44119, #44501, #44513). We’ve improved our static analysis for GC rooting (@officialasishkumar, #44489), and we’ve continued our long-running effort to **use the Rust type system** to make certain kinds of dynamic borrow failures impossible (@sagudev, @TimvdLippe, @Narfinger, @elomscansio, @Gae24, @rovertrack, @yezhizhen, @nodelpit, #43174, #43524, #43928, #43943, #43942, #43944, #43946, #43952, #43975, #44018, #44175, #44241, #44368, #44406, #44441, #44422, #44475, #44478, #44484, #44476, #44490, #44477, #44494, #44497, #44498, #44495, #44505, #44506, #44507, #44508, #44509, #44510, #44512, #44482, #44527, #44528, #44531, #44534, #44542, #44533, #44543, #44553, #44547, #44563, #44562, #44565, #44558, #44583, #44606, #44605, #44608, #44602, #44584, #44620, #44590, #44254, #44628, #44629, #44638, #44626, #44081). Thanks to a wide range of people, we’ve also landed a bunch of cleanups and refactors (@delan, @alice, @Skgland, @atbrakhi, @eerii, @sabbCodes, @jdm, @thebabalola, @CynthiaOketch, @kkoyung, @TimvdLippe, @rovertrack, @webbeef, @arabson99, @yezhizhen, @simonwuelker, @mrobinson, @nicoburns, @longvatrong111, @niyabits, @treetmitterglad, @foresterre, @mukilan, @elomscansio, @freyacodes, @StaySafe020, @TG199, #43772, #44006, #43860, #44121, #44160, #43884, #44154, #44569, #43939, #44003, #44110, #44122, #43824, #44635, #44103, #43978, #44092, #44114, #44277, #44454, #44274, #44237, #44232, #44167, #44214, #43820, #43825, #43810, #43838, #43841, #43847, #43875, #43876, #43889, #43893, #43896, #43881, #43906, #43913, #43908, #43917, #43910, #43921, #43924, #43925, #43907, #43923, #43916, #43909, #43911, #43957, #43969, #43967, #43915, #43954, #43963, #43959, #43955, #44067, #44068, #44071, #44084, #44265, #44115, #44358, #43848). ## Donations Thanks again for your generous support! We are now receiving **7349 USD/month** (+2.5% from March) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers** , one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo. Servo is also on thanks.dev, and already **33 GitHub users** (−4 from March) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. We now have sponsorship tiers that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. If you’re interested in this kind of sponsorship, please contact us at join@servo.org. **7349** USD/month **10000** Use of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page.
servo.org
May 31, 2026 at 6:02 PM
March in Servo: keyboard navigation, better debugging, FreeBSD support, and more!
Servo 0.1.0 represents Servo’s biggest month ever, with a record **530 commits** and our first ever release on crates.io! For security fixes, see § Security. With this release Servo becomes more accessible, thanks to **tab navigation** (@mrobinson, @Loirooriol, #42952, #43019, #43058, #43246, #43267, #43067), **keyboard navigation** with Alt+Shift and the **accesskey** attribute (@mrobinson, #43031, #43144, #43434), and **keyboard scrolling** with Space and Shift+Space (@mrobinson, #43322). We’ve shipped several new web platform features: * **< input type=range>** (@BudiArb, @rayguo17, @mrobinson, #41562) * **< script blocking=render>** (@TimvdLippe, #43150) * **< svg width>** and **< svg height>** (@Loirooriol, #43583) * **‘X-Frame-Options’** (@TimvdLippe, #43539, #43708) * **‘Content-Security-Policy: frame-ancestors’** (@TimvdLippe, #43630) * **‘::first-letter’** styling (@minghuaw, @xiaochengh, @Loirooriol, #43027) * **‘::placeholder’** styling (@stevennovaryo, #43053) * **‘::file-selector-button’** styling (@lukewarlow, @AlexVasiluta, #43498) * **‘background-blend-mode’** (@mrobinson, #43666) * **‘content’** on **‘::marker’** (@niyabits, @Loirooriol, #43515) * **‘list-style-type: <string>’** (@Loirooriol, #43111) * **‘attr(namespace|local)’** and **‘clamp(none)’** (@Loirooriol, #43045) * <system-color> (@longvatrong111, @mrobinson, #42529, #43105, #43107) * <step-position> values **‘jump-start’** , **‘jump-end’** , **‘jump-none’** , and **‘jump-both’** (@yezhizhen, #43061) Plus a bunch of new DOM APIs: * **CommandEvent** (@lukewarlow, #43190) * **moveBefore()** on **Node** (@lukewarlow, #41238) * **relatedTarget** on **MouseEvent** and **PointerEvent** (@simonwuelker, #42989) * **command** on **HTMLButtonElement** (@lukewarlow, #43190) * **selectedOptions** on **HTMLSelectElement** (@jakubadamw, #43017) * **url** on **LargestContentfulPaint** (@shubhamg13, #42901, #42949) * **crypto.subtle.digest()** for **TurboSHAKE** (@kkoyung, #43551) * **crypto.subtle.getPublicKey()** for **ECDH** , **ECDSA** , **Ed25519** , **RSASSA-PKCS1-v1_5** , **RSA-PSS** , **RSA-OAEP** , and **X25519** (@kkoyung, @Taym95, #43073, #43093, #43106, #43115) **servoshell** is now installed as `servoshell` or `servoshell.exe`, rather than `servo` or `servo.exe` (@jschwe, @mrobinson, #42958). `--userscripts` has been removed for now, but anyone who uses it is welcome to reinstate it as a wrapper around User­Content­Manager::add­_script (@jschwe, #43573). We’ve fixed a bug where link hover status lines are sometimes not legible (@simartin, #43320), and we’re working on getting servoshell signed for macOS to avoid getting blocked by Gatekeeper (@jschwe, #42912). After a long effort by @valpackett, @dlrobertson, and more recently @nortti0 and @sagudev (#43116, #43134), we can now build Servo for **FreeBSD**! Note that Servo 0.1.0 still has some issues that need to be worked around, but you can get all the details in #44601. A great deal of work went into making the **crates.io release** possible, including renaming `libservo` to just `servo` (@jschwe, #43141), making each package self-contained (@jschwe, #43180, #43165), fixing build issues (@delan, @jschwe, #43170, #43458, #43463) and crates.io compliance issues (@jschwe, #43459), configuring package metadata (@jschwe, @StaySafe020, #43078, #43264, #43451, #43457, #43654), and organising our dependency tree (@jschwe, @yezhizhen, @webbeef, @mrobinson, #42916, #43243, #43263, #43516, #43526, #43552, #43615, #43622, #43273, #43092). As a result, you can now take your first step towards embedding Servo in a Rust app with: $ cargo add servo This is another big update, so here’s an outline: * Security * Work in progress * For developers * Embedding and automation * More on the web platform * Performance and stability ## Security **crypto.subtle.deriveBits()** for **X25519** checking for all-zero secrets, and **verify()** for **HMAC** comparing signatures, are now done **in constant time** (@kkoyung, #43775, #43773). **‘Content-Security-Policy’** now handles redirects correctly (@TimvdLippe, #43438), and sends violation reports with the correct **blockedURI** and **referrer** (@TimvdLippe, #43367, #43645, #43483). The policy in <meta> now combines with the policy sent in HTTP headers, rather than overriding it (@TimvdLippe, @elomscansio, #43063). When checking nonces, we now reject elements with duplicate attributes (@dyegoaurelio, #43216). The document containing an **< iframe>** can no longer access the contents of error pages (@TimvdLippe, #43539), and CSP violations inside an <iframe> are now correctly reported (@TimvdLippe, #43652). ## Work in progress We’ve landed more work towards supporting **IndexedDB** , under `--pref dom­_indexeddb­_enabled` (@arihant2math, @gterzian, @Taym95, @jerensl, #42139, #42727, #43096, #43041, #42451, #43721, #43754, #42786), and towards supporting **IntersectionObserver** , under `--pref dom­_intersection­_observer­_enabled` (@stevennovaryo, @mrobinson, #42251). We’re continuing to implement **document.execCommand()** for **rich text editing** (@TimvdLippe, #43177), under `--pref dom­_exec­_command­_enabled`. **‘beforeinput’** and **‘input’** events are now fired when executing supported and enabled commands (@TimvdLippe, #43087), the **‘defaultParagraphSeparator’** and **‘styleWithCSS’** commands are now supported (@TimvdLippe, #43028), and the **‘delete’** command is partially supported (@TimvdLippe, #43016, #43082). We’re also working on the Font Loading API (@simonwuelker, #43286), under `--pref dom­_fontface­_enabled`. **new FontFace()** now accepts ArrayBuffer in its `source` argument (@simonwuelker, #43281). All of the features above are enabled in servoshell’s experimental mode. Work on **accessibility** support for web contents continues under `--pref accessibility­_enabled`. There was a breaking change in the embedding API (@delan, @alice, #43029), and we’ve landed support for “grafting” the accessibility tree of a document into that of its containing webview (@delan, @alice, #43012, #43013, #43556). As a result, when you navigate, separate documents can have separate accessibility trees without complicating the embedder. **< link rel=modulepreload>** is now partially supported (@Gae24, #42964), though recursive fetching of descendants is gated by `--pref dom­_allow­_preloading­_module­_descendants` (@Gae24, #43353). For a long time, Servo has had some support for the Web Bluetooth API under `--pref dom­_bluetooth­_enabled`. We’ve recently reworked our implementation to adopt btleplug, the cross-platform Rust-native Bluetooth LE library (@webbeef, #43529, #43581). We’re now implementing the Web Animations API, starting with AnimationTimeline and DocumentTimeline (@mrobinson, #43711). We’ve landed more fixes to Servo’s async parser (@simonwuelker, #42930, #42959), under `--pref dom­_servoparser­_async­_html­_tokenizer­_enabled`. If we can get the feature working more reliably (#37418), it could **halve the energy** Servo spends on parsing, **lower latency** for pages that don’t use document.write(), and even **improve the html5ever API** for the ecosystem. ## For developers Servo’s DevTools feature now has partial support for inspecting **service workers** (@CynthiaOketch, #43659), as well as using the **navigation controls** along the top of the UI (@brentschroeter, @eerii, #43026). In the **Inspector** tab, we’ve fixed a bug where the UI stops updating when navigating to a new page (@brentschroeter, #43153). In the **Console** tab, you can now evaluate JavaScript in **web workers** and **service workers** (@SharanRP, #43361, #43492). In the **Debugger** tab, you can now **Step In** , **Step Out** , and **Step Over** (@eerii, @atbrakhi, #42907, #43040, #43042, #43135). We’ve landed partial support for the **Scopes** panel (@eerii, @atbrakhi, #43166, #43167, #43232), the **Call stack** panel (@atbrakhi, @eerii, #43015, #43039), and showing you information when **hovering over objects** , **arrays** , **functions** , and other values (@atbrakhi, @eerii, #43319, #43356, #43456, #42996, #42936, #42994). We’ve fixed some long-outstanding bugs where the **DevTools UI may stop responding** due to protocol desyncs (@brentschroeter, @eerii, #43230, #43236), or due to messages from multiple Servo threads being interleaved (@brentschroeter, @eerii, #43472). For developers of Servo itself, mach can be a bit opaque at times. To make mach more transparent and composable, we’ve added `mach print-env` and `mach exec` commands (@jschwe, #42888). We’re also working on a new dev container, which will provide an alternative to our usual procedures for setting up a Servo build environment (@jschwe, @sagudev, #43127, #43131, #43139). ## Embedding and automation Breaking changes: * Servo::`set­_accessibility­_active()` is now WebView::set­_accessibility­_active() (@delan, @alice, #43029), to make the API harder to misuse (see the docs for more details). * What was previously named WebView::`pinch­_zoom()` has been renamed to adjust­_pinch­_zoom(), and we’ve added a pinch­_zoom() method that lets you read the current pinch zoom level (@chrisduerr, #43228). * WebView::`set­_delegate()`, `set­_clipboard­_delegate()`, and `set­_gamepad­_provider()` are now WebViewBuilder::delegate(), clipboard­_delegate(), and gamepad­_delegate() (@mrobinson, #43205, #43233). Note that set­_gamepad­_**provider**() is now gamepad­_**delegate**(), consistent with the `GamepadProvider` rename below. * WebViewDelegate::show­_bluetooth­_device­_dialog() has been reworked to use the same “request object” pattern as the `request­_*()` methods, giving you a Bluetooth­Device­Selection­Request with clear methods (@webbeef, #43580). * `GamepadProvider` has been renamed to GamepadDelegate, and `gamepad­_provider()` on WebView has been renamed to `gamepad­_delegate()` (@mrobinson, #43233). * The empty default implementation of EventLoopWaker::wake has been removed, because it almost never makes sense for a new custom impl to leave the method empty (@chrisduerr, @mrobinson, #43250). * Opts::`print­_pwm` is now DiagnosticsLogging::progressive­_web­_metrics (@mrobinson, #43209). Removed from our API: * Opts::`nonincremental­_layout` (@mrobinson, #43207) – no replacement. This only really worked in legacy layout. * Opts::`user­_stylesheets` (@mrobinson, #43206) – use UserContentManager::add­_stylesheet() instead. This is how servoshell’s `--user-stylesheet` option works. You can now read and write cookies with SiteDataManager::cookies­_for­_url() and set­_cookie­_for­_url() (@longvatrong111, #43600). ClipboardDelegate and StringRequest are now exposed to the public API, allowing you to implement custom clipboard delegates (@jdm, @chrisduerr, #43203, #43261). You can pass your custom delegate to WebViewBuilder::clipboard­_delegate(). You can now get the EmbedderControlId associated with an InputMethodControl by calling InputMethodControl::id() (@chrisduerr, #43248). PixelFormat now implements Debug (@chrisduerr, @mrobinson, #43249). We’ve improved the docs for Servo, ServoBuilder, WebViewBuilder, RenderingContext (@chrisduerr, #43229), EmbedderControlId, EmbedderControlRequest, EmbedderControlResponse, SimpleDialogRequest, AlertResponse, ConfirmResponse, PromptResponse, EmbedderMsg (@mukilan, #43564), ResourceReaderMethods (@jschwe, @mrobinson, #43769), servo::input­_events (@mukilan, #43681), and WheelDelta (@yezhizhen, @mrobinson, #43210). We fixed a deadlock in **WebDriver** that occurs under heavy use of **actions** from multiple input sources (@yezhizhen, #43202, #43169, #43262, #43275, #43301), **‘pointerMove’ actions** with a ‘duration’ are now smoothly interpolated (@yezhizhen, #42946, #43076). **Add Cookie** is now more conformant (@yezhizhen, #43690), which led to Servo developers landing a spec patch. **‘pause’ actions** are now slightly more efficient (@yezhizhen, #43014), and we’ve fixed a bug where **‘wheel’ actions** fail to interleave with other actions (@yezhizhen, #43126). ## More on the web platform **Carets now blink** in text fields (@mrobinson, #43128). You can configure or disable blinking carets with `--pref editing_caret_blink_time=0` or a duration in milliseconds. **Clicking to move the caret** is more forgiving now (@mrobinson, #43238), and moving the caret by a **word at a time** is more conventional on Windows and Linux, with Ctrl instead of Alt (@mrobinson, #43436). We’ve also fixed a bug where pressing the arrow keys in text fields both moves the caret (good) and scrolls the page (bad), and fixed a bug where the caret fails to render on empty lines (@mrobinson, @freyacodes, #43247, #42218). **Input** has improved, with more responsive **touchpad scrolling** on Linux (@mrobinson, @chrisduerr, #43350). **Pointer events** and **mouse events** can now be **captured across shadow DOM boundaries** (@simonwuelker, #42987), and we’ve now started working towards shadow-DOM-compatible focus (@mrobinson, #43811). Pressing **Space** or **Enter** inside text fields no longer causes them to be clicked (@mrobinson, #43343). The **lang** attribute is now taken into account when shaping, which is important for the correct rendering of Chinese and Japanese text (@RichardTjokroutomo, @mrobinson, #43447). **‘font-weight’** is now matched more accurately when no available font is an exact match (@shubhamg13, #43125). **Navigation** is one of the most complicated parts of HTML: navigating can run some JavaScript that replaces the page, just run some JavaScript, or depending on the response, do nothing at all. **< iframe>** makes navigation doubly complicated: the document containing an <iframe> can observe and interact with the document inside the <iframe> in various ways, often synchronously. This has been the source of many bugs over the years, but we’ve recently fixed one of those major issues (@jdm, #43496). `javascript:` URLs are a massive special case with many quirks, and <iframe> has its own big edge cases. **new Worker()** now supports **JS modules** (@pylbrecht, @Gae24, #40365), and **CanvasRenderingContext2D** now supports drawing text with **Variation Selectors** , allowing you to control things like emoji presentation and CJK shaping (@yezhizhen, #43449). Servo now fires **‘pointerover’** , **‘pointerout’** , **‘pointerenter’** , and **‘pointerleave’** events on web content (@webbeef, #42736), **‘scroll’** events on **VisualViewport** (@stevennovaryo, #42771), and **‘scrollend’** events on **Document** , **Element** , and **VisualViewport** (@abdelrahman1234567, @mrobinson, #38773). We also fire **‘error’** events when **event handler** attributes contain syntax errors (@simonwuelker, #43178). We’ve improved the default appearance of **< summary>** (@Loirooriol, #43111), **< select>** (@lukewarlow, #43175), **< input type=file>** (@lukewarlow, @AlexVasiluta, @lukewarlow, #43498, #43186), and **< textarea>** and **< input type=text>** and friends (@mrobinson, #43132), plus **‘::marker’** in mixed LTR/RTL content (@Loirooriol, #43201). **< select>** also now requires user interaction to open the picker (@SharanRP, #43485). **< form action>**, **< iframe src>**, **open(url)** on **XMLHttpRequest** , **new EventSource(url)** , and **new Worker(url)** now correctly resolve the URL with the page encoding (@SharanRP, @jdm, @jayant911, @Veercodeprog, @sabbCodes, #43521, #43554, #43572, #43537, #43634, #43588). **‘direction’** now works on grid containers (@nicoburns, #42118), **SVG images** can now be used in **‘border-image’** (@shubhamg13, #42566), **‘linear-gradient()’** now dithers to reduce banding (@Messi002, #43603), **‘letter-spacing’** no longer applies to invisible zero-width formatting characters (@simonwuelker, #42961), and **‘:active’** now matches disabled or non-focusable elements too, as long as they are being clicked (@webbeef, #42935). **DOMContentLoaded** timings in **Performance­Navigation­Timing** are more accurate (@simonwuelker, #43151). **Performance­Paint­Timing** and **Largest­Contentful­Paint** are more accurate too, taking <iframe> into account (@shubhamg13, #42149), and checking for and ignoring things like broken images and transparent backgrounds (@shubhamg13, #42833, #42975, #43475). We’ve improved the conformance of **JS modules** (@Gae24, #43585), **< button command>** (@lukewarlow, #42883), **< font size>** (@shubhamg13, #43103), **< link media>** and **< link type>** (@TimvdLippe, #43043), **< option selected>** (@SharanRP, #43582), **< script integrity>** and **< style integrity>** (@Gae24, #42931), **EventSource** (@mishop-15, #42179), **SubtleCrypto** (@kkoyung, #42984, #43315, #43533, #43519), **Worker** (@simonwuelker, #43329), **HTMLVideoElement** (@shubhamg13, #43341), **dataset** on **Element** (@TimvdLippe, #43046), and **querySelector()** and **querySelectorAll()** (@simonwuelker, #42991). We’ve fixed bugs related to **error reporting** (@simonwuelker, @xZaisk, @yezhizhen, @eyupcanakman, #43191, #43323, #43101, #43560), **event loops** (@jayant911, #43523), **focus** (@jakubadamw, #43431), **quirks mode** (@mrobinson, @Loirooriol, @lukewarlow, #42960, #43368), **< iframe>** (@TimvdLippe, @jdm, #43539, #43732), the **‘animationstart’** and **‘animationend’** events (@simonwuelker, #43454), the **‘touchmove’** event (@yezhizhen, #42926), **CanvasRenderingContext2D** (@simonwuelker, #43218), **Worker** (@bruno-j-nicoletti, #43213), **‘:active’** on <input> (@mrobinson, #43722), **‘overflow: scroll’** on ‘::before’ and ‘::after’ (@stevennovaryo, #43231), **‘position: absolute’** (@yoursanonymous, @Loirooriol, #43084), and **< img>** and **< svg>** without width or height attributes (@Loirooriol, #42666). Fixing that last bug led to Servo developers finding two spec issues! We’ve landed partial support for using **CSS counters** in ‘list-style-type’ on ‘display: list-item’ and ‘content’ on ‘::marker’, but the counter values themselves are not calculated yet, so all list items still read as `0.` or similar. In any case, you can use a <counter-style-name> or ‘symbols()’ in ‘list-style-type’, and ‘counter()’ and ‘counters()’ in ‘content’ (@Loirooriol, #43111). We’ve also landed partial support for **< marquee>** and the **HTMLMarqueeElement** interface, including basic layout, but the contents are not animated yet (@mrobinson, @lukewarlow, #43520, #43610). Servo now exposes several attributes that have no direct effect, but are needed for web compatibility (@lukewarlow, #43500, #43499, #43502, #43518): * **noHref** on **HTMLAreaElement** * **hreflang** , **type** , **charset** on **HTMLAnchorElement** * **useMap** on **HTMLInputElement** and **HTMLObjectElement** * **longDesc** on **HTMLIFrameElement** and **HTMLFrameElement** ## Performance and stability We’ve fixed **sluggish scrolling** on long documents like this page on docs.rs (@webbeef, @yezhizhen, #43074, #43138), and reduced the **memory usage of BoxFragment** by **10%** (@stevennovaryo, #43056). **about:memory** now has a **Force GC** button (@webbeef, #42798), and no longer reports all processes as content processes in multiprocess mode (@webbeef, #42923). **Web fonts** are no longer fetched more than once, and they no longer cause reflow when they fail to load (@minghuaw, #43382, #43595). We’re also working towards better caching for shaping results (@mrobinson, @lukewarlow, @Loirooriol, #43653). **Event handler** attribute lookup is more efficient now (@Narfinger, #43337), and we’ve made **DOM tree walking** more efficient in many cases (@Narfinger, #42781, #42978, #43476). **crypto.subtle.encrypt()** , **decrypt()** , **sign()** , **verify()** , **digest()** , **importKey()** , **unwrapKey()** , **decapsulateKey()** , and **decapsulateBits()** are more efficient now (@kkoyung, #42927), thanks to a recent spec update. More of Servo now **uses cheaper crossbeam channels** instead of IPC channels, unless Servo is running in multiprocess mode, or **avoids IPC altogether** (@Narfinger, @jschwe, @Taym95, #42077, #43309, #42966). We’ve also reduced clones, allocations, conversions, comparisons, and borrow checks in many parts of Servo (@simonwuelker, @kkoyung, @mrobinson, @Narfinger, @yezhizhen, @TG199, #43212, #43055, #43066, #43304, #43452, #43717, #43780, #43088, #43226). **DOM data structures** (`#[dom_struct]`) can refer to one another, with the help of garbage collection. But when DOM objects are being destroyed, those references can become invalid for a brief moment, depending on the order the GC finalizers run in. This can be unsound if those references are accessed, which is a very easy mistake to make if the type has an `impl Drop`. To help prevent that class of bug, we’re reworking our DOM types so that none of them have `#[dom_struct]` and `impl Drop` at the same time (@willypuzzle, #42937, #42982, #43018, #43071, #43222, #43288, #43544, #43563, #43631). We’ve fixed a crash caused by an IPC resource leak when making **many requests over time** (@yezhizhen, #43381), and some bugs found by **ThreadSanitizer** and **--debug-mozjs** (@jdm, @Loirooriol, #42976, #42963, #43487). We’ve also fixed crashes in **CanvasRenderingContext2D** (@yezhizhen, #43449), **Crypto** (@rogerkorantenng, #43501), **devtools** (@simonwuelker, #43133), **event handler** attributes (@simonwuelker, #43178), **Promise** (@Narfinger, @jdm, #43470), and **WebDriver** (@Tarmil, @yezhizhen, #42739, #43381). We’ve continued our long-running effort to **use the Rust type system** to make certain kinds of dynamic borrow failures impossible (@Narfinger, @Gae24, @Uiniel, @TimvdLippe, @yezhizhen, @sagudev, @PuercoPop, @pylbrecht, @arabson99, @jayant911, #42957, #43108, #43130, #43215, #43183, #43219, #43245, #43220, #43252, #43268, #43184, #43277, #43278, #43284, #43302, #43312, #43348, #43327, #43362, #43365, #43383, #43432, #43259, #43439, #43473, #43481, #43480, #43479, #43525, #43535, #43543, #43549, #43570, #43571, #43569, #43579, #43584, #43657, #43713). Thanks to a wide range of people, many of whom were contributing to Servo for their first time, we’ve also landed a bunch of architectural improvements (@elomscansio, @mukilan, #43646), cleanups (@simartin, @SharanRP, @TG199, @sabbCodes, @niyabits, @eerii, @atbrakhi, #43276, #43285, #43532, #43778, #43771, #43566, #43567, #43587, #43140, #43316), and refactors (@sabbCodes, @arabson99, @jayant911, @StaySafe020, @saydmateen, @eerii, @TimvdLippe, @elomscansio, @CynthiaOketch, #43614, #43641, #43619, #43642, #43623, #43656, #43644, #43672, #43664, #43676, #43684, #43679, #43678, #43655, #43675, #43731, #43729, #43728, #43740, #43751, #43748, #43747, #43752, #43745, #43724, #43723, #43765, #43767, #43181, #43269, #43270, #43279, #43437, #43597, #43607, #43602, #43616, #43609, #43612, #43647, #43651, #43662, #43714, #43774). ## Donations Thanks again for your generous support! We are now receiving **7167 USD/month** (+2.6% from February) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers** , one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo. Servo is also on thanks.dev, and already **37 GitHub users** (+5 from February) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. We now have sponsorship tiers that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. If you’re interested in this kind of sponsorship, please contact us at join@servo.org. **7167** USD/month **10000** Use of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page.
servo.org
April 30, 2026 at 9:56 AM
March in Servo: keyboard navigation, better debugging, FreeBSD support, and more!
Servo 0.1.0 represents Servo’s biggest month ever, with a record **530 commits** and our first ever release on crates.io! For security fixes, see § Security. With this release Servo becomes more accessible, thanks to **tab navigation** (@mrobinson, @Loirooriol, #42952, #43019, #43058, #43246, #43267, #43067), **keyboard navigation** with Alt+Shift and the **accesskey** attribute (@mrobinson, #43031, #43144, #43434), and **keyboard scrolling** with Space and Shift+Space (@mrobinson, #43322). We’ve shipped several new web platform features: * **< input type=range>** (@BudiArb, @rayguo17, @mrobinson, #41562) * **< script blocking=render>** (@TimvdLippe, #43150) * **< svg width>** and **< svg height>** (@Loirooriol, #43583) * **‘X-Frame-Options’** (@TimvdLippe, #43539, #43708) * **‘Content-Security-Policy: frame-ancestors’** (@TimvdLippe, #43630) * **‘::first-letter’** styling (@minghuaw, @xiaochengh, @Loirooriol, #43027) * **‘::placeholder’** styling (@stevennovaryo, #43053) * **‘::file-selector-button’** styling (@lukewarlow, @AlexVasiluta, #43498) * **‘background-blend-mode’** (@mrobinson, #43666) * **‘content’** on **‘::marker’** (@niyabits, @Loirooriol, #43515) * **‘list-style-type: <string>’** (@Loirooriol, #43111) * **‘attr(namespace|local)’** and **‘clamp(none)’** (@Loirooriol, #43045) * <system-color> (@longvatrong111, @mrobinson, #42529, #43105, #43107) * <step-position> values **‘jump-start’** , **‘jump-end’** , **‘jump-none’** , and **‘jump-both’** (@yezhizhen, #43061) Plus a bunch of new DOM APIs: * **CommandEvent** (@lukewarlow, #43190) * **moveBefore()** on **Node** (@lukewarlow, #41238) * **relatedTarget** on **MouseEvent** and **PointerEvent** (@simonwuelker, #42989) * **command** on **HTMLButtonElement** (@lukewarlow, #43190) * **selectedOptions** on **HTMLSelectElement** (@jakubadamw, #43017) * **url** on **LargestContentfulPaint** (@shubhamg13, #42901, #42949) * **crypto.subtle.digest()** for **TurboSHAKE** (@kkoyung, #43551) * **crypto.subtle.getPublicKey()** for **ECDH** , **ECDSA** , **Ed25519** , **RSASSA-PKCS1-v1_5** , **RSA-PSS** , **RSA-OAEP** , and **X25519** (@kkoyung, @Taym95, #43073, #43093, #43106, #43115) **servoshell** is now installed as `servoshell` or `servoshell.exe`, rather than `servo` or `servo.exe` (@jschwe, @mrobinson, #42958). `--userscripts` has been removed for now, but anyone who uses it is welcome to reinstate it as a wrapper around User­Content­Manager::add­_script (@jschwe, #43573). We’ve fixed a bug where link hover status lines are sometimes not legible (@simartin, #43320), and we’re working on getting servoshell signed for macOS to avoid getting blocked by Gatekeeper (@jschwe, #42912). After a long effort by @valpackett, @dlrobertson, and more recently @nortti0 and @sagudev (#43116, #43134), we can now build Servo for **FreeBSD**! Note that Servo 0.1.0 still has some issues that need to be worked around, but you can get all the details in #44601. A great deal of work went into making the **crates.io release** possible, including renaming `libservo` to just `servo` (@jschwe, #43141), making each package self-contained (@jschwe, #43180, #43165), fixing build issues (@delan, @jschwe, #43170, #43458, #43463) and crates.io compliance issues (@jschwe, #43459), configuring package metadata (@jschwe, @StaySafe020, #43078, #43264, #43451, #43457, #43654), and organising our dependency tree (@jschwe, @yezhizhen, @webbeef, @mrobinson, #42916, #43243, #43263, #43516, #43526, #43552, #43615, #43622, #43273, #43092). As a result, you can now take your first step towards embedding Servo in a Rust app with: $ cargo add servo This is another big update, so here’s an outline: * Security * Work in progress * For developers * Embedding and automation * More on the web platform * Performance and stability ## Security **crypto.subtle.deriveBits()** for **X25519** checking for all-zero secrets, and **verify()** for **HMAC** comparing signatures, are now done **in constant time** (@kkoyung, #43775, #43773). **‘Content-Security-Policy’** now handles redirects correctly (@TimvdLippe, #43438), and sends violation reports with the correct **blockedURI** and **referrer** (@TimvdLippe, #43367, #43645, #43483). The policy in <meta> now combines with the policy sent in HTTP headers, rather than overriding it (@TimvdLippe, @elomscansio, #43063). When checking nonces, we now reject elements with duplicate attributes (@dyegoaurelio, #43216). The document containing an **< iframe>** can no longer access the contents of error pages (@TimvdLippe, #43539), and CSP violations inside an <iframe> are now correctly reported (@TimvdLippe, #43652). ## Work in progress We’ve landed more work towards supporting **IndexedDB** , under `--pref dom­_indexeddb­_enabled` (@arihant2math, @gterzian, @Taym95, @jerensl, #42139, #42727, #43096, #43041, #42451, #43721, #43754, #42786), and towards supporting **IntersectionObserver** , under `--pref dom­_intersection­_observer­_enabled` (@stevennovaryo, @mrobinson, #42251). We’re continuing to implement **document.execCommand()** for **rich text editing** (@TimvdLippe, #43177), under `--pref dom­_exec­_command­_enabled`. **‘beforeinput’** and **‘input’** events are now fired when executing supported and enabled commands (@TimvdLippe, #43087), the **‘defaultParagraphSeparator’** and **‘styleWithCSS’** commands are now supported (@TimvdLippe, #43028), and the **‘delete’** command is partially supported (@TimvdLippe, #43016, #43082). We’re also working on the Font Loading API (@simonwuelker, #43286), under `--pref dom­_fontface­_enabled`. **new FontFace()** now accepts ArrayBuffer in its `source` argument (@simonwuelker, #43281). All of the features above are enabled in servoshell’s experimental mode. Work on **accessibility** support for web contents continues under `--pref accessibility­_enabled`. There was a breaking change in the embedding API (@delan, @alice, #43029), and we’ve landed support for “grafting” the accessibility tree of a document into that of its containing webview (@delan, @alice, #43012, #43013, #43556). As a result, when you navigate, separate documents can have separate accessibility trees without complicating the embedder. **< link rel=modulepreload>** is now partially supported (@Gae24, #42964), though recursive fetching of descendants is gated by `--pref dom­_allow­_preloading­_module­_descendants` (@Gae24, #43353). For a long time, Servo has had some support for the Web Bluetooth API under `--pref dom­_bluetooth­_enabled`. We’ve recently reworked our implementation to adopt btleplug, the cross-platform Rust-native Bluetooth LE library (@webbeef, #43529, #43581). We’re now implementing the Web Animations API, starting with AnimationTimeline and DocumentTimeline (@mrobinson, #43711). We’ve landed more fixes to Servo’s async parser (@simonwuelker, #42930, #42959), under `--pref dom­_servoparser­_async­_html­_tokenizer­_enabled`. If we can get the feature working more reliably (#37418), it could **halve the energy** Servo spends on parsing, **lower latency** for pages that don’t use document.write(), and even **improve the html5ever API** for the ecosystem. ## For developers Servo’s DevTools feature now has partial support for inspecting **service workers** (@CynthiaOketch, #43659), as well as using the **navigation controls** along the top of the UI (@brentschroeter, @eerii, #43026). In the **Inspector** tab, we’ve fixed a bug where the UI stops updating when navigating to a new page (@brentschroeter, #43153). In the **Console** tab, you can now evaluate JavaScript in **web workers** and **service workers** (@SharanRP, #43361, #43492). In the **Debugger** tab, you can now **Step In** , **Step Out** , and **Step Over** (@eerii, @atbrakhi, #42907, #43040, #43042, #43135). We’ve landed partial support for the **Scopes** panel (@eerii, @atbrakhi, #43166, #43167, #43232), the **Call stack** panel (@atbrakhi, @eerii, #43015, #43039), and showing you information when **hovering over objects** , **arrays** , **functions** , and other values (@atbrakhi, @eerii, #43319, #43356, #43456, #42996, #42936, #42994). We’ve fixed some long-outstanding bugs where the **DevTools UI may stop responding** due to protocol desyncs (@brentschroeter, @eerii, #43230, #43236), or due to messages from multiple Servo threads being interleaved (@brentschroeter, @eerii, #43472). For developers of Servo itself, mach can be a bit opaque at times. To make mach more transparent and composable, we’ve added `mach print-env` and `mach exec` commands (@jschwe, #42888). We’re also working on a new dev container, which will provide an alternative to our usual procedures for setting up a Servo build environment (@jschwe, @sagudev, #43127, #43131, #43139). ## Embedding and automation Breaking changes: * Servo::`set­_accessibility­_active()` is now WebView::set­_accessibility­_active() (@delan, @alice, #43029), to make the API harder to misuse (see the docs for more details). * What was previously named WebView::`pinch­_zoom()` has been renamed to adjust­_pinch­_zoom(), and we’ve added a pinch­_zoom() method that lets you read the current pinch zoom level (@chrisduerr, #43228). * WebView::`set­_delegate()`, `set­_clipboard­_delegate()`, and `set­_gamepad­_provider()` are now WebViewBuilder::delegate(), clipboard­_delegate(), and gamepad­_delegate() (@mrobinson, #43205, #43233). Note that set­_gamepad­_**provider**() is now gamepad­_**delegate**(), consistent with the `GamepadProvider` rename below. * WebViewDelegate::show­_bluetooth­_device­_dialog() has been reworked to use the same “request object” pattern as the `request­_*()` methods, giving you a Bluetooth­Device­Selection­Request with clear methods (@webbeef, #43580). * `GamepadProvider` has been renamed to GamepadDelegate, and `gamepad­_provider()` on WebView has been renamed to `gamepad­_delegate()` (@mrobinson, #43233). * The empty default implementation of EventLoopWaker::wake has been removed, because it almost never makes sense for a new custom impl to leave the method empty (@chrisduerr, @mrobinson, #43250). * Opts::`print­_pwm` is now DiagnosticsLogging::progressive­_web­_metrics (@mrobinson, #43209). Removed from our API: * Opts::`nonincremental­_layout` (@mrobinson, #43207) – no replacement. This only really worked in legacy layout. * Opts::`user­_stylesheets` (@mrobinson, #43206) – use UserContentManager::add­_stylesheet() instead. This is how servoshell’s `--user-stylesheet` option works. You can now read and write cookies with SiteDataManager::cookies­_for­_url() and set­_cookie­_for­_url() (@longvatrong111, #43600). ClipboardDelegate and StringRequest are now exposed to the public API, allowing you to implement custom clipboard delegates (@jdm, @chrisduerr, #43203, #43261). You can pass your custom delegate to WebViewBuilder::clipboard­_delegate(). You can now get the EmbedderControlId associated with an InputMethodControl by calling InputMethodControl::id() (@chrisduerr, #43248). PixelFormat now implements Debug (@chrisduerr, @mrobinson, #43249). We’ve improved the docs for Servo, ServoBuilder, WebViewBuilder, RenderingContext (@chrisduerr, #43229), EmbedderControlId, EmbedderControlRequest, EmbedderControlResponse, SimpleDialogRequest, AlertResponse, ConfirmResponse, PromptResponse, EmbedderMsg (@mukilan, #43564), ResourceReaderMethods (@jschwe, @mrobinson, #43769), servo::input­_events (@mukilan, #43681), and WheelDelta (@yezhizhen, @mrobinson, #43210). We fixed a deadlock in **WebDriver** that occurs under heavy use of **actions** from multiple input sources (@yezhizhen, #43202, #43169, #43262, #43275, #43301), **‘pointerMove’ actions** with a ‘duration’ are now smoothly interpolated (@yezhizhen, #42946, #43076). **Add Cookie** is now more conformant (@yezhizhen, #43690), which led to Servo developers landing a spec patch. **‘pause’ actions** are now slightly more efficient (@yezhizhen, #43014), and we’ve fixed a bug where **‘wheel’ actions** fail to interleave with other actions (@yezhizhen, #43126). ## More on the web platform **Carets now blink** in text fields (@mrobinson, #43128). You can configure or disable blinking carets with `--pref editing_caret_blink_time=0` or a duration in milliseconds. **Clicking to move the caret** is more forgiving now (@mrobinson, #43238), and moving the caret by a **word at a time** is more conventional on Windows and Linux, with Ctrl instead of Alt (@mrobinson, #43436). We’ve also fixed a bug where pressing the arrow keys in text fields both moves the caret (good) and scrolls the page (bad), and fixed a bug where the caret fails to render on empty lines (@mrobinson, @freyacodes, #43247, #42218). **Input** has improved, with more responsive **touchpad scrolling** on Linux (@mrobinson, @chrisduerr, #43350). **Pointer events** and **mouse events** can now be **captured across shadow DOM boundaries** (@simonwuelker, #42987), and we’ve now started working towards shadow-DOM-compatible focus (@mrobinson, #43811). Pressing **Space** or **Enter** inside text fields no longer causes them to be clicked (@mrobinson, #43343). The **lang** attribute is now taken into account when shaping, which is important for the correct rendering of Chinese and Japanese text (@RichardTjokroutomo, @mrobinson, #43447). **‘font-weight’** is now matched more accurately when no available font is an exact match (@shubhamg13, #43125). **Navigation** is one of the most complicated parts of HTML: navigating can run some JavaScript that replaces the page, just run some JavaScript, or depending on the response, do nothing at all. **< iframe>** makes navigation doubly complicated: the document containing an <iframe> can observe and interact with the document inside the <iframe> in various ways, often synchronously. This has been the source of many bugs over the years, but we’ve recently fixed one of those major issues (@jdm, #43496). `javascript:` URLs are a massive special case with many quirks, and <iframe> has its own big edge cases. **new Worker()** now supports **JS modules** (@pylbrecht, @Gae24, #40365), and **CanvasRenderingContext2D** now supports drawing text with **Variation Selectors** , allowing you to control things like emoji presentation and CJK shaping (@yezhizhen, #43449). Servo now fires **‘pointerover’** , **‘pointerout’** , **‘pointerenter’** , and **‘pointerleave’** events on web content (@webbeef, #42736), **‘scroll’** events on **VisualViewport** (@stevennovaryo, #42771), and **‘scrollend’** events on **Document** , **Element** , and **VisualViewport** (@abdelrahman1234567, @mrobinson, #38773). We also fire **‘error’** events when **event handler** attributes contain syntax errors (@simonwuelker, #43178). We’ve improved the default appearance of **< summary>** (@Loirooriol, #43111), **< select>** (@lukewarlow, #43175), **< input type=file>** (@lukewarlow, @AlexVasiluta, @lukewarlow, #43498, #43186), and **< textarea>** and **< input type=text>** and friends (@mrobinson, #43132), plus **‘::marker’** in mixed LTR/RTL content (@Loirooriol, #43201). **< select>** also now requires user interaction to open the picker (@SharanRP, #43485). **< form action>**, **< iframe src>**, **open(url)** on **XMLHttpRequest** , **new EventSource(url)** , and **new Worker(url)** now correctly resolve the URL with the page encoding (@SharanRP, @jdm, @jayant911, @Veercodeprog, @sabbCodes, #43521, #43554, #43572, #43537, #43634, #43588). **‘direction’** now works on grid containers (@nicoburns, #42118), **SVG images** can now be used in **‘border-image’** (@shubhamg13, #42566), **‘linear-gradient()’** now dithers to reduce banding (@Messi002, #43603), **‘letter-spacing’** no longer applies to invisible zero-width formatting characters (@simonwuelker, #42961), and **‘:active’** now matches disabled or non-focusable elements too, as long as they are being clicked (@webbeef, #42935). **DOMContentLoaded** timings in **Performance­Navigation­Timing** are more accurate (@simonwuelker, #43151). **Performance­Paint­Timing** and **Largest­Contentful­Paint** are more accurate too, taking <iframe> into account (@shubhamg13, #42149), and checking for and ignoring things like broken images and transparent backgrounds (@shubhamg13, #42833, #42975, #43475). We’ve improved the conformance of **JS modules** (@Gae24, #43585), **< button command>** (@lukewarlow, #42883), **< font size>** (@shubhamg13, #43103), **< link media>** and **< link type>** (@TimvdLippe, #43043), **< option selected>** (@SharanRP, #43582), **< script integrity>** and **< style integrity>** (@Gae24, #42931), **EventSource** (@mishop-15, #42179), **SubtleCrypto** (@kkoyung, #42984, #43315, #43533, #43519), **Worker** (@simonwuelker, #43329), **HTMLVideoElement** (@shubhamg13, #43341), **dataset** on **Element** (@TimvdLippe, #43046), and **querySelector()** and **querySelectorAll()** (@simonwuelker, #42991). We’ve fixed bugs related to **error reporting** (@simonwuelker, @xZaisk, @yezhizhen, @eyupcanakman, #43191, #43323, #43101, #43560), **event loops** (@jayant911, #43523), **focus** (@jakubadamw, #43431), **quirks mode** (@mrobinson, @Loirooriol, @lukewarlow, #42960, #43368), **< iframe>** (@TimvdLippe, @jdm, #43539, #43732), the **‘animationstart’** and **‘animationend’** events (@simonwuelker, #43454), the **‘touchmove’** event (@yezhizhen, #42926), **CanvasRenderingContext2D** (@simonwuelker, #43218), **Worker** (@bruno-j-nicoletti, #43213), **‘:active’** on <input> (@mrobinson, #43722), **‘overflow: scroll’** on ‘::before’ and ‘::after’ (@stevennovaryo, #43231), **‘position: absolute’** (@yoursanonymous, @Loirooriol, #43084), and **< img>** and **< svg>** without width or height attributes (@Loirooriol, #42666). Fixing that last bug led to Servo developers finding two spec issues! We’ve landed partial support for using **CSS counters** in ‘list-style-type’ on ‘display: list-item’ and ‘content’ on ‘::marker’, but the counter values themselves are not calculated yet, so all list items still read as `0.` or similar. In any case, you can use a <counter-style-name> or ‘symbols()’ in ‘list-style-type’, and ‘counter()’ and ‘counters()’ in ‘content’ (@Loirooriol, #43111). We’ve also landed partial support for **< marquee>** and the **HTMLMarqueeElement** interface, including basic layout, but the contents are not animated yet (@mrobinson, @lukewarlow, #43520, #43610). Servo now exposes several attributes that have no direct effect, but are needed for web compatibility (@lukewarlow, #43500, #43499, #43502, #43518): * **noHref** on **HTMLAreaElement** * **hreflang** , **type** , **charset** on **HTMLAnchorElement** * **useMap** on **HTMLInputElement** and **HTMLObjectElement** * **longDesc** on **HTMLIFrameElement** and **HTMLFrameElement** ## Performance and stability We’ve fixed **sluggish scrolling** on long documents like this page on docs.rs (@webbeef, @yezhizhen, #43074, #43138), and reduced the **memory usage of BoxFragment** by **10%** (@stevennovaryo, #43056). **about:memory** now has a **Force GC** button (@webbeef, #42798), and no longer reports all processes as content processes in multiprocess mode (@webbeef, #42923). **Web fonts** are no longer fetched more than once, and they no longer cause reflow when they fail to load (@minghuaw, #43382, #43595). We’re also working towards better caching for shaping results (@mrobinson, @lukewarlow, @Loirooriol, #43653). **Event handler** attribute lookup is more efficient now (@Narfinger, #43337), and we’ve made **DOM tree walking** more efficient in many cases (@Narfinger, #42781, #42978, #43476). **crypto.subtle.encrypt()** , **decrypt()** , **sign()** , **verify()** , **digest()** , **importKey()** , **unwrapKey()** , **decapsulateKey()** , and **decapsulateBits()** are more efficient now (@kkoyung, #42927), thanks to a recent spec update. More of Servo now **uses cheaper crossbeam channels** instead of IPC channels, unless Servo is running in multiprocess mode, or **avoids IPC altogether** (@Narfinger, @jschwe, @Taym95, #42077, #43309, #42966). We’ve also reduced clones, allocations, conversions, comparisons, and borrow checks in many parts of Servo (@simonwuelker, @kkoyung, @mrobinson, @Narfinger, @yezhizhen, @TG199, #43212, #43055, #43066, #43304, #43452, #43717, #43780, #43088, #43226). **DOM data structures** (`#[dom_struct]`) can refer to one another, with the help of garbage collection. But when DOM objects are being destroyed, those references can become invalid for a brief moment, depending on the order the GC finalizers run in. This can be unsound if those references are accessed, which is a very easy mistake to make if the type has an `impl Drop`. To help prevent that class of bug, we’re reworking our DOM types so that none of them have `#[dom_struct]` and `impl Drop` at the same time (@willypuzzle, #42937, #42982, #43018, #43071, #43222, #43288, #43544, #43563, #43631). We’ve fixed a crash caused by an IPC resource leak when making **many requests over time** (@yezhizhen, #43381), and some bugs found by **ThreadSanitizer** and **--debug-mozjs** (@jdm, @Loirooriol, #42976, #42963, #43487). We’ve also fixed crashes in **CanvasRenderingContext2D** (@yezhizhen, #43449), **Crypto** (@rogerkorantenng, #43501), **devtools** (@simonwuelker, #43133), **event handler** attributes (@simonwuelker, #43178), **Promise** (@Narfinger, @jdm, #43470), and **WebDriver** (@Tarmil, @yezhizhen, #42739, #43381). We’ve continued our long-running effort to **use the Rust type system** to make certain kinds of dynamic borrow failures impossible (@Narfinger, @Gae24, @Uiniel, @TimvdLippe, @yezhizhen, @sagudev, @PuercoPop, @pylbrecht, @arabson99, @jayant911, #42957, #43108, #43130, #43215, #43183, #43219, #43245, #43220, #43252, #43268, #43184, #43277, #43278, #43284, #43302, #43312, #43348, #43327, #43362, #43365, #43383, #43432, #43259, #43439, #43473, #43481, #43480, #43479, #43525, #43535, #43543, #43549, #43570, #43571, #43569, #43579, #43584, #43657, #43713). Thanks to a wide range of people, many of whom were contributing to Servo for their first time, we’ve also landed a bunch of architectural improvements (@elomscansio, @mukilan, #43646), cleanups (@simartin, @SharanRP, @TG199, @sabbCodes, @niyabits, @eerii, @atbrakhi, #43276, #43285, #43532, #43778, #43771, #43566, #43567, #43587, #43140, #43316), and refactors (@sabbCodes, @arabson99, @jayant911, @StaySafe020, @saydmateen, @eerii, @TimvdLippe, @elomscansio, @CynthiaOketch, #43614, #43641, #43619, #43642, #43623, #43656, #43644, #43672, #43664, #43676, #43684, #43679, #43678, #43655, #43675, #43731, #43729, #43728, #43740, #43751, #43748, #43747, #43752, #43745, #43724, #43723, #43765, #43767, #43181, #43269, #43270, #43279, #43437, #43597, #43607, #43602, #43616, #43609, #43612, #43647, #43651, #43662, #43714, #43774). ## Donations Thanks again for your generous support! We are now receiving **7167 USD/month** (+2.6% from February) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers** , one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo. Servo is also on thanks.dev, and already **37 GitHub users** (+5 from February) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. We now have sponsorship tiers that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. If you’re interested in this kind of sponsorship, please contact us at join@servo.org. **7167** USD/month **10000** Use of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page.
servo.org
April 30, 2026 at 9:56 AM
January in Servo: preloads, better forms, details styling, and more!
**Servo 0.0.5** is here, bringing with it lots of improvements in web platform features. Some highlights: * **< link rel=preload>** (@TimvdLippe, @jdm, #40059) * **< style blocking>** and **< link blocking>** (@TimvdLippe, #42096) * **< img align>** (@mrobinson, #42220) * **< select disabled>** (@simonwuelker, #42036) * **OGG files** can now be played in **< audio>** (@jdm, #41789) * **‘cursor-color’** (@mrobinson, #41976) * **‘content: <image>’** works on all elements (@andreubotella, #41480) * **‘::details-content’** on <details> (@lukewarlow, #42107) * **‘:open’** on <details> (@lukewarlow, #42195) * **‘:active’** on <input type=button> (@mrobinson, #42095) * **Origin API** (@WaterWhisperer, #41712) * **MouseEvent.detail** (@mrobinson, #41833) * **Request.keepalive** (@TimvdLippe, @WaterWhisperer, #41457, #41811) * **Cyclic imports** , **import attributes** , and **JSON modules** (@Gae24, #41779) * **navigator.sendBeacon()** is enabled by default (@TimvdLippe, #41694) * `https_proxy`, `HTTPS_PROXY`, and `NO_PROXY` (@Narfinger, #41689) * **ML-KEM** , **ML-DSA** , and **AES-OCB** in **Crypto** (@kkoyung, #41604, #41617, #41615, #41627, #41628, #41647, #41659, #41676, #41791, #41822, #41813, #41829) ## Web APIs __ Servo now **plays OGG media** inside <audio> elements (@jdm, #41789)! We disabled this feature many years ago due to bugs in GStreamer, our media playback engine, but those bugs have since been fixed. We now support non-`px` sizes for width and height attributes in <svg> elements (@rodio, #40761). Inactive documents will now correctly reject fullscreen mode changes (@stevennovaryo, #42068). We’ve enabled support for the **navigator.sendBeacon()** by default (@TimvdLippe, #41694); the `dom_navigator_sendbeacon_enabled` preference has been removed. As part of this work, we implemented the `keepalive` feature of the Request API (@TimvdLippe, @WaterWhisperer, #41457, #41811). That’s not all for network-related improvements! Quota errors from the **fetchLater() API** provide more details (@TimvdLippe, #41665), and fetch response body promises now reject when **invalid gzip content** is encountered (@arayaryoma, #39438). Meanwhile, **EventSource** connections will no longer endlessly reconnect for permanent failures (@WaterWhisperer, #41651, #42137), and now use the correct **‘Last-Event-Id’ header** when reconnecting (@WaterWhisperer, #42103). Finally, Servo will create **PerformanceResourceTiming** entries for requests that returned unsuccessful responses (@bellau, #41804). There has been lots of work related to **navigating pages** and **loading iframes**. We process **URL fragments** more consistently when navigating via **window.location** (@TimvdLippe, #41805, #41834), and allow evaluating **javascript: URLs** when a document’s domain has been modified (@jdm, #41969). XML documents loaded in an <iframe> no longer inherit their encoding from the parent document (@simonwuelker, #41637). We’re also made it possible to use **blob: URLs** from inside **‘about:blank’** and **‘about:srcdoc’** documents (@jdm, #41966, #42104). Finally, constructed documents (e.g. `new Document()`) now inherit the origin and domain of the document that created them (@TimvdLippe, #41780), and we implemented the new **Origin API** (@WaterWhisperer, #41712). Servo’s **mixed content protections** are steadily increasing. Insecure requests (e.g. HTTP) originating from <iframe> elements can now be upgraded to secure protocols (@WaterWhisperer, #41661), and redirected requests now check the most recent URL when determining if the protocol is secure (@WaterWhisperer, #41832). **< style blocking>** and **< link blocking>** can now be used to block rendering while loading stylesheets that are added dynamically (@TimvdLippe, #42096), and stylesheets loaded when parsing the document will **block the document ‘load’ event** more consistently (@TimvdLippe, @mrobinson, #41986, #41987, #41988, #41973). We also **fire the ‘error’ event** if a fetched stylesheet response is invalid (@TimvdLippe, @mrobinson, #42037). Servo now **leads other browsers** in support for new **Web Cryptography** algorithms! This includes full support for **ML-KEM** (@kkoyung, #41604, #41617, #41615, #41627), **ML-DSA** (@kkoyung, #41628, #41647, #41659, #41676), and **AES-OCB** (@kkoyung, #41791, #41822, #41813, #41829), plus improvements to **AES-GCM** (@kkoyung, #41950). Additionally, the error messages returned by many Crypto APIs are now more detailed (@PaulTreitel, @danilopedraza, #41964, #41468, #41902). **JS module loading** received a lot of attention – we’ve improved support for **cyclic imports** (@Gae24, #41779), **import attributes** (@Gae24, #42185), and **JSON modules** (@Gae24, @jdm, #42138). Additionally, the **<link rel=preload>** attribute now triggers **preload fetch operations** that can improve page load speeds (@TimvdLippe, @jdm, #40059). **IndexedDB** support continues to make progress, though for now the feature is disabled by default (`--pref dom_indexeddb_enabled`). This month we gained improvements to **connection queues** (@gterzian, #41500, #42053) and **request granularity** (@gterzian, #41933). We were accidentally persisting **SessionStorage** data beyond the current session, but this has been corrected (@arihant2math, #41326). **Text input fields** have received a lot of love this month. Clicking in an input field will position the cursor accordingly (@mrobinson, @jdm, @Loirooriol, #41906, #41974, #41931), as will clicking past the end of a multiline input (@mrobinson, @Loirooriol, #41909). Selecting text with the mouse in input fields works (@mrobinson, #42049), and double and triple clicks now toggle selections (@mrobinson, #41926). Finally, we fixed a bug causing the input caret to be hidden in <input> elements inside of Shadow DOM content (@stevennovaryo, #42233). **‘cursor-color’** is respected when rendering the input cursor (@mrobinson, #41976), and newlines can no longer be pasted into single line inputs (@mrobinson, #41934). Finally, we fixed a panic when focusing a text field that is disabled (@mrobinson, #42078), as well as panics in APIs like **HTMLInputElement.setRangeText()** that confused bytes and UTF-8 character indices (@mrobinson, #41588). We also made time to **improve form controls**! The default styling of many controls received some care (@mrobinson, #42085), while **< input type=button>** can now be styled with the **‘:active’ pseudo-class** (@mrobinson, #42095). Conversely, disabled **< select>** elements can no longer be activated (@simonwuelker, #42036). Mouse events triggered by the embedder are more complete; **MouseEvent.detail** correctly reports the click count for **‘mouseup’** and **‘mousedown’** events (@mrobinson, #41833), and many other members are now consistent with other mouse events (@mrobinson, #42013). Performing a pinch zoom on mobile is now reflected in the **VisualViewport API** (@stevennovaryo, #41754), though for now the feature is disabled by default (`--pref dom_visual_viewport_enabled`). We’ve changed the behaviour of Web APIs that use the `Clamp]` annotation (such as **Blob.slice()**). The previous implementation would cast floating point values to their integer equivalents, but the standard requires more specific rounding logic (@Taym95, [#41640). The `RGBA8` constant is now available in WebGL 1 rendering contexts; it was previously only available in WebGL 2 contexts (@simonwuelker, #42048). **Fonts** were another area of focus this month. Loading web fonts from **file: URLs** works as expected (@TimvdLippe, #41714), as does using web fonts within Shadow DOM content (@minghuaw, #42151). Each web font request now creates a **PerformanceResourceTiming** entry (@lumi-me-not, #41784). Servo supports font variations as of November 2025, so as of this month, the **FontFace** constructor no longer ignores the **‘font-variation-settings’ property** (@muse254, #41968). **Cursive scripts** now ignore the **‘letter-spacing’** CSS property (@mrobinson, #42165), and we significantly reduced the time and memory required when **rendering non-ASCII text** (@mrobinson, @Loirooriol, #42105, #42162) and when text nodes share the same font (@mrobinson, #41876). ## CSS __ There were lots of improvements to **block layout** algorithms (@Loirooriol, #41492, #41624, #41632, #41655, #41652, #41683). These often affect pages where a block element (such as a <div>) exists within some other layout mode (such as an inline <span>, or a flexbox context), and fixes like these ensure Servo matches the output of other browsers. Elements with **scrollable overflow** can be scrolled more consistently, even with CSS transforms applied to them (@stevennovaryo, #41707, #42005). You can now use **‘content: <image>’ on any element** (@andreubotella, #41480). Generated image content used to only work with pseudo-elements, but that restriction no longer applies. **< details> elements** can now be styled with the **‘::details-content’ pseudo-element** (@lukewarlow, #42107), as well as the ‘:open’ pseudo-class (@lukewarlow, #42195). CSS styles now inherit correctly through **‘display: contents’** as well as **< slot> elements** in Shadow DOM content (@longvatrong111, @Loirooriol, @mrobinson, #41855). **‘overflow-clip-margin’** now works correctly when **‘border-radius’** is present (@Loirooriol, #41967). We fixed bugs involving text inside flexbox elements: they now use consistent baselines for alignment (@lukewarlow, @mrobinson, #42038), and style updates are propagated to the text correctly (@mrobinson, #41951). **< img align>** now aligns the image as expected (@mrobinson, #42220). **‘word-break: keep-all’** now prevents line breaks in **CJK text** (@RichardTjokroutomo, #42088). We also fixed some bugs involving **floats** , **collapsing margins** , and **phantom line boxes** (@Loirooriol, #41812), which sound much cooler than they actually are. Finally, we upgraded our Stylo dependency to the latest changes as of January 1 2026 (@Loirooriol, #41916, #41696). Stylo powers our CSS parsing and style resolution engine, and this upgrade improves support for **parsing color functions** like **‘color-mix()’** , and improves our **CSS animations and transitions** for borders and overflow clipping. ## Automation and introspection __ Last month Servo gained support for HTTP proxies. We now support **HTTPS proxies** as well (@Narfinger, #41689), which can be configured with the `https_proxy` or `HTTPS_PROXY` environment variables, or the `network_https_proxy_uri` preference. In addition, the `NO_PROXY` environment variable or the `network_http_no_proxy` preference can **disable any proxy** for particular domains. Our **developer tools** integration continues to improve. Worker globals are now categorized correctly in the UI (@atbrakhi, #41929), and the Sources panel is populated for very short documents (@atbrakhi, #41983). Servo will report console messages that were logged before the developer tools are opened (@eerii, @mrobinson, #41895). Finally, we fixed a panic when selecting nodes in the layout inspector that have no style information (@eerii, #41800). We’re working towards supporting pausing in the JS debugger (@eerii, @atbrakhi, @jdm, #42007), and breakpoints can be toggled through the UI (@eerii, @atbrakhi, #41925, #42154). While the debugger is paused, hovering over JS objects will report the object’s properties for builtin JS classes (@eerii, @atbrakhi, #42186). Stay tuned for more JS debugging updates in next month’s blog post! Servo’s **WebDriver server** is also maturing. Evaluating a synchronous script that returns a Promise will wait until that promise settles (@yezhizhen, #41823). **‘touchmove’ events** are fired for pointer actions when a button is pressed (@yezhizhen, #41801), and **‘touchcancel’ events** are fired for canceled pointer action items (@yezhizhen, #41937). Finally, any pointer actions that would trigger **duplicate ‘mousemove’ events** are silently discarded (@mrobinson, #42034). **Element Clear commands** now test whether the element is interactable (@yezhizhen, #42124). Now a null script execution timeout value will never trigger a timeout (@yezhizhen, #42184), and synthesized **‘pointermove’ events** have a consistent `pointerId` value (@yezhizhen, #41726). ## Embedding __ You can now **cross-compile Servo** using Windows as the host (@yezhizhen, #41748). We’ve **pinned all git dependencies** to specific revisions, to reduce the risk of build failures (@Narfinger, #42029). We intend to eventually forbid git dependencies in Servo libraries, which will help unblock releasing Servo on crates.io. **SiteDataManager** now has a new **clear_site_data()** method to clear all stored data for a particular host (@janvarga, #41618, #41709, #41852). Our nightly testing UI, **servoshell** , now respects any customized installation path on Windows (@yezhizhen, #41653). We fixed a crash in the Android app when pausing the application (@NiklasMerz, #41827). Additionally, clicking inside a webview in the desktop app will remove focus from any browser UI (@mrobinson, #42080). We’ve laid more groundwork towards exposing **accessibility tree** information from webviews (@delan, @lukewarlow, @alice, #41924). There’s nothing to test yet, but keep an eye on our tracking issue if you want to be notified when nightly builds are ready for testing! ## Stability & performance __ We’ve converted many uses of **IPC channels** in the engine to channels that are **more efficient** when multiprocess mode is disabled (@Narfinger, @jdm, @sagudev, @mrobinson, #41178, #41071, #41733, #41806, #41380, #41809, #41774, #42032, #42033, #41412). Since multiprocess mode is not yet enabled by default (`--multiprocess`), this is a significant boost to Servo’s everyday performance. Servo now sets a **socket timeout for HTTP connections** (@Narfinger, @mrobinson, #41710). This is controlled by the `network_connection_timeout` preference, and defaults to **15 seconds**. Each instance of Servo now starts **four fewer threads** (@Narfinger, #41740). Any network operations that trigger a synchronous UI operation (such as an HTTP authentication prompt) no longer blocks other network tasks from completing (@Narfinger, @jdm, #41965, #41857). It’s said that one of the hardest problems in computer science is **cache invalidation**. We improved the memory usage of **dynamic inline SVG content** by evicting stale SVG tree data from a cache (@TomRCummings, #41675). Meanwhile, we added a new cache to reduce memory usage and improve rendering performance for pages with animating images (@Narfinger, #41956). Servo’s JS engine now accounts for 2D and 3D canvas-related memory usage when deciding how often to perform garbage collection (@sagudev, #42180). This can reduce the risk of out-of-memory (OOM) errors on pages that create large numbers of short-lived WebGL or WebGPU objects. To reduce the risk of panics involving the JS engine integration, we’re continuing to use the **Rust type system** to make certain kinds of dynamic borrow failures impossible (@sagudev, #41692, #41782, #41756, #41808, #41879, #41878, #41955, #41971, #42123). We also continue to identify and **forbid code patterns** that can trigger rare crashes when garbage collection happens while destroying webviews (@willypuzzle, #41717, #41783, #41911, #41911, #41977, #41984, #42243). This month also brought fixes for panics in parallel layout (@mrobinson, #42026), WebGPU (@WaterWhisperer, #42050), <link> fetching (@jdm, #42208), Element.attachShadow() (@mrobinson, #42237), text input methods (@mrobinson, #42240), Web Workers when the developer tools are active (@mrobinson, #42159), IndexedDB (@gterzian, #41960), and asynchronous session history updates (@mrobinson, #42238). **Node.compareDocumentPosition()** is now more efficient (@webbeef, #42260), and selections in text inputs no longer require a full page layout (@mrobinson, @Loirooriol, #41963). ## Donations __ Thanks again for your generous support! We are now receiving **7007 USD/month** (−1.4% over December) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers**, one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo. Servo is also on thanks.dev, and already **33 GitHub users** (+3 over December) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. We now have **sponsorship tiers** that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. A big thanks from Servo to our newest Bronze Sponsor: **str4d**! If you’re interested in this kind of sponsorship, please contact us at join@servo.org. **7007** USD/month **10000** Use of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page. ## Conference talks and blogs __ There were two talks about Servo at FOSDEM 2026 (videos and slides here): * **Implementing Streams Spec in Servo** – Taym Haddadi (@taym95) described the challenges of implementing the Streams Standard. * **The Servo project and its impact on the web platform** – Manuel Rego (@rego) highlighted the ways that Servo has shaped the web platform and contributed to web standards since it started in 2012.
servo.org
March 1, 2026 at 7:48 AM
January in Servo: preloads, better forms, details styling, and more!
**Servo 0.0.5** is here, bringing with it lots of improvements in web platform features. Some highlights: * **< link rel=preload>** (@TimvdLippe, @jdm, #40059) * **< style blocking>** and **< link blocking>** (@TimvdLippe, #42096) * **< img align>** (@mrobinson, #42220) * **< select disabled>** (@simonwuelker, #42036) * **OGG files** can now be played in **< audio>** (@jdm, #41789) * **‘cursor-color’** (@mrobinson, #41976) * **‘content: <image>’** works on all elements (@andreubotella, #41480) * **‘::details-content’** on <details> (@lukewarlow, #42107) * **‘:open’** on <details> (@lukewarlow, #42195) * **‘:active’** on <input type=button> (@mrobinson, #42095) * **Origin API** (@WaterWhisperer, #41712) * **MouseEvent.detail** (@mrobinson, #41833) * **Request.keepalive** (@TimvdLippe, @WaterWhisperer, #41457, #41811) * **Cyclic imports** , **import attributes** , and **JSON modules** (@Gae24, #41779) * **navigator.sendBeacon()** is enabled by default (@TimvdLippe, #41694) * `https_proxy`, `HTTPS_PROXY`, and `NO_PROXY` (@Narfinger, #41689) * **ML-KEM** , **ML-DSA** , and **AES-OCB** in **Crypto** (@kkoyung, #41604, #41617, #41615, #41627, #41628, #41647, #41659, #41676, #41791, #41822, #41813, #41829) ## Web APIs __ Servo now **plays OGG media** inside <audio> elements (@jdm, #41789)! We disabled this feature many years ago due to bugs in GStreamer, our media playback engine, but those bugs have since been fixed. We now support non-`px` sizes for width and height attributes in <svg> elements (@rodio, #40761). Inactive documents will now correctly reject fullscreen mode changes (@stevennovaryo, #42068). We’ve enabled support for the **navigator.sendBeacon()** by default (@TimvdLippe, #41694); the `dom_navigator_sendbeacon_enabled` preference has been removed. As part of this work, we implemented the `keepalive` feature of the Request API (@TimvdLippe, @WaterWhisperer, #41457, #41811). That’s not all for network-related improvements! Quota errors from the **fetchLater() API** provide more details (@TimvdLippe, #41665), and fetch response body promises now reject when **invalid gzip content** is encountered (@arayaryoma, #39438). Meanwhile, **EventSource** connections will no longer endlessly reconnect for permanent failures (@WaterWhisperer, #41651, #42137), and now use the correct **‘Last-Event-Id’ header** when reconnecting (@WaterWhisperer, #42103). Finally, Servo will create **PerformanceResourceTiming** entries for requests that returned unsuccessful responses (@bellau, #41804). There has been lots of work related to **navigating pages** and **loading iframes**. We process **URL fragments** more consistently when navigating via **window.location** (@TimvdLippe, #41805, #41834), and allow evaluating **javascript: URLs** when a document’s domain has been modified (@jdm, #41969). XML documents loaded in an <iframe> no longer inherit their encoding from the parent document (@simonwuelker, #41637). We’re also made it possible to use **blob: URLs** from inside **‘about:blank’** and **‘about:srcdoc’** documents (@jdm, #41966, #42104). Finally, constructed documents (e.g. `new Document()`) now inherit the origin and domain of the document that created them (@TimvdLippe, #41780), and we implemented the new **Origin API** (@WaterWhisperer, #41712). Servo’s **mixed content protections** are steadily increasing. Insecure requests (e.g. HTTP) originating from <iframe> elements can now be upgraded to secure protocols (@WaterWhisperer, #41661), and redirected requests now check the most recent URL when determining if the protocol is secure (@WaterWhisperer, #41832). **< style blocking>** and **< link blocking>** can now be used to block rendering while loading stylesheets that are added dynamically (@TimvdLippe, #42096), and stylesheets loaded when parsing the document will **block the document ‘load’ event** more consistently (@TimvdLippe, @mrobinson, #41986, #41987, #41988, #41973). We also **fire the ‘error’ event** if a fetched stylesheet response is invalid (@TimvdLippe, @mrobinson, #42037). Servo now **leads other browsers** in support for new **Web Cryptography** algorithms! This includes full support for **ML-KEM** (@kkoyung, #41604, #41617, #41615, #41627), **ML-DSA** (@kkoyung, #41628, #41647, #41659, #41676), and **AES-OCB** (@kkoyung, #41791, #41822, #41813, #41829), plus improvements to **AES-GCM** (@kkoyung, #41950). Additionally, the error messages returned by many Crypto APIs are now more detailed (@PaulTreitel, @danilopedraza, #41964, #41468, #41902). **JS module loading** received a lot of attention – we’ve improved support for **cyclic imports** (@Gae24, #41779), **import attributes** (@Gae24, #42185), and **JSON modules** (@Gae24, @jdm, #42138). Additionally, the **<link rel=preload>** attribute now triggers **preload fetch operations** that can improve page load speeds (@TimvdLippe, @jdm, #40059). **IndexedDB** support continues to make progress, though for now the feature is disabled by default (`--pref dom_indexeddb_enabled`). This month we gained improvements to **connection queues** (@gterzian, #41500, #42053) and **request granularity** (@gterzian, #41933). We were accidentally persisting **SessionStorage** data beyond the current session, but this has been corrected (@arihant2math, #41326). **Text input fields** have received a lot of love this month. Clicking in an input field will position the cursor accordingly (@mrobinson, @jdm, @Loirooriol, #41906, #41974, #41931), as will clicking past the end of a multiline input (@mrobinson, @Loirooriol, #41909). Selecting text with the mouse in input fields works (@mrobinson, #42049), and double and triple clicks now toggle selections (@mrobinson, #41926). Finally, we fixed a bug causing the input caret to be hidden in <input> elements inside of Shadow DOM content (@stevennovaryo, #42233). **‘cursor-color’** is respected when rendering the input cursor (@mrobinson, #41976), and newlines can no longer be pasted into single line inputs (@mrobinson, #41934). Finally, we fixed a panic when focusing a text field that is disabled (@mrobinson, #42078), as well as panics in APIs like **HTMLInputElement.setRangeText()** that confused bytes and UTF-8 character indices (@mrobinson, #41588). We also made time to **improve form controls**! The default styling of many controls received some care (@mrobinson, #42085), while **< input type=button>** can now be styled with the **‘:active’ pseudo-class** (@mrobinson, #42095). Conversely, disabled **< select>** elements can no longer be activated (@simonwuelker, #42036). Mouse events triggered by the embedder are more complete; **MouseEvent.detail** correctly reports the click count for **‘mouseup’** and **‘mousedown’** events (@mrobinson, #41833), and many other members are now consistent with other mouse events (@mrobinson, #42013). Performing a pinch zoom on mobile is now reflected in the **VisualViewport API** (@stevennovaryo, #41754), though for now the feature is disabled by default (`--pref dom_visual_viewport_enabled`). We’ve changed the behaviour of Web APIs that use the `Clamp]` annotation (such as **Blob.slice()**). The previous implementation would cast floating point values to their integer equivalents, but the standard requires more specific rounding logic (@Taym95, [#41640). The `RGBA8` constant is now available in WebGL 1 rendering contexts; it was previously only available in WebGL 2 contexts (@simonwuelker, #42048). **Fonts** were another area of focus this month. Loading web fonts from **file: URLs** works as expected (@TimvdLippe, #41714), as does using web fonts within Shadow DOM content (@minghuaw, #42151). Each web font request now creates a **PerformanceResourceTiming** entry (@lumi-me-not, #41784). Servo supports font variations as of November 2025, so as of this month, the **FontFace** constructor no longer ignores the **‘font-variation-settings’ property** (@muse254, #41968). **Cursive scripts** now ignore the **‘letter-spacing’** CSS property (@mrobinson, #42165), and we significantly reduced the time and memory required when **rendering non-ASCII text** (@mrobinson, @Loirooriol, #42105, #42162) and when text nodes share the same font (@mrobinson, #41876). ## CSS __ There were lots of improvements to **block layout** algorithms (@Loirooriol, #41492, #41624, #41632, #41655, #41652, #41683). These often affect pages where a block element (such as a <div>) exists within some other layout mode (such as an inline <span>, or a flexbox context), and fixes like these ensure Servo matches the output of other browsers. Elements with **scrollable overflow** can be scrolled more consistently, even with CSS transforms applied to them (@stevennovaryo, #41707, #42005). You can now use **‘content: <image>’ on any element** (@andreubotella, #41480). Generated image content used to only work with pseudo-elements, but that restriction no longer applies. **< details> elements** can now be styled with the **‘::details-content’ pseudo-element** (@lukewarlow, #42107), as well as the ‘:open’ pseudo-class (@lukewarlow, #42195). CSS styles now inherit correctly through **‘display: contents’** as well as **< slot> elements** in Shadow DOM content (@longvatrong111, @Loirooriol, @mrobinson, #41855). **‘overflow-clip-margin’** now works correctly when **‘border-radius’** is present (@Loirooriol, #41967). We fixed bugs involving text inside flexbox elements: they now use consistent baselines for alignment (@lukewarlow, @mrobinson, #42038), and style updates are propagated to the text correctly (@mrobinson, #41951). **< img align>** now aligns the image as expected (@mrobinson, #42220). **‘word-break: keep-all’** now prevents line breaks in **CJK text** (@RichardTjokroutomo, #42088). We also fixed some bugs involving **floats** , **collapsing margins** , and **phantom line boxes** (@Loirooriol, #41812), which sound much cooler than they actually are. Finally, we upgraded our Stylo dependency to the latest changes as of January 1 2026 (@Loirooriol, #41916, #41696). Stylo powers our CSS parsing and style resolution engine, and this upgrade improves support for **parsing color functions** like **‘color-mix()’** , and improves our **CSS animations and transitions** for borders and overflow clipping. ## Automation and introspection __ Last month Servo gained support for HTTP proxies. We now support **HTTPS proxies** as well (@Narfinger, #41689), which can be configured with the `https_proxy` or `HTTPS_PROXY` environment variables, or the `network_https_proxy_uri` preference. In addition, the `NO_PROXY` environment variable or the `network_http_no_proxy` preference can **disable any proxy** for particular domains. Our **developer tools** integration continues to improve. Worker globals are now categorized correctly in the UI (@atbrakhi, #41929), and the Sources panel is populated for very short documents (@atbrakhi, #41983). Servo will report console messages that were logged before the developer tools are opened (@eerii, @mrobinson, #41895). Finally, we fixed a panic when selecting nodes in the layout inspector that have no style information (@eerii, #41800). We’re working towards supporting pausing in the JS debugger (@eerii, @atbrakhi, @jdm, #42007), and breakpoints can be toggled through the UI (@eerii, @atbrakhi, #41925, #42154). While the debugger is paused, hovering over JS objects will report the object’s properties for builtin JS classes (@eerii, @atbrakhi, #42186). Stay tuned for more JS debugging updates in next month’s blog post! Servo’s **WebDriver server** is also maturing. Evaluating a synchronous script that returns a Promise will wait until that promise settles (@yezhizhen, #41823). **‘touchmove’ events** are fired for pointer actions when a button is pressed (@yezhizhen, #41801), and **‘touchcancel’ events** are fired for canceled pointer action items (@yezhizhen, #41937). Finally, any pointer actions that would trigger **duplicate ‘mousemove’ events** are silently discarded (@mrobinson, #42034). **Element Clear commands** now test whether the element is interactable (@yezhizhen, #42124). Now a null script execution timeout value will never trigger a timeout (@yezhizhen, #42184), and synthesized **‘pointermove’ events** have a consistent `pointerId` value (@yezhizhen, #41726). ## Embedding __ You can now **cross-compile Servo** using Windows as the host (@yezhizhen, #41748). We’ve **pinned all git dependencies** to specific revisions, to reduce the risk of build failures (@Narfinger, #42029). We intend to eventually forbid git dependencies in Servo libraries, which will help unblock releasing Servo on crates.io. **SiteDataManager** now has a new **clear_site_data()** method to clear all stored data for a particular host (@janvarga, #41618, #41709, #41852). Our nightly testing UI, **servoshell** , now respects any customized installation path on Windows (@yezhizhen, #41653). We fixed a crash in the Android app when pausing the application (@NiklasMerz, #41827). Additionally, clicking inside a webview in the desktop app will remove focus from any browser UI (@mrobinson, #42080). We’ve laid more groundwork towards exposing **accessibility tree** information from webviews (@delan, @lukewarlow, @alice, #41924). There’s nothing to test yet, but keep an eye on our tracking issue if you want to be notified when nightly builds are ready for testing! ## Stability & performance __ We’ve converted many uses of **IPC channels** in the engine to channels that are **more efficient** when multiprocess mode is disabled (@Narfinger, @jdm, @sagudev, @mrobinson, #41178, #41071, #41733, #41806, #41380, #41809, #41774, #42032, #42033, #41412). Since multiprocess mode is not yet enabled by default (`--multiprocess`), this is a significant boost to Servo’s everyday performance. Servo now sets a **socket timeout for HTTP connections** (@Narfinger, @mrobinson, #41710). This is controlled by the `network_connection_timeout` preference, and defaults to **15 seconds**. Each instance of Servo now starts **four fewer threads** (@Narfinger, #41740). Any network operations that trigger a synchronous UI operation (such as an HTTP authentication prompt) no longer blocks other network tasks from completing (@Narfinger, @jdm, #41965, #41857). It’s said that one of the hardest problems in computer science is **cache invalidation**. We improved the memory usage of **dynamic inline SVG content** by evicting stale SVG tree data from a cache (@TomRCummings, #41675). Meanwhile, we added a new cache to reduce memory usage and improve rendering performance for pages with animating images (@Narfinger, #41956). Servo’s JS engine now accounts for 2D and 3D canvas-related memory usage when deciding how often to perform garbage collection (@sagudev, #42180). This can reduce the risk of out-of-memory (OOM) errors on pages that create large numbers of short-lived WebGL or WebGPU objects. To reduce the risk of panics involving the JS engine integration, we’re continuing to use the **Rust type system** to make certain kinds of dynamic borrow failures impossible (@sagudev, #41692, #41782, #41756, #41808, #41879, #41878, #41955, #41971, #42123). We also continue to identify and **forbid code patterns** that can trigger rare crashes when garbage collection happens while destroying webviews (@willypuzzle, #41717, #41783, #41911, #41911, #41977, #41984, #42243). This month also brought fixes for panics in parallel layout (@mrobinson, #42026), WebGPU (@WaterWhisperer, #42050), <link> fetching (@jdm, #42208), Element.attachShadow() (@mrobinson, #42237), text input methods (@mrobinson, #42240), Web Workers when the developer tools are active (@mrobinson, #42159), IndexedDB (@gterzian, #41960), and asynchronous session history updates (@mrobinson, #42238). **Node.compareDocumentPosition()** is now more efficient (@webbeef, #42260), and selections in text inputs no longer require a full page layout (@mrobinson, @Loirooriol, #41963). ## Donations __ Thanks again for your generous support! We are now receiving **7007 USD/month** (−1.4% over December) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers**, one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo. Servo is also on thanks.dev, and already **33 GitHub users** (+3 over December) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. We now have **sponsorship tiers** that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. A big thanks from Servo to our newest Bronze Sponsor: **str4d**! If you’re interested in this kind of sponsorship, please contact us at join@servo.org. **7007** USD/month **10000** Use of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page. ## Conference talks and blogs __ There were two talks about Servo at FOSDEM 2026 (videos and slides here): * **Implementing Streams Spec in Servo** – Taym Haddadi (@taym95) described the challenges of implementing the Streams Standard. * **The Servo project and its impact on the web platform** – Manuel Rego (@rego) highlighted the ways that Servo has shaped the web platform and contributed to web standards since it started in 2012.
servo.org
March 1, 2026 at 7:48 AM
December in Servo: multiple windows, proxy support, better caching, and more!
**Servo 0.0.4** and our December nightly builds now support **multiple windows** (@mrobinson, @mukilan, #40927, #41235, #41144)! This builds on features that landed in Servo’s embedding API last month. We’ve also landed support for several web platform features, both old and new: * **‘contrast-color()’** in CSS color values (@webbeef, #41542) * partial support for **< meta charset>** (@simonwuelker, #41376) * partial support for **encoding sniffing** (@simonwuelker, #41435) * **‘background’** and **‘bgcolor’** attributes on <table>, <thead>, <tbody>, <tfoot>, <tr>, <td>, <th> (@simonwuelker, #41272) * **tee()** on **readable byte streams** (@Taym95, #35991) **Note:** due to a known issue, servoshell on macOS may not be able to directly open new windows, depending on your system settings. For better compatibility with older web content, we now support **vendor-prefixed** CSS properties like ‘-moz-transform’ (@mrobinson, #41350), as well as window.**clientInformation** (@Taym95, #41111). We’ve continued shipping the **SubtleCrypto API**, with full support for **ChaCha20-Poly1305** , **RSA-OAEP** , **RSA-PSS** , and **RSASSA-PKCS1-v1_5** (see below), plus **importKey() for ML-KEM** (@kkoyung, #41585) and several other improvements (@kkoyung, @PaulTreitel, @danilopedraza, #41180, #41395, #41428, #41442, #41472, #41544, #41563, #41587, #41039, #41292): Algorithm | ---|--- ChaCha20-Poly1305 | (@kkoyung, #40978, #41003, #41030) RSA-OAEP | (@kkoyung, @TimvdLippe, @jdm, #41225, #41217, #41240, #41316) RSA-PSS | (@kkoyung, @jdm, #41157, #41225, #41240, #41287) RSASSA-PKCS1-v1_5 | (@kkoyung, @jdm, #41172, #41225, #41240, #41267) When using **servoshell** on Windows, you can now see `--help` and log output, as long as servoshell was started in a console (@jschwe, #40961). Servo diagnostics options are now accessible in servoshell via the `SERVO_DIAGNOSTICS` environment variable (@atbrakhi, #41013), in addition to the usual `-Z` / `--debug=` arguments. **Servo’s devtools** now partially support the **Network** > **Security** tab (@jiang1997, #40567), allowing you to inspect some of the TLS details of your requests. We’ve also made it **compatible with Firefox 145** (@eerii, #41087), and use fewer IPC resources (@mrobinson, #41161). We’ve fixed rendering bugs related to **‘float’** , **‘order’** , **‘max-width’** , **‘max-height’** , **‘:link’ selectors** , **< audio> layout**, and **getClientRects()** , affecting intrinsic sizing (@Loirooriol, #41513), anonymous blocks (@Loirooriol, #41510), incremental layout (@Loirooriol, #40994), flex item sizing (@Loirooriol, #41291), selector matching (@andreubotella, #41478), replaced element layout (@Loirooriol, #41262), and empty fragments (@Loirooriol, #41477). Servo now fires **‘toggle’** events on **< dialog>** (@lukewarlow, #40412). We’ve also improved the conformance of ‘wheel’ events (@mrobinson, #41182), ‘hashchange’ events (@Taym95, #41325), ‘dblclick’ events on <input> (@Taym95, #41319), ‘resize’ events on <video> (@tharkum, #40940), ‘seeked’ events on <video> and <audio> (@tharkum, #40981), and the ‘transform’ property in getComputedStyle() (@mrobinson, #41187). ## Embedding API __ Servo now has basic support for **HTTP proxies** (@Narfinger, #40941). You can set the proxy URL in the `http_proxy` (@Narfinger, #41209) or `HTTP_PROXY` (@treeshateorcs, @yezhizhen, #41268) environment variables, or via `--pref network_http_proxy_uri`. We now use the **system root certificates** by default (@Narfinger, @mrobinson, #40935, #41179), on most platforms. If you don’t want to trust the system root certificates, you can instead continue to use Mozilla’s root certificates with `--pref network_use_webpki_roots`. As always, you can also add your own root certificates via `Opts`::`certificate_path` (`--certificate-path=`). We have a new `SiteDataManager` API for managing **localStorage** , **sessionStorage** , and **cookies** (@janvarga, #41236, #41255, #41378, #41523, #41528), and a new `NetworkManager` API for managing the **cache** (@janvarga, @mrobinson, #41255, #41474, #41386). To clear the cache, call `NetworkManager`::`clear_cache`, and to list cache entries, call `NetworkManager`::`cache_entries`. **Simple dialogs** – that is alert(), confirm(), and prompt() – are now exposed to embedders via a new `SimpleDialog` type in `EmbedderControl` (@mrobinson, @mukilan, #40982). This new interface is harder to misuse, and no longer requires boilerplate for embedders that wish to ignore simple dialogs. **Web console messages** , including messages from the Console API, are now accessible via `ServoDelegate`::`show_console_message` and `WebViewDelegate`::`show_console_message` (@atbrakhi, #41351). `Servo`, the main handle for controlling Servo, is now cloneable for sharing within the same thread (@mukilan, @mrobinson, #41010). To shut down Servo, simply drop the last `Servo` handle or let it go out of scope. `Servo`::`start_shutting_down` and `Servo`::`deinit` have been removed (@mukilan, @mrobinson, #41012). Several interfaces have also been renamed: * `Servo`::`clear_cookies` is now `SiteDataManager`::`clear_cookies` (@janvarga, #41236, #41255) * `DebugOpts`::`disable_share_style_cache` is now `Preferences`::`layout_style_sharing_cache_enabled` (@atbrakhi, #40959) * The rest of `DebugOpts` has been moved to `DiagnosticsLogging`, and the options have been renamed (@atbrakhi, #40960) ## Perf and stability __ We can now **evict entries** from our **HTTP cache** (@Narfinger, @gterzian, @Taym95, #40613), rather than having it grow forever (or get cleared by an embedder). **about:memory** now tracks **SVG-related memory usage** (@d-kraus, #41481), and we’ve fixed memory leaks in <video> and <audio> (@tharkum, #41131). Servo now does less work when **matching selectors** (@webbeef, #41368), when **focus changes** (@mrobinson, @Loirooriol, #40984), and when **reflowing boxes** whose size did not change (@Loirooriol, @mrobinson, #41160). To allow for smaller binaries, **gamepad support** is now **optional at build time** (@WaterWhisperer, #41451). We’ve fixed some **undefined behaviour** around garbage collection (@sagudev, @jdm, @gmorenz, #41546, mozjs#688, mozjs#689, mozjs#692). To better avoid other garbage-collection-related bugs (@sagudev, mozjs#647, mozjs#638), we’ve continued our work on defining (and migrating to) safer interfaces between Servo and the SpiderMonkey GC (@sagudev, #41519, #41536, #41537, #41520, #41564). We’ve fixed a crash that occurs when **< link rel=“shortcut icon”>** has an **empty ‘href’ attribute** , which affected chiptune.com (@webbeef, #41056), and we’ve also fixed crashes in: * ‘background-repeat’ (@mrobinson, #41158) * <audio> layout (@Loirooriol, #41262) * custom elements (@mrobinson, #40743) * AudioBuffer (@WaterWhisperer, #41253) * AudioNode (@Taym95, #40954) * ReportingObserver (@Taym95, #41261) * Uint8Array (@jdm, #41228) * the fonts system, on FreeType platforms (@simonwuelker, #40945) * IME usage, on OpenHarmony (@jschwe, #41570) ## Donations __ Thanks again for your generous support! We are now receiving **7110 USD/month** (+10.5% over November) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers**, one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo. Servo is also on thanks.dev, and already **30 GitHub users** (+2 over November) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. We now have **sponsorship tiers** that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. A big thanks from Servo to our newest Bronze Sponsors: **Anthropy** , **Niclas Overby** , and **RxDB**! If you’re interested in this kind of sponsorship, please contact us at join@servo.org. **7110** USD/month **10000** Use of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page. ## Conference talks and blogs __ We’ve recently published one talk and one blog post: * **Web engine CI on a shoestring budget** (slides; transcript) – Delan Azabani (@delan) spoke about the CI system that keeps our builds and tryjobs moving fast, running nearly two million tests in under half an hour. * **Servo 2025 Stats** – Manuel Rego (@mrego) wrote about the growth of the Servo project, and how our many new contributors have enabled that. We also have two **upcoming** talks at **FOSDEM 2026** in **Brussels** later this month: * **The Servo project and its impact on the web platform ecosystem** – Manuel Rego (@mrego) is speaking on **Saturday 31 January** at **14:00 local time** (13:00 UTC), about Servo’s impact on spec issues, interop bugs, test cases, and the broader web platform ecosystem. * **Implementing Streams Spec in Servo web engine** – Taym Haddadi (@Taym95) is speaking on **Saturday 31 January** at **17:45 local time** (16:45 UTC), about our experiences writing a new implementation of the Streams API that is independent of the one in SpiderMonkey. Servo developers Martin Robinson (@mrobinson) and Delan Azabani (@delan) will also be attending FOSDEM 2026, so it would be a great time to come along and chat about Servo!
servo.org
January 23, 2026 at 5:58 PM
December in Servo: multiple windows, proxy support, better caching, and more!
**Servo 0.0.4** and our December nightly builds now support **multiple windows** (@mrobinson, @mukilan, #40927, #41235, #41144)! This builds on features that landed in Servo’s embedding API last month. We’ve also landed support for several web platform features, both old and new: * **‘contrast-color()’** in CSS color values (@webbeef, #41542) * partial support for **< meta charset>** (@simonwuelker, #41376) * partial support for **encoding sniffing** (@simonwuelker, #41435) * **‘background’** and **‘bgcolor’** attributes on <table>, <thead>, <tbody>, <tfoot>, <tr>, <td>, <th> (@simonwuelker, #41272) * **tee()** on **readable byte streams** (@Taym95, #35991) **Note:** due to a known issue, servoshell on macOS may not be able to directly open new windows, depending on your system settings. For better compatibility with older web content, we now support **vendor-prefixed** CSS properties like ‘-moz-transform’ (@mrobinson, #41350), as well as window.**clientInformation** (@Taym95, #41111). We’ve continued shipping the **SubtleCrypto API**, with full support for **ChaCha20-Poly1305** , **RSA-OAEP** , **RSA-PSS** , and **RSASSA-PKCS1-v1_5** (see below), plus **importKey() for ML-KEM** (@kkoyung, #41585) and several other improvements (@kkoyung, @PaulTreitel, @danilopedraza, #41180, #41395, #41428, #41442, #41472, #41544, #41563, #41587, #41039, #41292): Algorithm | ---|--- ChaCha20-Poly1305 | (@kkoyung, #40978, #41003, #41030) RSA-OAEP | (@kkoyung, @TimvdLippe, @jdm, #41225, #41217, #41240, #41316) RSA-PSS | (@kkoyung, @jdm, #41157, #41225, #41240, #41287) RSASSA-PKCS1-v1_5 | (@kkoyung, @jdm, #41172, #41225, #41240, #41267) When using **servoshell** on Windows, you can now see `--help` and log output, as long as servoshell was started in a console (@jschwe, #40961). Servo diagnostics options are now accessible in servoshell via the `SERVO_DIAGNOSTICS` environment variable (@atbrakhi, #41013), in addition to the usual `-Z` / `--debug=` arguments. **Servo’s devtools** now partially support the **Network** > **Security** tab (@jiang1997, #40567), allowing you to inspect some of the TLS details of your requests. We’ve also made it **compatible with Firefox 145** (@eerii, #41087), and use fewer IPC resources (@mrobinson, #41161). We’ve fixed rendering bugs related to **‘float’** , **‘order’** , **‘max-width’** , **‘max-height’** , **‘:link’ selectors** , **< audio> layout**, and **getClientRects()** , affecting intrinsic sizing (@Loirooriol, #41513), anonymous blocks (@Loirooriol, #41510), incremental layout (@Loirooriol, #40994), flex item sizing (@Loirooriol, #41291), selector matching (@andreubotella, #41478), replaced element layout (@Loirooriol, #41262), and empty fragments (@Loirooriol, #41477). Servo now fires **‘toggle’** events on **< dialog>** (@lukewarlow, #40412). We’ve also improved the conformance of ‘wheel’ events (@mrobinson, #41182), ‘hashchange’ events (@Taym95, #41325), ‘dblclick’ events on <input> (@Taym95, #41319), ‘resize’ events on <video> (@tharkum, #40940), ‘seeked’ events on <video> and <audio> (@tharkum, #40981), and the ‘transform’ property in getComputedStyle() (@mrobinson, #41187). ## Embedding API __ Servo now has basic support for **HTTP proxies** (@Narfinger, #40941). You can set the proxy URL in the `http_proxy` (@Narfinger, #41209) or `HTTP_PROXY` (@treeshateorcs, @yezhizhen, #41268) environment variables, or via `--pref network_http_proxy_uri`. We now use the **system root certificates** by default (@Narfinger, @mrobinson, #40935, #41179), on most platforms. If you don’t want to trust the system root certificates, you can instead continue to use Mozilla’s root certificates with `--pref network_use_webpki_roots`. As always, you can also add your own root certificates via `Opts`::`certificate_path` (`--certificate-path=`). We have a new `SiteDataManager` API for managing **localStorage** , **sessionStorage** , and **cookies** (@janvarga, #41236, #41255, #41378, #41523, #41528), and a new `NetworkManager` API for managing the **cache** (@janvarga, @mrobinson, #41255, #41474, #41386). To clear the cache, call `NetworkManager`::`clear_cache`, and to list cache entries, call `NetworkManager`::`cache_entries`. **Simple dialogs** – that is alert(), confirm(), and prompt() – are now exposed to embedders via a new `SimpleDialog` type in `EmbedderControl` (@mrobinson, @mukilan, #40982). This new interface is harder to misuse, and no longer requires boilerplate for embedders that wish to ignore simple dialogs. **Web console messages** , including messages from the Console API, are now accessible via `ServoDelegate`::`show_console_message` and `WebViewDelegate`::`show_console_message` (@atbrakhi, #41351). `Servo`, the main handle for controlling Servo, is now cloneable for sharing within the same thread (@mukilan, @mrobinson, #41010). To shut down Servo, simply drop the last `Servo` handle or let it go out of scope. `Servo`::`start_shutting_down` and `Servo`::`deinit` have been removed (@mukilan, @mrobinson, #41012). Several interfaces have also been renamed: * `Servo`::`clear_cookies` is now `SiteDataManager`::`clear_cookies` (@janvarga, #41236, #41255) * `DebugOpts`::`disable_share_style_cache` is now `Preferences`::`layout_style_sharing_cache_enabled` (@atbrakhi, #40959) * The rest of `DebugOpts` has been moved to `DiagnosticsLogging`, and the options have been renamed (@atbrakhi, #40960) ## Perf and stability __ We can now **evict entries** from our **HTTP cache** (@Narfinger, @gterzian, @Taym95, #40613), rather than having it grow forever (or get cleared by an embedder). **about:memory** now tracks **SVG-related memory usage** (@d-kraus, #41481), and we’ve fixed memory leaks in <video> and <audio> (@tharkum, #41131). Servo now does less work when **matching selectors** (@webbeef, #41368), when **focus changes** (@mrobinson, @Loirooriol, #40984), and when **reflowing boxes** whose size did not change (@Loirooriol, @mrobinson, #41160). To allow for smaller binaries, **gamepad support** is now **optional at build time** (@WaterWhisperer, #41451). We’ve fixed some **undefined behaviour** around garbage collection (@sagudev, @jdm, @gmorenz, #41546, mozjs#688, mozjs#689, mozjs#692). To better avoid other garbage-collection-related bugs (@sagudev, mozjs#647, mozjs#638), we’ve continued our work on defining (and migrating to) safer interfaces between Servo and the SpiderMonkey GC (@sagudev, #41519, #41536, #41537, #41520, #41564). We’ve fixed a crash that occurs when **< link rel=“shortcut icon”>** has an **empty ‘href’ attribute** , which affected chiptune.com (@webbeef, #41056), and we’ve also fixed crashes in: * ‘background-repeat’ (@mrobinson, #41158) * <audio> layout (@Loirooriol, #41262) * custom elements (@mrobinson, #40743) * AudioBuffer (@WaterWhisperer, #41253) * AudioNode (@Taym95, #40954) * ReportingObserver (@Taym95, #41261) * Uint8Array (@jdm, #41228) * the fonts system, on FreeType platforms (@simonwuelker, #40945) * IME usage, on OpenHarmony (@jschwe, #41570) ## Donations __ Thanks again for your generous support! We are now receiving **7110 USD/month** (+10.5% over November) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers**, one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo. Servo is also on thanks.dev, and already **30 GitHub users** (+2 over November) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. We now have **sponsorship tiers** that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. A big thanks from Servo to our newest Bronze Sponsors: **Anthropy** , **Niclas Overby** , and **RxDB**! If you’re interested in this kind of sponsorship, please contact us at join@servo.org. **7110** USD/month **10000** Use of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page. ## Conference talks and blogs __ We’ve recently published one talk and one blog post: * **Web engine CI on a shoestring budget** (slides; transcript) – Delan Azabani (@delan) spoke about the CI system that keeps our builds and tryjobs moving fast, running nearly two million tests in under half an hour. * **Servo 2025 Stats** – Manuel Rego (@mrego) wrote about the growth of the Servo project, and how our many new contributors have enabled that. We also have two **upcoming** talks at **FOSDEM 2026** in **Brussels** later this month: * **The Servo project and its impact on the web platform ecosystem** – Manuel Rego (@mrego) is speaking on **Saturday 31 January** at **14:00 local time** (13:00 UTC), about Servo’s impact on spec issues, interop bugs, test cases, and the broader web platform ecosystem. * **Implementing Streams Spec in Servo web engine** – Taym Haddadi (@Taym95) is speaking on **Saturday 31 January** at **17:45 local time** (16:45 UTC), about our experiences writing a new implementation of the Streams API that is independent of the one in SpiderMonkey. Servo developers Martin Robinson (@mrobinson) and Delan Azabani (@delan) will also be attending FOSDEM 2026, so it would be a great time to come along and chat about Servo!
servo.org
January 23, 2026 at 5:58 PM
November in Servo: monthly releases, context menus, parallel CSS parsing, and more!
Landing in **Servo 0.0.3** and our November nightly builds, we now have **context menus** for links, images, and other web content (@atbrakhi, @mrobinson, #40434, #40501), **vsync on Android** (@mrobinson, #40306), **light mode** for the **new tab page** (@arihant2math, #40272), plus several web platform features: * **< video controls>** (@rayguo17, #40578) * **< use>** in SVG (@WaterWhisperer, #40684) * ☢️ **‘font-optical-sizing’** (@simonwuelker, #40829, #40861, #40884) * **‘brotli’** in **CompressionStream** and **DecompressionStream** (@Taym95, #40842) * **‘display-p3-linear’** in CSS **color()** and **color-mix()** (@Loirooriol, #40525) * **calc()** now works in **grid layout** (@nicoburns, #34846) * **ResizeObserver** is now enabled by default (@jdm, #40378) **Font variations** are now applied in **‘font-weight’** and **‘font-stretch’** (@simonwuelker, #40867), fixing a rendering issue in the Web Engines Hackfest website. @kkoyung has landed some huge improvements in the **SubtleCrypto API**, including some of the more modern algorithms in this WICG draft, and a fix for constant-time base64 (@kkoyung, #40334). We now have full support for **SHA3-256** , **SHA3-384** , **SHA3-512** (@kkoyung, #40765), **cSHAKE128** , **cSHAKE256** (@kkoyung, #40832), **Argon2d** , **Argon2i** , **Argon2id** , **ChaCha20-Poly1305** , **ECDH** , **ECDSA** , and **X25519** : Algorithm | deriveBits | exportKey | generateKey | importKey | sign | verify ---|---|---|---|---|---|--- Argon2d | #40936 | n/a | n/a | #40932 | n/a | n/a Argon2i | #40936 | n/a | n/a | #40932 | n/a | n/a Argon2id | #40936 | n/a | n/a | #40932 | n/a | n/a ChaCha20-Poly1305 | n/a | #40948 | n/a | #40948 | n/a | n/a ECDH | #40333 | #40298 | #40305 | #40253 | n/a | n/a ECDSA | n/a | #40536 | #40553 | #40523 | #40591 | #40557 X25519 | #40497 | #40421 | #40480 | #40398 | n/a | n/a **< details>** now fires **‘toggle’** events (@lukewarlow, #40271), and **< details name>** is now exclusive, like radio buttons (@simonwuelker, #40314). **InputEvent** , which represents **‘input’** and **‘beforeinput’** events, now has **composed** , **data** , **isComposing** , and **inputType** properties (@excitablesnowball, #39989). ## Embedding API __ **Each webview** can now now have its **own rendering context** (@mrobinson, @mukilan, #40794, #40738, #40721, #40594, #40923). This effectively enables full support for **multiple windows** , and we’ve started incorporating that into servoshell (@mrobinson, @mukilan, #40883). Our previously unused **context menu API** has been replaced with a new, more effective API that includes actions for links, images, and other web content (@mrobinson, @atbrakhi, #40402, #40501, #40607). For more details, see the docs for **ContextMenu** , EmbedderControl::ContextMenu, and WebViewDelegate::show_embedder_control(). **WebView** now has **can_go_back()** and **can_go_forward()** methods, and servoshell now uses those to disable the back and forward buttons (@mrobinson, #40598). Having introduced our new **RefreshDriver** API in October, we’ve now **removedServo::animating()** (@mrobinson, #40799) and **ServoDelegate::notify_animating_changed()** (@mrobinson, #40886), and similarly cleaned up the obsolete and inefficient “animating” state in servoshell (@mrobinson, #40715). We’ve moved virtually all of the useful items in the Servo API to the root of the `servo` library crate (@mrobinson, #40951). This is a **breaking change** , but we expect that it will greatly simplify embedding Servo, and it means you can even write `use servo::*;` in a pinch. When running Servo without a custom **ClipboardDelegate**, we normally use the system clipboard by default. But if there’s no system clipboard, we now have a built-in **fallback clipboard** (@mrobinson, #40408), rather than having no clipboard at all. Note that the fallback clipboard is very limited, as it can only store text and does not work across processes. ## Performance and stability __ Servo now **parses CSS in parallel** with script and layout (@mrobinson, @vimpunk, #40639, #40556), and can now measure **Largest Contentful Paint** in PerformanceObserver as well as in our internal profiling tools (@shubhamg13, @boluochoufeng, #39714, #39384). **Just-in-time compilation** (JIT) is now **optional** (@jschwe, #37972), which can be useful in situations where generating native code is forbidden by policy or unwanted for other reasons. We’ve improved the performance of incremental layout (@Loirooriol, @mrobinson, #40795, #40797), touch input (@kongbai1996, #40637), animated GIF rendering (@mrobinson, #40158), the prefs subsystem (@webbeef, #40775), and parseFromString() on DOMParser (@webbeef, #40742). We also use fewer IPC resources when internal profiling features are disabled (@lumiscosity, #40823). We’ve fixed a bug causing **nytimes.com** to hang (@jdm, #40811), as well as fixing crashes in **Speedometer 3.0** and **3.1** (@Narfinger, #40459), grid layout (@nicoburns, #40821), the fonts subsystem (@simonwuelker, #40913), XPath (@simonwuelker, #40411), ReadableStream (@Taym95, #40911), AudioContext (@Taym95, #40729), and when exiting Servo (@mrobinson, #40933). ## Donations __ Thanks again for your generous support! We are now receiving **6433 USD/month** (+11.8% over October) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers**, one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo. Servo is also on thanks.dev, and already **28 GitHub users** (same as October) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. We now have **sponsorship tiers** that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. A big thanks from Servo to our newest Bronze Sponsors: **Jenny & Phil Porada**, **Josh Aas** , **LambdaTest** , and **Sandwich**! If you’re interested in this kind of sponsorship, please contact us at join@servo.org. **6433** USD/month **10000** Use of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page.
servo.org
December 16, 2025 at 11:30 PM
November in Servo: monthly releases, context menus, parallel CSS parsing, and more!
Landing in **Servo 0.0.3** and our November nightly builds, we now have **context menus** for links, images, and other web content (@atbrakhi, @mrobinson, #40434, #40501), **vsync on Android** (@mrobinson, #40306), **light mode** for the **new tab page** (@arihant2math, #40272), plus several web platform features: * **< video controls>** (@rayguo17, #40578) * **< use>** in SVG (@WaterWhisperer, #40684) * ☢️ **‘font-optical-sizing’** (@simonwuelker, #40829, #40861, #40884) * **‘brotli’** in **CompressionStream** and **DecompressionStream** (@Taym95, #40842) * **‘display-p3-linear’** in CSS **color()** and **color-mix()** (@Loirooriol, #40525) * **calc()** now works in **grid layout** (@nicoburns, #34846) * **ResizeObserver** is now enabled by default (@jdm, #40378) **Font variations** are now applied in **‘font-weight’** and **‘font-stretch’** (@simonwuelker, #40867), fixing a rendering issue in the Web Engines Hackfest website. @kkoyung has landed some huge improvements in the **SubtleCrypto API**, including some of the more modern algorithms in this WICG draft, and a fix for constant-time base64 (@kkoyung, #40334). We now have full support for **SHA3-256** , **SHA3-384** , **SHA3-512** (@kkoyung, #40765), **cSHAKE128** , **cSHAKE256** (@kkoyung, #40832), **Argon2d** , **Argon2i** , **Argon2id** , **ChaCha20-Poly1305** , **ECDH** , **ECDSA** , and **X25519** : Algorithm | deriveBits | exportKey | generateKey | importKey | sign | verify ---|---|---|---|---|---|--- Argon2d | #40936 | n/a | n/a | #40932 | n/a | n/a Argon2i | #40936 | n/a | n/a | #40932 | n/a | n/a Argon2id | #40936 | n/a | n/a | #40932 | n/a | n/a ChaCha20-Poly1305 | n/a | #40948 | n/a | #40948 | n/a | n/a ECDH | #40333 | #40298 | #40305 | #40253 | n/a | n/a ECDSA | n/a | #40536 | #40553 | #40523 | #40591 | #40557 X25519 | #40497 | #40421 | #40480 | #40398 | n/a | n/a **< details>** now fires **‘toggle’** events (@lukewarlow, #40271), and **< details name>** is now exclusive, like radio buttons (@simonwuelker, #40314). **InputEvent** , which represents **‘input’** and **‘beforeinput’** events, now has **composed** , **data** , **isComposing** , and **inputType** properties (@excitablesnowball, #39989). ## Embedding API __ **Each webview** can now now have its **own rendering context** (@mrobinson, @mukilan, #40794, #40738, #40721, #40594, #40923). This effectively enables full support for **multiple windows** , and we’ve started incorporating that into servoshell (@mrobinson, @mukilan, #40883). Our previously unused **context menu API** has been replaced with a new, more effective API that includes actions for links, images, and other web content (@mrobinson, @atbrakhi, #40402, #40501, #40607). For more details, see the docs for **ContextMenu** , EmbedderControl::ContextMenu, and WebViewDelegate::show_embedder_control(). **WebView** now has **can_go_back()** and **can_go_forward()** methods, and servoshell now uses those to disable the back and forward buttons (@mrobinson, #40598). Having introduced our new **RefreshDriver** API in October, we’ve now **removedServo::animating()** (@mrobinson, #40799) and **ServoDelegate::notify_animating_changed()** (@mrobinson, #40886), and similarly cleaned up the obsolete and inefficient “animating” state in servoshell (@mrobinson, #40715). We’ve moved virtually all of the useful items in the Servo API to the root of the `servo` library crate (@mrobinson, #40951). This is a **breaking change** , but we expect that it will greatly simplify embedding Servo, and it means you can even write `use servo::*;` in a pinch. When running Servo without a custom **ClipboardDelegate**, we normally use the system clipboard by default. But if there’s no system clipboard, we now have a built-in **fallback clipboard** (@mrobinson, #40408), rather than having no clipboard at all. Note that the fallback clipboard is very limited, as it can only store text and does not work across processes. ## Performance and stability __ Servo now **parses CSS in parallel** with script and layout (@mrobinson, @vimpunk, #40639, #40556), and can now measure **Largest Contentful Paint** in PerformanceObserver as well as in our internal profiling tools (@shubhamg13, @boluochoufeng, #39714, #39384). **Just-in-time compilation** (JIT) is now **optional** (@jschwe, #37972), which can be useful in situations where generating native code is forbidden by policy or unwanted for other reasons. We’ve improved the performance of incremental layout (@Loirooriol, @mrobinson, #40795, #40797), touch input (@kongbai1996, #40637), animated GIF rendering (@mrobinson, #40158), the prefs subsystem (@webbeef, #40775), and parseFromString() on DOMParser (@webbeef, #40742). We also use fewer IPC resources when internal profiling features are disabled (@lumiscosity, #40823). We’ve fixed a bug causing **nytimes.com** to hang (@jdm, #40811), as well as fixing crashes in **Speedometer 3.0** and **3.1** (@Narfinger, #40459), grid layout (@nicoburns, #40821), the fonts subsystem (@simonwuelker, #40913), XPath (@simonwuelker, #40411), ReadableStream (@Taym95, #40911), AudioContext (@Taym95, #40729), and when exiting Servo (@mrobinson, #40933). ## Donations __ Thanks again for your generous support! We are now receiving **6433 USD/month** (+11.8% over October) in recurring donations. This helps us cover the cost of our **speedy CI and benchmarking servers**, one of our latest **Outreachy interns** , and funding **maintainer work** that helps more people contribute to Servo. Servo is also on thanks.dev, and already **28 GitHub users** (same as October) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. We now have **sponsorship tiers** that allow you or your organisation to donate to the Servo project with public acknowlegement of your support. A big thanks from Servo to our newest Bronze Sponsors: **Jenny & Phil Porada**, **Josh Aas** , **LambdaTest** , and **Sandwich**! If you’re interested in this kind of sponsorship, please contact us at join@servo.org. **6433** USD/month **10000** Use of donations is decided transparently via the Technical Steering Committee’s public **funding request process** , and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page.
servo.org
December 16, 2025 at 11:30 PM
This month in Servo: new elements, IME support, delegate API, and more!
Servo now supports more HTML and CSS features: * the **< details>** element (@simonwuelker, #35261) * the **< meter>** element (@simonwuelker, #35524) * the **< progress>** element (@simonwuelker, #35531) * the **‘quotes’** property (@xiaochengh, @Loirooriol, #34770, #35420) * the **‘isolation’** property (@kkoyung, @Loirooriol, #35552) * **‘overflow: clip’** (@longvatrong111, #35103) * **‘overflow’** property with two values (@yezhizhen, @mrobinson, #35414) * the **‘::slotted’** selector (@simonwuelker, #35352) Plus several new web API features: * **contextmenu** events (@pewsheen, #35364) * **WritableStream** (@gterzian, @jdm, #34844) * **ReadableStreamBYOBRequest** (@Taym95, #35074) * initial support for **FontFace** and its **load()** method (@mukilan, #35262) * **toBlob()** and **toDataURL()** on **WebGPU canvases** (@sagudev, #35237) * **bytes()** on **Request** , **Response** , and **Blob** (@shanehandley, @yoseio, @gterzian, @Taym95, #35250, #35151) * **href** , **origin** , **protocol** , **username** , **password** , **host** , **hostname** , **port** , **pathname** , **search** , and **hash** properties on **HTMLAreaElement** (@shanehandley, #35482) * **insertRule() with no argument** on **CSSGroupingRule** (@Loirooriol, #35295) **< slot> elements** are now fully supported including layout (@simonwuelker, #35220, #35519), and we’ve also landed support for the **‘::slotted’** selector (@simonwuelker, #35352). **Shadow roots** are now **supported in devtools** (@simonwuelker, #35294), and we’ve fixed some bugs related to shadow DOM trees (@simonwuelker, #35276, #35338), event handling (@simonwuelker, #35380), and custom elements (@maxtidev, @jdm, #35382). We’ve landed layout improvements around **‘border-collapse’** (@Loirooriol, #35219), **‘align-content: normal’** (@rayguo17, #35178), **‘place-self’** with **‘position: absolute’** (@Loirooriol, #35208), the **intrinsic sizing keywords** (@Loirooriol, #35413, #35469, #35471, #35630, #35642, #35663, #35652, #35688), and **‘position: absolute’** now works correctly in a **‘position: relative’ grid item** (@stevennovaryo, #35014). Input has also been improved, with **better IME support** (@dklassic, #35535, #35623) and several fixes to touch input (@kongbai1996, @jschwe, @shubhamg13, #35450, #35031, #35550, #35537, #35692). ## Servo-the-browser (servoshell) __ **Directory listings** are now enabled for local files (@mrobinson, #35317). servoshell’s **dialogs now use egui** (@chickenleaf, #34823, #35399, #35464, #35507, #35564, #35577, #35657, #35671), rather than shelling out to a program like `zenity` (@chickenleaf, #35674), making them more secure and no longer falling back to terminal input. We’ve also fixed a bug when closing a tab other than the current one (@pewsheen, #35569). ## Servo-the-engine (embedding) __ We’ve simplified our embedding API by **merging all input event delivery** into `WebView::notify_input_event` (@mrobinson, @mukilan, #35430), making **bluetooth optional** (@jdm, @webbeef, #35479, #35590), making the **“background hang monitor” optional** (@jdm, #35256), and **eliminating the need to depend on`webxr`** (@mrobinson, #35229). We’ve also moved some servoshell-only options out of `Opts` (@mrobinson, #35377, #35407), since they have no effect on Servo’s behaviour. We’ve landed our initial **delegate-based API** (@delan, @mrobinson, @mukilan, #35196, #35260, #35297, #35396, #35400, #35544, #35579, #35662, #35672), which replaces our old message-based API for integrating Servo with your app (@mrobinson, @delan, @mukilan, #35284, #35315, #35366). By implementing `WebViewDelegate` and `ServoDelegate` and installing them, you can have Servo call back into your app’s logic with ease. We’ve simplified the `RenderingContext` trait (@wusyong, @mrobinson, #35251, #35553) and **added three built-in`RenderingContext` impls** (@mrobinson, @mukilan, #35465, #35501), making it easier to set up a context Servo can render to: * `WindowRenderingContext` renders to a **whole window** * `OffscreenRenderingContext` renders to **part of a window** * `SoftwareRenderingContext` renders to an image, **without hardware acceleration** We’ve heavily reworked and documented our **webview rendering model** (@mrobinson, @wusyong, @mukilan, #35522, #35621), **moved image output** and **shutdown logic** out of the compositor (@mrobinson, @wusyong, #35538), and removed some complicated logic around synchronous repaints when a window is resized (@mrobinson, #35283, #35277). These changes should make it a lot clearer how to get Servo’s webviews onto your display. One part of this model that we’re starting to move away from is the support for multiple webviews in one rendering context (@mrobinson, @wusyong, #35536). First landed in #31417, this was an expedient way to add support for multiple webviews, but it imposed some serious limitations on how webviews could be interleaved with other app content, and the performance and security was inadequate. We’ve **updated ourwinit_minimal example** to take advantage of these changes (@webbeef, #35350, #35686), simplify it further (@robertohuertasm, #35253), and fix window resizing (@webbeef, #35691). ## Perf and stability __ The compositor now **notifies the embedder of new frames immediately** (@mrobinson, #35369), not via the constellation thread. Servo’s typical **memory usage has been reduced by over 1%** thanks to Node object optimisations (@webbeef, #35592, #35554), and we’ve also improved our memory profiler (@webbeef, #35618, #35607). We’ve fixed a bug causing very high CPU usage on sites like wikipedia.org (@webbeef, #35245), as well as bugs affecting requestAnimationFrame (@mukilan, #35387, #35435). You can now configure our tracing-based profiler (`--features tracing`) with `servo --tracing-filter` instead of `SERVO_TRACING` (@jschwe, #35370). We’ve continued **reducing our use of`unsafe` in script** (@nscaife, @stephenmuss, #35351, #35360, #35367, #35411), and **moving parts of`script` to `script_bindings`** (@jdm, #35279, #35280, #35292, #35457, #35459, #35578, #35620). Breaking up our massive `script` crate is absolutely critical for reducing Servo’s build times. We’ve fixed crashes that happen when moving windows past the edge of your monitor (@webbeef, #35235), when unpaired UTF-16 surrogates are sent to the DOM (@mrobinson, #35381), when focusing elements inside shadow roots (@simonwuelker, #35606), and when calling getAsString() on a DataTransferItem (@Gae24, #35699). We’ve also continued working on static analysis that will help catch crashes due to GC borrow hazards (@augustebaum, @yerke, @jdm, @Gae24, #35541, #35593, #35565, #35610, #35591, #35609, #35601, #35596, #35595, #35594, #35597, #35622, #35604, #35616, #35605, #35640, #35647, #35646). ## Donations __ Thanks again for your generous support! We are now receiving **4363 USD/month** (+13.7% over January) in recurring donations. This helps cover the cost of our self-hosted CI runners and Outreachy internships. Servo is also on thanks.dev, and already **21 GitHub users** (+5 over January) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. **4363** USD/month **10000** As always, use of these funds will be decided transparently in the Technical Steering Committee. For more details, head to our Sponsorship page.
servo.org
October 25, 2025 at 11:32 PM
This month in Servo: color inputs, SVG, embedder JS, and more!
Two big pieces of news for images in Servo this month: 1. We now **display animated GIFs** in all their animated glory (@rayguo17, #36286)! This work required careful architecting to integrate with existing animation mechanisms in the engine without incurring unnecessary CPU usage. 2. We support **loading SVG images** in **< img src>** (@mukilan, @mrobinson, #36721). ## Outreachy __ We’re excited to host two Outreachy interns over the next few months! **Jerens Lensun** (@jerensl) will be working on improving Servo’s CI setup and other Python-focused infrastructure, while **Usman Baba Yahaya** (@uthmaniv) will implement support for the Network Monitor in our devtools. They will both be blogging about their internships, and you can follow their work on Jeren’s blog and Usman’s blog. ## Web content __ Servo’s layout implementation has historically been all-or-nothing — any change in the page, no matter how isolated, requires laying out the entire page from scratch. Fixing this limitation is known as **incremental layout** , and it’s a key performance optimization in all browser engines. This month we’ve landed a number of changes in this area that make some kinds of CSS changes much more efficient than a full layout (@mrobinson, @Loirooriol, #36896, #36978, #37004, #37047, #37069, #37048, #37088, #37099). We have also made significant progress on the **Trusted Types API** , going from 47% of tests passing to 58% over the course of May (@TimvdLippe, #36710, #36668, #36811, #36824, #36941, #36960). Supporting this work on Trusted Types, our **Content Security Policy** implementation has been steadily improving, now passing 59% of automated tests (@TimvdLippe, @jdm, @simonwuelker, #36709, #36710, #36776, #36832, #36860, #36887, #36923, #36963, #36962, #36961, #36965, #37020). We’ve enabled support for **URLPattern** (@simonwuelker, #36826, #37004, #37116), **< input type=color>** (@simonwuelker, #36992), plus several other web API features: * **TransformStream** (@Taym95, @gterzian, #36739, #36905) * **setHTMLUnsafe()** method on **ShadowRoot** (@TG199, #36240) * **scrollingElement** property on **Document** (@JimmyDdotEXE, #35994) * **pipeThrough()** method on **ReadableStream** (@Taym95, #36977) * **readText()** method on **navigator.clipboard** (@Gae24, #36689) * **type** property on **Stylesheet** (@simonwuelker, #37126) Our layout and CSS support continues to improve. This month, we improved our page background sizing and style computation (@mrobinson, @Loirooriol, #36917, #37147), and added support for **‘wavy’** and **‘double’** in the **‘text-decoration-line’** property (@mrobinson, #37079). **HTMLVideoElement** can now be **used as an image source** for 2D canvas APIs (@tharkum, #37135), **ImageBitmap** can be serialized and transferred via postMessage() (@tharkum, #37101), **media elements** redraw properly whenever their size changes (@tharkum, #37056), **polygon image map areas** are clickable (@arihant2math, #37064), **< select> elements** are redrawn when their contents change (@simonwuelker, #36958), and **getPreferredCanvasFormat() on GPU** returns platform-appropriate values (@arihant2math, #37073). We’ve fixed bugs relating to invertible and non-invertible transforms (@Loirooriol, #36749, #37147), missing underlines on macOS (@mrobinson, #37029), and sizing issues for tables and flex containers (@stevennovaryo, @Loirooriol, #36703, #36993, #36980, #37024, #37011). We’ve also fixed a number of bugs where Servo’s behaviour did not match relevant specifications: * `input` events are now fired following `keydown` events (@yezhizhen, #37078) * unscopable objects are now writable and readable, and don’t have a prototype (@simonwuelker, #37119, #37122) * `Request` headers reject more erroneous headers (@sebsebmc, #36943) * External stylesheets in documents with quirks mode are more lenient about the stylesheet’s `Content-Type` (@ghostd, @mrobinson, #28321) * the `ImageData` constructor throws better errors for unsupported arguments (@Taym95, #31398) * Attribute nodes are serialized as the empty string (@simonwuelker, #36875) * custom element `is` values are serialized as attributes (@simonwuelker, #36888) * `EventSource` ignores invalid field values and treats non-200 responses codes as failures (@KiChjang, #36853, #36854) * the `premultipliedAlpha` flag for WebGL canvases premultiplies correctly (@tharkum, #36895) Our WebDriver server implementation received a lot of attention this month! Element clicks now receive the expected button value (@longvatrong111, #36871), wheel actions are supported (@PotatoCP, #36744, #36985), and we removed the possibility of races between some input actions and other WebDriver commands (@longvatrong111, @mrobinson, #36932). We’ve also added support for passing WebDriver references to DOM objects as arguments when executing scripts (@jdm, #36673), and fixed some bugs with JS value serialization (@yezhizhen, #36908) and cancelling inputs (@yezhizhen, #37010). We’ve begun preparatory work to **integrateVello** as the backend for 2D canvases (@sagudev, #36783, #36790, #36999). We’ve also landed some changes towards supporting **‘::placeholder’** pseudo-elements and fixing rendering issues with text inputs (@stevennovaryo, #37065). ## Embedding __ ### The engine __ Embedders can now **evaluate JavaScript inside a webview** and receive results asynchronously (@Narfinger, @mrobinson, #35720). All embedders will receive default styling and interactivity for elements like inputs and media elements (@webbeef, #36803), reducing the amount of configuration required to embed the engine. Any provided system light/dark theme will be propagated to all documents loaded inside of a webview (@mrobinson, #37132). Servo’s developer tools integration now **highlights elements** in the layout inspector (@simonwuelker, #35822), and displays <!DOCTYPE> nodes correctly (@simonwuelker, #36787). We have **removed the`dom_shadowdom_enabled` preference**, since the feature has been enabled by default since March 2025 (@simonwuelker, #37043). Our automated benchmarking setup is expanding, and we can now measure how long it takes to start up Servo and load the servo.org homepage on HarmonyOS (@Narfinger, #36878), which will help us identify regressions in the future. Finally, we can now write unit tests for Servo’s embedding API (@mrobinson, #36791), which allows us to write better regression tests for shutdown-related issues (@mrobinson, #36808). ### servoshell __ The `--user-agent` (`-u`) flag now correctly sets the User-Agent header for network requests (@PartiallyUntyped, @mrobinson, #36859). Service workers have been removed from the list of features enabled by `--enable-experimental-web-platform-features` until they provide more value (@jdm, #36867). Building servoshell with `--with-asan` now causes all C++ dependencies to be built with Address Sanitizer as well, and `mach bootstrap` on Windows can now use `winget` as a fallback if `choco` is unavailable (@jschwe, #32836). The current system light/dark theme is now queried on startup (@Legend-Master, #37128). Additionally, the screen dimensions and geometry reported by the engine are now correct on OpenHarmony (@PartiallyUntyped, @jschwe, #36915). ## Performance __ Servo is now better at **evicting image data from GPU caches** (@webbeef, #36956). We also reduced the memory needed to store **HSTS data**, saving **more than 60mb** by doing so (@sebsebmc, #37000, #37015). We now measure the memory usage of **sessionStorage** and **localStorage** data (@jdm, #37053), the **Public Suffix List** (@sebsebmc, #37049), and **system fonts** (@jdm, #36834). In addition, we’ve **reduced the size of the final Servo binary** by 2 MB by stripping out DOM code that should never be used outside of automated tests (@jdm, #37034). ## Stability __ We fixed a number of crashes involving **animated images** (@simonwuelker, #37058), **media elements** with an unknown duration (@tharkum, servo-media#437), **canvas elements** during shutdown (@mrobinson, #37182), adding a **Path2D** to itself (@Taym95, #36847), calculating **IntersectionObserver** areas (@webbeef, #36955), the **childNodes() method on Node** (@jdm, #36889), resizing **OffscreenCanvas** (@simonwuelker, #36855), querying **WebGL extensions** (@mrobinson, #36911), and slicing a sliced **Blob** (@simonwuelker, #36866). We’ve also fixed a deadlock involving streams with very large chunks (@wusyong, #36914), and fixed a source of intermittent crashes when closing tabs or removing iframes (@jdm, #37120). Finally, we rewrote the implementation of the **text property on HTMLOptionElement** to avoid crashes with deeply-nested elements (@kkoyung, #37167). Having previously noticed an unsafe pattern triggered by using JS-owned values in Rust Drop implementations (#26488), we have begun incrementally removing existing Drop impls to remove that source of unsafety (@willypuzzle, #37136). ## Upgrades __ We upgraded our fork of **WebRender** to **April 2025** (@mrobinson, #36770), and upgraded our **Stylo** dependency to **May 2025** (@Loirooriol, #36835). These changes ensure that Servo is up to date with ongoing work in Firefox, which shares these dependencies. ## Donations __ Thanks again for your generous support! We are now receiving **4597 USD/month** (−1.4% over April) in recurring donations. This helps cover the cost of our self-hosted CI runners and one of our latest Outreachy interns! Servo is also on thanks.dev, and already **25 GitHub users** (+1 over April) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. **4597** USD/month **10000** As always, use of these funds will be decided transparently in the Technical Steering Committee. For more details, head to our Sponsorship page.
servo.org
October 25, 2025 at 11:31 PM
This month in Servo: new elements, IME support, delegate API, and more!
Servo now supports more HTML and CSS features: * the **< details>** element (@simonwuelker, #35261) * the **< meter>** element (@simonwuelker, #35524) * the **< progress>** element (@simonwuelker, #35531) * the **‘quotes’** property (@xiaochengh, @Loirooriol, #34770, #35420) * the **‘isolation’** property (@kkoyung, @Loirooriol, #35552) * **‘overflow: clip’** (@longvatrong111, #35103) * **‘overflow’** property with two values (@yezhizhen, @mrobinson, #35414) * the **‘::slotted’** selector (@simonwuelker, #35352) Plus several new web API features: * **contextmenu** events (@pewsheen, #35364) * **WritableStream** (@gterzian, @jdm, #34844) * **ReadableStreamBYOBRequest** (@Taym95, #35074) * initial support for **FontFace** and its **load()** method (@mukilan, #35262) * **toBlob()** and **toDataURL()** on **WebGPU canvases** (@sagudev, #35237) * **bytes()** on **Request** , **Response** , and **Blob** (@shanehandley, @yoseio, @gterzian, @Taym95, #35250, #35151) * **href** , **origin** , **protocol** , **username** , **password** , **host** , **hostname** , **port** , **pathname** , **search** , and **hash** properties on **HTMLAreaElement** (@shanehandley, #35482) * **insertRule() with no argument** on **CSSGroupingRule** (@Loirooriol, #35295) **< slot> elements** are now fully supported including layout (@simonwuelker, #35220, #35519), and we’ve also landed support for the **‘::slotted’** selector (@simonwuelker, #35352). **Shadow roots** are now **supported in devtools** (@simonwuelker, #35294), and we’ve fixed some bugs related to shadow DOM trees (@simonwuelker, #35276, #35338), event handling (@simonwuelker, #35380), and custom elements (@maxtidev, @jdm, #35382). We’ve landed layout improvements around **‘border-collapse’** (@Loirooriol, #35219), **‘align-content: normal’** (@rayguo17, #35178), **‘place-self’** with **‘position: absolute’** (@Loirooriol, #35208), the **intrinsic sizing keywords** (@Loirooriol, #35413, #35469, #35471, #35630, #35642, #35663, #35652, #35688), and **‘position: absolute’** now works correctly in a **‘position: relative’ grid item** (@stevennovaryo, #35014). Input has also been improved, with **better IME support** (@dklassic, #35535, #35623) and several fixes to touch input (@kongbai1996, @jschwe, @shubhamg13, #35450, #35031, #35550, #35537, #35692). ## Servo-the-browser (servoshell) __ **Directory listings** are now enabled for local files (@mrobinson, #35317). servoshell’s **dialogs now use egui** (@chickenleaf, #34823, #35399, #35464, #35507, #35564, #35577, #35657, #35671), rather than shelling out to a program like `zenity` (@chickenleaf, #35674), making them more secure and no longer falling back to terminal input. We’ve also fixed a bug when closing a tab other than the current one (@pewsheen, #35569). ## Servo-the-engine (embedding) __ We’ve simplified our embedding API by **merging all input event delivery** into `WebView::notify_input_event` (@mrobinson, @mukilan, #35430), making **bluetooth optional** (@jdm, @webbeef, #35479, #35590), making the **“background hang monitor” optional** (@jdm, #35256), and **eliminating the need to depend on`webxr`** (@mrobinson, #35229). We’ve also moved some servoshell-only options out of `Opts` (@mrobinson, #35377, #35407), since they have no effect on Servo’s behaviour. We’ve landed our initial **delegate-based API** (@delan, @mrobinson, @mukilan, #35196, #35260, #35297, #35396, #35400, #35544, #35579, #35662, #35672), which replaces our old message-based API for integrating Servo with your app (@mrobinson, @delan, @mukilan, #35284, #35315, #35366). By implementing `WebViewDelegate` and `ServoDelegate` and installing them, you can have Servo call back into your app’s logic with ease. We’ve simplified the `RenderingContext` trait (@wusyong, @mrobinson, #35251, #35553) and **added three built-in`RenderingContext` impls** (@mrobinson, @mukilan, #35465, #35501), making it easier to set up a context Servo can render to: * `WindowRenderingContext` renders to a **whole window** * `OffscreenRenderingContext` renders to **part of a window** * `SoftwareRenderingContext` renders to an image, **without hardware acceleration** We’ve heavily reworked and documented our **webview rendering model** (@mrobinson, @wusyong, @mukilan, #35522, #35621), **moved image output** and **shutdown logic** out of the compositor (@mrobinson, @wusyong, #35538), and removed some complicated logic around synchronous repaints when a window is resized (@mrobinson, #35283, #35277). These changes should make it a lot clearer how to get Servo’s webviews onto your display. One part of this model that we’re starting to move away from is the support for multiple webviews in one rendering context (@mrobinson, @wusyong, #35536). First landed in #31417, this was an expedient way to add support for multiple webviews, but it imposed some serious limitations on how webviews could be interleaved with other app content, and the performance and security was inadequate. We’ve **updated ourwinit_minimal example** to take advantage of these changes (@webbeef, #35350, #35686), simplify it further (@robertohuertasm, #35253), and fix window resizing (@webbeef, #35691). ## Perf and stability __ The compositor now **notifies the embedder of new frames immediately** (@mrobinson, #35369), not via the constellation thread. Servo’s typical **memory usage has been reduced by over 1%** thanks to Node object optimisations (@webbeef, #35592, #35554), and we’ve also improved our memory profiler (@webbeef, #35618, #35607). We’ve fixed a bug causing very high CPU usage on sites like wikipedia.org (@webbeef, #35245), as well as bugs affecting requestAnimationFrame (@mukilan, #35387, #35435). You can now configure our tracing-based profiler (`--features tracing`) with `servo --tracing-filter` instead of `SERVO_TRACING` (@jschwe, #35370). We’ve continued **reducing our use of`unsafe` in script** (@nscaife, @stephenmuss, #35351, #35360, #35367, #35411), and **moving parts of`script` to `script_bindings`** (@jdm, #35279, #35280, #35292, #35457, #35459, #35578, #35620). Breaking up our massive `script` crate is absolutely critical for reducing Servo’s build times. We’ve fixed crashes that happen when moving windows past the edge of your monitor (@webbeef, #35235), when unpaired UTF-16 surrogates are sent to the DOM (@mrobinson, #35381), when focusing elements inside shadow roots (@simonwuelker, #35606), and when calling getAsString() on a DataTransferItem (@Gae24, #35699). We’ve also continued working on static analysis that will help catch crashes due to GC borrow hazards (@augustebaum, @yerke, @jdm, @Gae24, #35541, #35593, #35565, #35610, #35591, #35609, #35601, #35596, #35595, #35594, #35597, #35622, #35604, #35616, #35605, #35640, #35647, #35646). ## Donations __ Thanks again for your generous support! We are now receiving **4363 USD/month** (+13.7% over January) in recurring donations. This helps cover the cost of our self-hosted CI runners and Outreachy internships. Servo is also on thanks.dev, and already **21 GitHub users** (+5 over January) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. **4363** USD/month **10000** As always, use of these funds will be decided transparently in the Technical Steering Committee. For more details, head to our Sponsorship page.
servo.org
October 24, 2025 at 9:30 PM
This month in Servo: color inputs, SVG, embedder JS, and more!
Two big pieces of news for images in Servo this month: 1. We now **display animated GIFs** in all their animated glory (@rayguo17, #36286)! This work required careful architecting to integrate with existing animation mechanisms in the engine without incurring unnecessary CPU usage. 2. We support **loading SVG images** in **< img src>** (@mukilan, @mrobinson, #36721). ## Outreachy __ We’re excited to host two Outreachy interns over the next few months! **Jerens Lensun** (@jerensl) will be working on improving Servo’s CI setup and other Python-focused infrastructure, while **Usman Baba Yahaya** (@uthmaniv) will implement support for the Network Monitor in our devtools. They will both be blogging about their internships, and you can follow their work on Jeren’s blog and Usman’s blog. ## Web content __ Servo’s layout implementation has historically been all-or-nothing — any change in the page, no matter how isolated, requires laying out the entire page from scratch. Fixing this limitation is known as **incremental layout** , and it’s a key performance optimization in all browser engines. This month we’ve landed a number of changes in this area that make some kinds of CSS changes much more efficient than a full layout (@mrobinson, @Loirooriol, #36896, #36978, #37004, #37047, #37069, #37048, #37088, #37099). We have also made significant progress on the **Trusted Types API** , going from 47% of tests passing to 58% over the course of May (@TimvdLippe, #36710, #36668, #36811, #36824, #36941, #36960). Supporting this work on Trusted Types, our **Content Security Policy** implementation has been steadily improving, now passing 59% of automated tests (@TimvdLippe, @jdm, @simonwuelker, #36709, #36710, #36776, #36832, #36860, #36887, #36923, #36963, #36962, #36961, #36965, #37020). We’ve enabled support for **URLPattern** (@simonwuelker, #36826, #37004, #37116), **< input type=color>** (@simonwuelker, #36992), plus several other web API features: * **TransformStream** (@Taym95, @gterzian, #36739, #36905) * **setHTMLUnsafe()** method on **ShadowRoot** (@TG199, #36240) * **scrollingElement** property on **Document** (@JimmyDdotEXE, #35994) * **pipeThrough()** method on **ReadableStream** (@Taym95, #36977) * **readText()** method on **navigator.clipboard** (@Gae24, #36689) * **type** property on **Stylesheet** (@simonwuelker, #37126) Our layout and CSS support continues to improve. This month, we improved our page background sizing and style computation (@mrobinson, @Loirooriol, #36917, #37147), and added support for **‘wavy’** and **‘double’** in the **‘text-decoration-line’** property (@mrobinson, #37079). **HTMLVideoElement** can now be **used as an image source** for 2D canvas APIs (@tharkum, #37135), **ImageBitmap** can be serialized and transferred via postMessage() (@tharkum, #37101), **media elements** redraw properly whenever their size changes (@tharkum, #37056), **polygon image map areas** are clickable (@arihant2math, #37064), **< select> elements** are redrawn when their contents change (@simonwuelker, #36958), and **getPreferredCanvasFormat() on GPU** returns platform-appropriate values (@arihant2math, #37073). We’ve fixed bugs relating to invertible and non-invertible transforms (@Loirooriol, #36749, #37147), missing underlines on macOS (@mrobinson, #37029), and sizing issues for tables and flex containers (@stevennovaryo, @Loirooriol, #36703, #36993, #36980, #37024, #37011). We’ve also fixed a number of bugs where Servo’s behaviour did not match relevant specifications: * `input` events are now fired following `keydown` events (@yezhizhen, #37078) * unscopable objects are now writable and readable, and don’t have a prototype (@simonwuelker, #37119, #37122) * `Request` headers reject more erroneous headers (@sebsebmc, #36943) * External stylesheets in documents with quirks mode are more lenient about the stylesheet’s `Content-Type` (@ghostd, @mrobinson, #28321) * the `ImageData` constructor throws better errors for unsupported arguments (@Taym95, #31398) * Attribute nodes are serialized as the empty string (@simonwuelker, #36875) * custom element `is` values are serialized as attributes (@simonwuelker, #36888) * `EventSource` ignores invalid field values and treats non-200 responses codes as failures (@KiChjang, #36853, #36854) * the `premultipliedAlpha` flag for WebGL canvases premultiplies correctly (@tharkum, #36895) Our WebDriver server implementation received a lot of attention this month! Element clicks now receive the expected button value (@longvatrong111, #36871), wheel actions are supported (@PotatoCP, #36744, #36985), and we removed the possibility of races between some input actions and other WebDriver commands (@longvatrong111, @mrobinson, #36932). We’ve also added support for passing WebDriver references to DOM objects as arguments when executing scripts (@jdm, #36673), and fixed some bugs with JS value serialization (@yezhizhen, #36908) and cancelling inputs (@yezhizhen, #37010). We’ve begun preparatory work to **integrateVello** as the backend for 2D canvases (@sagudev, #36783, #36790, #36999). We’ve also landed some changes towards supporting **‘::placeholder’** pseudo-elements and fixing rendering issues with text inputs (@stevennovaryo, #37065). ## Embedding __ ### The engine __ Embedders can now **evaluate JavaScript inside a webview** and receive results asynchronously (@Narfinger, @mrobinson, #35720). All embedders will receive default styling and interactivity for elements like inputs and media elements (@webbeef, #36803), reducing the amount of configuration required to embed the engine. Any provided system light/dark theme will be propagated to all documents loaded inside of a webview (@mrobinson, #37132). Servo’s developer tools integration now **highlights elements** in the layout inspector (@simonwuelker, #35822), and displays <!DOCTYPE> nodes correctly (@simonwuelker, #36787). We have **removed the`dom_shadowdom_enabled` preference**, since the feature has been enabled by default since March 2025 (@simonwuelker, #37043). Our automated benchmarking setup is expanding, and we can now measure how long it takes to start up Servo and load the servo.org homepage on HarmonyOS (@Narfinger, #36878), which will help us identify regressions in the future. Finally, we can now write unit tests for Servo’s embedding API (@mrobinson, #36791), which allows us to write better regression tests for shutdown-related issues (@mrobinson, #36808). ### servoshell __ The `--user-agent` (`-u`) flag now correctly sets the User-Agent header for network requests (@PartiallyUntyped, @mrobinson, #36859). Service workers have been removed from the list of features enabled by `--enable-experimental-web-platform-features` until they provide more value (@jdm, #36867). Building servoshell with `--with-asan` now causes all C++ dependencies to be built with Address Sanitizer as well, and `mach bootstrap` on Windows can now use `winget` as a fallback if `choco` is unavailable (@jschwe, #32836). The current system light/dark theme is now queried on startup (@Legend-Master, #37128). Additionally, the screen dimensions and geometry reported by the engine are now correct on OpenHarmony (@PartiallyUntyped, @jschwe, #36915). ## Performance __ Servo is now better at **evicting image data from GPU caches** (@webbeef, #36956). We also reduced the memory needed to store **HSTS data**, saving **more than 60mb** by doing so (@sebsebmc, #37000, #37015). We now measure the memory usage of **sessionStorage** and **localStorage** data (@jdm, #37053), the **Public Suffix List** (@sebsebmc, #37049), and **system fonts** (@jdm, #36834). In addition, we’ve **reduced the size of the final Servo binary** by 2 MB by stripping out DOM code that should never be used outside of automated tests (@jdm, #37034). ## Stability __ We fixed a number of crashes involving **animated images** (@simonwuelker, #37058), **media elements** with an unknown duration (@tharkum, servo-media#437), **canvas elements** during shutdown (@mrobinson, #37182), adding a **Path2D** to itself (@Taym95, #36847), calculating **IntersectionObserver** areas (@webbeef, #36955), the **childNodes() method on Node** (@jdm, #36889), resizing **OffscreenCanvas** (@simonwuelker, #36855), querying **WebGL extensions** (@mrobinson, #36911), and slicing a sliced **Blob** (@simonwuelker, #36866). We’ve also fixed a deadlock involving streams with very large chunks (@wusyong, #36914), and fixed a source of intermittent crashes when closing tabs or removing iframes (@jdm, #37120). Finally, we rewrote the implementation of the **text property on HTMLOptionElement** to avoid crashes with deeply-nested elements (@kkoyung, #37167). Having previously noticed an unsafe pattern triggered by using JS-owned values in Rust Drop implementations (#26488), we have begun incrementally removing existing Drop impls to remove that source of unsafety (@willypuzzle, #37136). ## Upgrades __ We upgraded our fork of **WebRender** to **April 2025** (@mrobinson, #36770), and upgraded our **Stylo** dependency to **May 2025** (@Loirooriol, #36835). These changes ensure that Servo is up to date with ongoing work in Firefox, which shares these dependencies. ## Donations __ Thanks again for your generous support! We are now receiving **4597 USD/month** (−1.4% over April) in recurring donations. This helps cover the cost of our self-hosted CI runners and one of our latest Outreachy interns! Servo is also on thanks.dev, and already **25 GitHub users** (+1 over April) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. **4597** USD/month **10000** As always, use of these funds will be decided transparently in the Technical Steering Committee. For more details, head to our Sponsorship page.
servo.org
October 24, 2025 at 9:30 PM
This month in Servo: color inputs, SVG, embedder JS, and more!
Two big pieces of news for images in Servo this month: 1. We now **display animated GIFs** in all their animated glory (@rayguo17, #36286)! This work required careful architecting to integrate with existing animation mechanisms in the engine without incurring unnecessary CPU usage. 2. We support **loading SVG images** in **< img src>** (@mukilan, @mrobinson, #36721). ## Outreachy __ We’re excited to host two Outreachy interns over the next few months! **Jerens Lensun** (@jerensl) will be working on improving Servo’s CI setup and other Python-focused infrastructure, while **Usman Baba Yahaya** (@uthmaniv) will implement support for the Network Monitor in our devtools. They will both be blogging about their internships, and you can follow their work on Jeren’s blog and Usman’s blog. ## Web content __ Servo’s layout implementation has historically been all-or-nothing — any change in the page, no matter how isolated, requires laying out the entire page from scratch. Fixing this limitation is known as **incremental layout** , and it’s a key performance optimization in all browser engines. This month we’ve landed a number of changes in this area that make some kinds of CSS changes much more efficient than a full layout (@mrobinson, @Loirooriol, #36896, #36978, #37004, #37047, #37069, #37048, #37088, #37099). We have also made significant progress on the **Trusted Types API** , going from 47% of tests passing to 58% over the course of May (@TimvdLippe, #36710, #36668, #36811, #36824, #36941, #36960). Supporting this work on Trusted Types, our **Content Security Policy** implementation has been steadily improving, now passing 59% of automated tests (@TimvdLippe, @jdm, @simonwuelker, #36709, #36710, #36776, #36832, #36860, #36887, #36923, #36963, #36962, #36961, #36965, #37020). We’ve enabled support for **URLPattern** (@simonwuelker, #36826, #37004, #37116), **< input type=color>** (@simonwuelker, #36992), plus several other web API features: * **TransformStream** (@Taym95, @gterzian, #36739, #36905) * **setHTMLUnsafe()** method on **ShadowRoot** (@TG199, #36240) * **scrollingElement** property on **Document** (@JimmyDdotEXE, #35994) * **pipeThrough()** method on **ReadableStream** (@Taym95, #36977) * **readText()** method on **navigator.clipboard** (@Gae24, #36689) * **type** property on **Stylesheet** (@simonwuelker, #37126) Our layout and CSS support continues to improve. This month, we improved our page background sizing and style computation (@mrobinson, @Loirooriol, #36917, #37147), and added support for **‘wavy’** and **‘double’** in the **‘text-decoration-line’** property (@mrobinson, #37079). **HTMLVideoElement** can now be **used as an image source** for 2D canvas APIs (@tharkum, #37135), **ImageBitmap** can be serialized and transferred via postMessage() (@tharkum, #37101), **media elements** redraw properly whenever their size changes (@tharkum, #37056), **polygon image map areas** are clickable (@arihant2math, #37064), **< select> elements** are redrawn when their contents change (@simonwuelker, #36958), and **getPreferredCanvasFormat() on GPU** returns platform-appropriate values (@arihant2math, #37073). We’ve fixed bugs relating to invertible and non-invertible transforms (@Loirooriol, #36749, #37147), missing underlines on macOS (@mrobinson, #37029), and sizing issues for tables and flex containers (@stevennovaryo, @Loirooriol, #36703, #36993, #36980, #37024, #37011). We’ve also fixed a number of bugs where Servo’s behaviour did not match relevant specifications: * `input` events are now fired following `keydown` events (@yezhizhen, #37078) * unscopable objects are now writable and readable, and don’t have a prototype (@simonwuelker, #37119, #37122) * `Request` headers reject more erroneous headers (@sebsebmc, #36943) * External stylesheets in documents with quirks mode are more lenient about the stylesheet’s `Content-Type` (@ghostd, @mrobinson, #28321) * the `ImageData` constructor throws better errors for unsupported arguments (@Taym95, #31398) * Attribute nodes are serialized as the empty string (@simonwuelker, #36875) * custom element `is` values are serialized as attributes (@simonwuelker, #36888) * `EventSource` ignores invalid field values and treats non-200 responses codes as failures (@KiChjang, #36853, #36854) * the `premultipliedAlpha` flag for WebGL canvases premultiplies correctly (@tharkum, #36895) Our WebDriver server implementation received a lot of attention this month! Element clicks now receive the expected button value (@longvatrong111, #36871), wheel actions are supported (@PotatoCP, #36744, #36985), and we removed the possibility of races between some input actions and other WebDriver commands (@longvatrong111, @mrobinson, #36932). We’ve also added support for passing WebDriver references to DOM objects as arguments when executing scripts (@jdm, #36673), and fixed some bugs with JS value serialization (@yezhizhen, #36908) and cancelling inputs (@yezhizhen, #37010). We’ve begun preparatory work to **integrateVello** as the backend for 2D canvases (@sagudev, #36783, #36790, #36999). We’ve also landed some changes towards supporting **‘::placeholder’** pseudo-elements and fixing rendering issues with text inputs (@stevennovaryo, #37065). ## Embedding __ ### The engine __ Embedders can now **evaluate JavaScript inside a webview** and receive results asynchronously (@Narfinger, @mrobinson, #35720). All embedders will receive default styling and interactivity for elements like inputs and media elements (@webbeef, #36803), reducing the amount of configuration required to embed the engine. Any provided system light/dark theme will be propagated to all documents loaded inside of a webview (@mrobinson, #37132). Servo’s developer tools integration now **highlights elements** in the layout inspector (@simonwuelker, #35822), and displays <!DOCTYPE> nodes correctly (@simonwuelker, #36787). We have **removed the`dom_shadowdom_enabled` preference**, since the feature has been enabled by default since March 2025 (@simonwuelker, #37043). Our automated benchmarking setup is expanding, and we can now measure how long it takes to start up Servo and load the servo.org homepage on HarmonyOS (@Narfinger, #36878), which will help us identify regressions in the future. Finally, we can now write unit tests for Servo’s embedding API (@mrobinson, #36791), which allows us to write better regression tests for shutdown-related issues (@mrobinson, #36808). ### servoshell __ The `--user-agent` (`-u`) flag now correctly sets the User-Agent header for network requests (@PartiallyUntyped, @mrobinson, #36859). Service workers have been removed from the list of features enabled by `--enable-experimental-web-platform-features` until they provide more value (@jdm, #36867). Building servoshell with `--with-asan` now causes all C++ dependencies to be built with Address Sanitizer as well, and `mach bootstrap` on Windows can now use `winget` as a fallback if `choco` is unavailable (@jschwe, #32836). The current system light/dark theme is now queried on startup (@Legend-Master, #37128). Additionally, the screen dimensions and geometry reported by the engine are now correct on OpenHarmony (@PartiallyUntyped, @jschwe, #36915). ## Performance __ Servo is now better at **evicting image data from GPU caches** (@webbeef, #36956). We also reduced the memory needed to store **HSTS data**, saving **more than 60mb** by doing so (@sebsebmc, #37000, #37015). We now measure the memory usage of **sessionStorage** and **localStorage** data (@jdm, #37053), the **Public Suffix List** (@sebsebmc, #37049), and **system fonts** (@jdm, #36834). In addition, we’ve **reduced the size of the final Servo binary** by 2 MB by stripping out DOM code that should never be used outside of automated tests (@jdm, #37034). ## Stability __ We fixed a number of crashes involving **animated images** (@simonwuelker, #37058), **media elements** with an unknown duration (@tharkum, servo-media#437), **canvas elements** during shutdown (@mrobinson, #37182), adding a **Path2D** to itself (@Taym95, #36847), calculating **IntersectionObserver** areas (@webbeef, #36955), the **childNodes() method on Node** (@jdm, #36889), resizing **OffscreenCanvas** (@simonwuelker, #36855), querying **WebGL extensions** (@mrobinson, #36911), and slicing a sliced **Blob** (@simonwuelker, #36866). We’ve also fixed a deadlock involving streams with very large chunks (@wusyong, #36914), and fixed a source of intermittent crashes when closing tabs or removing iframes (@jdm, #37120). Finally, we rewrote the implementation of the **text property on HTMLOptionElement** to avoid crashes with deeply-nested elements (@kkoyung, #37167). Having previously noticed an unsafe pattern triggered by using JS-owned values in Rust Drop implementations (#26488), we have begun incrementally removing existing Drop impls to remove that source of unsafety (@willypuzzle, #37136). ## Upgrades __ We upgraded our fork of **WebRender** to **April 2025** (@mrobinson, #36770), and upgraded our **Stylo** dependency to **May 2025** (@Loirooriol, #36835). These changes ensure that Servo is up to date with ongoing work in Firefox, which shares these dependencies. ## Donations __ Thanks again for your generous support! We are now receiving **4597 USD/month** (−1.4% over April) in recurring donations. This helps cover the cost of our self-hosted CI runners and one of our latest Outreachy interns! Servo is also on thanks.dev, and already **25 GitHub users** (+1 over April) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. **4597** USD/month **10000** As always, use of these funds will be decided transparently in the Technical Steering Committee. For more details, head to our Sponsorship page.
servo.org
October 22, 2025 at 7:30 PM
This month in Servo: new elements, IME support, delegate API, and more!
Servo now supports more HTML and CSS features: * the **< details>** element (@simonwuelker, #35261) * the **< meter>** element (@simonwuelker, #35524) * the **< progress>** element (@simonwuelker, #35531) * the **‘quotes’** property (@xiaochengh, @Loirooriol, #34770, #35420) * the **‘isolation’** property (@kkoyung, @Loirooriol, #35552) * **‘overflow: clip’** (@longvatrong111, #35103) * **‘overflow’** property with two values (@yezhizhen, @mrobinson, #35414) * the **‘::slotted’** selector (@simonwuelker, #35352) Plus several new web API features: * **contextmenu** events (@pewsheen, #35364) * **WritableStream** (@gterzian, @jdm, #34844) * **ReadableStreamBYOBRequest** (@Taym95, #35074) * initial support for **FontFace** and its **load()** method (@mukilan, #35262) * **toBlob()** and **toDataURL()** on **WebGPU canvases** (@sagudev, #35237) * **bytes()** on **Request** , **Response** , and **Blob** (@shanehandley, @yoseio, @gterzian, @Taym95, #35250, #35151) * **href** , **origin** , **protocol** , **username** , **password** , **host** , **hostname** , **port** , **pathname** , **search** , and **hash** properties on **HTMLAreaElement** (@shanehandley, #35482) * **insertRule() with no argument** on **CSSGroupingRule** (@Loirooriol, #35295) **< slot> elements** are now fully supported including layout (@simonwuelker, #35220, #35519), and we’ve also landed support for the **‘::slotted’** selector (@simonwuelker, #35352). **Shadow roots** are now **supported in devtools** (@simonwuelker, #35294), and we’ve fixed some bugs related to shadow DOM trees (@simonwuelker, #35276, #35338), event handling (@simonwuelker, #35380), and custom elements (@maxtidev, @jdm, #35382). We’ve landed layout improvements around **‘border-collapse’** (@Loirooriol, #35219), **‘align-content: normal’** (@rayguo17, #35178), **‘place-self’** with **‘position: absolute’** (@Loirooriol, #35208), the **intrinsic sizing keywords** (@Loirooriol, #35413, #35469, #35471, #35630, #35642, #35663, #35652, #35688), and **‘position: absolute’** now works correctly in a **‘position: relative’ grid item** (@stevennovaryo, #35014). Input has also been improved, with **better IME support** (@dklassic, #35535, #35623) and several fixes to touch input (@kongbai1996, @jschwe, @shubhamg13, #35450, #35031, #35550, #35537, #35692). ## Servo-the-browser (servoshell) __ **Directory listings** are now enabled for local files (@mrobinson, #35317). servoshell’s **dialogs now use egui** (@chickenleaf, #34823, #35399, #35464, #35507, #35564, #35577, #35657, #35671), rather than shelling out to a program like `zenity` (@chickenleaf, #35674), making them more secure and no longer falling back to terminal input. We’ve also fixed a bug when closing a tab other than the current one (@pewsheen, #35569). ## Servo-the-engine (embedding) __ We’ve simplified our embedding API by **merging all input event delivery** into `WebView::notify_input_event` (@mrobinson, @mukilan, #35430), making **bluetooth optional** (@jdm, @webbeef, #35479, #35590), making the **“background hang monitor” optional** (@jdm, #35256), and **eliminating the need to depend on`webxr`** (@mrobinson, #35229). We’ve also moved some servoshell-only options out of `Opts` (@mrobinson, #35377, #35407), since they have no effect on Servo’s behaviour. We’ve landed our initial **delegate-based API** (@delan, @mrobinson, @mukilan, #35196, #35260, #35297, #35396, #35400, #35544, #35579, #35662, #35672), which replaces our old message-based API for integrating Servo with your app (@mrobinson, @delan, @mukilan, #35284, #35315, #35366). By implementing `WebViewDelegate` and `ServoDelegate` and installing them, you can have Servo call back into your app’s logic with ease. We’ve simplified the `RenderingContext` trait (@wusyong, @mrobinson, #35251, #35553) and **added three built-in`RenderingContext` impls** (@mrobinson, @mukilan, #35465, #35501), making it easier to set up a context Servo can render to: * `WindowRenderingContext` renders to a **whole window** * `OffscreenRenderingContext` renders to **part of a window** * `SoftwareRenderingContext` renders to an image, **without hardware acceleration** We’ve heavily reworked and documented our **webview rendering model** (@mrobinson, @wusyong, @mukilan, #35522, #35621), **moved image output** and **shutdown logic** out of the compositor (@mrobinson, @wusyong, #35538), and removed some complicated logic around synchronous repaints when a window is resized (@mrobinson, #35283, #35277). These changes should make it a lot clearer how to get Servo’s webviews onto your display. One part of this model that we’re starting to move away from is the support for multiple webviews in one rendering context (@mrobinson, @wusyong, #35536). First landed in #31417, this was an expedient way to add support for multiple webviews, but it imposed some serious limitations on how webviews could be interleaved with other app content, and the performance and security was inadequate. We’ve **updated ourwinit_minimal example** to take advantage of these changes (@webbeef, #35350, #35686), simplify it further (@robertohuertasm, #35253), and fix window resizing (@webbeef, #35691). ## Perf and stability __ The compositor now **notifies the embedder of new frames immediately** (@mrobinson, #35369), not via the constellation thread. Servo’s typical **memory usage has been reduced by over 1%** thanks to Node object optimisations (@webbeef, #35592, #35554), and we’ve also improved our memory profiler (@webbeef, #35618, #35607). We’ve fixed a bug causing very high CPU usage on sites like wikipedia.org (@webbeef, #35245), as well as bugs affecting requestAnimationFrame (@mukilan, #35387, #35435). You can now configure our tracing-based profiler (`--features tracing`) with `servo --tracing-filter` instead of `SERVO_TRACING` (@jschwe, #35370). We’ve continued **reducing our use of`unsafe` in script** (@nscaife, @stephenmuss, #35351, #35360, #35367, #35411), and **moving parts of`script` to `script_bindings`** (@jdm, #35279, #35280, #35292, #35457, #35459, #35578, #35620). Breaking up our massive `script` crate is absolutely critical for reducing Servo’s build times. We’ve fixed crashes that happen when moving windows past the edge of your monitor (@webbeef, #35235), when unpaired UTF-16 surrogates are sent to the DOM (@mrobinson, #35381), when focusing elements inside shadow roots (@simonwuelker, #35606), and when calling getAsString() on a DataTransferItem (@Gae24, #35699). We’ve also continued working on static analysis that will help catch crashes due to GC borrow hazards (@augustebaum, @yerke, @jdm, @Gae24, #35541, #35593, #35565, #35610, #35591, #35609, #35601, #35596, #35595, #35594, #35597, #35622, #35604, #35616, #35605, #35640, #35647, #35646). ## Donations __ Thanks again for your generous support! We are now receiving **4363 USD/month** (+13.7% over January) in recurring donations. This helps cover the cost of our self-hosted CI runners and Outreachy internships. Servo is also on thanks.dev, and already **21 GitHub users** (+5 over January) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community. **4363** USD/month **10000** As always, use of these funds will be decided transparently in the Technical Steering Committee. For more details, head to our Sponsorship page.
servo.org
October 22, 2025 at 7:29 PM