<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:planet="http://planet.intertwingly.net/" xmlns:indexing="urn:atom-extension:indexing" indexing:index="no"><access:restriction xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" relationship="deny"/>
  <title>Planet Mozilla</title>
  <updated>2026-06-15T04:54:47Z</updated>
  <generator uri="http://intertwingly.net/code/venus/">Venus</generator>
  <author>
    <name>Planet Mozilla Module Team</name>
    <email>planet@mozilla.org</email>
  </author>
  <id>https://planet.mozilla.org/atom.xml</id>
  <link href="https://planet.mozilla.org/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="https://planet.mozilla.org/" rel="alternate"/>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/community/?p=2539</id>
    <link href="https://blog.mozilla.org/community/2026/06/12/newsletter-may-2026/" rel="alternate" type="text/html"/>
    <title>May highlights: Contributor spotlight, Web Serial support, and more</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Mozillians, For years, the Mozilla Community Newsletter has served as a monthly touchpoint for contributors and community members across the Mozilla ecosystem. Coordinated by the Customer Experience (CX) team, … <a class="go" href="https://blog.mozilla.org/community/2026/06/12/newsletter-may-2026/">Read more</a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Hi Mozillians,</p>
<p class="isSelectedEnd">For years, the <a href="https://community.mozilla.org/newsletter">Mozilla Community Newsletter</a> has served as a monthly touchpoint for contributors and community members across the Mozilla ecosystem. Coordinated by the Customer Experience (CX) team, it helps keep our global contributor and product communities informed, connected, and engaged through updates, contributor stories, announcements, and opportunities to get involved.</p>
<p class="isSelectedEnd">While the newsletter has traditionally been distributed directly to community members, we recognize that many of these updates are valuable to a broader audience as well. That’s why we’re bringing our content into a blog post format, making it easier for anyone interested in Mozilla’s mission, products, and community work to stay informed.</p>
<p class="isSelectedEnd">Whether you’re a longtime contributor, a Firefox enthusiast, or simply curious about what’s happening across Mozilla, we hope these updates provide useful insights into the people, projects, and initiatives shaping our community.</p>
<p>In this edition, we’re sharing our latest updates from May 2026. It’s packed with the latest community news, contributor highlights, project updates, and opportunities to get involved in Mozilla’s work around the world.</p>
<p>So, without further ado, let’s dive in!</p>
<p><b>‍ From localizing to Firefox Enterprise</b></p>
<p>Long-time Mozillian Valery recently shared an open-source project he built to help Firefox Enterprise administrators manage Firefox deployments more easily called Browser Policy Manager or BPM. Beyond the tool itself, this story is a proof of the long-term value of investing in the community. Stories like Valery’s show how community contributions evolve over time and why fostering a strong, engaged contributor community continues to pay dividends across the Mozilla ecosystem.</p>
<p><a href="https://connect.mozilla.org/t5/discussions/i-built-an-open-source-firefox-enterprise-policy-manager-and/m-p/126284">Learn more about PBM</a></p>
<p><b> Firefox Referrals: We want to hear from you</b></p>
<p>Could Firefox users help grow the community by recommending Firefox to friends and family? That’s the question being explored in a recent Mozilla Connect discussion about potential referral programs. Join the conversation to share your thoughts on what would motivate you to recommend Firefox, and what a referral experience should (or shouldn’t) look like.</p>
<p><a href="https://connect.mozilla.org/t5/discussions/what-do-you-think-of-firefox-referrals/td-p/127384">Share your feedback</a></p>
<p><b> Web Serial finally arrives in Firefox 151</b></p>
<p>After years of community interest and requests dating back more than a decade, Firefox 151 now includes support for the <strong>Web Serial API</strong>. Developers can use Firefox to communicate with and manage serial-connected devices such as ESP boards, Raspberry Pi Picos, 3D printers, CNC machines, and other microcontrollers directly from the web. It’s a long-awaited milestone for the maker and hardware community, and we’re excited to finally see it land in Firefox.</p>
<p><a href="https://www.firefox.com/firefox/151.0/releasenotes/#html5">Learn more</a></p>
<p><b> Community spotlight</b></p>
<p>In this community spotlight, we feature <strong>Baurzhan Muftakhidinov</strong>, whose work has helped bring Firefox and many other open source projects to Kazakh users. His story is a testament to the power of persistence, community, and the importance of keeping smaller languages visible online.</p>
<p><a href="https://blog.mozilla.org/l10n/2026/04/15/localizer-spotlight-baurzhan/">Read Baurzhan’s story</a></p>
<hr/>
<p>P.S.</p>
<p>Enjoyed these updates? Subscribe to the <a href="https://community.mozilla.org/newsletter">Mozilla Community Newsletter</a> and get the latest updates delivered straight to your inbox.</p></div>
    </content>
    <updated>2026-06-12T11:28:37Z</updated>
    <published>2026-06-12T11:28:37Z</published>
    <category term="Newsletter"/>
    <author>
      <name>Rizki Kelimutu</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/community</id>
      <link href="https://blog.mozilla.org/community/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/community" rel="alternate" type="text/html"/>
      <subtitle>News and notes from and for the Mozilla community.</subtitle>
      <title>about:community</title>
      <updated>2026-06-13T02:38:52Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/netpolicy/?p=2583</id>
    <link href="https://blog.mozilla.org/netpolicy/2026/06/11/a-handful-of-companies-control-the-web-aicoa-can-change-that/" rel="alternate" type="text/html"/>
    <title>A Handful of Companies Control the Web. AICOA Can Change That.</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Mozilla Champions the Reintroduction of the American Innovation and Choice Online Act (AICOA) Today, only a handful of tech companies shape the online experience for the more than 300 million … <a class="go" href="https://blog.mozilla.org/netpolicy/2026/06/11/a-handful-of-companies-control-the-web-aicoa-can-change-that/">Read more</a></p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/06/11/a-handful-of-companies-control-the-web-aicoa-can-change-that/">A Handful of Companies Control the Web. AICOA Can Change That.</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><strong>Mozilla Champions the Reintroduction of the American Innovation and Choice Online Act (AICOA)</strong></p>
<p>Today, only a handful of tech companies shape the online experience for the more than 300 million internet users in America. This concentration of power is exactly why we need legislation that advances competition and user choice.  It’s all the more urgent as AI transforms not just the tools that people use, but also <a href="https://blog.mozilla.org/en/mozilla/rewiring-mozilla-ai-and-web/">magnifies the competitive inequities</a> underlying the web itself.</p>
<p>The <a href="https://www.judiciary.senate.gov/press/rep/releases/grassley-klobuchar-introduce-bipartisan-legislation-to-lower-prices-expand-consumer-choice-and-restore-online-competition-in-the-digital-marketplace">American Innovation and Choice Online Act (AICOA)</a> is bipartisan legislation designed to curb harmful gatekeeper behaviors of the biggest tech platforms. The bill does so by prohibiting dominant platforms from unfairly preferencing their own products, discriminating against tech competitors, and preventing interoperability — all practices that stop the best product winning and stifle consumer control. The goal is straightforward: companies should compete based on the quality of their products, not by leveraging anticompetitive tactics.</p>
<p>As the builder and operator of the Firefox browser and the browser engine <a href="https://blog.mozilla.org/netpolicy/2026/03/23/competition-innovation-and-the-future-of-the-web/">Gecko</a>, Mozilla has firsthand experience with the impact of the exclusionary practices AICOA seeks to prevent. For example, <a href="https://research.mozilla.org/browser-competition/over-the-edge-the-use-of-design-tactics-to-undermine-browser-choice/">deceptive design tactics</a> deployed by operating systems make it difficult for people to install and keep Firefox as their preferred browser. Browsers are the portal through which people access the open web, and users should define that interaction. AICOA would help limit the ability of operating systems to steer users toward affiliated products through deceptive design choices. Ensuring meaningful user choice online is not just about variety; it reflects values and individual preferences. Openness and innovation thrives when the web is built around platforms that serve people, not the other way round.</p>
<p>Browser engines, while lesser-known, are among the most complex and consequential pieces of infrastructure on the modern internet, impacting user-focused innovations in privacy, security, speed, and more. Gecko is one of only three widely used engines and the only independent browser engine. The importance of that competitive counterweight cannot be underestimated. When platform owners favor their own vertically integrated products, independent challengers face barriers that have nothing to do with product quality and everything to do with a monopolized market.</p>
<p>It’s important to recognize that antitrust reform can make the internet <i>more</i> private and secure than it is today, as we’ve consistently <a href="https://blog.mozilla.org/en/mozilla/calling-for-antitrust-reform/">emphasized</a>. For example, in 2021, Firefox was <a href="https://blog.mozilla.org/security/2021/02/23/total-cookie-protection/">at the forefront of developing technology against cross-site tracking</a>, but could not release the technology to Firefox users on iOS because of app store rules preferring Apple’s own browser engine, blocking alternatives like<a href="https://blog.mozilla.org/netpolicy/2026/03/23/competition-innovation-and-the-future-of-the-web/"> Gecko</a>.</p>
<p>We’re champions of AICOA and look forward to working with members of Congress to push this legislation forward and tackle longstanding anticompetitive practices. Mozilla thanks Senators Grassley and Klobuchar for their leadership in advancing competition. A thriving tech ecosystem requires an open, fair, and competitive market where innovative services can compete on merit and people can control their own experiences online.</p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/06/11/a-handful-of-companies-control-the-web-aicoa-can-change-that/">A Handful of Companies Control the Web. AICOA Can Change That.</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </content>
    <updated>2026-06-11T14:05:07Z</updated>
    <published>2026-06-11T14:05:07Z</published>
    <category term="Competition"/>
    <author>
      <name>Jenn Taylor Hodges and Elise Phillips</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/netpolicy/</id>
      <link href="https://blog.mozilla.org/netpolicy/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/netpolicy/" rel="alternate" type="text/html"/>
      <subtitle>Mozilla's official blog on open Internet policy initiatives and developments</subtitle>
      <title>Open Policy &amp; Advocacy</title>
      <updated>2026-06-11T14:28:25Z</updated>
    </source>
  </entry>

  <entry xml:lang="fr">
    <id>urn:md5:d9bc121b18dd8c2d55bd20b310baa70b</id>
    <link href="https://www.chevrel.org/carnet/?post/2026/06/11/Spell-checking-for-more-Firefox-users-%E2%80%94-a-community-effort" rel="alternate" title="Spell-checking for more Firefox users &#x2014; a community effort" type="text/html"/>
    <title xml:lang="fr">Spell-checking for more Firefox users — a community effort</title>
    <content type="xhtml" xml:lang="fr"><div xmlns="http://www.w3.org/1999/xhtml"><p>A while back, I stumbled onto something that turned into a rewarding side-project at Mozilla.</p>

<p>Firefox ships with a built-in spellchecker, but it only activates if a dictionary for your language is bundled with the browser. Coverage had grown organically over the years — driven largely by localizers and community members adding support for their own languages. Dictionary work was actually very active in the early years of the Mozilla project, but like many things in a large open-source codebase with a lot to manage, it had quietly received less attention over time, for no particularly good reason. So I decided to change that.</p>

<h3>Taking stock</h3>

<p>I put together a full <a href="https://vanilla.pascalc.net/dictionaries/">inventory dashboard</a> of every third-party dictionary shipped in Firefox Desktop, cataloguing sources, upstream health, and — critically — licensing.</p>

<p>Licensing turns out to be the main bottleneck. Firefox is open-source software, so any dictionary we ship has to carry a licence compatible with the Mozilla codebase. Some excellent dictionaries exist for languages Firefox supports, but their licences don't allow direct inclusion. In those cases, the dictionary can still reach users — but only as a Firefox extension they have to find and install manually, rather than something that just works out of the box.</p>

<p>The goal of the inventory wasn't to point fingers at anything. It was to make the full picture visible, so that anyone who wanted to help would know exactly where to start.</p>

<h3>Plugging into the community</h3>

<p>Once the inventory existed, the work was really about connecting the right people. Mozilla's localizer community already had the expertise and motivation — what was sometimes missing was a clear entry point. I took care of all the patches myself, so that localizers wouldn't have to deal with the technical side of things. This work was done in coordination with Mozilla's Localization drivers team, who own the dictionary infrastructure and reviewed and merged the changes.</p>

<h3>The results</h3>

<p>We expanded the number of locales shipping with a built-in dictionary <strong>from 30 to 41</strong>. This shipped last week with Firefox 151.0.3, and these improvements also benefit Thunderbird users, since both applications share the same dictionary infrastructure.</p>

<p>New dictionaries added: Croatian, English (UK), Georgian, Persian, Slovenian, Tajik, Tamil, Tibetan, Turkish, Welsh, and Xhosa.</p>

<p>Updated dictionaries: Bulgarian, Danish, French, Hungarian, Indonesian, Latvian, Polish, Romansh, and Swedish.</p>

<h3>Stirring the pot</h3>

<p>Part of the reason for doing this work publicly — building the inventory, filing the bugs, making the gaps visible — was to give people with the right expertise a reason to step in themselves. That's exactly what happened.</p>

<p>For Turkish and Russian, the existing open-source Hunspell dictionaries had become outdated — vocabulary and linguistic rules that hadn't kept pace with how the languages are actually used today. Selim (our Turkish l10n lead) and Valentin (our Russian l10n lead) each decided to take matters into their own hands.</p>

<p>Selim forked the <a href="https://github.com/tdd-ai/hunspell-tr">TDD Turkish dictionary</a> and updated it with modern vocabulary, better circumflex support, and performance improvements — the result is <a href="https://github.com/selimsum/hunspell-tr-moz">hunspell-tr-moz</a>, now shipping in Firefox 151.0.3. Valentin built a new modern Russian dictionary from scratch, <a href="https://github.com/Goudron/ru-spelling-dictionary">ru-spelling-dictionary</a>, released under MPL-2.0. It's currently available as a <a href="https://addons.mozilla.org/en-US/firefox/addon/russian-spell-dictionary/">Firefox extension</a> — if you use Russian, Valentin would appreciate feedback on the quality before it's integrated directly into Firefox.</p>

<p>Both projects are public and open-source.</p>

<h3>What's still in the pipeline</h3>

<p>The licence question is also quietly resolving itself for a couple more locales. The maintainers of the Kabyle and Asturian dictionaries have agreed to relicense their work to allow direct inclusion in Firefox. Once that's done, those communities will join the list too.</p>

<p>There are still gaps in the inventory. Some are licence issues that may resolve over time. But for many of the remaining locales, the honest answer is that we simply haven't looked hard enough yet. Dictionaries are often individual passion projects or work coming out of linguistics circles — they exist, but finding them takes investigation. If you know of a dictionary for a language Firefox doesn't currently support, that's exactly the kind of lead worth following up on.</p>

<h3>An open invitation</h3>

<p>Mozilla is still a place where a motivated contributor can find a corner of the project, do meaningful work, and have a real impact — without needing to be a browser engineer or a Mozilla insider.</p>

<p>The <a href="https://vanilla.pascalc.net/dictionaries/">inventory dashboard</a> is public. If you're a localizer, a linguist, or a dictionary maintainer and you want to help bring spellchecking to more Firefox users, the gaps are clearly documented. And if you maintain a dictionary that could be included but licensing is an obstacle, that's a conversation worth having.</p>

<p>See you in May 2027 for the next update.</p></div>
    </content>
    <updated>2026-06-11T13:59:44Z</updated>
    <published>2026-06-11T12:57:00Z</published>
    <category term="Mozilla"/>
    <category term="InEnglish"/>
    <author>
      <name>Pascal Chevrel</name>
    </author>
    <source>
      <id>urn:md5:df119eb286679353063d080b01104a80</id>
      <author>
        <name>Pascal Chevrel</name>
      </author>
      <link href="https://www.chevrel.org/carnet/?feed/tag/InEnglish/atom" rel="self" type="application/atom+xml"/>
      <link href="https://www.chevrel.org/carnet/" rel="alternate" title="" type="text/html"/>
      <title xml:lang="fr">Carnet de notes - Mot-clé - InEnglish</title>
      <updated>2026-06-12T09:25:12Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:this-week-in-rust.org,2026-06-10:/blog/2026/06/10/this-week-in-rust-655/</id>
    <link href="https://this-week-in-rust.org/blog/2026/06/10/this-week-in-rust-655/" rel="alternate" type="text/html"/>
    <title>This Week in Rust 655</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social …</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social, or
<a href="https://github.com/rust-lang/this-week-in-rust">send us a pull request</a>.
Want to get involved? <a href="https://github.com/rust-lang/rust/blob/main/CONTRIBUTING.md">We love contributions</a>.</p>
<p><em>This Week in Rust</em> is openly developed <a href="https://github.com/rust-lang/this-week-in-rust">on GitHub</a> and archives can be viewed at <a href="https://this-week-in-rust.org/">this-week-in-rust.org</a>.
If you find any errors in this week's issue, <a href="https://github.com/rust-lang/this-week-in-rust/pulls">please submit a PR</a>.</p>
<p>Want TWIR in your inbox? <a href="https://this-week-in-rust.us11.list-manage.com/subscribe?u=fd84c1c757e02889a9b08d289&amp;id=0ed8b72485">Subscribe here</a>.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4>


<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#official">Official</a></h5>
<ul>
<li><a href="https://blog.rust-lang.org/inside-rust/2026/06/04/how-josh-helps-rust-manage-code-across-multiple-repositories/">How Josh helps Rust manage code across multiple repositories</a></li>
<li><a href="https://blog.rust-lang.org/inside-rust/2026/06/03/maintainer-spotlight-tiffany-pek-yuan-tiif/">Maintainer spotlight: Tiffany Pek Yuan (@tiif)</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#newsletters">Newsletters</a></h5>
<ul>
<li><a href="https://rust-osdev.com/this-month/2026-05/">This Month in Rust OSDev: May 2026</a></li>
<li><a href="https://www.theembeddedrustacean.com/p/the-embedded-rustacean-issue-73">The Embedded Rustacean Issue #73</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://kerkour.com/stdx">Announcing stdx, Rust's extended standard library</a></li>
<li><a href="https://medium.com/p/dc57a4631f8b?postPublishedType=initial">OmniScope 0.2.0 released:FFI static detection tool based on LLVM IR</a></li>
<li><a href="https://asterinas.github.io/2026/06/04/announcing-asterinas-0.18.0.html">Announcing Asterinas 0.18.0</a></li>
<li><a href="https://github.com/wilsonglasser/oryxis/releases/tag/v0.8.0">Oryxis SSH 0.8: split panes</a></li>
<li><a href="https://ratatui.rs/highlights/v0301/">Ratatui 0.30.1 is released - a Rust library for cooking up terminal user interfaces</a></li>
<li><a href="https://utoo.land/en/docs/blog/utoopack-intro">@utoo/pack: A Next-Generation Build Tool Based on Turbopack</a></li>
<li><a href="https://felipebalbi.github.io/pico-de-gallo/">Pico de Gallo - a USB-attached protocol bridge for developing embedded-hal drivers on your laptop</a></li>
<li><a href="https://kunobi.ninja/blog/kache-v0-5-0">kache 0.5.0: designing a correct compile-cache key</a></li>
<li><a href="https://www.veszelovszki.com/a/smb2/">Announcing smb2: a very fast pure-Rust SMB2/3 client</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5>
<ul>
<li><a href="https://smallcultfollowing.com/babysteps/blog/2026/06/09/only-bounds/">Only Bounds</a></li>
<li><a href="https://wasmer.io/posts/ported-wasmer-backend-django-to-rust">Porting our Django backend to Rust improved the infra usage by 90%</a></li>
<li><a href="https://wubingzheng.github.io/en/Decimal-Crates-Comparison.html">Decimal Crates Comparison and Benchmark</a> | <a href="https://wubingzheng.github.io/zh/Decimal-Crates-Comparison.html">Chinese version</a></li>
<li><a href="https://teaql.io/blog/robot-task-board-showcase/">TeaQL Robot Task Board: a Rust TUI showcase for auditable business workflows</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=QFQkqFSg8Z4">Rayon is NOT for games - use this instead</a></li>
<li>[audio] <a href="https://corrode.dev/podcast/s06e05-veo/">Veo with Anders Hellerup Madsen and Gorm Casper</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5>
<ul>
<li>[series] <a href="https://aibodh.com/posts/async-rust-chapter-1-hands-on-intro-to-async-rust/">Who Runs Your Rust Future? Hands-On Intro to Async Rust</a></li>
<li><a href="https://villagesql.com/blog/rust/">Extend MySQL Using Rust</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-rust-smart-pointers-and-interior-mutability-by-building-git-commit-graph-viewer/">Learn Rust Smart Pointers and Interior Mutability by Building Git Commit Graph Viewer</a></li>
<li><a href="https://rustarians.com/heap-underflow/">heap underflow: classic algorithm solutions in idiomatic Rust, runnable in the browser</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#crate-of-the-week">Crate of the Week</a></h4>
<p>This week's crate is <a href="https://github.com/handewo/rustion">rustion</a>, a SSH bastion server.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1610">handewo</a> for the self-suggestion!</p>
<p><a href="https://users.rust-lang.org/t/crate-of-the-week/2704">Please submit your suggestions and votes for next week</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#calls-for-testing">Calls for Testing</a></h4>
<p>An important step for RFC implementation is for people to experiment with the
implementation and give feedback, especially before stabilization.</p>
<p>If you are a feature implementer and would like your RFC to appear in this list, add a
<code>call-for-testing</code> label to your RFC along with a comment providing testing instructions and/or
guidance on which aspect(s) of the feature need testing.</p>
<p><em>No calls for testing were issued this week by
<a href="https://github.com/rust-lang/rust/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rust</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/rustup/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rustup</a> or
<a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing%20state%3Aopen">Rust language RFCs</a>.</em></p>
<p><a href="https://github.com/rust-lang/this-week-in-rust/issues">Let us know</a> if you would like your feature to be tracked as a part of this list.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#call-for-participation-projects-and-speakers">Call for Participation; projects and speakers</a></h4>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-projects">CFP - Projects</a></h5>
<p>Always wanted to contribute to open-source projects but did not know where to start?
Every week we highlight some tasks from the Rust community for you to pick and get started!</p>
<p>Some of these tasks may also have mentors available, visit the task page for more information.</p>

<ul>
<li><a href="https://github.com/ansidium/cuda-oxide-windows/issues/1">cuda-oxide Windows fork - test the Windows MSVC release on more CUDA/Windows setups</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/38">openslate - add unit tests for slugify() in api/src/notes.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/70">openslate - add integration tests for notes CRUD in api/src/notes.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/96">openslate - add integration tests for auth flow in api/src/users.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/89">openslate - add unit tests for build_fts_query() in api/src/search.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/106">openslate - add integration tests for auth middleware and logout in api/src/auth.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/85">openslate - add integration tests for media endpoints (DB layer) in api/src/media.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/40">openslate - add unit tests for ext_from_mime() and filename_from_url() in api/src/media.rs</a></li>
<li><a href="https://github.com/satyakwok/reliakit/issues/91">reliakit - add a typed_csv example to the umbrella crate</a></li>
<li><a href="https://github.com/satyakwok/reliakit/issues/92">reliakit - implement CsvField for char</a></li>
<li><a href="https://github.com/satyakwok/reliakit/issues/107">reliakit - implement CsvField for the core::net address types</a></li>
<li><a href="https://github.com/satyakwok/reliakit/issues/95">reliakit - write a short "which resilience block do I use?" guide</a></li>
<li><a href="https://github.com/satyakwok/reliakit/issues/94">reliakit - extract a reusable rolling-window counter from RollingBreaker</a></li>
</ul>



<p>If you are a Rust project owner and are looking for contributors, please submit tasks <a href="https://github.com/rust-lang/this-week-in-rust?tab=readme-ov-file#call-for-participation-guidelines">here</a> or through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-events">CFP - Events</a></h5>
<p>Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.</p>



<p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4>
<p>526 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-06-02..2026-06-09">merged in the last week</a></p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/157016">add <code>extern "tail"</code> calling convention</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/148820">add very basic "comptime" fn implementation</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157009">avoid <code>unreachable_code</code> on required return values</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157540">cleanup and optimize <code>render_impls</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156155">macros: report unbound metavariables directly</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157252">rewrite <code>rustc_span::symbol::Interner</code> to avoid double hashing</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155338">staticlib hide internal symbols</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#library">Library</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/154742">add APIs for case folding to the standard library</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/154608">add <code>_value</code> API for number literals in proc-macro</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156119">further optimize <code>SliceIndex&lt;str&gt;</code> impl for <code>Range&lt;usize&gt;</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/143511">improve TLS codegen by marking the panic/init path as cold</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155607">perf: use <code>get_unchecked</code> for <code>TwoWaySearcher</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156840">stabilize <code>PathBuf::into_string</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156222">stabilize <code>Result::map_or_default</code> and <code>Option::map_or_default</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/cargo/pull/17081">strip CR from <code>cargo:token-from-stdout</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rustdoc">Rustdoc</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/157262">IXCRE: preserve sizedness bounds on type params belonging to the parent item</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157438">don't link <code>doc(hidden)</code> associated type projections</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157233">fix trait impl ordering</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157310">render <code>impl</code> restriction</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17122">support <code>iter_mut</code> in <code>ITER_NEXT_SLICE</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17173"><code>borrowed_box</code>: clean-up, improve suggestion message</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17144"><code>double_must_use</code>: make the lint machine-applicable in single-attribute case</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17174"><code>iter_cloned_collect</code>: split off the suggestion from the main message</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17037">add <code>manual_isolate_lowest_one</code> lint</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17146">detect more ranges in <code>single_range_in_vec_init</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17131">do not trigger <code>inline_trait_bounds</code> on auto-derived code</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17031">extend <code>extra_unused_lifetimes</code> for spurious <code>for&lt;'a&gt;</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17141"><code>large_const_arrays</code>: check nested large arrays</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17023">fix <code>explicit_counter_loop</code> false positive when the counter is only modified inside the <code>else</code> block of <code>let...else</code> binding</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17130">fix <code>result_large_err</code> and <code>result_unit_err</code> not triggering on async functions</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17181">fix <code>unused_async_trait_impl</code> suggestions with return statements</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17164">fix lints duplications in <code>unknown_attribute</code> and <code>renamed_builtin_attr</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17121">obtaining the metadata of a const pointer is a const operation</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17135">perf: avoid cloning associated items in <code>empty_line_after</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17168">perf: skip the <code>boxed_local</code> walk for functions without a Box parameter</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17137">perf: skip the <code>inline_always</code> relevance walk for items without the attribute</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-analyzer">Rust-Analyzer</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22469"><code>feat(diagnostics)</code>: emit error for infer vars in non-inference contexts</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22505">adopt uv's AI policy</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22495">distribute windows builts with mimalloc</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22481">lower field defaults to <code>rustc_type_ir::Const</code>s</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22522"><code>RunnableKind::Test</code> should map to <code>project_json::RunnableKind::TestOne</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22523"><code>extract_function</code> misses <code>&amp;mut</code> for <code>container[i].mut_method()</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22520">do not emit a "type annotations needed" error on <code>include_bytes!()</code> where the array length cannot be inferred</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22519">no generate unused generic params in trait sign</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22524">parse OR pattern types</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22444">rename schema subItems with <code>sub_items</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22448">implement <code>rust-analyzer/evaluatePredicate</code> lsp extension</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22512">parse unnamed <code>enum</code> variants</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5>
<p>A fairly noisy week, with a bunch of small regressions contained within,
leading to a slight increase on average in instruction counts. This week had a
lot of large rollups, likely due to some CI problems, but thankfully many of
those came with pre-triaged perf results by the time (thank you to those
triagers!). Roughly similar slight regressions for cycles and wall times across
the week.</p>
<p>Triage done by <strong>@simulacrum</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=4804ad7e93e1b31f4605b7083871d0d3d85a2afe&amp;end=f3ef3bd882dd24a275a60701a67c3bb330edd8c1&amp;absolute=false&amp;stat=instructions%3Au">4804ad7e..f3ef3bd8</a></p>
<p>2 Regressions, 0 Improvements, 10 Mixed; 5 of them in rollups
32 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/master/triage/2026/2026-06-08.md">Full report here</a></p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#approved-rfcs"/><a href="https://github.com/rust-lang/rfcs/commits/master">Approved RFCs</a></h5>
<p>Changes to Rust follow the Rust <a href="https://github.com/rust-lang/rfcs#rust-rfcs">RFC (request for comments) process</a>. These
are the RFCs that were approved for implementation this week:</p>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3808"><code>#![register_{attribute,lint}_tool]</code></a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#final-comment-period">Final Comment Period</a></h5>
<p>Every week, <a href="https://www.rust-lang.org/team.html">the team</a> announces the 'final comment period' for RFCs and key PRs
which are reaching a decision. Express your opinions now.</p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust"/><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Rust</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/155421">Document panic in <code>RangeInclusive::from(legacy::RangeInclusive)</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/116258">Tracking Issue for explicit-endian String::from_utf16</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/126769">Tracking Issue for <code>substr_range</code> and related methods</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/153990">Decide and document where stdarch intrinsics are allowed to diverge from asm behavior</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155750">Document that <code>ManuallyDrop</code>'s Box interaction has been fixed</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155739">Add temporary scope to assert_eq and assert_ne</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/153863">Clean up crate type names to fix dylib vs staticlib confusion</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156807">Add <code>T: PartialEq</code> bounds to derived <code>StructuralPartialEq</code> impls.</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157029">stabilize feature <code>float_algebraic</code></a></li>
</ul>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler-team-mcps-only"/><a href="https://github.com/rust-lang/compiler-team/issues?q=label%3Amajor-change%20label%3Afinal-comment-period%20state%3Aopen">Compiler Team</a> <a href="https://forge.rust-lang.org/compiler/mcp.html">(MCPs only)</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/compiler-team/issues/999">Deny todo!() in tidy</a></li>
</ul>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#leadership-council"/><a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/leadership-council/issues/300">Rust All Hands 2027</a></li>
</ul>
<p><em>No Items entered Final Comment Period this week for
<a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Team</a>,
<a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a> or
<a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Unsafe Code Guidelines</a>.</em></p>
<p>Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"/><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h5>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3968">RFC for convenient, explicit closure capture using move($expr) expressions</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4>
<p>Rusty Events between 2026-06-10 - 2026-07-08 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-06-10 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/3bcnx1jb"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-06-12 | Virtual (Kenya, KE) | <a href="https://luma.com/user/rustaceanskenya">RustaceansKenya</a><ul>
<li><a href="https://luma.com/vuxir9w8"><strong>RUST FOR CIVIC TECH</strong></a></li>
</ul>
</li>
<li>2026-06-16 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/314985751/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314000478/"><strong>Rust Study/Hack/Hang-out</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/ekws5nr4"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314236370/"><strong>June, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455931/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-06-21 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314329044/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254779/"><strong>Fourth Tuesday</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/313767883/"><strong>Lunch &amp; Learn: What the heck are monads - and how do we fake them in Rust</strong></a></li>
</ul>
</li>
<li>2026-07-01 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/wqzhftyjckbcb/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin/events/">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455932/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Virtual (Nürnberg, DE) | <a href="https://www.meetup.com/rust-noris/events/">Rust Nuremberg</a><ul>
<li><a href="https://www.meetup.com/rust-noris/events/313345243/"><strong>Rust Nürnberg online</strong></a></li>
</ul>
</li>
<li>2026-07-05 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust/events/">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314095287/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-07 | Virtual (London, GB) | <a href="https://www.meetup.com/women-in-rust/events/">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/315060981/"><strong>👋 Community Catch Up</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#europe">Europe</a></h5>
<ul>
<li>2026-06-10 | Köln, DE | <a href="https://www.meetup.com/rust-cologne-bonn/events/">Rust Cologne</a><ul>
<li><a href="https://www.meetup.com/rustcologne/events/315090338/"><strong>Rust in June: Speedy Rust</strong></a></li>
</ul>
</li>
<li>2026-06-10 | München, DE | <a href="https://www.meetup.com/rust-munich">Rust Munich</a><ul>
<li><a href="https://www.meetup.com/rust-munich/events/313791798/"><strong>Rust Munich 2026 / 2 - Hacking Evening</strong></a></li>
</ul>
</li>
<li>2026-06-11 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin/events/">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/315088919/"><strong>Rust Berlin on location 🏳️‍🌈 - Edition 014</strong></a></li>
</ul>
</li>
<li>2026-06-11 | Switzerland, CH | <a href="https://www.posttenebraslab.ch/wiki/events/start">PostTenebrasLab</a><ul>
<li><a href="https://www.posttenebraslab.ch/wiki/events/monthly_meeting/rust_meetup"><strong>Rust Meetup Geneva</strong></a></li>
</ul>
</li>
<li>2026-06-12 - 2026-06-14 | Kraków, PL | <a href="https://rustmeet.eu/">Rustmeet</a><ul>
<li><a href="https://rustmeet.eu/"><strong>Rustmeet</strong></a></li>
</ul>
</li>
<li>2026-06-16 | Leipzig, DE | <a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig">Rust - Modern Systems Programming in Leipzig</a><ul>
<li><a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/events/313813937/"><strong>Interactive: Everything is Open Source</strong></a></li>
</ul>
</li>
<li>2026-06-16 | Milano, IT | <a href="https://www.meetup.com/rust-language-milano">Rust Language Milan</a><ul>
<li><a href="https://www.meetup.com/rust-language-milan/events/314766950/"><strong>Real-time planning in Rust: SolverForge &amp; SERIO</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Aarhus, DK | <a href="https://www.meetup.com/rust-aarhus">Rust Aarhus</a><ul>
<li><a href="https://www.meetup.com/rust-aarhus/events/314965238/"><strong>Talk Night at Danske Commodities</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Barcelona, ES | <a href="https://www.meetup.com/bcnrust/events/">BcnRust</a><ul>
<li><a href="https://www.meetup.com/bcnrust/events/315094938/"><strong>21st BcnRust Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-19 | Dresden, DE | <a href="https://github.com/rust-dresden">Rust Dresden</a><ul>
<li><a href="https://pretix.eu/rust-dresden/on-location-2"><strong>Second Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Paris, FR | <a href="https://www.meetup.com/rust-paris">Rust Paris</a><ul>
<li><a href="https://www.meetup.com/rust-paris/events/315040676/"><strong>Rust meetup #86</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Warsaw, PL | <a href="https://luma.com/rust.in.warsaw">Rust Warsaw</a><ul>
<li><a href="https://luma.com/djs7ntfx"><strong>Rust Warsaw Meetup: June 2026</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/314396600/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Edinburgh, GB | <a href="https://www.meetup.com/rust-edi/events/">Rust and Friends</a><ul>
<li><a href="https://www.meetup.com/rust-and-friends/events/314941098/"><strong>Bevy, Bits, &amp; Cats (Rust July Talks)</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Enschede, OV, NL | <a href="https://www.meetup.com/dutch-rust-meetup/events/">Baseflow Tech Meetups</a><ul>
<li><a href="https://www.meetup.com/baseflow-tech-meetups/events/315099547/"><strong>AI Summit</strong></a></li>
</ul>
</li>
<li>2026-07-08 | Dublin, IE | <a href="https://www.meetup.com/rust-dublin/events/">Rust Dublin</a><ul>
<li><a href="https://www.meetup.com/rust-dublin/events/315150327/"><strong>Join us live and INPERSON for Rust 261</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<li>2026-06-11 | Lehi, UT, US | <a href="https://www.meetup.com/utah-rust">Utah Rust</a><ul>
<li><a href="https://www.meetup.com/utah-rust/events/314696643/"><strong>Utah Rust June Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-11 | Mountain View, CA, US | <a href="https://www.meetup.com/hackerdojo/events/">Hacker Dojo</a><ul>
<li><a href="https://www.meetup.com/hackerdojo/events/314825006/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
</ul>
</li>
<li>2026-06-11 | San Diego, CA, US | <a href="https://www.meetup.com/san-diego-rust">San Diego Rust</a><ul>
<li><a href="https://www.meetup.com/san-diego-rust/events/313721899/"><strong>San Diego Rust June Meetup - Back in person!</strong></a></li>
</ul>
</li>
<li>2026-06-16 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group">San Francisco Rust Study Group</a><ul>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/314989012/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-06-16 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group">San Francisco Rust Study Group</a><ul>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/ghhwqtyjcjbvb/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314000478/"><strong>Rust Study/Hack/Hang-out</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314236370/"><strong>June, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/xvkdgtyjcjbgc/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a><ul>
<li><a href="https://www.meetup.com/rust-los-angeles/events/314386080/"><strong>Rust LA: Rust-Based Constraint Solvers in 2D Sketching with Zoo Technologies</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Atlanta, GA, US | <a href="https://www.meetup.com/rust-atl">Rust Atlanta</a><ul>
<li><a href="https://www.meetup.com/rust-atl/events/313539326/"><strong>Rust-Atl</strong></a></li>
</ul>
</li>
<li>2026-06-26 | New York, NY, US | <a href="https://www.meetup.com/rust-nyc">Rust NYC</a><ul>
<li><a href="https://www.meetup.com/rust-nyc/events/315014582/"><strong>Rust NYC's Big Summer Social</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Saint Louis, MO, US | <a href="https://www.meetup.com/stl-rust/events/">STL Rust</a><ul>
<li><a href="https://www.meetup.com/stl-rust/events/315103359/"><strong>Git is easy?</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5>
<ul>
<li>2026-06-11 | Brisbane City, QL, AU | <a href="https://www.meetup.com/rust-brisbane/events/">Rust Brisbane</a><ul>
<li><a href="https://www.meetup.com/rust-brisbane/events/315092980/"><strong>Rust Brisbane • June 2026</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Melbourne, AU | <a href="https://www.meetup.com/rust-melbourne">Rust Melbourne</a><ul>
<li><a href="https://www.meetup.com/rust-melbourne/events/315039461/"><strong>Rust Melbourne June 2026</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#south-america">South America</a></h5>
<ul>
<li>2026-06-18 | Florianópolis, BR | <a href="https://luma.com/rust-sc">Rust SC</a><ul>
<li><a href="https://luma.com/acinctdf"><strong>Rust Floripa</strong></a></li>
</ul>
</li>
</ul>
<p>If you are running a Rust event please add it to the <a href="https://www.google.com/calendar/embed?src=apd9vmbc22egenmtu5l6c5jbfc%40group.calendar.google.com">calendar</a> to get
it mentioned here. Please remember to add a link to the event too.
Email the <a href="mailto:community-team@rust-lang.org">Rust Community Team</a> for access.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#jobs">Jobs</a></h4>
<p>Please see the latest <a href="https://www.reddit.com/r/rust/comments/1ttbtf5/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p>
<h3><a class="toclink" href="https://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3>
<blockquote>
<p>It's a footgun, yes, but it's a sound footgun.</p>
</blockquote>
<p>– <a href="https://github.com/rust-lang/rust/pull/155750#discussion_r3356323620">Prof. Dr. Ralf Jung on github</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1779">Theemathas</a> for the suggestion!</p>
<p><a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328">Please submit quotes and vote for next week!</a></p>
<p>This Week in Rust is edited by:</p>
<ul>
<li><a href="https://github.com/nellshamrell">nellshamrell</a></li>
<li><a href="https://github.com/llogiq">llogiq</a></li>
<li><a href="https://github.com/ericseppanen">ericseppanen</a></li>
<li><a href="https://github.com/extrawurst">extrawurst</a></li>
<li><a href="https://github.com/U007D">U007D</a></li>
<li><a href="https://github.com/mariannegoldin">mariannegoldin</a></li>
<li><a href="https://github.com/bdillo">bdillo</a></li>
<li><a href="https://github.com/opeolluwa">opeolluwa</a></li>
<li><a href="https://github.com/bnchi">bnchi</a></li>
<li><a href="https://github.com/KannanPalani57">KannanPalani57</a></li>
<li><a href="https://github.com/tzilist">tzilist</a></li>
</ul>
<p><em>Email list hosting is sponsored by <a href="https://foundation.rust-lang.org/">The Rust Foundation</a></em></p>
<p><small><a href="https://www.reddit.com/r/rust/comments/1u2rz3a/this_week_in_rust_655/">Discuss on r/rust</a></small></p></div>
    </content>
    <updated>2026-06-10T04:00:00Z</updated>
    <published>2026-06-10T04:00:00Z</published>
    <category term="This Week in Rust"/>
    <author>
      <name>TWiR Contributors</name>
    </author>
    <source>
      <id>https://this-week-in-rust.org/</id>
      <link href="https://this-week-in-rust.org/" rel="alternate" type="text/html"/>
      <link href="https://this-week-in-rust.org/atom.xml" rel="self" type="application/atom+xml"/>
      <title>This Week in Rust</title>
      <updated>2026-06-10T04:00:00Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148609</id>
    <link href="https://discourse.mozilla.org/t/happy-bmo-push-day-20260609-1/148609" rel="alternate" type="text/html"/>
    <title>Happy BMO Push Day! (20260609.1)</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="https://github.com/mozilla-bteam/bmo/tree/release-20260609.1" rel="noopener nofollow ugc">Github Link</a></p>
<p>The following changes have been pushed to <a href="https://bugzilla.mozilla.org">bugzilla.mozilla.org</a>:</p>
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2043429">Bug 2043429</a> - Selenium test 1_test_bug_edit.t intermittently fails when attemtping to  click on comment reactions</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1995467">Bug 1995467</a> - Show dependency tree on meta bugs by default</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2043322">Bug 2043322</a> - text/html attachments are downloaded instead of viewing in-browser</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2038298">Bug 2038298</a> - Render Phabricator revisions stack fork in the parent’s row</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2045855">Bug 2045855</a> - phab-bot attempts to set approval flags for disabled flags</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2044471">Bug 2044471</a> - Add loading indicator to embedded dependency tree</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2034051">Bug 2034051</a> - Update Bugzilla Etiquette with guidance about AI usage</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033409">Bug 2033409</a> - Pasting a link from the clipboard after using the Link button inserts additional markdown into the link</li>
</ul>
<p>Discuss these changes in the <a href="https://matrix.to/#/#bmo:mozilla.org" rel="noopener nofollow ugc">BMO Matrix Room</a></p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/happy-bmo-push-day-20260609-1/148609">Read full topic</a></p></div>
    </summary>
    <updated>2026-06-09T17:28:10Z</updated>
    <published>2026-06-09T17:28:10Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>dkl1</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/happy-bmo-push-day-20260609-1/148609.rss" title="Happy BMO Push Day! (20260609.1)"/>
      <updated>2026-06-12T10:58:52Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=86051</id>
    <link href="https://blog.mozilla.org/en/firefox/firefox-built-in-vpn-summer/" rel="alternate" type="text/html"/>
    <title>Browse more privately all summer with Firefox’s free built-in VPN</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>For a limited time, where the VPN is available, users can get unlimited VPN bandwidth in Firefox – up from the 50 gigabytes monthly limit — plus access to over 25 country locations to browse from. Don’t have Firefox yet? Try it now. Firefox’s free built-in VPN usually gives eligible users 50 GB of free […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-built-in-vpn-summer/">Browse more privately all summer with Firefox’s free built-in VPN</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><figure class="wp-block-image size-large"><img alt="" class="wp-image-86133" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/VPN-1920x1080-1-1024x576.png" width="1024"/></figure>



<p><em>For a limited time, where the VPN is available, users can get unlimited VPN bandwidth in Firefox – up from the 50 gigabytes monthly limit — plus access to over 25 country locations to browse from. Don’t have Firefox yet? </em><a href="https://www.firefox.com/?utm_medium=mozilla-websites&amp;utm_source=blog.mozilla.org&amp;utm_campaign=vpn-summer-promo&amp;utm_content=subhead" rel="noreferrer noopener" target="_blank"><em>Try it now</em></a><em>.</em></p>



<p>Firefox’s <a href="https://blog.mozilla.org/firefox/built-in-vpn/">free built-in VPN</a> usually gives eligible users 50 GB of free bandwidth each month. From now through Aug. 31, we’re making that unlimited, so you have more room to browse privately while you travel, work from public Wi-Fi or connect from somewhere new. Not only will users get unlimited bandwidth, but we’re also unlocking access to 28 country locations to browse from during this period. The VPN returns to its standard 50 GB monthly limit and a standard location set on Sept. 1.</p>



<p>Whether you’re using the airport Wi-Fi, booking a last-minute flight or trying to access websites away from home, here are a few ways Firefox’s VPN can help while you travel:</p>



<h3><strong>Stay protected on public Wi-Fi at the airport, train station or hotel </strong></h3>



<p>When you’re traveling, public Wi-Fi is often part of the deal. But those networks can make it easier for others to spy on your traffic and see which websites you’re visiting. Firefox’s built-in VPN adds another layer of privacy by helping mask your <a href="http://blog.mozilla.org/internet-culture/what-is-an-ip-address/">IP address</a> and makes it harder for others on the network to see your browsing activity.</p>



<h3><strong>Browse like you’re back home</strong></h3>



<p>The web can feel a little funky when you go abroad. Sites may load in another language, show a different local version or have trouble recognizing where you usually browse from. Maybe you need to schedule your monthly pharmacy prescription, but the site isn’t loading the way it normally does from home. Or maybe you’re trying to order a new dress to your apartment but the address isn’t registering properly.</p>



<p>With Firefox’s built-in VPN, you can switch your browsing location back to your home country so the sites and services you rely on feel a little more familiar while you’re away.</p>



<h3><strong>Or choose where you browse from</strong></h3>



<p>Firefox can recommend a VPN location based on what’s fastest and most convenient. But you can also choose from more available locations, whether you want to browse closer to home or see how the web looks somewhere else. </p>



<p>The full set of countries available during this summer period include: Australia, Austria, Belgium, Bulgaria, Canada, Chile, Colombia, Denmark, Finland, France, Germany, Ireland, Italy, Malaysia, Mexico, Netherlands, New Zealand, Portugal, Singapore, Spain, Sweden, Thailand, Norway, South Africa, United Kingdom and United States.</p>



<h3><strong>Turn off VPN for specific sites</strong></h3>



<p>Some sites don’t always work smoothly with VPNs. If one is giving you trouble, you can turn the VPN off for that website right from the panel. You can also add sites to a list in advanced settings if you don’t want them to connect through the VPN.</p>



<h3><strong>Free VPN for wherever summer takes you</strong></h3>



<p>Wherever you’re logging on this summer, Firefox’s built-in VPN gives you an easy way to add another layer of protection while you browse. More control for summer browsing, right where you need it. As it should be.</p>



<a class="ft-c-inline-cta" href="https://www.firefox.com/en-US/?utm_medium=mozilla-websites&amp;utm_source=blog.mozilla.org&amp;utm_campaign=vpn-summer-promo&amp;utm_content=footer-button">
  <div class="ft-c-inline-cta__media">
  <img alt="The Firefox logo" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/03/Firefox_Logo_Symbol_Fullcolor_RGB-800x800.png" width="800"/>  </div>
  <div class="ft-c-inline-cta__content">
     <h4>Take control of your internet</h4>      <span>Download Firefox</span>   </div>
</a>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-built-in-vpn-summer/">Browse more privately all summer with Firefox’s free built-in VPN</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-06-09T15:58:16Z</updated>
    <published>2026-06-09T15:58:16Z</published>
    <category term="Firefox"/>
    <category term="Firefox Features"/>
    <category term="homepage"/>
    <author>
      <name>Mozilla</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/en/</id>
      <link href="https://blog.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/en/" rel="alternate" type="text/html"/>
      <subtitle>News and Updates about Mozilla</subtitle>
      <title>The Mozilla Blog</title>
      <updated>2026-06-10T17:43:34Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>https://smallcultfollowing.com/babysteps/blog/2026/06/09/only-bounds/</id>
    <link href="https://smallcultfollowing.com/babysteps/blog/2026/06/09/only-bounds/?utm_source=atom_feed" rel="alternate" type="text/html"/>
    <title xml:lang="en-us">Only Bounds</title>
    <content type="xhtml" xml:lang="en-us"><div xmlns="http://www.w3.org/1999/xhtml"><p><code>only</code> bounds are going to be the most impactful change to Rust that you’ve never heard of. They are currently being designed and developed by the Arm team (David Wood, Rémy Rakic, et al.) as part of the <a href="https://rust-lang.github.io/rust-project-goals/2026/scalable-vectors.html">Sized Hierarchy and Scalable Vector Extension</a> project goal.  This post explores the feature and aims to answer a particular question about the design (the scope of bounds, I’ll explain). But before I dive in, I want to give a bit of context.</p>
<h3>Rust generics have a <code>Sized</code> bound by default today</h3>
<p>In today’s Rust, every type parameter (except for <code>Self</code>) has a default bound called <code>Sized</code>:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="c1">// So this function...
</span></span></span><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">identity</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">(</span><span class="n">t</span>: <span class="nc">T</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nc">T</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">t</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// ...is actually short for
</span></span></span><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">identity</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">(</span><span class="n">t</span>: <span class="nc">T</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nc">T</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">where</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">T</span>: <span class="nb">Sized</span><span class="p">,</span><span class="w"> </span><span class="c1">// &lt;-- Added by default!
</span></span></span><span class="line"><span class="cl"><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">t</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>A type <code>T</code> implements <code>Sized</code> if the compiler can compute the size of a <code>T</code> value at compilation time. This is true for almost every type, with a few notable exceptions. Consider <code>[u32]</code>, which refers to “some number of <code>u32</code> instances”. We know that a single <code>u32</code> is 4 bytes, but without knowing how many <code>u32</code> there are, you can’t know the size of <code>[u32]</code>. This means you can’t have a value of type <code>[u32]</code> on the stack (how big should the stack frame be?).</p>
<h3>You opt out with <code>?Sized</code></h3>
<p>However, if you have a function like <code>by_ref</code>, that just takes the value <em>by reference</em> (i.e., by pointer), you shouldn’t need to know how big the <code>[u32]</code> value is, because you’re not manipulating it directly. You can have a type parameter <code>U</code> that doesn’t require <code>Sized</code>, but you have to explicitly “opt out” from the default bound:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">by_ref</span><span class="o">&lt;</span><span class="n">U</span><span class="o">&gt;</span><span class="p">(</span><span class="n">t</span>: <span class="kp">&amp;</span><span class="nc">U</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">where</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">U</span>: <span class="o">?</span><span class="nb">Sized</span><span class="p">,</span><span class="w"> </span><span class="c1">// &lt;-- Opt out from the default
</span></span></span><span class="line"><span class="cl"><span class="p">{</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>As a fun bit of historical trivia, this system was introduced way back in 2014 to accommodate <a href="https://smallcultfollowing.com/babysteps/blog/2014/01/05/dst-take-5/">Dynamically Sized Types</a>. Before that, <code>&amp;[u32]</code> was actually a built-in, indivisible type; we even wrote it like <code>[u32]/&amp;</code> for a time.<sup id="fnref:1"><a class="footnote-ref" href="https://smallcultfollowing.com/babysteps/atom.xml#fn:1">1</a></sup></p>
<h3>But <code>Sized</code> vs <code>?Sized</code> isn’t enough for everything we need</h3>
<p>The <code>Sized</code> vs <code>?Sized</code> design has served us reasonably well but it is also showing its limits. It turns out that “value has a statically computable size” vs “each value has a distinct size computable at runtime” doesn’t cover all the things you might want. For example, <code>extern</code> types are types whose values have no known size, even at runtime. And then Arm’s Scalable Vector Extension want to describe SIMD types where every value of the type has the same size (unlike <code>str</code> and <code>[T]</code>, where each value can have a different length) but where that size is not known until runtime.</p>
<h3>A richer <code>Sized</code> hierarchy</h3>
<p>Rather than just <code>Sized</code> or <code>?Sized</code>, what we really want is to have a richer hierarchy. The current plans look something like this:</p>
<pre class="mermaid">flowchart TD
  subgraph S["Sizedness traits"]
      Sized[["Sized (default)"]] -- extends --&gt; MetadataSized
      MetadataSized -- extends --&gt; MaybeSized
  end
  </pre>
<p>where</p>
<ul>
<li><code>trait Sized</code> means that all values have the same size and that size can be computed knowing only the type.</li>
<li><code>trait MetadataSized</code> means that values can have different sizes and that size can be computed given the metadata attached to a reference to the value. Examples include <code>[T]</code> or <code>dyn Trait</code>.</li>
<li><code>trait MaybeSized</code> is implemented for all values and tells you nothing about the value’s size.</li>
</ul>
<p>Two caveats:</p>
<ol>
<li>I’m excluding the way that Arm’s Scalable Vector Extension fit into this, because it’s orthogonal.</li>
<li>The trait names aren’t settled. I’m using the names I understand the libs-api team to prefer; they’re not my favorites, but that’s ultimately the team who owns stdlib bikesheds, so I defer to them.<sup id="fnref:2"><a class="footnote-ref" href="https://smallcultfollowing.com/babysteps/atom.xml#fn:2">2</a></sup></li>
</ol>
<h3>Problem: <code>?Sized</code> notation doesn’t scale to this hierarchy</h3>
<p>But now we have a kind of problem. The <code>?Sized</code> notation was predicated<sup id="fnref:3"><a class="footnote-ref" href="https://smallcultfollowing.com/babysteps/atom.xml#fn:3">3</a></sup> on the idea that users should specify the default bound they are opting out of – i.e., the <code>?</code> is meant to say “I don’t know if this is <code>Sized</code> or not” (unlike the default, where you know it is <code>Sized</code>). But “opting out” from a bound doesn’t work so well with a multi-level hierarchy. When you write <code>?Sized</code>, does that correspond to <code>T: MetadataSized</code> (but not <code>T: Sized</code>)? And what if we want to insert another level in between <code>T: MetadataSized</code> and <code>T: Sized</code> later? Then we either have to change what <code>T: ?Sized</code> means (to refer to the new bound) or we have to have <code>T: ?Sized</code> drop <em>two</em> levels down the hierarchy. Even more annoying, what do we do while that middle rung is unstable? Surely <code>T: ?Sized</code> shouldn’t refer to an unstable trait… what if we decide to remove it</p>
<h3>Solution: <code>only</code> bounds</h3>
<p>The new proposal is to write <code>T: only MetadataSized</code> or <code>T: only UnknownSized</code> instead of <code>T: ?Sized</code>. An <code>only</code> bound combines two things:</p>
<ol>
<li>Like any bound, it includes a “minimum requirement” – i.e., <code>T: only MetadataSized</code> means that <code>T</code> must implement <em>at least</em> <code>MetadataSized</code>.</li>
<li>It additionally disables some <em>default</em> bounds – i.e., we will <em>not</em> add the default <code>T: Sized</code> bound.</li>
</ol>
<p>The name <code>only</code> comes from the fact that <code>T: Sized</code> implies <code>T: MetadataSized</code>. So the default of <code>T: Sized</code> already means that <code>T: MetadataSized</code> for free; but when you write <em>only</em> MetadataSized, you are saying “I don’t need the full hierarchy, just <code>MetadataSized</code> will do”.</p>
<h3><code>only</code> bounds work like normal bounds: ask for what you need</h3>
<p>A nice feature of <code>only</code> bounds is that they work more like a regular bound. Whereas a <code>?</code> bound is saying “I don’t need this”, an <code>only</code> bound is saying what you <em>do</em> need. So e.g. if you are writing a function that just has references to values of type <code>T</code> does not care what their size is, you can write</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">by_ref</span><span class="o">&lt;</span><span class="n">U</span><span class="o">&gt;</span><span class="p">(</span><span class="n">u</span>: <span class="kp">&amp;</span><span class="nc">U</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">where</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">U</span>: <span class="nc">only</span><span class="w"> </span><span class="n">MaybeSized</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{}</span><span class="w">
</span></span></span></code></pre></div><p>If you are writing a function that <em>does</em> need to compute the size of values of type <code>V</code>, you can ask for that capability:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">checks_size</span><span class="o">&lt;</span><span class="n">V</span><span class="o">&gt;</span><span class="p">(</span><span class="n">v</span>: <span class="kp">&amp;</span><span class="nc">V</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">where</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">V</span>: <span class="nc">only</span><span class="w"> </span><span class="n">MetadataSized</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">std</span>::<span class="n">mem</span>::<span class="n">size_of_val</span><span class="p">(</span><span class="n">v</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3><code>only</code> bounds allow for new levels to be added later</h3>
<p>A nice feature of <code>only</code> bounds is that, later on, we can add new levels to the hierarchy, and they work normally. For example, suppose we wish to add something like <code>Aligned</code> where the <em>size</em> is not known at compilation time but the alignment <em>is</em>. We could change the hierarchy to</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">trait</span><span class="w"> </span><span class="nb">Sized</span>: <span class="nc">Aligned</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">trait</span><span class="w"> </span><span class="n">Aligned</span>: <span class="nc">MetadataSized</span><span class="w"> </span><span class="c1">// &lt;-- new!
</span></span></span><span class="line"><span class="cl"><span class="k">trait</span><span class="w"> </span><span class="n">MetadataSized</span>: <span class="nc">MaybeSized</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">trait</span><span class="w"> </span><span class="n">MaybeSized</span><span class="w">
</span></span></span></code></pre></div><p>and functions with <code>U: only MaybeSized</code> (like <code>by_ref</code>) and with <code>V: only MetadataSized</code> (with <code>checks_size</code>) would continue to have the same requirements. But new functions could be written with <code>T: only Aligned</code> that would use the new bound. And there is no conflict with stabilization; code that writes <code>T: only Aligned</code> can be considered unstable until that middle hierarchy is finalized.</p>
<h3><code>only</code> bounds compose normally</h3>
<p>Like any other bound, <code>only</code> bounds are combined with other bounds to form the overall requirements. So it is possible to write e.g. <code>T: only MetadataSized + Sized</code>. This is equivalent to <code>T: Sized</code> and therefore equivalent to the default and <em>therefore</em> kind of pointless, but you can write it. Similarly, given that <code>trait Clone: Sized</code>, if you write <code>T: only MetadataSized + Clone</code>, that is kind of pointless too: you might as well write <code>T: Clone</code>, which would be equivalent. We plan to have a warn-by-default lint for that.</p>
<h3>Scaling <code>only</code> to other “default bound families” (speculative)</h3>
<p>The final strength of <code>only</code> bounds is that they allow us to introduce whole new <em>families</em> of default bounds. One example is the idea of <a href="https://smallcultfollowing.com/babysteps/blog/2025/10/21/move-destruct-leak/">introducing a <code>Move</code> bound</a>. Note that this is a distinct feature and is not covered under the <a href="https://github.com/rust-lang/rfcs/pull/3729">current RFC</a>.</p>
<p>All types in Rust today are “movable” and “forgettable”, meaning that you can memcpy the value from place to place so long as you stop using the previous location <em>and</em> you can recycle the memory where it is stored without running the value’s destructor. There is one notable exception – when you pin a value, you it can no longer be moved, and you must run its destructor before its memory is reused – but otherwise this is a hard-and-fast rule. And that’s annoying!</p>
<p>The problem is that not being able to guarantee that a destructor runs blocks a lot of unsafe code patterns. For example, <a href="https://smallcultfollowing.com/babysteps/blog/2016/10/02/observational-equivalence-and-unsafe-code/">scoped tasks a la <code>rayon</code> depend on a destructor for safety</a>. In sync code, this works because we’ve decided it’s UB to unwind a stack frame without running the destructors of values stored there, and so if you put a local variable on the stack, you can be sure its destructor will run. But that doesn’t work in <code>async</code> code! And there are times when unwinding <em>without</em> running destructors would be nice.</p>
<p>The solution is to introduce a second family of default traits. Unlike the <code>Sized</code> family we saw before, this family defines fine-grained capabilities about how values of that type can be used:</p>
<pre class="mermaid">flowchart TD
  subgraph A["Accessability traits"]
      Forget[["Forget (default)"]] -- extends --&gt; Leak
      Leak -- extends --&gt; Destruct
      Destruct -- extends --&gt; Access
      Move[["Move (default)"]] -- extends --&gt; Access
  end
  Copy -- extends --&gt; Move
  </pre>
<p>The meaning of the traits are as follows:</p>
<ul>
<li><code>Forget</code>, the default, says that you can recycle the memory for a value without running its destructor.</li>
<li><code>Leak</code> says that you can skip running a destructor for a value, but only if you never reuse the memory where the value resides.</li>
<li><code>Destruct</code> says that if you have a value of this type, you can reuse the memory where it resides by running its destructor.</li>
<li><code>Copy</code>, which already exists, says that you can memcpy the place and keep using the original place; it’s not really a default, but I included it because it is relevant.</li>
<li><code>Move</code>, another default, says that you can memcpy the value to a new place if you stop using the original.</li>
<li><code>Access</code> is the root of this family. It indicates a value that can be “accessed in place” (basically, any value at all).</li>
</ul>
<p>This introduces new checks into the compiler:</p>
<ul>
<li>When you move a value (i.e., <code>a = b</code> where <code>b</code> is not used later), we will check that the type implements <code>Move</code> (whereas today, it is always allowed).</li>
<li>When you exit a scope, we will check that the values in each local variables have either been moved or have a type that implements <code>Destruct</code>.</li>
</ul>
<p>Some implications:</p>
<ul>
<li>If your function owns a value of type <code>T: only Destruct</code>, then you <em>must</em> destruct it before your function returns. You can’t move it (because you don’t know if it implements <code>Move</code>) and you can’t leak or forget it either.</li>
<li>If your function owns a value of type <code>T: only Move</code>, then the only thing you can do with it is move it somewhere else. You can’t drop it (because you don’t know if it implements <code>Destruct</code>).</li>
<li>No function can own a value of type <code>T: only Access</code>, because you wouldn’t be able to move it nor drop it, and hence you could not return. But you could have such a value (say) in a <code>static</code>.</li>
</ul>
<h3>How <code>only</code> bounds could work in the presence of multiple families</h3>
<p>The spur for writing this blog post was a question in a lang team meeting on how <code>only</code> bounds ought to work given the existence of multiple “families” of default traits, as I described above. Although the <a href="https://github.com/rust-lang/rfcs/pull/3729">current RFC</a> is looking only at the <code>Sized</code> traits, we expect to look at the “access family” in a future RFC, so we want to be sure we are not making any decisions that won’t scale to cover both.</p>
<p>The way I imagine it working is like this. Each default traits is associated with one or more “families”. When you have an only bound, it “opts out” from all default traits in each family that the trait is associated with:</p>
<ul>
<li><code>T: only Move</code> opts out from <code>Forget</code>, <code>Leak</code>, <code>Destruct</code> – but not <code>Sized</code>.</li>
<li><code>T: only Destruct</code> opts out from <code>Forget</code>, <code>Leak</code>, and <code>Move</code> – but not <code>Sized</code>.</li>
<li><code>T: only MetadataSized</code> opts out from <code>Sized</code> – but not <code>Forget</code> or <code>Move</code>.</li>
<li><code>T: only MaybeSized</code> opts out from <code>Sized</code> – but not <code>Forget</code> or <code>Move</code>.</li>
</ul>
<p>You may also want to “opt back in” to some defaults. For example, <code>T: only Move + Destruct</code> is a sensible thing to do. It means values that can be moved and destructed but not leaked or forgotten.</p>
<h3>Examples</h3>
<h4><code>Option::map</code> requires <code>only Move</code></h4>
<p><code>map</code> is an example of a function that only needs <code>Move</code>. You need to be able to destructure <code>self</code> (which <em>moves</em> the optional value out into a local variable <code>v</code> and then invoke the closure <code>op</code>, which again moves the wrapped value <code>v</code>:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">impl</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">only</span><span class="w"> </span><span class="n">Move</span><span class="o">&gt;</span><span class="w"> </span><span class="nb">Option</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">fn</span> <span class="nf">map</span><span class="o">&lt;</span><span class="n">U</span>: <span class="nc">only</span><span class="w"> </span><span class="n">Move</span><span class="o">&gt;</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="bp">self</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">op</span>: <span class="nc">impl</span><span class="w"> </span><span class="nb">FnOnce</span><span class="p">(</span><span class="n">T</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nc">U</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;</span><span class="n">U</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">match</span><span class="w"> </span><span class="bp">self</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nb">Some</span><span class="p">(</span><span class="n">v</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">op</span><span class="p">(</span><span class="n">v</span><span class="p">)),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nb">None</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="nb">None</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>One interesting thing is the result type <code>U</code>. Using only the stuff I wrote in this blog post, it needs to be <code>only Move</code>, because the result will be moved into the <code>Some</code> value and so forth. But <a href="https://rust-lang.github.io/rust-project-goals/2026/in-place-init.html">in-place-init</a> would allow for this definition to omit the <code>U: only Move</code> bound because we could statically guarantee that the <code>Option</code> will be constructed in place and never moved after that.</p>
<h4><code>Option::or</code> requires <code>only Move + Destruct</code></h4>
<p>The <code>a.or(b)</code> method on <code>Option</code> returns <code>a</code> if it is <code>Some</code> and otherwise returns <code>b</code>. This is an interesting one because the value <code>b</code> may not be used and therefore requires <code>only Move + Destruct</code> bounds.</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">impl</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">only</span><span class="w"> </span><span class="n">Move</span><span class="o">&gt;</span><span class="w"> </span><span class="nb">Option</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">fn</span> <span class="nf">or</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="bp">self</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">alternate</span>: <span class="nb">Option</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">where</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">T</span>: <span class="nc">Destruct</span><span class="p">,</span><span class="w"> </span><span class="c1">// &lt;-- because it may be dropped
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">match</span><span class="w"> </span><span class="bp">self</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nb">Some</span><span class="p">(</span><span class="n">v</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">v</span><span class="p">),</span><span class="w"> </span><span class="c1">// drops `alternate`
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nb">None</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">alternate</span><span class="p">,</span><span class="w"> </span><span class="c1">// moves `alternate`
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h4><code>Rc</code> requires <code>MaybeSized + Leak</code></h4>
<p>The <code>Rc</code> type is an example where we would want to relax bounds from both families:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Rc</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">only</span><span class="w"> </span><span class="n">MaybeSized</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="n">Leak</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span></code></pre></div><p>I believe the proper minimum bounds for <code>Rc</code> are:</p>
<ul>
<li><code>only MaybeSized</code> because while it can store <code>MetadataSized</code> or <code>Sized</code> things, it doesn’t have to, it can also store things of an non-computable size (although it does raise the question of how they would be freed, but that’s an allocator concern).</li>
<li><code>only Leak</code> because <code>Rc</code> values can form cycles and thus we can’t ever guarantee the destructor will be run. Interestingly, <code>Rc&lt;T&gt;</code> can implement <code>Forget</code> even its contents don’t.</li>
</ul>
<h3>Frequently asked questions</h3>
<h4>What is actually under RFC today?</h4>
<p>The post may be a bit confusing here. The <a href="https://github.com/rust-lang/rfcs/pull/3729"><em>current RFC</em></a> is looking only at the proposed “Sized” traits. The <code>Access</code> family is a speculative future extension that we are exploring but at a much earlier stage.</p>
<h4>Can I use <code>only</code> with <em>any</em> trait?</h4>
<p>In the beginning, the plan would be that <code>only</code> can only be used for well-known, <em>default</em> traits (e.g., <code>Move</code>, <code>Sized</code>, etc). In the future though there are some thoughts to generalizing it.</p>
<h4>Why not opt out from <em>all</em> defaults at once?</h4>
<p>An alternative that was proposed is to have the opt-out be per-type-parameter. So you might write something like</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">foo</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">MetadataSized</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="o">?</span><span class="n">default</span><span class="o">&gt;</span><span class="w">
</span></span></span></code></pre></div><p>which would “opt out” from <em>all</em> defaulted bounds. Obviously we’d have to bikeshed the syntax, but ignore that for now. The question is whether opting out of <em>all</em> defaults is better than opting out of a single family. I prefer the per-family option for two reasons:</p>
<ul>
<li>First, things like <code>T: only Move</code> demonstrate that you might very reasonably which to opt out from a single family but retain the default <code>Sized</code> bound. I think it’s likely that there will be many functions that want to opt out of <code>Sized</code> <em>or</em> <code>Forget</code> <em>but not both</em>.
<ul>
<li>You might think that we could make <code>Move: Sized</code> to get the same effect, but I think that would be a mistake. The fact that a value’s size must be computed dynamically doesn’t inherently mean it can’t be moved.</li>
</ul>
</li>
<li>Second, it makes it harder to introduce new families later, if we decide there are other orthogonal properties of values that we’d like to relax.</li>
</ul>
<h4>Why do you think it’s likely that people want to opt out of being <code>Sized</code> <em>xor</em> <code>Forget</code> <em>but not both</em>?</h4>
<p>Because the <code>Forget</code>, <code>Move</code>, and similar traits mostly apply to owned values. The examples we saw with <code>Option&lt;T&gt;</code> were quite typical. And when you are moving values of type <code>T</code> around, you need that <code>T</code> to be <code>Sized</code>.</p>
<h4>But we saw that <code>Rc</code> wanted to opt out of both families with <code>only Leak + only MetadataSized</code>, right?</h4>
<p>Yes, that’s true, and I think that particular combo will be common. I don’t think that’s an argument for the <code>?default</code> approach on its own, though, particularly since that case would not be much cleaner or shorter…</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">impl</span><span class="o">&lt;</span><span class="n">T</span>: <span class="o">?</span><span class="n">default</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">Leak</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">MetadataSized</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span></code></pre></div><p>…what I think that argues for is actually <em>trait aliases and shorthands</em>.</p>
<h4>Wait, trait aliases and shorthands? Can you elaborate?</h4>
<p>Yes! I think that a future RFC could extend only bounds to allow you to define trait aliases with “only bounds” as supertraits:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">trait</span><span class="w"> </span><span class="n">RefCountable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="n">Leak</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="n">MetadataSized</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Equivalent to:
</span></span></span><span class="line"><span class="cl"><span class="c1">// trait RefCountable: only Leak + only MetadataSized {}
</span></span></span><span class="line"><span class="cl"><span class="c1">// impl&lt;T&gt; RefCountable for T where T: only Leak + only MetadataSized {}
</span></span></span></code></pre></div><p>You could then use an <code>only RefCountable</code> bound to define <code>Rc&lt;T&gt;</code>:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">impl</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">only</span><span class="w"> </span><span class="n">Refcountable</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w">
</span></span></span></code></pre></div><p><em>Without the <code>only</code>,</em> <code>T: Refcountable</code> would just be a regular trait bound and would not opt-out from any defaults.</p>
<h4>Can we use a “root” trait to opt out of all defaults?</h4>
<p>Yes, we could! You could define an alias like <code>Value</code>:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">trait</span><span class="w"> </span><span class="n">Value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="n">Access</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">only</span><span class="w"> </span><span class="n">MaybeSized</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><p>Since <code>Access</code> and <code>MaybeSized</code> are both implemented for all types, this effectively becomes part of both families:</p>
<pre class="mermaid">flowchart TD
  subgraph All["All default families"]
  subgraph A["Access family"]
    Forget[["Forget (default)"]] -- extends --&gt; Leak
    Leak -- extends --&gt; Destruct
    Destruct -- extends --&gt; Access
    Move[["Move (default)"]] -- extends --&gt; Access
  end

  subgraph S["MaybeSized family"]
    Sized[["Sized (default)"]] -- extends --&gt; MetadataSized
    MetadataSized -- extends --&gt; MaybeSized
  end

  Access -- extends --&gt; Value
  MaybeSized -- extends --&gt; Value
  end
  </pre>
<p>Then you can do <code>T: only Value</code> and opt out from both families at once.</p>
<h4>If we did that, what would happen if we wanted to add a new family in the future?</h4>
<p>Ay, there’s the rub. If we wish to add a new family in the future, let’s say for values that don’t live in the same memory space (<code>T: only Distributed</code>…?), then <code>Value</code> would be “out of date” because code written against <code>Value</code> would still be assuming uni-memory-space values. But we could make <code>Value</code> into an edition-dependent alias or something like that, as has been discussed.</p>
<h4>Can we decide whether we want <code>Value</code> later?</h4>
<p>Yes! We can introduce a root trait at any time. So we can add the <code>Sized</code>-ness family first, then the <code>Access</code> family, and then see how we feel. Maybe we find people are very commonly opting out of both– in which case, some aliases are useful, or perhaps a <code>Value</code> variant.</p>
<p>The only way we might “regret” it is if, in practice, people usually just opted out of both and then opted back in to what they want specifically. But we already know that <code>T: only Move</code> will be common and clearly <code>T: only Value + Move + Sized</code> is more awkward in that case, so I don’t consider that very likely.</p>
<h4>Why the name <code>Destruct</code> and not <code>Drop</code>?</h4>
<p>That name comes from the <code>const trait</code> RFC. There are a few reasons to move away from <code>Drop</code>. The first is that it is possible to have a destructor even if you don’t implement <code>Drop</code>: <code>Drop</code> really refers to <em>user-provided logic</em> in the destructor, but the compiler adds its own logic (“drop glue”, it’s sometimes called) to drop all the fields in the value. The second reason is that the <code>Drop</code> trait itself needs some revision, so moving away from that name lets us have other ways to specify custom logic (e.g., pinned self, or by-value, etc etc).</p>
<h4>How does this interact with <code>const</code> traits anyway?</h4>
<p>Quite beautifully! In fact, the proposal from Arm for SVE is to introduce the idea of <code>T: const Sized</code> being “a type whose size can be computed at compilation time”, which I find quite elegant. Similarly <code>T: const Destruct</code> was proposed by the const RFC as a way to say that a value has a constant destructor.</p>
<h4>It’s annoying to write <code>T: only Move + Destruct</code>. Couldn’t we have <code>Destruct</code> imply <code>Move</code> so that I can just write <code>T: only Destruct</code>?</h4>
<p>My original proposal for introducing linear types had <code>Destruct</code> extending <code>Move</code>. This would mean that the <code>Option::or</code> proposal could simply do <code>U: only Destruct</code> and not <code>U: only Move + Destruct</code>. However, Alice Ryhl and others pointed out that there are immovable types that must nonetheless be destructed, so it doesn’t make sense to combine those.</p>
<h4>Where can I learn more?</h4>
<p>The <a href="https://rust-lang.github.io/rust-project-goals/2026/scalable-vectors.html">Project Goal</a> has a lot of details. The latest updates are available on the <a href="https://github.com/rust-lang/rust/issues/144404">tracking issue</a>. If you like watching videos, I recommend David Wood’s <a href="https://youtu.be/dngSPnu-B10">Rust Nation talk</a>.</p>
<h3>Conclusion</h3>
<p>I want to close with a meta-observation and a big shout-out to the Arm team. I think they are showing how awesome open-source can be. The Arm team’s primary motivation is adding support for Scalable Vector Extension. This helps Rust make full use of Arm processors. This is, in and of itself, a laudable goal, and valuable to Rust: One of Rust’s assets, in my view, is that it gives you access to all the power your processor has to provide, and that should include unique extensions.</p>
<p>But rather than add the feature as a kind of special-case extension to Rust, the Arm team is going further and driving a general purpose improvement, one that will unlock a bunch of other features (extern types and, to some extent, guaranteed destructors; guaranteed destructores themselves unlock scoped async threads and better Wasm integration). I love that.</p>
<div class="footnotes">
<hr/>
<ol>
<li id="fn:1">
<p>In fact, I recall that in one of my blog posts I proposed writing <code>""</code> as the way to spell <code>&amp;str</code>. I kinda wish we had done that just for the sheer wackiness of it (<code>fn foo(name: "")</code>). <a class="footnote-backref" href="https://smallcultfollowing.com/babysteps/atom.xml#fnref:1">↩︎</a></p>
</li>
<li id="fn:2">
<p>I prefer names that refer to the <em>operations</em> that can be performed on the values, so e.g. instead of <code>MetadataSized</code> I would prefer <code>SizeOfVal</code>, since it means that you can invoke the <code>std::mem::size_of_val</code> function on it. <a class="footnote-backref" href="https://smallcultfollowing.com/babysteps/atom.xml#fnref:2">↩︎</a></p>
</li>
<li id="fn:3">
<p>Little logic pun there for you. <a class="footnote-backref" href="https://smallcultfollowing.com/babysteps/atom.xml#fnref:3">↩︎</a></p>
</li>
</ol>
</div></div>
    </content>
    <updated>2026-06-09T09:04:17Z</updated>
    <published>2026-06-09T00:00:00Z</published>
    <category label="Revisiting Sizedness" scheme="https://smallcultfollowing.com/babysteps/series/revisiting-sizedness" term="revisiting-sizedness"/>
    <source>
      <id>https://smallcultfollowing.com/babysteps/</id>
      <author>
        <name>Niko Matsakis</name>
        <email>rust@nikomatsakis.com</email>
      </author>
      <link href="https://smallcultfollowing.com/babysteps/" rel="alternate" title="html" type="text/html"/>
      <link href="https://smallcultfollowing.com/babysteps/index.xml" rel="alternate" title="rss" type="application/rss+xml"/>
      <link href="https://smallcultfollowing.com/babysteps/atom.xml" rel="self" title="atom" type="application/atom+xml"/>
      <title xml:lang="en-us">baby steps</title>
      <updated>2026-06-09T11:59:13Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148601</id>
    <link href="https://discourse.mozilla.org/t/mozphab-2-15-2-released/148601" rel="alternate" type="text/html"/>
    <title>MozPhab 2.15.2 Released</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Bugs resolved in Moz-Phab 2.15.2:</p>
<ul>
<li><a href="https://bugzilla.mozilla.org/2004368">bug 2004368</a> moz-phab patch -a here with jj says there is no source tree if jj config is broken</li>
<li><a href="https://bugzilla.mozilla.org/2035900">bug 2035900</a> Investigate setting up <a href="http://CodSpeed.io" rel="noopener nofollow ugc">CodSpeed.io</a> for <code>moz-phab</code></li>
<li><a href="https://bugzilla.mozilla.org/2044857">bug 2044857</a> <code>patch --raw</code> leaks a global logger level, causing order-dependent test failures</li>
</ul>
<p>Discuss these changes in <span class="hashtag-raw">#engineering-workflow</span> on Slack or <span class="hashtag-raw">#Conduit</span> Matrix.</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/mozphab-2-15-2-released/148601">Read full topic</a></p></div>
    </summary>
    <updated>2026-06-08T18:41:50Z</updated>
    <published>2026-06-08T18:41:50Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>sheehan</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/mozphab-2-15-2-released/148601.rss" title="MozPhab 2.15.2 Released"/>
      <updated>2026-06-12T10:58:52Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=86052</id>
    <link href="https://blog.mozilla.org/en/firefox/firefox-world-cup/" rel="alternate" type="text/html"/>
    <title>Make Firefox your World Cup sidekick this summer</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Your browser tabs say a lot about your life: work projects, vacation plans, shopping carts and all the rabbit holes in between. Add the world’s biggest soccer tournament to the mix, and your browser is suddenly juggling scores to check, streams to watch, lineups to scan and group chats to keep up with. And since […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-world-cup/">Make Firefox your World Cup sidekick this summer</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><figure class="wp-block-image size-large"><img alt="Firefox fox mascot balances soccer ball beside live World Cup match score widget." class="wp-image-86064" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/Distilled_FxWC_Header-1024x576.jpg" width="1024"/></figure>



<p>Your browser tabs say a lot about your life: work projects, vacation plans, shopping carts and all the rabbit holes in between.</p>



<p>Add the world’s biggest soccer tournament to the mix, and your browser is suddenly juggling scores to check, streams to watch, lineups to scan and group chats to keep up with. And since many matches kick off during the workday, there will be lots of temptation to just sneak a peek at the action between meetings.</p>



<p>Firefox is built to be your ultimate second screen. When the tournament is on, keep Firefox open to follow the action, keep up with the conversation, and stay on top of everything else happening online – whether you’re watching from the couch or checking in on your mobile device on the go.</p>



<p>You’ll find a World Cup widget, custom wallpapers, and game-day multitasking tools. Plus, Firefox is teaming up with Trevor Noah, a soccer superfan, as he hosts live watch parties for the tournament moments everyone will be talking about. </p>



<h3>Your second screen for every match</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img alt="Firefox mobile World Cup widget lets fans follow teams and countdown to kickoff." class="wp-image-86086" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/Distilled_FxWC_Widget-1024x576.jpg" style="width: 675px;" width="1024"/></figure></div>


<p>When the action is happening fast, keeping up should be as easy as opening a new tab.<br/><br/>Firefox’s World Cup widget gives you the latest tournament updates every time you open a new tab (and you can turn it off anytime). With key match information always within easy reach, it’s easy to stay on top of the action without bouncing between apps or having to browse around.<br/><br/>You can follow your favorite teams and even customize Firefox with wallpapers that bring big fan vibes to every new tab.</p>



<h3>Game-day pro moves</h3>



<h4>Pin the picture</h4>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img alt="Firefox picture-in-picture window shows fox chasing soccer ball over soccer stats page." class="wp-image-86075" height="2160" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/Distilled_FxWC_PiP.gif" style="width: 675px;" width="3840"/></figure></div>


<p>With picture-in-picture in Firefox, you can detach a video from its tab and pin it anywhere on your screen so you can keep watching while working on other stuff.</p>



<h4>Split the view</h4>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img alt="Firefox Split View shows World Cup widgets beside a sports article in one browser window." class="wp-image-86098" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/Distilled_FxWC_SplitView-1024x576.jpg" style="width: 675px;" width="1024"/></figure></div>


<p>Open two tabs side by side in one window with split view. That way, you can keep live updates on one half and stats, searches or chats on the other.</p>



<h4>Calm the chaos</h4>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img alt="Firefox tab groups organize World Cup fixtures, player stats and soccer resources." class="wp-image-86053" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/Distilled_FxWC_TabGroups-1024x576.jpg" style="width: 675px;" width="1024"/></figure></div>


<p>Remember what we said about your tabs representing your life? While 99 tabs of fandom can make it feel more chaotic, your browser doesn’t have to.</p>



<p>With tab groups in Firefox, you can create separate groups for:</p>



<ul>
<li>soccer matches and live scores</li>



<li>travel plans and itineraries</li>



<li>work or school projects</li>



<li>summer shopping and event planning</li>



<li>weekend inspiration and future adventures</li>
</ul>



<h3>Hang out with Trevor Noah – World Cup and Firefox superfan</h3>



<p>Match days are better with good company. This summer, Firefox is teaming up with Trevor Noah to be his second screen sidekick for his World Cup watch party on YouTube.</p>



<p>Hosted live throughout the tournament, the series will feature Trevor alongside some of his best friends plus celebrity guests as they react to matches, highlights and the internet moments coming out of each day’s games.</p>



<p>Trevor is a longtime Firefox user whose comedy and commentary have explored how technology shapes everyday life. That makes this collaboration feel especially fitting for Mozilla, a company built around the idea that the internet should work better for everyone.</p>



<p>“Events like this are some of the biggest shared experiences on the internet,” said John Solomon, Chief Marketing Officer at Mozilla. “While many people stop their lives for the World Cup, those that can’t follow them while working, traveling, connecting with friends and family, and doing everything else they need to do online. Firefox is built for moments like this, and Trevor is a fitting partner. He’s a longtime Firefox user who believes, like we do, that technology should work for people, helping them stay connected to the moments, information and communities they care about most.”</p>



<p>Make Firefox your World Cup sidekick this summer. Follow the tournament with the World Cup widget, multitask like a pro with picture-in-picture, split view and tab groups, and get into the spirit with custom wallpapers, all in the browser that helps you get more out of every match. </p>



<a class="ft-c-inline-cta" href="https://www.firefox.com/en-US/?redirect_source=mozilla-org&amp;utm_source=blog.mozilla.org&amp;utm_medium=referral&amp;utm_campaign=blog-nav">
  <div class="ft-c-inline-cta__media">
  <img alt="Firefox logo with a soccer ball at the center on a dark purple background" class="attachment-1x1 size-1x1" height="640" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/Firefox_Symbol_SoccerBall-640x640.png" width="640"/>  </div>
  <div class="ft-c-inline-cta__content">
     <h4>Are you game-day ready?</h4>      <span>Download Firefox now</span>   </div>
</a>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-world-cup/">Make Firefox your World Cup sidekick this summer</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-06-08T15:59:22Z</updated>
    <published>2026-06-08T15:59:22Z</published>
    <category term="Firefox"/>
    <category term="Firefox Features"/>
    <category term="homepage"/>
    <author>
      <name>Mozilla</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/en/</id>
      <link href="https://blog.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/en/" rel="alternate" type="text/html"/>
      <subtitle>News and Updates about Mozilla</subtitle>
      <title>The Mozilla Blog</title>
      <updated>2026-06-10T17:43:34Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://bluesock.org/~willkg/blog/dev/bleach_6_4_0_final_release.html</id>
    <link href="https://bluesock.org/~willkg/blog/dev/bleach_6_4_0_final_release.html" rel="alternate" type="text/html"/>
    <title>Bleach 6.4.0 releases -- final release</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><section id="what-is-it">
<h3>What is it?</h3>
<p><a class="reference external" href="https://bleach.readthedocs.io/">Bleach</a> is a Python library for sanitizing
and linkifying text from untrusted sources for safe usage in HTML.</p>
</section>
<section id="bleach-v6-4-0-released">
<h3>Bleach v6.4.0 released!</h3>
<p>Bleach 6.4.0 includes two security fixes, a fix to tinycss2 dependency
requirements, and some other things.</p>
<p>See the changes here:</p>
<p><a class="reference external" href="https://bleach.readthedocs.io/en/latest/changes.html#version-6-4-0-june-5th-2026">https://bleach.readthedocs.io/en/latest/changes.html#version-6-4-0-june-5th-2026</a></p>
</section>
<section id="bleach-v6-4-0-is-the-final-release">
<h3>Bleach v6.4.0 is the final release</h3>
<p>I haven't used Bleach on a project in years, but I still had some time to
maintain it. That changed about a year ago when I got re-orged into a new role
and I haven't had time to do any Bleach work since then.</p>
<p>To recap, Bleach sits on top of
<a class="reference external" href="https://github.com/html5lib/html5lib-python">html5lib</a> which hasn't
been actively maintained in years. It is dangerous to maintain Bleach in that
context.</p>
<p>We vendored html5lib so we could make adjustments to the library to keep Bleach
going. This is not a sustainable approach, but it was ok for the short term.</p>
<p>Over the years, we've talked about other options:</p>
<ol class="arabic simple">
<li><p>find another library to switch to</p></li>
<li><p>take over html5lib development</p></li>
<li><p>fork html5lib and vendor and maintain our fork</p></li>
<li><p>write a new HTML parser</p></li>
<li><p>etc</p></li>
</ol>
<p>None of those are feasible for me.</p>
<p>Bleach has been a solo-maintained project for a while now. The world is crazy
and it's much harder to build a team of trusted maintainers now than it was (or
at least, it sure feels that way). I don't see any possibility of increasing
the maintenance team or passing it to someone else responsibly.</p>
<p>Switching contexts from my regular work to Bleach is really hard. Bleach is
complicated, the problem domain is complicated, and there's a lot of nuanced
context. I can't just switch gears, spend 15 minutes on Bleach to do something,
and then switch back to the rest of my day. I periodically get nag messages
about this which are entirely valid, but there's nothing I can do about it.
It doesn't feel great.</p>
<p>Then in 2025, Emil, a long-time Bleach contributor, built
<a class="reference external" href="https://emilstenstrom.github.io/justhtml/">justhtml</a> which gives us an easy
migration path off of Bleach. He even took the time to write a
<a class="reference external" href="https://emilstenstrom.github.io/justhtml/bleach-migration.html">migration guide</a>.</p>
</section>
<section id="thoughts-and-statistics">
<h3>Thoughts and statistics</h3>
<p>In 2019, when I stepped down the first time, I wrote
<a class="reference external" href="https://bluesock.org/~willkg/blog/dev/bleach_stepping_down.html">a post on stepping down</a>.</p>
<p>In 2023, when I deprecated the project, I wrote
<a class="reference external" href="https://bluesock.org/~willkg/blog/dev/bleach_6_0_0_deprecation.html">a post on Bleach 6.0.0 and deprecation</a>.</p>
<ul class="simple">
<li><p>From the first commit on 2010-02-18 to today's final commit on 2026-06-05,
the Bleach project lasted 16 years, 3 months — 5,951 days, or about 16.29
years.</p></li>
<li><p>There were 64 releases.</p></li>
<li><p>There were roughly 960 commits.</p>
<ul>
<li><p>From 80 roughly contributors</p></li>
<li><p>Top 3:</p>
<ul>
<li><p>Will Kahn-Greene: 462</p></li>
<li><p>James Socol: 182</p></li>
<li><p>Greg Guthe: 133</p></li>
</ul>
</li>
</ul>
</li>
<li><p>Roughly 5,040 lines of Python code excluding the vendored html5lib.</p></li>
<li><p>I was maintainer from October 2015 to now--that's a little under 11 years.</p></li>
</ul>
<p>It feels weird to end a project that's outlived many of the Mozilla sites and
Python web frameworks it was designed to protect.</p>
</section>
<section id="what-happens-now">
<h3>What happens now?</h3>
<p>This is the end of the project.</p>
<figure>
<a class="reference external image-reference" href="https://bluesock.org/~willkg/blog/images/bleach_deprecation.jpg">
<img alt="/images/bleach_deprecation.thumbnail.jpg" src="https://bluesock.org/~willkg/blog/images/bleach_deprecation.thumbnail.jpg"/>
</a>
<figcaption>
<p>Bleach. Last release.</p>
</figcaption>
</figure>
<p>If you're still using Bleach, I think you have three options:</p>
<ol class="arabic simple">
<li><p><strong>End your project.</strong> Maybe you don't need to be maintaining your thing
anymore? Use Bleach as your reason to exit and do something different with
your time on Earth.</p></li>
<li><p><strong>Switch to the sanitizer API.</strong> Rework your project to use the sanitizer API.</p>
<ul class="simple">
<li><p>Spec: <a class="reference external" href="https://wicg.github.io/sanitizer-api/">https://wicg.github.io/sanitizer-api/</a></p></li>
<li><p>Docs: <a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/Element/setHTML">https://developer.mozilla.org/en-US/docs/Web/API/Element/setHTML</a></p></li>
</ul>
</li>
<li><p><strong>Swap Bleach out for justhtml.</strong> Emil provided a
<a class="reference external" href="https://emilstenstrom.github.io/justhtml/bleach-migration.html">migration guide</a>
for switching from Bleach to justhtml.</p></li>
</ol>
<p>Good luck with whatever option you choose!</p>
</section>
<section id="thanks">
<h3>Thanks!</h3>
<p>Many thanks to <a class="reference external" href="https://github.com/jsocol">James</a> who created Bleach and
gave it a set of first principles that guided our choices for 16 years.</p>
<p>Many thanks to <a class="reference external" href="https://github.com/g-k">Greg</a> who I worked with on Bleach
for a long while and maintained Bleach for several years. Working with Greg was
always easy and his reviews were thoughtful and spot-on.</p>
<p>Many thanks to <a class="reference external" href="https://github.com/EmilStenstrom">Emil</a> who was
a contributor to Bleach for a long while and created
<a class="reference external" href="https://emilstenstrom.github.io/justhtml/">justhtml</a>
providing Bleach users a migration path.</p>
<p>Many thanks to <a class="reference external" href="https://github.com/jvanasco">Jonathan</a> who, over the years,
provided a lot of insight into how best to solve some of Bleach's more
squirrely problems.</p>
<p>Many thanks to <a class="reference external" href="https://github.com/gsnedders">Sam</a> who was an indispensible
resource on HTML parsing and sanitizing text in the context of HTML.</p>
<p>Many thanks to all the users and contributors of Bleach!</p>
</section>
<section id="where-to-go-for-more">
<h3>Where to go for more</h3>
<p>For more specifics on this release, see here:
<a class="reference external" href="https://bleach.readthedocs.io/en/latest/changes.html#version-6-4-0-june-5th-2026">https://bleach.readthedocs.io/en/latest/changes.html#version-6-4-0-june-5th-2026</a></p>
<p>Documentation and quickstart here:
<a class="reference external" href="https://bleach.readthedocs.io/en/latest/">https://bleach.readthedocs.io/en/latest/</a></p>
<p>Source code and issue tracker here:
<a class="reference external" href="https://github.com/mozilla/bleach/">https://github.com/mozilla/bleach/</a></p>
</section></div>
    </summary>
    <updated>2026-06-05T13:00:00Z</updated>
    <published>2026-06-05T13:00:00Z</published>
    <category term="bleach"/>
    <category term="dev"/>
    <category term="mozilla"/>
    <category term="python"/>
    <category term="story"/>
    <author>
      <name>Will Kahn-Greene</name>
    </author>
    <source>
      <id>https://bluesock.org/~willkg/blog/</id>
      <link href="https://bluesock.org/~willkg/blog/" rel="alternate" type="text/html"/>
      <link href="https://bluesock.org/~willkg/blog/tag/mozilla.xml" rel="self" type="application/rss+xml"/>
      <rights type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Contents © 2026 <a href="mailto:willkg@bluesock.org">Will Kahn-Greene</a> CC BY-SA 3.0</div>
      </rights>
      <title>Will's Blog (Posts about mozilla)</title>
      <updated>2026-06-05T13:54:02Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.nightly.mozilla.org/?p=2076</id>
    <link href="https://blog.nightly.mozilla.org/2026/06/03/more-kit-more-control-these-weeks-in-firefox-issue-203/" rel="alternate" type="text/html"/>
    <title>More Kit, More Control – These Weeks in Firefox: Issue 203</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Highlights James enabled adaptive autofill in Nightly for testing, which we believe should provide better results in the URL bar when doing autocomplete! Jack updated the illustrations shown on some … <a class="go" href="https://blog.nightly.mozilla.org/2026/06/03/more-kit-more-control-these-weeks-in-firefox-issue-203/">Read more</a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><h3>Highlights</h3>
<ul>
<li>James <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2032547">enabled adaptive autofill in Nightly</a> for testing, which we believe should provide better results in the URL bar when doing autocomplete!</li>
<li>Jack <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031837">updated the illustrations shown on some of our error pages</a> to match the latest approved designs, giving users more polished artwork when the browser encounters connection or security errors!</li>
</ul>
<p><img alt="Internet connection error page with an adorable Kit illustration" class="aligncenter wp-image-2080 size-full" height="652" src="https://blog.nightly.mozilla.org/files/2026/06/image2-1.png" width="1584"/></p>
<ul>
<li>Controls for the Memories feature <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2032998">can now be set during Smart Window onboarding</a></li>
</ul>
<p><img alt="Two radio button controls for the Smart Window Memories feature, including &quot;Chats in Smart Window&quot; and &quot;Browsing across Firefox&quot;" class="aligncenter wp-image-2078 size-full" height="546" src="https://blog.nightly.mozilla.org/files/2026/06/image4-1-e1780509799577.png" width="500"/></p>
<p> </p>
<ul>
<li>We’ve disabled the CSS filter implicitly applied to WebExtension pageAction SVG icons across all release channels starting in Firefox 152, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2016509">completing the deprecation</a>
<ul>
<li><b>NOTE:</b> The blog post published at<a href="https://blog.mozilla.org/addons/2026/04/23/webextensions-api-changes-firefox-149-152/"> WebExtensions API changes in Firefox 149-152</a> provides to extensions developers more details about this deprecation and links to the related MDN docs.</li>
</ul>
</li>
</ul>
<h3>Friends of the Firefox team</h3>
<h4><a href="https://bugzilla.mozilla.org/buglist.cgi?title=Resolved%20bugs%20(excluding%20employees)&amp;quicksearch=2031599%2C2033820%2C2034178%2C1930213%2C2035355%2C1611643%2C2020302%2C2026007%2C2031015%2C2035252%2C2036528%2C411384%2C2033780%2C2036199%2C1812100%2C1898257%2C2030070%2C2030072">Resolved bugs (excluding employees)</a></h4>
<p><a href="https://github.com/niklasbaumgardner/NewContributorScraper">Script to find new contributors from bug list</a></p>
<h4>Volunteers that fixed more than one bug</h4>
<ul>
<li>Amin Amir</li>
<li>Pranjali Srivastava</li>
<li>Sam Johnson</li>
</ul>
<h4>New contributors (🌟 = first patch)</h4>
<ul>
<li> 🌟:23rd: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1812100">Regression: The new swipe-to-navigation indicator stucks for a moment, when deciding not to navigate the other page</a></li>
<li>🌟Akeem Omosanya: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035252">Remove commented-out code in SearchService.sys.mjs</a></li>
<li>Amin Amir:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031599">Fix browsingContext.sys.mjs to assign to #contextCreatedHandled instead of contextCreatedHandled</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033820">Fix missing WITHOUT ROWID SQLite performance optimization in SERPCategorization.sys.mjs</a></li>
</ul>
</li>
<li>🌟Sahaj: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031015">Suggest the default target language for translation after changing the detected source language</a></li>
<li>🌟JIANG Zhirui: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2036199">Breakpad build failed on Windows using VS2026 due to removal of stdext</a></li>
<li> John Iweh: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030072">Add “Open in New Tab” and “Open in New Container Tab” options to the context menu for Tabs from Other Devices</a></li>
<li>Jak: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030070">Bookmarks and History – should respect the “When you open a link, image or media in a new tab, switch to it immediately” setting</a></li>
<li>🌟Andy [:rgbcmy]: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1611643">Autoplayed next video should also be PIP</a></li>
<li> konyhéa: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1930213">“Escape” key should collapse the expanded on hover sidebar launcher even if hover is still active.</a></li>
<li> Pranjali Srivastava:
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1898257">Remove icon property from sidebar extensions</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026007">Show language-agnostic SelectTranslations context menu item when the source and target languages are the same</a></li>
</ul>
</li>
</ul>
<h3>Project Updates</h3>
<h4>Add-ons / Web Extensions</h4>
<h5>Addon Manager &amp; about:addons</h5>
<ul>
<li>Fixed long-standing regression on the autocomplete and datalist popups for extension inline options pages on about:addons (introduced in Firefox 68 by<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1532724"> Bug 1532724</a>, fix shipping in Firefox 152) –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1595158"> Bug 1595158</a></li>
</ul>
<h5>WebExtensions Framework</h5>
<ul>
<li>Fixed access to web-accessible resources declared with &lt;all_urls&gt; from sandboxed documents (null-principal URLs), restoring extension redirects from the context-menu search flow, starting in Firefox 152 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033905"> Bug 2033905</a></li>
</ul>
<h5>WebExtension APIs</h5>
<ul>
<li>Added exhaustive test coverage for tabs.move() against additional edge cases related to split-view tabs –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029092"> Bug 2029092</a></li>
</ul>
<h4>DevTools</h4>
<ul>
<li>Andreas Farre improved the Session History tab in the Application panel (still behind devtools.application.sessionHistory.enabled)
<ul>
<li>added support for remote debugging (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2014064">#2014064</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2016121">#2016121</a>)</li>
<li>made sure that calls to History.replaceState are reflected in the UI (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2037359">#2037359</a>)</li>
</ul>
</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=559949">Julian Descottes [:jdescottes]</a> fixed the most frequent DevTools crash we were observing in Telemetry, adding a guard against IDBTransaction errors when retrieving breakpoints in the Debugger (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030260">#2030260</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> fixed the image preview tooltip for relative URLs images in constructed stylesheet (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035503">#2035503</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=559949">Julian Descottes [:jdescottes]</a> reduced the overhead we had because of network requests monitoring by only decoding response content when the user actually want to see the response (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026228">#2026228</a>)</li>
</ul>
<h4>WebDriver</h4>
<ul>
<li>Amin Amir cleaned up an <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031599">incorrect variable assignment</a> in our browsingContext module.</li>
<li>Logan Rosen <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2036603">updated stale references and broken links</a> in our documentation about Marionette.</li>
<li>Sameem improved the Marionette and WebDriver BiDi <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2020302">screenshot commands to enforce maximum allowed dimensions</a>.</li>
<li>Leo McArdle fixed <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030964">the regression in the “log.entryAdded” event, which lacked an error message in the “text” field for the messages of type “error”</a>.</li>
<li>Henrik Skupin fixed an issue in Marionette where <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033769">WebDriver:Navigate and WebDriver:Refresh did not handle errors</a> when the underlying navigation failed.</li>
<li>Henrik Skupin <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1839953">improved geckodriver to detect an early Firefox exit during startup on Android</a>, avoiding up to 60 seconds of unnecessary connection attempts.</li>
<li>Henrik Skupin updated the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028933">geckodriver CI build job to produce a universal macOS binary</a> supporting both x64 and aarch64.</li>
</ul>
<h4>Lint, Docs and Workflow</h4>
<ul>
<li>Sylvestre <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2023411">ported some linters</a> (e.g. file-whitespace, test-manifest-toml, license, file-perm, rejected-words &amp; more) to Rust to help improve the runtime of the code review bot.</li>
<li>Dale has been working on migration to moz-src for <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2034040">customkeys</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035086">dom/quota</a> and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035295">odom/geolocation</a>
<ul>
<li><a href="https://arewemozsrcyet.com/">https://arewemozsrcyet.com/</a></li>
</ul>
</li>
</ul>
<h4>New Tab Page</h4>
<ul>
<li>We did our first region-specific trainhop on May 11th (just 15% of the US), and turned on HNT Nova (and sometimes Widgets) for those clients to get some advance-data of its behaviour in the wild! A note that HNT Nova gets turned on for everybody when Firefox 151 ships on May 19th.
<ul>
<li>We’ll be launching a similar experiment in the DE, probably on May 12th, also at 15% population.</li>
</ul>
</li>
<li>Most of the team is heads down building out a sports-tracking widget, attempting to get that ready in time to be generally available for the upcoming World Cup event.</li>
<li>Dre landed a new world clock widget, which is currently off by default, but pretty snazzy!</li>
</ul>
<p><img alt="World clock widget in New Tab featuring different time zones for YTO, BER, SYD, and LAX." class="aligncenter wp-image-2079 size-full" height="162" src="https://blog.nightly.mozilla.org/files/2026/06/image3-1.png" width="346"/></p>
<h4>Search and Urlbar</h4>
<ul>
<li>Nova (URL Bar Design Refresh)
<ul>
<li>Drew and Daisuke continued their work on <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2015612">Nova styling for the Address bar</a> (input and view).</li>
</ul>
</li>
<li>Search and Suggest
<ul>
<li>Drew finalized two bugs for World Cup and sports suggestions, which were landed and uplifted: one to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035322">update the localization string for scheduled games</a> and another to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2034350">show both teams’ icons in suggestions</a>. Drew also landed and uplifted a fix for <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035353">rich search suggestion icons being forced into a square aspect ratio</a>.</li>
<li>Standard8 updated Ecosia favicons to the latest branding, including QA testing and publishing.</li>
</ul>
</li>
<li>Settings Redesign (SRD)
<ul>
<li>Stephanie landed a test to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2021512">ensure search suggestion settings are hidden when quicksuggest is disabled</a>, as well as a patch to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031341">resolve TypeScript issues</a> in search.mjs, and is adding test coverage to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2007397">confirm removed search engines are not displayed in the default engines dropdown</a>.</li>
</ul>
</li>
<li>General URL Bar and Component Updates
<ul>
<li>Daisuke landed implementation of the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1893083">context menu on URL bar results</a>, and a fix to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2020177">show the loading URL in the URL bar when starting up with a homepage</a>.
<ul>
<li>Marco is working on several tasks, including a <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1756564">PDF download / focus stealing issue</a> and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1924124">allowing arrays to be bound in Sqlite.sys.mjs</a>. Marco also worked on fixes related to Places, such as <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2034743">avoiding replacing the favicons database if it is not corrupt</a>.</li>
</ul>
</li>
<li>Standard8 finalized the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028423">URL bar test manifest split</a>. Standard8 also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2016401">upgraded us to TypeScript 6</a>.</li>
<li>Moritz landed a fix for URL bar abandonment telemetry being recorded when clicking an engine in the unified search button popup (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2032973">Bug 2032973</a>), which was also uplifted. Moritz also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2034507">simplified search mode switcher item activation in tests</a>, and made it so that <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2036030">the unified search button popup closes when installing an open search engine</a>.</li>
</ul>
</li>
</ul>
<h4>Smart Window</h4>
<ul>
<li>natural language starting with tab close/undo <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035343">2035343</a> with expandable action log <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031508">2031508</a></li>
</ul>
<p><img alt="Tab close and undo actions in Smart Window accompanied by an expandable log of actions taken" class="aligncenter wp-image-2077 size-full" height="256" src="https://blog.nightly.mozilla.org/files/2026/06/image1-1.png" width="220"/></p>
<ul>
<li>assistant rendering feedback up/down <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2032994">2032994</a> and markdown table <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027029">2027029</a></li>
<li>nova styling blur <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027877">2027877</a> and suggestions <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026823">2026823</a></li>
<li>accessibility screen reader <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028676">2028676</a> and keyboard focus <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2037565">2037565</a></li>
<li>optimize conversation starters extra requests <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030005">2030005</a> and caching <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033430">2033430</a></li>
</ul>
<h4>Storybook/Reusable Components/Acorn Design System</h4>
<ul>
<li>Nova token updates occasionally, focused on SRD</li>
</ul>
<h4>UX Fundamentals</h4>
<ul>
<li>Added support for the “SEC_ERROR_CA_CERT_INVALID” certificate error to the Felt Privacy error pages. – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035942">2035942</a></li>
</ul>
<h4>Settings Redesign</h4>
<ul>
<li>Settings redesign is being tested and will hopefully go out in Firefox 152!</li>
</ul>
<ul>
<li/>
</ul></div>
    </content>
    <updated>2026-06-03T18:27:38Z</updated>
    <published>2026-06-03T18:27:38Z</published>
    <category term="News"/>
    <author>
      <name>Katherine Patenio</name>
    </author>
    <source>
      <id>https://blog.nightly.mozilla.org</id>
      <logo>https://blog.nightly.mozilla.org/files/2024/04/cropped-Fx-Browser-Nightly-icon-fullColor-512-32x32.png</logo>
      <link href="https://blog.nightly.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.nightly.mozilla.org" rel="alternate" type="text/html"/>
      <subtitle>Let's improve quality, build after build!</subtitle>
      <title>Firefox Nightly News</title>
      <updated>2026-06-03T18:27:38Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:this-week-in-rust.org,2026-06-03:/blog/2026/06/03/this-week-in-rust-654/</id>
    <link href="https://this-week-in-rust.org/blog/2026/06/03/this-week-in-rust-654/" rel="alternate" type="text/html"/>
    <title>This Week in Rust 654</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social …</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social, or
<a href="https://github.com/rust-lang/this-week-in-rust">send us a pull request</a>.
Want to get involved? <a href="https://github.com/rust-lang/rust/blob/main/CONTRIBUTING.md">We love contributions</a>.</p>
<p><em>This Week in Rust</em> is openly developed <a href="https://github.com/rust-lang/this-week-in-rust">on GitHub</a> and archives can be viewed at <a href="https://this-week-in-rust.org/">this-week-in-rust.org</a>.
If you find any errors in this week's issue, <a href="https://github.com/rust-lang/this-week-in-rust/pulls">please submit a PR</a>.</p>
<p>Want TWIR in your inbox? <a href="https://this-week-in-rust.us11.list-manage.com/subscribe?u=fd84c1c757e02889a9b08d289&amp;id=0ed8b72485">Subscribe here</a>.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4>


<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#foundation">Foundation</a></h5>
<ul>
<li><a href="https://rustfoundation.org/media/help-fund-the-people-who-build-rust/">Help Fund the People Who Build Rust - The Rust Foundation</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#official">Official</a></h5>
<ul>
<li><a href="https://blog.rust-lang.org/2026/06/02/launching-the-rust-foundation-maintainers-fund">Launching the Rust Foundation Maintainers Fund</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://blog.nlnetlabs.nl/one-year-of-roto-the-compiled-scripting-language-for-rust/">One year of Roto, the compiled scripting language for Rust</a></li>
<li><a href="https://crowecawcaw.github.io/general/2026/05/30/accessibility-for-computer-use.html">xa11y: cross-platform desktop automation via native accessibility APIs</a></li>
<li><a href="https://github.com/squidowl/halloy/releases/tag/2026.7">halloy 2026.7 - now supports IRCv3 reply, redact, metadata, bot mode and more!</a></li>
<li><a href="https://vorojar.github.io/md-preview/rust-webview-ai-docs.html">Building a Native Markdown Previewer for AI-Generated Docs with Rust and WebView</a></li>
<li><a href="https://lwn.net/SubscriberLink/1075067/6e0bbea2010794b8/">BPF in the agentic era</a></li>
<li><a href="https://grpc.io/blog/grpc-rust-roadmap/">gRPC-Rust Roadmap</a></li>
<li><a href="https://trifectatech.org/blog/announcing-zstandard-in-rust/">Announcing Zstandard in Rust</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5>
<ul>
<li><a href="https://medium.com/@carlmkadie/nine-ways-to-do-inheritance-in-rust-a-language-without-inheritance-14825bf1e215?v=1">Nine Ways to Do Inheritance in Rust, a Language Without Inheritance</a></li>
<li><a href="https://kerkour.com/async-rust-cooperative-scheduling-tokio">Async Rust: deep dive into cooperative scheduling and Tokio's architecture</a></li>
<li><a href="https://joshlf.com/posts/memory-safety-life-and-death/">Memory safety is a matter of life and death | joshlf.com</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5>
<ul>
<li><a href="https://rustarians.com/r1cs-plonkish-air">ZK snarks for Rust developers: R1CS vs Plonkish vs AIR</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-rust-closures-by-building-a-tiny-linter/">Learn Rust Closures By Building a Tiny Rule-Based Linter</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-bevy-states-timers-by-building-snake/">Learn Bevy States, Timers, and Grid Movement by Building Snake</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=WTmjbKk1EIk">RustCurious lesson 8: Generics and Monomorphization</a></li>
<li><a href="https://blog.arnedebo.com/posts/a-grammar-first-approach-to-parser-combinators/">A Grammar-First Approach to Parser Combinators in Rust</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#research">Research</a></h5>
<ul>
<li><a href="https://www.deepcausality.com/blog/counterfactuals-via-the-causal-monad/">Counterfactuals via the Causal Monad in Rust</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#crate-of-the-week">Crate of the Week</a></h4>
<p>This week's crate is <a href="https://github.com/manuelgdlvh/remyx">remyx</a>, a framework for building TUIs on top of Ratatui.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1608">Manuel Garcia de la Vega</a> for the self-suggestion!</p>
<p><a href="https://users.rust-lang.org/t/crate-of-the-week/2704">Please submit your suggestions and votes for next week</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#calls-for-testing">Calls for Testing</a></h4>
<p>An important step for RFC implementation is for people to experiment with the
implementation and give feedback, especially before stabilization.</p>
<p>If you are a feature implementer and would like your RFC to appear in this list, add a
<code>call-for-testing</code> label to your RFC along with a comment providing testing instructions and/or
guidance on which aspect(s) of the feature need testing.</p>
<p><em>No calls for testing were issued this week by
<a href="https://github.com/rust-lang/rust/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rust</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/rustup/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rustup</a> or
<a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing%20state%3Aopen">Rust language RFCs</a>.</em></p>
<p><a href="https://github.com/rust-lang/this-week-in-rust/issues">Let us know</a> if you would like your feature to be tracked as a part of this list.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#call-for-participation-projects-and-speakers">Call for Participation; projects and speakers</a></h4>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-projects">CFP - Projects</a></h5>
<p>Always wanted to contribute to open-source projects but did not know where to start?
Every week we highlight some tasks from the Rust community for you to pick and get started!</p>
<p>Some of these tasks may also have mentors available, visit the task page for more information.</p>



<ul>
<li><a href="https://github.com/vorojar/md-preview/issues/19">MD Preview - Package MD Preview for Homebrew Cask</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/7">OpenSlate - Test Health Check Endpoint</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/8">OpenSlate - Test Login Endpoint</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/9">OpenSlate - Test Notes CRUD Endpoint</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/10">OpenSlate - Test Search Endpoint</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/11">OpenSlate - Test Preference Endpoint</a></li>
</ul>
<p>If you are a Rust project owner and are looking for contributors, please submit tasks <a href="https://github.com/rust-lang/this-week-in-rust?tab=readme-ov-file#call-for-participation-guidelines">here</a> or through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-events">CFP - Events</a></h5>
<p>Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.</p>



<ul>
<li><a href="https://scientificcomputing.rs/2026/submit-talk"><strong>Scientific Computing in Rust 2026</strong></a>| 2026-06-05 | Virtual | 2026-07-08 - 2026-07-10</li>
</ul>
<p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4>
<p>500 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-05-26..2026-06-02">merged in the last week</a></p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/156649">expand async drops during drop elaboration</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156642"><code>offload_kernel</code> macro expansion</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/154835"><code>std::offload</code> sharedmem</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#library">Library</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/156390">constify Iterator-related methods and functions</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155849">move <code>IoSlice</code> and <code>IoSliceMut</code> to <code>core::io</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156634">specialize Clone of array IntoIter</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157065">stabilize <code>Path::is_empty</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156867">stop needing an alloca for <code>catch_unwind</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/cargo/pull/17033"><code>diag</code>: Add the <code>'cargo::default'</code> group</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17034"><code>diag</code>: Report summaries for <code>unused_deps</code></a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17025">add <code>--output-format=json</code> to cargo doc as an unstable option</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17038">add edition for scripts anytime we mutate the manifest</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rustdoc">Rustdoc</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/156851">avoid ICE when rendering body-less type consts</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157039">correctly propagate cfgs for glob reexports</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156401">deterministic sorting for <code>doc_cfg</code> badges</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157223">fix ICE on delegated async functions</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157179">optimize impl sorting</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157171">separate the caches for synthetic auto trait &amp; blanket impls</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16244">add <code>unused_async_trait_impl</code> lint</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16257">add new lint: <code>for_unbounded_range</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16052">added new lint for <code>map_or(..., identity)</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17116"><code>redundant_pattern_match</code>: improve suggestions</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17112">faster <code>has_arg</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17132">fold all early lint passes into one statically-combined pass</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17124">fold all late lint passes into one statically-combined pass</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17134">memoize <code>first_node_in_macro</code> for consecutive queries</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17126">skip disabled off-by-default doc reparses</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-analyzer">Rust-Analyzer</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22500">always use crates from sysroot in proc-macro-srv</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22504">enable salsa feature for syntax-bridge</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22498">also consider library features internal</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22508">do not fill both <code>drop()</code> and <code>pin_drop()</code> in the "fill missing members" assist</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22447">fix extract variable in token tree replace range</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22473">port block and loop inference from rustc</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22503">try to improve completion ranking</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22457">use add deref in assign instead add <code>&amp;mut</code> for value</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22506">kill proc-macro-srv processes on shutdown</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22477">remove direct use of make constructor with editor make</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22484">remove make from rename and prettify macro expansion</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5>
<p>This week we saw nice wins across the board thanks to merging several compiler queries together (<a href="https://github.com/rust-lang/rust/pull/155678">#155678</a>), and also substantial improvements in <code>doc</code> performance thanks to
doing less work when sorting trait impls (<a href="https://github.com/rust-lang/rust/pull/157179">#157179</a>).</p>
<p>Triage done by <strong>@Kobzol</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=783eb8c8682ddde0807c60ed8293670ef523794f&amp;end=4804ad7e93e1b31f4605b7083871d0d3d85a2afe&amp;absolute=false&amp;stat=instructions%3Au">783eb8c8..4804ad7e</a></p>
<p><strong>Summary</strong>:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">(instructions:u)</th>
<th style="text-align: center;">mean</th>
<th style="text-align: center;">range</th>
<th style="text-align: center;">count</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Regressions ❌ <br/> (primary)</td>
<td style="text-align: center;">0.3%</td>
<td style="text-align: center;">[0.1%, 0.7%]</td>
<td style="text-align: center;">14</td>
</tr>
<tr>
<td style="text-align: center;">Regressions ❌ <br/> (secondary)</td>
<td style="text-align: center;">0.4%</td>
<td style="text-align: center;">[0.1%, 0.9%]</td>
<td style="text-align: center;">39</td>
</tr>
<tr>
<td style="text-align: center;">Improvements ✅ <br/> (primary)</td>
<td style="text-align: center;">-0.9%</td>
<td style="text-align: center;">[-6.8%, -0.2%]</td>
<td style="text-align: center;">111</td>
</tr>
<tr>
<td style="text-align: center;">Improvements ✅ <br/> (secondary)</td>
<td style="text-align: center;">-1.1%</td>
<td style="text-align: center;">[-2.9%, -0.1%]</td>
<td style="text-align: center;">53</td>
</tr>
<tr>
<td style="text-align: center;">All ❌✅ (primary)</td>
<td style="text-align: center;">-0.8%</td>
<td style="text-align: center;">[-6.8%, 0.7%]</td>
<td style="text-align: center;">125</td>
</tr>
</tbody>
</table>
<p>3 Regressions, 1 Improvement, 2 Mixed; 4 of them in rollups
35 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/4a082d37cfd5006c8313e55bab306ea41f091714/triage/2026/2026-06-01.md">Full report here</a>.</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#approved-rfcs"/><a href="https://github.com/rust-lang/rfcs/commits/master">Approved RFCs</a></h5>
<p>Changes to Rust follow the Rust <a href="https://github.com/rust-lang/rfcs#rust-rfcs">RFC (request for comments) process</a>. These
are the RFCs that were approved for implementation this week:</p>
<ul>
<li><em>No RFCs were approved this week.</em></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#final-comment-period">Final Comment Period</a></h5>
<p>Every week, <a href="https://www.rust-lang.org/team.html">the team</a> announces the 'final comment period' for RFCs and key PRs
which are reaching a decision. Express your opinions now.</p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust"/><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Rust</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/rust/issues/147946">Tracking Issue for <code>strip_circumfix</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/127544">Tracking issue for CommandExt::show_window</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/147455">Tracking Issue for <code>path_set_times</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/152193">Tracking Issue for <code>nonzero_from_str_radix</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/156908">Tracking Issue for LoongArch CRC Intrinsics</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/149698">Tracking Issue for <code>Vec::from_fn</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155114">Add <code>Step::forward/backward_overflowing</code> to enable RangeInclusive loop optimizations</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156629">Stabilize <code>core::range::{legacy, RangeFull, RangeTo}</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/129090">Tracking Issue for box_as_ptr</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/116258">Tracking Issue for explicit-endian String::from_utf16</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/149543">Reduce <code>unreachable-code</code> churn after <code>todo!()</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155299">make repr_transparent_non_zst_fields a hard error</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/136469">Tracking Issue for algebraic floating point methods</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156188">riscv: promote d, e, and f target_features to CfgStableToggleUnstable</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/156203">Tracking Issue for <code>PathBuf::into_string</code></a></li>
</ul>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler-team-mcps-only"/><a href="https://github.com/rust-lang/compiler-team/issues?q=label%3Amajor-change%20label%3Afinal-comment-period%20state%3Aopen">Compiler Team</a> <a href="https://forge.rust-lang.org/compiler/mcp.html">(MCPs only)</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/compiler-team/issues/997">Desugar async blocks in HIR instead of MIR</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/996">Test new solver and polonius alpha on CI</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/994">Add <code>-Zllvm-target-feature target</code> *modifier* to directly set LLVM-level target features, and deprecate doing that with <code>-Ctarget-feature</code></a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/993">Set requirements for windows-gnu</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/988">Create a new Tier 3 target: <code>powerpc64le-unknown-none</code></a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/950">Add flag to pass MSRV/<code>package.rust-version</code> for use by lints</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/922">Optimize <code>repr(Rust)</code> enums by omitting tags in more cases involving uninhabited variants.</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/864">Promote tier 3 riscv32 ESP-IDF targets to tier 2</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/841">Proposal for Adapt Stack Protector for Rust</a></li>
</ul>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#unsafe-code-guidelines"/><a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Unsafe Code Guidelines</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/unsafe-code-guidelines/issues/413">Can references to uninhabited types ever be valid?</a></li>
</ul>
<p><em>No Items entered Final Comment Period this week for
<a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Team</a>,
<a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a> or
<a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a>.</em>
Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"/><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h5>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3966">BTF relocations</a></li>
<li><a href="https://github.com/rust-lang/rfcs/pull/3965"><code>--allow-unstable-flags</code>: Allow unstable flags on stable</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4>
<p>Rusty Events between 2026-06-03 - 2026-07-01 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-06-03 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/314691782/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
</li>
<li>2026-06-04 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455930/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-06-04 | Virtual (Nürnberg, DE) | <a href="https://www.meetup.com/rust-noris">Rust Nuremberg</a><ul>
<li><a href="https://www.meetup.com/rust-noris/events/313345241/"><strong>Rust Nürnberg online</strong></a></li>
</ul>
</li>
<li>2026-06-04 | Virtual (Tel Aviv-yafo, IL) | <a href="https://www.meetup.com/code-mavens/">Code Mavens 🦀 - 🐍 - 🐪</a><ul>
<li><a href="https://www.meetup.com/code-mavens/events/314979560/"><strong>Exploring FalkorDB - Learning to use a Graph Database in Rust</strong></a></li>
</ul>
</li>
<li>2026-06-06 | Virtual (Kampala, UG) | <a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763176587">Rust Circle Meetup</a><ul>
<li><a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763176587"><strong>Rust Circle Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-07 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314095285/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-06-08 | Virtual (Cardiff, UK) | <a href="https://www.meetup.com/rust-and-c-plus-plus-in-cardiff">Rust and C++ Cardiff</a><ul>
<li><a href="https://www.meetup.com/rust-and-c-plus-plus-in-cardiff/events/315009040/"><strong>RustWeek Reflections</strong></a></li>
</ul>
</li>
<li>2026-06-09 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254780/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-06-09 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/315060947/"><strong>👋 Community Catch Up</strong></a></li>
</ul>
</li>
<li>2026-06-10 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/3bcnx1jb"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-06-16 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/rdhhptyjcjbvb/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314000478/"><strong>Rust Study/Hack/Hang-out</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/ekws5nr4"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314236370/"><strong>June, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455931/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-06-21 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314329044/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254779/"><strong>Fourth Tuesday</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/313767883/"><strong>Lunch &amp; Learn: What the heck are monads - and how do we fake them in Rust</strong></a></li>
</ul>
</li>
<li>2026-07-01 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/wqzhftyjckbcb/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#africa">Africa</a></h5>
<ul>
<li>2026-06-09 | Johannesburg, ZA | <a href="https://www.meetup.com/johannesburg-rust-meetup">Johannesburg Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/johannesburg-rust-meetup/events/315070733/"><strong>Rust by Example - Lifetimes</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#europe">Europe</a></h5>
<ul>
<li>2026-06-03 | Dublin, IE | <a href="https://www.meetup.com/rust-dublin">Rust Dublin</a><ul>
<li><a href="https://www.meetup.com/rust-dublin/events/314689875/"><strong>Join us live and INPERSON for Rust 261</strong></a></li>
</ul>
</li>
<li>2026-06-03 | Girona, ES | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/4bmlc7qd"><strong>Rust Girona Hack &amp; Learn 06 2026</strong></a></li>
</ul>
</li>
<li>2026-06-10 | München, DE | <a href="https://www.meetup.com/rust-munich">Rust Munich</a><ul>
<li><a href="https://www.meetup.com/rust-munich/events/313791798/"><strong>Rust Munich 2026 / 2 - Hacking Evening</strong></a></li>
</ul>
</li>
<li>2026-06-11 | Switzerland, CH | <a href="https://www.posttenebraslab.ch/wiki/events/start">PostTenebrasLab</a><ul>
<li><a href="https://www.posttenebraslab.ch/wiki/events/monthly_meeting/rust_meetup"><strong>Rust Meetup Geneva</strong></a></li>
</ul>
</li>
<li>2026-06-12 - 2026-06-14 | Kraków, PL | <a href="https://rustmeet.eu/">Rustmeet</a><ul>
<li><a href="https://rustmeet.eu/"><strong>Rustmeet</strong></a></li>
</ul>
</li>
<li>2026-06-16 | Leipzig, DE | <a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig">Rust - Modern Systems Programming in Leipzig</a><ul>
<li><a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/events/313813937/"><strong>Interactive: Everything is Open Source</strong></a></li>
</ul>
</li>
<li>2026-06-16 | Milano, IT | <a href="https://www.meetup.com/rust-language-milano">Rust Language Milan</a><ul>
<li><a href="https://www.meetup.com/rust-language-milan/events/314766950/"><strong>Real-time planning in Rust: SolverForge &amp; SERIO</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Aarhus, DK | <a href="https://www.meetup.com/rust-aarhus">Rust Aarhus</a><ul>
<li><a href="https://www.meetup.com/rust-aarhus/events/314965238/"><strong>Talk Night at Danske Commodities</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Paris, FR | <a href="https://www.meetup.com/rust-paris">Rust Paris</a><ul>
<li><a href="https://www.meetup.com/rust-paris/events/315040676/"><strong>Rust meetup #86</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/314396600/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<li>2026-06-04 | Chicago, IL, US | <a href="https://www.meetup.com/chicago-rust-meetup">Chicago Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/chicago-rust-meetup/events/314983693/"><strong>Rust Happy Hour</strong></a></li>
</ul>
</li>
<li>2026-06-04 | Saint Louis, MO, US | <a href="https://www.meetup.com/stl-rust">STL Rust</a><ul>
<li><a href="https://www.meetup.com/stl-rust/events/314106244/"><strong>Testing, Coverage, Tracey &amp; Mutations</strong></a></li>
</ul>
</li>
<li>2026-06-06 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/314480539/"><strong>Boston Common Rust Lunch, June 6</strong></a></li>
</ul>
</li>
<li>2026-06-11 | Lehi, UT, US | <a href="https://www.meetup.com/utah-rust">Utah Rust</a><ul>
<li><a href="https://www.meetup.com/utah-rust/events/314696643/"><strong>Utah Rust June Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-11 | Mountain View, CA, US | <a href="https://www.meetup.com/hackerdojo/events/">Hacker Dojo</a><ul>
<li><a href="https://www.meetup.com/hackerdojo/events/314825006/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
</ul>
</li>
<li>2026-06-11 | San Diego, CA, US | <a href="https://www.meetup.com/san-diego-rust">San Diego Rust</a><ul>
<li><a href="https://www.meetup.com/san-diego-rust/events/313721899/"><strong>San Diego Rust June Meetup - Back in person!</strong></a></li>
</ul>
</li>
<li>2026-06-16 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group">San Francisco Rust Study Group</a><ul>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/314989012/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-06-16 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group">San Francisco Rust Study Group</a><ul>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/ghhwqtyjcjbvb/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314000478/"><strong>Rust Study/Hack/Hang-out</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314236370/"><strong>June, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/xvkdgtyjcjbgc/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a><ul>
<li><a href="https://www.meetup.com/rust-los-angeles/events/314386080/"><strong>Rust LA: Rust-Based Constraint Solvers in 2D Sketching with Zoo Technologies</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Atlanta, GA, US | <a href="https://www.meetup.com/rust-atl">Rust Atlanta</a><ul>
<li><a href="https://www.meetup.com/rust-atl/events/313539326/"><strong>Rust-Atl</strong></a></li>
</ul>
</li>
<li>2026-06-26 | New York, NY, US | <a href="https://www.meetup.com/rust-nyc">Rust NYC</a><ul>
<li><a href="https://www.meetup.com/rust-nyc/events/315014582/"><strong>Rust NYC's Big Summer Social</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5>
<ul>
<li>2026-06-25 | Melbourne, AU | <a href="https://www.meetup.com/rust-melbourne">Rust Melbourne</a><ul>
<li><a href="https://www.meetup.com/rust-melbourne/events/315039461/"><strong>Rust Melbourne June 2026</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#south-america">South America</a></h5>
<ul>
<li>2026-06-18 | Florianópolis, BR | <a href="https://luma.com/rust-sc">Rust SC</a><ul>
<li><a href="https://luma.com/acinctdf"><strong>Rust Floripa</strong></a></li>
</ul>
</li>
</ul>
<p>If you are running a Rust event please add it to the <a href="https://www.google.com/calendar/embed?src=apd9vmbc22egenmtu5l6c5jbfc%40group.calendar.google.com">calendar</a> to get
it mentioned here. Please remember to add a link to the event too.
Email the <a href="mailto:community-team@rust-lang.org">Rust Community Team</a> for access.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#jobs">Jobs</a></h4>
<p>Please see the latest <a href="https://www.reddit.com/r/rust/comments/1ttbtf5/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p>
<h3><a class="toclink" href="https://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3>
<blockquote>
<p>If memory safety bugs were Waldo (Wally): finding them in C programs is a "Where's Waldo?" game, and Rust's <code>unsafe</code> simplifies it to "Is <em>this</em> Waldo?"</p>
</blockquote>
<p>– <a href="https://users.rust-lang.org/t/is-unsafe-rust-worse-than-c/140286/25">kornel on rust-users</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1776">Moy2010</a> for the suggestion!</p>
<p><a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328">Please submit quotes and vote for next week!</a></p>
<p>This Week in Rust is edited by:</p>
<ul>
<li><a href="https://github.com/nellshamrell">nellshamrell</a></li>
<li><a href="https://github.com/llogiq">llogiq</a></li>
<li><a href="https://github.com/ericseppanen">ericseppanen</a></li>
<li><a href="https://github.com/extrawurst">extrawurst</a></li>
<li><a href="https://github.com/U007D">U007D</a></li>
<li><a href="https://github.com/mariannegoldin">mariannegoldin</a></li>
<li><a href="https://github.com/bdillo">bdillo</a></li>
<li><a href="https://github.com/opeolluwa">opeolluwa</a></li>
<li><a href="https://github.com/bnchi">bnchi</a></li>
<li><a href="https://github.com/KannanPalani57">KannanPalani57</a></li>
<li><a href="https://github.com/tzilist">tzilist</a></li>
</ul>
<p><em>Email list hosting is sponsored by <a href="https://foundation.rust-lang.org/">The Rust Foundation</a></em></p>
<p><small><a href="https://www.reddit.com/r/rust/comments/1twbzid/this_week_in_rust_654/">Discuss on r/rust</a></small></p></div>
    </content>
    <updated>2026-06-03T04:00:00Z</updated>
    <published>2026-06-03T04:00:00Z</published>
    <category term="This Week in Rust"/>
    <author>
      <name>TWiR Contributors</name>
    </author>
    <source>
      <id>https://this-week-in-rust.org/</id>
      <link href="https://this-week-in-rust.org/" rel="alternate" type="text/html"/>
      <link href="https://this-week-in-rust.org/atom.xml" rel="self" type="application/atom+xml"/>
      <title>This Week in Rust</title>
      <updated>2026-06-10T04:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/06/02/launching-the-rust-foundation-maintainers-fund/</id>
    <link href="https://blog.rust-lang.org/2026/06/02/launching-the-rust-foundation-maintainers-fund/" rel="alternate" title="Launching the Rust Foundation Maintainers Fund" type="text/html"/>
    <title xml:lang="en">Launching the Rust Foundation Maintainers Fund</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><blockquote>
<p>If you want to financially support the development of Rust, please consider <a href="https://github.com/sponsors/rustfoundation" rel="external">donating</a> to the Rust Foundation Maintainers Fund.</p>
</blockquote>
<p>A few months ago, the Rust Foundation announced the <a href="https://rustfoundation.org/media/announcing-the-rust-foundation-maintainers-fund/" rel="external">Rust Foundation Maintainers Fund</a> (RFMF). Since then, the Rust Project has been closely cooperating with the Rust Foundation to determine how exactly this fund will be used to support Rust maintainers. This resulted in the acceptance of <a href="https://rust-lang.github.io/rfcs/3931-rfmf-rust-foundation-maintainer-fund.html" rel="external">RFC #3931</a>, which established the <a href="https://rust-lang.org/governance/teams/launching-pad/#team-funding" rel="external">Funding team</a> and the <a href="https://rust-lang.github.io/rfcs/3931-rfmf-rust-foundation-maintainer-fund.html#expectations-placed-on-maintainers-in-residence" rel="external">Maintainer in Residence</a> program.</p>
<p>The primary goal of the Funding team is to ensure that maintainers who work on Rust and its toolchain will be properly supported. We will talk to Rust Project members to figure out their funding situation, meet Rust team leads to learn about their maintenance needs, approach companies to find opportunities for them to invest into Rust by supporting Rust maintainers, coordinate various funding efforts and ensure that the beneficial effects of funded maintenance are visibly promoted, with the help of the <a href="https://rust-lang.org/governance/teams/launching-pad/#team-content" rel="external">Content team</a>.</p>
<p><a href="https://rust-lang.github.io/rfcs/3931-rfmf-rust-foundation-maintainer-fund.html#expectations-placed-on-maintainers-in-residence" rel="external">Maintainer in Residence</a> is a new program dedicated to financially supporting existing Rust Project maintainers<sup class="footnote-reference" id="fr-dir-1"><a href="https://blog.rust-lang.org/2026/06/02/launching-the-rust-foundation-maintainers-fund/#fn-dir">1</a></sup>. Each Maintainer in Residence will be funded to <a href="https://blog.rust-lang.org/inside-rust/2026/01/12/what-is-maintenance-anyway/" rel="external">maintain</a> one or more critical parts of Rust, such as the compiler, the standard library, Cargo, Clippy or one of many other projects that the Rust Project develops and maintains. The funded work will include activities such as performing large-scale refactorings, code reviews, unblocking new features, issue triaging, mentoring other contributors and more, and will be split between priorities guided by the teams they are supporting and priorities of their own choosing within the Project. Where applicable, Maintainers in Residence are also encouraged to propose, champion, and drive forward <a href="https://rust-lang.github.io/rust-project-goals/" rel="external">Rust Project Goals</a>.</p>
<p>The goal of this program is to provide stable and long-term funding so that maintainers can focus on important work that ensures the long-term health of Rust. The funding team will select Maintainers in Residence based on funding availability and maintenance needs within the Rust Project, and help ensure that they are successful. We expect that this will usually be a (near) full-time position, but that will depend on the nature of the work and the area of maintenance.</p>
<p>This program extends our existing support for Rust maintainers, such as the <a href="https://blog.rust-lang.org/inside-rust/2026/04/09/program-management-update-2026-03/" rel="external">program management program</a> and the <a href="https://blog.rust-lang.org/inside-rust/2025/06/05/a-glance-at-the-team-compiler-operations" rel="external">compiler-ops program</a>. An important development is that we now have a centralized <a href="https://github.com/sponsors/rustfoundation" rel="external">mechanism</a> for gathering donations from both individuals and companies, and a dedicated team that will help direct those funds to specific maintainers. You can find more details about the funding team and the Maintainer in Residence program in the <a href="https://rust-lang.github.io/rfcs/3931-rfmf-rust-foundation-maintainer-fund.html" rel="external">RFC</a>.</p>
<p>We expect to hire the first Maintainer in Residence in the upcoming months and announce it on this blog, so stay tuned!</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/02/launching-the-rust-foundation-maintainers-fund/#how-to-contribute-funds"/>
How to contribute funds</h3>
<p>If you are an individual who wants to help Rust succeed and thrive, you can donate to the RFMF through <a href="https://github.com/sponsors/rustfoundation" rel="external">GitHub Sponsors</a><sup class="footnote-reference" id="fr-sponsors-1"><a href="https://blog.rust-lang.org/2026/06/02/launching-the-rust-foundation-maintainers-fund/#fn-sponsors">2</a></sup>. Companies who would like to invest in better maintenance of Rust can also donate through GitHub Sponsors or they can contact the Rust Foundation <a href="mailto:contact@rustfoundation.org">directly</a>.</p>
<p>The important thing is that <strong>all proceeds from this fund will be directly used to support Rust Project maintainers</strong>. We currently expect that to happen primarily through the Maintainer in Residence program, but it can also be done in the form of smaller-scale grants or other mechanisms, as determined by the Funding team. We will figure this out on the go, as this is also quite new for us.</p>
<p>We really appreciate each donation, however small, because with more money we can hire more maintainers to ensure that we can continue to develop Rust and that important improvements are not blocked on maintenance tasks. This is especially important at this time, where Rust is starting to get used more and more in the industry in various application areas, which increases the need for sustained maintenance. The importance of multiple funding sources is underscored by an unfortunate trend we currently observe, where key Rust maintainers are losing their funding for Rust work due to budget shifts. The Rust Foundation Maintainers Fund is designed to provide stable funding for Rust maintainers that is less dependent on sudden shifts in the job market and the IT industry.</p>
<p>As with most things, there is no one-size-fits-all solution, so there are multiple ways to support Rust financially. The <a href="https://rustnl.org/maintainers" rel="external">RustNL Maintainers Team</a> recently hired several Rust Project maintainers. Previously, we <a href="https://blog.rust-lang.org/2025/12/08/making-it-easier-to-sponsor-rust-contributors/" rel="external">wrote</a> about how you can support specific individuals working on Rust. And there are also Rust Project Goals <a href="https://rust-lang.github.io/rust-project-goals/2026/funding.html" rel="external">in search of funding</a>. We welcome all efforts that can help support Rust Project maintainers, who often do work that is near invisible and thankless, while at the same time incredibly important and necessary, on a volunteer basis.</p>
<p>Thank you for considering sponsoring the development and maintenance of Rust! You can find more information about funding Rust on our <a href="https://rust-lang.org/funding/" rel="external">Funding page</a>.</p>
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn-dir">
<p>This program was inspired by the <a href="https://www.python.org/psf/developersinresidence/" rel="external">Developer in Residence</a> concept used by the Python Software Foundation (PSF), with which we led several helpful discussions. Thank you, PSF! <a href="https://blog.rust-lang.org/2026/06/02/launching-the-rust-foundation-maintainers-fund/#fr-dir-1">↩</a></p>
</li>
<li id="fn-sponsors">
<p>Note that the fact that GitHub Sponsors is currently enabled on the <code>rustfoundation</code> GitHub organization, and not the <code>rust-lang</code> organization, is an implementation detail that might change in the future. All donations raised on this Sponsors page will be routed to the Rust Foundation Maintainers Fund and will be spent on directly supporting Rust Project maintainers. <a href="https://blog.rust-lang.org/2026/06/02/launching-the-rust-foundation-maintainers-fund/#fr-sponsors-1">↩</a></p>
</li>
</ol>
</section></div>
    </content>
    <updated>2026-06-02T00:00:00Z</updated>
    <published>2026-06-02T00:00:00Z</published>
    <author>
      <name>Funding team</name>
    </author>
    <source>
      <id>https://blog.rust-lang.org/</id>
      <author>
        <name>Maintained by the Rust Teams.</name>
        <uri>https://github.com/rust-lang/blog.rust-lang.org/</uri>
      </author>
      <link href="https://blog.rust-lang.org/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://blog.rust-lang.org/" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en">Empowering everyone to build reliable and efficient software.</subtitle>
      <title xml:lang="en">Rust Blog</title>
      <updated>2026-06-11T14:20:46Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.nightly.mozilla.org/?p=2075</id>
    <link href="https://blog.nightly.mozilla.org/2026/06/01/backup-for-a-rainy-day-these-weeks-in-firefox-issue-202/" rel="alternate" type="text/html"/>
    <title>Backup for a Rainy Day – These Weeks in Firefox: Issue 202</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Highlights The profile backup mechanism has been enabled by default for all desktop platforms in Nightly, as well as Beta! The current plan is to have this ride out to … <a class="go" href="https://blog.nightly.mozilla.org/2026/06/01/backup-for-a-rainy-day-these-weeks-in-firefox-issue-202/">Read more</a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><h3>Highlights</h3>
<ul>
<li>The profile backup mechanism has been enabled by default for all desktop platforms in Nightly, as well as Beta! The current plan is to have this ride out to Firefox 151 for Windows, macOS and Linux on May 18th!
<ul>
<li>This feature, when enabled, will create a copy of your profile data in the background and store it in a single file on your file system that you can restore from.</li>
<li>You will be able to manage this feature in Settings under Sync (for now)
<ul>
<li><a href="https://blog.nightly.mozilla.org/files/2026/06/image6.png"><img alt="Firefox settings page showing the Backup feature in dark mode. Backup is enabled, with details of the most recent backup and a &#x201C;Backup now&#x201D; button. The page displays the backup file name and a backup location folder path, along with &#x201C;Choose&#x2026;&#x201D; and &#x201C;Show in folder&#x201D; buttons. A &#x201C;Sensitive data&#x201D; section includes an option to back up passwords and payment methods with encryption, and a disabled &#x201C;Change password&#x201D; button." class="aligncenter size-full wp-image-2074" height="517" src="https://blog.nightly.mozilla.org/files/2026/06/image6.png" width="657"/></a></li>
</ul>
</li>
<li><a href="https://support.mozilla.org/kb/firefox-backup">You can read more about the feature here</a></li>
</ul>
</li>
<li>As followups to the recent addition to the WebExtension tabs API to <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Working_with_the_Tabs_API#working_with_tab_split_views">support the new SplitView tabs feature</a>, tabs.group() and tabs.ungroup() have been fixed to work correctly with split view tabs, and fixed split views being prepended instead of appended to tab groups when adopted into a new window –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029099"> Bug 2029099</a> /<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029534"> Bug 2029534</a></li>
<li>Adaptive autofill has been enabled on Nightly.
<ul>
<li>Previously, autofill only completed domains (e.g. typing red autofilled<a href="http://reddit.com"> reddit.com</a>). Now it can also complete full URLs for pages you visit often (e.g. red →<a href="http://reddit.com/r/firefox"> reddit.com/r/firefox</a>), learning from what you actually click in the address bar. If a suggestion isn’t helpful, you can now dismiss it so autofill learns what not to show you too.
<ul>
<li>If you run into issues or have feedback, <a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Firefox&amp;component=Address+Bar">you can file a bug here</a>!</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=293943">Markus Stange [:mstange]</a> implemented dynamic toolbar on top in RDM (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978145">#1978145</a>), but also implemented some static skeleton UI so it’s closer to what we actually have in Firefox for Android
<ul>
<li>dynamic toolbar is behind a pref: devtools.responsive.dynamicToolbar.enabled</li>
<li>it can be put on top by setting devtools.responsive.dynamicToolbar.onTop, otherwise it’s at the bottom</li>
<li><a href="https://blog.nightly.mozilla.org/files/2026/06/image1.png"><img alt="Firefox Responsive Design Mode on Desktop displaying the Mozilla homepage in a mobile viewport. The toolbar at the top shows a simulated Android device (including the dynamic toolbar) with a viewport size of 376 &#xD7; 464 pixels and a device pixel ratio of 3. The page content is shown in French, featuring the Mozilla logo, a &#x201C;Menu&#x201D; link, a &#x201C;Pause animation&#x201D; button, and the headline &#x201C;Bienvenue chez Mozilla&#x201D; with accompanying text about trusted technology and digital rights." class="aligncenter size-full wp-image-2069" height="1113" src="https://blog.nightly.mozilla.org/files/2026/06/image1.png" width="882"/></a></li>
</ul>
</li>
</ul>
<h3>Friends of the Firefox team</h3>
<h3><a href="https://bugzilla.mozilla.org/buglist.cgi?title=Resolved%20bugs%20(excluding%20employees)&amp;quicksearch=958957%2C1876109%2C1997388%2C2000797%2C1950995%2C1986020%2C2018272%2C2018276%2C2021681%2C2027969%2C2022115%2C1999012%2C2016058%2C2026585%2C2023913%2C2028167%2C2028293%2C2028927%2C1998002%2C2011343%2C1997925%2C2026574%2C2029398%2C2029684%2C1948019%2C2008756%2C2022601%2C2026032%2C2030428%2C1968244%2C1975391%2C944228%2C1962904%2C1977741%2C1997346%2C2027867%2C2030631%2C1807516%2C2030998%2C2030999%2C2015491%2C2028153%2C2028628%2C1978290%2C2008128%2C2024033%2C1883497%2C1984679%2C2030069%2C2031162%2C2031598%2C2012399%2C2031116%2C2031128%2C2031931%2C2031961%2C2033173%2C2032997%2C1919387%2C1947679%2C2027915%2C2032196%2C2019561%2C2024187%2C1392125%2C1993844%2C2027060%2C1983408%2C2034178%2C1873954%2C1875083%2C2008119%2C2008197%2C1628669%2C2031599%2C2033820">Resolved bugs (excluding employees)</a></h3>
<p><a href="https://github.com/niklasbaumgardner/NewContributorScraper">Script to find new contributors from bug list</a></p>
<h4>Volunteers that fixed more than one bug</h4>
<ul>
<li>Amin Amir</li>
<li>aoia7rz7l</li>
<li>Chukwuka Rosemary</li>
<li>DrSeed</li>
<li>Frédéric Wang Nélar</li>
<li>japandi</li>
<li>John Iweh</li>
<li>jonathancabera</li>
<li>Josh Aas</li>
<li>Keji Bakare</li>
<li>kofoworola shonuyi</li>
<li>konyhéa</li>
<li>liz</li>
<li>Mathew Hodson</li>
<li>Okhuomon Ajayi</li>
<li>Oluwatobi</li>
<li>ROSHAAN</li>
<li>Sam Johnson</li>
</ul>
<h4>New contributors (🌟 = first patch)</h4>
<ul>
<li> Anthony Mclamb:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027915"> Disable the legacy Edge migrator</a></li>
<li> Amin Amir
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031599">Fix browsingContext.sys.mjs to assign to #contextCreatedHandled instead of contextCreatedHandled</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033820">Fix missing WITHOUT ROWID SQLite performance optimization in SERPCategorization.sys.mjs</a></li>
<li>🌟 Amine Zroual:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1392125"> Omitted maxResults property not handled correctly in getRecentlyClosed</a></li>
</ul>
</li>
<li>any1here:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031162"> install_sig_alt_stack incorrectly checks mmap’s return value</a></li>
<li>🌟 Armin Ulrich:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031598"> Fix MessageHandlerRegistry.sys.mjs calling getExistingMessageHandler with an unused second argument</a></li>
<li>japandi
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1628669">Cannot remove amazon.com from top sites list</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1977741">The height of the pinned tabs area should be responsive to the number of pins</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986020">Use cenum for nsIHelperAppLauncherDialog reason constants to enable better typescript annotations</a></li>
</ul>
</li>
<li>Nathan Johnson [:narjoDev]:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1950995"> Remove browser.display.use_system_colors pref</a></li>
<li>DrSeed
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1962904">Firefox shows vertical tabs in new windows despite “Hide tabs and sidebar” setting</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1968244">The “Expand sidebar on hover” option is not kept after the vertical tabs are disabled and enabled again</a></li>
</ul>
</li>
<li>Keji Bakare:
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2008756">Split view’s focus-outline is clipped on the right side of left tab</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031116">White space on the right side of left panel in split view</a></li>
</ul>
</li>
<li>🌟 gotyaoi:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1807516"> Reload toolbar button is active on about:newtab</a></li>
<li>Itoro James:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2015491"> [A11y][Keyboard Navigation]Cancelling a note via Keyboard Navigation still saves it</a></li>
<li>John Iweh:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1997925"> The notification dot is not displayed if the tab is in a Split View</a></li>
<li>🌟 John Iweh:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027867"> sidebar-shown attribute remains when sidebar.revamp is false</a></li>
<li>🌟 jonathancabera:
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2012399">The Move tab to Split View option is also displayed for the tabs that are within the Split View</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2016058">A Note with long text (1003 characters) is saved by pressing ENTER even if the “Save” button is disabled</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026032">Tab group guide line becomes disconnected under certain conditions related to split views in vertical tab mode</a></li>
</ul>
</li>
<li>Aloys:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2000797"> Remove logic that forces distribution language packs to be reinstalled when upgrading from Firefoxes older than 67</a></li>
<li>liz:
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1875083">Create test to ensure maxRenderCountEstimate is never being set to Infinity in virtual-list component in Fx View</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2008119">Button accessible name does not convey its function: missing topic context (Settings dialog &gt; Topics dialog &gt; buttons Following/Unfollow/Blocked/Unblock)</a></li>
</ul>
</li>
<li>Mary cathline:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022115"> Tab Group Label does not respect touch density in vertical tab bar</a></li>
<li>🌟 Brandon Lucier:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030631"> Popups opened with window.open give window type normal instead of popup</a></li>
<li>karan68:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1997388"> [dialog] New Shortcut dialog needs a label/accessible name</a></li>
<li>🌟 Vector:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2008128"> Button does not programmatically indicate that it opens a dialog (Recent activity section &gt; story card &gt; ••• disclosure &gt; Delete from History button)</a></li>
<li>🌟 Osoble:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1876109"> Update font size and weight for synced tabs device name headers in Firefox View</a></li>
<li>konyhéa:
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1873954">Add test for sync admin disabled to browser_syncedtabs_errors_firefoxview.js</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1883497">Check all second paramaters for TestUtils.waitForCondition in Fx View test files</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030069">Recently Closed Tabs, Tabs from Other Devices, and History pages should have Cmd / Ctrl + Click on a link open the link in the new background tab.</a></li>
</ul>
</li>
<li>Noble Chinonso: <a href="http://sidebartreeview.js">#shouldHandleEvent in SidebarTreeView.js compares event.keyCode to string values, causing Home/End keys to never be handled</a></li>
<li>Pranjali Srivastava:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=944228"> Add a test to verify that the space above tabs is consistent across PB, LWT and sizemode (where appropriate)</a></li>
<li>Okhuomon Ajayi:
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2018272">More spacing is needed between the tab note icon and the close icon on the tab</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019561">The tabs in vertical mode collapsed state are positioned differently in Split View</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027060">Keep vertical split view tabs stacked vertically even when the sidebar is expanded when expand on hover is enabled</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029684">Vertical split view tabs can be too big or small when tabs are overflowing</a></li>
</ul>
</li>
<li>🌟 Rishan:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030428"> Fix duplicated arrow function in browser_history_sidebar.js</a></li>
<li>Chukwuka Rosemary:
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1948019">“Forget About This Site” context menu option missing from Firefox View history</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026574">Long strings are not displayed properly on the about:opentabs page search filed</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028153">Add test for Forget This Site option in Fxview history context menu.</a></li>
</ul>
</li>
<li>ROSHAAN:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2018276">Tab note background colour is incorrect for default light theme</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1997346"> [win/linux] The splitter between content areas does not match Figma spec</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028927">Fix typo in OpenInTabsUtils.confirmOpenInTabs()</a></li>
</ul>
</li>
<li>Sameeksha:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2008197"> Disclosure button expanded/collapsed state not programmatically defined (Customize button)</a></li>
<li>kofoworola shonuyi:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1999012">Actually hide or remove sidebar-shown attribute when in fullscreen.</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028293">Add a test for checking sidebar-shown attribute in fullscreen mode</a></li>
</ul>
</li>
<li>🌟 Sayd Mateen:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2021681"> Page URL is displayed as tab name when page’s contains about:reader?&lt;/a&gt;&lt;/p&gt; &lt;p&gt;</a></li>
</ul>
<ul>
<li>Oluwatobi:
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1975391">Unable to delete selected history entries from sidebar</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1993844">Incorrect Sidebar button state/tooltip hover text</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2023913">The city name heading level doesn’t follow the correct heading level order</a></li>
</ul>
</li>
<li>Nishchay [:nish]:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031961"> Unable to add tabs to old closed tab groups (tabGroupState.splitViews is undefined)</a></li>
</ul>
<p> </p>
<h3>Project Updates</h3>
<h4>Add-ons / Web Extensions</h4>
<h5>Addon Manager &amp; about:addons</h5>
<ul>
<li>In preparation for the Project Nova restyling of the about:addons page, we have refactored about:addons into separate per-component ES modules, splitting the monolithic aboutaddons.js and aboutaddons.html into 16 dedicated component files under components/ (with no behavior or UI changes) –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2032014"> Bug 2032014</a>
<ul>
<li>NOTE: if you have working on patches with changes to about:addons internals it is very likely you’ll need to rebase and solve merge conflicts hit on top of this refactoring, the internals are still largely the same as before but don’t hesitate to reach out to the Addons team if you have doubts / questions or need help to figure out how to adapt your patch of top of these changes</li>
</ul>
</li>
</ul>
<h5>WebExtensions Framework</h5>
<ul>
<li>Fixed exportFunction to preserve the constructibility of the wrapped function instead of unconditionally making all exported functions implicitly as constructors –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033173"> Bug 2033173</a>
<ul>
<li>Thanks to Gregory Pappas for contributing this improvement to the Content Scripts’ Xray Wrappers helpers!</li>
</ul>
</li>
<li>Fixed a Firefox 151 regression where extension content scripts accessing location.ancestorOrigins caused subsequent page script reads of the same property to fail with “Permission denied”, breaking sites like Gmail –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2034329"> Bug 2034329</a>
<ul>
<li>Thanks to Simon Farre for promptly investigating and fixing this recent regression!</li>
</ul>
</li>
</ul>
<h5>WebExtension APIs</h5>
<ul>
<li>Updated sessions.getRecentlyClosed() to remove the hardcoded cap when maxResults is omitted –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1392125"> Bug 1392125</a>
<ul>
<li>Shoutout to Amine Zroual for contributing this enhancement to the sessions WebExtensions API!</li>
</ul>
</li>
</ul>
<h4>DevTools</h4>
<ul>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=750915">Artem Manushenkov</a> fixed an issue where autosuggestion popup was removing overridden indicators from properties in the Inspector (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983408">#1983408</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=446257">Andrea Marchesini [:baku]</a> fix DevTools cookie header serialization for long cookies, which could lead to cookies not being visible in Netmonitor (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031299">#2031299</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=559949">Julian Descottes [:jdescottes]</a> fixed a toolbox crash that was happening we couldn’t find a localization file (e.g. when using a language pack on Nightly) (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028930">#2028930</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> improved @container tooltip so it show the value of variables used in style()(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030239">#2030239</a>), has enough contrast in dark mode (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033782">#2033782</a>) and contains a link to select the container (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031688">#2031688</a>)
<ul>
<li><a href="https://blog.nightly.mozilla.org/files/2026/06/image3.png"><img alt="Firefox Developer Tools showing a CSS @container style() rule in the Rules panel. A popover for a element displays container properties including &quot;container-name: hello section-container&quot;, &quot;container-type: inline-size&quot;, and the custom property &quot;--w: 100px&quot;, while indicating that --secondary and --plouf are not set. Below, the container query uses nested var() fallbacks, and a CSS declaration previews the resolved value for background-color." class="aligncenter size-full wp-image-2071" height="532" src="https://blog.nightly.mozilla.org/files/2026/06/image3.png" width="1038"/></a></li>
</ul>
</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=656417">Hubert Boma Manilla (:bomsy)</a> is making good progress on migrating the Console to CodeMirror 6 (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2032758">#2032758</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026569">#2026569</a>)</li>
</ul>
<h4>Fluent</h4>
<ul>
<li>We’re now at over 72% of our strings being Fluent! Got a component still using .properties? Convert when you can!</li>
<li><a href="https://blog.nightly.mozilla.org/files/2026/06/image5.png"><img alt="Stacked area chart titled &#x201C;Are We Fluent Yet?&#x201D; showing the number and type of localization strings available in Firefox from 2018 to 2026. The chart tracks Fluent strings (green), Properties strings (blue), DTD strings (pink), and a small number of INI strings. Over time, Fluent strings steadily increase while DTD and Properties strings decline. A tooltip at April 26, 2026 shows 10,372 Fluent strings, 3,997 Properties strings, and no remaining DTD or INC strings, illustrating Firefox&#x2019;s ongoing migration to the Fluent localization system." class="aligncenter size-full wp-image-2073" height="924" src="https://blog.nightly.mozilla.org/files/2026/06/image5.png" width="1509"/></a></li>
</ul>
<h4>Migration Improvements</h4>
<ul>
<li>Thanks to dao for <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035009">fixing a recent alignment issue in the migration wizard dropdown</a></li>
<li>Thanks to volunteer contributor Anthony Mclamb for his patch that <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027915">disables the legacy EdgeHTML Edge migrator</a>! Once that finishes rolling out, presuming no surprises, we’ll go ahead and remove the migrator entirely.</li>
</ul>
<h4>New Tab Page</h4>
<ul>
<li>Nova for New Tab has ridden the trains to Beta! It will be enabled by default, globally, when Firefox 151 goes out to release on May 19th
<ul>
<li>It’s possible that we’ll do a train-hop coupled with an experiment to enable HNT Nova for a few clients a bit earlier.</li>
</ul>
</li>
<li>Maxx Crawford<a href="https://bugzil.la/2032213"> enabled Nova designs for New Tab</a>, rolling out the updated layout, widgets, and customization panel behind HNT Nova flags.</li>
<li>Maxx Crawford<a href="https://bugzil.la/2033165"> fixed the Nova content feed to render the intended four‑column layout</a> by correcting CSS grid breakpoints.</li>
<li>Maxx Crawford<a href="https://bugzil.la/2033264"> resolved a first‑load failure in the Weather widget</a> by fixing init order and fetch timing, eliminating the “Oops” error.</li>
<li>Maxx Crawford<a href="https://bugzil.la/2031707"> synchronized the Weather toggle between about:preferences#home and the panel</a> via the shared showWeather pref to prevent desync.</li>
<li>Maxx Crawford<a href="https://bugzil.la/2021460"> updated Nova grid focus order</a> to align tab flow with visual order for keyboard users.</li>
<li>Maxx Crawford<a href="https://bugzil.la/2034620"> fixed critical UI issues in Lists and Timer widgets</a> covering overflow, controls, and layout stability.</li>
<li>Maxx Crawford<a href="https://bugzil.la/2032462"> guarded document.dir access in Nova render paths</a> to avoid startup cache worker errors and improve startup stability.</li>
<li>Rolf<a href="https://bugzil.la/2031568"> added a new normalization method for the inferred interest vector</a> to stabilize topic relevance across sessions.</li>
<li>Rolf<a href="https://bugzil.la/2031569"> prevented unnecessary content refreshes during Pocket New Tab experiments</a>, reducing jank and bandwidth.</li>
<li>Sameeksha<a href="https://bugzil.la/2008197"> defined the Customize button’s expanded/collapsed state programmatically</a> using aria-expanded for better a11y.</li>
<li>liz<a href="https://bugzil.la/2008119"> clarified follow/unfollow/blocked button names with topic context</a> so screen readers announce clear actions.</li>
<li>Vector<a href="https://bugzil.la/2008128"> marked the Delete from History control as opening a dialog</a> via aria-haspopup=dialog for assistive tech.</li>
<li>Scott Downe<a href="https://bugzil.la/2034145"> fixed a regression that flipped the Wallpapers pref off</a>, restoring user selections.</li>
<li>Irene Ni<a href="https://bugzil.la/2033927"> corrected privacy link color and focus styles</a> for contrast and keyboard visibility.</li>
<li>Reem Hamoui<a href="https://bugzil.la/2030873"> added a wallpaper toggle reset in the Nova customization panel</a> so users can quickly restore default wallpapers without extra steps.</li>
<li>Reem Hamoui<a href="https://bugzil.la/2031669"> fixed the Customize pencil button to match the Nova spec</a>, aligning placement and iconography for visual consistency.</li>
<li>Dre<a href="https://bugzil.la/2032607"> updated the ‘Fresh new’ wallpapers copy</a> to a clearer, localized message for better comprehension.</li>
<li>Irene Ni<a href="https://bugzil.la/2033927"> fixed Nova privacy link color and focus styles</a> to meet contrast and focus ring guidelines, improving accessibility on New Tab.</li>
<li>Irene Ni<a href="https://bugzil.la/2034098"> adjusted Sponsored tile character limits</a> to prevent truncation/overflow, yielding cleaner titles across grid and wide tiles.</li>
<li>Scott Downe<a href="https://bugzil.la/2034145"> fixed a regression that flipped the Wallpapers user pref to false</a>, restoring wallpapers for affected users and preventing unintended disablement.</li>
<li>Reem Hamoui<a href="https://bugzil.la/2034688"> hooked the wallpaper check into the new toggle logic</a> so the Customization Panel accurately reflects wallpaper availability and state.</li>
<li>Irene Ni<a href="https://bugzil.la/2034912"> landed Nova UI updates for the Daily Briefing 3-pack card</a>, improving spacing, type scale, and tap targets.</li>
<li>Reem Hamoui<a href="https://bugzil.la/2030873"> added a wallpaper toggle reset in the Nova customization panel</a> so users can quickly restore default wallpapers without extra steps.</li>
<li>Reem Hamoui<a href="https://bugzil.la/2031669"> fixed the Customize pencil button to match the Nova spec</a>, aligning placement and iconography for visual consistency.</li>
<li>Dre<a href="https://bugzil.la/2032607"> updated the ‘Fresh new’ wallpapers copy</a> to a clearer, localized message for better comprehension.</li>
<li>Irene Ni<a href="https://bugzil.la/2033927"> fixed Nova privacy link color and focus styles</a> to meet contrast and focus ring guidelines, improving accessibility on New Tab.</li>
<li>Irene Ni<a href="https://bugzil.la/2034098"> adjusted Sponsored tile character limits</a> to prevent truncation/overflow, yielding cleaner titles across grid and wide tiles.</li>
<li>Scott Downe<a href="https://bugzil.la/2034145"> fixed a regression that flipped the Wallpapers user pref to false</a>, restoring wallpapers for affected users and preventing unintended disablement.</li>
<li>Reem Hamoui<a href="https://bugzil.la/2034688"> hooked the wallpaper check into the new toggle logic</a> so the Customization Panel accurately reflects wallpaper availability and state.</li>
<li>Irene Ni<a href="https://bugzil.la/2034912"> landed Nova UI updates for the Daily Briefing 3-pack card</a>, improving spacing, type scale, and tap targets.</li>
</ul>
<h4>Search and Urlbar</h4>
<ul>
<li>Marco has fixed a<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2034743"> couple</a> of<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1989632"> issues</a> with the places databases to try and improve stability. This should help with avoiding users losing bookmarks or favicons.</li>
<li>Work continues on the new separate search bar to improve the functionality, e.g.<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033231"> allowing middle click</a> to perform a search in a new tab,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2032991"> avoiding performing a</a> search when adding a search engine.</li>
<li>Work also continues on the new Nova layouts.</li>
</ul>
<h4>Smart Window</h4>
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2032122">uplifted 10 bugs</a> to 150.0.1 dot release addressing initial user feedback from diary study and <a href="https://connect.mozilla.org/">Connect</a>
<ul>
<li>jump to bottom of conversation <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028692">2028692</a></li>
<li>stop streaming button <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029204">2029204</a></li>
<li>back/forward navigation from assistant <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029229">2029229</a></li>
<li>dark mode for various chips <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2024499">2024499</a></li>
</ul>
</li>
<li>search engine switching from smart bar <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2021973">2021973</a></li>
<li>Nova styling within smart window <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026794">2026794</a></li>
</ul>
<h4>Storybook/Reusable Components/Acorn Design System</h4>
<ul>
<li>Dustin converted moz-breadcrumb-group variables into JSON design tokens <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029181">Bug 2029181 – Convert moz-breadcrumb-group variables into JSON design tokens</a></li>
<li>Dustin converted moz-box-* variables into JSON design tokens <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029180">Bug 2029180 – Convert moz-box-* variables into JSON design tokens</a></li>
<li>Dustin converted moz-promo variables to JSON design tokens <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029190">Bug 2029190 – Convert moz-promo variables into JSON design tokens</a></li>
<li>Dustin converted moz-reorderable-list variables to JSON design tokens <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029191">Bug 2029191 – Convert moz-reorderable-list variables into JSON design tokens</a></li>
<li>Dustin converted moz-visual-picker variables to JSON design tokens <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029193">Bug 2029193 – Convert moz-visual-picker-item variables into JSON design tokens</a></li>
<li>Dustin updated browser-shared.css so it passes use-design-tokens <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022985">Bug 2022985 – Update browser-shared.css so it passes use-design-tokens</a></li>
<li>Dustin updated popup.css so it passes use-design-tokens <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022979">Bug 2022979 – Update popup.css so it passes use-design-tokens</a></li>
<li>Jon added opacity tokens and added opacity to use-design-tokens stylelint rule  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1955325">Bug 1955325 – Create opacity tokens</a></li>
<li>Jon converted toolbar design tokens to JSON <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2017970">Bug 2017970 – Convert toolbar design tokens to json</a></li>
<li>Anna fixed moz-select with panel-list drop-down size inconsistency <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2032365">Bug 2032365 – Applications Action drop-down menus sometimes have a different size when opened</a></li>
<li>Anna fixed issue with the disabled state of moz-radio component <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027123">Bug 2027123 – moz-radio disabled state cannot be changed while the moz-radio-group is disabled</a></li>
<li>Anna updated moz-button and moz-box-button components to prevent label corruption when accesskeys are present and the label changes.   <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022326">Bug 2022326 – moz-button with accesskey label becomes corrupted when l10nId updates dynamically</a></li>
</ul>
<h4>UX Fundamentals</h4>
<ul>
<li>The error pages shown when a server sends back an invalid response header or an unsupported content encoding now display accurate, context-specific messages. The invalid response header page also gained a helpful list of next steps. – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027209">2027209</a></li>
<li>In progress: The error page illustrations are being replaced with new artwork, and the system now supports per-illustration size configuration, giving each image the ability to define its own appropriate dimensions. – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031837">2031837</a></li>
</ul>
<h4>Settings Redesign</h4>
<ul>
<li>Tim converted settings related to Accessibility page to config-based pane <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1968116">Bug 1968116 – Convert settings related to Accessibility page to config-based settings</a></li>
<li>Benjamin converted Privacy &amp; Security page to the config-based pane <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1968112">Bug 1968112 – Convert settings related to Privacy &amp; Security page to config-based settings</a></li>
<li>Finn integrated Firefox Labs page into setting-pane config <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2021047">Bug 2021047 – Integrate Firefox Labs page into setting-pane config</a></li>
<li>Anna converted Firefox Updates section to config-based prefs <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1990961">Bug 1990961 – Convert Firefox Updates section to config-based prefs</a></li>
<li>Mark Kennedy added moz-promo, that is welcoming users to the redesigned settings <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2015093">Bug 2015093 – Add a moz-promo to welcome users to the redesign</a>
<ul>
<li><a href="https://blog.nightly.mozilla.org/files/2026/06/image4.png"><img alt="The Firefox settings page in dark mode showing a notification banner that reads, &#x201C;Same settings, new look!&#x201D; The message further explains that the page has been reorganized to make settings easier to scan and explore, while keeping all existing settings unchanged. A &#x201C;Got it&#x201D; button appears below the message. The &#x201C;AI Controls&#x201D; section is visible underneath the banner." class="aligncenter size-full wp-image-2072" height="559" src="https://blog.nightly.mozilla.org/files/2026/06/image4.png" width="1431"/></a></li>
</ul>
</li>
<li>Anna added possibility to search for actions in the redesigned “Applications” section <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2020370">Bug 2020370 – It’s no longer possible to search for actions in the new “Applications” section</a></li>
<li>Anna fixed the Settings navbar layout breakage</li>
</ul></div>
    </content>
    <updated>2026-06-01T18:15:45Z</updated>
    <published>2026-06-01T18:15:45Z</published>
    <category term="News"/>
    <author>
      <name>Mike Conley</name>
    </author>
    <source>
      <id>https://blog.nightly.mozilla.org</id>
      <logo>https://blog.nightly.mozilla.org/files/2024/04/cropped-Fx-Browser-Nightly-icon-fullColor-512-32x32.png</logo>
      <link href="https://blog.nightly.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.nightly.mozilla.org" rel="alternate" type="text/html"/>
      <subtitle>Let's improve quality, build after build!</subtitle>
      <title>Firefox Nightly News</title>
      <updated>2026-06-03T18:27:38Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://ritter.vg/blog-webgl_renderer.html</id>
    <link href="http://ritter.vg/blog-webgl_renderer.html" rel="alternate"/>
    <title>webgl renderer privacy</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>WebGL exposes the details of your graphics hardware (specifically, the string that describes the rendering engine) in 2 ways.  There are three levels of protection that browsers have taken to protect this data.</p>


<ol>
	<li><code>gl.getParameter(gl.VENDOR)</code> and <code>gl.getParameter(gl.RENDERER)</code> - these are the 'simple' names.  At some point in the past, someone argued that it wasn't enough information, and therefore we have a second API</li>
	<li> <code>let ext = gl.getExtension('WEBGL_debug_renderer_info');</code> and then <code>gl.getParameter(ext.UNMASKED_VENDOR_WEBGL)</code> and <code>gl.getParameter(ext.UNMASKED_RENDERER_WEBGL)</code></li>
</ol>

<p>The unmasked values are intended to be the more detailed ones, so always make sure you're comparing apples to apples.  Another axis is that WebGL can render with Hardware or Software.  This isn't a guarentee which one you'll get, but you can hint towards one or the other and the browser may or may not respect it. Here are your values:</p>

<blockquote>
  <p class="hint" id="ctxInfo"/>
  <table id="infoTable">
    <tbody/>
  </table>
  <p class="hint" id="note"/>
</blockquote>
  <canvas height="1" id="glCanvas" style="display: none;" width="1"/>

  <span class="err"/><code class="badge"/><code class="badge"/><code class="badge"/><span class="err"/>


<p>Alright, now let's talk about what browsers do about it.  There's no point in talking about Vendor, Renderer, and Unmasked Vendor - they don't really show as much detailed info, it's all about Unmasked Renderer.  There are three levels:</p>

<ol>
	<li>Give a constant value.  (Or don't return anything at all.)  </li>
	<li>'Round' the values into buckets</li>
	<li>Give the exact value back</li>
</ol>

<p><b>Safari</b> and <b>Tor Browser</b> give constant values.</p>

<p><b>Firefox</b> 'rounds'.</p>

<p><b>Chrome</b> (and <b>Brave</b>, and I assume all-ish other Chrome-based browsers) give the exact value.</p>

<p>Firefox actually is purusing constant values, <em>this week</em>.  I wrote <a href="https://docs.google.com/document/d/1CPeDrno-OmMj5BSKTqD8dJTgnZbUq-ZgNCyKB8_xPTE/edit?tab=t.0#heading=h.kub2qfspnqw7">this document</a> for our QA team to test it. (You can get a sense of the internal sausage making it takes to launch a privacy feature from it.)  I don't know if you can see the dates but I made it May 20th.  The problem is <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2036879">this</a> - websites use this data legitimately to adjust behavior so that users get the best experience possible.  I found one example where they detect a buggy graphics stack; and a couple of examples where they adjust rendering so things are more performant for users with lower end machines - a problem Apple has less to worry about because they only support certain machine models!  </p>

<p>A common response to this seems to be ambivalence, and I would suggest that is a bit elitist. Yes, if you're caring about the details reveal by a particular Web API you probably have a computer where you don't need to worry, but making the web work well for everyone is important for equitable access to improving everyone's human condition.</p>

<p>We have been bucketing WebGL Renderer <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1715690">since 2021</a>.  While many of our (supported, on-by-default) fingerprinting protections are part of Enhanced Tracking Protection - rolling out first in PBM/ETP Strict before making it to ETP Standard/Normal Browsing Mode - the bucketing is <strong>on by default, for everyone, and is not disabled if ETP is disabled</strong>. </p>

<p>How much of a difference does it make?  A lot!  Here is the distribution of the raw values.  <strong>83,705 distinct values</strong>.</p>

<img alt="WebGL Renderer Value Distribution, before bucketing" src="https://ritter.vg/resources/webgl-renderer-before.png"/>

<p>Compare that to the bucketed data.  <strong>131 distinct values</strong>.</p>

<img alt="WebGL Renderer Value Distribution, after bucketing" src="https://ritter.vg/resources/webgl-renderer-after.png"/>

<p>Now this data is from Firefox, so I cant say conclusively what the distribution of data is in other browsers, but... yeah.  To claim Chrome (of all browsers!) is doing this better than us is pure FUD.  We're making a big impact in how fingerprintable you are <em>today</em> and we're trying to improve it even further.  </p></div>
    </summary>
    <updated>2026-06-01T17:36:00Z</updated>
    <published>2026-06-01T17:36:00Z</published>
    <source>
      <id>http://ritter.vg</id>
      <author>
        <name>Tom Ritter</name>
      </author>
      <link href="http://ritter.vg" rel="alternate" type="text/html"/>
      <link href="https://ritter.vg/news.xml" rel="self" type="application/rss+xml"/>
      <subtitle>Personal weblog and homepage of Tom Ritter.  A smash and grab approach to technology.</subtitle>
      <title>ritter.vg</title>
      <updated>2026-06-12T10:58:50Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://fitzgeraldnick.com/2026/06/01/structure-aware-fuzzing-experiment.html</id>
    <link href="http://fitzgeraldnick.com/2026/06/01/structure-aware-fuzzing-experiment.html" rel="alternate" type="text/html"/>
    <title>A Structure-Aware Fuzzing Experiment</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Structure-aware fuzzing can better exercise the system under test (SUT) by
crafting inputs in the format expected by the SUT, rather than throwing
pseudorandom bytes against it. That is, it avoids “shallow” inputs that the SUT
will reject early (for example, syntactically invalid source text when fuzzing a
programming language’s compiler) and only produces inputs that go “deep” into
the SUT (e.g. programs that type-check and exercise the mid-end optimizer and
backend code generator). The Rust fuzzing ecosystem is largely built around
<a href="https://github.com/rust-fuzz/cargo-fuzz"><code class="language-plaintext highlighter-rouge">cargo-fuzz</code></a> and the <a href="https://github.com/rust-fuzz/libfuzzer"><code class="language-plaintext highlighter-rouge">libfuzzer-sys</code></a> crate, which provides two methods for
structure-aware fuzzing:</p>

<ol>
  <li>
    <p><em>Generating</em> structured inputs from scratch with the <a href="https://github.com/rust-fuzz/arbitrary"><code class="language-plaintext highlighter-rouge">arbitrary</code></a> crate</p>
  </li>
  <li>
    <p><em>Mutating</em> existing inputs from the fuzzer’s corpus in a structure-aware
manner, thereby producing new structured inputs, via the
<a href="https://docs.rs/libfuzzer-sys/0.4.12/libfuzzer_sys/macro.fuzz_mutator.html"><code class="language-plaintext highlighter-rouge">fuzz_mutator!</code></a> hook</p>
  </li>
</ol>

<p>While the two methods are not technically mutually exclusive, combining the two
can be difficult and engineering resources are finite. So:</p>

<blockquote>
  <p><strong><em>If we are only implementing one approach, is generation or mutation better?</em></strong></p>
</blockquote>

<p>To help answer this question, I implemented structure-aware generation and
mutation of guaranteed-valid <a href="https://webassembly.org/">WebAssembly</a> (Wasm) instruction sequences. This
task is small enough to be easily understandable but large enough and real
enough to (hopefully) be representative and applicable to other domains, or, at
the very least, interesting.<sup id="fnref:applicable"><a class="footnote" href="https://fitzgeraldnick.com/weblog/feeds/latest-atom/#fn:applicable" rel="footnote">1</a></sup> To evaluate their effectiveness, I
used <a href="https://wasmtime.dev/">Wasmtime</a> as the SUT, <code class="language-plaintext highlighter-rouge">libfuzzer-sys</code> as the fuzzing engine driving
everything, and then compared code coverage over time when using mutation-based
fuzzing versus generation-based fuzzing.</p>

<p>Additionally, there are many ways we can generate pseudorandom WebAssembly
instruction sequences. In this experiment, I’ve evaluated three methods:</p>

<ol>
  <li>
    <p>Unconstrained instruction sequence generation followed by a fixup pass to
ensure validity</p>
  </li>
  <li>
    <p>Generating valid instructions in a forwards, bottom-up
manner (from operands to operators)</p>
  </li>
  <li>
    <p>Generating valid instructions in a backwards, top-down manner (from operators
to operands)</p>
  </li>
</ol>

<p>In contrast, while there are surely many ways to mutate a given WebAssembly
instruction sequence into a new, valid instruction sequence, I’ve only
implemented one method: perform an arbitrary instruction insertion, deletion, or
replacement, producing a new but probably-invalid instruction sequence, and then
run the same fixup pass mentioned previously to ensure validity. This is the
direct mutation-based equivalent of the first generation-based method.</p>

<p><em>Before continuing further, I want to disclose that I am the author of
<code class="language-plaintext highlighter-rouge">wasm-smith</code> and <code class="language-plaintext highlighter-rouge">mutatis</code>, and a maintainer of Wasmtime, <code class="language-plaintext highlighter-rouge">arbitrary</code>,
<code class="language-plaintext highlighter-rouge">libfuzzer-sys</code>, and <code class="language-plaintext highlighter-rouge">cargo-fuzz</code>. That is, while I am familiar with Wasm,
fuzzing, fuzzing Wasm, and both the <code class="language-plaintext highlighter-rouge">arbitrary</code> and <code class="language-plaintext highlighter-rouge">mutatis</code> crates, I may also
be propagating my own biases into these implementations.</em></p>

<h3>Background</h3>

<h4>Generation-Based and Mutation-Based Fuzzing</h4>

<p>A generation-based fuzzer uses a <em>generator</em> to create a pseudo-random test
cases from scratch, feeds these into the system under test, and reports any
failures to the user:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="n">generation_based_fuzzing</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">(</span>
    <span class="c1">// A test-case generator.</span>
    <span class="n">generator</span><span class="p">:</span> <span class="k">impl</span> <span class="nf">Fn</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="n">T</span><span class="p">,</span>
    <span class="c1">// A function to run the system under test with a</span>
    <span class="c1">// generated test case, returning a result that</span>
    <span class="c1">// describes whether the run was successful or</span>
    <span class="c1">// not.</span>
    <span class="n">run_system_under_test</span><span class="p">:</span> <span class="k">impl</span> <span class="nf">Fn</span><span class="p">(</span><span class="o">&amp;</span><span class="n">T</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">FuzzResult</span><span class="p">,</span>
<span class="p">)</span> <span class="p">{</span>
    <span class="k">loop</span> <span class="p">{</span>
        <span class="c1">// Generate an input.</span>
        <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nf">generator</span><span class="p">();</span>

        <span class="c1">// Run the input through the system under test.</span>
        <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="nf">run_system_under_test</span><span class="p">(</span><span class="o">&amp;</span><span class="n">input</span><span class="p">);</span>

        <span class="c1">// If the system crashed, panicked, failed an</span>
        <span class="c1">// assertion, violated an invariant, or etc...</span>
        <span class="c1">// then report that to the user.</span>
        <span class="k">if</span> <span class="k">let</span> <span class="nf">Err</span><span class="p">(</span><span class="n">failure</span><span class="p">)</span> <span class="o">=</span> <span class="n">result</span> <span class="p">{</span>
            <span class="nf">report_to_user</span><span class="p">(</span><span class="o">&amp;</span><span class="n">input</span><span class="p">,</span> <span class="n">failure</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>On the other hand, mutation-based fuzzers are given an initial corpus of inputs
and create new inputs by mutating existing corpus members. They run each new
input through the SUT, report failures the same as before, and if the new input
was “interesting” (for example, exercised new code paths in the SUT that weren’t
previously covered in any other input’s execution) then the new input is added
into the corpus for use in future test iterations:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fn</span> <span class="n">mutation_based_fuzzing</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">(</span>
    <span class="c1">// A corpus of test cases.</span>
    <span class="n">corpus</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">Corpus</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="c1">// A function to pseudo-randomly mutate an existing</span>
    <span class="c1">// input into a new input.</span>
    <span class="n">mutate</span><span class="p">:</span> <span class="k">impl</span> <span class="nf">Fn</span><span class="p">(</span><span class="o">&amp;</span><span class="n">T</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">T</span><span class="p">,</span>
    <span class="c1">// A function to run an input in the system under</span>
    <span class="c1">// test, returning a result that describes whether</span>
    <span class="c1">// the run was successful or not.</span>
    <span class="n">run_system_under_test</span><span class="p">:</span> <span class="k">impl</span> <span class="nf">Fn</span><span class="p">(</span><span class="o">&amp;</span><span class="n">T</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="n">FuzzResult</span><span class="p">,</span>
<span class="p">)</span> <span class="p">{</span>
    <span class="k">loop</span> <span class="p">{</span>
        <span class="c1">// Choose an old test case from the corpus.</span>
        <span class="k">let</span> <span class="n">old_input</span> <span class="o">=</span> <span class="n">corpus</span><span class="nf">.choose_one</span><span class="p">();</span>

        <span class="c1">// Pseudo-randomly mutate that old test case,</span>
        <span class="c1">// creating a new one.</span>
        <span class="k">let</span> <span class="n">input</span> <span class="o">=</span> <span class="nf">mutate</span><span class="p">(</span><span class="n">old_input</span><span class="p">);</span>

        <span class="c1">// Run the input through the system under test.</span>
        <span class="k">let</span> <span class="n">result</span> <span class="o">=</span> <span class="nf">run_system_under_test</span><span class="p">(</span><span class="o">&amp;</span><span class="n">input</span><span class="p">);</span>

        <span class="c1">// If the system crashed, panicked, failed an</span>
        <span class="c1">// assertion, violated an invariant, or etc...</span>
        <span class="c1">// then report that to the user.</span>
        <span class="k">if</span> <span class="k">let</span> <span class="nf">Err</span><span class="p">(</span><span class="n">failure</span><span class="p">)</span> <span class="o">=</span> <span class="n">result</span> <span class="p">{</span>
            <span class="nf">report_to_user</span><span class="p">(</span><span class="o">&amp;</span><span class="n">input</span><span class="p">,</span> <span class="n">failure</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="c1">// If the input was interesting, for example if</span>
        <span class="c1">// it executed previously-unknown code paths,</span>
        <span class="c1">// then add it into the corpus for use in a</span>
        <span class="c1">// future iteration.</span>
        <span class="k">if</span> <span class="n">result</span><span class="nf">.input_was_interesting</span><span class="p">()</span> <span class="p">{</span>
            <span class="n">corpus</span><span class="nf">.insert</span><span class="p">(</span><span class="n">input</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The two approaches are not mutually exclusive and hybrid generation- and
mutation-based fuzzers exist.</p>

<p>More resources:</p>

<ul>
  <li><a href="https://en.wikipedia.org/wiki/Fuzzing#Reuse_of_existing_input_seeds">Wikipedia’s “Fuzzing” article’s “Reuse of existing input seeds”
section</a></li>
  <li><a href="https://www.fuzzingbook.org/html/MutationFuzzer.html">The Fuzzing Book’s Mutation-Based Fuzzing
chapter</a></li>
  <li><a href="https://fitzgen.com/2020/08/24/writing-a-test-case-generator.html">Writing a Test Case Generator for a Programming
Language</a></li>
</ul>

<h4>Structure-Aware Fuzzing</h4>

<p>Structure-<em>unaware</em> fuzzing will generate pseudorandom byte sequences and pass
them directly to the SUT. If the SUT expects some sort of structured input,
e.g. the source text for a programming language, it is likely that these byte
sequences are invalid and will be rejected early by the SUT’s frontend. For
example, when fuzzing a compiler, the input is rejected as syntactically invalid
by the parser or rejected as semantically invalid by the type checker. This can
be useful when hardening a tokenizer, parser, or type checker, but is less
useful when hunting for misoptimization in the mid-end or bad instruction
encoding in the backend because the inputs are unlikely to make it that far
through the compiler’s pipeline.</p>

<p>Structure-<em>aware</em> fuzzing will produce inputs that match the SUT’s expected
input format. Returning to the compiler-fuzzing example, structure-aware fuzzing
lets us generate valid programs for the compiler, so we can exercise more of the
mid-end and backend, rather than just the frontend.</p>

<p>Structure-aware fuzzing is often generation-based: for example using
<a href="https://www.fuzzingbook.org/html/Grammars.html">grammar-based fuzzing</a> to generate pseudorandom strings from a given language
grammar or language-specific tools like <a href="https://github.com/csmith-project/csmith"><code class="language-plaintext highlighter-rouge">csmith</code></a> and <a href="https://docs.rs/wasm-smith"><code class="language-plaintext highlighter-rouge">wasm-smith</code></a> that
generate C and WebAssembly programs respectively. But structure-aware fuzzing
can also be mutation-based: <a href="https://github.com/llvm/llvm-project/blob/192601e8b3ad8b5f73cf27f2093fef5a8c9f4cb6/compiler-rt/test/fuzzer/CompressedTest.cpp#L33-L59"><code class="language-plaintext highlighter-rouge">libFuzzer</code>’s custom mutator
example</a>
implements a structure-aware mutator for zlib-compressed strings, where the raw
input is decompressed, the decompressed data is mutated, and then the mutated
data is recompressed to provide the new raw input. The mutator is aware of the
SUT’s zlib-compressed input structure.</p>

<p>More resources:</p>

<ul>
  <li><a href="https://en.wikipedia.org/wiki/Fuzzing#Aware_of_input_structure">Wikipedia’s “Fuzzing” article’s “Aware of input structure”
section</a></li>
  <li><a href="https://github.com/google/fuzzing/blob/master/docs/structure-aware-fuzzing.md"><code class="language-plaintext highlighter-rouge">google/fuzzing</code> on structure-aware
fuzzing</a></li>
  <li><a href="https://rust-fuzz.github.io/book/cargo-fuzz/structure-aware-fuzzing.html">The <code class="language-plaintext highlighter-rouge">rust-fuzz</code> book on structure-aware
fuzzing</a></li>
</ul>

<h4>The <code class="language-plaintext highlighter-rouge">arbitrary</code> Crate</h4>

<p>The <a href="https://github.com/rust-fuzz/arbitrary"><code class="language-plaintext highlighter-rouge">arbitrary</code></a> crate helps Rust developers write custom structure-aware
generators for fuzzing. It provides building blocks and abstractions for
translating a raw byte sequence (usually from a fuzzing engine) into a
structured type, effectively interpreting the raw bytes as a “DNA string” or set
of predetermined choices for its decision tree. The library also provides a
<code class="language-plaintext highlighter-rouge">derive(Arbitrary)</code> macro to automatically implement its functionality for a
given type.</p>

<p>Because <code class="language-plaintext highlighter-rouge">arbitrary</code> is effectively implemented by combining decision trees, it
is extremely easy to create imbalanced trees and unintentionally <a href="https://blog.regehr.org/archives/1700">bias the
distribution of generated test cases</a>.</p>

<h4>The <code class="language-plaintext highlighter-rouge">mutatis</code> Crate</h4>

<p>The <a href="https://docs.rs/mutatis"><code class="language-plaintext highlighter-rouge">mutatis</code></a> crate is, at a high-level, performing the same role for
authoring structure-aware mutators that <code class="language-plaintext highlighter-rouge">arbitrary</code> plays for generators. That
is, it provides Rust developers with abstractions and combinators for creating
custom structure-aware mutators. It also provides a <code class="language-plaintext highlighter-rouge">derive(Mutate)</code> macro to
automatically implement its functionality for a given type.</p>

<p><code class="language-plaintext highlighter-rouge">mutatis</code> is designed to resist bias via a two-phase design: first, it
enumerates all of the candidate mutations that could be applied to a test case,
and only afterwards chooses a particular random mutation from the candidate set
to actually apply.</p>

<h4>WebAssembly</h4>

<p><a href="https://webassembly.org/">WebAssembly</a> is a virtual instruction set designed to be safe, portable, and
fast. It is a stack machine where an instruction’s operands are popped off a
stack during execution and results pushed. It has sandboxed linear memories,
global variables, and local variables (the latter two effectively being two
kinds of virtual registers). The following instruction sequence computes <code class="language-plaintext highlighter-rouge">a * 3</code>
and stores the result into memory at address <code class="language-plaintext highlighter-rouge">p</code>:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">;; []</span>
<span class="nf">local.get</span> <span class="kc">$</span><span class="nv">p</span>
<span class="c1">;; [p]</span>
<span class="nf">local.get</span> <span class="kc">$</span><span class="nv">a</span>
<span class="c1">;; [p, a]</span>
<span class="nf">i32.const</span> <span class="mi">3</span>
<span class="c1">;; [p, a, 3]</span>
<span class="nf">i32.mul</span>
<span class="c1">;; [p, a*3]</span>
<span class="nf">i32.store</span>
<span class="c1">;; []</span>
</code></pre></div></div>

<h3>Generator and Mutator Implementation</h3>

<p>The range of all three generators and the mutator is the same universe of
WebAssembly programs. They are all implemented on top of the same <code class="language-plaintext highlighter-rouge">Module</code> and
<code class="language-plaintext highlighter-rouge">Inst</code> types, and, given enough time, none is capable of producing an
instruction sequence that another cannot. This helps ensure that our comparison
is apples-to-apples. However, due to their different implementation techniques,
they do produce different distributions of WebAssembly programs within that
universe, and produce test cases at different speeds from one another, which
ultimately affects how efficiently they exercise the SUT.</p>

<p>All of the generators are built on top of the <a href="https://github.com/rust-fuzz/arbitrary"><code class="language-plaintext highlighter-rouge">arbitrary</code></a> crate. The mutator
is built on top of the <a href="https://docs.rs/mutatis"><code class="language-plaintext highlighter-rouge">mutatis</code></a> crate.</p>

<p>The <code class="language-plaintext highlighter-rouge">Module</code> type is our structured fuzzing input. It describes a WebAssembly
module containing a variable number of linear memories, a variable number and
type of globals, and one function with a variable number and type of parameters
and results and a variable instruction sequence:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cd">/// A WebAssembly module of the shape:</span>
<span class="cd">///</span>
<span class="cd">///     (module</span>
<span class="cd">///       (memory ...)</span>
<span class="cd">///       (memory ...)</span>
<span class="cd">///       ...</span>
<span class="cd">///</span>
<span class="cd">///       (global ...)</span>
<span class="cd">///       (global ...)</span>
<span class="cd">///       ...</span>
<span class="cd">///</span>
<span class="cd">///       (func (export "run") (param ...) (result ...)</span>
<span class="cd">///         ...</span>
<span class="cd">///       )</span>
<span class="cd">///     )</span>
<span class="k">pub</span> <span class="k">struct</span> <span class="n">Module</span> <span class="p">{</span>
    <span class="n">num_memories</span><span class="p">:</span> <span class="nb">u32</span><span class="p">,</span>
    <span class="n">globals</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Global</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">param_types</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">ValType</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">result_types</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">ValType</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">instructions</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Inst</span><span class="o">&gt;</span><span class="p">,</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">Inst</code> type is an <code class="language-plaintext highlighter-rouge">enum</code> of all the WebAssembly instructions the
implementations support, which is all of the integer, float, SIMD, memory,
local, and global instructions. Control-flow, threading, table, and GC
instructions are not supported. Here is a subset of <code class="language-plaintext highlighter-rouge">Inst</code>’s definition:</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cd">/// A WebAssembly instruction.</span>
<span class="k">pub</span> <span class="k">enum</span> <span class="n">Inst</span> <span class="p">{</span>
    <span class="nb">Drop</span><span class="p">,</span>
    <span class="nf">LocalGet</span><span class="p">(</span><span class="nb">u32</span><span class="p">),</span>
    <span class="nf">GlobalGet</span><span class="p">(</span><span class="nb">u32</span><span class="p">),</span>

    <span class="c1">// ...</span>

    <span class="nf">I32Const</span><span class="p">(</span><span class="nb">i32</span><span class="p">),</span>
    <span class="n">I32Add</span><span class="p">,</span>
    <span class="n">I32Sub</span><span class="p">,</span>
    <span class="n">I32Mul</span><span class="p">,</span>

    <span class="c1">// ...</span>

    <span class="nf">I64Const</span><span class="p">(</span><span class="nb">i64</span><span class="p">),</span>
    <span class="n">I64Add</span><span class="p">,</span>
    <span class="n">I64Sub</span><span class="p">,</span>
    <span class="n">I64Mul</span><span class="p">,</span>

    <span class="c1">// ...</span>

    <span class="nf">F32Const</span><span class="p">(</span><span class="nb">f32</span><span class="p">),</span>
    <span class="n">F32Add</span><span class="p">,</span>
    <span class="n">F32Sub</span><span class="p">,</span>
    <span class="n">F32Mul</span><span class="p">,</span>

    <span class="c1">// ...</span>

    <span class="nf">F64Const</span><span class="p">(</span><span class="nb">f64</span><span class="p">),</span>
    <span class="n">F64Add</span><span class="p">,</span>
    <span class="n">F64Sub</span><span class="p">,</span>
    <span class="n">F64Mul</span><span class="p">,</span>

    <span class="c1">// ...</span>

    <span class="n">I32WrapI64</span><span class="p">,</span>
    <span class="n">I64ExtendI32S</span><span class="p">,</span>
    <span class="n">I64ExtendI32U</span><span class="p">,</span>

    <span class="c1">// ...</span>

    <span class="nf">V128Const</span><span class="p">(</span><span class="nb">i128</span><span class="p">),</span>
    <span class="n">I8x16Add</span><span class="p">,</span>
    <span class="n">I8x16Sub</span><span class="p">,</span>

    <span class="c1">// ...</span>

    <span class="nf">I32Load</span><span class="p">(</span><span class="nb">u32</span><span class="p">),</span>
    <span class="nf">I64Load</span><span class="p">(</span><span class="nb">u32</span><span class="p">),</span>

    <span class="c1">// ...</span>

    <span class="nf">I32Store</span><span class="p">(</span><span class="nb">u32</span><span class="p">),</span>
    <span class="nf">I64Store</span><span class="p">(</span><span class="nb">u32</span><span class="p">),</span>

    <span class="c1">// ...</span>

    <span class="nf">MemorySize</span><span class="p">(</span><span class="nb">u32</span><span class="p">),</span>
    <span class="nf">MemoryGrow</span><span class="p">(</span><span class="nb">u32</span><span class="p">),</span>
<span class="p">}</span>
</code></pre></div></div>

<p>There is an <code class="language-plaintext highlighter-rouge">Inst::operand_types</code> method that returns the types that the
instruction pops from the stack, and an <code class="language-plaintext highlighter-rouge">Inst::result_type</code> method that returns
the type of the value that the instruction pushes onto the stack, if
any. Finally, the <code class="language-plaintext highlighter-rouge">Module::to_wasm_binary</code> method encodes the module into
WebAssembly’s binary format, so it can be fed into Wasmtime. These methods are
used, directly or indirectly, in every generator and mutator implementation.</p>

<h4><code class="language-plaintext highlighter-rouge">arb</code></h4>

<p>The <code class="language-plaintext highlighter-rouge">arb</code> generator leverages <code class="language-plaintext highlighter-rouge">derive(arbitrary::Arbitrary)</code> on our structured
input types to generate a pseudorandom instance of <code class="language-plaintext highlighter-rouge">Module</code>, unconstrained by
validity. The module’s instruction sequence is almost certainly not valid at
this point: it likely is missing operands for instructions, producing more
results than the function’s signature describes, producing results of types that
don’t match the function signature, accessing globals and locals that don’t
exist, etc… Having produced an instance of <code class="language-plaintext highlighter-rouge">Module</code>, it next calls the
<code class="language-plaintext highlighter-rouge">Module::fixup</code> method to mutate the <code class="language-plaintext highlighter-rouge">Module</code> so that it is valid.</p>

<p>The <code class="language-plaintext highlighter-rouge">fixup</code> method works by abstractly interpreting the instruction sequence to
track the types of each value on the stack at every program point. Whenever an
instruction’s operand types don’t match the types on top of the stack, it
generates dummy values of the correct type. When the instructions produce more
values than the function’s signature proscribes, it emits <code class="language-plaintext highlighter-rouge">drop</code> instructions.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">impl</span> <span class="n">Module</span> <span class="p">{</span>
    <span class="k">pub</span> <span class="k">fn</span> <span class="nf">fixup</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span> <span class="k">mut</span> <span class="n">make_value</span><span class="p">:</span> <span class="k">impl</span> <span class="nf">FnMut</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="nb">i64</span><span class="p">)</span> <span class="p">{</span>
        <span class="c1">// ...</span>

        <span class="c1">// The fixed-up instructions.</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">fixed</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">with_capacity</span><span class="p">(</span>
            <span class="k">self</span><span class="py">.instructions</span><span class="nf">.len</span><span class="p">(),</span>
        <span class="p">);</span>

        <span class="c1">// The types on the stack at any given program</span>
        <span class="c1">// point. Similar to the Wasm spec's appendix's</span>
        <span class="c1">// validation algorithm.</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">stack</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">ValType</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>

        <span class="k">for</span> <span class="n">inst</span> <span class="k">in</span> <span class="nn">mem</span><span class="p">::</span><span class="nf">take</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="py">.instructions</span><span class="p">)</span> <span class="p">{</span>
            <span class="c1">// Special-case `drop` because it is</span>
            <span class="c1">// polymorphic.</span>
            <span class="k">if</span> <span class="nd">matches!</span><span class="p">(</span><span class="n">inst</span><span class="p">,</span> <span class="nn">Inst</span><span class="p">::</span><span class="nb">Drop</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">if</span> <span class="n">stack</span><span class="nf">.is_empty</span><span class="p">()</span> <span class="p">{</span>
                    <span class="n">fixed</span><span class="nf">.push</span><span class="p">(</span>
                        <span class="nn">ValType</span><span class="p">::</span><span class="n">I32</span><span class="nf">.make_const</span><span class="p">(</span><span class="nf">make_value</span><span class="p">()),</span>
                    <span class="p">);</span>
                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                    <span class="n">stack</span><span class="nf">.pop</span><span class="p">();</span>
                <span class="p">}</span>
                <span class="n">fixed</span><span class="nf">.push</span><span class="p">(</span><span class="n">inst</span><span class="p">);</span>
                <span class="k">continue</span><span class="p">;</span>
            <span class="p">}</span>

            <span class="c1">// First clamp entity indices to valid</span>
            <span class="c1">// ranges.</span>
            <span class="k">let</span> <span class="nf">Some</span><span class="p">(</span><span class="n">inst</span><span class="p">)</span> <span class="o">=</span> <span class="k">self</span><span class="nf">.fixup_inst_immediates</span><span class="p">(</span>
                <span class="o">&amp;</span><span class="k">mut</span> <span class="n">make_value</span><span class="p">,</span>
                <span class="n">has_mutable_global</span><span class="p">,</span>
                <span class="n">inst</span><span class="p">,</span>
            <span class="p">)</span> <span class="k">else</span> <span class="p">{</span>
                <span class="k">continue</span>
            <span class="p">};</span>

            <span class="c1">// Then make sure that the stack has</span>
            <span class="c1">// operands of the correct types for this</span>
            <span class="c1">// instruction.</span>
            <span class="k">self</span><span class="nf">.fixup_stack</span><span class="p">(</span>
                <span class="o">&amp;</span><span class="k">mut</span> <span class="n">make_value</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="k">mut</span> <span class="n">fixed</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="k">mut</span> <span class="n">stack</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="n">inst</span><span class="p">,</span>
            <span class="p">);</span>

            <span class="c1">// Finally, apply the effects to the stack.</span>
            <span class="k">let</span> <span class="n">len_operands</span> <span class="o">=</span> <span class="n">inst</span><span class="nf">.operand_types</span><span class="p">(</span>
                <span class="o">&amp;</span><span class="k">self</span><span class="py">.globals</span><span class="p">,</span>
            <span class="p">)</span><span class="nf">.len</span><span class="p">();</span>
            <span class="n">stack</span><span class="nf">.truncate</span><span class="p">(</span><span class="n">stack</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</span> <span class="n">len_operands</span><span class="p">);</span>
            <span class="n">stack</span><span class="nf">.extend</span><span class="p">(</span><span class="n">inst</span><span class="nf">.result_type</span><span class="p">(</span>
                <span class="o">&amp;</span><span class="k">self</span><span class="py">.param_types</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="k">self</span><span class="py">.globals</span><span class="p">,</span>
            <span class="p">));</span>

            <span class="n">fixed</span><span class="nf">.push</span><span class="p">(</span><span class="n">inst</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="c1">// ...</span>

        <span class="k">self</span><span class="py">.instructions</span> <span class="o">=</span> <span class="n">fixed</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">fn</span> <span class="nf">fixup_stack</span><span class="p">(</span>
        <span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span>
        <span class="k">mut</span> <span class="n">make_value</span><span class="p">:</span> <span class="k">impl</span> <span class="nf">FnMut</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="nb">i64</span><span class="p">,</span>
        <span class="n">fixed</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Inst</span><span class="o">&gt;</span><span class="p">,</span>
        <span class="n">stack</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">ValType</span><span class="o">&gt;</span><span class="p">,</span>
        <span class="n">inst</span><span class="p">:</span> <span class="o">&amp;</span><span class="n">Inst</span><span class="p">,</span>
    <span class="p">)</span> <span class="p">{</span>
        <span class="k">let</span> <span class="n">needed</span> <span class="o">=</span> <span class="n">inst</span><span class="nf">.operand_types</span><span class="p">(</span><span class="o">&amp;</span><span class="k">self</span><span class="py">.globals</span><span class="p">);</span>
        <span class="k">let</span> <span class="n">n</span> <span class="o">=</span> <span class="n">needed</span><span class="nf">.len</span><span class="p">();</span>

        <span class="k">if</span> <span class="n">stack</span><span class="nf">.len</span><span class="p">()</span> <span class="o">&gt;=</span> <span class="n">n</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="mi">0</span><span class="o">..</span><span class="n">n</span><span class="p">)</span><span class="nf">.all</span><span class="p">(|</span><span class="n">i</span><span class="p">|</span> <span class="p">{</span>
                <span class="n">stack</span><span class="p">[</span><span class="n">stack</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</span> <span class="n">n</span> <span class="o">+</span> <span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">needed</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
            <span class="p">})</span> <span class="p">{</span>
                <span class="c1">// All needed operands are on the stack.</span>
                <span class="k">return</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="k">if</span> <span class="n">stack</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.enumerate</span><span class="p">()</span><span class="nf">.all</span><span class="p">(|(</span><span class="n">i</span><span class="p">,</span> <span class="n">ty</span><span class="p">)|</span> <span class="p">{</span>
                <span class="o">*</span><span class="n">ty</span> <span class="o">==</span> <span class="n">needed</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
            <span class="p">})</span> <span class="p">{</span>
                <span class="c1">// A prefix of needed operands are on the</span>
                <span class="c1">// stack; make constants for the tail that</span>
                <span class="c1">// are missing.</span>
                <span class="k">for</span> <span class="n">ty</span> <span class="k">in</span> <span class="o">&amp;</span><span class="n">needed</span><span class="p">[</span><span class="n">stack</span><span class="nf">.len</span><span class="p">()</span><span class="o">..</span><span class="p">]</span> <span class="p">{</span>
                    <span class="n">fixed</span><span class="nf">.push</span><span class="p">(</span><span class="n">ty</span><span class="nf">.make_const</span><span class="p">(</span><span class="nf">make_value</span><span class="p">()));</span>
                    <span class="n">stack</span><span class="nf">.push</span><span class="p">(</span><span class="o">*</span><span class="n">ty</span><span class="p">);</span>
                <span class="p">}</span>
                <span class="k">return</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>

        <span class="c1">// Otherwise, just make constants for all the</span>
        <span class="c1">// needed operands.</span>
        <span class="k">for</span> <span class="n">ty</span> <span class="k">in</span> <span class="n">needed</span> <span class="p">{</span>
            <span class="n">fixed</span><span class="nf">.push</span><span class="p">(</span><span class="n">ty</span><span class="nf">.make_const</span><span class="p">(</span><span class="nf">make_value</span><span class="p">()));</span>
            <span class="n">stack</span><span class="nf">.push</span><span class="p">(</span><span class="o">*</span><span class="n">ty</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="c1">// ...</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">fixup</code> method also makes sure that for all instructions that have an
immediate referencing some entity, the referenced entity is valid. For example,
for a <code class="language-plaintext highlighter-rouge">local.get $l</code> instruction, it ensures that local <code class="language-plaintext highlighter-rouge">$l</code> actually exists or
else rewrites the local to one that does exist.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">impl</span> <span class="n">Module</span> <span class="p">{</span>
    <span class="c1">// ...</span>

    <span class="k">fn</span> <span class="nf">fixup_inst_immediates</span><span class="p">(</span>
        <span class="o">&amp;</span><span class="k">mut</span> <span class="k">self</span><span class="p">,</span>
        <span class="k">mut</span> <span class="n">make_value</span><span class="p">:</span> <span class="k">impl</span> <span class="nf">FnMut</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="nb">i64</span><span class="p">,</span>
        <span class="n">has_mutable_global</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span>
        <span class="k">mut</span> <span class="n">inst</span><span class="p">:</span> <span class="n">Inst</span><span class="p">,</span>
    <span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Option</span><span class="o">&lt;</span><span class="n">Inst</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="k">match</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">inst</span> <span class="p">{</span>
            <span class="nn">Inst</span><span class="p">::</span><span class="nf">LocalGet</span><span class="p">(</span><span class="n">l</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="o">*</span><span class="n">l</span> <span class="o">%=</span> <span class="k">self</span><span class="py">.param_types</span><span class="nf">.len</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u32</span><span class="p">,</span>

            <span class="c1">// ...</span>

            <span class="nn">Inst</span><span class="p">::</span><span class="nf">I32Load</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
            <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">I64Load</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
            <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">F32Load</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
            <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">F64Load</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
            <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">V128Load</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
                <span class="k">if</span> <span class="k">self</span><span class="py">.num_memories</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
                    <span class="k">return</span> <span class="nb">None</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="o">*</span><span class="n">m</span> <span class="o">%=</span> <span class="k">self</span><span class="py">.num_memories</span><span class="p">;</span>
            <span class="p">}</span>

            <span class="c1">// ...</span>

            <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{}</span>
        <span class="p">}</span>

        <span class="nf">Some</span><span class="p">(</span><span class="n">inst</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>After calling <code class="language-plaintext highlighter-rouge">fixup</code>, the <code class="language-plaintext highlighter-rouge">arb</code> generator invokes <code class="language-plaintext highlighter-rouge">Module::to_wasm_binary</code> to
get the encoded Wasm program.</p>

<h4><code class="language-plaintext highlighter-rouge">bottom_up</code></h4>

<p>The <code class="language-plaintext highlighter-rouge">bottom_up</code> generator also uses abstract interpretation to track the types
of values on the stack. It generates instructions in forwards order, from
operands to operators. It begins with an empty stack, filters candidate
instructions down to just those that would be valid given the types currently on
the stack, randomly chooses one, updates the stack types accordingly, and
repeats the process. This is the same approach that <a href="https://docs.rs/wasm-smith"><code class="language-plaintext highlighter-rouge">wasm-smith</code></a> uses. After
generating instructions this way, it then makes sure that the final types on the
stack match the function signature’s results, similar to the end of <code class="language-plaintext highlighter-rouge">fixup</code>.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">impl</span> <span class="n">Module</span> <span class="p">{</span>
    <span class="k">pub</span> <span class="k">fn</span> <span class="nf">bottom_up</span><span class="p">(</span><span class="n">u</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">Unstructured</span><span class="o">&lt;</span><span class="nv">'_</span><span class="o">&gt;</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="k">Self</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="c1">// ...</span>

        <span class="k">let</span> <span class="n">max_insts</span> <span class="o">=</span> <span class="n">u</span><span class="nf">.int_in_range</span><span class="p">(</span><span class="mi">1</span><span class="o">..=</span><span class="n">MAX_INSTS</span><span class="p">)</span><span class="o">?</span><span class="p">;</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">instructions</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">stack</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">ValType</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>

        <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">max_insts</span> <span class="p">{</span>
            <span class="k">if</span> <span class="n">stack</span> <span class="o">==</span> <span class="n">result_types</span> <span class="o">&amp;&amp;</span> <span class="n">u</span><span class="nf">.ratio</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span><span class="o">?</span> <span class="p">{</span>
                <span class="k">break</span><span class="p">;</span>
            <span class="p">}</span>

            <span class="c1">// Choose a random instruction whose operand</span>
            <span class="c1">// types match those currently on the stack.</span>
            <span class="k">let</span> <span class="n">inst</span> <span class="o">=</span> <span class="nf">choose_inst_bottom_up</span><span class="p">(</span>
                <span class="n">u</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="n">stack</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="n">param_types</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="n">globals</span><span class="p">,</span>
                <span class="n">num_memories</span><span class="p">,</span>
            <span class="p">)</span><span class="o">?</span><span class="p">;</span>

            <span class="c1">// Apply this instruction's effects to the</span>
            <span class="c1">// stack.</span>
            <span class="nf">apply_inst</span><span class="p">(</span>
                <span class="o">&amp;</span><span class="n">inst</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="k">mut</span> <span class="n">stack</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="n">param_types</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="n">globals</span><span class="p">,</span>
            <span class="p">);</span>
            <span class="n">instructions</span><span class="nf">.push</span><span class="p">(</span><span class="n">inst</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="c1">// ...</span>

        <span class="nf">Ok</span><span class="p">(</span><span class="n">Module</span> <span class="p">{</span>
            <span class="n">param_types</span><span class="p">,</span>
            <span class="n">result_types</span><span class="p">,</span>
            <span class="n">globals</span><span class="p">,</span>
            <span class="n">num_memories</span><span class="p">,</span>
            <span class="n">instructions</span><span class="p">,</span>
        <span class="p">})</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">choose_inst_bottom_up</span><span class="p">(</span>
    <span class="n">u</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">Unstructured</span><span class="o">&lt;</span><span class="nv">'_</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">stack</span><span class="p">:</span> <span class="o">&amp;</span><span class="p">[</span><span class="n">ValType</span><span class="p">],</span>
    <span class="n">param_types</span><span class="p">:</span> <span class="o">&amp;</span><span class="p">[</span><span class="n">ValType</span><span class="p">],</span>
    <span class="n">globals</span><span class="p">:</span> <span class="o">&amp;</span><span class="p">[</span><span class="n">Global</span><span class="p">],</span>
    <span class="n">num_memories</span><span class="p">:</span> <span class="nb">u32</span><span class="p">,</span>
<span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="n">Inst</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="c1">// Build up all the valid candidate instructions.</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">candidates</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Inst</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>

    <span class="c1">// Producers are always okay: [] -&gt; [t]</span>
    <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nf">I32Const</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
    <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nf">I64Const</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
    <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nf">F32Const</span><span class="p">(</span><span class="mf">0.0</span><span class="p">));</span>
    <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nf">F64Const</span><span class="p">(</span><span class="mf">0.0</span><span class="p">));</span>
    <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nf">V128Const</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
    <span class="k">if</span> <span class="o">!</span><span class="n">param_types</span><span class="nf">.is_empty</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nf">LocalGet</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
    <span class="p">}</span>

    <span class="c1">// ...</span>

    <span class="k">let</span> <span class="n">top</span> <span class="o">=</span> <span class="n">stack</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.copied</span><span class="p">();</span>
    <span class="k">let</span> <span class="n">second</span> <span class="o">=</span> <span class="n">stack</span><span class="nf">.get</span><span class="p">(</span><span class="n">stack</span><span class="nf">.len</span><span class="p">()</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span><span class="nf">.copied</span><span class="p">();</span>

    <span class="c1">// Drop needs 1 operand of any type: [t] -&gt; []</span>
    <span class="k">if</span> <span class="n">top</span><span class="nf">.is_some</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nb">Drop</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="c1">// i32 unary: [i32] -&gt; [...]</span>
    <span class="k">if</span> <span class="n">top</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="n">I32</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I32Clz</span><span class="p">);</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I32Ctz</span><span class="p">);</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I32Popcnt</span><span class="p">);</span>
        <span class="c1">// ...</span>
    <span class="p">}</span>

    <span class="c1">// i64 unary: [i64] -&gt; [...]</span>
    <span class="k">if</span> <span class="n">top</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="n">I64</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I64Clz</span><span class="p">);</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I64Ctz</span><span class="p">);</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I64Popcnt</span><span class="p">);</span>
        <span class="c1">// ...</span>
    <span class="p">}</span>

    <span class="c1">// ...</span>

    <span class="c1">// i32 binary: [i32 i32] -&gt; [...]</span>
    <span class="k">if</span> <span class="n">top</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="n">I32</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">second</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="n">I32</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I32Add</span><span class="p">);</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I32Sub</span><span class="p">);</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I32Mul</span><span class="p">);</span>
        <span class="c1">// ...</span>
    <span class="p">}</span>

    <span class="c1">// i64 binary: [i64 i64] -&gt; [...]</span>
    <span class="k">if</span> <span class="n">top</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="n">I64</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">second</span> <span class="o">==</span> <span class="nf">Some</span><span class="p">(</span><span class="n">I64</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I64Add</span><span class="p">);</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I64Sub</span><span class="p">);</span>
        <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I64Mul</span><span class="p">);</span>
        <span class="c1">// ...</span>
    <span class="p">}</span>

    <span class="c1">// ...</span>

    <span class="c1">// Choose a random instruction from the</span>
    <span class="c1">// candidates.</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">inst</span> <span class="o">=</span> <span class="o">*</span><span class="n">u</span><span class="nf">.choose</span><span class="p">(</span><span class="o">&amp;</span><span class="n">candidates</span><span class="p">)</span><span class="o">?</span><span class="p">;</span>

    <span class="c1">// If the instruction has immediates, generate</span>
    <span class="c1">// them here, as they were hard-coded during</span>
    <span class="c1">// candidate selection.</span>
    <span class="k">match</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">inst</span> <span class="p">{</span>
        <span class="nn">Inst</span><span class="p">::</span><span class="nf">I32Const</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="o">*</span><span class="n">v</span> <span class="o">=</span> <span class="n">u</span><span class="nf">.arbitrary</span><span class="p">()</span><span class="o">?</span><span class="p">,</span>
        <span class="nn">Inst</span><span class="p">::</span><span class="nf">I64Const</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="o">*</span><span class="n">v</span> <span class="o">=</span> <span class="n">u</span><span class="nf">.arbitrary</span><span class="p">()</span><span class="o">?</span><span class="p">,</span>
        <span class="c1">// ...</span>
        <span class="nn">Inst</span><span class="p">::</span><span class="nf">GlobalGet</span><span class="p">(</span><span class="n">g</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
            <span class="o">*</span><span class="n">g</span> <span class="o">=</span> <span class="n">u</span><span class="nf">.int_in_range</span><span class="p">(</span><span class="mi">0</span><span class="o">..=</span><span class="p">(</span><span class="n">globals</span><span class="nf">.len</span><span class="p">()</span> <span class="k">as</span> <span class="nb">u32</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span><span class="o">?</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="c1">// ...</span>
        <span class="nn">Inst</span><span class="p">::</span><span class="nf">I32Load</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
        <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">I64Load</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
        <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">F32Load</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
        <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">F64Load</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
        <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">V128Load</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
        <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">I32Store</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
        <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">I64Store</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
        <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">F32Store</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
        <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">F64Store</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
        <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">V128Store</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
        <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">MemorySize</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
        <span class="p">|</span> <span class="nn">Inst</span><span class="p">::</span><span class="nf">MemoryGrow</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
            <span class="o">*</span><span class="n">m</span> <span class="o">=</span> <span class="n">u</span><span class="nf">.int_in_range</span><span class="p">(</span><span class="mi">0</span><span class="o">..=</span><span class="p">(</span><span class="n">num_memories</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span><span class="o">?</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{}</span>
    <span class="p">}</span>

    <span class="nf">Ok</span><span class="p">(</span><span class="n">inst</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>After constructing a <code class="language-plaintext highlighter-rouge">Module</code> via <code class="language-plaintext highlighter-rouge">bottom_up</code>, we don’t need to call <code class="language-plaintext highlighter-rouge">fixup</code>
because the module is already valid by construction, so all that’s left is
invoking <code class="language-plaintext highlighter-rouge">Module::to_wasm_binary</code> to get the encoded Wasm program.</p>

<h4><code class="language-plaintext highlighter-rouge">top_down</code></h4>

<p>The <code class="language-plaintext highlighter-rouge">top_down</code> generator is very similar to <code class="language-plaintext highlighter-rouge">bottom_up</code>, but instead of
generating instructions forwards, from operands to operators, it generates them
backwards, from operators to operands. Instead of maintaining a stack of the
types of values generated thus far by the instruction sequence prefix, it
maintains a stack of the types of values expected by the instruction sequence
suffix. This is the approach that <a href="https://insuyun.github.io/pubs/2025/park:rgfuzz.pdf"><code class="language-plaintext highlighter-rouge">rgfuzz</code></a> by Park, Kim, and Yun
takes.<sup id="fnref:rule-guided"><a class="footnote" href="https://fitzgeraldnick.com/weblog/feeds/latest-atom/#fn:rule-guided" rel="footnote">2</a></sup></p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">impl</span> <span class="n">Module</span> <span class="p">{</span>
    <span class="k">pub</span> <span class="k">fn</span> <span class="nf">top_down</span><span class="p">(</span>
        <span class="n">u</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">Unstructured</span><span class="o">&lt;</span><span class="nv">'_</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="k">Self</span><span class="o">&gt;</span> <span class="p">{</span>
        <span class="c1">// ...</span>

        <span class="k">let</span> <span class="n">max_insts</span> <span class="o">=</span> <span class="n">u</span><span class="nf">.int_in_range</span><span class="p">(</span><span class="mi">1</span><span class="o">..=</span><span class="n">MAX_INSTS</span><span class="p">)</span><span class="o">?</span><span class="p">;</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">instructions</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
        <span class="k">let</span> <span class="k">mut</span> <span class="n">needed</span> <span class="o">=</span> <span class="n">result_types</span><span class="nf">.clone</span><span class="p">();</span>
        <span class="k">for</span> <span class="n">_</span> <span class="k">in</span> <span class="mi">0</span><span class="o">..</span><span class="n">max_insts</span> <span class="p">{</span>
            <span class="k">if</span> <span class="n">needed</span><span class="nf">.is_empty</span><span class="p">()</span> <span class="o">&amp;&amp;</span> <span class="n">u</span><span class="nf">.ratio</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span><span class="o">?</span> <span class="p">{</span>
                <span class="k">break</span><span class="p">;</span>
            <span class="p">}</span>

            <span class="c1">// Choose a random instruction in a</span>
            <span class="c1">// top-down manner.</span>
            <span class="k">let</span> <span class="n">inst</span> <span class="o">=</span> <span class="nf">choose_inst_top_down</span><span class="p">(</span>
                <span class="n">u</span><span class="p">,</span>
                <span class="n">needed</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.copied</span><span class="p">(),</span>
                <span class="o">&amp;</span><span class="n">param_types</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="n">globals</span><span class="p">,</span>
                <span class="n">num_memories</span><span class="p">,</span>
            <span class="p">)</span><span class="o">?</span><span class="p">;</span>

            <span class="c1">// Pop the result type from `needed`, if</span>
            <span class="c1">// any, as it's been satisfied.</span>
            <span class="k">let</span> <span class="n">ty</span> <span class="o">=</span> <span class="n">inst</span><span class="nf">.result_type</span><span class="p">(</span>
                <span class="o">&amp;</span><span class="n">param_types</span><span class="p">,</span>
                <span class="o">&amp;</span><span class="n">globals</span><span class="p">,</span>
            <span class="p">);</span>
            <span class="k">if</span> <span class="n">ty</span> <span class="o">==</span> <span class="n">needed</span><span class="nf">.last</span><span class="p">()</span><span class="nf">.copied</span><span class="p">()</span> <span class="p">{</span>
                <span class="n">needed</span><span class="nf">.pop</span><span class="p">();</span>
            <span class="p">}</span>

            <span class="c1">// Add operand type demands.</span>
            <span class="k">match</span> <span class="o">&amp;</span><span class="n">inst</span> <span class="p">{</span>
                <span class="nn">Inst</span><span class="p">::</span><span class="nb">Drop</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="c1">// `drop` is polymorphic; choose</span>
                    <span class="c1">// a random type.</span>
                    <span class="n">needed</span><span class="nf">.push</span><span class="p">(</span><span class="n">u</span><span class="nf">.arbitrary</span><span class="p">()</span><span class="o">?</span><span class="p">);</span>
                <span class="p">}</span>
                <span class="nn">Inst</span><span class="p">::</span><span class="nf">GlobalSet</span><span class="p">(</span><span class="n">g</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="n">needed</span><span class="nf">.push</span><span class="p">(</span><span class="n">globals</span><span class="p">[</span><span class="o">*</span><span class="n">g</span> <span class="k">as</span> <span class="nb">usize</span><span class="p">]</span><span class="py">.ty</span><span class="p">);</span>
                <span class="p">}</span>
                <span class="n">_</span> <span class="k">=&gt;</span> <span class="p">{</span>
                    <span class="n">needed</span><span class="nf">.extend_from_slice</span><span class="p">(</span>
                        <span class="n">inst</span><span class="nf">.operand_types</span><span class="p">(</span><span class="o">&amp;</span><span class="n">globals</span><span class="p">),</span>
                    <span class="p">);</span>
                <span class="p">}</span>
            <span class="p">}</span>

            <span class="n">instructions</span><span class="nf">.push</span><span class="p">(</span><span class="n">inst</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="c1">// Fill remaining needed types with</span>
        <span class="c1">// constants.</span>
        <span class="k">for</span> <span class="n">ty</span> <span class="k">in</span> <span class="n">needed</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.rev</span><span class="p">()</span> <span class="p">{</span>
            <span class="n">instructions</span><span class="nf">.push</span><span class="p">(</span>
                <span class="n">ty</span><span class="nf">.make_const</span><span class="p">(</span><span class="n">u</span><span class="nf">.arbitrary</span><span class="p">()</span><span class="o">?</span><span class="p">),</span>
            <span class="p">);</span>
        <span class="p">}</span>

        <span class="c1">// Instructions were generated backwards, so</span>
        <span class="c1">// reverse.</span>
        <span class="n">instructions</span><span class="nf">.reverse</span><span class="p">();</span>

        <span class="nf">Ok</span><span class="p">(</span><span class="n">Module</span> <span class="p">{</span>
            <span class="n">param_types</span><span class="p">,</span>
            <span class="n">result_types</span><span class="p">,</span>
            <span class="n">globals</span><span class="p">,</span>
            <span class="n">num_memories</span><span class="p">,</span>
            <span class="n">instructions</span><span class="p">:</span> <span class="n">prefix</span><span class="p">,</span>
        <span class="p">})</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">fn</span> <span class="nf">choose_inst_top_down</span><span class="p">(</span>
    <span class="n">u</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">Unstructured</span><span class="o">&lt;</span><span class="nv">'_</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">target_ty</span><span class="p">:</span> <span class="nb">Option</span><span class="o">&lt;</span><span class="n">ValType</span><span class="o">&gt;</span><span class="p">,</span>
    <span class="n">param_types</span><span class="p">:</span> <span class="o">&amp;</span><span class="p">[</span><span class="n">ValType</span><span class="p">],</span>
    <span class="n">globals</span><span class="p">:</span> <span class="o">&amp;</span><span class="p">[</span><span class="n">Global</span><span class="p">],</span>
    <span class="n">num_memories</span><span class="p">:</span> <span class="nb">u32</span><span class="p">,</span>
<span class="p">)</span> <span class="k">-&gt;</span> <span class="nb">Result</span><span class="o">&lt;</span><span class="n">Inst</span><span class="o">&gt;</span> <span class="p">{</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">candidates</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Inst</span><span class="o">&gt;</span> <span class="o">=</span> <span class="nn">Vec</span><span class="p">::</span><span class="nf">new</span><span class="p">();</span>
    <span class="k">match</span> <span class="n">target_ty</span> <span class="p">{</span>
        <span class="nf">Some</span><span class="p">(</span><span class="n">I32</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nf">I32Const</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I32Add</span><span class="p">);</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I32Sub</span><span class="p">);</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I32Mul</span><span class="p">);</span>
            <span class="c1">// ...</span>
        <span class="p">}</span>
        <span class="nf">Some</span><span class="p">(</span><span class="n">I64</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nf">I64Const</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I64Add</span><span class="p">);</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I64Sub</span><span class="p">);</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">I64Mul</span><span class="p">);</span>
            <span class="c1">// ...</span>
        <span class="p">}</span>
        <span class="nf">Some</span><span class="p">(</span><span class="n">F32</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nf">F32Const</span><span class="p">(</span><span class="mf">0.0</span><span class="p">));</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">F32Add</span><span class="p">);</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">F32Sub</span><span class="p">);</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="n">F32Mul</span><span class="p">);</span>
            <span class="c1">// ...</span>
        <span class="p">}</span>
        <span class="c1">// ...</span>
        <span class="nb">None</span> <span class="k">=&gt;</span> <span class="p">{</span>
            <span class="c1">// Nothing needed. `drop`, `global.set`, and</span>
            <span class="c1">// stores add demand.</span>
            <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nb">Drop</span><span class="p">);</span>
            <span class="k">if</span> <span class="n">globals</span><span class="nf">.iter</span><span class="p">()</span><span class="nf">.any</span><span class="p">(|</span><span class="n">g</span><span class="p">|</span> <span class="n">g</span><span class="py">.mutable</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nf">GlobalSet</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
            <span class="p">}</span>
            <span class="k">if</span> <span class="n">num_memories</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="p">{</span>
                <span class="n">candidates</span><span class="nf">.push</span><span class="p">(</span><span class="nn">Inst</span><span class="p">::</span><span class="nf">I32Store</span><span class="p">(</span><span class="mi">0</span><span class="p">));</span>
                <span class="c1">// ...</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">let</span> <span class="k">mut</span> <span class="n">inst</span> <span class="o">=</span> <span class="o">*</span><span class="n">u</span><span class="nf">.choose</span><span class="p">(</span><span class="o">&amp;</span><span class="n">candidates</span><span class="p">)</span><span class="o">?</span><span class="p">;</span>

    <span class="c1">// If the instruction has immediates, generate</span>
    <span class="c1">// them here, as they were hard-coded during</span>
    <span class="c1">// candidate selection. Same as `bottom_up`.</span>
    <span class="k">match</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="n">inst</span> <span class="p">{</span>
        <span class="c1">// ...</span>
    <span class="p">}</span>

    <span class="nf">Ok</span><span class="p">(</span><span class="n">inst</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Similar to <code class="language-plaintext highlighter-rouge">bottom_up</code>, after we’ve constructed a <code class="language-plaintext highlighter-rouge">Module</code> via <code class="language-plaintext highlighter-rouge">top_down</code>, we
don’t need to call <code class="language-plaintext highlighter-rouge">fixup</code> because the module is already valid by construction.
All that’s left is invoking <code class="language-plaintext highlighter-rouge">Module::to_wasm_binary</code> to get the encoded Wasm
program.</p>

<h4><code class="language-plaintext highlighter-rouge">mutate</code></h4>

<p><code class="language-plaintext highlighter-rouge">mutate</code> is, as the name implies, a mutator rather than a generator. It is the
direct equivalent of the <code class="language-plaintext highlighter-rouge">arb</code> generator, but for mutation: it uses
<code class="language-plaintext highlighter-rouge">derive(mutatis::Mutate)</code> on <code class="language-plaintext highlighter-rouge">Module</code> and <code class="language-plaintext highlighter-rouge">Inst</code> to automatically generate
custom mutators for these types, rather than authoring them by hand. After
producing a new <code class="language-plaintext highlighter-rouge">Module</code> by mutating an old <code class="language-plaintext highlighter-rouge">Module</code>, that new <code class="language-plaintext highlighter-rouge">Module</code> probably
represents an invalid Wasm program, in the same way that
<code class="language-plaintext highlighter-rouge">derive(arbitrary::Arbitrary)</code> produces <code class="language-plaintext highlighter-rouge">Module</code>s that are probably invalid. And
<code class="language-plaintext highlighter-rouge">mutate</code> also uses the same approach that <code class="language-plaintext highlighter-rouge">arb</code> does to resolve this problem:
the <code class="language-plaintext highlighter-rouge">fixup</code> method.</p>

<p>But first, a mutator-specific wrinkle is that <code class="language-plaintext highlighter-rouge">fuzz_mutator!</code> gives us a mutable
byte slice to mutate, not a <code class="language-plaintext highlighter-rouge">Module</code>. We address this gap by deriving the
<a href="https://serde.rs/"><code class="language-plaintext highlighter-rouge">serde</code></a> crate’s <code class="language-plaintext highlighter-rouge">Serialize</code> and <code class="language-plaintext highlighter-rouge">Deserialize</code> traits on <code class="language-plaintext highlighter-rouge">Module</code> and <code class="language-plaintext highlighter-rouge">Inst</code>,
deserializing a <code class="language-plaintext highlighter-rouge">Module</code> from the mutable byte slice, mutating that deserialized
<code class="language-plaintext highlighter-rouge">Module</code> with <code class="language-plaintext highlighter-rouge">mutatis</code>, and then reserializing it back into the mutable byte
slice. We use the <a href="https://docs.rs/postcard"><code class="language-plaintext highlighter-rouge">postcard</code></a> crate here, but could just as easily use
<a href="https://docs.rs/bincode"><code class="language-plaintext highlighter-rouge">bincode</code></a>, JSON, or protobuf.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">use</span> <span class="nn">libfuzzer_sys</span><span class="p">::{</span><span class="n">fuzz_mutator</span><span class="p">,</span> <span class="n">fuzz_target</span><span class="p">,</span> <span class="n">fuzzer_mutate</span><span class="p">};</span>

<span class="nd">fuzz_mutator!</span><span class="p">(|</span>
    <span class="n">data</span><span class="p">:</span> <span class="o">&amp;</span><span class="k">mut</span> <span class="p">[</span><span class="nb">u8</span><span class="p">],</span>
    <span class="n">size</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span>
    <span class="n">max_size</span><span class="p">:</span> <span class="nb">usize</span><span class="p">,</span>
    <span class="n">seed</span><span class="p">:</span> <span class="nb">u32</span><span class="p">,</span>
<span class="p">|</span> <span class="p">{</span>
    <span class="c1">// With probability of about 1/8, use default</span>
    <span class="c1">// mutator.</span>
    <span class="k">if</span> <span class="n">seed</span><span class="nf">.count_ones</span><span class="p">()</span> <span class="o">%</span> <span class="mi">8</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
        <span class="k">return</span> <span class="nf">fuzzer_mutate</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">max_size</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="c1">// Try to decode using postcard; fallback to</span>
    <span class="c1">// default input on failure.</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">module</span><span class="p">:</span> <span class="n">Module</span> <span class="o">=</span>
        <span class="nn">postcard</span><span class="p">::</span><span class="nf">from_bytes</span><span class="p">(</span><span class="o">&amp;</span><span class="n">data</span><span class="p">[</span><span class="o">..</span><span class="n">size</span><span class="p">])</span>
            <span class="nf">.ok</span><span class="p">()</span>
            <span class="nf">.unwrap_or_default</span><span class="p">();</span>

    <span class="c1">// Mutate with `mutatis`.</span>
    <span class="k">let</span> <span class="k">mut</span> <span class="n">session</span> <span class="o">=</span> <span class="nn">mutatis</span><span class="p">::</span><span class="nn">Session</span><span class="p">::</span><span class="nf">new</span><span class="p">()</span>
        <span class="nf">.seed</span><span class="p">(</span><span class="n">seed</span><span class="nf">.into</span><span class="p">())</span>
        <span class="nf">.shrink</span><span class="p">(</span><span class="n">max_size</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">);</span>
    <span class="k">if</span> <span class="n">session</span><span class="nf">.mutate</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span> <span class="n">module</span><span class="p">)</span><span class="nf">.is_ok</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">if</span> <span class="k">let</span> <span class="nf">Ok</span><span class="p">(</span><span class="n">encoded</span><span class="p">)</span> <span class="o">=</span> <span class="nn">postcard</span><span class="p">::</span><span class="nf">to_slice</span><span class="p">(</span>
            <span class="o">&amp;</span><span class="n">module</span><span class="p">,</span>
            <span class="n">data</span><span class="p">,</span>
        <span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="n">encoded</span><span class="nf">.len</span><span class="p">();</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="c1">// Fallback to the default libfuzzer mutator if</span>
    <span class="c1">// serialization or mutation fails because, for</span>
    <span class="c1">// example, `data` doesn't have enough capacity.</span>
    <span class="nf">fuzzer_mutate</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">max_size</span><span class="p">)</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Finally, the fuzz target itself deserializes the <code class="language-plaintext highlighter-rouge">Module</code> from the raw bytes,
calls <code class="language-plaintext highlighter-rouge">fixup</code>, encodes it to a Wasm binary via <code class="language-plaintext highlighter-rouge">Module::to_wasm_binary</code>, and
then passes that into Wasmtime.</p>

<div class="language-rust highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">fuzz_target!</span><span class="p">(|</span><span class="n">data</span><span class="p">:</span> <span class="o">&amp;</span><span class="p">[</span><span class="nb">u8</span><span class="p">]|</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nf">Ok</span><span class="p">(</span><span class="k">mut</span> <span class="n">module</span><span class="p">)</span> <span class="o">=</span> <span class="nn">postcard</span><span class="p">::</span><span class="nn">from_bytes</span><span class="p">::</span><span class="o">&lt;</span><span class="n">Module</span><span class="o">&gt;</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="k">else</span> <span class="p">{</span>
        <span class="k">return</span><span class="p">;</span>
    <span class="p">};</span>
    <span class="n">module</span><span class="nf">.fixup</span><span class="p">(||</span> <span class="mi">0</span><span class="p">);</span>
    <span class="k">let</span> <span class="n">wasm</span> <span class="o">=</span> <span class="n">module</span><span class="nf">.to_wasm_binary</span><span class="p">();</span>

    <span class="c1">// ...</span>
<span class="p">});</span>
</code></pre></div></div>

<h3>Benchmarking</h3>

<h4>Methodology</h4>

<p>We pair each of our generators and mutator with <a href="https://github.com/rust-fuzz/libfuzzer"><code class="language-plaintext highlighter-rouge">libfuzzer-sys</code></a> and feed the
resulting test cases into <a href="https://wasmtime.dev/">Wasmtime</a>. All fuzzers start with an empty corpus.</p>

<p>The most important metric for a fuzzer is its bug-finding ability, but that can
be difficult to measure directly. For example, Wasmtime is actively fuzzed 24/7
with more-complete fuzzers than those implemented here, so, as expected, I have
not found any bugs via these benchmarks. Therefore, instead of reporting a
found-bugs count, the benchmark harness reports two alternative metrics:</p>

<ol>
  <li>
    <p><strong><em>Coverage over time:</em></strong> Coverage is the cumulative code paths exercised by
the fuzzer. A fuzzer cannot find bugs in code paths it does not cover. <em>This
is the most important metric reported.</em></p>
  </li>
  <li>
    <p><strong><em>Executions over time:</em></strong> An execution is one iteration of the fuzzing
loop. This is basically measuring how fast the fuzzer can produce test
cases. All else being equal, more executions is better, but all else is
rarely equal. It is easy to generate poor test cases very quickly: just
return an empty sequence of Wasm instructions every time. Unfortunately, that
exclusively leads to useless executions. Therefore, this metric is really
only useful when comparing two implementations of the same algorithm, and
I’ve omitted its results in the next section.</p>
  </li>
</ol>

<p>Additionally, I report results for both 24 hours of fuzzing and 5 minutes of
fuzzing. The expected behavior of long-term fuzzing, e.g. 24/7 fuzzing in
<a href="https://github.com/google/oss-fuzz">OSS-Fuzz</a>, can be extrapolated from the 24-hour results. The 5-minute results
show the expected behavior of short-term fuzzing, e.g. when using
<a href="https://docs.rs/mutatis/latest/mutatis/check/index.html"><code class="language-plaintext highlighter-rouge">mutatis::check</code></a> or <a href="https://docs.rs/arbtest/latest/arbtest/"><code class="language-plaintext highlighter-rouge">arbtest</code></a>.</p>

<p>Discussion of short-term fuzzing is somewhat rare, so I feel its motivation
deserves explanation. I find short-term fuzzing useful in the following
scenarios, for example:</p>

<ul>
  <li>Running a quick fuzzing session locally, to catch bugs that avoid detection in
the traditional unit- and integration-test suites, before opening a pull
request.</li>
  <li>Running some quick fuzzing in CI before allowing a pull request to merge, for
similar reasons.</li>
</ul>

<p>That is, short-term fuzzing is useful for the same reasons and in the same
scenarios as property-based testing.<sup id="fnref:pbt"><a class="footnote" href="https://fitzgeraldnick.com/weblog/feeds/latest-atom/#fn:pbt" rel="footnote">3</a></sup></p>

<p>As recommended in <a href="https://arxiv.org/abs/1808.09700"><em>Evaluating Fuzz Testing</em></a> by Klees, Ruef, Cooper,
Wei, and Hicks and adopted in <a href="https://storage.googleapis.com/gweb-research2023-media/pubtools/6318.pdf"><em>Fuzz Bench: An Open Fuzzer Benchmarking Platform
and Service</em></a> by Metzman, Szekeres, Simon, Sprabery, and Arya, the
benchmark harness tests the statistical significance of its results with a
<a href="https://en.wikipedia.org/wiki/Mann%E2%80%93Whitney_U_test">Mann-Whitney U-test</a>. The harness performs 20 trials per fuzzer, the same
number of trials as <em>Fuzz Bench</em>.</p>

<h4>Results</h4>

<h5>24 Hours of Fuzzing</h5>

<ul>
  <li>
    <p><code class="language-plaintext highlighter-rouge">arb</code> has 1.00 ± 0.00 times more coverage than <code class="language-plaintext highlighter-rouge">bottom_up</code> (p = 0.01)</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">mutate</code> has 1.01 ± 0.00 times more coverage than <code class="language-plaintext highlighter-rouge">arb</code> (p = 0.00)</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">top_down</code> has 1.00 ± 0.00 times more coverage than <code class="language-plaintext highlighter-rouge">arb</code> (p = 0.00)</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">mutate</code> has 1.02 ± 0.00 times more coverage than <code class="language-plaintext highlighter-rouge">bottom_up</code> (p = 0.00)</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">top_down</code> has 1.01 ± 0.00 times more coverage than <code class="language-plaintext highlighter-rouge">bottom_up</code> (p = 0.00)</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">mutate</code> has 1.01 ± 0.00 times more coverage than <code class="language-plaintext highlighter-rouge">top_down</code> (p = 0.00)</p>
  </li>
</ul>

<p><a href="https://raw.githubusercontent.com/fitzgen/fuzz-experiment/9c059bbe2835b2123ed379994eec76fe9278e962/results-24h/coverage-over-time.svg">
  <img src="https://raw.githubusercontent.com/fitzgen/fuzz-experiment/9c059bbe2835b2123ed379994eec76fe9278e962/results-24h/coverage-over-time.svg"/>
</a></p>

<h5>5 Minutes of Fuzzing</h5>

<ul>
  <li>
    <p><code class="language-plaintext highlighter-rouge">bottom_up</code> has 1.01 ± 0.01 times more coverage than <code class="language-plaintext highlighter-rouge">arb</code> (p = 0.04)</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">mutate</code> has 1.47 ± 0.02 times more coverage than <code class="language-plaintext highlighter-rouge">arb</code> (p = 0.00)</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">top_down</code> has 1.06 ± 0.02 times more coverage than <code class="language-plaintext highlighter-rouge">arb</code> (p = 0.00)</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">mutate</code> has 1.45 ± 0.01 times more coverage than <code class="language-plaintext highlighter-rouge">bottom_up</code> (p = 0.00)</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">top_down</code> has 1.05 ± 0.02 times more coverage than <code class="language-plaintext highlighter-rouge">bottom_up</code> (p = 0.00)</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">mutate</code> has 1.38 ± 0.02 times more coverage than <code class="language-plaintext highlighter-rouge">top_down</code> (p = 0.00)</p>
  </li>
</ul>

<p><a href="https://raw.githubusercontent.com/fitzgen/fuzz-experiment/9c059bbe2835b2123ed379994eec76fe9278e962/results-5m/coverage-over-time.svg">
  <img src="https://raw.githubusercontent.com/fitzgen/fuzz-experiment/9c059bbe2835b2123ed379994eec76fe9278e962/results-5m/coverage-over-time.svg"/>
</a></p>

<h3>Conclusion</h3>

<p><strong>The <code class="language-plaintext highlighter-rouge">mutate</code> fuzzer performs best.</strong> It vastly outperforms all the others at 5
minutes of fuzzing (36-49% more coverage), and while the rest narrow that gap
after 24 hours of fuzzing, <code class="language-plaintext highlighter-rouge">mutate</code> maintains its lead (1-2% more coverage).</p>

<p>The comparison between <code class="language-plaintext highlighter-rouge">arb</code> and <code class="language-plaintext highlighter-rouge">mutate</code> is as apples-to-apples of a comparison
as it gets between idiomatic test-case generation and mutation in Rust:
<code class="language-plaintext highlighter-rouge">derive(Arbitrary)</code> and <code class="language-plaintext highlighter-rouge">derive(Mutate)</code>. They use the same <code class="language-plaintext highlighter-rouge">fixup</code> method to
ensure that the resulting Wasm instructions are valid. The fuzzer built with
<code class="language-plaintext highlighter-rouge">mutatis</code> and test-case mutation provides better coverage over time than the
fuzzer built with <code class="language-plaintext highlighter-rouge">arbitrary</code> and test-case generation. When writing
structure-aware fuzzers, I used to reach for <a href="https://github.com/rust-fuzz/arbitrary"><code class="language-plaintext highlighter-rouge">arbitrary</code></a>; in the future, I
will reach for <a href="https://docs.rs/mutatis"><code class="language-plaintext highlighter-rouge">mutatis</code></a> instead.</p>

<p>The <code class="language-plaintext highlighter-rouge">top_down</code> fuzzer performs second-best, and is best of the generation-based
fuzzers. This aligns with results from the <a href="https://insuyun.github.io/pubs/2025/park:rgfuzz.pdf"><code class="language-plaintext highlighter-rouge">rgfuzz</code></a> paper, which found that
top-down Wasm instruction generation resulted in better instruction diversity
than bottom-up generation. This result is intuitive, they point out, because
Wasm instructions tend to have more operands than results, which means that more
candidates are filtered out from consideration when generating instructions in
forward order from operands to results (bottom-up) than when generating them in
backward order from results to operands (top-down).</p>

<p>Subjectively, none of the approaches feel significantly more-complicated nor
easier to implement than the others. All approaches require a stack of types,
representing the generated Wasm’s operand stack, at some point in their
implementation. Some require it during instruction generation (<code class="language-plaintext highlighter-rouge">top_down</code> and
<code class="language-plaintext highlighter-rouge">bottom_up</code>) while others require it during <code class="language-plaintext highlighter-rouge">fixup</code> (<code class="language-plaintext highlighter-rouge">mutate</code> and <code class="language-plaintext highlighter-rouge">arb</code>). Adding
support for new Wasm instructions is roughly the same in all of them: add a new
variant to <code class="language-plaintext highlighter-rouge">enum Inst</code> and define its operand and result types. <code class="language-plaintext highlighter-rouge">top_down</code> and
<code class="language-plaintext highlighter-rouge">bottom_up</code> additionally require adding a line for the new instruction in their
<code class="language-plaintext highlighter-rouge">choose_inst_{top_down,bottom_up}</code> functions, but this could be avoided with
some targeted <code class="language-plaintext highlighter-rouge">macro_rules!</code> sugar.</p>

<p>The <code class="language-plaintext highlighter-rouge">fixup</code> method fixes instructions in a forwards order; as future work, it
would be interesting to implement a <code class="language-plaintext highlighter-rouge">backwards_fixup</code> method that fixes
instructions in a backwards order and see if <code class="language-plaintext highlighter-rouge">mutate</code> and <code class="language-plaintext highlighter-rouge">backwards_fixup</code>
outperforms the current <code class="language-plaintext highlighter-rouge">mutate</code> and forwards <code class="language-plaintext highlighter-rouge">fixup</code> the same way that
backwards generation (<code class="language-plaintext highlighter-rouge">top_down</code>) outperforms forwards generation
(<code class="language-plaintext highlighter-rouge">bottom_up</code>).</p>

<p><code class="language-plaintext highlighter-rouge">fixup</code> makes an attempt to reuse stack operands when it can, rather than
synthesize dummy constants or <code class="language-plaintext highlighter-rouge">drop</code> already-computed values, but the attempt is
somewhat half-hearted. Dropping operands introduces dead code, which is not very
interesting for exercising deep into the compiler pipeline. Dummy constants are
not that interesting either. Therefore, another potential line of follow-up work
would be to investigate ways to maximize operand reuse and minimize <code class="language-plaintext highlighter-rouge">drop</code>s and
dummy constants inserted while ensuring validity. That could include storing
values to memory or globals instead of <code class="language-plaintext highlighter-rouge">drop</code>ing them when possible. It could
even include liberating ourselves from the stack-focused paradigm we’ve had thus
far.</p>

<p>WebAssembly is a stack-based language and so it is natural that our approaches
have focused on producing stack-y code. But, in practice, optimizing WebAssembly
compilers like Wasmtime’s use a <a href="https://en.wikipedia.org/wiki/Static_single-assignment_form">static single-assignment</a> intermediate
representation, and erase the operand stack early in their compilation
pipelines. Therefore, from these compilers’ point of view, the following two
WebAssembly snippets are identical:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">;; `x = a + (b * c)` in a "stack-y" encoding and</span>
<span class="c1">;; without temporary locals.</span>
<span class="nf">local.get</span> <span class="kc">$</span><span class="nv">a</span>
<span class="nf">local.get</span> <span class="kc">$</span><span class="nv">b</span>
<span class="nf">local.get</span> <span class="kc">$</span><span class="nv">c</span>
<span class="nf">i32.mul</span>
<span class="nf">i32.add</span>
<span class="nf">local.set</span> <span class="kc">$</span><span class="nv">x</span>

<span class="c1">;; `x = a + (b * c)` in a "non-stack-y" encoding</span>
<span class="c1">;; that uses temporary locals for every operation.</span>
<span class="c1">;;</span>
<span class="c1">;; Equivalent of</span>
<span class="c1">;;</span>
<span class="c1">;;     temp0 = b * c</span>
<span class="c1">;;     temp1 = a + temp0</span>
<span class="c1">;;     x = temp1</span>
<span class="nf">local.get</span> <span class="kc">$</span><span class="nv">b</span>
<span class="nf">local.get</span> <span class="kc">$</span><span class="nv">c</span>
<span class="nf">i32.mul</span>
<span class="nf">local.set</span> <span class="kc">$</span><span class="nv">temp0</span>
<span class="nf">local.get</span> <span class="kc">$</span><span class="nv">a</span>
<span class="nf">local.get</span> <span class="kc">$</span><span class="nv">temp0</span>
<span class="nf">i32.add</span>
<span class="nf">local.set</span> <span class="kc">$</span><span class="nv">temp1</span>
<span class="nf">local.get</span> <span class="kc">$</span><span class="nv">temp1</span>
<span class="nf">local.set</span> <span class="kc">$</span><span class="nv">x</span>
</code></pre></div></div>

<p>Producing code that uses many temporaries in this manner might be easier than
code that doesn’t, but, more importantly, it may enable better reuse of
already-computed subexpressions, emit less dead code, and ultimately produce
more interesting data-flow graphs that better exercise the deep innards of the
compiler.</p>

<p>A final vein of interesting follow-up work to mine would be comparing
<code class="language-plaintext highlighter-rouge">arbitrary</code>-based generators and <code class="language-plaintext highlighter-rouge">mutatis</code>-based mutators for structured inputs
that are not programming languages and when the SUT we are fuzzing is not a
compiler. Do we see these same results when, for example, producing PNG images
to fuzz an image-transformation library?</p>

<p><a href="https://github.com/fitzgen/fuzz-experiment">Here is the source code for this experiment, including the three generators,
one mutator, raw benchmark data, and benchmarking harness.</a> The <code class="language-plaintext highlighter-rouge">README</code>
includes instructions on running the benchmarks yourself.</p>

<hr/>

<div class="footnotes">
  <ol>
    <li id="fn:applicable">
      <p>WebAssembly’s stack-based instructions encode an expression tree
— <code class="language-plaintext highlighter-rouge">local.get $a; local.get $b; local.get $c; i32.add; i32.mul</code> is
isomorphic to <code class="language-plaintext highlighter-rouge">a * (b + c)</code> — so the experiment should be relevant and
applicable to any other generator or mutator for a programming language with
expressions, even if it might not appear so at first glance. <a class="reversefootnote" href="https://fitzgeraldnick.com/weblog/feeds/latest-atom/#fnref:applicable">↩</a></p>
    </li>
    <li id="fn:rule-guided">
      <p>Ignoring its rule-guided bit, which is orthogonal and could be
applied to <code class="language-plaintext highlighter-rouge">bottom_up</code> as well. <a class="reversefootnote" href="https://fitzgeraldnick.com/weblog/feeds/latest-atom/#fnref:rule-guided">↩</a></p>
    </li>
    <li id="fn:pbt">
      <p>Structure-aware fuzzing and property-based testing are <a href="https://docs.rs/mutatis/latest/mutatis/_guide/comparisons/index.html#comparison-to-property-based-testing">basically the
same</a>:
convergent evolution from different communities. <a class="reversefootnote" href="https://fitzgeraldnick.com/weblog/feeds/latest-atom/#fnref:pbt">↩</a></p>
    </li>
  </ol>
</div></div>
    </summary>
    <updated>2026-06-01T07:00:00Z</updated>
    <published>2026-06-01T07:00:00Z</published>
    <source>
      <id>http://fitzgeraldnick.com/</id>
      <author>
        <name>Nick Fitzgerald</name>
      </author>
      <link href="http://fitzgeraldnick.com/" rel="alternate" type="text/html"/>
      <link href="http://fitzgeraldnick.com/feed.xml" rel="self" type="application/rss+xml"/>
      <title>Nick Fitzgerald</title>
      <updated>2026-06-01T16:11:24Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://blog.farre.se/posts/2026/06/01/session-history-diagrams/</id>
    <link href="https://blog.farre.se/posts/2026/06/01/session-history-diagrams/" rel="alternate" type="text/html"/>
    <title>Session History Diagrams in Firefox DevTools</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’ve spent a lot of time at Mozilla working on session history, the machinery that keeps track of where you’ve been so the back and forward buttons do something sensible. It’s one of those parts of the browser that sounds simple from the outside and turns out to be anything but. Once you add iframes, nested iframes, and the subtle rules about when a navigation creates a new entry versus replacing the current one, the state you’re reasoning about gets large and hard to hold in your head.</p>



<p>For years my main tool for understanding that state was reading code and printing things to a log. That works, but it’s slow, and it never quite shows you the shape of the thing. So I built a way to <em>see</em> it: a new DevTools panel in Firefox Nightly called Session History Diagrams.</p>

<h3>Enabling it</h3>

<p>The panel is available in Firefox today, behind a pref. It’s been there in some form since Firefox 150, growing more stable with each release. To turn it on, set <code class="language-plaintext highlighter-rouge">devtools.application.sessionHistory.enabled</code> to true in <code class="language-plaintext highlighter-rouge">about:config</code>, then reload DevTools. The new panel lives under the Application tab, next to Service Workers and Manifest, and it draws the browser’s session history as a diagram that updates as you navigate.</p>

<p>Since Firefox 153 it also works over remote debugging. Connect to a device from <code class="language-plaintext highlighter-rouge">about:debugging</code> and you can watch the session history of a page running on Android, the same as you would on the desktop.</p>

<h3>Jake diagrams</h3>

<p>I didn’t invent the idea of drawing this. The HTML spec already has a notation for it, called a <a href="https://html.spec.whatwg.org/#jake-diagrams">Jake diagram</a> after <a href="https://jakearchibald.com/">Jake Archibald</a>, and that’s where I started. It’s a tabular notation where columns represent steps in session history, and rows represent navigables (the top-level browsing context plus any iframes). Background colors identify documents, a fresh color marking a new document loaded in that navigable, and the current step is shown in bold. It’s a genuinely useful way to capture multi-navigable interactions that are otherwise hard to describe in prose.</p>

<p><img alt="A Jake diagram showing a top-level navigable and two iframes across five history steps" src="https://farre.github.io/assets/images/2026-06-01-session-history-diagrams/jake-diagram.png"/></p>

<p>These diagrams don’t have to be drawn by hand. <a href="https://github.com/domenic">Domenic Denicola</a>, one of the HTML spec editors, built a <a href="https://github.com/domenic/jake-diagram-generator">Jake diagram generator</a> that turns a description of a navigation sequence into a rendered diagram. That’s where I first started playing with a more dynamic approach to the visualization. The thing I missed the most was being able to build a history up step by step rather than describe a finished sequence all at once. So I wrote <a href="https://github.com/farre/web-tools/tree/master/rejake">rejake</a>, a small tool that draws diagrams in the same style<sup id="fnref:1"><a class="footnote" href="https://farre.github.io/blog/rss/mozilla.xml#fn:1" rel="footnote">1</a></sup>, but lets you construct the history one step at a time.</p>

<p>But rejake, like the spec’s diagrams and Domenic’s generator before it, was stuck with a limitation the spec itself admits to, that they only work with a single level of nesting. That was exactly my problem. Real pages nest iframes inside iframes, and the bugs I was chasing usually lived down in that deeper nesting, precisely where the diagram stops being able to help. And however I drew them, I was still typing the history out by hand. It’s a short step from there to wanting the diagram to draw itself from the browser’s actual session history instead<sup id="fnref:2"><a class="footnote" href="https://farre.github.io/blog/rss/mozilla.xml#fn:2" rel="footnote">2</a></sup>.</p>

<h3>Firefox Session History Diagrams</h3>

<p>So the panel extends Jake diagrams to handle arbitrary nesting. Every column is a step in the session history. Every row is a frame, listed in pre-order from the frame tree: top-level document first, then its first iframe, then that iframe’s children, and so on. The current entry is highlighted in blue, and the diagram updates live as you navigate.</p>

<div style="overflow: hidden; display: inline-block;"><video loop="" src="https://farre.github.io/assets/videos/2026-06-01-session-history-diagrams/demo.mp4" style="display: block;"/></div>

<p>The recording above is an ordinary bit of browsing, a handful of pages visited one after another. The top row tracks the page you’re actually looking at, and the current position is the one in blue. The interesting part is everything underneath that top row.</p>

<p>Some of those pages didn’t just load a single document. They pulled in nested frames of their own, and the diagram stacks those below the page that owns them. None of that is visible in the address bar or anywhere in the page chrome, and the frames come and go as you move through the history. Normally you’d have no way of knowing they were ever there. Here you can read straight off the diagram which frames a given step carried, when each one entered, and when it dropped away again.</p>

<h3>Who else might want this</h3>

<p>I built this for myself, working on Gecko’s session history internals, where being able to watch the diagram change while reproducing a bug turns opaque state into something I can point at. But it turns out I’m not the only one who hits this wall. Plenty of people working elsewhere in Gecko, anywhere near navigation, end up reasoning about the same state, and now we all share one picture of it.</p>

<p>If you build single-page applications, or work with the <a href="https://developer.mozilla.org/en-US/docs/Web/API/History_API">History API</a> or <a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API">Navigation API</a>, you’ve probably run into the same kind of confusion from the other side. A push where you expected a replace, a missing history entry, an iframe that accumulated entries unexpectedly. These are hard to reason about without seeing the state directly, and that’s exactly what the diagram gives you.</p>

<p>Session history isn’t a Firefox-specific problem either. Every engine implements the same part of the HTML spec, and Jake diagrams come from that shared spec. The panel only ever shows Firefox’s state, but the rules are the same everywhere, so if you work on another engine it can still be a useful reference for how one implementation behaves. It’s often the only practical way to surface an interoperability difference, which might be a bug in any of the engines, but stays hidden until you can actually see it.</p>

<h3>Thanks</h3>

<p>A big thanks to <a href="https://github.com/nchevobbe">Nicolas Chevobbe</a>, whose assistance was invaluable in getting the DevTools integration right. The work, including what’s still to come, is tracked in <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2015726">Bug 2015726</a>. There’s a fair bit still on that list, like marking whether a step was a push or a replace, surfacing back/forward cache state, tying the diagram into the Network and Inspector panels, and more, all heading toward fuller DevTools support for Navigation and Session History.</p>

<h5>Notes</h5>

<div class="footnotes">
  <ol>
    <li id="fn:1">
      <p>Which, naturally, meant re-implementing the whole of Session History along the way. <a class="reversefootnote" href="https://farre.github.io/blog/rss/mozilla.xml#fnref:1">↩</a></p>
    </li>
    <li id="fn:2">
      <p>Getting nerd-sniped by <a href="https://github.com/jnjaeschke/">Jan Jaeschke</a> definitely contributed as well. <a class="reversefootnote" href="https://farre.github.io/blog/rss/mozilla.xml#fnref:2">↩</a></p>
    </li>
  </ol>
</div></div>
    </summary>
    <updated>2026-06-01T00:00:00Z</updated>
    <published>2026-06-01T00:00:00Z</published>
    <source>
      <id>https://blog.farre.se/tags/mozilla</id>
      <author>
        <name>Andreas Farre</name>
      </author>
      <link href="https://blog.farre.se/tags/mozilla" rel="alternate" type="text/html"/>
      <link href="https://blog.farre.se/rss/mozilla.xml" rel="self" type="application/rss+xml"/>
      <subtitle>Posts tagged "mozilla" on farre's blog</subtitle>
      <title>mozilla — farre's blog</title>
      <updated>2026-06-12T10:58:16Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-AU">
    <id>https://blog.narf.ssji.net/?p=9762</id>
    <link href="https://blog.narf.ssji.net/2026/05/31/optional-docker-services-and-dependencies/" rel="alternate" type="text/html"/>
    <title>Optional Docker services and dependencies</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Docker compose supports the use of profiles to start services conditionally or on-demand. This is useful to mark some services as optional. The use of `required: false` `depends_on` relationships allows to retain the startup ordering if needed. <a href="https://blog.narf.ssji.net/2026/05/31/optional-docker-services-and-dependencies/">Continue reading <span class="meta-nav">→</span></a></p>
<p>The post <a href="https://blog.narf.ssji.net/2026/05/31/optional-docker-services-and-dependencies/">Optional Docker services and dependencies</a> first appeared on <a href="https://blog.narf.ssji.net">Narf</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Like many, <a href="https://docs.docker.com/reference/cli/docker/">docker</a> and and <a href="https://docs.docker.com/reference/cli/docker/compose/">compose</a> have become my go-to tool to create software that can be conveniently deployed to production with a limited amount of headache. However, many tasks, and sometimes whole services, pertain only to the development side of the workflow, and need to stay there.</p>
<span class="__iawmlf-post-loop-links" hidden="hidden"/>


<p>Moreover, some tasks, such as time-consuming provisioning tasks, are only on-demand one-offs. They shouldn’t run at all most of the time, but they should slot into the dependency graph correctly when needed.</p>



<p>tl;dr: I realised that <a href="https://docs.docker.com/compose/how-tos/profiles/" title="">docker compose supports profiles</a>, which allows services  to be enabled conditionally, along with the <a href="https://docs.docker.com/reference/compose-file/services/#:~:text=required%3A%20When%20set%20to%20false%20Compose%20only%20warns%20you%20when%20the%20dependency%20service%20isn%27t%20started" title=""><code>depends_on.[].required</code> option, to ignore them when they are disabled</a>. Profiles are also useful to package actions and triggers to run on demand, so they are not started by default.</p>



<span id="more-9762"/>



<p>We can start with a simple setup where our long-running <code>main</code> service depends on an <code>init</code> service to perform preliminary steps. This can be setup with depends_on the <code>compose.yaml</code>.</p>



<pre class="EnlighterJSRAW">services:
  main:
    image: debian:latest
    command: "sh -c 'while : ; do echo main; sleep 10; done"
    depends_on:
      init:
        condition: service_completed_successfully

  init:
    image: debian:latest
    command: sh -c 'echo init; sleep 10'</pre>



<p>Even when <code>run</code> ning the <code>main</code> container, we get the right dependency (and delay). So far so good (though <code>up</code> will show the output from all containers.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img alt="Screenshot of a terminal.  ``` [21:25:38] ~/docker-profiles$ docker compose run main                                  5s       [+]  2/2t 2/22  &#x2714; Network docker-profiles_default  Created                                                 0.1s  &#x2714; Container docker-profiles-init-1 Started                                                 0.3s Container docker-profiles-init-1 Waiting  Container docker-profiles-init-1 Exited  Container docker-profiles-main-run-17209b1867a1 Creating  Container docker-profiles-main-run-17209b1867a1 Created  main main main ^C [21:26:50] ~/docker-profiles$ docker compose down                                33s 130 &#x21B5;      [+] down 2/2  &#x2714; Container docker-profiles-init-1 Removed                                                 0.0s  &#x2714; Network docker-profiles_default  Removed                                                 0.1s [21:26:58] ~/docker-profiles$ docker compose up                                        1s       WARN[0000] Found orphan containers ([docker-profiles-main-run-17209b1867a1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.  [+] up 3/3  &#x2714; Network docker-profiles_default  Created                                                 0.1s  &#x2714; Container docker-profiles-init-1 Created                                                 0.1s  &#x2714; Container docker-profiles-main-1 Created                                                 0.0s Attaching to init-1, main-1 init-1  | init Container docker-profiles-init-1 Waiting  init-1 exited with code 0 Container docker-profiles-init-1 Exited  main-1  | main main-1  | main Gracefully Stopping... press Ctrl+C again to force Container docker-profiles-main-1 Stopping  main-1  | main Container docker-profiles-main-1 Stopped  Container docker-profiles-init-1 Stopping  Container docker-profiles-init-1 Stopped  main-1 exited with code 137 [21:28:26] ~/docker-profiles$  ```" class="wp-image-10285" height="538" src="https://blog.narf.ssji.net/wp-content/uploads/sites/3/2026/05/image.png" width="463"/></figure>
</div>


<p>But what if we have another, much more time consuming, initialisation step? </p>



<pre class="EnlighterJSRAW">services:
   [...]
   opt-init:
    image: debian:latest
    command: sh -c 'echo opt-init; sleep 100'</pre>



<p>Perhaps we are lucky, and while it needs to run once, we don’t need it to run everytime (think: database setup).</p>



<p><a href="https://docs.docker.com/compose/how-tos/profiles/" title="">Docker compose can use profiles to select when services are started</a>. It will then only be started when this profile is selected. Services without explicit profile will always be started, but any service with one or more profile listed will only get started iff that profile is selected.</p>



<p>We can make the <code>opt-init</code> service part of the <code>opt</code> profile. We can also make the <code>main</code> service dependent on it, so it is started beforehand.</p>



<pre class="EnlighterJSRAW">services:
  main:
    [...]
    depends_on:
      [...]
      opt-init:
        condition: service_completed_successfully

  opt-init:
    [...]
    profiles:
      - opt</pre>



<p>This works well enough when the <code>opt</code> profile is specified but… Oh no! If the profile is not specified, the dependency on the <code>opt-init</code> isn’t resolvable, and none of the stack can spin up with just <code>docker compose up</code></p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img alt="Screenshot of a terminal.  ``` [21:36:50] ~/docker-profiles$ docker compose --profile opt up                                                                                                                         130 &#x21B5;      [+] up 4/4  &#x2714; Network docker-profiles_default      Created                                                                                                                                              0.1s  &#x2714; Container docker-profiles-opt-init-1 Created                                                                                                                                              0.1s  &#x2714; Container docker-profiles-init-1     Created                                                                                                                                              0.1s  &#x2714; Container docker-profiles-main-1     Created                                                                                                                                              0.0s Attaching to init-1, main-1, opt-init-1 opt-init-1  | opt-init init-1      | init Container docker-profiles-opt-init-1 Waiting  Container docker-profiles-init-1 Waiting  Container docker-profiles-opt-init-1 Exited  opt-init-1 exited with code 0 init-1 exited with code 0 Container docker-profiles-init-1 Exited  main-1      | main main-1 exited with code 0 [21:36:55] ~/docker-profiles$ docker compose up                                                                                                                                         2s       service &quot;main&quot; depends on undefined service &quot;opt-init&quot;: invalid compose project ```" class="wp-image-10287" height="271" src="https://blog.narf.ssji.net/wp-content/uploads/sites/3/2026/05/image-1.png" width="579"/></figure>
</div>


<p>Fortunately, this is easily solved with the <a href="https://docs.docker.com/reference/compose-file/services/#:~:text=required%3A%20When%20set%20to%20false%20Compose%20only%20warns%20you%20when%20the%20dependency%20service%20isn%27t%20started" title=""><code>required</code> attribute of the <code>depends_on</code> objects</a>.</p>



<pre class="EnlighterJSRAW">services:
  main:
    [...]
      opt-init:
        condition: service_completed_successfully
        required: false</pre>



<p>And that’s really all there is to it: with the right profile, the optional dependency is started in the desired order, but its absence is otherwise transparently ignored. Both <code>docker compose up</code> and <code>docker compose --profile opt</code> work as desired.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img alt="Screenshot of a terminal.  ``` [21:40:31] ~/docker-profiles$ docker compose up                                                                                                                                         4s       Attaching to init-1, main-1 init-1  | init Container docker-profiles-init-1 Waiting  init-1 exited with code 0 Container docker-profiles-init-1 Exited  main-1  | main main-1 exited with code 0 [21:40:35] ~/docker-profiles$ docker compose --profile opt up                                                                                                                           3s       Attaching to init-1, main-1, opt-init-1 opt-init-1  | opt-init init-1      | init Container docker-profiles-init-1 Waiting  Container docker-profiles-opt-init-1 Waiting  Container docker-profiles-opt-init-1 Exited  opt-init-1 exited with code 0 init-1 exited with code 0 Container docker-profiles-init-1 Exited  main-1      | main main-1 exited with code 0 ```" class="wp-image-10289" height="284" src="https://blog.narf.ssji.net/wp-content/uploads/sites/3/2026/05/image-2.png" width="457"/></figure>
</div>


<p>Profiles afford us another useful trick: on-demand tasks not started by default. This can be handy for maintenance tasks (data cleanup, garbage collection, …) or test scripts (running test workload, sending message, …). Those are handy during development, but would not be necessary, or take a different form, in other deployments.</p>



<pre class="EnlighterJSRAW">services:
  [...]
  say-hello:
    image: debian:latest
    profiles:
      - hello
    command: echo hello
    depends_on:
      main:
        condition: service_started</pre>



<p>Conveniently, when explicitly <code>run</code>ning a service, it is not necessary to request a matching profile, keeping the command line lean: <code>docker compose run say-hello</code>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img alt="Screenshot of a terminal.  ``` [21:47:53] ~/docker-profiles$ docker compose --profile opt down --remove-orphans                                                                                                      130 &#x21B5;      [+] down 5/5  &#x2714; Container docker-profiles-main-1                     Removed                                                                                                                             10.2s  &#x2714; Container docker-profiles-init-1                     Removed                                                                                                                              0.0s  &#x2714; Container docker-profiles-opt-init-1                 Removed                                                                                                                              0.0s  &#x2714; Container docker-profiles-say-hello-run-c26e752b1edd Removed                                                                                                                              0.0s  &#x2714; Network docker-profiles_default                      Removed                                                                                                                              0.1s [21:48:05] ~/docker-profiles$ docker compose run say-hello                                                                                                                             11s       [+]  3/3t 3/33  &#x2714; Network docker-profiles_default  Created                                                                                                                                                  0.1s  &#x2714; Container docker-profiles-init-1 Exited                                                                                                                                                   1.9s  &#x2714; Container docker-profiles-main-1 Started                                                                                                                                                  2.1s Container docker-profiles-say-hello-run-76efc04798b4 Creating  Container docker-profiles-say-hello-run-76efc04798b4 Created  hello ```" class="wp-image-10293" height="211" src="https://blog.narf.ssji.net/wp-content/uploads/sites/3/2026/05/image-3.png" width="575"/></figure>
</div>


<p>So here we are. Compose profiles allow us to control which services get started, and mark some as conditional. This, coupled with the ability to mark some <code>depends_on</code> rules as not <code>required</code> is a good way to seamlessly prevent heavy or otherwise time consuming services from starting when not needed, while retaining proper dependency ordering when enabled.</p>



<p>For completeness, the full, final, <code>compose.yaml</code> looks as follow.</p>



<pre class="EnlighterJSRAW">services:
  main:
    image: debian:latest
    command: "sh -c 'while : ; do echo main; sleep 10; done'"
    depends_on:
      init:
        condition: service_completed_successfully
      opt-init:
        condition: service_completed_successfully
        required: false

  init:
    image: debian:latest
    command: sh -c 'echo init; sleep 10'

  opt-init:
    image: debian:latest
    profiles:
      - opt
    command: sh -c 'echo opt-init; sleep 100'

  say-hello:
    image: debian:latest
    profiles:
      - hello
    command: echo hello
    depends_on:
      main:
        condition: service_started</pre>



<p><br/></p>



<p/><p>The post <a href="https://blog.narf.ssji.net/2026/05/31/optional-docker-services-and-dependencies/">Optional Docker services and dependencies</a> first appeared on <a href="https://blog.narf.ssji.net">Narf</a>.</p></div>
    </content>
    <updated>2026-05-31T11:58:49Z</updated>
    <published>2026-05-31T11:58:49Z</published>
    <category term="code"/>
    <category term="engineering"/>
    <category term="Mozilla"/>
    <category term="sysadmin"/>
    <category term="tip"/>
    <category term="Docker"/>
    <author>
      <name>Olivier Mehani</name>
    </author>
    <source>
      <id>https://blog.narf.ssji.net</id>
      <logo>https://blog.narf.ssji.net/wp-content/uploads/sites/3/2014/04/pouce.png</logo>
      <link href="https://blog.narf.ssji.net/category/mozilla/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.narf.ssji.net" rel="alternate" type="text/html"/>
      <subtitle>The blagosphere got me...</subtitle>
      <title>Mozilla - Narf</title>
      <updated>2026-06-01T04:36:51Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://servo.org/blog/2026/05/31/april-in-servo/</id>
    <link href="https://servo.org/blog/2026/05/31/april-in-servo/" rel="alternate" type="text/html"/>
    <title>April in Servo: new Android UI, focus, forms, security fixes, and more!</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="https://github.com/servo/servo/releases/tag/v0.2.0"><strong>Servo 0.2.0</strong></a> contains all of the changes we landed in April, which came out to yet another record <strong>534 commits</strong> (March: 530).
For security fixes, see <a href="https://servo.org/blog/2026/05/31/april-in-servo/#security"><strong>§ Security</strong></a>.</p>
<aside class="_note">
<p><strong>Note:</strong> the GitHub release is available now, but <a href="https://crates.io/crates/servo">the crates.io release</a> is not yet complete.
We expect to publish it some time <strong>next week</strong>.</p>
</aside>
<figure>
    <a href="https://servo.org/img/blog/2026-05-diffie.png"><img alt="servoshell 0.2.0 showing several new features: better wrapping for CJK scripts, &#x2018;tab-size&#x2019;, better file pickers and `&lt;textarea&gt;`, `&lt;select multiple&gt;`, &#x2018;::details-content::before&#x2019; and &#x2018;::details-content::after&#x2019;, and &#x2018;color-mix()&#x2019; with any number of colors" src="https://servo.org/img/blog/2026-05-diffie.png"/></a>
</figure>
<p>We’ve shipped several new web platform features:</p>
<ul>
<li><strong>&lt;select multiple&gt;</strong> (<a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43189">#43189</a>)</li>
<li><strong>&lt;template shadowrootslotassignment&gt;</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44246">#44246</a>)</li>
<li><strong>&lt;video&gt;</strong> playback on OpenHarmony (<a href="https://github.com/rayguo17">@rayguo17</a>, <a href="https://github.com/servo/servo/pull/43208">#43208</a>)</li>
<li><strong>‘minimum-scale’</strong> and <strong>‘maximum-scale’</strong> values in <strong>&lt;meta name=viewport&gt;</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/40098">#40098</a>, <a href="https://github.com/servo/servo/pull/43715">#43715</a>)</li>
<li><strong>‘color-mix()’</strong> with <strong>any number of &lt;color&gt; values</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43890">#43890</a>)</li>
<li><strong>‘&amp;::before’</strong> and <strong>‘&amp;::after’</strong> in <strong>‘::details-content’</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43878">#43878</a>)</li>
<li><strong>‘revert-rule’</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43878">#43878</a>)</li>
<li><strong>‘tab-size’</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/44480">#44480</a>)</li>
<li><strong>‘text-align: match-parent’</strong> (<a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/servo/servo/pull/44073">#44073</a>)</li>
<li><strong>new Worker()</strong> with <strong>blob URLs</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44004">#44004</a>)</li>
<li><strong>get­Context(<code>"webgl"</code>)</strong> on <strong>Offscreen­Canvas</strong> (<a href="https://github.com/niyabits">@niyabits</a>, <a href="https://github.com/servo/servo/pull/44159">#44159</a>)</li>
<li>the <strong>detail</strong> property on <strong>Performance­Mark</strong> and <strong>Performance­Measure</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/44289">#44289</a>, <a href="https://github.com/servo/servo/pull/44272">#44272</a>)</li>
</ul>
<p>Plus a bunch of new DOM APIs:</p>
<ul>
<li><strong>‘selectionchange’</strong> events on &lt;input&gt; and &lt;textarea&gt; (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44461">#44461</a>)</li>
<li><strong>Storage­Manager</strong>, in experimental mode (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/43976">#43976</a>)</li>
<li><strong>active­Element</strong> on <strong>Document</strong> and <strong>Shadow­Root</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43861">#43861</a>)</li>
<li><strong>crypto.subtle.supports()</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/43703">#43703</a>) – Servo is the first major browser engine to support this!</li>
<li><strong>cell­Padding</strong>, <strong>cell­Spacing</strong>, and <strong>align</strong> properties on <strong>HTML­Table­Element</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43903">#43903</a>) – previously supported in HTML only</li>
<li><strong>related­Target</strong> on <strong>‘focus’</strong> and <strong>‘blur’</strong> events (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43926">#43926</a>)</li>
<li><strong>transfer­From­Image­Bitmap()</strong> on <strong>Image­Bitmap­Rendering­Context</strong> (<a href="https://github.com/Messi002">@Messi002</a>, <a href="https://github.com/servo/servo/pull/43984">#43984</a>)</li>
</ul>
<p>Servo’s support for text in <strong>Chinese</strong>, <strong>Japanese</strong>, and <strong>Korean</strong> languages has improved, with correct wrapping in the layout engine (<a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/servo/servo/pull/43744">#43744</a>), and CJK fonts now enabled in servoshell’s browser UI on Windows, Linux, and FreeBSD (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/CynthiaOketch">@CynthiaOketch</a>, <a href="https://github.com/nortti0">@nortti0</a>, <a href="https://github.com/servo/servo/pull/44055">#44055</a>, <a href="https://github.com/servo/servo/pull/44138">#44138</a>, <a href="https://github.com/servo/servo/pull/44514">#44514</a>).</p>
<p>Navigating to a <strong>JSON file</strong> as the top-level document now renders the JSON with an <strong>interactive pretty-printer</strong> (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43702">#43702</a>).</p>
<p>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 (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44341">#44341</a>).</p>
<p>This is another big update, so here’s an outline:</p>
<ul>
<li>
<p><a href="https://servo.org/blog/2026/05/31/april-in-servo/#security"><strong>Security</strong></a></p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/05/31/april-in-servo/#work-in-progress"><strong>Work in progress</strong></a></p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/05/31/april-in-servo/#servoshell"><strong>servoshell</strong></a></p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/05/31/april-in-servo/#for-developers"><strong>For developers</strong></a></p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/05/31/april-in-servo/#embedding-api"><strong>Embedding API</strong></a></p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/05/31/april-in-servo/#more-on-the-web-platform"><strong>More on the web platform</strong></a></p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/05/31/april-in-servo/#performance-and-stability"><strong>Performance and stability</strong></a></p>
</li>
</ul>
<h3>Security <a class="header-anchor" href="https://servo.org/blog/2026/05/31/april-in-servo/#security">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p><strong>Crypto­Key</strong> now zeroes buffers containing key material after use (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/44597">#44597</a>).</p>
<p>With only a few exceptions, you can only access DOM APIs in another document if that document is in the <strong>same origin</strong>.
But if that document is in the same <em>site</em> 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 <code>this</code> from the other document (<a href="https://github.com/yvt">@yvt</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/28583">#28583</a>).</p>
<p>We’ve fixed a bug where <strong>local­Storage</strong> and <strong>session­Storage</strong> were usable in <strong>sandboxed &lt;iframe&gt;</strong> and shared with every other sandboxed &lt;iframe&gt;, rather than throwing Security­Error (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/44002">#44002</a>).</p>
<p>We’ve fixed a bug where <strong>local­Storage</strong> and <strong>session­Storage</strong> were shared between all <strong>&lt;iframe srcdoc&gt; documents</strong>, rather than isolated using the origin of the containing document (<a href="https://github.com/niyabits">@niyabits</a>, <a href="https://github.com/servo/servo/pull/43988">#43988</a>, <a href="https://github.com/servo/servo/pull/44038">#44038</a>).</p>
<p>We’ve fixed a bug where <strong>IndexedDB</strong> was usable in <strong>sandboxed &lt;iframe&gt;</strong> and <strong>data: URL web workers</strong> (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/44088">#44088</a>).</p>
<p>We’ve fixed a bug where pages in some <strong>IP address origins</strong> can evict cookies from other IP address origins (<a href="https://github.com/officialasishkumar">@officialasishkumar</a>, <a href="https://github.com/servo/servo/pull/44152">#44152</a>).
Only evicting cookies was possible, not reading or writing them.</p>
<p>We’ve fixed an <strong>out-of-bounds memory read</strong> in <strong>tex­Image3D()</strong> on <strong>Web­GL2­Rendering­Context</strong> (<a href="https://github.com/simartin">@simartin</a>, <a href="https://github.com/servo/servo/pull/44270">#44270</a>), and fixed some undefined behaviour in servoshell’s signal handler (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/servo/servo/pull/43891">#43891</a>).</p>
<h3>Work in progress <a class="header-anchor" href="https://servo.org/blog/2026/05/31/april-in-servo/#work-in-progress">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p><strong>IndexedDB</strong> is now enabled in servoshell’s experimental mode (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/servo/servo/pull/44245">#44245</a>).
As always, embedders can enable it with <a href="https://doc.servo.org/servo/struct.Preferences.html"><code>Preferences</code></a>::<a href="https://doc.servo.org/servo/struct.Preferences.html#structfield.dom_indexeddb_enabled"><code>dom­_indexeddb­_enabled</code></a> (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/servo/servo/pull/44245">#44245</a>, <a href="https://github.com/servo/servo/pull/44283">#44283</a>).</p>
<p>IndexedDB now uses Servo’s new <strong>“client storage”</strong> system, which is based on the <a href="https://storage.spec.whatwg.org/">Storage Standard</a> and will allow us to have a unified on-disk format and quota management for all web platform features that persistently store data (<a href="https://github.com/gterzian">@gterzian</a>, <a href="https://github.com/servo/servo/pull/44374">#44374</a>, <a href="https://github.com/servo/servo/pull/43900">#43900</a>).
We’ve also made key range queries more efficient (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/servo/servo/pull/39009">#39009</a>), 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 (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/44128">#44128</a>, <a href="https://github.com/servo/servo/pull/43901">#43901</a>, <a href="https://github.com/servo/servo/pull/44009">#44009</a>, <a href="https://github.com/servo/servo/pull/43914">#43914</a>, <a href="https://github.com/servo/servo/pull/44161">#44161</a>, <a href="https://github.com/servo/servo/pull/44183">#44183</a>, <a href="https://github.com/servo/servo/pull/44059">#44059</a>, <a href="https://github.com/servo/servo/pull/44215">#44215</a>, <a href="https://github.com/servo/servo/pull/42998">#42998</a>, <a href="https://github.com/servo/servo/pull/43805">#43805</a>).</p>
<p>We’ve made more progress on the <strong>Intersection­Observer API</strong>, under <code>--pref dom­_intersection­_observer­_enabled</code> (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/42204">#42204</a>).</p>
<p>We’re continuing to implement <strong>document.exec­Command()</strong> for <strong>rich text editing</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44529">#44529</a>), under <code>--pref dom­_exec­_command­_enabled</code>.
This release adds support for the <strong>‘bold’</strong>, <strong>‘font­Name’</strong>, <strong>‘font­Size’</strong>, <strong>‘italic’</strong>, <strong>‘strikethrough’</strong>, and <strong>‘underline’</strong> commands (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44511">#44511</a>, <a href="https://github.com/servo/servo/pull/43287">#43287</a>, <a href="https://github.com/servo/servo/pull/44432">#44432</a>, <a href="https://github.com/servo/servo/pull/44410">#44410</a>, <a href="https://github.com/servo/servo/pull/44194">#44194</a>, <a href="https://github.com/servo/servo/pull/44030">#44030</a>, <a href="https://github.com/servo/servo/pull/44039">#44039</a>, <a href="https://github.com/servo/servo/pull/44041">#44041</a>, <a href="https://github.com/servo/servo/pull/44075">#44075</a>, <a href="https://github.com/servo/servo/pull/44234">#44234</a>, <a href="https://github.com/servo/servo/pull/44250">#44250</a>, <a href="https://github.com/servo/servo/pull/44331">#44331</a>, <a href="https://github.com/servo/servo/pull/44390">#44390</a>, <a href="https://github.com/servo/servo/pull/44137">#44137</a>, <a href="https://github.com/servo/servo/pull/44293">#44293</a>, <a href="https://github.com/servo/servo/pull/44312">#44312</a>, <a href="https://github.com/servo/servo/pull/44347">#44347</a>).</p>
<p>All of the features above are enabled in servoshell’s experimental mode.</p>
<p>Servo can now build a very basic <strong>accessibility tree</strong> for web contents, under <code>--pref accessibility­_enabled</code> (<a href="https://github.com/alice">@alice</a>, <a href="https://github.com/delan">@delan</a>, <a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/servo/servo/pull/42338">#42338</a>, <a href="https://github.com/servo/servo/pull/43558">#43558</a>, <a href="https://github.com/servo/servo/pull/44437">#44437</a>, <a href="https://github.com/servo/servo/pull/44438">#44438</a>).
This includes text runs, plus nine other non-interactive accessibility roles (<a href="https://github.com/alice">@alice</a>, <a href="https://github.com/delan">@delan</a>, <a href="https://github.com/servo/servo/pull/44255">#44255</a>).
We’ve also fixed a crash when reloading pages with accessibility enabled (<a href="https://github.com/alice">@alice</a>, <a href="https://github.com/servo/servo/pull/44473">#44473</a>), and made accessibility tree updates more efficient (<a href="https://github.com/alice">@alice</a>, <a href="https://github.com/servo/servo/pull/44208">#44208</a>).</p>
<p>We’ve started implementing the <strong>Sanitizer API</strong>, under <code>--pref dom­_sanitizer­_enabled</code> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/44198">#44198</a>, <a href="https://github.com/servo/servo/pull/44290">#44290</a>, <a href="https://github.com/servo/servo/pull/44335">#44335</a>, <a href="https://github.com/servo/servo/pull/44421">#44421</a>, <a href="https://github.com/servo/servo/pull/44452">#44452</a>, <a href="https://github.com/servo/servo/pull/44481">#44481</a>, <a href="https://github.com/servo/servo/pull/44585">#44585</a>, <a href="https://github.com/servo/servo/pull/44594">#44594</a>).</p>
<p>We’ve also started implementing <strong>Shared­Worker</strong>, under <code>--pref dom­_sharedworker­_enabled</code> (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/44375">#44375</a>, <a href="https://github.com/servo/servo/pull/44440">#44440</a>).</p>
<p>We’re working on the <strong>Wake­Lock API</strong> too, under <code>--pref dom­_wakelock­_enabled</code> (<a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/rovertrack">@rovertrack</a>, <a href="https://github.com/servo/servo/pull/43617">#43617</a>, <a href="https://github.com/servo/servo/pull/44343">#44343</a>).</p>
<h3>servoshell <a class="header-anchor" href="https://servo.org/blog/2026/05/31/april-in-servo/#servoshell">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>servoshell for Android now has a <strong>revamped browser UI</strong>, including a new <strong>history view</strong> (<a href="https://github.com/espy">@espy</a>, <a href="https://github.com/servo/servo/pull/43795">#43795</a>), the <strong>apk is 30% smaller</strong> (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44278">#44278</a>, <a href="https://github.com/servo/servo/pull/44182">#44182</a>), and we’ve fixed the black screen bug when closing settings or switching back from another app (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44327">#44327</a>).
You can now close tabs on OpenHarmony too (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/servo/servo/pull/42713">#42713</a>).</p>
<figure>
    <a href="https://servo.org/img/blog/2026-05-android.png"><img alt="servoshell 0.2.0 showing the revamped browser UI on Android. from left to right: viewing a web page, the settings view, the history view" src="https://servo.org/img/blog/2026-05-android.png"/></a>
</figure>
<p>As for servoshell on desktop platforms, we’ve fixed some focus- and IME-related bugs (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43872">#43872</a>, <a href="https://github.com/servo/servo/pull/43932">#43932</a>), and on Windows, we now install a normal shortcut without the strange behaviour of an “advertised” shortcut (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44223">#44223</a>).</p>
<h3>For developers <a class="header-anchor" href="https://servo.org/blog/2026/05/31/april-in-servo/#for-developers">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>When using the <strong>Inspector</strong> tab in the Firefox <strong>DevTools</strong>, the <strong>Rules</strong> panel now includes declarations in <strong>‘@layer’ rules</strong> (<a href="https://github.com/arabson99">@arabson99</a>, <a href="https://github.com/servo/servo/pull/43912">#43912</a>).</p>
<p>When <strong>logging expressions</strong> in the <strong>Console</strong> tab, and when <strong>hovering over symbols</strong> in the <strong>Debugger</strong> tab, you can now get more information about the contents of functions, arrays, objects, and other values (<a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/servo/servo/pull/44172">#44172</a>, <a href="https://github.com/servo/servo/pull/44173">#44173</a>, <a href="https://github.com/servo/servo/pull/44022">#44022</a>, <a href="https://github.com/servo/servo/pull/44233">#44233</a>, <a href="https://github.com/servo/servo/pull/44196">#44196</a>, <a href="https://github.com/servo/servo/pull/44181">#44181</a>, <a href="https://github.com/servo/servo/pull/44064">#44064</a>, <a href="https://github.com/servo/servo/pull/44023">#44023</a>, <a href="https://github.com/servo/servo/pull/44164">#44164</a>, <a href="https://github.com/servo/servo/pull/44369">#44369</a>, <a href="https://github.com/servo/servo/pull/44262">#44262</a>).</p>
<p>When using the <strong>Debugger</strong> tab, you can now use the <strong>Scopes</strong> panel to inspect local and global variables (<a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/pull/43792">#43792</a>, <a href="https://github.com/servo/servo/pull/43791">#43791</a>), you can now debug <strong>web worker</strong> scripts (<a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/pull/43981">#43981</a>), and we’ve started implementing <strong>blackboxing</strong>, aka the <strong>Ignore source</strong> button (<a href="https://github.com/freyacodes">@freyacodes</a>, <a href="https://github.com/servo/servo/pull/44142">#44142</a>).</p>
<p>We’ve also landed some initial support for the <strong>Style Editor</strong> tab (<a href="https://github.com/rovertrack">@rovertrack</a>, <a href="https://github.com/servo/servo/pull/44517">#44517</a>, <a href="https://github.com/servo/servo/pull/44462">#44462</a>).</p>
<p>We’re working towards re-enabling our automated DevTools tests in CI, which should make the feature more reliable (<a href="https://github.com/freyacodes">@freyacodes</a>, <a href="https://github.com/servo/servo/pull/44577">#44577</a>), and we’ve landed a small build reproducibility fix too (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44459">#44459</a>).</p>
<p>For developers of Servo itself, please note that the <strong>Cargo ‘release’ profile</strong> is no longer <code>#[cfg(debug­_assertions)]</code> (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44177">#44177</a>).
If you’ve been using ‘release’ as a “faster ‘debug’ with assertions” build locally, consider switching to ‘checked-release’ or ‘medium’.</p>
<p>The pull request template has been updated (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44135">#44135</a>).
<strong>‘Testing’</strong> and <strong>‘Fixes’</strong> should go at the <em>bottom</em> of the PR description, and <strong>‘Testing’</strong> is about automated tests, not how you tested the PR locally.</p>
<p>We’ve made more progress on the new <a href="https://containers.dev/"><strong>dev container</strong></a>, which will provide an alternative to <a href="https://book.servo.org/building/building.html">our usual procedures</a> for setting up a Servo build environment (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/44126">#44126</a>, <a href="https://github.com/servo/servo/pull/44111">#44111</a>, <a href="https://github.com/servo/servo/pull/44162">#44162</a>, <a href="https://github.com/servo/servo/pull/44641">#44641</a>, <a href="https://github.com/servo/servo/pull/44109">#44109</a>).
Keep an eye out for that <a href="https://book.servo.org/building/building.html">in the book</a>!</p>
<p>In the meantime, did you know that you can use <a href="https://lix.systems/"><strong>Lix</strong></a> or <a href="https://nixos.org/manual/nix/stable"><strong>Nix</strong></a> to build Servo on Linux with a lot less hassle, <em>even if</em> you’re not using NixOS?
For now at least, head to the <a href="https://book.servo.org/building/nixos.html">NixOS page</a> in the book to learn more.
We’ve also fixed a regression that made <code>--debug-mozjs</code> and <code>MOZJS­_FROM­_SOURCE</code> builds take much longer to complete on Linux when not using Nix (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44346">#44346</a>).</p>
<p>We’ve fixed building Servo with the <strong>‘jitspew’ feature</strong> in mozjs, allowing you to set <strong>IONFLAGS</strong> to enable JIT logging (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44010">#44010</a>).
We’ve also fixed build issues on Windows and FreeBSD (<a href="https://github.com/zhangxichang">@zhangxichang</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44264">#44264</a>, <a href="https://github.com/servo/servo/pull/44591">#44591</a>).</p>
<h3>Embedding API <a class="header-anchor" href="https://servo.org/blog/2026/05/31/april-in-servo/#embedding-api">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>With this second monthly release of the Servo library, we have some quick notes about <strong>API stability</strong> and <strong>semver compatibility</strong>:</p>
<ul>
<li>
<p><strong>The <a href="https://crates.io/crates/servo">‘servo’</a> package</strong> follows <a href="https://doc.rust-lang.org/1.88.0/cargo/reference/specifying-dependencies.html#default-requirements">Cargo’s rules for semver compatibility</a>.
0.1.1 is compatible with version 0.1.0, but 0.2.0 is a breaking update.</p>
</li>
<li>
<p>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.</p>
</li>
<li>
<p>In general, <strong>dependencies of ‘servo’</strong>, like <a href="https://crates.io/crates/servo-base">‘servo-base’</a> and <a href="https://crates.io/crates/servo-script">‘servo-script’</a>, <strong>do not use semver</strong>.
Any release may include breaking changes.</p>
</li>
</ul>
<p>We’ve fixed a <strong>build failure</strong> affecting embedders with a <strong>new or updated Cargo.lock</strong> (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44093">#44093</a>), and landed several other changes to help us with the Servo library release process (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/43972">#43972</a>, <a href="https://github.com/servo/servo/pull/44642">#44642</a>, <a href="https://github.com/servo/servo/pull/43182">#43182</a>, <a href="https://github.com/servo/servo/pull/43866">#43866</a>, <a href="https://github.com/servo/servo/pull/44086">#44086</a>, <a href="https://github.com/servo/servo/pull/43797">#43797</a>).</p>
<p>Breaking changes:</p>
<ul>
<li>
<p><a href="https://doc.servo.org/servo/struct.WebView.html"><code>Web­View</code></a>::<a href="https://doc.servo.org/servo/struct.WebView.html#method.animating"><code>animating</code></a> now takes <code>&amp;self</code> instead of <code>self</code>, so you can call it without cloning the handle (<a href="https://github.com/JavaDerg">@JavaDerg</a>, <a href="https://github.com/servo/servo/pull/44253">#44253</a>)</p>
</li>
<li>
<p><a href="https://doc.servo.org/servo/struct.Servo.html"><code>Servo</code></a>::<a href="https://doc.servo.org/servo/struct.Servo.html#method.site_data_manager"><code>site­_data­_manager</code></a> now returns <code>&amp;SiteDataManager</code> instead of <code>Ref&lt;'_, SiteDataManager&gt;</code> (<a href="https://github.com/sabbCodes">@sabbCodes</a>, <a href="https://github.com/servo/servo/pull/44116">#44116</a>)</p>
</li>
<li>
<p><a href="https://doc.servo.org/servo/trait.WebViewDelegate.html"><code>Web­View­Delegate</code></a>::<code>play­_gamepad­_haptic­_effect</code> and <code>stop­_gamepad­_haptic­_effect</code> have been removed (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43895">#43895</a>), but they have not worked since February 2026 – use <a href="https://doc.servo.org/servo/trait.GamepadDelegate.html"><code>Gamepad­Delegate</code></a> instead</p>
</li>
</ul>
<p>You can now load a URL with <strong>custom request headers</strong> by calling <a href="https://doc.servo.org/servo/struct.WebView.html"><code>Web­View</code></a>::<a href="https://doc.servo.org/servo/struct.WebView.html#method.load_request"><code>load­_request</code></a> (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43338">#43338</a>).</p>
<p>You can now <strong>retrieve cookies asynchronously</strong> by calling <a href="https://doc.servo.org/servo/struct.SiteDataManager.html"><code>Site­Data­Manager</code></a>::<a href="https://doc.servo.org/servo/struct.SiteDataManager.html#method.cookies_for_url_async"><code>cookies­_for­_url­_async</code></a> (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/servo/servo/pull/43794">#43794</a>).</p>
<p>The synchronous version of that method, <a href="https://doc.servo.org/servo/struct.SiteDataManager.html"><code>Site­Data­Manager</code></a>::<a href="https://doc.servo.org/servo/struct.SiteDataManager.html#method.cookies_for_url"><code>cookies­_for­_url</code></a>, was previously not callable because <a href="https://doc.servo.org/servo/enum.CookieSource.html"><code>Cookie­Source</code></a> was not exposed to the public API, but we’ve fixed that now (<a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/servo/servo/pull/44124">#44124</a>).</p>
<p>You can now <strong>clear session cookies</strong> without clearing <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Cookies#removal_defining_the_lifetime_of_a_cookie">permanent cookies</a> by calling <a href="https://doc.servo.org/servo/struct.SiteDataManager.html"><code>Site­Data­Manager</code></a>::<a href="https://doc.servo.org/servo/struct.SiteDataManager.html#method.clear_session_cookies"><code>clear­_session­_cookies</code></a> (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/servo/servo/pull/44166">#44166</a>).</p>
<p>When <strong>intercepting requests</strong> with <a href="https://doc.servo.org/servo/trait.ServoDelegate.html"><code>Servo­Delegate</code></a>:: and <a href="https://doc.servo.org/servo/trait.WebViewDelegate.html"><code>Web­View­Delegate</code></a>::<a href="https://doc.servo.org/servo/trait.WebViewDelegate.html#method.load_web_resource"><code>load­_web­_resource</code></a>, we now include a <a href="https://doc.servo.org/servo/struct.WebResourceRequest.html#structfield.destination"><code>destination</code></a> and <a href="https://doc.servo.org/servo/struct.WebResourceRequest.html#structfield.referrer_url"><code>referrer­_url</code></a> in the <a href="https://doc.servo.org/servo/struct.WebResourceRequest.html"><code>Web­Resource­Request</code></a>, which can be helpful if you’re implementing <strong>ad blocking</strong> (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/44493">#44493</a>).</p>
<p>You can configure Servo to <strong>write all of its storage to a unique directory</strong> for that session by enabling <a href="https://doc.servo.org/servo/struct.Opts.html"><code>Opts</code></a>::<a href="https://doc.servo.org/servo/struct.Opts.html#structfield.temporary_storage"><code>temporary­_storage</code></a> (<a href="https://github.com/janvarga">@janvarga</a>, <a href="https://github.com/servo/servo/pull/44433">#44433</a>).
Note that these unique directories currently persist after Servo exits, so it’s an isolation feature, not a privacy feature.</p>
<p><a href="https://doc.servo.org/servo/struct.WindowRenderingContext.html"><code>Window­Rendering­Context</code></a>::<a href="https://doc.servo.org/servo/struct.WindowRenderingContext.html#method.new"><code>new</code></a> and <a href="https://doc.servo.org/servo/struct.SoftwareRenderingContext.html"><code>Software­Rendering­Context</code></a>::<a href="https://doc.servo.org/servo/struct.SoftwareRenderingContext.html#method.new"><code>new</code></a> now return an error if the given <code>size</code> is less than 1x1 (<a href="https://github.com/freyacodes">@freyacodes</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44011">#44011</a>).</p>
<p>We’ve improved our API docs for <a href="https://doc.servo.org/servo/struct.WebView.html"><code>Web­View</code></a>, <a href="https://doc.servo.org/servo/struct.WebViewBuilder.html"><code>Web­View­Builder</code></a>, <a href="https://doc.servo.org/servo/trait.WebViewDelegate.html"><code>Web­View­Delegate</code></a>, <a href="https://doc.servo.org/servo/trait.ServoDelegate.html"><code>ServoDelegate</code></a>, <a href="https://doc.servo.org/servo/struct.PromptDialog.html"><code>Prompt­Dialog</code></a>, <a href="https://doc.servo.org/servo/struct.WebResourceLoad.html"><code>Web­Resource­Load</code></a>, <a href="https://doc.servo.org/servo/webxr/trait.WebXrRegistry.html"><code>Web­Xr­Registry</code></a>, <a href="https://doc.servo.org/servo/struct.Preferences.html"><code>Preferences</code></a>, and servoshell’s <a href="https://doc.servo.org/servoshell/prefs/static.EXPERIMENTAL_PREFS.html"><code>EXPERIMENTAL­_PREFS</code></a> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/sabbCodes">@sabbCodes</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/rovertrack">@rovertrack</a>, <a href="https://github.com/servo/servo/pull/43892">#43892</a>, <a href="https://github.com/servo/servo/pull/43787">#43787</a>, <a href="https://github.com/servo/servo/pull/44171">#44171</a>, <a href="https://github.com/servo/servo/pull/43947">#43947</a>).</p>
<p>We’ve also improved our API docs for <a href="https://doc.servo.org/servo/struct.Opts.html"><code>Opts</code></a>, <a href="https://doc.servo.org/servo/enum.OutputOptions.html"><code>Output­Options</code></a>, <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><code>Diagnostics­Logging</code></a>, <a href="https://doc.servo.org/servo/enum.PrefValue.html"><code>Pref­Value</code></a>, <a href="https://doc.servo.org/servo/index.html"><code>servo</code></a>::<a href="https://doc.servo.org/servo/opts/index.html"><code>opts</code></a>, and <a href="https://doc.servo.org/servo_config/index.html"><code>servo­_config</code></a> (<a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/43802">#43802</a>).</p>
<h3>More on the web platform <a class="header-anchor" href="https://servo.org/blog/2026/05/31/april-in-servo/#more-on-the-web-platform">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p><strong><kbd>Tab</kbd> navigation</strong> now works across <strong>&lt;iframe&gt;</strong> boundaries (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44397">#44397</a>), and <strong><kbd>Ctrl</kbd>+<kbd>Backspace</kbd></strong> (or <strong><kbd>⌥</kbd><kbd>⌫</kbd></strong>) now <strong>deletes a whole word</strong> in input fields (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43940">#43940</a>).</p>
<p><strong>Tab characters</strong> are now rendered correctly in <strong>&lt;pre&gt;</strong> (and other elements with <strong>‘white-space: pre’</strong>), with proper tab stops (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/44480">#44480</a>).
<strong>Spaces</strong> are now rendered correctly in <strong>2D &lt;canvas&gt;</strong>, instead of twice as wide as they should be (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43899">#43899</a>).</p>
<p><strong>&lt;a href&gt;</strong> now correctly resolves the URL with the page encoding (<a href="https://github.com/sabbCodes">@sabbCodes</a>, <a href="https://github.com/servo/servo/pull/43822">#43822</a>).</p>
<p>We’ve improved the default appearance of <strong>&lt;input type=file&gt;</strong> (<a href="https://github.com/sabbCodes">@sabbCodes</a>, <a href="https://github.com/servo/servo/pull/44496">#44496</a>) and <strong>&lt;textarea placeholder&gt;</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43770">#43770</a>).</p>
<p>All <strong>keyboard events</strong>, <strong>mouse events</strong>, <strong>wheel events</strong>, and <strong>pointer events</strong>, other than <strong>‘pointerenter’</strong> and <strong>‘pointerleave’</strong>, now <strong>bubble out of shadow roots</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/43799">#43799</a>, <a href="https://github.com/servo/servo/pull/44094">#44094</a>).
<strong>‘error’ events</strong> on <strong>Window</strong> now report the correct <strong>filename</strong> (<strong>source</strong> in <strong>onerror</strong>) and <strong>lineno</strong> (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/servo/servo/pull/43632">#43632</a>).</p>
<p><strong>console.log()</strong> and friends now support <strong>printf-style formatting directives</strong>, although for now <code>%c</code> is ignored (<a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/servo/servo/pull/43897">#43897</a>).</p>
<p><strong>file: URLs</strong> are now considered <strong>secure contexts</strong>, so they can now use features like <strong>crypto.subtle</strong> and <strong>crypto.random­UUID</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/43989">#43989</a>).</p>
<p><strong>Exception messages</strong> have improved in Location, Static­Range, and the HTML­Element family of types (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/MuhammadMouostafa">@MuhammadMouostafa</a>, <a href="https://github.com/treetmitterglad">@treetmitterglad</a>, <a href="https://github.com/servo/servo/pull/44282">#44282</a>, <a href="https://github.com/servo/servo/pull/43260">#43260</a>, <a href="https://github.com/servo/servo/pull/43882">#43882</a>).</p>
<p>We’ve improved the conformance of <strong>fetch algorithms</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/43970">#43970</a>, <a href="https://github.com/servo/servo/pull/43798">#43798</a>), <strong>focus</strong> and <strong>tab navigation</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43842">#43842</a>, <a href="https://github.com/servo/servo/pull/44029">#44029</a>, <a href="https://github.com/servo/servo/pull/44360">#44360</a>, <a href="https://github.com/servo/servo/pull/43859">#43859</a>, <a href="https://github.com/servo/servo/pull/44535">#44535</a>), <strong>form submission</strong> (<a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/servo/servo/pull/43700">#43700</a>), <strong>JS modules</strong> (<a href="https://github.com/elomscansio">@elomscansio</a>, <a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/servo/servo/pull/43741">#43741</a>, <a href="https://github.com/servo/servo/pull/44179">#44179</a>, <a href="https://github.com/servo/servo/pull/44042">#44042</a>), <strong>page navigation</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43857">#43857</a>), <strong>&lt;svg view­Box&gt;</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44420">#44420</a>), <strong>‘attr()’</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43878">#43878</a>), <strong>‘:focus’</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43873">#43873</a>), <strong>‘font’</strong> (<a href="https://github.com/RichardTjokroutomo">@RichardTjokroutomo</a>, <a href="https://github.com/servo/servo/pull/44061">#44061</a>), <strong>‘@keyframes’</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/43461">#43461</a>), <strong>‘@property’</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43878">#43878</a>), <strong>‘load’</strong> events (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/arabson99">@arabson99</a>, <a href="https://github.com/servo/servo/pull/43807">#43807</a>, <a href="https://github.com/servo/servo/pull/44046">#44046</a>), <strong>fetch­Later()</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43627">#43627</a>), <strong>axes</strong> and <strong>buttons</strong> on <strong>Gamepad</strong> (<a href="https://github.com/log101">@log101</a>, <a href="https://github.com/rovertrack">@rovertrack</a>, <a href="https://github.com/servo/servo/pull/44411">#44411</a>, <a href="https://github.com/servo/servo/pull/44357">#44357</a>), <strong>copy­Tex­Image­2D()</strong> on <strong>Web­GL­Rendering­Context</strong> (<a href="https://github.com/simartin">@simartin</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43608">#43608</a>), <strong>tex­Image3D()</strong> on <strong>Web­GL2­Rendering­Context</strong> (<a href="https://github.com/simartin">@simartin</a>, <a href="https://github.com/servo/servo/pull/44367">#44367</a>), <strong>environment­Blend­Mode</strong> on <strong>XR­Session</strong> (<a href="https://github.com/msub2">@msub2</a>, <a href="https://github.com/servo/servo/pull/44155">#44155</a>), <strong>mark()</strong> and <strong>measure()</strong> on <strong>Performance</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44471">#44471</a>, <a href="https://github.com/servo/servo/pull/44199">#44199</a>, <a href="https://github.com/servo/servo/pull/43990">#43990</a>, <a href="https://github.com/servo/servo/pull/43753">#43753</a>), and <strong>Performance­Resource­Timing</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/44228">#44228</a>).</p>
<p>We’ve fixed bugs related to <strong>console logging</strong> (<a href="https://github.com/sabbCodes">@sabbCodes</a>, <a href="https://github.com/servo/servo/pull/44243">#44243</a>), <strong>‘animation’</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44299">#44299</a>), <strong>‘box-shadow’</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44474">#44474</a>, <a href="https://github.com/servo/servo/pull/44457">#44457</a>), <strong>‘display: contents’</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44551">#44551</a>, <a href="https://github.com/servo/servo/pull/44299">#44299</a>), <strong>‘display: inline-flex’</strong> (<a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/44281">#44281</a>), <strong>‘display: table-cell’</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/44550">#44550</a>), <strong>‘display: table-row-group’</strong> (<a href="https://github.com/Veercodeprog">@Veercodeprog</a>, <a href="https://github.com/servo/servo/pull/43674">#43674</a>), <strong>‘overflow-x: clip’</strong> and <strong>‘overflow-y: clip’</strong> (<a href="https://github.com/Messi002">@Messi002</a>, <a href="https://github.com/servo/servo/pull/43620">#43620</a>), <strong>‘position: absolute’</strong> on grid items (<a href="https://github.com/nicoburns">@nicoburns</a>, <a href="https://github.com/servo/servo/pull/44324">#44324</a>), <strong>‘word-spacing: &lt;percentage&gt;’</strong> (<a href="https://github.com/sabbCodes">@sabbCodes</a>, <a href="https://github.com/servo/servo/pull/44031">#44031</a>), <strong>remove­Child()</strong> on <strong>Document</strong> (<a href="https://github.com/rovertrack">@rovertrack</a>, <a href="https://github.com/servo/servo/pull/44133">#44133</a>), and <strong>URL.revoke­Object­URL()</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/43746">#43746</a>, <a href="https://github.com/servo/servo/pull/43977">#43977</a>, <a href="https://github.com/servo/servo/pull/44035">#44035</a>).</p>
<h3>Performance and stability <a class="header-anchor" href="https://servo.org/blog/2026/05/31/april-in-servo/#performance-and-stability">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>We’ve fixed some big inefficiencies in Servo.
<strong>append­Child()</strong> with nested shadow roots is no longer <math xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>O</mi><mrow><mo>(</mo><msup><mn>2</mn><mi>n</mi></msup><mo>)</mo></mrow></mrow></math> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/44016">#44016</a>), and we’ve halved the time it takes to load <a href="https://262.ecma-international.org/16.0/index.html">the ECMAScript spec</a> by fixing the <math xmlns="http://www.w3.org/1998/Math/MathML"><mrow><mi>O</mi><mrow><mo>(</mo><mtext>whole DOM tree</mtext><mo>)</mo></mrow></mrow></math> processing of <strong>‘id’</strong> and <strong>‘name’ attributes</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44120">#44120</a>, <a href="https://github.com/servo/servo/pull/44127">#44127</a>, <a href="https://github.com/servo/servo/pull/44117">#44117</a>).</p>
<p>Servo makes its <strong>first TLS connection</strong> in each session <strong>30–60 ms faster</strong> (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44242">#44242</a>), and we’ve instrumented the Servo and servoshell startup processes to find more opportunities for optimisation (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44443">#44443</a>, <a href="https://github.com/servo/servo/pull/44456">#44456</a>).</p>
<p>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.
<a href="https://book.servo.org/design-documentation/architecture.html">Two key components</a> of this system are the <strong>constellation</strong> thread, which manages the engine as a whole, and the <strong>script threads</strong> (or web processes), which render the web pages.
Sending these messages can be expensive though, so to <strong>reduce unnecessary IPC traffic</strong>, we’ve landed an optimisation that allows script threads to selectively receive only the relevant messages from the constellation (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/43124">#43124</a>).</p>
<p>We’ve reduced the <strong>memory usage</strong> of each <strong>Attr</strong>, <strong>Text</strong>, and <strong>Character­Data</strong> node in the DOM by 16 bytes (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/44074">#44074</a>), and <strong>fixed a memory leak</strong> when deleting <strong>&lt;video controls&gt;</strong> or <strong>&lt;audio controls&gt;</strong> (<a href="https://github.com/Messi002">@Messi002</a>, <a href="https://github.com/servo/servo/pull/43983">#43983</a>).</p>
<p>Our <strong>about:memory</strong> page is more accurate now too, with new tracking of <strong>libc memory allocations</strong> on macOS, improved tracking of libc memory allocations on Linux (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44037">#44037</a>), and more accurate tracking of Path­Buf and types in <code>tokio</code>, <code>http</code>, <code>data­_url</code>, and <code>urlpattern</code> (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/servo/servo/pull/43858">#43858</a>).</p>
<p>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 <strong>prototype checks</strong> 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 (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/44364">#44364</a>).</p>
<p>Layout can now <strong>reuse fragments</strong> in later reflows, in many cases that involve block layout or ‘position: absolute’ (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/42904">#42904</a>, <a href="https://github.com/servo/servo/pull/44231">#44231</a>).
We’re also working on <strong>reusing shaping results</strong> in later reflows, and making inline layout more efficient (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44370">#44370</a>, <a href="https://github.com/servo/servo/pull/43974">#43974</a>, <a href="https://github.com/servo/servo/pull/44436">#44436</a>).</p>
<p>We’ve landed several changes that should reduce the <strong>binary size</strong> of Servo (<a href="https://github.com/rovertrack">@rovertrack</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/nicoburns">@nicoburns</a>, <a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/servo/servo/pull/44227">#44227</a>, <a href="https://github.com/servo/servo/pull/44221">#44221</a>, <a href="https://github.com/servo/servo/pull/44303">#44303</a>, <a href="https://github.com/servo/servo/pull/44338">#44338</a>, <a href="https://github.com/servo/servo/pull/44428">#44428</a>, <a href="https://github.com/servo/servo/pull/44134">#44134</a>).</p>
<p>We’ve also reduced clones, allocations, borrow checks, GC rooting steps, and other operations in many parts of Servo (<a href="https://github.com/rovertrack">@rovertrack</a>, <a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44008">#44008</a>, <a href="https://github.com/servo/servo/pull/44544">#44544</a>, <a href="https://github.com/servo/servo/pull/44271">#44271</a>, <a href="https://github.com/servo/servo/pull/44279">#44279</a>, <a href="https://github.com/servo/servo/pull/43826">#43826</a>, <a href="https://github.com/servo/servo/pull/44052">#44052</a>, <a href="https://github.com/servo/servo/pull/44139">#44139</a>).</p>
<p>Several crashes have been fixed:</p>
<ul>
<li>in compressed­Tex­Sub­Image2D() on Web­GL­Rendering­Context (<a href="https://github.com/thebabalola">@thebabalola</a>, #44050)</li>
<li>in console.log() (<a href="https://github.com/thebabalola">@thebabalola</a>, <a href="https://github.com/servo/servo/pull/43844">#43844</a>)</li>
<li>in get­Data() on Data­Transfer (<a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/44607">#44607</a>)</li>
<li>in remove() on Element (<a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/44435">#44435</a>)</li>
<li>in replace­With() on Element (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44503">#44503</a>)</li>
<li>in <code>--debug-mozjs</code> builds (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44386">#44386</a>, <a href="https://github.com/servo/servo/pull/44573">#44573</a>, <a href="https://github.com/servo/servo/pull/44581">#44581</a>)</li>
<li>in flex and grid layout (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/nicoburns">@nicoburns</a>, <a href="https://github.com/servo/servo/pull/44424">#44424</a>, <a href="https://github.com/servo/servo/pull/44203">#44203</a>)</li>
<li>in layout queries like <code>offset­Height</code> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44560">#44560</a>)</li>
<li>in the devtools Debugger tab, when stepping and when inspecting nested values (<a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/servo/servo/pull/44024">#44024</a>, <a href="https://github.com/servo/servo/pull/43995">#43995</a>)</li>
<li>when removing &lt;colgroup&gt; from the DOM (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43846">#43846</a>)</li>
<li>when running garbage collection (<a href="https://github.com/drasticactions">@drasticactions</a>, <a href="https://github.com/servo/servo/pull/43933">#43933</a>)</li>
<li>when running servoshell with a <a href="https://doc.rust-lang.org/1.88.0/std/primitive.u64.html"><code>u64</code></a> <code>--pref</code> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44079">#44079</a>)</li>
<li>when shadow roots are deeply nested, or when calling attach­Shadow() removes elements from the flat tree (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43888">#43888</a>, <a href="https://github.com/servo/servo/pull/43930">#43930</a>, <a href="https://github.com/servo/servo/pull/44259">#44259</a>)</li>
<li>when <a href="https://storage.spec.whatwg.org/">web storage features</a> fail to write to disk or encounter SQLite errors (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/sabbCodes">@sabbCodes</a>, <a href="https://github.com/servo/servo/pull/43918">#43918</a>, <a href="https://github.com/servo/servo/pull/43949">#43949</a>)</li>
</ul>
<p>We fixed a crash in servoshell when pressing keys like Ctrl+2 or ⌘2 with not enough tabs open (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44070">#44070</a>).</p>
<p><strong>DOM data structures</strong> (<code>#[dom­_struct]</code>) can refer to one another, with the help of <a href="https://research.mozilla.org/2014/08/26/javascript-servos-only-garbage-collector/">garbage collection</a>.
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 <code>impl Drop</code>.
To help prevent that class of bug, we’re reworking our DOM types so that none of them have <code>#[dom­_struct]</code> and <code>impl Drop</code> at the same time (<a href="https://github.com/willypuzzle">@willypuzzle</a>, <a href="https://github.com/servo/servo/pull/44119">#44119</a>, <a href="https://github.com/servo/servo/pull/44501">#44501</a>, <a href="https://github.com/servo/servo/pull/44513">#44513</a>).</p>
<p>We’ve improved our static analysis for GC rooting (<a href="https://github.com/officialasishkumar">@officialasishkumar</a>, <a href="https://github.com/servo/servo/pull/44489">#44489</a>), and we’ve continued our long-running effort to <strong>use the Rust type system</strong> to make certain kinds of dynamic borrow failures impossible (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/elomscansio">@elomscansio</a>, <a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/rovertrack">@rovertrack</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/nodelpit">@nodelpit</a>, <a href="https://github.com/servo/servo/pull/43174">#43174</a>, <a href="https://github.com/servo/servo/pull/43524">#43524</a>, <a href="https://github.com/servo/servo/pull/43928">#43928</a>, <a href="https://github.com/servo/servo/pull/43943">#43943</a>, <a href="https://github.com/servo/servo/pull/43942">#43942</a>, <a href="https://github.com/servo/servo/pull/43944">#43944</a>, <a href="https://github.com/servo/servo/pull/43946">#43946</a>, <a href="https://github.com/servo/servo/pull/43952">#43952</a>, <a href="https://github.com/servo/servo/pull/43975">#43975</a>, <a href="https://github.com/servo/servo/pull/44018">#44018</a>, <a href="https://github.com/servo/servo/pull/44175">#44175</a>, <a href="https://github.com/servo/servo/pull/44241">#44241</a>, <a href="https://github.com/servo/servo/pull/44368">#44368</a>, <a href="https://github.com/servo/servo/pull/44406">#44406</a>, <a href="https://github.com/servo/servo/pull/44441">#44441</a>, <a href="https://github.com/servo/servo/pull/44422">#44422</a>, <a href="https://github.com/servo/servo/pull/44475">#44475</a>, <a href="https://github.com/servo/servo/pull/44478">#44478</a>, <a href="https://github.com/servo/servo/pull/44484">#44484</a>, <a href="https://github.com/servo/servo/pull/44476">#44476</a>, <a href="https://github.com/servo/servo/pull/44490">#44490</a>, <a href="https://github.com/servo/servo/pull/44477">#44477</a>, <a href="https://github.com/servo/servo/pull/44494">#44494</a>, <a href="https://github.com/servo/servo/pull/44497">#44497</a>, <a href="https://github.com/servo/servo/pull/44498">#44498</a>, <a href="https://github.com/servo/servo/pull/44495">#44495</a>, <a href="https://github.com/servo/servo/pull/44505">#44505</a>, <a href="https://github.com/servo/servo/pull/44506">#44506</a>, <a href="https://github.com/servo/servo/pull/44507">#44507</a>, <a href="https://github.com/servo/servo/pull/44508">#44508</a>, <a href="https://github.com/servo/servo/pull/44509">#44509</a>, <a href="https://github.com/servo/servo/pull/44510">#44510</a>, <a href="https://github.com/servo/servo/pull/44512">#44512</a>, <a href="https://github.com/servo/servo/pull/44482">#44482</a>, <a href="https://github.com/servo/servo/pull/44527">#44527</a>, <a href="https://github.com/servo/servo/pull/44528">#44528</a>, <a href="https://github.com/servo/servo/pull/44531">#44531</a>, <a href="https://github.com/servo/servo/pull/44534">#44534</a>, <a href="https://github.com/servo/servo/pull/44542">#44542</a>, <a href="https://github.com/servo/servo/pull/44533">#44533</a>, <a href="https://github.com/servo/servo/pull/44543">#44543</a>, <a href="https://github.com/servo/servo/pull/44553">#44553</a>, <a href="https://github.com/servo/servo/pull/44547">#44547</a>, <a href="https://github.com/servo/servo/pull/44563">#44563</a>, <a href="https://github.com/servo/servo/pull/44562">#44562</a>, <a href="https://github.com/servo/servo/pull/44565">#44565</a>, <a href="https://github.com/servo/servo/pull/44558">#44558</a>, <a href="https://github.com/servo/servo/pull/44583">#44583</a>, <a href="https://github.com/servo/servo/pull/44606">#44606</a>, <a href="https://github.com/servo/servo/pull/44605">#44605</a>, <a href="https://github.com/servo/servo/pull/44608">#44608</a>, <a href="https://github.com/servo/servo/pull/44602">#44602</a>, <a href="https://github.com/servo/servo/pull/44584">#44584</a>, <a href="https://github.com/servo/servo/pull/44620">#44620</a>, <a href="https://github.com/servo/servo/pull/44590">#44590</a>, <a href="https://github.com/servo/servo/pull/44254">#44254</a>, <a href="https://github.com/servo/servo/pull/44628">#44628</a>, <a href="https://github.com/servo/servo/pull/44629">#44629</a>, <a href="https://github.com/servo/servo/pull/44638">#44638</a>, <a href="https://github.com/servo/servo/pull/44626">#44626</a>, <a href="https://github.com/servo/servo/pull/44081">#44081</a>).</p>
<p>Thanks to a wide range of people, we’ve also landed a bunch of cleanups and refactors (<a href="https://github.com/delan">@delan</a>, <a href="https://github.com/alice">@alice</a>, <a href="https://github.com/Skgland">@Skgland</a>, <a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/sabbCodes">@sabbCodes</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/thebabalola">@thebabalola</a>, <a href="https://github.com/CynthiaOketch">@CynthiaOketch</a>, <a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/rovertrack">@rovertrack</a>, <a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/arabson99">@arabson99</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/nicoburns">@nicoburns</a>, <a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/niyabits">@niyabits</a>, <a href="https://github.com/treetmitterglad">@treetmitterglad</a>, <a href="https://github.com/foresterre">@foresterre</a>, <a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/elomscansio">@elomscansio</a>, <a href="https://github.com/freyacodes">@freyacodes</a>, <a href="https://github.com/StaySafe020">@StaySafe020</a>, <a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/servo/servo/pull/43772">#43772</a>, <a href="https://github.com/servo/servo/pull/44006">#44006</a>, <a href="https://github.com/servo/servo/pull/43860">#43860</a>, <a href="https://github.com/servo/servo/pull/44121">#44121</a>, <a href="https://github.com/servo/servo/pull/44160">#44160</a>, <a href="https://github.com/servo/servo/pull/43884">#43884</a>, <a href="https://github.com/servo/servo/pull/44154">#44154</a>, <a href="https://github.com/servo/servo/pull/44569">#44569</a>, <a href="https://github.com/servo/servo/pull/43939">#43939</a>, <a href="https://github.com/servo/servo/pull/44003">#44003</a>, <a href="https://github.com/servo/servo/pull/44110">#44110</a>, <a href="https://github.com/servo/servo/pull/44122">#44122</a>, <a href="https://github.com/servo/servo/pull/43824">#43824</a>, <a href="https://github.com/servo/servo/pull/44635">#44635</a>, <a href="https://github.com/servo/servo/pull/44103">#44103</a>, <a href="https://github.com/servo/servo/pull/43978">#43978</a>, <a href="https://github.com/servo/servo/pull/44092">#44092</a>, <a href="https://github.com/servo/servo/pull/44114">#44114</a>, <a href="https://github.com/servo/servo/pull/44277">#44277</a>, <a href="https://github.com/servo/servo/pull/44454">#44454</a>, <a href="https://github.com/servo/servo/pull/44274">#44274</a>, <a href="https://github.com/servo/servo/pull/44237">#44237</a>, <a href="https://github.com/servo/servo/pull/44232">#44232</a>, <a href="https://github.com/servo/servo/pull/44167">#44167</a>, <a href="https://github.com/servo/servo/pull/44214">#44214</a>, <a href="https://github.com/servo/servo/pull/43820">#43820</a>, <a href="https://github.com/servo/servo/pull/43825">#43825</a>, <a href="https://github.com/servo/servo/pull/43810">#43810</a>, <a href="https://github.com/servo/servo/pull/43838">#43838</a>, <a href="https://github.com/servo/servo/pull/43841">#43841</a>, <a href="https://github.com/servo/servo/pull/43847">#43847</a>, <a href="https://github.com/servo/servo/pull/43875">#43875</a>, <a href="https://github.com/servo/servo/pull/43876">#43876</a>, <a href="https://github.com/servo/servo/pull/43889">#43889</a>, <a href="https://github.com/servo/servo/pull/43893">#43893</a>, <a href="https://github.com/servo/servo/pull/43896">#43896</a>, <a href="https://github.com/servo/servo/pull/43881">#43881</a>, <a href="https://github.com/servo/servo/pull/43906">#43906</a>, <a href="https://github.com/servo/servo/pull/43913">#43913</a>, <a href="https://github.com/servo/servo/pull/43908">#43908</a>, <a href="https://github.com/servo/servo/pull/43917">#43917</a>, <a href="https://github.com/servo/servo/pull/43910">#43910</a>, <a href="https://github.com/servo/servo/pull/43921">#43921</a>, <a href="https://github.com/servo/servo/pull/43924">#43924</a>, <a href="https://github.com/servo/servo/pull/43925">#43925</a>, <a href="https://github.com/servo/servo/pull/43907">#43907</a>, <a href="https://github.com/servo/servo/pull/43923">#43923</a>, <a href="https://github.com/servo/servo/pull/43916">#43916</a>, <a href="https://github.com/servo/servo/pull/43909">#43909</a>, <a href="https://github.com/servo/servo/pull/43911">#43911</a>, <a href="https://github.com/servo/servo/pull/43957">#43957</a>, <a href="https://github.com/servo/servo/pull/43969">#43969</a>, <a href="https://github.com/servo/servo/pull/43967">#43967</a>, <a href="https://github.com/servo/servo/pull/43915">#43915</a>, <a href="https://github.com/servo/servo/pull/43954">#43954</a>, <a href="https://github.com/servo/servo/pull/43963">#43963</a>, <a href="https://github.com/servo/servo/pull/43959">#43959</a>, <a href="https://github.com/servo/servo/pull/43955">#43955</a>, <a href="https://github.com/servo/servo/pull/44067">#44067</a>, <a href="https://github.com/servo/servo/pull/44068">#44068</a>, <a href="https://github.com/servo/servo/pull/44071">#44071</a>, <a href="https://github.com/servo/servo/pull/44084">#44084</a>, <a href="https://github.com/servo/servo/pull/44265">#44265</a>, <a href="https://github.com/servo/servo/pull/44115">#44115</a>, <a href="https://github.com/servo/servo/pull/44358">#44358</a>, <a href="https://github.com/servo/servo/pull/43848">#43848</a>).</p>
<h3>Donations <a class="header-anchor" href="https://servo.org/blog/2026/05/31/april-in-servo/#donations">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>Thanks again for your generous support!
We are now receiving <strong>7349 USD/month</strong> (+2.5% from March) in recurring donations.
This helps us cover the cost of our <strong><a href="https://ci0.servo.org/">speedy</a> <a href="https://ci1.servo.org/">CI</a> <a href="https://ci2.servo.org/">and</a> <a href="https://ci3.servo.org/">benchmarking</a> <a href="https://ci4.servo.org/">servers</a></strong>, one of our latest <strong><a href="https://www.outreachy.org/alums/2025-06/#:~:text=Servo">Outreachy interns</a></strong>, and funding <strong><a href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/">maintainer work</a></strong> that helps more people contribute to Servo.</p>
<p>Servo is also on <a href="https://thanks.dev/">thanks.dev</a>, and already <strong>33 GitHub users</strong> (−4 from March) that depend on Servo are sponsoring us there.
If you use Servo libraries like <a href="https://crates.io/crates/url/reverse_dependencies">url</a>, <a href="https://crates.io/crates/html5ever/reverse_dependencies">html5ever</a>, <a href="https://crates.io/crates/selectors/reverse_dependencies">selectors</a>, or <a href="https://crates.io/crates/cssparser/reverse_dependencies">cssparser</a>, signing up for <a href="https://thanks.dev/">thanks.dev</a> could be a good way for you (or your employer) to give back to the community.</p>
<p>We now have <a href="https://servo.org/blog/2025/11/21/sponsorship-tiers/"><strong>sponsorship tiers</strong></a> 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 <a href="mailto:join@servo.org">join@servo.org</a>.</p>
<figure class="_fig" style="width: 100%; margin: 1em 0;"><div class="_flex">
    <div style="text-align: right;">
        <div><strong>7349</strong> USD/month</div>
        <div/>
        <div/>
        <div style="padding-right: 1em;"><strong>10000</strong></div>
    </div>
    <progress max="10000" value="7349"/>
</div></figure>
<p>Use of donations is decided transparently via the Technical Steering Committee’s public <strong><a href="https://github.com/servo/project/blob/main/FUNDING_REQUEST.md">funding request process</a></strong>, and active proposals are tracked in <a href="https://github.com/servo/project/issues/187">servo/project#187</a>.
For more details, head to our <a href="https://servo.org/sponsorship/">Sponsorship page</a>.</p></div>
    </content>
    <updated>2026-05-31T00:00:00Z</updated>
    <source>
      <id>https://servo.org</id>
      <author>
        <name>Servo Team</name>
        <email>info@servo.org</email>
      </author>
      <link href="https://servo.org/blog/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://servo.org" rel="alternate" type="text/html"/>
      <subtitle>All the entries in the Servo blog.</subtitle>
      <title>Servo Blog</title>
      <updated>2026-05-31T00:00:00Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:frederikbraun.de,2026-05-31:/the-s-in-interoperability.html</id>
    <link href="https://frederikbraun.de/the-s-in-interoperability.html" rel="alternate" type="text/html"/>
    <title>The S in interoperability</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>This is a blog post about standards, their proliferation and the issues
that may arise.
My first involvement with standards was just as a reader. To
better understand complicated code or unexpected behavior in a protocol.
After a while, I also got involved and helped clarify certain things to ensure …</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>This is a blog post about standards, their proliferation and the issues
that may arise.
My first involvement with standards was just as a reader. To
better understand complicated code or unexpected behavior in a protocol.
After a while, I also got involved and helped clarify certain things to ensure
implementations align on the same behavior in edge cases.
Eventually, I found myself co-editing a specification -
<a href="https://www.w3.org/TR/SRI/">Subresource Integrity</a> (SRI) which was published as
a W3C Recommendation in 2015. The core idea behind SRI is that you include
third-party JavaScript combined with a SHA2 digest of the expected file.
If the browser does not find the downloaded URL to match the expected digest,
the script will not execute. This allows using a fast CDN for JavaScript
without giving them full control over the scripts on your page - essentially
reducing the security risks.</p>
<p>The standard format for these digests is e.g.,
<code>sha(size)-(base64 encoding of the digest)</code>.
While computing the hash digest is rather straightforward, base64 comes in two
encoding alphabets: First, <code>a-zA-Z0-9/+</code> and secondly the url-safe variant
which uses <code>a-zA-z0-9_-</code>. The specification examples all used the former.</p>
<p>Only approximately ten years after publication, in 2025, we still found a bug.
As part of a compatibility report against Firefox not properly supporting a
website, we found that the core issue was actually with a different browser.
The other browser liberally accepted both types of encoding, which resulted in
websites expecting support for base64 and base64url interchangeably.
The page did not work in Firefox, because it did not accept all hashes a
website wanted the browser to check, revealing a minor security issue.</p>
<p>The real fix would have been that the standard clarifies that
the base64url variant is incorrect and the other browser engine changes
their behavior.</p>
<p>But due to (somewhat unrelated) issues around proliferation of standards, web
compatibility and the unfortunate market dominance of certain browsers, we
went the other road. To support existing web content, we changed the standard
to acknowledging that both types of encoding are considered valid
representations.</p>
<p>This example shows, that it can take multiple years for subtle differences to
appear. Interoperable specifications can establish a shared
understanding along a "happy path", but not necessarily in adversarial
settings. In addition, standards need to continuous maintenance and active
stakeholders who ensure that implementations remain interoperable and secure
over time.</p>
<h3>From specification to standard</h3>
<p>Originally, a specification is at first just a write-up, an idea how something
could be better:
How it should behave, how it works, what the data structures, the algorithms
and the interactions of them look like. Anyone can come up with a grammar,
a parser and a resulting data structure.</p>
<p>For a standard, this specification needs a shared agreement that is also
widely and consistently implemented. This will work best with iterative
co-design of the spec, the implementations and intense discussions of
corner cases.
Some may go further and use <a href="https://github.com/web-platform-tests/wpt/">shared test suites</a>.</p>
<p>This will lead to Interoperability (interop), but still
requires constant maintenance and observation of the ecosystem beyond
individual implementations. While interop is asymptotic and requires a shared
agreement over time, security demands <strong>understanding</strong> - a broader reach that
requires the inspection of limitations and subtle boundaries.</p>
<p>This deeper level of understanding is often missing when implementations
consider syntax "simple enough" without reading the spec. The base64 SRI example is just one example, but there are more:</p>
<p>Many people have written their own parsers for text-based
languages. You may have seen code that parses HTML with regular expressions.
Other great examples of "easily" parsed languages are maybe XML, JSON, or YAML.</p>
<p>But these implementations often make different assumptions, leading to subtle incompatibilities or even security flaws.</p>
<h3>Parser Differentials</h3>
<p>More practical, let's look at an issue with JSON, to demonstrate the impact of
handling input that is ostensibly simple.
Let's examine this JSON string and the resulting data structure:</p>
<div class="highlight"><pre><span/><code><span class="p">{</span>
<span class="w">    </span><span class="nt">"test"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
<span class="w">    </span><span class="nt">"test"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span>
<span class="p">}</span>
</code></pre></div>

<p>When parsed into an object <code>obj</code>, what do you think will <code>obj.test</code> return?
Most JSON parsers are so liberal that they will happily consume two dictionary
keys with the same name <code>"test"</code>. One implementation may simply assign <code>obj.test</code>
twice: First with <code>0</code> and then overwrite it with <code>1</code>.
Another one might check for existing keys
and reject the second <code>"test"</code> key silently, keeping the first one.</p>
<p>The lack of rigor in the original description of JSON as a
"subset of JavaScript" was already acknowledged and raised as problematic
in the JSON RFC (which came much later in 2017).
But still to this day, many implementations allow input
with duplicate dictionary keys and show divergent behavior.</p>
<p>While the examples with SRI and JSON are relatively harmless, real
parser differential bugs were leading to code execution,
authentication bypasses and more<sup id="fnref:1"><a class="footnote-ref" href="https://frederikbraun.de/feeds/all.atom.xml#fn:1">1</a></sup>.</p>
<h3>What do we learn from this?</h3>
<p>Perfect interoperability is not created through a specification, it needs
constant maintenance. The ambiguity can only be removed through long-term
commitment and regular feedback from implementations and users.</p>
<p>The same is true for security: The SRI bug persisted for ten years and
nobody noticed how implementations disagreed and corner cases were overlooked.
They only aligned due to a real, user-facing issue.</p>
<p>But these examples are not a warning sign, they are scar tissue that shows how
the internet is made. Standards can only mature through vigilant maintenance.</p>
<p>The bug reports, the spec issues being filed, the shared test
cases, sometimes even the random forum complaints. All of these help to
remove ambiguity and allow internet standards to mature.</p>
<p>In the end, standards are not secure because they are written down. They are secure because people continue to question, understand, and maintain them.</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p><a href="https://seriot.ch/security/parsing_json.html">JSON</a>, <a href="https://gitlab-com.gitlab.io/gl-security/security-tech-notes/security-research-tech-notes/devfile/">YML</a>, <a href="https://github.blog/security/sign-in-as-anyone-bypassing-saml-sso-authentication-with-parser-differentials/">XML</a>, <a href="https://www.youtube.com/watch?v=Dq_KVLXzxH8">and more</a> <a class="footnote-backref" href="https://frederikbraun.de/feeds/all.atom.xml#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div></div>
    </content>
    <updated>2026-05-30T22:00:00Z</updated>
    <published>2026-05-30T22:00:00Z</published>
    <category term="misc"/>
    <author>
      <name>Frederik</name>
    </author>
    <source>
      <id>https://frederikbraun.de/</id>
      <link href="https://frederikbraun.de/" rel="alternate" type="text/html"/>
      <link href="https://frederikbraun.de/feeds/all.atom.xml" rel="self" type="application/atom+xml"/>
      <title>Frederik Braun</title>
      <updated>2026-05-30T22:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/</id>
    <link href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/" rel="alternate" title="Announcing Rust 1.96.0" type="text/html"/>
    <title xml:lang="en">Announcing Rust 1.96.0</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>The Rust team is happy to announce a new version of Rust, 1.96.0. Rust is a programming language empowering everyone to build reliable and efficient software.</p>
<p>If you have a previous version of Rust installed via <code>rustup</code>, you can get 1.96.0 with:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>$</span><span> rustup update stable</span></span></code></pre>
<p>If you don't have it already, you can <a href="https://www.rust-lang.org/install.html" rel="external">get <code>rustup</code></a> from the appropriate page on our website, and check out the <a href="https://doc.rust-lang.org/stable/releases.html#version-1960-2026-05-28" rel="external">detailed release notes for 1.96.0</a>.</p>
<p>If you'd like to help us out by testing future releases, you might consider updating locally to use the beta channel (<code>rustup default beta</code>) or the nightly channel (<code>rustup default nightly</code>). Please <a href="https://github.com/rust-lang/rust/issues/new/choose" rel="external">report</a> any bugs you might come across!</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#what-s-in-1-96-0-stable"/>
What's in 1.96.0 stable</h3>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#new-range-types"/>
New <code>Range*</code> types</h4>
<p>Many users expect <code>Range</code> and related <code>core::ops</code> types to be <code>Copy</code>, but this is not the case: they implement <code>Iterator</code> directly, and <a href="https://rust-lang.github.io/rust-clippy/rust-1.95.0/index.html#copy_iterator" rel="external">it is a footgun to implement both <code>Iterator</code> and <code>Copy</code> on the same type</a> so this has been avoided. <a href="https://rust-lang.github.io/rfcs/3550-new-range.html" rel="external">RFC3550</a> proposed a set of replacement range types that implement <code>IntoIterator</code> rather than <code>Iterator</code>, meaning they can also be <code>Copy</code>. The standard library portion of that RFC is now stable, introducing:</p>
<ul>
<li><code>core::range::Range</code></li>
<li><code>core::range::RangeFrom</code></li>
<li><code>core::range::RangeInclusive</code></li>
<li>Associated iterators</li>
</ul>
<p>A Rust version in the near future will also add <code>core::range::RangeFull</code> and <code>core::range::RangeTo</code> as re-exports from <code>core::ops</code> (these do not implement <code>Iterator</code> and already implement <code>Copy</code>), and <code>core::range::legacy::*</code> as the new home for the current ranges. Range syntax like <code>0..1</code> still produces the legacy types for now, but will be updated to <code>core::range</code> types in a future edition.</p>
<p>With these stabilizations, it is now possible to store slice accessors in <code>Copy</code> types without splitting <code>start</code> and <code>end</code>:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span class="z-keyword">use</span><span class="z-entity z-name z-namespace"> core</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-namespace">range</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Range</span><span>;</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>#</span><span>[</span><span>derive</span><span>(</span><span class="z-entity z-name z-type">Clone</span><span>,</span><span class="z-entity z-name z-type"> Copy</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-keyword">pub</span><span class="z-storage z-type"> struct</span><span class="z-entity z-name z-type"> Span</span><span>(</span><span class="z-entity z-name z-type">Range</span><span>&lt;</span><span class="z-entity z-name z-type">usize</span><span>&gt;</span><span>)</span><span>;</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">impl</span><span class="z-entity z-name z-type"> Span</span><span> {</span></span>
<span class="giallo-l"><span class="z-keyword">    pub</span><span class="z-keyword"> fn</span><span class="z-entity z-name z-function"> of</span><span>(</span><span class="z-variable z-language">self</span><span>,</span><span class="z-variable"> s</span><span class="z-keyword z-operator">:</span><span class="z-keyword z-operator"> &amp;</span><span class="z-entity z-name z-type">str</span><span>)</span><span class="z-keyword z-operator"> -&gt;</span><span class="z-keyword z-operator"> &amp;</span><span class="z-entity z-name z-type">str</span><span> {</span></span>
<span class="giallo-l"><span class="z-keyword z-operator">        &amp;</span><span class="z-variable">s</span><span>[</span><span class="z-variable z-language">self</span><span class="z-keyword z-operator">.</span><span class="z-constant z-numeric">0</span><span>]</span></span>
<span class="giallo-l"><span>    }</span></span>
<span class="giallo-l"><span>}</span></span></code></pre>
<p>The new <code>RangeInclusive</code> also makes its fields public, unlike the legacy version which avoided exposing the exhausted iterator state. This isn't a concern with the new type since it must be converted to begin iteration.</p>
<p>Library authors should consider making use of <code>impl RangeBounds</code> in public API, which accepts both legacy and new range types. If a concrete type is needed, prefer using new ranges as this will eventually become the default.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#assert-matching-patterns"/>
Assert matching patterns</h4>
<p>The new macros <code>assert_matches!</code> and <code>debug_assert_matches!</code> check that a value matches a given pattern, panicking with a <code>Debug</code> representation of the value otherwise. These are essentially the same as <code>assert!(matches!(..))</code> and <code>debug_assert!(matches!(..))</code>, but the printed value improves the possibility of diagnosing the failure.</p>
<p>These new macros have not been added to the standard prelude, because they would collide with popular third-party crates that provide macros with the same name. Instead, they should be manually imported from <code>core</code> or <code>std</code> before use.</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span class="z-keyword">use</span><span class="z-entity z-name z-namespace"> core</span><span class="z-keyword z-operator">::</span><span>assert_matches</span><span>;</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-punctuation z-definition z-comment z-comment">///</span><span class="z-comment"> [Random Number](https://xkcd.com/221/)</span></span>
<span class="giallo-l"><span class="z-keyword">fn</span><span class="z-entity z-name z-function"> get_random_number</span><span>(</span><span>)</span><span class="z-keyword z-operator"> -&gt;</span><span class="z-entity z-name z-type"> u32</span><span> {</span></span>
<span class="giallo-l"><span class="z-punctuation z-definition z-comment z-comment">    //</span><span class="z-comment z-line z-double-slash z-comment"> chosen by a fair dice roll.</span></span>
<span class="giallo-l"><span class="z-punctuation z-definition z-comment z-comment">    //</span><span class="z-comment z-line z-double-slash z-comment"> guaranteed to be random.</span></span>
<span class="giallo-l"><span class="z-constant z-numeric">    4</span></span>
<span class="giallo-l"><span>}</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">fn</span><span class="z-entity z-name z-function"> main</span><span>(</span><span>)</span><span> {</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    assert_matches!</span><span>(</span><span class="z-entity z-name z-function">get_random_number</span><span>(</span><span>)</span><span>,</span><span class="z-constant z-numeric"> 1</span><span class="z-keyword z-operator">..=</span><span class="z-constant z-numeric">6</span><span>)</span><span>;</span></span>
<span class="giallo-l"><span>}</span></span></code></pre><h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#changes-to-webassembly-targets"/>
Changes to WebAssembly targets</h4>
<p>WebAssembly targets no longer pass <code>--allow-undefined</code> to the linker which means that undefined symbols when linking are now a linker error instead of being converted to WebAssembly imports from the <code>"env"</code> module. This change prevents modules from linking unless all linking-related symbols are defined to catch bugs earlier and prevent accidental issues with symbol naming or similar.</p>
<p>Undefined linking-related symbols are often indicative of build-time related bugs or misconfiguration. If, however, the old behavior is intended then it can be re-enabled with <code>RUSTFLAGS=-Clink-arg=--allow-undefined</code> or by editing the source code and using <code>#[link(wasm_import_module = "env")]</code> on the block defining the symbol.</p>
<p>This change was <a href="https://blog.rust-lang.org/2026/04/04/changes-to-webassembly-targets-and-handling-undefined-symbols/" rel="external">previously announced</a> on this blog, and now takes effect in Rust 1.96.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#stabilized-apis"/>
Stabilized APIs</h4>
<ul>
<li><a href="https://doc.rust-lang.org/stable/std/macro.assert_matches.html" rel="external"><code>assert_matches!</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/macro.debug_assert_matches.html" rel="external"><code>debug_assert_matches!</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/panic/struct.AssertUnwindSafe.html#impl-From%3CT%3E-for-AssertUnwindSafe%3CT%3E" rel="external"><code>From&lt;T&gt; for AssertUnwindSafe&lt;T&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/cell/struct.LazyCell.html#impl-From%3CT%3E-for-LazyCell%3CT,+F%3E" rel="external"><code>From&lt;T&gt; for LazyCell&lt;T, F&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/sync/struct.LazyLock.html#impl-From%3CT%3E-for-LazyLock%3CT,+F%3E" rel="external"><code>From&lt;T&gt; for LazyLock&lt;T, F&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeToInclusive.html" rel="external"><code>core::range::RangeToInclusive</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeFrom.html" rel="external"><code>core::range::RangeFrom</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeFromIter.html" rel="external"><code>core::range::RangeFromIter</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.Range.html" rel="external"><code>core::range::Range</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeIter.html" rel="external"><code>core::range::RangeIter</code></a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#two-cargo-advisories"/>
Two Cargo advisories</h4>
<p>Rust 1.96 contains fixes for two vulnerabilities for users of third-party registries.</p>
<ul>
<li>
<p><a href="https://blog.rust-lang.org/2026/05/25/cve-2026-5223/" rel="external">CVE-2026-5223</a> is a <strong>medium</strong> severity vulnerability regarding extraction of crate tarballs with symlinks.</p>
</li>
<li>
<p><a href="https://blog.rust-lang.org/2026/05/25/cve-2026-5222/" rel="external">CVE-2026-5222</a> is a <strong>low</strong> severity vulnerability regarding authentication with normalized URLs.</p>
</li>
</ul>
<p>Users of crates.io are <strong>not affected</strong> by either vulnerability.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#other-changes"/>
Other changes</h4>
<p>Check out everything that changed in <a href="https://github.com/rust-lang/rust/releases/tag/1.96.0" rel="external">Rust</a>, <a href="https://doc.rust-lang.org/nightly/cargo/CHANGELOG.html#cargo-196-2026-05-28" rel="external">Cargo</a>, and <a href="https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-196" rel="external">Clippy</a>.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#contributors-to-1-96-0"/>
Contributors to 1.96.0</h3>
<p>Many people came together to create Rust 1.96.0. We couldn't have done it without all of you. <a href="https://thanks.rust-lang.org/rust/1.96.0/" rel="external">Thanks!</a></p></div>
    </content>
    <updated>2026-05-28T00:00:00Z</updated>
    <published>2026-05-28T00:00:00Z</published>
    <author>
      <name>The Rust Release Team</name>
    </author>
    <source>
      <id>https://blog.rust-lang.org/</id>
      <author>
        <name>Maintained by the Rust Teams.</name>
        <uri>https://github.com/rust-lang/blog.rust-lang.org/</uri>
      </author>
      <link href="https://blog.rust-lang.org/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://blog.rust-lang.org/" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en">Empowering everyone to build reliable and efficient software.</subtitle>
      <title xml:lang="en">Rust Blog</title>
      <updated>2026-06-11T14:20:46Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148488</id>
    <link href="https://discourse.mozilla.org/t/new-deploy-of-perfcompare-may-27th/148488" rel="alternate" type="text/html"/>
    <title>New Deploy of PerfCompare (May 27th)</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The latest version of<a href="https://perf.compare" rel="noopener nofollow ugc"> PerfCompare</a> is now live!</p>
<p>Check out the change-log below to see the updates:</p>
<p>[<a href="https://github.com/mozilla/perfcompare/commits?author=kala-moz" rel="noopener nofollow ugc">kala-moz</a>]:</p>
<ul>
<li>
<p><strong><a href="https://github.com/mozilla/perfcompare/commit/bb77ec5fb588fde17d72e4252535360cb029df95" rel="noopener nofollow ugc">Bug 2036968: Replaced fast-kde with fftkde and used bootstrap-ci to get CI summary (</a><a href="https://github.com/mozilla/perfcompare/pull/1034" rel="noopener nofollow ugc">#1034</a><a href="https://github.com/mozilla/perfcompare/commit/bb77ec5fb588fde17d72e4252535360cb029df95" rel="noopener nofollow ugc">)</a></strong></p>
</li>
<li>
<p><strong><a href="https://github.com/mozilla/perfcompare/commit/c38aace5e3fae8084909e32fa69116566a35cef7" rel="noopener nofollow ugc">Bug 1931291: Created expand all rows functionality (</a><a href="https://github.com/mozilla/perfcompare/pull/1037" rel="noopener nofollow ugc">#1037</a><a href="https://github.com/mozilla/perfcompare/commit/c38aace5e3fae8084909e32fa69116566a35cef7" rel="noopener nofollow ugc">)</a></strong></p>
</li>
<li>
<p><strong><a href="https://github.com/mozilla/perfcompare/commit/1135204ebc02e6339672d8db84af4f056d5a55fb" rel="noopener nofollow ugc">Bug 2032246: Add cles statement to expanded row (</a><a href="https://github.com/mozilla/perfcompare/pull/1033" rel="noopener nofollow ugc">#1033</a><a href="https://github.com/mozilla/perfcompare/commit/1135204ebc02e6339672d8db84af4f056d5a55fb" rel="noopener nofollow ugc">)</a></strong></p>
</li>
<li>
<p><strong><a href="https://github.com/mozilla/perfcompare/commit/834b09b48ea11957324848984c3ab0f09c510078" rel="noopener nofollow ugc">Bug 2037551: Reduced the size of perfcompare hero on Results Page (</a><a href="https://github.com/mozilla/perfcompare/pull/1036" rel="noopener nofollow ugc">#1036</a><a href="https://github.com/mozilla/perfcompare/commit/834b09b48ea11957324848984c3ab0f09c510078" rel="noopener nofollow ugc">)</a></strong></p>
</li>
</ul>
<p>[<a href="https://github.com/mozilla/perfcompare/commits?author=padenot" rel="noopener nofollow ugc">padenot</a>]: <strong><a href="https://github.com/mozilla/perfcompare/commit/67af18193e7c10c35daf188efcdd8e39e51e63ba" rel="noopener nofollow ugc">Use SJ bandwidth for top-level results, ISJ for subtests</a></strong></p>
<p>[<a href="https://github.com/mozilla/perfcompare/commits?author=shtrom" rel="noopener nofollow ugc">shtrom</a>]: <strong><a href="https://github.com/mozilla/perfcompare/commit/ce52f76fa8d2aa67185eeeca19db7f3646b98ff8" rel="noopener nofollow ugc">Bug 2014041: add support for landoInstance QueryString parameter (</a><a href="https://github.com/mozilla/perfcompare/pull/1038" rel="noopener nofollow ugc">#1038</a><a href="https://github.com/mozilla/perfcompare/commit/ce52f76fa8d2aa67185eeeca19db7f3646b98ff8" rel="noopener nofollow ugc">)</a></strong></p>
<p>Thank you for the contributions!</p>
<p>Bugs or feature requests can be<a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Testing&amp;component=PerfCompare&amp;status_whiteboard=%5Bpcf%5D"> filed on Bugzilla</a>. The team can also be found on<a href="https://matrix.to/#/#perfcompare:mozilla.org" rel="noopener nofollow ugc"> the #perfcompare channel on Element</a>. Come and chat!</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/new-deploy-of-perfcompare-may-27th/148488">Read full topic</a></p></div>
    </summary>
    <updated>2026-05-27T21:29:33Z</updated>
    <published>2026-05-27T21:29:33Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>csevere</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/new-deploy-of-perfcompare-may-27th/148488.rss" title="New Deploy of PerfCompare (May 27th)"/>
      <updated>2026-06-12T10:58:53Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:this-week-in-rust.org,2026-05-27:/blog/2026/05/27/this-week-in-rust-653/</id>
    <link href="https://this-week-in-rust.org/blog/2026/05/27/this-week-in-rust-653/" rel="alternate" type="text/html"/>
    <title>This Week in Rust 653</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social …</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social, or
<a href="https://github.com/rust-lang/this-week-in-rust">send us a pull request</a>.
Want to get involved? <a href="https://github.com/rust-lang/rust/blob/main/CONTRIBUTING.md">We love contributions</a>.</p>
<p><em>This Week in Rust</em> is openly developed <a href="https://github.com/rust-lang/this-week-in-rust">on GitHub</a> and archives can be viewed at <a href="https://this-week-in-rust.org/">this-week-in-rust.org</a>.
If you find any errors in this week's issue, <a href="https://github.com/rust-lang/this-week-in-rust/pulls">please submit a PR</a>.</p>
<p>Want TWIR in your inbox? <a href="https://this-week-in-rust.us11.list-manage.com/subscribe?u=fd84c1c757e02889a9b08d289&amp;id=0ed8b72485">Subscribe here</a>.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4>


<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#newsletters">Newsletters</a></h5>
<ul>
<li><a href="https://scientificcomputing.rs/monthly/2026-05">Scientific Computing in Rust #18 (May 2026)</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://github.com/GitoxideLabs/gitoxide/discussions/2621">gitoxide - May 26</a></li>
<li><a href="https://seanmonstar.com/blog/hyper-user-survey-2025-results/">hyper User Survey 2025 Results</a></li>
<li><a href="https://grpc.io/blog/grpc-welcomes-tonic/">Rust Update: gRPC Welcomes Tonic!</a></li>
<li><a href="https://github.com/ifsheldon/serde-const-default/releases/tag/v0.1">serde-const-default v0.1: Removes boilerplate when using const values as field defaults</a></li>
<li><a href="https://github.com/boquila/boquilahub/releases/tag/v0.5">BoquilaHUB 0.5: AIs for Nature. Now it includes SOTA AI bioacoustics models and embeddings models</a></li>
<li><a href="https://www.sextianbytes.fr/blog/imperfect-by-design/">splog: a log viewer TUI with automatic tag categorization</a></li>
<li><a href="https://dev.to/brevity1swos/building-a-regex-debugger-for-the-terminal-in-rust-977">rgx v0.12.3 — Building a regex debugger for the terminal in Rust</a></li>
<li><a href="https://davefx.com/en/2026/05/clipboardwire-construction-story/">UI tests are the guardrails an AI needs: the story of clipboardwire</a></li>
<li><a href="https://github.com/stevekwon211/slintcn/blob/main/docs/INTRODUCING_SLINTCN.md">slintcn 0.22: shadcn/ui-style copy-paste components for Slint native apps</a></li>
<li><a href="https://users.rust-lang.org/t/releasing-dtact-v0-2-2-and-rssn-advanced-v0-1-0/140278">Releasing dtact v0.2.2 and rssn-advanced v0.1.0: the next generation async concurrent engine and scientific computing engine</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5>
<ul>
<li><a href="https://tritium.legal/blog/noroboto">Noroboto: Lying Fonts and Mitigation in Rust</a></li>
<li><a href="https://wolfgirl.dev/blog/2026-05-20-erasing-existentials/">Erasing Existentials</a></li>
<li><a href="https://yogthos.net/posts/2026-05-24-libwce.html">libwce: the entropy layer of a wavelet codec, on its own</a></li>
<li><a href="https://neugierig.org/software/blog/2026/05/theseus-wasm.html">Tech Notes: Theseus: translating win32 to wasm</a></li>
<li><a href="https://aibodh.com/posts/bevy-game-engine/">Bevy Game Engine Explained Visually</a></li>
<li><a href="https://verrchu.github.io/blog/3-the-reflex-of-deriving-serde-traits/">The reflex of deriving <code>serde</code> traits</a></li>
<li><a href="https://aimdb.dev/blog/typed-world-model">Physical AI Needs a Typed World Model, Not a Vector DB</a></li>
<li><a href="https://kerkour.com/rust-monorepos">Keep calm and use (Rust) monorepos</a></li>
<li>[audio] <a href="https://corrode.dev/podcast/s06e04-rust4linux/">Rust for Linux Live with Alice Ryhl and Greg Kroah-Hartman</a></li>
<li>[audio] <a href="https://netstack.fm/#episode-38">Netstack.FM episode 38 — Building and testing network stacks with Rama</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=RbmkNSqMvZY">Can a QR code be made of stars?</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5>
<ul>
<li><a href="https://microsoft.github.io/RustTraining/rust-patterns-book/">Rust Patterns &amp; Engineering How-Tos</a></li>
<li><a href="https://hemomorphic.alexblood.net/posts/laissez-faire-errors/">Laissez-Faire Errors</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-hashmap-iterators-by-building-a-git-object-store-reader/">Learn Rust HashMap and Iterators by Building a Git Object Store Reader</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-the-basics-of-bevy-by-building-and-deploying-pong-to-itch-io/">Learn the Basics of Bevy by Building and Deploying Pong to Itch.io</a></li>
<li><a href="https://cong-or.xyz/false-sharing-cache-lines.html">The Slowdown That Doesn't Show Up in Profiles</a></li>
<li><a href="https://blog.cat-girl.gay/3ds-async-part-one/">Building an AsyncIO executor for the 3DS</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=3IyKC5EtNkM">Nine Ways to do Inheritance in Rust, a Language without Inheritance</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#miscellaneous">Miscellaneous</a></h5>
<ul>
<li><a href="https://kunobi.ninja/blog/what-kache-actually-caches">Content-addressed Rust builds (or, what kache actually caches)</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#crate-of-the-week">Crate of the Week</a></h4>
<p>This week's crate is <a href="https://docs.rs/inline_tweak">inline_tweak</a>, a crate to embed tweakable constants inside your Rust application without full recompilation.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1607">Kill The Mule</a> for the suggestion!</p>
<p><a href="https://users.rust-lang.org/t/crate-of-the-week/2704">Please submit your suggestions and votes for next week</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#calls-for-testing">Calls for Testing</a></h4>
<p>An important step for RFC implementation is for people to experiment with the
implementation and give feedback, especially before stabilization.</p>
<p>If you are a feature implementer and would like your RFC to appear in this list, add a
<code>call-for-testing</code> label to your RFC along with a comment providing testing instructions and/or
guidance on which aspect(s) of the feature need testing.</p>
<p><em>No calls for testing were issued this week by
<a href="https://github.com/rust-lang/rust/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rust</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/rustup/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rustup</a> or
<a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing%20state%3Aopen">Rust language RFCs</a>.</em></p>
<p><a href="https://github.com/rust-lang/this-week-in-rust/issues">Let us know</a> if you would like your feature to be tracked as a part of this list.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#call-for-participation-projects-and-speakers">Call for Participation; projects and speakers</a></h4>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-projects">CFP - Projects</a></h5>
<p>Always wanted to contribute to open-source projects but did not know where to start?
Every week we highlight some tasks from the Rust community for you to pick and get started!</p>
<p>Some of these tasks may also have mentors available, visit the task page for more information.</p>
<ul>
<li><a href="https://github.com/rust-lang-nursery/rust-cookbook/issues/760">rust cookbook - Expand Command Line section with clap derive, subcommands, and env vars</a></li>
</ul>




<p>If you are a Rust project owner and are looking for contributors, please submit tasks <a href="https://github.com/rust-lang/this-week-in-rust?tab=readme-ov-file#call-for-participation-guidelines">here</a> or through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-events">CFP - Events</a></h5>
<p>Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.</p>


<ul>
<li><em>No Calls for papers or presentations were submitted this week.</em></li>
</ul>
<p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4>
<p>352 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-05-19..2026-05-26">merged in the last week</a></p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/156161"><code>rustc_on_unimplemented</code>: introduce format specifiers</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156763">account for proc macro spans in <code>do_not_recommend</code> diagnostics</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155598">implement fast path for <code>derive(PartialOrd)</code> when deriving <code>Ord</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/153640">make bitset <code>would_modify_words</code> more vectorzer-friendly</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156824">parse <code>mut</code> restrictions</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156116">stop needing materialized places for most intrinsics</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#library">Library</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/156828">add unstable Share trait</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156594">stabilize <code>bool_to_result</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/152112">use strongly typed wrapped indices in <code>VecDeque</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/cargo/pull/17006">compiler: forward verbose flag to rustc for local crates</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17027">don't use the network for a publish dry-run test</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17011">break out <code>RegistryConfig</code> and <code>crate_url</code> for interpreting <code>RegistryConfig::dl</code></a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17031">fix CVE-2026-5222 and CVE-2026-5223</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17016">artifact: remove compat mode from artifacts</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rustdoc">Rustdoc</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/155307">stabilize <code>--remap-path-prefix</code> in rustdoc</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17060"><code>useless_format</code>: fire on wrapped in a block-producing macro</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16959"><code>return</code> can be removed from the last stmt of a block if it has an expr</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17025">add check for midpoint using multiplication by <code>0.5</code> and <code>&gt;&gt; 1</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17057">avoid unnecessary <code>String</code> allocations in <code>MinifyingSugg</code> arithmetic ops</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16767">extend <code>clippy::missing_safety_doc</code> to unsafe fields</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17065">fix <code>manual_range_contains</code> NAN handling</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17036">fix error message for <code>useless_borrows_in_formatting</code> for mutable borrows</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16998">move <code>unnecessary_get_then_check</code> to <code>complexity</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17055">simplify <code>is_some() &amp;&amp; …unwrap()</code> to <code>is_some_and</code> in <code>unit_arg</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-analyzer">Rust-Analyzer</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22406"><code>diagnostics: mut_ref</code> binding feature diagnostic</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22342"><code>assists/add_reference_here: _modify_</code> the reference type when dealing with <code>&amp;T-&gt;&amp;mut T</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22426"><code>cfg</code>: correct separator index in CfgDiff disable loop</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22430"><code>hir-ty</code>: saturate float-to-uint cast in const eval</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22427"><code>test-utils</code>: drain <code>inactive_regions</code> by <code>inactive_line_region</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22411">add diagnostic for E0033</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22404">add diagnostic for E0608</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22416">completions imports exclude supports sub items</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22432">filter package-scoped features</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22437"><code>extract_module</code> missing import for macro calls</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22452">add <code>type_match</code> score for <code>struct_pat</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22415">allow wildcard params in foreign fn declarations</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22449">analysis expected ty in <code>enum</code> variant</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22385">autoimport <code>enum</code> variants</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22392">do not autoref in method probe in path mode</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22408">do not complete semicolon in match-expr place</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22397">do not consider the path of the macro in a macro call to be inside a macro call</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22424">emit diagnostic for rest array patterns without fixed-length arrays</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/21566">fix <code>SyntaxContext::root</code>s technically overlapping valid interneds</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22451">flip <code>coerce_never type_mismatch</code> tys</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22383">have a specific error for unimplemented builtin macros</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22409">no suggest ref match when expected generic ref</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22369">no use sad pattern on happy arm with guard</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22425">normalize expected tuple <code>struct</code> pat field</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22252">refactor handling of generic params in <code>hir::Type</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22396">support named consts in range pattern types</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22419">use grouped annotation for <code>add_label_to_loop</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22322">provide better incrementality for modules</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5>
<p>This week was largely positive, with most of the improvements coming from algorithm change in visibility checking: <a href="https://github.com/rust-lang/rust/pull/156228">#156228</a>.</p>
<p>Triage done by <strong>@panstromek</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=281c97c3240a9abd984ca0c6a2cd7389115e80d5&amp;end=783eb8c8682ddde0807c60ed8293670ef523794f&amp;absolute=false&amp;stat=instructions%3Au">281c97c3..783eb8c8</a></p>
<p><strong>Summary</strong>:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">(instructions:u)</th>
<th style="text-align: center;">mean</th>
<th style="text-align: center;">range</th>
<th style="text-align: center;">count</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Regressions ❌ <br/> (primary)</td>
<td style="text-align: center;">0.4%</td>
<td style="text-align: center;">[0.1%, 0.7%]</td>
<td style="text-align: center;">5</td>
</tr>
<tr>
<td style="text-align: center;">Regressions ❌ <br/> (secondary)</td>
<td style="text-align: center;">0.5%</td>
<td style="text-align: center;">[0.1%, 1.1%]</td>
<td style="text-align: center;">16</td>
</tr>
<tr>
<td style="text-align: center;">Improvements ✅ <br/> (primary)</td>
<td style="text-align: center;">-0.9%</td>
<td style="text-align: center;">[-6.6%, -0.1%]</td>
<td style="text-align: center;">164</td>
</tr>
<tr>
<td style="text-align: center;">Improvements ✅ <br/> (secondary)</td>
<td style="text-align: center;">-0.4%</td>
<td style="text-align: center;">[-1.3%, -0.1%]</td>
<td style="text-align: center;">51</td>
</tr>
<tr>
<td style="text-align: center;">All ❌✅ (primary)</td>
<td style="text-align: center;">-0.9%</td>
<td style="text-align: center;">[-6.6%, 0.7%]</td>
<td style="text-align: center;">169</td>
</tr>
</tbody>
</table>
<p>2 Regressions, 2 Improvements, 5 Mixed; 2 of them in rollups
34 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/4e9e90ee6ec008cadd1f351541185eff56319998/triage/2026/2026-05-25.md">Full report here</a></p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#approved-rfcs"/><a href="https://github.com/rust-lang/rfcs/commits/master">Approved RFCs</a></h5>
<p>Changes to Rust follow the Rust <a href="https://github.com/rust-lang/rfcs#rust-rfcs">RFC (request for comments) process</a>. These
are the RFCs that were approved for implementation this week:</p>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3946">Propose the concept of a crates.io username for identity</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#final-comment-period">Final Comment Period</a></h5>
<p>Every week, <a href="https://www.rust-lang.org/team.html">the team</a> announces the 'final comment period' for RFCs and key PRs
which are reaching a decision. Express your opinions now.</p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler-team-mcps-only"/><a href="https://github.com/rust-lang/compiler-team/issues?q=label%3Amajor-change%20label%3Afinal-comment-period%20state%3Aopen">Compiler Team</a> <a href="https://forge.rust-lang.org/compiler/mcp.html">(MCPs only)</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/compiler-team/issues/985">Promotes 5 Thumb-mode bare-metal Arm targets to Tier 2</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/976">Add -Z dead-fn-elimination to skip codegen of BFS-unreachable functions</a></li>
</ul>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust"/><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Rust</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/155989">Update <code>transmute_copy</code> to ub_checks and <code>?Sized</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/117224">Tracking Issue for NEON dot product intrinsics</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/152761">Never break between empty parens</a></li>
</ul>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-rfcs"/><a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3928">Avoid linting <code>unreachable_code</code> on <code>todo!()</code></a></li>
</ul>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#unsafe-code-guidelines"/><a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Unsafe Code Guidelines</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/unsafe-code-guidelines/issues/438">What are the values of a union type? (in particular, what is the validity invariant of a union)</a></li>
</ul>
<p><em>No Items entered Final Comment Period this week for
<a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Team</a>,
<a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a> or
<a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a>.</em>
Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"/><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h5>
<ul>
<li><em>No New or Updated RFCs were created this week.</em></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4>
<p>Rusty Events between 2026-05-27 - 2026-06-24 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-05-27 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/9v7hv2g1"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-06-02 | Virtual | <a href="https://luma.com/libp2p">libp2p Events</a><ul>
<li><a href="https://luma.com/ukfh0mcf"><strong>rust-libp2p Open Maintainers Call</strong></a></li>
</ul>
</li>
<li>2026-06-02 | Virtual (Tel Aviv-yafo, IL) | <a href="https://www.meetup.com/rust-tlv">Rust 🦀 TLV</a><ul>
<li><a href="https://www.meetup.com/rust-tlv/events/314871990/"><strong>‎שיחה חופשית ווירטואלית על ראסט</strong></a></li>
</ul>
</li>
<li>2026-06-03 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/314691782/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
</li>
<li>2026-06-04 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455930/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-06-04 | Virtual (Nürnberg, DE) | <a href="https://www.meetup.com/rust-noris">Rust Nuremberg</a><ul>
<li><a href="https://www.meetup.com/rust-noris/events/313345241/"><strong>Rust Nürnberg online</strong></a></li>
</ul>
</li>
<li>2026-06-04 | Virtual (Tel Aviv-yafo, IL) | <a href="https://www.meetup.com/code-mavens/">Code Mavens 🦀 - 🐍 - 🐪</a><ul>
<li><a href="https://www.meetup.com/code-mavens/events/314979560/"><strong>Exploring FalkorDB - Learning to use a Graph Database in Rust</strong></a> </li>
</ul>
</li>
<li>2026-06-06 | Virtual (Kampala, UG) | <a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763176587">Rust Circle Meetup</a><ul>
<li><a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763176587"><strong>Rust Circle Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-07 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314095285/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-06-09 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254780/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-06-10 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/3bcnx1jb"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-06-16 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/rdhhptyjcjbvb/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314000478/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/ekws5nr4"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314236370/"><strong>June, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455931/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-06-21 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314329044/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254779/"><strong>Fourth Tuesday</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/313767883/"><strong>Lunch &amp; Learn: What the heck are monads - and how do we fake them in Rust</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#asia">Asia</a></h5>
<ul>
<li>2026-06-02 | Beijing, CN | <a href="https://www.meetup.com/wasm-rust-meetup/events/">Voice AI and Rust Meetup (Rust for AI, lowcoderust.com)</a><ul>
<li><a href="https://www.meetup.com/wasm-rust-meetup/events/314750465/"><strong>AI Agents and Open Source LLM (Call for Speakers)</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#europe">Europe</a></h5>
<ul>
<li>2026-05-28 | Copenhagen, DK | <a href="https://www.meetup.com/copenhagen-rust-community">Copenhagen Rust Community</a><ul>
<li><a href="https://www.meetup.com/copenhagen-rust-community/events/314868448/"><strong>Rust meetup #68</strong></a></li>
</ul>
</li>
<li>2026-05-28 | London, UK | <a href="https://www.meetup.com/rust-london-user-group">Rust London User Group</a><ul>
<li><a href="https://www.meetup.com/rust-london-user-group/events/314846861/"><strong>LDN Talks May Community Showcase</strong></a></li>
</ul>
</li>
<li>2026-05-29 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/314396588/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
<li>2026-05-30 | Stockholm, SE | <a href="https://www.meetup.com/stockholm-rust">Stockholm Rust</a><ul>
<li><a href="https://www.meetup.com/stockholm-rust/events/314926826/"><strong>Ferris' Fika Forum #26</strong></a></li>
</ul>
</li>
<li>2026-06-02 | Frankfurt, DE | <a href="https://www.meetup.com/rust-rhein-main">Rust Rhein-Main</a><ul>
<li><a href="https://www.meetup.com/rust-rhein-main/events/314051727/"><strong>gRPC with Rust and Tonic</strong></a></li>
</ul>
</li>
<li>2026-06-03 | Dublin, IE | <a href="https://www.meetup.com/rust-dublin">Rust Dublin</a><ul>
<li><a href="https://www.meetup.com/rust-dublin/events/314689875/"><strong>Join us live and INPERSON for Rust 261</strong></a></li>
</ul>
</li>
<li>2026-06-03 | Girona, ES | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/4bmlc7qd"><strong>Rust Girona Hack &amp; Learn 06 2026</strong></a></li>
</ul>
</li>
<li>2026-06-10 | München, DE | <a href="https://www.meetup.com/rust-munich">Rust Munich</a><ul>
<li><a href="https://www.meetup.com/rust-munich/events/313791798/"><strong>Rust Munich 2026 / 2 - Hacking Evening</strong></a></li>
</ul>
</li>
<li>2026-06-11 | Switzerland, CH | <a href="https://www.posttenebraslab.ch/wiki/events/start">PostTenebrasLab</a><ul>
<li><a href="https://www.posttenebraslab.ch/wiki/events/monthly_meeting/rust_meetup"><strong>Rust Meetup Geneva</strong></a></li>
</ul>
</li>
<li>2026-06-12 - 2026-06-14 | Kraków, PL | <a href="https://rustmeet.eu/">Rustmeet</a><ul>
<li><a href="https://rustmeet.eu/"><strong>Rustmeet</strong></a></li>
</ul>
</li>
<li>2026-06-16 | Leipzig, DE | <a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig">Rust - Modern Systems Programming in Leipzig</a><ul>
<li><a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/events/313813937/"><strong>Interactive: Everything is Open Source</strong></a></li>
</ul>
</li>
<li>2026-06-16 | Milano, IT | <a href="https://www.meetup.com/rust-language-milano">Rust Language Milan</a><ul>
<li><a href="https://www.meetup.com/rust-language-milan/events/314766950/"><strong>Real-time planning in Rust: SolverForge &amp; SERIO</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Aarhus, DK | <a href="https://www.meetup.com/rust-aarhus">Rust Aarhus</a><ul>
<li><a href="https://www.meetup.com/rust-aarhus/events/314965238/"><strong>Talk Night at Danske Commodities</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<li>2026-05-27 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/314209662/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-05-28 | Atlanta, GA, US | <a href="https://www.meetup.com/rust-atl">Rust Atlanta</a><ul>
<li><a href="https://www.meetup.com/rust-atl/events/313539319/"><strong>Rust-Atl</strong></a></li>
</ul>
</li>
<li>2026-05-28 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a><ul>
<li><a href="https://www.meetup.com/rust-los-angeles/events/314218564/"><strong>Rust LA: Rust in Embedded &amp; Autonomous Systems at Parallel Systems in DTLA</strong></a></li>
</ul>
</li>
<li>2026-05-28 | Mountain View, CA, US | <a href="https://www.meetup.com/hackerdojo/events/">Hacker Dojo</a><ul>
<li><a href="https://www.meetup.com/hackerdojo/events/314716463/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
</ul>
</li>
<li>2026-05-30 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/314480537/"><strong>Central Cambridge Rust Lunch, May 30</strong></a></li>
</ul>
</li>
<li>2026-06-04 | Saint Louis, MO, US | <a href="https://www.meetup.com/stl-rust">STL Rust</a><ul>
<li><a href="https://www.meetup.com/stl-rust/events/314106244/"><strong>Testing, Coverage, Tracey &amp; Mutations</strong></a></li>
</ul>
</li>
<li>2026-06-06 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/314480539/"><strong>Boston Common Rust Lunch, June 6</strong></a></li>
</ul>
</li>
<li>2026-06-11 | Lehi, UT, US | <a href="https://www.meetup.com/utah-rust">Utah Rust</a><ul>
<li><a href="https://www.meetup.com/utah-rust/events/314696643/"><strong>Utah Rust June Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-11 | Mountain View, CA, US | <a href="https://www.meetup.com/hackerdojo/events/">Hacker Dojo</a><ul>
<li><a href="https://www.meetup.com/hackerdojo/events/314825006/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
</ul>
</li>
<li>2026-06-11 | San Diego, CA, US | <a href="https://www.meetup.com/san-diego-rust">San Diego Rust</a><ul>
<li><a href="https://www.meetup.com/san-diego-rust/events/313721899/"><strong>San Diego Rust June Meetup - Back in person!</strong></a></li>
</ul>
</li>
<li>2026-06-16 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group">San Francisco Rust Study Group</a><ul>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/ghhwqtyjcjbvb/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314000478/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314236370/"><strong>June, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/xvkdgtyjcjbgc/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a><ul>
<li><a href="https://www.meetup.com/rust-los-angeles/events/314386080/"><strong>Rust LA: Rust-Based Constraint Solvers in 2D Sketching with Zoo Technologies</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#south-america">South America</a></h5>
<ul>
<li>2026-06-18 | Florianópolis, BR | <a href="https://luma.com/rust-sc">Rust SC</a><ul>
<li><a href="https://luma.com/acinctdf"><strong>Rust Floripa</strong></a></li>
</ul>
</li>
</ul>
<p>If you are running a Rust event please add it to the <a href="https://www.google.com/calendar/embed?src=apd9vmbc22egenmtu5l6c5jbfc%40group.calendar.google.com">calendar</a> to get
it mentioned here. Please remember to add a link to the event too.
Email the <a href="mailto:community-team@rust-lang.org">Rust Community Team</a> for access.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#jobs">Jobs</a></h4>
<p>Please see the latest <a href="https://www.reddit.com/r/rust/comments/1sobu1s/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p>
<h3><a class="toclink" href="https://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3>
<blockquote>
<p>This overflows the trait solver today as well as my brain</p>
</blockquote>
<p>– <a href="https://nadrieril.github.io/blog/2026/05/14/when-can-traits-depend-on-themselves.html">Nadrieril on their blog</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1774">Theemathas</a> for the suggestion!</p>
<p><a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328">Please submit quotes and vote for next week!</a></p>
<p>This Week in Rust is edited by:</p>
<ul>
<li><a href="https://github.com/nellshamrell">nellshamrell</a></li>
<li><a href="https://github.com/llogiq">llogiq</a></li>
<li><a href="https://github.com/ericseppanen">ericseppanen</a></li>
<li><a href="https://github.com/extrawurst">extrawurst</a></li>
<li><a href="https://github.com/U007D">U007D</a></li>
<li><a href="https://github.com/mariannegoldin">mariannegoldin</a></li>
<li><a href="https://github.com/bdillo">bdillo</a></li>
<li><a href="https://github.com/opeolluwa">opeolluwa</a></li>
<li><a href="https://github.com/bnchi">bnchi</a></li>
<li><a href="https://github.com/KannanPalani57">KannanPalani57</a></li>
<li><a href="https://github.com/tzilist">tzilist</a></li>
</ul>
<p><em>Email list hosting is sponsored by <a href="https://foundation.rust-lang.org/">The Rust Foundation</a></em></p>
<p><small><a href="https://www.reddit.com/r/rust/comments/1tptzbz/this_week_in_rust_653/">Discuss on r/rust</a></small></p></div>
    </content>
    <updated>2026-05-27T04:00:00Z</updated>
    <published>2026-05-27T04:00:00Z</published>
    <category term="This Week in Rust"/>
    <author>
      <name>TWiR Contributors</name>
    </author>
    <source>
      <id>https://this-week-in-rust.org/</id>
      <link href="https://this-week-in-rust.org/" rel="alternate" type="text/html"/>
      <link href="https://this-week-in-rust.org/atom.xml" rel="self" type="application/atom+xml"/>
      <title>This Week in Rust</title>
      <updated>2026-06-10T04:00:00Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148468</id>
    <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-may-26-2026/148468" rel="alternate" type="text/html"/>
    <title>Firefox Profiler Deployment (May 26, 2026)</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The latest version of the <a href="https://profiler.firefox.com/" rel="noopener nofollow ugc">Firefox Profiler</a> is now live! Check out the full changelog below to see what’s changed:</p>
<p><strong>Highlights:</strong></p>
<ul>
<li>[Markus Stange] Use <code>@streamparser/json</code> if the input is too large to fit in a V8 string (<a href="https://github.com/firefox-devtools/profiler/pull/6016" rel="noopener nofollow ugc">#6016</a>)</li>
<li>[Nazım Can Altınova] Include <code>--search</code> option in <code>pq filter push</code> (<a href="https://github.com/firefox-devtools/profiler/pull/6026" rel="noopener nofollow ugc">#6026</a>)</li>
<li>[fatadel] Translate URL track-index state through profile sanitization (<a href="https://github.com/firefox-devtools/profiler/pull/6000" rel="noopener nofollow ugc">#6000</a>)</li>
<li>[Nazım Can Altınova] Print also the status output right after cli <code>load</code> command (<a href="https://github.com/firefox-devtools/profiler/pull/6019" rel="noopener nofollow ugc">#6019</a>)</li>
</ul>
<p><strong>Other Changes:</strong></p>
<ul>
<li>[fatadel] Remove unused dependencies from package.json (<a href="https://github.com/firefox-devtools/profiler/pull/6010" rel="noopener nofollow ugc">#6010</a>)</li>
<li>[Nazım Can Altınova] Make profiler-cli work in sandboxed environments (<a href="https://github.com/firefox-devtools/profiler/pull/6003" rel="noopener nofollow ugc">#6003</a>)</li>
<li>[Markus Stange] Make profiler-edit run profile compacting before writing out the file (<a href="https://github.com/firefox-devtools/profiler/pull/6015" rel="noopener nofollow ugc">#6015</a>)</li>
<li>[Markus Stange] Migrate from prettier to oxfmt (<a href="https://github.com/firefox-devtools/profiler/pull/5986" rel="noopener nofollow ugc">#5986</a>)</li>
<li>[Markus Stange] Add a --symbolicate-wasm arg to profiler-edit. (<a href="https://github.com/firefox-devtools/profiler/pull/6008" rel="noopener nofollow ugc">#6008</a>)</li>
<li>[Markus Stange] Build and upload the cli artifact in PRs (<a href="https://github.com/firefox-devtools/profiler/pull/6020" rel="noopener nofollow ugc">#6020</a>)</li>
<li>[Nicolas Chevobbe] Update devtools-reps to 0.27.7 (<a href="https://github.com/firefox-devtools/profiler/pull/6030" rel="noopener nofollow ugc">#6030</a>)</li>
<li>[Markus Stange/fatadel] Make withSize use a wrapper element so that it can stop calling findDOMNode (<a href="https://github.com/firefox-devtools/profiler/pull/5988" rel="noopener nofollow ugc">#5988</a>)</li>
<li>[Markus Stange] Fix dhat importer (<a href="https://github.com/firefox-devtools/profiler/pull/6036" rel="noopener nofollow ugc">#6036</a>)</li>
<li>[Nazım Can Altınova] Annotate inlined frames in CLI call trees and stacks (<a href="https://github.com/firefox-devtools/profiler/pull/6041" rel="noopener nofollow ugc">#6041</a>)</li>
<li>[Nazım Can Altınova] Use proper types in cli tests instead of custom inline types (<a href="https://github.com/firefox-devtools/profiler/pull/6038" rel="noopener nofollow ugc">#6038</a>)</li>
<li>[Nazım Can Altınova] Fix text truncation for frames named after Object.prototype methods (<a href="https://github.com/firefox-devtools/profiler/pull/6044" rel="noopener nofollow ugc">#6044</a>)</li>
<li>[Nazım Can Altınova] Add missing key props to CodeErrorOverlay error list items (<a href="https://github.com/firefox-devtools/profiler/pull/6047" rel="noopener nofollow ugc">#6047</a>)</li>
<li>[depfu[bot]] <img alt=":up_arrow:" class="emoji" height="20" src="https://emoji.discourse-cdn.com/twitter/up_arrow.png?v=15" title=":up_arrow:" width="20"/> Update oxfmt to version 0.51.0 (<a href="https://github.com/firefox-devtools/profiler/pull/6054" rel="noopener nofollow ugc">#6054</a>)</li>
<li>[Nazım Can Altınova] <img alt=":clockwise_vertical_arrows:" class="emoji" height="20" src="https://emoji.discourse-cdn.com/twitter/clockwise_vertical_arrows.png?v=15" title=":clockwise_vertical_arrows:" width="20"/> Sync: l10n → main (May 26, 2026) (<a href="https://github.com/firefox-devtools/profiler/pull/6058" rel="noopener nofollow ugc">#6058</a>)</li>
<li>[Nazım Can Altınova] Use URL-state symbol server for <code>profiler-cli function annotate</code> (<a href="https://github.com/firefox-devtools/profiler/pull/6051" rel="noopener nofollow ugc">#6051</a>)</li>
<li>[Nazım Can Altınova] Bump profiler-cli version to 0.2.0 (<a href="https://github.com/firefox-devtools/profiler/pull/6059" rel="noopener nofollow ugc">#6059</a>)</li>
</ul>
<p>Big thanks to our amazing localizers for making this release possible:</p>
<ul>
<li>fr: YD</li>
<li>sr: Марко Костић (Marko Kostić)</li>
<li>tr: Ali Demirtaş</li>
<li>zh-CN: Olvcpr423</li>
<li>zh-CN: wxie</li>
</ul>
<p>Find out more about the Firefox Profiler on <a href="https://profiler.firefox.com" rel="noopener nofollow ugc">profiler.firefox.com</a>! If you have any questions, join the discussion on our <a href="https://chat.mozilla.org/#/room/#profiler:mozilla.org" rel="noopener nofollow ugc">Matrix channel</a>!</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/firefox-profiler-deployment-may-26-2026/148468">Read full topic</a></p></div>
    </summary>
    <updated>2026-05-26T15:53:32Z</updated>
    <published>2026-05-26T15:53:32Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>canova</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-may-26-2026/148468.rss" title="Firefox Profiler Deployment (May 26, 2026)"/>
      <updated>2026-06-12T10:58:53Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>https://ahal.ca/blog/2026/integrate/</id>
    <link href="https://ahal.ca/blog/2026/integrate/" rel="alternate" type="text/html"/>
    <title>Your New Job is Integrating Code</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>You felt it. <em>The shift</em>. That your role has fundamentally changed thanks to
LLMs. It first entered your subconscious when you realized how easily you can
now crank out PRs. You felt it more concretely (and less enthusiastically), as
a reviewer when you opened your laptop one morning and noticed your review
queue was double what it normally is thanks to everyone else cranking out PRs.
And you feel this pervasive, general sense of <em>friction</em>.</p>
<p>It’s difficult to pinpoint exactly where this <em>friction</em> is coming from.
Depending on the repository size and CI setup, it will be slightly different
for everyone. It might involve longer review times or slipping review
standards. You might be noticing more merge conflicts and merge related CI
failures. Perhaps there are more failures sneaking through to <code>main</code> or CI is
taking longer to give you results. You almost certainly feel the <em>grind</em>.
People are on edge, tired; developers are pulling in opposite directions.</p>
<p>Here’s what LLMs shifted. The bottleneck is no longer producing code. The
bottleneck is <em>integrating</em> it. The friction we’re feeling is a result of more
PRs, more ideas, more reviews, more disagreements all made possible thanks
to LLMs. In short, the problem can best be summarized by Figure 1:</p>
<p><img alt="Animated clip of germs getting stuck in a door from The Simpsons" src="https://ahal.ca/static/img/blog/2026/bottleneck.gif" title="Bottleneck"/></p>
<p>But we’re living in a moment where many folks haven’t realized this yet, and
are still under the impression that their job is to produce code.</p>
<p>It’s not. Your new job is to integrate it.</p></div>
    </summary>
    <updated>2026-05-26T13:50:00Z</updated>
    <published>2026-05-26T13:50:00Z</published>
    <source>
      <id>https://ahal.ca/tags/mozilla/</id>
      <author>
        <name>Andrew Halberstadt</name>
      </author>
      <link href="https://ahal.ca/tags/mozilla/" rel="alternate" type="text/html"/>
      <link href="https://ahal.ca/tags/mozilla/index.xml" rel="self" type="application/rss+xml"/>
      <rights>© 2018 Andrew Halberstadt</rights>
      <subtitle>Recent content in Mozilla on Hunting the Shmoo</subtitle>
      <title>Mozilla on Hunting the Shmoo</title>
      <updated>2026-05-26T13:50:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/netpolicy/?p=2580</id>
    <link href="https://blog.mozilla.org/netpolicy/2026/05/26/growing-darkness-against-the-rise-of-internet-shutdowns/" rel="alternate" type="text/html"/>
    <title>Growing darkness: Against the rise of internet shutdowns</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Disruptions to internet connectivity can occur in countless ways – from weather incidents, natural disasters and accidents to intentional interferences like cyberattacks and government-issued blackouts. Yet while some disruptions are … <a class="go" href="https://blog.mozilla.org/netpolicy/2026/05/26/growing-darkness-against-the-rise-of-internet-shutdowns/">Read more</a></p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/05/26/growing-darkness-against-the-rise-of-internet-shutdowns/">Growing darkness: Against the rise of internet shutdowns</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Disruptions to internet connectivity can occur in countless ways – from weather incidents, natural disasters and accidents to intentional interferences like cyberattacks and government-issued blackouts. Yet while some disruptions are unavoidable, deliberate shutdowns represent a fundamentally different and deeply concerning trend. They undermine the open, global nature of the internet and put the safety, security, and fundamental rights of millions at risk.</p>
<p>For over 25 years, Mozilla has worked to ensure that the internet remains a global public resource—open, accessible, and safe for all. This vision, grounded in the Mozilla Manifesto, holds that the internet must remain a shared, decentralized infrastructure that empowers individuals, supports civic participation, and enables economic opportunity. Internet shutdowns run counter to these principles by restricting access, concentrating control, and weakening the very foundations of the open web.</p>
<p>To help organizations <a href="https://blog.mozilla.org/data/2021/11/08/detecting-internet-outages-with-mozilla-telemetry-data/">study and document outages</a>, Mozilla makes aggregated Firefox telemetry data <a href="https://blog.mozilla.org/data/2022/03/09/mozilla-opens-access-to-dataset-on-network-outages/">available</a> to help identify and understand connectivity disruptions. As 2026 progresses, this data continues to show significant outages affecting millions of people worldwide—many of them the result of deliberate restrictions.</p>
<p>As of late May, Iran’s internet blackout had been in place for over 80 days, making it the longest shutdown since the Arab Spring. Following an earlier shutdown amid nationwide protests in January 2026, Iranian authorities have restricted access to the internet since 28 February. This has meant that, for almost three months, millions of Iranians have been cut off from news, communication, work, education, and basic services. It also means that almost no independent information about the situation in Iran is leaving the country, making it almost impossible for humanitarian organizations to assess the situation on the ground. The shutdown has also had a massive impact on the Iranian economy, severely disrupting financial activity and blocking international transactions. Although Iran’s president has recently <a href="https://www.reuters.com/world/middle-east/irans-president-orders-reopening-international-internet-access-state-media-2026-05-25/">ordered</a> an end to the shutdown, it is unclear how and when Iranians will be able to reconnect to the web.</p>
<p>When large numbers of Firefox users experience connection failures for any reason, this produces an anomaly in the recorded telemetry data. At the country or city level, this can provide a corroborative signal of whether an outage or intentional shutdown occurred. Our telemetry documents the magnitude of the latest outage in Iran. The graph below documents the effect of the outage in multiple ways, such as users’ country location, language and timezone.</p>
<p><a href="https://blog.mozilla.org/netpolicy/files/2026/05/DesktopAndroidiOS-combined-DAU-10-Tehran_2.0-.png"><img alt="" class="alignnone wp-image-2581" height="407" src="https://blog.mozilla.org/netpolicy/files/2026/05/DesktopAndroidiOS-combined-DAU-10-Tehran_2.0--300x166.png" width="736"/></a></p>
<p>Across the globe, governments are increasingly interfering with and limiting access to connectivity. Both the number of states limiting connectivity and the amount of internet shutdowns has been growing steadily. In 2025 alone, 313 shutdowns across 52 countries have been <a href="https://www.accessnow.org/keepiton-data-dashboard/">documented</a>, a sad record. This is a stark indication that shutdowns and restrictions are no longer a rare emergency measure, but <a href="https://www.eff.org/deeplinks/2026/04/digital-hopes-real-power-rise-network-shutdowns">established levers of control</a>.</p>
<p>While the <a href="https://www.accessnow.org/campaign/keepiton/#global-tracker">triggers for shutdowns</a> are varied, access to the internet continues to be blocked especially often in times of conflict and political unrest. Especially in the context of hostilities, political tensions or public health emergencies, access to connectivity is a basic humanitarian need.</p>
<p>Beyond their immediate human impact, blackouts also affect the internet itself. Local networks depend on each other to form the global internet, and local restrictions affect the resilience and reliability of the web at large. When governments deliberately disrupt connectivity, they do not only isolate populations; they also contribute to the fragmentation of the global internet, undermining trust, interoperability, and the stability of shared infrastructure. Over time, this erosion risks replacing a single, open web with a patchwork of disconnected or controlled networks.</p>
<p>Governments should foster the health of the internet, not erode it. Access to the internet is <a href="https://www.article19.org/data/files/Internet_Statement_Adopted.pdf">widely recognized</a> as essential for enjoying human rights. It is an integral part of modern life, facilitating education, communication, collaboration, business and entertainment. Preserving the open web requires sustained commitment: resisting shutdowns, promoting transparency, and reinforcing the technical and governance frameworks that keep the internet global, interoperable, and accessible. The internet’s value—as a platform for opportunity, innovation, and human connection—depends on it remaining open to all.</p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/05/26/growing-darkness-against-the-rise-of-internet-shutdowns/">Growing darkness: Against the rise of internet shutdowns</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </content>
    <updated>2026-05-26T08:04:08Z</updated>
    <published>2026-05-26T08:04:08Z</published>
    <category term="Uncategorized"/>
    <author>
      <name>Svea Windwehr and Tasos Stampelos</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/netpolicy/</id>
      <link href="https://blog.mozilla.org/netpolicy/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/netpolicy/" rel="alternate" type="text/html"/>
      <subtitle>Mozilla's official blog on open Internet policy initiatives and developments</subtitle>
      <title>Open Policy &amp; Advocacy</title>
      <updated>2026-06-11T14:28:25Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://jonalmeida.com/til/auto-resolve-conflicts-with-an-agent/</id>
    <link href="https://jonalmeida.com/til/auto-resolve-conflicts-with-an-agent/" rel="alternate" type="text/html"/>
    <title xml:lang="en">Auto-resolve Jujutsu conflicts with your AI agent</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>With Jujutsu, I've been able to work in multiple workstreams more efficiently than before. This means that if I'm working on multiple things, there is a higher likelihood of something going stale while I wait for a review or touch multiple files.
Dealing with <a href="https://jonalmeida.com/til/android-studio-jj-conflicts/" rel="external">conflicts aren't so bad these days</a>, however if I can automate the easy ones, why not?</p>
<p>This is the prompt I've been using with my agent whenever I have a list of changes that have conflicts and don't need me to participate actively on it.</p>
<pre class="giallo"><code><span class="giallo-l"><span>Using the jj version control system, fix the conflicts that are in the changesets from `&lt;start_rev&gt;` to `&lt;end_rev&gt;`. Keep trying until there are no more "(conflict)" in the changesets between those two IDs.</span></span></code></pre></div>
    </content>
    <updated>2026-05-25T00:00:00Z</updated>
    <published>2026-05-25T00:00:00Z</published>
    <author>
      <name>Jonathan Almeida</name>
    </author>
    <source>
      <id>https://jonalmeida.com/tags/mozilla/atom.xml</id>
      <link href="https://jonalmeida.com/tags/mozilla/atom.xml" rel="self" type="application/atom+xml"/>
      <link href="https://jonalmeida.com" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en">Scribblings and nonsense</subtitle>
      <title xml:lang="en">Jonathan Almeida - mozilla</title>
      <updated>2026-05-25T00:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/05/25/cve-2026-5223/</id>
    <link href="https://blog.rust-lang.org/2026/05/25/cve-2026-5223/" rel="alternate" title="Security Advisory for Cargo (CVE-2026-5223)" type="text/html"/>
    <title xml:lang="en">Security Advisory for Cargo (CVE-2026-5223)</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>The Rust Security Response Team was notified that Cargo incorrectly handled
symlinks inside of crate tarballs downloaded from third-party registries,
allowing a malicious crate to override the source code of another crate from the
same registry.</p>
<p>This vulnerability is tracked as CVE-2026-5223. The severity of the
vulnerability is <strong>medium</strong> for users of third-party registries. Users of
crates.io are <strong>not affected</strong>, as crates.io forbids uploading crates containing
any symlink.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/25/cve-2026-5223/#overview"/>
Overview</h3>
<p>When building a crate, Cargo extracts its source code in a local cache (stored
within <code>~/.cargo</code>), reusing it for any future build. Cargo includes protections
to prevent any file from being extracted outside of the crate's own cache
directory.</p>
<p>It was discovered that it's possible to craft a malicious tarball able to
extract files one level below the crate's own cache directory. With the way the
cache is structured, that allowed the malicious crate to override the cache of
other crates belonging to the same registry.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/25/cve-2026-5223/#mitigations"/>
Mitigations</h3>
<p>Rust 1.96.0, to be released on May 28th, 2026, will update Cargo to reject
extracting <em>any</em> symlink within crate tarballs, regardless of whether they come
from crates.io (which already forbids them) or third-party registries. Note that
Cargo never added symlinks when running <code>cargo package</code> or <code>cargo publish</code>, so
the impact of this should be minimal.</p>
<p>Users who are not able to upgrade to the most recent Rust version are
recommended to audit the contents of their registry for the presence of any
symlink, and to configure their registry to reject symlink (if such option is
available).</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/25/cve-2026-5223/#affected-versions"/>
Affected versions</h3>
<p>All versions of Cargo shipped before Rust 1.96.0 are affected.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/25/cve-2026-5223/#acknowledgements"/>
Acknowledgements</h3>
<p>We'd like to thank Christos Papakonstantinou for reporting this to us according
to the <a href="https://rust-lang.org/policies/security" rel="external">Rust security policy</a>.</p>
<p>We also want to thank the members of the Rust project who helped us address the
vulnerability: Josh Triplett for developing the fix; Arlo Siemsen for reviewing
the fix; Emily Albini for writing this advisory; Emily Albini, Josh Stone and
Manish Goregaokar for coordinating the disclosure; Ed Page and Eric Huss for
advising during the disclosure.</p></div>
    </content>
    <updated>2026-05-25T00:00:00Z</updated>
    <published>2026-05-25T00:00:00Z</published>
    <author>
      <name>Rust Security Response Team</name>
    </author>
    <source>
      <id>https://blog.rust-lang.org/</id>
      <author>
        <name>Maintained by the Rust Teams.</name>
        <uri>https://github.com/rust-lang/blog.rust-lang.org/</uri>
      </author>
      <link href="https://blog.rust-lang.org/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://blog.rust-lang.org/" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en">Empowering everyone to build reliable and efficient software.</subtitle>
      <title xml:lang="en">Rust Blog</title>
      <updated>2026-06-11T14:20:46Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/05/25/cve-2026-5222/</id>
    <link href="https://blog.rust-lang.org/2026/05/25/cve-2026-5222/" rel="alternate" title="Security Advisory for Cargo (CVE-2026-5222)" type="text/html"/>
    <title xml:lang="en">Security Advisory for Cargo (CVE-2026-5222)</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>The Rust Security Response Team was notified that Cargo incorrectly normalized
the URLs of third-party registries using the <a href="https://doc.rust-lang.org/cargo/reference/registries.html#registry-protocols" rel="external">sparse index protocol</a>. If a
hosting provider allowed multiple registries to be hosted with arbitrary names
within the same domain, an attacker able to publish crates in a registry could
obtain the credentials of others users of the same registry.</p>
<p>This vulnerability is tracked as CVE-2026-5222. The severity of the
vulnerability is <strong>low</strong>, due to the extremely niche requirements needed to
achieve the attack.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/25/cve-2026-5222/#overview"/>
Overview</h3>
<p>Originally Cargo only supported storing a registry's index within git
repositories. Most git hosting solutions allow accessing a git repository with
or without the <code>.git</code> suffix, so Cargo mirrored this behavior when normalizing
registry URLs. This allowed credentials for <code>https://example.com/index</code> to be
used for <code>https://example.com/index.git</code>.</p>
<p>This normalization was unintentionally applied to the new sparse indexes too.
Sparse indexes can be hosted on any HTTPS server, which treat URLs ending with
<code>.git</code> as different URLs than those without the suffix.</p>
<p>If the following conditions apply:</p>
<ul>
<li><code>https://example.com/index</code> is a sparse index.</li>
<li><code>https://example.com/index</code> allows crates to depend on crates from any other
registry.</li>
<li>The attacker is able to publish crates on <code>https://example.com/index</code>.</li>
<li>The attacker is able to upload arbitrary files to
<code>https://example.com/index.git</code>.</li>
</ul>
<p>...the attacker could configure <code>https://example.com/index.git</code> to be a Cargo
sparse registry requiring authentication for downloads, and with a download URL
pointing to a server recording any credentials set to it.</p>
<p>When the attacker then publishes a crate <code>foo</code> to <code>https://example.com/index</code>
depending on a crate <code>bar</code> from <code>https://example.com/index.git</code>, and tricks the
victim into downloading <code>foo</code>,  Cargo will think the two registries share the
same credential and send the victim's Cargo token to the malicious registry.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/25/cve-2026-5222/#mitigations"/>
Mitigations</h3>
<p>Rust 1.96, to be released on May 28th, 2026, will update Cargo to only strip the
<code>.git</code> suffix from registry URLs using the git protocol. No mitigations are
available for users of older versions of Cargo.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/25/cve-2026-5222/#affected-versions"/>
Affected versions</h3>
<p>All versions of Cargo shipped between Rust 1.68 (the stabilization of sparse
registries) and 1.96 are affected.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/25/cve-2026-5222/#acknowledgements"/>
Acknowledgements</h3>
<p>We'd like to thank Christos Papakonstantinou for reporting this to us according
to the <a href="https://rust-lang.org/policies/security" rel="external">Rust security policy</a>.</p>
<p>We also want to thank the members of the Rust project who helped us address the
vulnerability: Arlo Siemens for developing the fix; Weihang Lo, Eric Huss and
Emily Albini for reviewing the fix; Emily Albini for writing this advisory;
Emily Albini, Josh Stone and Manish Goregaokar for coordinating the disclosure.</p></div>
    </content>
    <updated>2026-05-25T00:00:00Z</updated>
    <published>2026-05-25T00:00:00Z</published>
    <author>
      <name>Rust Security Response Team</name>
    </author>
    <source>
      <id>https://blog.rust-lang.org/</id>
      <author>
        <name>Maintained by the Rust Teams.</name>
        <uri>https://github.com/rust-lang/blog.rust-lang.org/</uri>
      </author>
      <link href="https://blog.rust-lang.org/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://blog.rust-lang.org/" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en">Empowering everyone to build reliable and efficient software.</subtitle>
      <title xml:lang="en">Rust Blog</title>
      <updated>2026-06-11T14:20:46Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:wlRaTHhctrA</id>
    <link href="https://www.youtube.com/watch?v=wlRaTHhctrA" rel="alternate" type="text/html"/>
    <title>Data Club: Jeff Silverman - Data Science &amp; Astronomy: AAS 243 &amp; ATDS 6</title>
    <updated>2026-05-24T03:48:57Z</updated>
    <published>2024-02-05T15:18:38Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:aGjrXhXNRq8</id>
    <link href="https://www.youtube.com/watch?v=aGjrXhXNRq8" rel="alternate" type="text/html"/>
    <title>Introducing Glean Annotations</title>
    <summary>Leif Oines and Will Lachance introduce Glean Annotations: a process and technology for curating and communicating knowledge about the data we collect in Mozilla's products.</summary>
    <updated>2026-05-24T02:56:33Z</updated>
    <published>2021-04-19T18:05:52Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:BZVugz_yzzg</id>
    <link href="https://www.youtube.com/watch?v=BZVugz_yzzg" rel="alternate" type="text/html"/>
    <title>Monitoring Sensitive Data: How do we monitor data we don't store?</title>
    <summary>We try to be responsible with data. For example, we:

- store as little sensitive data as possible
- monitor changes in incoming data on which we've built models

But what happens when those two approaches conflict?

How do we monitor changes in incoming data that we don't want to store?

This talk explains the schema we use to monitor changes in what people are searching for in Firefox...even when we deliberately don't store some of what people are searching for.</summary>
    <updated>2026-05-21T18:30:49Z</updated>
    <published>2022-09-12T16:28:17Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=85966</id>
    <link href="https://blog.mozilla.org/en/firefox/firefox-web-serial-adafruit/" rel="alternate" type="text/html"/>
    <title>Mozilla and Adafruit bring Web Serial workflows to Firefox</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Launching Web Serial in Firefox 151 The web is built by communities, but not all communities use the web the same way.  That philosophy shaped part of this week’s Firefox 151 release, which introduced support for the Web Serial API on desktop. Most folks won’t use this API, but for our community of builders and […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-web-serial-adafruit/">Mozilla and Adafruit bring Web Serial workflows to Firefox</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><figure class="wp-block-image aligncenter size-large"><img alt="Firefox and Adafruit graphic showing the Firefox mascot building hardware with colorful shapes. Text: Build it all from Firefox  Adafruit recommends Firefox to connect, code, and control hardware directly from your browser." class="wp-image-86026" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/Distilled_Adafruit_Text-1024x576.jpg" width="1024"/></figure>



<h3>Launching Web Serial in Firefox 151</h3>



<p>The web is built by communities, but not all communities use the web the same way. </p>



<p>That philosophy shaped part of this week’s <a href="https://hacks.mozilla.org/2026/05/web-serial-support-in-firefox/" rel="noreferrer noopener" target="_blank">Firefox 151 release</a>, which introduced support for the <a href="https://hacks.mozilla.org/2026/05/web-serial-support-in-firefox/">Web Serial API on desktop</a>. Most folks won’t use this API, but for our community of builders and tinkerers, it unlocks the ability to use Firefox to communicate directly with compatible hardware devices like microcontrollers, development boards, and other serial-connected devices.</p>



<p>For developers, makers, educators, hardware enthusiasts, and embedded-device communities, browser-based hardware workflows have increasingly become part of the modern web experience. With Firefox’s browser engine, Gecko, now supporting Web Serial, users can now connect, code, configure, and control compatible hardware directly from the browser in many workflows, often without additional software or complicated setup. </p>



<p>If you want to dive deeper into the technical details behind Web Serial support in Firefox 151, you can read our <a href="https://hacks.mozilla.org/2026/05/web-serial-support-in-firefox/" rel="noreferrer noopener" target="_blank">full engineering post here</a>.</p>



<h3>Adafruit collaboration</h3>



<p>As part of this week’s launch, <a href="https://www.adafruit.com/" rel="noreferrer noopener" target="_blank">Adafruit</a>, one of the internet’s most beloved open-source hardware communities, is collaborating with us to test and validate what browser-based hardware development can look like in Firefox with Web Serial support.</p>



<p>If you’ve ever spent time with CircuitPython, browser-based board programming, custom controllers, sensors, classroom kits, STEM homework assignments, or a desk covered in blinking microcontrollers—you probably already know <a href="https://www.adafruit.com/">Adafruit</a>.</p>



<p>With Web Serial support in Firefox 151, Adafruit’s browser-based hardware workflows now work directly in Firefox as well, with no additional software or complicated setup required for many projects. <a href="https://adafruit.github.io/Adafruit_WebSerial_ESPTool/" rel="noreferrer noopener" target="_blank">We invite you to give it a try</a>. </p>



<p>Different communities care about different browser experiences. Some people want simplicity, familiarity and productivity. Others want flexibility, customization, and tools that support the way <em>they</em> work, build, experiment, and create. We want the web to be open, flexible, and shaped by the diversity of people building on it. </p>



<p>If you’re wiring up your first board, experimenting with hardware projects, or dusting off an old electronics kit, give Adafruit and Web Serial in Firefox a try. </p>



<p>Build something amazing. Make something useful. Tell us what works. Tell us what breaks. Most of all, make it your own.</p>



<a class="ft-c-inline-cta" href="https://www.mozilla.org/firefox/new/?utm_source=blog.mozilla.org&amp;utm_medium=referral&amp;utm_campaign=blog-nav">
  <div class="ft-c-inline-cta__media">
  <img alt="The Firefox logo" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/03/Firefox_Logo_Symbol_Fullcolor_RGB-800x800.png" width="800"/>  </div>
  <div class="ft-c-inline-cta__content">
     <h4>Take control of your internet</h4>      <span>Download Firefox</span>   </div>
</a>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-web-serial-adafruit/">Mozilla and Adafruit bring Web Serial workflows to Firefox</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-05-21T18:00:38Z</updated>
    <published>2026-05-21T18:00:38Z</published>
    <category term="Firefox"/>
    <author>
      <name>Brian Bingham</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/en/</id>
      <link href="https://blog.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/en/" rel="alternate" type="text/html"/>
      <subtitle>News and Updates about Mozilla</subtitle>
      <title>The Mozilla Blog</title>
      <updated>2026-06-10T17:43:34Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://hacks.mozilla.org/?p=48329</id>
    <link href="https://hacks.mozilla.org/2026/05/web-serial-support-in-firefox/" rel="alternate" type="text/html"/>
    <link href="https://hacks.mozilla.org/wp-content/uploads/2026/05/outnew.mp4" length="265254" rel="enclosure" type="video/mp4"/>
    <title>Announcing Web Serial Support in Firefox</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Support for Web Serial in Firefox 151 for Desktop Firefox can now connect directly to microcontrollers, development boards, 3D printers, power meters, and other serial-connected hardware from the web. Starting in Firefox 151 for Desktop, support for the Web Serial API allows web applications to communicate with compatible devices without requiring native software. Web Serial […]</p>
<p>The post <a href="https://hacks.mozilla.org/2026/05/web-serial-support-in-firefox/">Announcing Web Serial Support in Firefox</a> appeared first on <a href="https://hacks.mozilla.org">Mozilla Hacks - the Web developer blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><h3>Support for Web Serial in Firefox 151 for Desktop</h3>
<p>Firefox can now connect directly to microcontrollers, development boards, 3D printers, power meters, and other serial-connected hardware from the web. Starting in Firefox 151 for Desktop, support for the Web Serial API allows web applications to communicate with compatible devices without requiring native software.</p>
<p>Web Serial compatible devices are popular among hobbyists, hardware hackers, educators, makers, and developers with use cases ranging from home automation to hardware prototyping and 3D printing. Web Serial support makes Firefox more useful for these kinds of projects.</p>
<div style="display: flex; margin: 1.5em 0;">
<p style="width: 100%; margin: 0;">One of the organizations that has demonstrated the value of Web Serial is <a href="https://www.adafruit.com/">Adafruit</a>, a leader in open-source hardware and <a href="https://en.wikipedia.org/wiki/Science,_technology,_engineering,_and_mathematics">STEM</a> education. They’ve made it quick and easy to install <a href="https://circuitpython.org/">CircuitPython</a> on their devices by delivering firmware over Web Serial. Then it’s straightforward to run Python programs on the device. Name your file <code>code.py</code> and, for most devices, the code can be installed by dragging-and-dropping the file onto the USB device. Your Python programs can interoperate with a web page over Web Serial using simple text-based I/O.</p>
<div style="font-size: 0.75em; color: #555; line-height: 1.4; margin: 0;">To install CircuitPython firmware with Firefox, we recommend using the <a href="https://adafruit.github.io/Adafruit_WebSerial_ESPTool/">Adafruit Web Serial Tool</a> and not the <code>OPEN INSTALLER</code> method on the CircuitPython site.</div>
</div>
<p><a href="https://github.com/hafta/circuitpython-webserial-example/tree/main">Here’s an example</a> using an Adafruit ESP32-S2 based board where messages sent from web code can be directly displayed on the device over Web Serial.</p>
<div style="display: flex; margin: 1.5em 0;">
<p><video controls="controls" height="150" style="display: block; width: 100%; height: auto; margin: 0;" width="300"><source src="https://hacks.mozilla.org/wp-content/uploads/2026/05/outnew.mp4" type="video/mp4"/></video></p>
<div style="font-size: 0.75em; color: #555; line-height: 1.4; margin: 0;">A video showing an <a href="https://github.com/hafta/circuitpython-webserial-example/">example CircuitPython Web Serial project</a> where a message is sent from a local <a href="https://github.com/hafta/circuitpython-webserial-example/blob/main/webserial.html">web page</a> using Web Serial to a device running a CircuitPython <a href="https://github.com/hafta/circuitpython-webserial-example/blob/main/code.py"><code>code.py</code></a> file.</div>
</div>
<p>We’ve collaborated with Adafruit to test Firefox’s implementation against real hardware workflows commonly used by this community. The result: Firefox is a more practical browser for programming and interacting with hardware directly using web technology.</p>
<p>As an example of how you can combine Web Serial with electronics, Mozilla engineer Alex Franchuk created an amazingly fun and functional device that melds electronics and web editing. Check out the <a href="https://adafruit-playground.com/u/afranchuk/pages/page-playground-using-webserial-in-firefox">Page Playground</a>.</p>
<p>The list of serial compatible devices includes Espressif ESP-based boards such as the popular ESP32 chips, Raspberry Pi Picos, 3D printers, LEGO devices, and many more. There are many tools for running your own code on these small affordable microcontroller boards, and with Web Serial it’s easier than ever to connect them to a computer and interact through a web-based user interface.</p>
<h3>What is Web Serial?</h3>
<p>Web Serial is a web API that allows a website to read and write to serial devices using JavaScript. See the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API">MDN documentation</a> for the details. While modern computers don’t typically include serial ports, serial devices connected to a USB port or paired via Bluetooth can advertise themselves as serial-capable devices so they appear as serial ports in the operating system.</p>
<p>The Web Serial API lets developers use the web platform to communicate with these devices. For example, websites can control devices or deliver firmware without requiring native applications or installers.</p>
<p>Mozilla’s own Florian Quèze, <a href="https://www.youtube.com/watch?v=Ly7ve5ftRnU">who has experimented with many projects to measure power consumption</a>, <a href="https://serial.combien-consomme.fr/">demonstrated</a> how Web Serial could be used to read power data from an off-the-shelf USB power meter and display it in Firefox. Florian’s code can also export the data into the Firefox Profiler, making it easy to visualize and share power data. Here’s the <a href="https://serial.combien-consomme.fr/">page</a> and <a href="https://github.com/fqueze/webserial-power-profiling">GitHub repo</a>. The screenshots below show the page in action and the <a href="https://share.firefox.dev/4uGxHsg">data in the Firefox Profiler</a> after recording the power usage of a light with three brightness modes.</p>
<div style="display: flex; margin: 1.5em 0;">
<p><img alt="A screenshot of Florian&#x2019;s site showing a power recording of a light with three brightness modes." class="wp-image-48331 size-full" src="https://hacks.mozilla.org/wp-content/uploads/2026/05/firefox_power_graph_full.jpg" style="display: block; width: 100%; height: auto; margin: 0;" width="600"/></p>
<div style="font-size: 0.75em; color: #555; line-height: 1.4; margin: 0;">A screenshot of Florian’s site showing a power recording of a light with three brightness modes.The power meter used in the pictured power tests was the <a href="https://store.avhzy.com/index.php?route=product/product&amp;product_id=53">AVHzY C3 USB</a>. The <a href="https://joy-it.net/en/products/JT-TC66C">Joy-IT TC66C</a> and YZXStudio USB ZY1280 were also successfully tested.</div>
</div>
<div style="display: flex; margin: 1.5em 0;">
<p><img alt="A screenshot of the Firefox Profiler displaying the imported power recording from Florian&#x2019;s site." class="wp-image-48334 size-full" src="https://hacks.mozilla.org/wp-content/uploads/2026/05/shizuku_profiler.jpg" style="display: block; width: 100%; height: auto; margin: 0;" width="600"/></p>
<div style="font-size: 0.75em; color: #555; line-height: 1.4; margin: 0;">A screenshot of the Firefox Profiler displaying the imported power recording from Florian’s site.</div>
</div>
<p><a href="https://www.home-assistant.io/">Home Assistant</a> is another example. It’s a popular (and growing) open source project for home automation. The <a href="https://esphome.io/">ESPHome</a> project offers Home Assistant-compatible firmware for affordable ESP32 and similar devices which can be installed and configured over Web Serial in just a few clicks.</p>
<h3>Security and Privacy</h3>
<p>There are clear security and privacy concerns with allowing the web platform to read and write to hardware devices. Most importantly, with Web Serial, websites do not have visibility or access to serial ports until the user explicitly allows it.</p>
<p>Ports are allowed on a per-site and per-port basis. The Web Serial API requires websites to call <code>navigator.serial.requestPort()</code>, which lets the user choose which port to allow access to, or disallow all access entirely. This means websites do not receive a list of connected devices and there is no useful fingerprinting information outside of the port the user selects.</p>
<div style="display: flex; margin: 1.5em 0;">
<p><img alt="A screenshot of the Web Serial port selection prompt in Firefox." class="wp-image-48330 size-full" src="https://hacks.mozilla.org/wp-content/uploads/2026/05/port_selector-e1778807369203.png" style="display: block; width: 100%; height: auto; margin: 0;" width="600"/></p>
<div style="font-size: 0.75em; color: #555; line-height: 1.4; margin: 0;">A screenshot of the Web Serial port selection prompt in Firefox.</div>
</div>
<p>To help users understand when and why a site requests access to a serial port, Firefox uses add-on gating which we introduced with our <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_MIDI_API">Web MIDI API</a> implementation. Compared to other web permission prompts, this gives the user a more detailed explanation of what they’re allowing. The add-on gating prompts appear before the port selection prompt the first time a site requests port access.</p>
<p>For organizations using Firefox Enterprise Policies, Web Serial is disabled by default. Administrators can explicitly allow or disallow Web Serial functionality across their organization using the <a href="https://firefox-admin-docs.mozilla.org/reference/policies/defaultserialguardsetting/"><code>DefaultSerialGuardSetting</code></a> policy setting.</p>
<h3>Standardization</h3>
<p>While Web Serial still resides in the Web Incubator Community Group (WICG), we’re optimistic there’s a path to standardization given its scope and long-running incubation. We are pursuing standardizing the Web Serial API in the WHATWG in a <a href="https://github.com/whatwg/sg/pull/264">new Workstream proposal</a> and are excited to work with ecosystem partners and standards bodies to help shape access to peripherals on the web.</p>
<h3>Feedback</h3>
<p>If you already have a Web Serial workflow with a device you can test on, give Firefox a try. We’d love to hear what you’re building and which workflows matter most to you. <a href="https://connect.mozilla.org/">Mozilla Connect</a> is a great place to share projects, ask questions, and give feedback.</p>
<p>For technical issues, browse to <a href="http://support.mozilla.org">support.mozilla.org</a> or file a bug <a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Core&amp;component=DOM%3A+Device+Interfaces">here</a>.</p>
<p>The post <a href="https://hacks.mozilla.org/2026/05/web-serial-support-in-firefox/">Announcing Web Serial Support in Firefox</a> appeared first on <a href="https://hacks.mozilla.org">Mozilla Hacks - the Web developer blog</a>.</p></div>
    </content>
    <updated>2026-05-21T18:00:05Z</updated>
    <published>2026-05-21T18:00:05Z</published>
    <category term="Device APIs"/>
    <category term="Firefox"/>
    <category term="Web APIs"/>
    <category term="hardware"/>
    <author>
      <name>Haik Aftandilian</name>
    </author>
    <source>
      <id>https://hacks.mozilla.org/</id>
      <link href="https://hacks.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://hacks.mozilla.org/" rel="alternate" type="text/html"/>
      <subtitle>hacks.mozilla.org</subtitle>
      <title>Mozilla Hacks – the Web developer blog</title>
      <updated>2026-05-21T18:30:22Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=85786</id>
    <link href="https://blog.mozilla.org/en/firefox/new-firefox-design/" rel="alternate" type="text/html"/>
    <link href="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_themes.mp4" length="7145697" rel="enclosure" type="video/mp4"/>
    <title>Designing Firefox for the future</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Crafted with care. Built for speed. Ready for what’s next. A great browser is so intuitive that you often forget you’re using it. Yet today the internet is changing faster than ever, and your browser needs to keep up. Firefox is still the only browser built for people, not platforms: independent, customizable, private and firmly […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/new-firefox-design/">Designing Firefox for the future</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><figure class="wp-block-image size-large"><a href="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_header_generic.png" rel="noreferrer noopener" target="_blank"><img alt="irefox browser windows showing Greece travel tabs and hotel booking pages" class="wp-image-85799" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_header_generic-1024x576.png" width="1024"/></a></figure>



<p><em>Crafted with care. Built for speed. Ready for what’s next.</em></p>



<p>A great browser is so intuitive that you often forget you’re using it. Yet today the internet is changing faster than ever, and your browser needs to keep up. Firefox is still the only browser built for people, not platforms: independent, customizable, private and firmly in users’ control. </p>



<p>Keeping Firefox the best browser for being online <em>today</em> is what motivated our recent work to update Firefox’s design and design system. We’re aiming to deliver a more cohesive foundation for Firefox: making the browser feel cleaner, warmer, faster and more adaptable.</p>



<p>Internally, we’ve been calling this work Project Nova. The name fits: A nova can look like a new star, yet it comes from existing matter — a renewal, not a replacement. When it rolls out later this year, you can just call it Firefox. Here’s what it’s all about:</p>



<h3><strong>Privacy at the center</strong></h3>



<p>A good default matters. When you choose Firefox, privacy and clear data practices are there from the start. Our new design pulls privacy features forward, making it easier to find and use tools like our <a href="https://blog.mozilla.org/firefox/built-in-vpn/" rel="noreferrer noopener" target="_blank">free, built-in VPN</a> and private browsing.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_privacy_settings@2x.png" rel="noreferrer noopener" target="_blank"><img alt="Firefox privacy and security settings showing Enhanced Tracking Protection and VPN options" class="wp-image-85810" height="975" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_privacy_settings@2x-1024x975.png" style="width: 650px;" width="1024"/></a></figure></div>


<p>We’re also redesigning Settings so choices about your data are easier to understand and act on. That includes controls for turning off AI features entirely, plainer language throughout, as well as tuning <a href="https://www.firefox.com/user-privacy/#tracking-protection" rel="noreferrer noopener" target="_blank">Enhanced Tracking Protection</a> to match your preferred balance of protection and usability.</p>



<h3><strong>Speed you can feel</strong></h3>



<p>Privacy and speed aren’t trade-offs. When Firefox blocks trackers, pages load faster, too. We also prioritize the most important parts of a page before the optional stuff around the edges. In the last year, we’ve improved load times for key page content by 9%.</p>



<p>The new design can speed up your workflows, too. It’s easier to access <a href="https://blog.mozilla.org/firefox/firefox-tab-groups/">tab groups</a>, <a href="http://blog.mozilla.org/firefox/split-view/">split view</a>, and <a href="https://blog.mozilla.org/firefox/vertical-tabs-and-the-firefox-community/">vertical tabs</a> – putting these productivity features at your fingertips, but not in your face. </p>



<p>And we’re bringing back <strong>compact mode. </strong>People told us that they missed it, and we listened. If you want your browser controls as condensed as possible, this one’s for you. </p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_compact@2x.png" rel="noreferrer noopener" target="_blank"><img alt="Firefox browser new tab with purple starry theme and VPN enabled" class="wp-image-85821" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_compact@2x-1024x576.png" style="width: 650px; height: auto;" width="1024"/></a></figure></div>


<h3><strong>Balancing the new and familiar</strong></h3>



<p>When it came to design, we wanted Firefox to feel current, but not generic. Warm, but still precise. More expressive, but never louder than the web itself. You’ll see the change first in the fundamentals: </p>



<ul>
<li>Tabs have a softer shape, with a subtle gradient that gives the active tab more presence and creates a sense of light around the browser chrome. </li>



<li>Components are more rounded and consistent, so panels, menus, settings and browser controls feel like part of the same system. </li>



<li>Icons have been updated to feel cleaner and more balanced across light and dark themes, supporting quick recognition without adding visual noise.</li>



<li>Spacing is rebalanced across the interface with the knowledge that every pixel matters when the browser is where you spend your day. </li>



<li>The refreshed color palette is inspired by the feeling of fire: the glow around your active tab, deep smoky purples and lighter tones that add warmth.</li>
</ul>



<p>The voice is warming up, too. Firefox copy is becoming more direct, more human, and sometimes more playful or fiery. Always genuine… because that’s what sets Firefox apart.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_tabs_icons.png" rel="noreferrer noopener" target="_blank"><img alt="Firefox design system showing browser tab styles, icons and purple color palette" class="wp-image-85843" height="566" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_tabs_icons-1024x566.png" style="width: 650px;" width="1024"/></a></figure></div>


<p>The effect is distinctly Firefox: approachable and energetic, while still easy to scan. Under the hood, reusable tokens, components, patterns, and a shared design language make Firefox easier to evolve over time, so new features feel integrated instead of bolted on.</p>



<p>The redesign is most visible on desktop, but the work extends to mobile, too. Shared colors, icons, copy and design foundations help Firefox feel more consistent across devices.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_mobile_generic@2x.png" rel="noreferrer noopener" target="_blank"><img alt="Firefox mobile tab overview in light and dark mode on two phones with travel and Mozilla tabs" class="wp-image-85876" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_mobile_generic@2x-1024x576.png" style="width: 650px;" width="1024"/></a></figure></div>


<h3><strong>Yours to shape</strong></h3>



<p>Firefox has long been the most customizable browser. It’s in our open source DNA. Now we’re adding more ways to make Firefox feel like yours, including new themes and wallpapers. And we’re exploring more customization over time, like controls for the shape of the interface — tabs, components, and related visual treatments. </p>



<figure class="wp-block-video aligncenter"><video controls="controls" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/distilled_nova_themes.mp4"/></figure>



<p><a href="https://blog.mozilla.org/firefox/accessibility-extensions/">Accessibility</a> is a key part of customization. Firefox is being designed with attention to contrast, readability, focus states, keyboard behavior, target sizes, system settings, visual comfort, and how the interface works across themes and windows.</p>



<p>Dark mode, for example, is not just a preference for many people. It is their default environment. For some, it helps reduce eye strain. For others, it is part of a broader system setup. </p>



<h3><strong>Building in public</strong></h3>



<p>Firefox has always been built in the open, and with the help of a global community of contributors and supporters. You help us build the browser, test, extend and improve it. You tell us when something doesn’t feel right. That relationship is part of what makes Firefox different.</p>



<p>While the new design system for Firefox is still being shaped, keep telling us what feels right, and what gets in your way. We’re <a href="https://connect.mozilla.org/t5/discussions/sharing-more-about-project-nova/td-p/125996" rel="noreferrer noopener" target="_blank">listening</a>.</p>



<a class="ft-c-inline-cta" href="https://www.mozilla.org/firefox/new/?utm_source=blog.mozilla.org&amp;utm_medium=referral&amp;utm_campaign=blog-nav">
  <div class="ft-c-inline-cta__media">
  <img alt="The Firefox logo" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/03/Firefox_Logo_Symbol_Fullcolor_RGB-800x800.png" width="800"/>  </div>
  <div class="ft-c-inline-cta__content">
     <h4>Take control of your internet</h4>      <span>Download Firefox</span>   </div>
</a>
<p>The post <a href="https://blog.mozilla.org/en/firefox/new-firefox-design/">Designing Firefox for the future</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-05-21T12:55:53Z</updated>
    <published>2026-05-21T12:55:53Z</published>
    <category term="Firefox"/>
    <category term="homepage"/>
    <author>
      <name>Firefox UX Team</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/en/</id>
      <link href="https://blog.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/en/" rel="alternate" type="text/html"/>
      <subtitle>News and Updates about Mozilla</subtitle>
      <title>The Mozilla Blog</title>
      <updated>2026-06-10T17:43:34Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:y7msgjoLjNk</id>
    <link href="https://www.youtube.com/watch?v=y7msgjoLjNk" rel="alternate" type="text/html"/>
    <title>Mozillians sharing the 2021 SciPy Conference experience</title>
    <summary>The 2021 SciPy conference (https://www.scipy2021.scipy.org/) involved the showcasing of the latest open source Python projects for advancement in scientific computing. Mozilla was a diversity sponsor and a few Mozillians attended and shared their experience of the event.</summary>
    <updated>2026-05-20T21:10:21Z</updated>
    <published>2021-09-21T19:58:42Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://spidermonkey.dev/blog/2026/05/20/saying-goodbye-to-asmjs</id>
    <link href="https://spidermonkey.dev/blog/2026/05/20/saying-goodbye-to-asmjs.html" rel="alternate" title="Saying goodbye to asm.js" type="text/html"/>
    <title>Saying goodbye to asm.js</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><blockquote>
  <p>Axe-time, sword-time, shields are sundered,<br/>
Wind-time, wolf-time, ere the world falls.<br/>
– <a href="https://sacred-texts.com/neu/poe/poe03.htm"><em>Völuspá</em>, Poetic Edda</a></p>
</blockquote>

<p>As of <a href="https://www.firefox.com/en-US/firefox/148.0/releasenotes/">Firefox 148</a>, SpiderMonkey’s <a href="http://asmjs.org/">asm.js</a> optimizations are disabled by default, and we plan to remove the code entirely in a future release.</p>

<p>If you maintain a site that uses asm.js, nothing will break. asm.js is just a subset of plain JavaScript, so the code keeps running through our regular JIT just like any other script. That said, recompiling to WebAssembly will get you faster execution and smaller binaries.</p>

<h3>History</h3>

<p><a href="http://asmjs.org/">asm.js</a> was Mozilla’s response to the question posed by <a href="https://en.wikipedia.org/wiki/Google_Native_Client">NaCl and PNaCl</a>: how can the web run code at native speeds?</p>

<p>The idea was clever: pick a strict, statically-typed subset of JavaScript that an engine could recognize on the fly and compile down to native code. We could get performance similar to NaCl/PNaCl and still have code live inside web content and use web API’s (no separate sandbox, IPC, or <a href="https://en.wikipedia.org/wiki/NPAPI#PPAPI">alternative API’s</a>).</p>

<p>asm.js shipped in <a href="https://blog.mozilla.org/mbest/2013/06/25/asm-js-its-really-fast-backwards-compatible-and-now-in-the-release-version-of-firefox/">Firefox 22</a> back in 2013 and was a success. It let projects like Unity and Unreal ship C/C++ codebases to the web for the first time, using just standard web technologies. The <a href="https://blog.mozilla.org/futurereleases/2013/05/02/epic-citadel-demo-shows-the-power-of-the-web-as-a-platform-for-gaming/">Epic Citadel demo</a> was ported to the web in just four days. It was a landmark achievement, and a fond memory for the original asm.js team.</p>



<p>asm.js proved that we could run code at near-native speed on the web using just web technologies. This opened the door to <a href="https://webassembly.org/">WebAssembly</a>, which shipped several years later in <a href="https://www.firefox.com/en-US/firefox/52.0/releasenotes/">Firefox 52</a>. Without asm.js, <a href="https://robert.ocallahan.org/2017/06/webassembly-mozilla-won.html">we likely wouldn’t have WebAssembly</a>.</p>

<h3>Why now?</h3>

<p>So why turn it off? WebAssembly has succeeded, and asm.js usage has mostly migrated over. Keeping the asm.js path alongside WebAssembly costs us maintenance time and gives us extra attack surface in the VM.</p>

<p>If you are shipping asm.js content, please consider recompiling to WebAssembly! Our WebAssembly pipeline is significantly more advanced than the asm.js one ever was. You should see faster execution and smaller binaries.</p>

<h3>Ragnarök</h3>

<div style="display: flex;">
  <img alt="OdinMonkey, by John Howard" src="https://spidermonkey.dev/assets/img/odin.jpg"/>
  <img alt="BaldrMonkey" src="https://spidermonkey.dev/assets/img/baldr.jpg"/>
</div>

<p>The asm.js compiler is called OdinMonkey. As was foretold long ago, OdinMonkey must meet his fated doom. The bug <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=ragnarok">Ragnarök</a> tracks the “Twilight of OdinMonkey”.</p>

<p>All is not lost however, for born of OdinMonkey is BaldrMonkey, our WebAssembly optimizing compiler. OdinMonkey may be swallowed whole by the wolf, Fenrir, but BaldrMonkey will rule over the reborn world alongside RabaldrMonkey (<a href="https://en.wiktionary.org/wiki/rabalder">“commotion”</a>), our WebAssembly baseline compiler.</p>

<p>On this Odin’s day (Wednesday) we thank OdinMonkey for thirteen years of service. Skål!</p>

<blockquote>
  <p>Then fields unsowed bear ripened fruit,<br/>
all ills grow better, and Baldr comes back;<br/>
Baldr and Hoth dwell in Hropt’s battle-hall.
– <a href="https://sacred-texts.com/neu/poe/poe03.htm"><em>Völuspá</em>, Poetic Edda</a></p>
</blockquote></div>
    </content>
    <updated>2026-05-20T17:00:00Z</updated>
    <published>2026-05-20T17:00:00Z</published>
    <author>
      <name>Ryan Hunt</name>
    </author>
    <source>
      <id>https://spidermonkey.dev/feed.xml</id>
      <link href="https://spidermonkey.dev/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://spidermonkey.dev/" rel="alternate" type="text/html"/>
      <subtitle>SpiderMonkey is Mozilla's JavaScript and WebAssembly Engine, used in Firefox, Servo and various other projects. It is written in C++ and Rust.</subtitle>
      <title>SpiderMonkey JavaScript/WebAssembly Engine</title>
      <updated>2026-05-20T11:56:51Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.nightly.mozilla.org/?p=2064</id>
    <link href="https://blog.nightly.mozilla.org/2026/05/20/settings-are-getting-a-new-look/" rel="alternate" type="text/html"/>
    <title>Settings Are Getting a New Look!</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The redesign of Firefox Settings is now enabled by default in Nightly! With this change, we are making it easier for people to customize Firefox and discover the controls that … <a class="go" href="https://blog.nightly.mozilla.org/2026/05/20/settings-are-getting-a-new-look/">Read more</a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The redesign of Firefox Settings is now enabled by default in Nightly! With this change, we are making it easier for people to customize Firefox and discover the controls that matter most to them. The redesign improves navigation and organization, updates labels and descriptions, and uses a new underlying architecture that will make Settings easier to update over time.</p>
<p>Firefox Settings have grown a lot over the years. Our research showed that some areas had become crowded and more difficult to navigate, and that important controls could be hard to discover. Some terminology and layouts had also become inconsistent over time. Internally, the existing structure also made Settings harder to maintain and evolve over time.</p>
<p>Here are some of the changes you’ll notice:</p>
<ul>
<li>More pages within Settings, with less content per page</li>
<li>Clearer grouping and better flow between related controls</li>
<li>Improved labels and helper text</li>
<li>Consistent use of our design system throughout</li>
</ul>
<div class="wp-caption aligncenter" id="attachment_2067" style="width: 610px;"><img alt="New Settings navigation and layout in Nightly" class="wp-image-2067 size-large" height="511" src="https://blog.nightly.mozilla.org/files/2026/05/SRD_Home_NightlyBlog_InLine2-600x511.png" width="600"/><p class="wp-caption-text" id="caption-attachment-2067">The new Settings navigation and layout</p></div>
<div class="mceTemp"/>
<p>While the organization of Settings has changed, all your existing choices and preferences remain in place. You can always use the search bar to jump straight to what you’re looking for.</p>
<p>We plan to ship the redesign to the Release channel in Firefox 152. You will continue to see changes in Nightly, and we welcome feedback, especially in <a href="https://connect.mozilla.org/t5/discussions/the-redesign-of-settings-is-now-enabled-by-default-in-nightly/m-p/125382#M49482">Mozilla Connect</a>.</p>
<p>Customization has long been a core part of Firefox, and this redesign is intended to continue improving how people discover and manage their browser settings. We appreciate all of the feedback from the community so far on this project and look forward to refining the experience with your input!</p></div>
    </content>
    <updated>2026-05-20T15:53:01Z</updated>
    <published>2026-05-20T15:53:01Z</published>
    <category term="News"/>
    <category term="firefox"/>
    <category term="nightly"/>
    <author>
      <name>talee</name>
    </author>
    <source>
      <id>https://blog.nightly.mozilla.org</id>
      <logo>https://blog.nightly.mozilla.org/files/2024/04/cropped-Fx-Browser-Nightly-icon-fullColor-512-32x32.png</logo>
      <link href="https://blog.nightly.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.nightly.mozilla.org" rel="alternate" type="text/html"/>
      <subtitle>Let's improve quality, build after build!</subtitle>
      <title>Firefox Nightly News</title>
      <updated>2026-06-03T18:27:38Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:this-week-in-rust.org,2026-05-20:/blog/2026/05/20/this-week-in-rust-652/</id>
    <link href="https://this-week-in-rust.org/blog/2026/05/20/this-week-in-rust-652/" rel="alternate" type="text/html"/>
    <title>This Week in Rust 652</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social …</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social, or
<a href="https://github.com/rust-lang/this-week-in-rust">send us a pull request</a>.
Want to get involved? <a href="https://github.com/rust-lang/rust/blob/main/CONTRIBUTING.md">We love contributions</a>.</p>
<p><em>This Week in Rust</em> is openly developed <a href="https://github.com/rust-lang/this-week-in-rust">on GitHub</a> and archives can be viewed at <a href="https://this-week-in-rust.org/">this-week-in-rust.org</a>.
If you find any errors in this week's issue, <a href="https://github.com/rust-lang/this-week-in-rust/pulls">please submit a PR</a>.</p>
<p>Want TWIR in your inbox? <a href="https://this-week-in-rust.us11.list-manage.com/subscribe?u=fd84c1c757e02889a9b08d289&amp;id=0ed8b72485">Subscribe here</a>.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4>


<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#official">Official</a></h5>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/">Project goals update — April 2026 (end of 2025H2)</a></li>
<li><a href="https://blog.rust-lang.org/inside-rust/2026/05/13/program-management-update--april-2026/">Program management update — April 2026</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#newsletters">Newsletters</a></h5>
<ul>
<li><a href="https://rust-osdev.com/this-month/2026-04/">This Month in Rust OSDev: April 2026</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://luciofranco.com/blog/tonic-joins-grpc/">Tonic is joining the gRPC project</a></li>
<li><a href="https://tokio.rs/blog/2026-05-15-announcing-toasty-0-6-0">Toasty 0.6.0 - What is new?</a></li>
<li><a href="https://hexdocs.pm/ex_ratatui">ex_ratatui: Elixir bindings for ratatui via Rustler NIFs</a></li>
<li><a href="https://medium.com/@jinhopers/in-depth-llvm-ir-how-omniscope-tracks-ownership-across-languages-2919e418ca61">OmniScope: A Cross-Language LLVM IR Static Analyzer Targeting Unsafe/FFI Boundaries</a>: </li>
<li><a href="https://citum.org/">citum: a new Rust citation processor and associated tools.</a></li>
<li><a href="https://minikin.me/blog/cargo-crap">cargo-crap: Finding Untested Complexity in AI-Generated Rust Code</a></li>
<li><a href="https://aimdb.dev/blog/graph-owes">What the Graph Owes: Connectors That Drive Outputs</a></li>
<li><a href="https://beeb.li/blog/introducing-swpui">swpui: a TUI for case-aware search and replace</a></li>
<li><a href="https://kunobi.ninja/blog/kache-update">kache 0.3.0: zero-copy efficient worktree compilation</a></li>
<li><a href="https://catcoding.me/ghr/">ghr: a Rust TUI for managing GitHub pull requests, issues, notifications, and reviews</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5>
<ul>
<li><a href="https://kerkour.com/rust-organize-large-projects-code-error-handling">Scaling Rust codebases: Lessons learned organizing large projects and managing errors</a></li>
<li><a href="https://corrode.dev/learn/migration-guides/go-to-rust/">Migrating from Go to Rust</a></li>
<li><a href="https://blog.gokuls.in/posts/why-i-built-wrkflw.html">Why I built wrkflw</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=VIsKIzFz_zA">Rust's God Mode</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=FUg1y-yv6cs">How Rust engineered the perfect async runtime</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5>
<ul>
<li><a href="https://apas.tel/blog/optimizing-image-rs-blur">5× faster fast_blur in image-rs</a></li>
<li><a href="https://thejpster.org.uk/blog/blog-2026-05-17/">Finding the Time Part 2 - Rust Async and the Arm Generic Timer</a></li>
<li><a href="https://assethoard.com/blog/parsing-godot-tres-files">Parsing Godot .tres files and walking the resource graph</a></li>
<li><a href="https://jonahnestrick.com/blog/rust-gba-tutorial-1/">Rust x GBA: Setup and Pixels</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-rust-lifetimes-by-building-a-lru-cache/">Learn Rust Lifetimes by Building a Generic LRU Cache</a></li>
<li><a href="https://bencher.dev/learn/benchmarking/rust/gungraun/">How to benchmark Rust code with Gungraun</a></li>
<li><a href="https://root-11.github.io/intro-book/">Book: An Introduction to Programming, using ECS &amp; EBP in Rust</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#crate-of-the-week">Crate of the Week</a></h4>
<p>This week's crate is <a href="https://github.com/minikin/cargo-crap">cargo-crap</a>, a cargo subcommand to calculate the Change Risk Anti-Patterns metric for a crate.</p>
<p>Despite a lamentable lack of suggestions, llogiq is pleased with his choice.</p>
<p><a href="https://users.rust-lang.org/t/crate-of-the-week/2704">Please submit your suggestions and votes for next week</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#calls-for-testing">Calls for Testing</a></h4>
<p>An important step for RFC implementation is for people to experiment with the
implementation and give feedback, especially before stabilization.</p>
<p>If you are a feature implementer and would like your RFC to appear in this list, add a
<code>call-for-testing</code> label to your RFC along with a comment providing testing instructions and/or
guidance on which aspect(s) of the feature need testing.</p>
<p><em>No calls for testing were issued this week by
<a href="https://github.com/rust-lang/rust/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rust</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/rustup/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rustup</a> or
<a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing%20state%3Aopen">Rust language RFCs</a>.</em></p>
<p><a href="https://github.com/rust-lang/this-week-in-rust/issues">Let us know</a> if you would like your feature to be tracked as a part of this list.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#call-for-participation-projects-and-speakers">Call for Participation; projects and speakers</a></h4>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-projects">CFP - Projects</a></h5>
<p>Always wanted to contribute to open-source projects but did not know where to start?
Every week we highlight some tasks from the Rust community for you to pick and get started!</p>
<p>Some of these tasks may also have mentors available, visit the task page for more information.</p>




<p>If you are a Rust project owner and are looking for contributors, please submit tasks <a href="https://github.com/rust-lang/this-week-in-rust?tab=readme-ov-file#call-for-participation-guidelines">here</a> or through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-events">CFP - Events</a></h5>
<p>Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.</p>



<ul>
<li><a href="https://scientificcomputing.rs/2026/submit-talk"><strong>Scientific Computing in Rust 2026</strong></a>| 2026-06-05 | Virtual | 2026-07-08 - 2026-07-10</li>
</ul>
<p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4>
<p>369 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-05-12..2026-05-19">merged in the last week</a></p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/155815">add Swift function call ABI</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156452">implement pinned drop sugar</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#library">Library</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/155360"><code>map_try_insert</code> changes</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156444">implement <code>OsStr::split_at</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156234">implement <code>into_array</code> for <code>Vec&lt;T&gt;</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156428">move <code>std::io::Cursor</code> to <code>core::io</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156431">move <code>std::io::util</code> to <code>core::io</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156644">widen the result of <code>widening_mul</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/cargo/pull/16988"><code>clean</code>: respect <code>build.target</code> config for <code>clean -p</code></a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/16989"><code>diag</code>: Consolidate verify/run diagnostics passes</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/16994"><code>diag</code>: Report deferred diagnostics like other diagnostics</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17008"><code>diag</code>: Pull in the parse pass</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17007"><code>lints</code>: Avoid compiling where possible</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17002">drop <code>-Zunstable-options</code> for <code>rustdoc --emit</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rustdoc">Rustdoc</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/146220">stabilize <code>--emit</code> flag</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156587">correctly handle associated items in rustdoc macro expansion</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156413">correctness &amp; perf improvements to link-to-definition</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/152449">properly support macros with multiple kinds</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16922">fix <code>duration_suboptimal_units</code> for small literals</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17011">fix arithmetic side effects false positive</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-analyzer">Rust-Analyzer</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22347">add diagnostic for E0029</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22380">add diagnostic for E0614</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22355">add diagnostic for E0638</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22378">add handler for E0040</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22329">encode the name instead of index in <code>EnumVariantId</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22354">fix assist <code>qualify_path</code> loses path segment</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22335">add param on result methods for <code>replace_method_eager_lazy</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22399">complete <code>ref_match</code> in macro</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22368">fully support pattern types</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22344">handle usages in macro for <code>extract_function</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22386">no complete module colons before exists colons</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22363">no lint unsized adt <code>self_ty</code> missing bounded assoc</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22376">not complete same name inherent deref methods</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22367">only ref match non-unknown value items</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22357">show Run lens for fn main in bench targets</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22384">handle <code>TyKind::{Pat,UnsafeBinder}</code> in <code>has_drop_glue</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22082">implement <code>pattern_type</code> macro</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22372">method-resolution: emit error for method calls with illegal Sized bound</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22352">migrate <code>inline_call</code> assist to SyntaxFactory</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22191">perf: provide access to <code>RootDatabase</code>'s <code>LineIndex</code> for the proc macro protocol</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22358">show <code>const</code> in the signature help if applicable</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22381">show <code>unsafe</code> in the signature help if applicable</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5>
<p>Fewer than usual PRs merged, mostly due to a shorter week than normal and some
CI trouble. Overall a slightly positive week for performance.</p>
<p>Triage done by <strong>@simulacrum</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=29b7590130c83542a095cdf1323ed0f78eec2bb8&amp;end=281c97c3240a9abd984ca0c6a2cd7389115e80d5&amp;absolute=false&amp;stat=instructions%3Au">29b75901..281c97c3</a></p>
<p>0 Regressions, 0 Improvements, 4 Mixed; 1 of them in rollups
17 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/master/triage/2026/2026-05-17.md">Full report here</a></p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#approved-rfcs"/><a href="https://github.com/rust-lang/rfcs/commits/master">Approved RFCs</a></h5>
<p>Changes to Rust follow the Rust <a href="https://github.com/rust-lang/rfcs#rust-rfcs">RFC (request for comments) process</a>. These
are the RFCs that were approved for implementation this week:</p>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3923">Cargo RFC for min publish age</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#final-comment-period">Final Comment Period</a></h5>
<p>Every week, <a href="https://www.rust-lang.org/team.html">the team</a> announces the 'final comment period' for RFCs and key PRs
which are reaching a decision. Express your opinions now.</p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler-team-mcps-only"/><a href="https://github.com/rust-lang/compiler-team/issues?q=label%3Amajor-change%20label%3Afinal-comment-period%20state%3Aopen">Compiler Team</a> <a href="https://forge.rust-lang.org/compiler/mcp.html">(MCPs only)</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/compiler-team/issues/990">Removing the unstable ptx linker flavor</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/988">Create a new Tier 3 target: <code>powerpc64le-unknown-none</code></a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/922">Optimize <code>repr(Rust)</code> enums by omitting tags in more cases involving uninhabited variants.</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/906">Proposal for a dedicated test suite for the parallel frontend</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/864">Promote tier 3 riscv32 ESP-IDF targets to tier 2</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/841">Proposal for Adapt Stack Protector for Rust</a></li>
</ul>
<p><em>No Items entered Final Comment Period this week for
<a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Rust</a>,
<a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Team</a>,
<a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a>,
<a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a> or
<a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Unsafe Code Guidelines</a>.</em></p>
<p>Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"/><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h5>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3962">Documentation interpolation</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4>
<p>Rusty Events between 2026-05-20 - 2026-06-17 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-05-20 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/313572925/"><strong>Mouse Control with Rust</strong></a></li>
</ul>
</li>
<li>2026-05-20 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/548kbqhl"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-05-21 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/313873203/"><strong>May, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-05-21 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455929/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-05-21 | Virtual (Charlottesville, VA, US) | <a href="https://www.meetup.com/charlottesville-rust-meetup">Charlottesville Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/charlottesville-rust-meetup/events/314477948/"><strong>Tock OS Part #4 - Capsule coding in QEMU!</strong></a></li>
</ul>
</li>
<li>2026-05-26 | Virtual (Cardiff, GB) | <a href="https://www.meetup.com/rust-and-c-plus-plus-in-cardiff/events/">Rust and C++ Cardiff</a><ul>
<li><a href="https://www.meetup.com/rust-and-c-plus-plus-in-cardiff/events/314820642/"><strong>Hybrid event with Rust Dortmund!</strong></a></li>
</ul>
</li>
<li>2026-05-26 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254781/"><strong>Fourth Tuesday</strong></a></li>
</ul>
</li>
<li>2026-05-26 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/313506048/"><strong>Lunch &amp; Learn: Seeing Into Your Code - A Practical Guide to Tracing in Rust</strong></a></li>
</ul>
</li>
<li>2026-05-27 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/9v7hv2g1"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-06-02 | Virtual | <a href="https://luma.com/libp2p">libp2p Events</a><ul>
<li><a href="https://luma.com/ukfh0mcf"><strong>rust-libp2p Open Maintainers Call</strong></a></li>
</ul>
</li>
<li>2026-06-03 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/314691782/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
</li>
<li>2026-06-04 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin/events/">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455930/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-06-04 | Virtual (Nürnberg, DE) | <a href="https://www.meetup.com/rust-noris/events/">Rust Nuremberg</a><ul>
<li><a href="https://www.meetup.com/rust-noris/events/313345241/"><strong>Rust Nürnberg online</strong></a></li>
</ul>
</li>
<li>2026-06-07 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust/events/">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314095285/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-06-09 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust/events/">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254780/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-06-10 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/3bcnx1jb"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-06-16 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc/events/">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/rdhhptyjcjbvb/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
<li>2026-06-02 | Virtual | <a href="https://luma.com/libp2p">libp2p Events</a><ul>
<li><a href="https://luma.com/pegz5x4h"><strong>rust-libp2p Open Maintainers Call</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/ekws5nr4"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Virtual (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust/events/">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314000478/"><strong>Rust Study/Hack/Hang-out</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#asia">Asia</a></h5>
<ul>
<li>2026-06-02 | Beijing, CN | <a href="https://www.meetup.com/wasm-rust-meetup/events/">Voice AI and Rust Meetup (Rust for AI, lowcoderust.com)</a><ul>
<li><a href="https://www.meetup.com/wasm-rust-meetup/events/314750465/"><strong>AI Agents and Open Source LLM (Call for Speakers)</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#europe">Europe</a></h5>
<ul>
<li>2026-05-18 - 2026-05-23 | Utrecht, NL | <a href="https://2026.rustweek.org/">RustWeek 2026</a><ul>
<li><a href="https://2026.rustweek.org/"><strong>RustWeek 2026</strong></a></li>
</ul>
</li>
<li>2026-05-21 | Amsterdam, NL | <a href="https://www.meetup.com/rust-amsterdam">RustNL</a><ul>
<li><a href="https://www.meetup.com/rust-nederland/events/314301699/"><strong>RustWeek Hackathon</strong></a></li>
</ul>
</li>
<li>2026-05-22 | Amsterdam, NL | <a href="https://www.meetup.com/rust-amsterdam/events/">RustNL</a><ul>
<li><a href="https://www.meetup.com/rust-nederland/events/314770275/"><strong>Walking Tour around Utrecht</strong></a></li>
</ul>
</li>
<li>2026-05-22 | Amsterdam, NL | <a href="https://www.meetup.com/rust-amsterdam">RustNL</a><ul>
<li><a href="https://www.meetup.com/rust-nederland/events/314523659/"><strong>Bike tour around Utrecht</strong></a></li>
</ul>
</li>
<li>2026-05-26 | Dortmund, DE | <a href="https://www.meetup.com/rust-dortmund">Rust Dortmund</a><ul>
<li><a href="https://www.meetup.com/rust-dortmund/events/314522781/"><strong>Rust Dortmund Meetup - Agentic Programming - May</strong></a></li>
</ul>
</li>
<li>2026-05-26 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul>
<li><a href="https://www.meetup.com/rust-manchester/events/314452972/"><strong>Rust Manchester May Code Night</strong></a></li>
</ul>
</li>
<li>2026-05-26 | Trondheim, NO | <a href="https://www.meetup.com/rust-trondheim/events/">Rust Trondheim</a><ul>
<li><a href="https://www.meetup.com/rust-trondheim/events/314711434/"><strong>Motorized blinds, and replacing Docker, in Rust!</strong></a></li>
</ul>
</li>
<li>2026-05-28 | London, UK | <a href="https://www.meetup.com/rust-london-user-group/events/">Rust London User Group</a><ul>
<li><a href="https://www.meetup.com/rust-london-user-group/events/314846861/"><strong>LDN Talks May Community Showcase</strong></a></li>
</ul>
</li>
<li>2026-05-29 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/314396588/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
<li>2026-06-03 | Dublin, IE | <a href="https://www.meetup.com/rust-dublin/events/">Rust Dublin</a><ul>
<li><a href="https://www.meetup.com/rust-dublin/events/314689875/"><strong>Join us live and INPERSON for Rust 261</strong></a></li>
</ul>
</li>
<li>2026-06-03 | Girona, ES | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/4bmlc7qd"><strong>Rust Girona Hack &amp; Learn 06 2026</strong></a></li>
</ul>
</li>
<li>2026-06-11 | Switzerland, CH | <a href="https://www.posttenebraslab.ch/wiki/events/start">PostTenebrasLab</a><ul>
<li><a href="https://www.posttenebraslab.ch/wiki/events/monthly_meeting/rust_meetup"><strong>Rust Meetup Geneva</strong></a></li>
</ul>
</li>
<li>2026-06-16 | Leipzig, SN, DE | <a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/events/">Rust - Modern Systems Programming in Leipzig</a><ul>
<li><a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/events/313813937/"><strong>Interactive: Everything is Open Source</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<li>2026-05-20 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/313572925/"><strong>Mouse Control with Rust</strong></a></li>
</ul>
</li>
<li>2026-05-20 | San Francisco, CA, US | <a href="https://luma.com/bayarearust">Bay Area Rust Meetup</a><ul>
<li><a href="https://luma.com/9j3q5ejl"><strong>Bay Area Rust Meetup</strong></a></li>
</ul>
</li>
<li>2026-05-21 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/313873203/"><strong>May, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-05-21 | New York, NY, US | <a href="https://www.meetup.com/rust-nyc/events/">Rust NYC</a><ul>
<li><a href="https://www.meetup.com/rust-nyc/events/314783868/"><strong>Rust NYC: "Boring File Storage" &amp; "Indie News Feed Optimization"</strong></a></li>
</ul>
</li>
<li>2026-05-21 | Nashville, TN, US | <a href="https://www.meetup.com/music-city-rust-developers">Music City Rust Developers</a><ul>
<li><a href="https://www.meetup.com/music-city-rust-developers/events/314359076/"><strong>Community Meetup</strong></a></li>
</ul>
</li>
<li>2026-05-23 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/314480534/"><strong>Allston Rust Lunch, May 23</strong></a></li>
</ul>
</li>
<li>2026-05-27 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/314209662/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-05-28 | Atlanta, GA, US | <a href="https://www.meetup.com/rust-atl">Rust Atlanta</a><ul>
<li><a href="https://www.meetup.com/rust-atl/events/313539319/"><strong>Rust-Atl</strong></a></li>
</ul>
</li>
<li>2026-05-28 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a><ul>
<li><a href="https://www.meetup.com/rust-los-angeles/events/314218564/"><strong>Rust LA: Rust in Embedded &amp; Autonomous Systems at Parallel Systems in DTLA</strong></a></li>
</ul>
</li>
<li>2026-05-28 | Mountain View, CA, US | <a href="https://www.meetup.com/hackerdojo/events/">Hacker Dojo</a><ul>
<li><a href="https://www.meetup.com/hackerdojo/events/314716463/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
</ul>
</li>
<li>2026-05-30 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/314480537/"><strong>Central Cambridge Rust Lunch, May 30</strong></a></li>
</ul>
</li>
<li>2026-06-04 | Saint Louis, MO, US | <a href="https://www.meetup.com/stl-rust/events/">STL Rust</a><ul>
<li><a href="https://www.meetup.com/stl-rust/events/314106244/"><strong>Testing, Coverage, Tracey &amp; Mutations</strong></a></li>
</ul>
</li>
<li>2026-06-06 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust/events/">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/314480539/"><strong>Boston Common Rust Lunch, June 6</strong></a></li>
</ul>
</li>
<li>2026-06-11 | Lehi, UT, US | <a href="https://www.meetup.com/utah-rust/events/">Utah Rust</a><ul>
<li><a href="https://www.meetup.com/utah-rust/events/314696643/"><strong>Utah Rust June Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-11 | San Diego, CA, US | <a href="https://www.meetup.com/san-diego-rust/events/">San Diego Rust</a><ul>
<li><a href="https://www.meetup.com/san-diego-rust/events/313721899/"><strong>San Diego Rust June Meetup - Back in person!</strong></a></li>
</ul>
</li>
<li>2026-06-16 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group/events/">San Francisco Rust Study Group</a><ul>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/ghhwqtyjcjbvb/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5>
<ul>
<li>2026-05-26 | Barton, ACT, AU | <a href="https://www.meetup.com/rust-canberra">Canberra Rust User Group</a><ul>
<li><a href="https://www.meetup.com/rust-canberra/events/314050576/"><strong>May Meetup</strong></a></li>
</ul>
</li>
</ul>
<p>If you are running a Rust event please add it to the <a href="https://www.google.com/calendar/embed?src=apd9vmbc22egenmtu5l6c5jbfc%40group.calendar.google.com">calendar</a> to get
it mentioned here. Please remember to add a link to the event too.
Email the <a href="mailto:community-team@rust-lang.org">Rust Community Team</a> for access.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#jobs">Jobs</a></h4>
<p>Please see the latest <a href="https://www.reddit.com/r/rust/comments/1sobu1s/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p>
<h3><a class="toclink" href="https://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3>
<blockquote>
<p>Posts like this are useful for those of us who like to help, and who work on rustc to make it more helpful, by letting us learn about what kinds of mistakes people make.</p>
</blockquote>
<p>– <a href="https://users.rust-lang.org/t/slightly-surprising-behavior-of-a-while-loop/140117/5">Kevin Reid on rust-users</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1605">firebits.io</a> for the suggestion!</p>
<p><a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328">Please submit quotes and vote for next week!</a></p>
<p>This Week in Rust is edited by:</p>
<ul>
<li><a href="https://github.com/nellshamrell">nellshamrell</a></li>
<li><a href="https://github.com/llogiq">llogiq</a></li>
<li><a href="https://github.com/ericseppanen">ericseppanen</a></li>
<li><a href="https://github.com/extrawurst">extrawurst</a></li>
<li><a href="https://github.com/U007D">U007D</a></li>
<li><a href="https://github.com/mariannegoldin">mariannegoldin</a></li>
<li><a href="https://github.com/bdillo">bdillo</a></li>
<li><a href="https://github.com/opeolluwa">opeolluwa</a></li>
<li><a href="https://github.com/bnchi">bnchi</a></li>
<li><a href="https://github.com/KannanPalani57">KannanPalani57</a></li>
<li><a href="https://github.com/tzilist">tzilist</a></li>
</ul>
<p><em>Email list hosting is sponsored by <a href="https://foundation.rust-lang.org/">The Rust Foundation</a></em></p>
<p><small><a href="https://www.reddit.com/r/rust/comments/1tj8ja6/this_week_in_rust_652/">Discuss on r/rust</a></small></p></div>
    </content>
    <updated>2026-05-20T04:00:00Z</updated>
    <published>2026-05-20T04:00:00Z</published>
    <category term="This Week in Rust"/>
    <author>
      <name>TWiR Contributors</name>
    </author>
    <source>
      <id>https://this-week-in-rust.org/</id>
      <link href="https://this-week-in-rust.org/" rel="alternate" type="text/html"/>
      <link href="https://this-week-in-rust.org/atom.xml" rel="self" type="application/atom+xml"/>
      <title>This Week in Rust</title>
      <updated>2026-06-10T04:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://jonalmeida.com/blog/firefox-android-studio-setup/</id>
    <link href="https://jonalmeida.com/blog/firefox-android-studio-setup/" rel="alternate" type="text/html"/>
    <title xml:lang="en">My Firefox for Android local build environment</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>The Firefox for Android app has always had a complicated build process - we're cramping a complex cross-platform browser engine and all the related components that make it work on Android into one package. In its current form, it lives in the Firefox mono-repo at <code>mozilla-central</code> (now <code>mozilla-firefox</code> using the git repository).</p>
<p>I wanted to document my "artifact-mode" environment here since it's worked quite successfully for me for many years with minor changes.</p>
<blockquote>
<p><strong>NOTE:</strong> After a fresh clone of the mono-repo, don't forget to first run and follow the prompts of <code>./mach bootstrap</code> .</p>
</blockquote>
<h3>mozconfig</h3>
<p>My <code>mozconfig</code> below is enabled for artifact mode, but occasionally I switch between various configurations. You can see those commented out, with these few extra notes:</p>
<ul>
<li>I like to separate out my objdirs to avoid cache pollution between the different build types. I think you can get away without needing to specify this and an objdir for your build type and arch will be generated.</li>
<li><code>sccache</code> speeds up the native portion of full builds after the first slow one, but it's a hit or miss if you fetch from the remote repository but don't need to rebuild as often.</li>
<li>I don't care to manually run the clobber step, and I don't truly appreciate why that isn't always automatically done.</li>
<li><a href="https://github.com/emilio/mozconfigs" rel="external">Emilio's mozconfig manager</a> looks like a better solution, however my needs are very simple.</li>
</ul>
<pre class="giallo"><code><span class="giallo-l"><span>#</span><span> Build GeckoView/Firefox for Android:</span></span>
<span class="giallo-l"><span>ac_add_options</span><span> -</span><span>-enable-application=mobile/android</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>#</span><span> Targeting the following architecture.</span></span>
<span class="giallo-l"><span>#</span><span> For regular phones, no --target is needed.</span></span>
<span class="giallo-l"><span>#</span><span> For x86 emulators (and x86 devices, which are uncommon):</span></span>
<span class="giallo-l"><span>#</span><span> ac_add_options --target=i686</span></span>
<span class="giallo-l"><span>#</span><span> For newer phones or Apple silicon</span></span>
<span class="giallo-l"><span>ac_add_options</span><span> -</span><span>-target=aarch64</span></span>
<span class="giallo-l"><span>#</span><span> For x86_64 emulators (and x86_64 devices, which are even less common):</span></span>
<span class="giallo-l"><span>#</span><span> ac_add_options --target=x86_64</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>#</span><span> sccache will significantly speed up your builds by caching</span></span>
<span class="giallo-l"><span>#</span><span> compilation results. The Firefox build system will download</span></span>
<span class="giallo-l"><span>#</span><span> sccache automatically.</span></span>
<span class="giallo-l"><span>#</span><span> This only works for non-artifact builds.</span></span>
<span class="giallo-l"><span>#</span><span>ac_add_options --with-ccache=sccache</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>#</span><span> Enable artifact builds; manager-mode.</span></span>
<span class="giallo-l"><span>ac_add_options</span><span> -</span><span>-enable-artifact-builds</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>#</span><span> Write build artifacts to..</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>#</span><span># Full build dir</span></span>
<span class="giallo-l"><span>#</span><span>mk_add_options MOZ_OBJDIR=./objdir-droid</span></span>
<span class="giallo-l"><span>#</span><span>mk_add_options MOZ_OBJDIR=./objdir-desktop</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>#</span><span># Artifact builds</span></span>
<span class="giallo-l"><span>mk_add_options</span><span> MOZ_OBJDIR=./objdir-frontend</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>#</span><span> Automatic clobbering; don't ask me.</span></span>
<span class="giallo-l"><span>mk_add_options</span><span> AUTOCLOBBER=</span><span>1</span></span></code></pre><h3>JAVA_HOME</h3>
<p>Sometimes you might find yourself needing to run a (non-mach) command in the terminal. Those typically will need to invoke some parts of gradle for an Android build, so it's best to make sure those are using the same JDK as the bootstrapped one in the mono-repo. This avoids weird build errors where something that compiles in one place isn't working in another (like Android Studio).</p>
<p>The location for the JDKs are typically in <code>~/.mozbuild/jdk/</code>, and if you've between around for ~6 months you end up with multiple versions after every JDK bump:</p>
<pre class="giallo"><code><span class="giallo-l"><span>$</span><span> ls</span><span> -</span><span>l</span><span> ~/.mozbuild/jdk/</span></span>
<span class="giallo-l"><span>drwxr-xr-x@</span><span> -</span><span> jalmeida</span><span> 15</span><span> Apr</span><span>  2025</span><span> jdk-17.0.15+6</span></span>
<span class="giallo-l"><span>drwxr-xr-x@</span><span> -</span><span> jalmeida</span><span> 15</span><span> Jul</span><span>  2025</span><span> jdk-17.0.16+8</span></span>
<span class="giallo-l"><span>drwxr-xr-x@</span><span> -</span><span> jalmeida</span><span> 21</span><span> Oct</span><span>  2025</span><span> jdk-17.0.17+10</span></span>
<span class="giallo-l"><span>drwxr-xr-x@</span><span> -</span><span> jalmeida</span><span> 20</span><span> Jan</span><span> 09:00</span><span> jdk-17.0.18+8</span></span>
<span class="giallo-l"><span>drwxr-xr-x@</span><span> -</span><span> jalmeida</span><span> 26</span><span> Feb</span><span> 15:04</span><span> mozboot</span></span>
<span class="giallo-l"/></code></pre>
<p>You can find some way to point your latest JDK to one location or you can be lazy like me and pick the latest version to assign as your <code>JAVA_HOME</code> property by adding this to your shell's RC file:</p>
<pre class="giallo"><code><span class="giallo-l"><span>export</span><span> JAVA_HOME</span><span>=</span><span>"</span><span>$(</span><span>ls</span><span> -</span><span>1dr</span><span> -</span><span>-</span><span> $</span><span>HOME</span><span>/.mozbuild/jdk/jdk-</span><span>*</span><span> |</span><span> head</span><span> -</span><span>n</span><span> 1</span><span>)</span><span>/Contents/Home</span><span>"</span></span></code></pre><h4>Android Studio</h4>
<p><strong>UPDATE:</strong> With <a href="https://phabricator.services.mozilla.com/D286123" rel="external">D286123</a> landed, this should no longer be necessary! 🎉</p>
<p>Similarly for Android Studio, let's do the same so that environment is identical. Head to, Settings | Build, Execution, Deployment | Build Tools | Gradle, and ensure that "Gradle JDK" path is set to <code>JAVA_HOME</code>.</p>
<p>Lately, the default seems to be for it to follow <code>GRADLE_LOCAL_JAVA_HOME</code> which is a property we can't easily override, so we have to manually set this ourselves.</p>

<div>
  <img src="https://jonalmeida.com/blog/firefox-android-studio-setup/android-studio-build-tools-gradle.png" style="display: block; margin-left: auto; margin-right: auto;"/>
</div>
<p>Using the same Android SDK also helps speed things up and avoids source confusion. You can typically find it in <code>~/.mozbuild/android-sdk-macosx</code> and update it at Settings | Languages &amp; Frameworks | Android SDK.</p>

<div>
  <img src="https://jonalmeida.com/blog/firefox-android-studio-setup/android-studio-android-sdk.png" style="display: block; margin-left: auto; margin-right: auto;"/>
</div>
<h3>Debugging</h3>
<p>This section is for miscellaneous build error situations that come-up, but assuming <code>mach build</code> work and there are no known Android build changes, my solution has typically always been the same.</p>
<p>For example, the other day I fetched another engineers patch to test out locally<sup class="footnote-reference"><a href="https://jonalmeida.com/blog/firefox-android-studio-setup/#1">1</a></sup> as part of reviewing it where I faced the error message below:</p>
<details>
Execution failed for task ':components:feature-pwa:compileDebugKotlin'.
<pre class="giallo"><code><span class="giallo-l"><span>FAILURE: Build failed with an exception.</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>* What went wrong:</span></span>
<span class="giallo-l"><span>Execution failed for task ':components:feature-pwa:compileDebugKotlin'.</span></span>
<span class="giallo-l"><span>&gt; A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction</span></span>
<span class="giallo-l"><span>   &gt; Internal compiler error. See log for more details</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>* Try:</span></span>
<span class="giallo-l"><span>&gt; Run with --info or --debug option to get more log output.</span></span>
<span class="giallo-l"><span>&gt; Run with --scan to generate a Build Scan (powered by Develocity).</span></span>
<span class="giallo-l"><span>&gt; Get more help at https://help.gradle.org.</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>* Exception is:</span></span>
<span class="giallo-l"><span>org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':components:feature-pwa:compileDebugKotlin'.</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:135)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:288)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:133)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:121)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)</span></span>
<span class="giallo-l"><span>	at org.gradle.execution.plan.DefaultNodeExecutor.executeLocalTaskNode(DefaultNodeExecutor.java:55)</span></span>
<span class="giallo-l"><span>	at org.gradle.execution.plan.DefaultNodeExecutor.execute(DefaultNodeExecutor.java:34)</span></span>
<span class="giallo-l"><span>	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)</span></span>
<span class="giallo-l"><span>	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)</span></span>
<span class="giallo-l"><span>	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:339)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84)</span></span>
<span class="giallo-l"><span>	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:339)</span></span>
<span class="giallo-l"><span>	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:328)</span></span>
<span class="giallo-l"><span>	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)</span></span>
<span class="giallo-l"><span>	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)</span></span>
<span class="giallo-l"><span>Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction</span></span>
<span class="giallo-l"><span>	at org.gradle.workers.internal.DefaultWorkerExecutor$WorkItemExecution.waitForCompletion(DefaultWorkerExecutor.java:289)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultAsyncWorkTracker.lambda$waitForItemsAndGatherFailures$2(DefaultAsyncWorkTracker.java:130)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.Factories$1.create(Factories.java:33)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultWorkerLeaseService.lambda$withoutLocks$2(DefaultWorkerLeaseService.java:344)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.ResourceLockStatistics$1.measure(ResourceLockStatistics.java:42)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:342)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:326)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLock(DefaultWorkerLeaseService.java:331)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:126)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:92)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForAll(DefaultAsyncWorkTracker.java:78)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:66)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:260)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:237)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:220)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:203)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:170)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.Either$Right.fold(Either.java:176)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:64)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:62)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:40)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:76)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:45)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:136)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:66)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:38)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:297)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:31)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)</span></span>
<span class="giallo-l"><span>	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:132)</span></span>
<span class="giallo-l"><span>	... 30 more</span></span>
<span class="giallo-l"><span>Caused by: org.jetbrains.kotlin.gradle.tasks.FailedCompilationException: Internal compiler error. See log for more details</span></span>
<span class="giallo-l"><span>	at org.jetbrains.kotlin.gradle.tasks.TasksUtilsKt.throwExceptionIfCompilationFailed(tasksUtils.kt:22)</span></span>
<span class="giallo-l"><span>	at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:112)</span></span>
<span class="giallo-l"><span>	at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:75)</span></span>
<span class="giallo-l"><span>	at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:68)</span></span>
<span class="giallo-l"><span>	at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:64)</span></span>
<span class="giallo-l"><span>	at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:61)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)</span></span>
<span class="giallo-l"><span>	at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:61)</span></span>
<span class="giallo-l"><span>	at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)</span></span>
<span class="giallo-l"><span>	at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)</span></span>
<span class="giallo-l"><span>	at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)</span></span>
<span class="giallo-l"><span>	at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:58)</span></span>
<span class="giallo-l"><span>	at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:176)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.Factories$1.create(Factories.java:33)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultWorkerLeaseService.lambda$withLocksAcquired$0(DefaultWorkerLeaseService.java:269)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.ResourceLockStatistics$1.measure(ResourceLockStatistics.java:42)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocksAcquired(DefaultWorkerLeaseService.java:267)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:259)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)</span></span>
<span class="giallo-l"><span>	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133)</span></span>
<span class="giallo-l"><span>	... 2 more</span></span>
<span class="giallo-l"/></code></pre></details>
<p>The full trace was long and didn't seem related to a code failure in the module itself. So I employed the solution, which is always the same:</p>
<ol>
<li><code>./mach build</code></li>
<li>In Android Studio, File &gt; Sync Project with Gradle Files.</li>
</ol>
<p>Yup, that's all. Very simple and boring.</p>
<hr/>
<div class="footnote-definition" id="1"><sup class="footnote-definition-label">1</sup>
<p>With Jujutsu, this is the moz-phab command I use which has made it easier to manage review patches: <code>moz-phab patch &lt;patch-id&gt; --no-branch --apply-to main@origin</code></p>
</div>

<section class="article-content" id="comments">
  <h4>Comments</h4>
  <p>With an account on the Fediverse or Mastodon, you can respond to this <a href="https://mindly.social/@jonalmeida/116197244320129422">post</a>. Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don't have an account on this one. Known non-private replies are displayed below.</p>
  <p>Learn how this was implemented from the original source <a class="link" href="https://jonalmeida.com/2020/12/29/adding-comments-to-your-static-blog-with-mastodon/">here.</a></p>

  <p id="mastodon-comments-list">
  <button id="load-comment">Load comments</button></p>
  <div id="comments-wrapper">
    &lt;noscript&gt;&lt;p&gt;Loading comments relies on JavaScript. Try enabling JavaScript and reloading, or visit &lt;a href="https://mindly.social/@jonalmeida/116197244320129422"&gt;the original post&lt;/a&gt; on Mastodon.&lt;/p&gt;&lt;/noscript&gt;
  </div>

  &lt;noscript&gt;You need JavaScript to view the comments.&lt;/noscript&gt;
  &amp;&gt;"'<p/>
</section></div>
    </content>
    <updated>2026-05-19T16:21:23Z</updated>
    <published>2026-03-05T00:00:00Z</published>
    <author>
      <name>Jonathan Almeida</name>
    </author>
    <source>
      <id>https://jonalmeida.com/tags/mozilla/atom.xml</id>
      <link href="https://jonalmeida.com/tags/mozilla/atom.xml" rel="self" type="application/atom+xml"/>
      <link href="https://jonalmeida.com" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en">Scribblings and nonsense</subtitle>
      <title xml:lang="en">Jonathan Almeida - mozilla</title>
      <updated>2026-05-25T00:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=84862</id>
    <link href="https://blog.mozilla.org/en/firefox/built-in-vpn/" rel="alternate" type="text/html"/>
    <title>A free VPN you can trust, now built into Firefox</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Update on May 19, 2026: Firefox’s free built-in VPN now supports location selection, giving people access to a fully comprehensive VPN experience directly within the browser. Starting today, Firefox users in the U.S., U.K., France, Germany, and Canada can choose to browse from any of the countries where we’ve launched VPN support.  Browsing is subject […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/built-in-vpn/">A free VPN you can trust, now built into Firefox</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><figure class="wp-block-image size-large"><img alt="A Firefox browser window displays a fox illustration with a visible VPN status indicator showing &#x201C;VPN is on&#x201D; and remaining data for the month." class="wp-image-85212" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/03/Distilled_FeatureLaunch_VPN_Header_01-1-1024x576.png" width="1024"/></figure>



<p><em><strong>Update on May 19, 2026: </strong>Firefox’s free built-in VPN now supports location selection, giving people access to a fully comprehensive VPN experience directly within the browser. Starting today, Firefox users in the U.S., U.K., France, Germany, and Canada can choose to browse from any of the countries where we’ve launched VPN support.  Browsing is subject to the local laws and content restrictions of the selected region.</em><br/><br/><em><strong>Original post from March 2026:</strong></em></p>



<p>Today we’re introducing a free built-in VPN in Firefox, a new <a href="https://blog.mozilla.org/en/internet-culture/what-is-an-ip-address/">IP-protection</a> feature designed to keep you even more private while you browse. We’re starting by offering an industry-leading 50 gigabytes of free VPN-browsing each month. </p>



<p>Firefox has long focused on building privacy tools directly into the browser to protect you online. Over the years, we’ve introduced <a href="https://www.firefox.com/en-US/features/protection/" rel="noreferrer noopener" target="_blank">world-class protections</a> that block known trackers, reduce fingerprinting and limit how companies can follow people across the web. Our goal has been consistent: make meaningful privacy protections accessible to Firefox users every day.</p>



<p>Firefox is the only major browser to include a built-in VPN like this for free — giving you more control over your privacy, right where you browse.</p>



<h3>Privacy built into the browser</h3>



<p>Every time you visit a website, your IP address is shared automatically. IP addresses help websites know where to send information back to your device, but they can also be used to approximate your location, link your browsing activity across sites and keep logs about your online behavior, meaning websites can track your behavior. It’s one of many ways companies track activity across the internet.</p>



<p>Additionally, when you’re using public Wi-Fi while at a coffee shop, in a hotel, or in your dorm, people can spy on your network traffic and see which websites you might be visiting. </p>



<p>At Mozilla, we believe people should have stronger protections against this kind of tracking and spying, and that those protections should be easy to use.</p>



<h3>Introducing built-in VPN</h3>



<p>Our free built-in VPN is designed to make IP protection simple to use in Firefox.</p>



<p>The built-in VPN includes an unprecedented 50 GB per month of free VPN browsing, enough to cover everyday activities like shopping, banking, and reading.</p>



<p>Turn it on in Firefox with a single click. No extra apps. No downloads. Once it’s on, Firefox routes your browsing traffic through a proxy network that replaces your IP address before it reaches a website. The sites you visit see the proxy’s IP address rather than your own. Firefox already encrypts your traffic with HTTPS, but masking your IP adds another layer of privacy. You can mask the URLs you’re visiting from anyone trying to spy on your network traffic on public Wi-Fi, like while you’re enjoying a latte at your favorite coffee shop. </p>



<p>If you reach the monthly limit, IP protection is paused until the next cycle. Firefox will require you to confirm before proceeding without the VPN so your browsing doesn’t unintentionally continue without IP protection.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/03/Distilled_FeatureLaunch_VPN_Inline_01.png" rel="noreferrer noopener" target="_blank"><img alt="A Firefox browser window displays a fox illustration with a visible VPN status indicator showing &#x201C;VPN is on&#x201D; and remaining data for the month." class="wp-image-85224" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/03/Distilled_FeatureLaunch_VPN_Inline_01-1024x576.png" style="width: 675px;" width="1024"/></a></figure></div>


<h3>Browser-level protection and full-device protection</h3>



<p>The free built-in VPN helps secure your traffic while browsing in Firefox, making it a simple way to protect your IP address from being tracked by big tech. However, it does not offer full device protection. </p>



<p>For those looking for broader coverage, you can also choose protection that extends across your entire device, including other apps. The standalone <a href="https://www.mozilla.org/en-US/products/vpn/?utm_medium=referral&amp;utm_source=firefox-blog&amp;utm_campaign=built-in-vpn-launch&amp;utm_content=learn-more-global" rel="noreferrer noopener" target="_blank">Mozilla VPN</a> subscription offers this capability with unlimited data across multiple devices. Depending on your needs, you can pick the level of privacy and protection that suits you. </p>



<p>We’ve heard concerns about so-called “free VPNs,” which often rely on advertising or selling user data to generate revenue. Firefox’s built-in VPN is designed differently. It does not sell your browsing data and does not inject advertising into your traffic. Instead, we offer a limited amount of browser-level protection for free, alongside <a href="https://www.mozilla.org/en-US/products/vpn/?utm_medium=referral&amp;utm_source=firefox-blog&amp;utm_campaign=built-in-vpn-launch&amp;utm_content=learn-more-global" rel="noreferrer noopener" target="_blank">Mozilla VPN</a>, our paid, unlimited, full-device VPN service. </p>



<p>Read more about the <a href="https://www.mozilla.org/en-us/products/vpn/more/vpn-or-proxy/" rel="noreferrer noopener" target="_blank">differences between VPNs and web proxies</a>.</p>



<h3>Rolling out to Firefox users</h3>



<p>The free built-in VPN is currently rolling out as a beta to Firefox desktop users in the United States, the United Kingdom, Germany and France, with plans to expand to additional countries coming soon over the next several releases.</p>



<p>As with many Firefox features, we’re introducing it gradually starting in <a href="https://www.firefox.com/en-US/releases/">Firefox 149</a> so we can learn from user feedback and continue improving the experience.</p>



<h3>Building a more private web</h3>



<p>Protecting privacy online is an ongoing effort. As the web evolves, new technologies create both opportunities and challenges for keeping personal information safe.</p>



<p>Mozilla has spent years building privacy protections — from <a href="https://support.mozilla.org/en-US/kb/introducing-total-cookie-protection-standard-mode?utm_source=www.firefox.com&amp;utm_medium=referral">Total Cookie Protection</a> to <a href="https://blog.mozilla.org/mozilla/firefox-rolls-out-total-cookie-protection-by-default-to-all-users-worldwide/">P</a><a href="https://www.firefox.com/en-US/features/block-fingerprinting/" rel="noreferrer noopener" target="_blank">rivate browsing mode</a> to <a href="https://www.firefox.com/en-US/features/block-fingerprinting/">anti-fingerprinting</a> — directly into Firefox so people have more control over how they experience the web. This built-in VPN is one more way Firefox helps you browse with less exposure and more peace of mind.</p>



<p>By continuing to build these protections into Firefox, we aim to make the web safer, more transparent and more respectful of the people who use it.</p>



<a class="ft-c-inline-cta" href="https://www.mozilla.org/firefox/new/?utm_source=blog.mozilla.org&amp;utm_medium=referral&amp;utm_campaign=blog-nav">
  <div class="ft-c-inline-cta__media">
  <img alt="The Firefox logo" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/03/Firefox_Logo_Symbol_Fullcolor_RGB-800x800.png" width="800"/>  </div>
  <div class="ft-c-inline-cta__content">
     <h4>Take control of your internet</h4>      <span>Download Firefox</span>   </div>
</a>
<p>The post <a href="https://blog.mozilla.org/en/firefox/built-in-vpn/">A free VPN you can trust, now built into Firefox</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-05-19T16:12:27Z</updated>
    <published>2026-05-19T16:12:27Z</published>
    <category term="Firefox"/>
    <category term="homepage"/>
    <author>
      <name>Adam Fishman</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/en/</id>
      <link href="https://blog.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/en/" rel="alternate" type="text/html"/>
      <subtitle>News and Updates about Mozilla</subtitle>
      <title>The Mozilla Blog</title>
      <updated>2026-06-10T17:43:34Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=85656</id>
    <link href="https://blog.mozilla.org/en/firefox/more-control-firefox/" rel="alternate" type="text/html"/>
    <title>New in Firefox 151: VPN location selection, AI controls on mobile, and expanded Shake to Summarize support</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Today, Firefox is rolling out updates across desktop and mobile that give you more choice over how you browse. Here’s a look at what’s new. Adding location selection to Firefox’s free VPN Firefox now offers a fully featured VPN experience directly in the browser — for free. In just two months, over 1 million users […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/more-control-firefox/">New in Firefox 151: VPN location selection, AI controls on mobile, and expanded Shake to Summarize support</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div class="wp-block-image">
<figure class="aligncenter size-large"><img alt="Firefox mobile AI Controls summarizing a recipe page with VPN turned on" class="wp-image-85758" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/Distilled_MobileFeatures-1024x576.jpg" width="1024"/></figure></div>


<p>Today, Firefox is rolling out updates across desktop and mobile that give you more choice over how you browse.</p>



<p>Here’s a look at what’s new.</p>



<h3><strong>Adding location selection to Firefox’s free VPN</strong></h3>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img alt="VPN location menu showing Germany selected from a list of countries" class="wp-image-85684" height="575" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/VPN-Location-2X-1024x575.png" style="width: 650px;" width="1024"/></figure></div>


<p>Firefox now offers a fully featured VPN experience directly in the browser — for free. In just two months, over 1 million users have already signed up to try it. </p>



<p>With the addition of location selection, one of the most requested features from the Firefox community, Firefox’s free built-in VPN now delivers all the flexibility and functionality people expect from a modern VPN. </p>



<p>Starting today, Firefox users in the U.S., U.K., France, Germany, and Canada can choose to browse from any of the countries where we’ve launched VPN support. Whether you want to view local news, shop regionally, or see how content appears in another country, location selection gives you more control over where your connection appears from online.</p>



<p>Firefox will recommend the location closest to you by default, but people can switch locations at any time. Additional locations are planned for future releases. Browsing will still be subject to the local laws and content restrictions of the selected region.</p>



<p><em>Available in Firefox 151.</em></p>



<h3><strong>More controls over AI features on mobile</strong></h3>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img alt="" class="wp-image-85708" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/Distilled_AIControls_Mobile_A-1024x576.png" style="width: 650px;" width="1024"/></figure></div>


<p>You can now decide how AI shows up in your Firefox mobile browsing experience, with more control over which AI features to activate and more ways to use them across devices and languages.</p>



<p>After launching AI controls on <a href="https://blog.mozilla.org/firefox/ai-controls/">desktop</a> earlier this year, Firefox is bringing them to iOS and Android. Depending on your device and region, available controls include features like translations, voice search and Shake to Summarize. Preferences can be updated at any time, making it easy to keep only the tools you want to use as new AI-powered features arrive in Firefox.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img alt="Firefox browser feature showing fox wrapping a phone while summarizing content on screen" class="wp-image-85495" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/04/Firefox_ShaketoSummarize_Landscape-1024x576.png" style="width: 650px;" width="1024"/></figure></div>


<p>Shake to Summarize, recognized by TIME as one of the Best Inventions of 2025, helps you cut to the chase on mobile webpages by generating a simple summary with a flick of your wrist. The feature is now <a href="https://blog.mozilla.org/en/firefox/shake-to-summarize-expansion/">expanding to Android devices</a>, with English rolling out first and additional languages coming soon. Shake to Summarize is now available on iOS in English, German, French, Spanish, Portuguese, Italian, and Japanese, giving more people the option to use it in the language that works best for them.</p>



<p><em>AI controls are available on <a href="https://blog.mozilla.org/en/firefox/ai-controls-firefox-mobile/">iOS and Android</a>. Shake to Summarize is available on Android in English and on iOS in English, German, French, Spanish, Portuguese, Italian, and Japanese.</em></p>



<h3><strong>A one-click reset for Private Browsing</strong></h3>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img alt="Firefox private browsing window showing option to clear private session data" class="wp-image-85773" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/Distilled_ClearPrivateSession-1024x576.jpg" style="width: 650px;" width="1024"/></figure></div>


<p>Finished shopping for a surprise gift or logging into a temporary account? A new flame-shaped “<strong>Clear Private Session</strong>” button, located to the right of the address bar, instantly clears your current private session and starts a new one without requiring you to close and reopen the browser. Cookies, browsing history, logins, and other session data from your private windows are deleted automatically. Read more in this week’s <a href="https://www.firefox.com/en-US/releases/">release notes</a>. <br/><br/><em>Try it out in Firefox 151.</em></p>



<h3><strong>Coming soon in Nightly: A refreshed settings page</strong></h3>



<p>Firefox is previewing a redesigned settings page in Nightly that makes it easier to find the controls you’re looking for and move through settings more intuitively. The redesign introduces improved navigation, clearer organization, and updated labels and descriptions designed to make customization easier. </p>



<p>Existing settings and preferences will remain unchanged, and the updated search experience helps people quickly find settings that may appear in new sections.</p>



<p>This will be enabled by default for <a href="https://www.firefox.com/channel/desktop/#nightly">Nightly</a> users starting later this week.</p>



<p>Download the latest version of Firefox to explore what’s new and share feedback with us on <a href="https://connect.mozilla.org/" rel="noreferrer noopener" target="_blank">Mozilla Connect</a>.</p>



<a class="ft-c-inline-cta" href="https://www.mozilla.org/firefox/new/?utm_source=blog.mozilla.org&amp;utm_medium=referral&amp;utm_campaign=blog-nav">
  <div class="ft-c-inline-cta__media">
  <img alt="The Firefox logo" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/03/Firefox_Logo_Symbol_Fullcolor_RGB-800x800.png" width="800"/>  </div>
  <div class="ft-c-inline-cta__content">
     <h4>Take control of your internet</h4>      <span>Download Firefox</span>   </div>
</a>
<p>The post <a href="https://blog.mozilla.org/en/firefox/more-control-firefox/">New in Firefox 151: VPN location selection, AI controls on mobile, and expanded Shake to Summarize support</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-05-19T16:06:59Z</updated>
    <published>2026-05-19T16:06:59Z</published>
    <category term="Firefox"/>
    <category term="homepage"/>
    <author>
      <name>Mozilla</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/en/</id>
      <link href="https://blog.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/en/" rel="alternate" type="text/html"/>
      <subtitle>News and Updates about Mozilla</subtitle>
      <title>The Mozilla Blog</title>
      <updated>2026-06-10T17:43:34Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=85624</id>
    <link href="https://blog.mozilla.org/en/firefox/ai-controls-firefox-mobile/" rel="alternate" type="text/html"/>
    <title>AI controls are here for Firefox mobile</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Mobile browsing is personal. It’s the link you open from a group chat because someone said, “Wait, is this real?” It’s the article you read in the few quiet minutes you have to yourself. It’s the review you skim before buying something you’ve been thinking about all week. On a phone, browsing follows you through […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/ai-controls-firefox-mobile/">AI controls are here for Firefox mobile</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><figure class="wp-block-image size-large"><img alt="" class="wp-image-85708" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/05/Distilled_AIControls_Mobile_A-1024x576.png" width="1024"/></figure>



<p>Mobile browsing is personal. It’s the link you open from a group chat because someone said, “Wait, is this real?” It’s the article you read in the few quiet minutes you have to yourself. It’s the review you skim before buying something you’ve been thinking about all week.</p>



<p>On a phone, browsing follows you through the day, from the first thing you look up in the morning to the last tab you close at night. So when AI features are part of the experience, you should have a clear way to choose what helps and what stays off.</p>



<p>That’s why we’re bringing <a href="https://blog.mozilla.org/en/firefox/how-to-use-ai-controls/">AI controls</a> – a popular desktop feature on Firefox – to iOS and Android users. AI controls let you turn off Firefox’s AI features entirely, enable only the ones you want or adjust your choices later. The feature rolls out on mobile on May 19.</p>



<h3><strong>AI features you can choose on Firefox mobile</strong></h3>



<p>What you see may vary by device and location, but AI controls in Firefox mobile let you turn on or off features, including <a href="https://support.mozilla.org/en-US/kb/website-translation"><strong>website translations</strong></a> and <a href="https://support.mozilla.org/en-US/kb/toolbar-firefox-android"><strong>voice search</strong></a><strong> </strong>on Android, and translations and <a href="https://blog.mozilla.org/en/firefox/shake-to-summarize/"><strong>Shake to Summarize</strong></a> on iOS, where available.</p>



<p>As Firefox adds new features, you can come back to your settings and choose what works for you.</p>



<h3><strong>Mobile browsing on your terms</strong></h3>



<p>As AI becomes a bigger part of the web, the question isn’t just what it can do. It’s how much control people have over it.</p>



<p>In Firefox mobile, AI can help make browsing easier, from finding what you need to understanding pages faster. But Firefox isn’t just adding AI features. We’re adding the controls, too.</p>



<p>Decide how AI fits into your experience. Try the features you want. Turn off the ones you don’t. Keep browsing on your terms.</p>



<a class="ft-c-inline-cta" href="https://www.firefox.com/browsers/mobile/app/?product=firefox&amp;campaign=fx146blog">
  <div class="ft-c-inline-cta__media">
  <img alt="" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2021/10/Visual-Guidelines-800x800.png" width="800"/>  </div>
  <div class="ft-c-inline-cta__content">
     <h4>Take Firefox with you</h4>      <span>Download Firefox mobile</span>   </div>
</a>



<p/>
<p>The post <a href="https://blog.mozilla.org/en/firefox/ai-controls-firefox-mobile/">AI controls are here for Firefox mobile</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-05-19T16:01:58Z</updated>
    <published>2026-05-19T16:01:58Z</published>
    <category term="Firefox"/>
    <category term="Firefox Features"/>
    <category term="homepage"/>
    <author>
      <name>Mozilla</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/en/</id>
      <link href="https://blog.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/en/" rel="alternate" type="text/html"/>
      <subtitle>News and Updates about Mozilla</subtitle>
      <title>The Mozilla Blog</title>
      <updated>2026-06-10T17:43:34Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://fxdx.dev/?p=544</id>
    <link href="https://fxdx.dev/firefox-webdriver-newsletter-151/" rel="alternate" type="text/html"/>
    <title>Firefox WebDriver Newsletter 151</title>
    <summary>Firefox 151 adds window management support, worker realms, enhanced touch pointer angle simulation, and several bug fixes for WebDriver BiDi and Marionette.</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p id="block-625ec41a-ebba-4559-8294-ab8d43d24728"><em>WebDriver is a remote control interface that enables introspection and control of user agents. As such, it can help developers to verify that their websites are working and performing well with all major browsers. The protocol is standardized by the<a href="https://www.w3.org/"> W3C</a> and consists of two separate specifications:<a href="https://w3c.github.io/webdriver/"> WebDriver classic</a> (HTTP) and the new<a href="https://w3c.github.io/webdriver-bidi/"> WebDriver BiDi</a> (Bi-Directional).</em></p>



<p id="block-dae47e7f-6eed-4378-93bf-87f83964774b"><em>This newsletter gives an overview of the work we’ve done as part of the Firefox 151 release cycle</em>.</p>



<h3>Contributions</h3>



<p id="block-0cd229aa-56a4-4acd-88c9-6c0aed1f91ef">Firefox is an open source project, and we are always happy to receive external code contributions to our WebDriver implementation. We want to give special thanks to everyone who filed issues, bugs and submitted patches.</p>



<p id="block-90d46142-b130-4359-9a16-b2e82ef91416">In Firefox 151, Armin Ulrich contributed a fix to WebDriver BiDi:</p>



<ul id="block-b10e4a7c-ea74-4805-9e31-4bb37551e682">
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031598">Removed an unused helper</a> from our MessageHandler codebase.</li>
</ul>



<p id="block-1dca3827-38c3-478d-a4b2-a1e39af880f5">WebDriver code is written in JavaScript, Python, and Rust so any web developer can contribute! Read<a href="https://firefox-source-docs.mozilla.org/setup/index.html"> how to setup the work environment</a> and check<a href="https://codetribute.mozilla.org/projects/automation"> the list of mentored issues</a> for Marionette, or the<a href="https://codetribute.mozilla.org/languages/javascript?project%3DWebDriver%2520BiDi"> list of mentored JavaScript bugs for WebDriver BiDi</a>. Join<a href="https://chat.mozilla.org/#/room/#webdriver:mozilla.org"> our chatroom</a> if you need any help to get started!</p>



<h3>General</h3>



<ul id="block-26cd7b2c-602f-4011-80e3-49c3b9457ff4">
<li>Added <a href="https://bugzil.la/2022644">support for <code>altitudeAngle</code> and <code>azimuthAngle</code> to pointer actions of subtype <code>touch</code></a>. These properties allow simulating touch interactions with precise angular orientation data, specifying the angle at which a pointer contacts a surface and its rotational direction.</li>



<li>Fixed a <a href="https://bugzil.la/2032387">bug where <code>UnknownError</code> DOM exceptions originating from content pages were incorrectly treated as internal WebDriver errors</a>.</li>
</ul>



<h3>WebDriver BiDi</h3>



<ul id="block-9c0f197b-12d2-4b9b-a460-95a9d16114b1">
<li><a href="https://bugzil.la/1855028">Implemented the <code>browser.setClientWindowState</code> command</a>. This command allows clients to change the OS-level window state of a browser window, such as maximized, minimized, fullscreen, or normal. It also allows repositioning and resizing the window.</li>



<li>Added <a href="https://bugzil.la/2016097">support for worker realms (for dedicated, shared and service workers) in the <code>script.getRealms</code> command</a>. The command now returns realm information for worker scripts in addition to window contexts.</li>



<li><a href="https://bugzil.la/1941813">Included the top-most stack frame in <code>log.entryAdded</code> events</a> for all Console API messages.</li>



<li><a href="https://bugzil.la/2005054">Improved the <code>text</code> field of the <code>log.entryAdded</code> event to better align with Firefox DevTools behavior</a> and Google Chrome WebDriver BiDi implementation.</li>



<li><a href="https://bugzil.la/1887118">Fixed network event cookies to include all properties</a>, not just <code>name</code> and <code>value</code>.</li>



<li><a href="https://bugzil.la/2009916">Fixed the <code>network.getData</code> command timing out for redirects.</a> </li>



<li><a href="https://bugzil.la/2023917">Fixed the <code>browsingContext.reload</code> command not resetting the location of a navigated iframe</a>.</li>



<li><a href="https://bugzil.la/1916463">Removed the empty <code>proxy</code> capability from the <code>session.new</code> command response</a> when no proxy is specified.</li>
</ul>



<h3>Marionette</h3>



<ul id="block-3583ed5f-8b9b-47b3-816c-eb4870315da6">
<li><a href="https://bugzil.la/2023978">Enabled browser window repositioning</a> on Linux Wayland in headless mode.</li>
</ul></div>
    </content>
    <updated>2026-05-19T14:00:00Z</updated>
    <published>2026-05-19T14:00:00Z</published>
    <category term="Release Notes"/>
    <category term="Remote Protocols"/>
    <category term="WebDriver BiDi"/>
    <category term="WebDriver Classic"/>
    <author>
      <name>Henrik Skupin</name>
    </author>
    <source>
      <id>https://fxdx.dev</id>
      <logo>https://fxdx.dev/files/2023/04/cropped-Fx-Browser-Developer-icon-fullColor-512-32x32.png</logo>
      <link href="https://fxdx.dev/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://fxdx.dev" rel="alternate" type="text/html"/>
      <subtitle>Your Go-To Resource for Web Development &amp; Compatibility</subtitle>
      <title>Firefox Developer Experience</title>
      <updated>2026-05-18T10:42:51Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=85623</id>
    <link href="https://blog.mozilla.org/en/firefox/shake-to-summarize-expansion/" rel="alternate" type="text/html"/>
    <link href="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/09/s2s-secretsprinkle-S2S-1.mov" length="4944599" rel="enclosure" type="video/quicktime"/>
    <title>Firefox’s Shake to Summarize expands to Android and new languages on iOS</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Don’t let bloated websites slow you down. When you just need the gist, scrolling through ads and filler content can turn a quick check into an endless scroll. Firefox’s Shake to Summarize feature solves that. We first launched it on iOS in English last September, earning a special mention in TIME’s Best Inventions of 2025 […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/shake-to-summarize-expansion/">Firefox’s Shake to Summarize expands to Android and new languages on iOS</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Don’t let bloated websites slow you down. When you just need the gist, scrolling through ads and filler content can turn a quick check into an endless scroll.</p>



<p>Firefox’s Shake to Summarize feature solves that. We first <a href="https://blog.mozilla.org/firefox/shake-to-summarize/">launched</a> it on iOS in English last September, earning a special mention in<a href="https://blog.mozilla.org/firefox/shake-to-summarize-time-best-inventions/"> TIME’s Best Inventions of 2025</a> and a strong response from users. Since then, we’ve expanded it to iOS users in German, French, Spanish, Portuguese, Italian and Japanese. Starting today, we’re bringing it to Android users in English, with more languages coming soon.</p>



<h3><strong>Get the gist in seconds</strong></h3>



<p>On any web page under 5,000 words, just <strong>shake your phone</strong> and a clean summary will instantly appear.</p>



<p>If you prefer tapping, you can select <strong>Summarize Page under More in the three-dot menu</strong>.</p>



<figure class="wp-block-video aligncenter"><video controls="controls" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/09/s2s-secretsprinkle-S2S-1.mov"/></figure>



<h3><strong>Powered by AI, protected by Firefox</strong> </h3>



<p>To keep your data secure, Shake to Summarize uses different technology depending on your device:</p>



<ul>
<li><strong>On iPhone 15 Pro or later (running iOS 26+):</strong> Your summary is generated right on your device using Apple Intelligence.</li>



<li><strong>On all other devices:</strong> Your text is sent securely to Mozilla’s cloud-based AI. We power this with Mistral-Small, an AI model carefully selected for its speed, efficiency, and alignment with an open internet</li>
</ul>



<p>You can read more about the<a href="https://blog.mozilla.org/en/firefox/firefox-ai/ai-powering-firefox-shake-to-summarize/"> </a>AI powering <a href="https://blog.mozilla.org/en/firefox/firefox-ai/ai-powering-firefox-shake-to-summarize/">Firefox’s Shake to Summarize here</a>.</p>



<h3><strong>Don’t settle for the default</strong></h3>



<p>Your phone’s default browser leaves you stuck scrolling through cluttered pages and content overload.</p>



<p>The Firefox mobile team is taking a purposeful approach – with smart tools that respect your time, privacy and choices. Download Firefox today to try Shake to Summarize, and get ready for even more features designed to help you move faster and protect your focus.</p>



<a class="ft-c-inline-cta" href="https://www.firefox.com/browsers/mobile/app/?product=firefox&amp;campaign=fx146blog">
  <div class="ft-c-inline-cta__media">
  <img alt="" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2021/10/Visual-Guidelines-800x800.png" width="800"/>  </div>
  <div class="ft-c-inline-cta__content">
     <h4>Take Firefox with you</h4>      <span>Download Firefox mobile</span>   </div>
</a>



<p/>
<p>The post <a href="https://blog.mozilla.org/en/firefox/shake-to-summarize-expansion/">Firefox’s Shake to Summarize expands to Android and new languages on iOS</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-05-19T07:00:27Z</updated>
    <published>2026-05-19T07:00:27Z</published>
    <category term="Firefox"/>
    <category term="Firefox Features"/>
    <category term="homepage"/>
    <author>
      <name>Mozilla</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/en/</id>
      <link href="https://blog.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/en/" rel="alternate" type="text/html"/>
      <subtitle>News and Updates about Mozilla</subtitle>
      <title>The Mozilla Blog</title>
      <updated>2026-06-10T17:43:34Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/</id>
    <link href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/" rel="alternate" title="Project goals update &#x2014; April 2026 (end of 2025H2)" type="text/html"/>
    <title xml:lang="en">Project goals update — April 2026 (end of 2025H2)</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>The 2025H2 Project Goal period has now concluded. Over these months, the Rust Project pursued <a href="https://rust-lang.github.io/rust-project-goals/2025h2/goals.html" rel="external">41 Project Goals</a>, 13 of which were designated as <a href="https://rust-lang.github.io/rust-project-goals/2025h2/goals.html#flagship-goals" rel="external">Flagship Goals</a>. This post contains curated updates on our progress since the <a href="https://blog.rust-lang.org/2026/01/05/project-goals-2025-december-update/" rel="external">last post</a> and the final status for each of the goals (many of which continue as part of the 2026 period). Full details for any particular goal are available in its <a href="https://github.com/rust-lang/rust-project-goals/issues?q=is%3Aissue%20label%3Aex-2025h2" rel="external">tracking issue</a>.</p>
<p>Thanks to everyone who contributed! &lt;3</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#table-of-contents"/>
Table of contents</h3>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-beyond-the">Flagship: Beyond the <code>&amp;</code></a>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#continue-experimentation-with-pin-ergonomics">Continue Experimentation with Pin Ergonomics</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#design-a-language-feature-to-solve-field-projections">Design a language feature to solve Field Projections</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#reborrow-traits">Reborrow traits</a></li>
</ul>
</li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-flexible-fast-er-compilation">Flagship: Flexible, fast(er) compilation</a>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#build-std">build-std</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#production-ready-cranelift-backend">Production-ready cranelift backend</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#promoting-parallel-front-end">Promoting Parallel Front End</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#relink-don-t-rebuild">Relink don't Rebuild</a></li>
</ul>
</li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-higher-level-rust">Flagship: Higher-level Rust</a>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#ergonomic-ref-counting-rfc-decision-and-preview">Ergonomic ref-counting: RFC decision and preview</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilize-cargo-script">Stabilize cargo-script</a></li>
</ul>
</li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-unblocking-dormant-traits">Flagship: Unblocking dormant traits</a>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#evolving-trait-hierarchies">Evolving trait hierarchies</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#in-place-initialization">In-place initialization</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#next-generation-trait-solver">Next-generation trait solver</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilizable-polonius-support-on-nightly">Stabilizable Polonius support on nightly</a></li>
</ul>
</li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#other-goal-updates">Other goal updates</a>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#add-a-team-charter-for-rustdoc-team">Add a team charter for rustdoc team</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#borrow-checking-in-a-mir-formality">Borrow checking in a-mir-formality</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#c-rust-interop-problem-space-mapping">C++/Rust Interop Problem Space Mapping</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#comprehensive-niche-checks-for-rust">Comprehensive niche checks for Rust</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#const-generics">Const Generics</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#continue-resolving-cargo-semver-checks-blockers-for-merging-into-cargo">Continue resolving <code>cargo-semver-checks</code> blockers for merging into cargo</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#develop-the-capabilities-to-keep-the-fls-up-to-date">Develop the capabilities to keep the FLS up to date</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#emit-retags-in-codegen">Emit Retags in Codegen</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#expand-the-rust-reference-to-specify-more-aspects-of-the-rust-language">Expand the Rust Reference to specify more aspects of the Rust language</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#finish-the-libtest-json-output-experiment">Finish the libtest json output experiment</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#finish-the-std-offload-module">Finish the std::offload module</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#getting-rust-for-linux-into-stable-rust-compiler-features">Getting Rust for Linux into stable Rust: compiler features</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#getting-rust-for-linux-into-stable-rust-language-features">Getting Rust for Linux into stable Rust: language features</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#implement-open-api-namespace-support">Implement Open API Namespace Support</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#mir-move-elimination">MIR move elimination</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#prototype-a-new-set-of-cargo-plumbing-commands">Prototype a new set of Cargo "plumbing" commands</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#prototype-cargo-build-analysis">Prototype Cargo build analysis</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#reflection-and-comptime">reflection and comptime</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rework-cargo-build-dir-layout">Rework Cargo Build Dir Layout</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#run-more-tests-for-gcc-backend-in-the-rust-s-ci">Run more tests for GCC backend in the Rust's CI</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rust-stabilization-of-memorysanitizer-and-threadsanitizer-support">Rust Stabilization of MemorySanitizer and ThreadSanitizer Support</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rust-vision-document">Rust Vision Document</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rustc-perf-improvements">rustc-perf improvements</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilize-public-private-dependencies">Stabilize public/private dependencies</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilize-rustdoc-doc-cfg-feature">Stabilize rustdoc <code>doc_cfg</code> feature</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#sve-and-sme-on-aarch64">SVE and SME on AArch64</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#type-system-documentation">Type System Documentation</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#unsafe-fields">Unsafe Fields</a></li>
</ul>
</li>
</ul>
<hr/>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-beyond-the"/>
Flagship: Beyond the <code>&amp;</code></h3>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#continue-experimentation-with-pin-ergonomics"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/389" rel="external">Continue Experimentation with Pin Ergonomics</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/frank-king" rel="external">Frank King</a></strong></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a>), <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/traviscross" rel="external">TC</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/pin-ergonomics.html" rel="external">Continued</a></li>
</ul>
<details>
3 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/frank-king" rel="external">Frank King</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/389#issuecomment-3963321984" rel="external">comment from 2026-02-26</a></p>
<blockquote>
<p>(Just come back from the Spring Festival)</p>
<ul>
<li>(locally, no PR yet): design and implement the borrow checking algorithms of <code>&amp;pin</code></li>
<li>Reviewed <a href="https://github.com/rust-lang/rust/pull/144537" rel="external">Add <code>Drop::pin_drop</code> for pinned drops</a>, to update the submodule <code>book</code></li>
<li>Reviewed <a href="https://github.com/rust-lang/rust/pull/149130" rel="external">Implement coercions between <code>&amp;pin (mut|const) T</code> and <code>&amp;(mut) T</code> when <code>T: Unpin</code></a>, to do some refactors according to the reviewed messages.</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/frank-king" rel="external">Frank King</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/389#issuecomment-4064499322" rel="external">comment from 2026-03-16</a></p>
<blockquote>
<ul>
<li>Merged <a href="https://github.com/rust-lang/rust/pull/149130" rel="external">Implement coercions between <code>&amp;pin (mut|const) T</code> and <code>&amp;(mut) T</code> when <code>T: Unpin</code></a>.</li>
<li>Opened draft PR <a href="https://github.com/rust-lang/rust/pull/153693" rel="external">Implement borrowck for <code>&amp;pin mut|const $place</code></a>. The implementation needs to be refined and self-reviewed before the community reviews.</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/frank-king" rel="external">Frank King</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/389#issuecomment-4258655696" rel="external">comment from 2026-04-16</a></p>
<blockquote>
<p>Self-reviewed <a href="https://github.com/rust-lang/rust/pull/153693" rel="external">Implement borrowck for <code>&amp;pin mut|const $place</code></a>. Found that the current approach of handling pinned borrows may be incorrect, as it failed to distinguish a pinned borrow from a coercion of a normal-to-pinned reference. The latter doesn't prevent a <code>T: Unpin</code> type from being moved, but the former does, which breaks the pin coercion test.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#design-a-language-feature-to-solve-field-projections"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/390" rel="external">Design a language feature to solve Field Projections</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/BennoLossin" rel="external">Benno Lossin</a></strong></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/tmandry" rel="external">Tyler Mandry</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/field-projections.html" rel="external">Continued</a></li>
</ul>
<details>
5 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/BennoLossin" rel="external">Benno Lossin</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3703190328" rel="external">comment from 2026-01-01</a></p>
<blockquote>
<ul>
<li>At the beginning of December, we set out to <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3621913656" rel="external">answer five important questions</a> regarding the virtual places approach. We discussed four questions and arrived at answers for three.
<ul>
<li>The first question we looked at was question 3 <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3644702112" rel="external">Canonical Projections</a>.</li>
<li>Next we looked at question 4 <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3659055067" rel="external">Non-Indirected Containers</a>.</li>
<li>As the final question we answered, we looked at question 1 <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3677624396" rel="external">Field-by-Field Projections vs One-Shot Projections</a>.</li>
<li>At the moment, we are investigating question 2 and I wrote a <a href="https://bennolossin.github.io/blog/field-projections/virtual-places-and-borrowck.html" rel="external">blog post</a> with a potential solution that still needs feedback.</li>
</ul>
</li>
<li>We started a <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3690808729" rel="external">Wiki Project</a> to consolidate our knowledge in one place.
<ul>
<li>We <a href="https://github.com/rust-lang/beyond-refs/pull/9" rel="external">implemented an algorithm</a> to determine the type of a place expression.</li>
</ul>
</li>
<li>Our plan is to continue this project goal in the next goal period.</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BennoLossin" rel="external">Benno Lossin</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3796971577" rel="external">comment from 2026-01-25</a></p>
<blockquote>
<p>Earlier this month, <a href="https://github.com/Nadrieril" rel="external">Nadrieril</a> <a href="https://github.com/dingxiangfei2009" rel="external">Ding Xiang Fei</a> and I held a meeting on autoref and method resolution in a world with field projections. This meeting resulted in a new page for the wiki on <a href="https://rust-lang.github.io/beyond-refs/autoref.html" rel="external">autoref</a>.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BennoLossin" rel="external">Benno Lossin</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3977436014" rel="external">comment from 2026-02-28</a></p>
<blockquote>
<p>The first pull request of the lang experiment has just been merged: rust-lang/rust#152730</p>
<p>This PR enables the use of the <code>field_of!</code> macro to obtain a unique type for each field of a struct, enum variant, tuple, or union. We call these types field representing types (FRTs). When the base type is a struct that is not <code>repr(packed)</code>, only contains <code>Sized</code> fields, this type automatically implements the <code>Field</code> trait that exposes some information about the field to the type system. The offset in bytes from the start of the struct, the type of the field and the type of the base type.</p>
<p>The feature is still incomplete and highly experimental. We also want to tackle the limitations in future PRs. For the moment this is enough to give us the ability to experiment with library versions of field projections and write functions that are generic over the fields of structs. For example one can write code like this:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>#</span><span>!</span><span>[</span><span>feature</span><span>(</span><span>field_projections</span><span>)</span><span>]</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">use</span><span class="z-entity z-name z-namespace"> std</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-namespace">field</span><span class="z-keyword z-operator">::</span><span>{</span><span class="z-entity z-name z-type">Field</span><span>,</span><span> field_of</span><span>}</span><span>;</span></span>
<span class="giallo-l"><span class="z-keyword">use</span><span class="z-entity z-name z-namespace"> std</span><span class="z-keyword z-operator">::</span><span>ptr</span><span>;</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">fn</span><span class="z-entity z-name z-function"> project_ref</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>,</span><span class="z-entity z-name z-type"> T</span><span>,</span><span class="z-entity z-name z-type"> F</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> Field</span><span>&lt;</span><span class="z-entity z-name z-type">Base</span><span class="z-keyword z-operator z-assignment z-keyword z-operator"> =</span><span class="z-entity z-name z-type"> T</span><span>&gt;</span><span>&gt;</span><span>(</span><span class="z-variable">r</span><span class="z-keyword z-operator">:</span><span class="z-keyword z-operator"> &amp;</span><span>'</span><span class="z-entity z-name z-type">a</span><span class="z-entity z-name z-type"> T</span><span>)</span><span class="z-keyword z-operator"> -&gt;</span><span class="z-keyword z-operator"> &amp;</span><span>'</span><span class="z-entity z-name z-type">a</span><span class="z-entity z-name z-namespace"> F</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Type</span><span> {</span></span>
<span class="giallo-l"><span class="z-punctuation z-definition z-comment z-comment">    //</span><span class="z-comment z-line z-double-slash z-comment"> SAFETY: the `Field` trait guarantees that this is sound.</span></span>
<span class="giallo-l"><span class="z-keyword">    unsafe</span><span> {</span><span class="z-keyword z-operator"> &amp;</span><span class="z-keyword z-operator">*</span><span class="z-entity z-name z-namespace">ptr</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-function">from_ref</span><span>(</span><span class="z-variable">r</span><span>)</span><span class="z-keyword z-operator">.</span><span class="z-entity z-name z-function">byte_add</span><span>(</span><span class="z-entity z-name z-namespace">F</span><span class="z-keyword z-operator">::</span><span class="z-constant z-other">OFFSET</span><span>)</span><span class="z-keyword z-operator">.</span><span class="z-entity z-name z-function">cast</span><span>(</span><span>)</span><span> }</span></span>
<span class="giallo-l"><span>}</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-storage z-type">struct</span><span class="z-entity z-name z-type"> Struct</span><span> {</span></span>
<span class="giallo-l"><span class="z-variable">    field</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> i32</span><span>,</span></span>
<span class="giallo-l"><span class="z-variable">    other</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> u32</span><span>,</span></span>
<span class="giallo-l"><span>}</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">fn</span><span class="z-entity z-name z-function"> main</span><span>(</span><span>)</span><span> {</span></span>
<span class="giallo-l"><span class="z-storage z-type">    let</span><span class="z-variable"> s</span><span class="z-keyword z-operator z-assignment z-keyword z-operator"> =</span><span class="z-entity z-name z-type"> Struct</span><span> {</span><span class="z-variable"> field</span><span class="z-keyword z-operator">:</span><span class="z-constant z-numeric"> 42</span><span>,</span><span class="z-variable"> other</span><span class="z-keyword z-operator">:</span><span class="z-constant z-numeric"> 24</span><span> }</span><span>;</span></span>
<span class="giallo-l"><span class="z-storage z-type">    let</span><span class="z-variable"> r</span><span class="z-keyword z-operator z-assignment z-keyword z-operator"> =</span><span class="z-keyword z-operator"> &amp;</span><span class="z-variable">s</span><span>;</span></span>
<span class="giallo-l"><span class="z-storage z-type">    let</span><span class="z-variable"> field</span><span class="z-keyword z-operator z-assignment z-keyword z-operator"> =</span><span class="z-entity z-name z-function"> project_ref</span><span class="z-keyword z-operator">::</span><span>&lt;</span><span class="z-variable">_</span><span>,</span><span class="z-entity z-name z-function"> field_of!</span><span>(</span><span class="z-entity z-name z-type">Struct</span><span>,</span><span class="z-variable"> field</span><span>)</span><span>&gt;</span><span>(</span><span class="z-variable">r</span><span>)</span><span>;</span></span>
<span class="giallo-l"><span class="z-storage z-type">    let</span><span class="z-variable"> other</span><span class="z-keyword z-operator z-assignment z-keyword z-operator"> =</span><span class="z-entity z-name z-function"> project_ref</span><span class="z-keyword z-operator">::</span><span>&lt;</span><span class="z-variable">_</span><span>,</span><span class="z-entity z-name z-function"> field_of!</span><span>(</span><span class="z-entity z-name z-type">Struct</span><span>,</span><span class="z-variable"> other</span><span>)</span><span>&gt;</span><span>(</span><span class="z-variable">r</span><span>)</span><span>;</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    println!</span><span>(</span><span class="z-punctuation z-definition z-string z-string">"</span><span class="z-string z-quoted z-string">field: </span><span class="z-string z-quoted z-string">{</span><span class="z-string z-quoted z-string">field</span><span class="z-string z-quoted z-string">}</span><span class="z-punctuation z-definition z-string z-string">"</span><span>)</span><span>;</span><span class="z-punctuation z-definition z-comment z-comment"> //</span><span class="z-comment z-line z-double-slash z-comment"> prints 42</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    println!</span><span>(</span><span class="z-punctuation z-definition z-string z-string">"</span><span class="z-string z-quoted z-string">other: </span><span class="z-string z-quoted z-string">{</span><span class="z-string z-quoted z-string">other</span><span class="z-string z-quoted z-string">}</span><span class="z-punctuation z-definition z-string z-string">"</span><span>)</span><span>;</span><span class="z-punctuation z-definition z-comment z-comment"> //</span><span class="z-comment z-line z-double-slash z-comment"> prints 24</span></span>
<span class="giallo-l"><span>}</span></span></code></pre>
<p>A very important feature of the types returned by <code>field_of!</code> is that you can implement traits for them if you own the base type. This allows anointing fields with information by extending the <code>Field</code> trait. For example, this allows encoding the property of being a structurally pinned field:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span class="z-keyword">use</span><span class="z-entity z-name z-namespace"> std</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-namespace">pin</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Pin</span><span>;</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">unsafe</span><span class="z-storage z-type"> trait</span><span class="z-entity z-name z-type"> PinnableField</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> Field</span><span> {</span></span>
<span class="giallo-l"><span class="z-storage z-type">    type</span><span class="z-entity z-name z-type"> StructuralRefMut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span></span>
<span class="giallo-l"><span class="z-keyword">    where</span></span>
<span class="giallo-l"><span class="z-variable z-language">        Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Type</span><span class="z-keyword z-operator">:</span><span> '</span><span class="z-entity z-name z-type">a</span><span>,</span></span>
<span class="giallo-l"><span class="z-variable z-language">        Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Base</span><span class="z-keyword z-operator">:</span><span> '</span><span class="z-entity z-name z-type">a</span><span>;</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">    fn</span><span class="z-entity z-name z-function"> project_mut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span><span>(</span><span class="z-variable">base</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> Pin</span><span>&lt;</span><span class="z-keyword z-operator">&amp;</span><span>'</span><span class="z-entity z-name z-type">a</span><span class="z-storage z-storage z-modifier"> mut</span><span class="z-variable z-language"> Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Base</span><span>&gt;</span><span>)</span><span class="z-keyword z-operator"> -&gt;</span><span class="z-variable z-language"> Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">StructuralRefMut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span></span>
<span class="giallo-l"><span class="z-keyword">    where</span></span>
<span class="giallo-l"><span class="z-variable z-language">        Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Type</span><span class="z-keyword z-operator">:</span><span> '</span><span class="z-entity z-name z-type">a</span><span>,</span></span>
<span class="giallo-l"><span class="z-variable z-language">        Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Base</span><span class="z-keyword z-operator">:</span><span> '</span><span class="z-entity z-name z-type">a</span><span>;</span></span>
<span class="giallo-l"><span>}</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">fn</span><span class="z-entity z-name z-function"> project_pinned</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>,</span><span class="z-entity z-name z-type"> T</span><span>,</span><span class="z-entity z-name z-type"> F</span><span>&gt;</span><span>(</span><span class="z-variable">r</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> Pin</span><span>&lt;</span><span class="z-keyword z-operator">&amp;</span><span>'</span><span class="z-entity z-name z-type">a</span><span class="z-storage z-storage z-modifier"> mut</span><span class="z-entity z-name z-type"> T</span><span>&gt;</span><span>)</span><span class="z-keyword z-operator"> -&gt;</span><span> &lt;</span><span class="z-entity z-name z-type">F</span><span class="z-keyword"> as</span><span class="z-entity z-name z-type"> PinnableField</span><span>&gt;</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">StructuralRefMut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span></span>
<span class="giallo-l"><span class="z-keyword">where</span></span>
<span class="giallo-l"><span class="z-entity z-name z-type">    F</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> PinnableField</span><span>&lt;</span><span class="z-entity z-name z-type">Base</span><span class="z-keyword z-operator z-assignment z-keyword z-operator"> =</span><span class="z-entity z-name z-type"> T</span><span>&gt;</span><span>,</span></span>
<span class="giallo-l"><span>{</span></span>
<span class="giallo-l"><span class="z-entity z-name z-type">    F</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-function">project_mut</span><span>(</span><span class="z-variable">r</span><span>)</span></span>
<span class="giallo-l"><span>}</span></span></code></pre>
<p>We can then implement this extra trait for all of the fields of our struct (and automate that with a proc-macro):</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span class="z-keyword">unsafe</span><span class="z-keyword"> impl</span><span class="z-entity z-name z-type"> PinnableField</span><span class="z-keyword z-control"> for</span><span class="z-entity z-name z-function"> field_of!</span><span>(</span><span class="z-entity z-name z-type">Struct</span><span>,</span><span class="z-variable"> field</span><span>)</span><span> {</span></span>
<span class="giallo-l"><span class="z-storage z-type">    type</span><span class="z-entity z-name z-type"> StructuralRefMut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span><span class="z-keyword z-operator z-assignment z-keyword z-operator"> =</span><span class="z-keyword z-operator"> &amp;</span><span>'</span><span class="z-entity z-name z-type">a</span><span class="z-storage z-storage z-modifier"> mut</span><span class="z-entity z-name z-type"> i32</span><span>;</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">    fn</span><span class="z-entity z-name z-function"> project_mut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span><span>(</span><span class="z-variable">base</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> Pin</span><span>&lt;</span><span class="z-keyword z-operator">&amp;</span><span>'</span><span class="z-entity z-name z-type">a</span><span class="z-storage z-storage z-modifier"> mut</span><span class="z-variable z-language"> Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Base</span><span>&gt;</span><span>)</span><span class="z-keyword z-operator"> -&gt;</span><span class="z-variable z-language"> Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">StructuralRefMut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span></span>
<span class="giallo-l"><span class="z-keyword">    where</span></span>
<span class="giallo-l"><span class="z-variable z-language">        Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Type</span><span class="z-keyword z-operator">:</span><span> '</span><span class="z-entity z-name z-type">a</span><span>,</span></span>
<span class="giallo-l"><span class="z-variable z-language">        Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Base</span><span class="z-keyword z-operator">:</span><span> '</span><span class="z-entity z-name z-type">a</span><span>,</span></span>
<span class="giallo-l"><span>    {</span></span>
<span class="giallo-l"><span class="z-storage z-type">        let</span><span class="z-variable"> base</span><span class="z-keyword z-operator z-assignment z-keyword z-operator"> =</span><span class="z-keyword"> unsafe</span><span> {</span><span class="z-entity z-name z-type"> Pin</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-function">into_inner_unchecked</span><span>(</span><span class="z-variable">base</span><span>)</span><span> }</span><span>;</span></span>
<span class="giallo-l"><span class="z-keyword z-operator">        &amp;</span><span class="z-storage z-storage z-modifier">mut</span><span class="z-variable"> base</span><span class="z-keyword z-operator">.</span><span>field</span></span>
<span class="giallo-l"><span>    }</span></span>
<span class="giallo-l"><span>}</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">unsafe</span><span class="z-keyword"> impl</span><span class="z-entity z-name z-type"> PinnableField</span><span class="z-keyword z-control"> for</span><span class="z-entity z-name z-function"> field_of!</span><span>(</span><span class="z-entity z-name z-type">Struct</span><span>,</span><span class="z-variable"> other</span><span>)</span><span> {</span></span>
<span class="giallo-l"><span class="z-storage z-type">    type</span><span class="z-entity z-name z-type"> StructuralRefMut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span><span class="z-keyword z-operator z-assignment z-keyword z-operator"> =</span><span class="z-entity z-name z-type"> Pin</span><span>&lt;</span><span class="z-keyword z-operator">&amp;</span><span>'</span><span class="z-entity z-name z-type">a</span><span class="z-storage z-storage z-modifier"> mut</span><span class="z-entity z-name z-type"> u32</span><span>&gt;</span><span>;</span></span>
<span class="giallo-l"><span class="z-punctuation z-definition z-comment z-comment">    //</span><span class="z-comment z-line z-double-slash z-comment"> u32 is `Unpin`, so this isn't doing anything special, but it highlights the pattern.</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">    fn</span><span class="z-entity z-name z-function"> project_mut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span><span>(</span><span class="z-variable">base</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> Pin</span><span>&lt;</span><span class="z-keyword z-operator">&amp;</span><span>'</span><span class="z-entity z-name z-type">a</span><span class="z-storage z-storage z-modifier"> mut</span><span class="z-variable z-language"> Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Base</span><span>&gt;</span><span>)</span><span class="z-keyword z-operator"> -&gt;</span><span class="z-variable z-language"> Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">StructuralRefMut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span></span>
<span class="giallo-l"><span class="z-keyword">    where</span></span>
<span class="giallo-l"><span class="z-variable z-language">        Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Type</span><span class="z-keyword z-operator">:</span><span> '</span><span class="z-entity z-name z-type">a</span><span>,</span></span>
<span class="giallo-l"><span class="z-variable z-language">        Self</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Base</span><span class="z-keyword z-operator">:</span><span> '</span><span class="z-entity z-name z-type">a</span><span>,</span></span>
<span class="giallo-l"><span>    {</span></span>
<span class="giallo-l"><span class="z-storage z-type">        let</span><span class="z-variable"> base</span><span class="z-keyword z-operator z-assignment z-keyword z-operator"> =</span><span class="z-keyword"> unsafe</span><span> {</span><span class="z-entity z-name z-type"> Pin</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-function">into_inner_unchecked</span><span>(</span><span class="z-variable">base</span><span>)</span><span> }</span><span>;</span></span>
<span class="giallo-l"><span class="z-keyword">        unsafe</span><span> {</span><span class="z-entity z-name z-type"> Pin</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-function">new_unchecked</span><span>(</span><span class="z-keyword z-operator">&amp;</span><span class="z-storage z-storage z-modifier">mut</span><span class="z-variable"> base</span><span class="z-keyword z-operator">.</span><span>other</span><span>)</span><span> }</span></span>
<span class="giallo-l"><span>    }</span></span>
<span class="giallo-l"><span>}</span></span></code></pre>
<p>Now you can safely obtain a pinned mutable reference to <code>other</code> and a normal mutable reference to <code>field</code> by calling the <code>project_pinned</code> function and supplying the correct FRT.</p>
<p>(<a href="https://play.rust-lang.org/?version=nightly&amp;mode=debug&amp;edition=2024&amp;gist=5b9494bd8f88aa4adf054f70abe16d9d" rel="external">playground link</a>)</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BennoLossin" rel="external">Benno Lossin</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-4099385451" rel="external">comment from 2026-03-20</a></p>
<blockquote>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#plan-for-2026"/>
Plan for 2026</h4>
<p>We have an updated plan for this goal in 2026 consisting of three major steps:</p>
<ul>
<li><code>a-mir-formality</code>,</li>
<li>Implementation,</li>
<li>Experimentation.</li>
</ul>
<p>Some of their subtasks depend on other subtasks for other steps. You can find the details in the <a href="https://github.com/rust-lang/rust/issues/145383" rel="external">updated tracking issue</a>. Here is a short rundown of each:</p>
<p><strong><code>a-mir-formality</code>:</strong> we want to create a formal model of the borrow checker changes we're proposing to ensure correctness. We also want to create a document explaining our model in a more human-friendly language. To really get started with this, we're blocked on the new expression based syntax in development by Niko.</p>
<p><strong>Implementation:</strong> at the same time, we can start implementing more parts in the compiler. We will continue to improve FRTs, while keeping in mind that we might remove them if they end up being unnecessary. They still pose for a useful feature, but they might be orthogonal to field projections. We plan to make small and incremental changes, starting with library additions. We also want to begin exploring potential desugarings, for which we will add some manual and low level macros. When we have that figured out, we can fast-track syntax changes. When we have a sufficiently mature formal model of the borrow checker integration, we will port it to the compiler. After further evaluation, we can think about removing the <code>incomplete_feature</code> flag.</p>
<p><strong>Experimentation:</strong> after each compiler or standard library change, we look to several projects to stress-test our ideas in real code. I will take care of experimentation in the Linux kernel, while <a href="https://github.com/tmandry" rel="external">Tyler Mandry</a> will be taking a look at testing field projections with <code>crubit</code>. <a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a> also has expressed eagerness of introducing them in the standard library; I will coordinate with him and the rest of t-libs-api to experiment there.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BennoLossin" rel="external">Benno Lossin</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-4178384770" rel="external">comment from 2026-04-02</a></p>
<blockquote>
<p>Yesterday, we held a t-lang design meeting on our current approach. <a href="https://github.com/Nadrieril" rel="external">Nadrieril</a> and I authored a <a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg" rel="external">design document</a> with the feedback of <a href="https://github.com/tmandry" rel="external">Tyler Mandry</a>, <a href="https://github.com/dingxiangfei2009" rel="external">Ding Xiang Fei</a>, <a href="https://github.com/Darksonn" rel="external">Alice Ryhl</a>, and <a href="https://github.com/nbdd0121" rel="external">Gary Guo</a>. In this document, we provided the motivation for this feature, what the look and feel of a solution fitting into the existing features of Rust is, and a comprehensive + compact introduction to our current approach based on virtual places.</p>
<p>The general reception was extremely positive. To give some concrete quotes from the meeting:</p>
<ul>
<li>Josh:
<blockquote>
<p>I adore this! I love how orthogonal it is, and how impactful and universal it is. I anticipate this becoming a beloved, <em>pervasive</em> feature of Rust.</p>
<p>Places and projection seem important enough to me that they're worth giving one of our precious remaining ASCII sigils to, and <code>@</code> is nicely evocative of a place (something is <em>at</em> a place). So to the extent the final syntax benefits from a sigil, :+1: for giving this <code>@</code>. (See some feedback below on the details, though.)</p>
</blockquote>
</li>
<li>TC:
<blockquote>
<p>Love it. High concept. As I said in the last meeting:</p>
<blockquote>
<p>I particularly like language features that reduce the need for library surface area, and this is one of those.</p>
</blockquote>
<p>There are, of course, many details to resolve and understand further, e.g., with respect to migration issues, interaction with <code>const</code>, <code>async</code>, and other effect-like things, etc. I'm looking forward to seeing the formalization work.</p>
</blockquote>
</li>
<li>tmandry:
<blockquote>
<p>What I love about this direction is how effectively it builds on what Rust already has. I love to see designs that reinforce our existing concepts while pushing them in directions that make them more expressive.</p>
</blockquote>
</li>
<li>Jack:
<blockquote>
<p>Whoo boy. This is great. There's so much here that I'm not exactly sure where to begin and what to comment on. I think this is the type of thing that we will only <em>really</em> be able to figure out the nitty gritty details and ergonomics only after some amount of experimentation.</p>
</blockquote>
</li>
</ul>
<p>There are a few takeaways from this meeting:</p>
<ul>
<li>Mark <a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#From-author-Concerns-about-moving-forward" rel="external">raised the concern</a> that t-libs should be more involved in reviewing the experimental traits that we intend to add. Ensuring that we don't accidentally stabilize or expose some behavior, have sufficient documentation on our experimental traits, and that t-libs is in the loop of this feature in general.
<ul>
<li>Mark offered to review PRs and I will be tagging him in those.</li>
</ul>
</li>
<li>Jack <a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Jack" rel="external">raised the concern</a> that increasing the cognitive load for the 95% use-case should be avoided. Making the right choice between <code>@</code> and <code>&amp;</code> might be challenging for users.
<ul>
<li>We <a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#From-author-Ergonomics-of-raw-pointers" rel="external">discussed this point more in the meeting</a> and concluded with that we need to do some experimentation, possibly utilizing the user research team. We will of course keep this in mind and revisit it later when we have a partially working implementation.</li>
</ul>
</li>
<li>TC requested that we publish our fine-grained design axioms, essentially the list of things we go through when considering a modification of our proposal.
<ul>
<li>I will write an update on this issue explaining exactly those.</li>
</ul>
</li>
</ul>
<p>Aside from the concerns and directly actionable items, the meeting also covered design questions/comments that we want to take a look at in the coming weeks/months:</p>
<ul>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Support-ReadWrite-of-non-PlaceTarget" rel="external">Can we support reads/writes of different types?</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Re-assembling" rel="external">Can we support re-assembly of wrapper types, so going from <code>Cell&lt;[T]&gt;</code> to <code>[Cell&lt;T&gt;]</code>?</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Trait-for-reading-discriminant-for-pattern-matching" rel="external">The <code>PlaceDiscriminant</code> trait needs to be carefully designed</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Name-conflicts" rel="external">How do we handle naming conflicts &amp; ensure SemVer evolution of library types implementing our traits?</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Projecting-through-Option-and-Result" rel="external">Can we support projecting through <code>Option</code>, so e.g. <code>&amp;Option&lt;Struct&gt;</code> to <code>Option&lt;&amp;Field&gt;</code>?</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Projecting-through-Option-and-Result" rel="external">Can we support a pointer that carries alignment information &amp; which is updated on projections?</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Projecting-through-Option-and-Result" rel="external">What compatibility with effects do we need or want to support?</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#What-doors-are-we-closing" rel="external">What doors on future ergonomic improvements of pointers are we closing by having field projections?</a></li>
</ul>
<p>Thanks to everyone who participated in the meeting!</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#reborrow-traits"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/399" rel="external">Reborrow traits</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/aapoalas" rel="external">Aapo Alasuutari</a></strong></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a>), <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/tmandry" rel="external">Tyler Mandry</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/reborrow-traits.html" rel="external">Continued</a></li>
</ul>
<details>
1 detailed update available.
<ul>
<li>
<p><strong><a href="https://github.com/aapoalas" rel="external">Aapo Alasuutari</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/399#issuecomment-3977652772" rel="external">comment from 2026-02-28</a></p>
<blockquote>
<p><a href="https://github.com/rust-lang/rust/pull/151753" rel="external">PR</a> open to get the first working version of the <code>Reborrow</code> and <code>CoerceShared</code> traits merged.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#blockers"/>
Blockers</h4>
<p>Currently "blocked" on PR review, and of course my (and Ding's) work to fix all review issues.</p>
<p>The review has brought up an opportunity to replace <code>Rvalue::Ref</code> / <code>ExprKind::Ref</code> with a more generalised variant that could encompass both references and user-defined references. This would be powerful, but it would be a very big and scary change. If this turns out to be a blocking issue for reviewers, then this will block the goal for the foreseeable future as the PR then starts on a massive refactoring.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#help-wanted"/>
Help wanted</h4>
<p>The PR currently does not include derive traits, but we'd really want them. Instead of these:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span class="z-keyword">impl</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span><span class="z-entity z-name z-type"> Reborrow</span><span class="z-keyword z-control"> for</span><span class="z-entity z-name z-type"> CustomMarker</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span><span> {</span><span>}</span></span>
<span class="giallo-l"><span class="z-keyword">impl</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span><span class="z-entity z-name z-type"> CoerceShared</span><span>&lt;</span><span class="z-entity z-name z-type">CustomMarkerRef</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span><span>&gt;</span><span class="z-keyword z-control"> for</span><span class="z-entity z-name z-type"> CustomMarker</span><span>&lt;</span><span class="z-variable">a</span><span>'</span><span>&gt;</span><span> {</span><span>}</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-keyword">impl</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>,</span><span class="z-entity z-name z-type"> T</span><span>&gt;</span><span class="z-entity z-name z-type"> Reborrow</span><span class="z-keyword z-control"> for</span><span class="z-entity z-name z-type"> CustomMut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>,</span><span class="z-entity z-name z-type"> T</span><span>&gt;</span><span> {</span><span>}</span></span>
<span class="giallo-l"><span class="z-keyword">impl</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>,</span><span class="z-entity z-name z-type"> T</span><span>&gt;</span><span class="z-entity z-name z-type"> CoerceShared</span><span>&lt;</span><span class="z-entity z-name z-type">CustomRef</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>,</span><span class="z-entity z-name z-type"> T</span><span>&gt;</span><span>&gt;</span><span class="z-keyword z-control"> for</span><span class="z-entity z-name z-type"> CustomMut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>,</span><span class="z-entity z-name z-type"> T</span><span>&gt;</span><span> {</span><span>}</span></span></code></pre>
<p>we'd prefer to have something like this:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>#</span><span>[</span><span>derive</span><span>(</span><span class="z-entity z-name z-type">Reborrow</span><span>,</span><span class="z-entity z-name z-type"> CoerceShared</span><span>(</span><span class="z-entity z-name z-type">CustomMarkerRef</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-storage z-type">struct</span><span class="z-entity z-name z-type"> CustomMarker</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>&gt;</span><span> {</span><span class="z-keyword z-operator"> ...</span><span> }</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>#</span><span>[</span><span>derive</span><span>(</span><span class="z-entity z-name z-type">Reborrow</span><span>,</span><span class="z-entity z-name z-type"> CoerceShared</span><span>(</span><span class="z-entity z-name z-type">CustomRef</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-storage z-type">struct</span><span class="z-entity z-name z-type"> CustomMut</span><span>&lt;</span><span>'</span><span class="z-entity z-name z-type">a</span><span>,</span><span class="z-entity z-name z-type"> T</span><span>&gt;</span><span> {</span><span class="z-keyword z-operator"> ...</span><span> }</span></span></code></pre>
<p>If anyone feels like picking up this thread, that'd be awesome: the derive macros do not need to really perform any validity checking, as the trait itself will do that.</p>
<p>If the PR merges soon, then public testing and exploration of the traits will be the next big thing. Likely concurrently with that the massive refactoring to generalise <code>Rvalue::Ref</code> / <code>ExprKind::Ref</code>.</p>
</blockquote>
</li>
</ul>
</details>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-flexible-fast-er-compilation"/>
Flagship: Flexible, fast(er) compilation</h3>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#build-std"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/274" rel="external">build-std</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/davidtwco" rel="external">David Wood</a></strong>, <a href="https://github.com/adamgemmell" rel="external">Adam Gemmell</a></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/cargo" rel="external">cargo</a> (<a href="https://github.com/ehuss" rel="external">Eric Huss</a>), <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/davidtwco" rel="external">David Wood</a>), <a href="https://github.com/rust-lang/libs-team" rel="external">libs</a> (<a href="https://github.com/Amanieu" rel="external">Amanieu d'Antras</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/build-std.html" rel="external">Continued</a></li>
</ul>
<details>
4 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/davidtwco" rel="external">David Wood</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/274#issuecomment-3754440280" rel="external">comment from 2026-01-15</a></p>
<blockquote>
<p><a href="https://github.com/rust-lang/rfcs/pull/3873" rel="external">rust-lang/rfcs#3873</a> has been merged and an FCP has been started on <a href="https://github.com/rust-lang/rfcs/pull/3874" rel="external">rust-lang/rfcs#3874</a> and <a href="https://github.com/rust-lang/rfcs/pull/3875" rel="external">rust-lang/rfcs#3875</a> - those both have some feedback for me to respond to that I'll get to as soon as I can.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/davidtwco" rel="external">David Wood</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/274#issuecomment-3914113179" rel="external">comment from 2026-02-17</a></p>
<blockquote>
<p>No major updates this cycle - we're still working through feedback on <a href="https://github.com/rust-lang/rfcs/pull/3874" rel="external">rust-lang/rfcs#3874</a> and <a href="https://github.com/rust-lang/rfcs/pull/3875" rel="external">rust-lang/rfcs#3875</a> and prototyping the implementation to be prepared.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/davidtwco" rel="external">David Wood</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/274#issuecomment-4073778569" rel="external">comment from 2026-03-17</a></p>
<blockquote>
<p>Update this cycle is the same as last time - <a href="https://github.com/rust-lang/rfcs/pull/3874" rel="external">rust-lang/rfcs#3874</a> and <a href="https://github.com/rust-lang/rfcs/pull/3875" rel="external">rust-lang/rfcs#3875</a> are progressing, with feedback being addressed and checkboxes checked, and we're still working out what the implementation would look like.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/davidtwco" rel="external">David Wood</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/274#issuecomment-4245212089" rel="external">comment from 2026-04-14</a></p>
<blockquote>
<p><a href="https://github.com/rust-lang/rfcs/pull/3874" rel="external">rust-lang/rfcs#3874</a> has finished FCP and is due to be merged any day now. I'm working on resolving the remaining open comments on <a href="https://github.com/rust-lang/rfcs/pull/3875" rel="external">rust-lang/rfcs#3875</a> and then intend to nudge the reviewers to have a look and check their boxes or leave concerns.</p>
<p><a href="https://github.com/adamgemmell" rel="external">Adam Gemmell</a> has opened <a href="https://github.com/rust-lang/cargo/pull/16675" rel="external">rust-lang/cargo#16675</a> with an early sketch of some of the core changes that build-std would require and is working with the Cargo team to address feedback and work out how to proceed with the implementation.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#production-ready-cranelift-backend"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/397" rel="external">Production-ready cranelift backend</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/folkertdev" rel="external">Folkert de Vries</a></strong>, <a href="https://github.com/bjorn3" rel="external">bjorn3</a>, <a href="https://trifectatech.org/" rel="external">Trifecta Tech Foundation</a></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/bjorn3" rel="external">bjorn3</a>)</li>
<li><strong>Status:</strong> Not completed (<a href="https://github.com/rust-lang/rust-project-goals/issues/397#issuecomment-3597627406" rel="external">lack of funding</a>)</li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#promoting-parallel-front-end"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/121" rel="external">Promoting Parallel Front End</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/SparrowLii" rel="external">Sparrow Li</a></strong></li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/parallel-front-end.html" rel="external">Continued</a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#relink-don-t-rebuild"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/400" rel="external">Relink don't Rebuild</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/yaahc" rel="external">Jane Lusby</a></strong>, <a href="https://github.com/dropbear32" rel="external">@dropbear32</a>, <a href="https://github.com/osiewicz" rel="external">@osiewicz</a></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/cargo" rel="external">cargo</a> (<a href="https://github.com/weihanglo" rel="external">Weihang Lo</a>), <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a>)</li>
<li><strong>Status:</strong> Not completed (<a href="https://rust-lang.zulipchat.com/#narrow/channel/131828-t-compiler/topic/2025H2.20Goal.20Review/near/536084528" rel="external">note</a>)</li>
</ul>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-higher-level-rust"/>
Flagship: Higher-level Rust</h3>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#ergonomic-ref-counting-rfc-decision-and-preview"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/107" rel="external">Ergonomic ref-counting: RFC decision and preview</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a></strong>, <a href="https://github.com/spastorino" rel="external">Santiago Pastorino</a></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/spastorino" rel="external">Santiago Pastorino</a>), <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/ergonomic-rc.html" rel="external">Continued</a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilize-cargo-script"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/119" rel="external">Stabilize cargo-script</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/epage" rel="external">Ed Page</a></strong></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/cargo" rel="external">cargo</a> (<a href="https://github.com/epage" rel="external">Ed Page</a>), <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a>), <a href="https://www.rust-lang.org/governance/teams" rel="external">lang-docs</a> (<a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/cargo-script.html" rel="external">Continued</a></li>
</ul>
<details>
3 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/epage" rel="external">Ed Page</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/119#issuecomment-3750134602" rel="external">comment from 2026-01-14</a></p>
<blockquote>
<p><a href="https://github.com/rust-lang/rust/pull/146377" rel="external">#146377</a> has been decided and merged.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#blockers-1"/>
Blockers</h4>
<ul>
<li>T-lang discussing CR / text direction feedback: <a href="https://github.com/rust-lang/rust/pull/148051#issuecomment-3638326490" rel="external">comment</a></li>
<li>T-rustdoc deciding on and implementing how they want frontmatter handled in doctests</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/epage" rel="external">Ed Page</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/119#issuecomment-3897507244" rel="external">comment from 2026-02-13</a></p>
<blockquote>
<ul>
<li>FCP has ended on <a href="https://github.com/rust-lang/rust/pull/148051" rel="external">frontmatter support</a>, just awaiting merge</li>
<li><a href="https://github.com/rust-lang/cargo/pull/16569" rel="external">Cargo script</a> has entered FCP</li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#blockers-2"/>
Blockers</h4>
<ul>
<li>Potential issues around edition, see <a href="https://github.com/rust-lang/rust/issues/152254" rel="external">Cargo script edition policy (lang/edition aspects)</a>.</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/epage" rel="external">Ed Page</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/119#issuecomment-4067313342" rel="external">comment from 2026-03-16</a></p>
<blockquote>
<p>Cargo's FCP has ended.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#blockers-3"/>
Blockers</h4>
<ul>
<li><a href="https://github.com/rust-lang/rust/issues/152254" rel="external">Cargo script edition policy (lang/edition aspects)</a></li>
</ul>
</blockquote>
</li>
</ul>
</details>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-unblocking-dormant-traits"/>
Flagship: Unblocking dormant traits</h3>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#evolving-trait-hierarchies"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/393" rel="external">Evolving trait hierarchies</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/cramertj" rel="external">Taylor Cramer</a></strong> and others</li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/cramertj" rel="external">Taylor Cramer</a>), <a href="https://github.com/rust-lang/types-team" rel="external">types</a> (<a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a>)</li>
<li><strong>Status:</strong> Superseded by the <a href="https://rust-lang.github.io/rust-project-goals/2026/supertrait-auto-impl.html" rel="external">Implement Supertrait <code>auto impl</code></a> and <a href="https://rust-lang.github.io/rust-project-goals/2026/arbitrary-self-types.html" rel="external">Arbitrary Self Types</a> 2026 goals</li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#in-place-initialization"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/395" rel="external">In-place initialization</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/Darksonn" rel="external">Alice Ryhl</a></strong>, <a href="https://github.com/BennoLossin" rel="external">Benno Lossin</a>, <a href="https://github.com/compiler-errors" rel="external">Michael Goulet</a>, <a href="https://github.com/cramertj" rel="external">Taylor Cramer</a>, <a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a>, <a href="https://github.com/nbdd0121" rel="external">Gary Guo</a>, <a href="https://github.com/yoshuawuyts" rel="external">Yoshua Wuyts</a></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/cramertj" rel="external">Taylor Cramer</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/in-place-init.html" rel="external">Continued</a></li>
</ul>
<details>
1 detailed update available.
<ul>
<li>
<p><strong><a href="https://github.com/Darksonn" rel="external">Alice Ryhl</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/395#issuecomment-3828006712" rel="external">comment from 2026-01-31</a></p>
<blockquote>
<p>A <a href="https://github.com/rust-lang/rust-project-goals/pull/477" rel="external">proposal</a> to continue this goal in the next goal period was merged.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#next-generation-trait-solver"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/113" rel="external">Next-generation trait solver</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/lcnr" rel="external">lcnr</a></strong>, <a href="https://github.com/BoxyUwU" rel="external">Boxy</a>, <a href="https://github.com/compiler-errors" rel="external">Michael Goulet</a></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/types-team" rel="external">types</a> (<a href="https://github.com/lcnr" rel="external">lcnr</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/next-solver.html" rel="external">Continued</a></li>
</ul>
<details>
1 detailed update available.
<ul>
<li>
<p><strong><a href="https://github.com/lcnr" rel="external">lcnr</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/113#issuecomment-3767714713" rel="external">comment from 2026-01-19</a></p>
<blockquote>
<p>There hasn't been too much progress over the last few weeks and I've been mostly taking a Christmas break. <a href="https://github.com/nnethercote" rel="external">Nicholas Nethercote</a> has been looking into the performance of the new trait solver, cleaning up canonicalization and slightly improving its performance: <a href="https://github.com/rust-lang/rust/pull/150748" rel="external">PR 1</a> and <a href="https://github.com/rust-lang/rust/pull/150859" rel="external">PR 2</a>.</p>
<p><a href="https://github.com/ShoyuVanilla" rel="external">Shoyu Vanilla</a> looked into <a href="https://github.com/rust-lang/trait-system-refactor-initiative/issues/251" rel="external">ICE from mir validation on unsizing in opendal</a> and uncovered the underlying bug there. While this issue also affects the old solver and the proper fix for it requires where-bounds on binders, we can work around this bug in the trait solver for now and intend to do so.</p>
<p>We've started another crater run with all our recent changes and <a href="https://github.com/adwinwhite" rel="external">adwin</a> has started to triage it, uncovering one new issue up until now. Intend to continue going through that over the next few weeks.</p>
<p>There's also a lot in-progress work going on. I am collaborating with <a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a> to specify and later RFC the cycle semantics of Rust. <a href="https://github.com/fmease" rel="external">León Orell Valerian Liehr</a> is working on a <a href="https://github.com/rust-lang/rust/pull/149019" rel="external">replacement for the rustdoc's auto trait impl synthesis</a>. <a href="https://github.com/tiif" rel="external">tiif</a> is working on a fix a <a href="https://github.com/rust-lang/trait-system-refactor-initiative/issues/159" rel="external">MIR borrowck unsoundness</a>. <a href="https://github.com/ShoyuVanilla" rel="external">Shoyu Vanilla</a> and I are improving the way we propagate inference constraints from the expected return type to function arguments, fixing <a href="https://github.com/rust-lang/trait-system-refactor-initiative/issues/259" rel="external">this issue</a>.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilizable-polonius-support-on-nightly"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/118" rel="external">Stabilizable Polonius support on nightly</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/lqd" rel="external">Rémy Rakic</a></strong>, <a href="https://github.com/amandasystems" rel="external">Amanda Stjerna</a>, <a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/types-team" rel="external">types</a> (<a href="https://github.com/jackh726" rel="external">Jack Huey</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/polonius.html" rel="external">Continued</a></li>
</ul>
<details>
2 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/lqd" rel="external">Rémy Rakic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/118#issuecomment-3824711064" rel="external">comment from 2026-01-30</a></p>
<blockquote>
<p>This month's update:</p>
<ul>
<li><a href="https://github.com/tiif" rel="external">tiif</a> is making progress on <a href="https://github.com/rust-lang/trait-system-refactor-initiative/issues/159" rel="external">normalizing opaques while computing implied bounds</a></li>
<li>we discussed how to investigate and fix the remaining correctness issues in Tage's work, to be able to evaluate it more accurately: in particular around variance and bidirectional edges, and without the reliance on NLL (having computed region values / errors)</li>
<li>we've tried to see if it'd be possible to remove the cfg region elements</li>
<li>Amanda is still working on her two papers, one about the current borrow checker and one about the work on Polonius. Her major PR for the restructuring of placeholder handling during region inference is stalled due to a conflict with further trait solver developments and may have to be abandoned. Work with the larger types team is ongoing and smaller patches/refactorings/improvements are being landed in the meantime.</li>
<li><a href="https://github.com/rust-lang/rust/pull/149639" rel="external">#149639</a> has now landed, and <a href="https://github.com/rust-lang/rust/pull/150551" rel="external">#150551</a> is still in review</li>
<li>I've also fixed more small inefficiencies (computing boring/relevant locals on-demand in diagnostics, removed conversions between locations and points, etc) building on top of the previous PRs (so they need to be reviewed first)</li>
<li>I've looked at crates.io again with the alpha, to find functions that are slower than with NLLs. AFAICT the worst case there is 60% for a 5KLOC function with 42K loans, 255K statements, and 125K outlives constraints. I'll see what we can do with this. Small composable functions is still good advice.</li>
<li>there seem to be optimization opportunities to 1. limit propagation to the smaller number of blocks that could be affected by bidirectional edges, 2. for unifying invariant lifetimes of live locals that are assigned at most once (à la use-def chains), 3. for invalidations that are just the activation of a reservation</li>
<li>we discussed possible plans to gather actual statistics, using the infrastructure that was created for the Metrics project</li>
<li>we're also preparing the new project goal for this year, where we'll want to stabilize the alpha 🤞</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/lqd" rel="external">Rémy Rakic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/118#issuecomment-3977551969" rel="external">comment from 2026-02-28</a></p>
<blockquote>
<p>We had a bit less time this month, the update will be shorter, but still meaningful I hope:</p>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/150551" rel="external">#150551</a> has landed, and it feels stabilizable. To me, this part of the goal is achieved.</li>
<li>still, "stabilizable" is not <em>stable</em>, and there is more work to do. We plan to stabilize this year, and the <a href="https://rust-lang.github.io/rust-project-goals/2026/polonius.html" rel="external">project goal proposal for 2026</a> tracks how.</li>
<li><a href="https://github.com/tiif" rel="external">tiif</a> is still deep in <a href="https://github.com/rust-lang/rust/pull/152051" rel="external">#152051</a>, and <code>a-mir-formality</code> work with Niko and I.</li>
<li>Amanda has opened a few cleanup PRs (<a href="https://github.com/rust-lang/rust/pull/152438" rel="external">#152438</a>, and <a href="https://github.com/rust-lang/rust/pull/152579" rel="external">#152579</a>), and <a href="https://github.com/rust-lang/rust/pull/151863" rel="external">#151863</a> has landed already. She also has started looking into Tage's old PR to see if we can fix it, benchmark it more accurately, and see the cool parts there that we could be using.</li>
<li>Jack is possibly going to have some time to work with us this year! His help will be very welcome, especially as I will have less time available myself.</li>
<li>we'll be tracking the opaque type region liveness soundness issue in <a href="https://github.com/rust-lang/rust/issues/153215" rel="external">#153215</a>, and I've added <a href="https://github.com/rust-lang/rust/pull/153216" rel="external">a couple tests</a>, in case <a href="https://github.com/tiif" rel="external">tiif</a>'s PR or anything that impacts them lands.</li>
<li>some of the tiny cleanups I mentioned last time have also landed in <a href="https://github.com/rust-lang/rust/pull/152587" rel="external">#152587</a>.</li>
</ul>
</blockquote>
</li>
</ul>
</details>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#other-goal-updates"/>
Other goal updates</h3>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#add-a-team-charter-for-rustdoc-team"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/387" rel="external">Add a team charter for rustdoc team</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/GuillaumeGomez" rel="external">Guillaume Gomez</a></strong></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/rust" rel="external">rustdoc</a> (<a href="https://github.com/GuillaumeGomez" rel="external">Guillaume Gomez</a>)</li>
<li><strong>Status:</strong> Completed</li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#borrow-checking-in-a-mir-formality"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/122" rel="external">Borrow checking in a-mir-formality</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a></strong>, <a href="https://github.com/tiif" rel="external">tiif</a></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/types-team" rel="external">types</a> (<a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/a-mir-formality.html" rel="external">Continued</a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#c-rust-interop-problem-space-mapping"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/388" rel="external">C++/Rust Interop Problem Space Mapping</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/JoelMarcey" rel="external">Joel Marcey</a></strong></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a>), <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/tmandry" rel="external">Tyler Mandry</a>), <a href="https://github.com/rust-lang/libs-team" rel="external">libs</a> (<a href="https://github.com/dtolnay" rel="external">David Tolnay</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/interop-problem-map.html" rel="external">Continued</a></li>
</ul>
<details>
5 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/JoelMarcey" rel="external">Joel Marcey</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/388#issuecomment-3774860319" rel="external">comment from 2026-01-20</a></p>
<blockquote>
<p>The Rust Foundation is opening up a short-term, approximately 3-month, contracting role to assist in our <a href="https://rustfoundation.org/interop-initiative/" rel="external">Rust/C++ Interop</a> initiative. The primary work and deliverables for the role will be to make substantial progress on the <a href="https://rust-lang.github.io/rust-project-goals/2025h2/interop-problem-map.html" rel="external">Problem Space Mapping Rust Project Goal</a> by collecting discrete problem statements and offering up recommendations on the work that should follow based upon the problems that you found.</p>
<p>If you are interested in how programming languages interoperate, are curious in understanding the problems therein, and are have a passion to think about how those problems may be resolved for the betterment of interop, then this work may be for you.</p>
<p>An ideal candidate will have experience with Rust programming. Having experience in C++ is strongly preferred as well. If you have direct experience with actual engineering that required interoperating between Rust and C++ codebases, that's even better.</p>
<p>If you are interested, please <a href="https://github.com/JoelMarcey" rel="external">email me</a> (email address found in my GitHub profile) or contact me directly on Zulip by Tuesday, January 27 and we can take it from there to see if there may be a potential fit for further discussion.</p>
<p>Thank you.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/JoelMarcey" rel="external">Joel Marcey</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/388#issuecomment-3827224576" rel="external">comment from 2026-01-31</a></p>
<blockquote>
<p>The effort to fill the <a href="https://github.com/rust-lang/rust-project-goals/issues/388#issuecomment-3774860319" rel="external">contracting role </a> to support this project goal is in the process winding down. The interview and discussion process is nearly complete. We expect to make a final decision for the role in early February.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/teor2345" rel="external">teor</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/388#issuecomment-3970777014" rel="external">comment from 2026-02-27</a></p>
<blockquote>
<p>Hi, I'm the new contractor on the interop problem space mapping project goal.</p>
<p>In the last week and a half, I've:</p>
<ul>
<li>added <a href="https://github.com/rustfoundation/interop-initiative/tree/main/problem-space" rel="external">some draft high-level problem statement summaries</a></li>
<li>started mapping out <a href="https://github.com/rustfoundation/interop-initiative/issues" rel="external">interop use cases</a></li>
<li>added relationships between problems/use cases and <a href="https://github.com/rustfoundation/interop-initiative/pull/10" rel="external">existing project goals &amp; unstable compiler features</a></li>
</ul>
<p>Next step is prioritising a few of the use cases, then working on related problem statements in more detail.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#blockers-4"/>
Blockers</h4>
<p>Nothing at the moment, still working through the high level mapping of the problem space.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#help-wanted-1"/>
Help wanted</h4>
<p>Suggestions for more interop use cases would be very welcome, just open a discussion in <a href="https://rust-lang.zulipchat.com/#narrow/channel/427678-t-lang.2Finterop" rel="external">t-lang/interop</a> and I'll turn it into a ticket. Or go ahead and <a href="https://github.com/rustfoundation/interop-initiative/issues" rel="external">open a use case ticket directly</a>.</p>
<p>I'll post an update here every few weeks, you can follow <a href="https://rust-lang.zulipchat.com/#narrow/channel/427678-t-lang.2Finterop/topic/Interop.20Problem.20Space.20Mapping.20-.20Weekly.20Updates/with/576165231" rel="external">more detailed weekly updates on Zulip</a>.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/teor2345" rel="external">teor</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/388#issuecomment-4151397648" rel="external">comment from 2026-03-30</a></p>
<blockquote>
<p>In the last month, I've:</p>
<ul>
<li>met with the lang team, Crubit team, and <code>cxx</code> author, and Joel and Mara have met with the C++ standards working group</li>
<li>expanded <a href="https://github.com/rustfoundation/interop-initiative/tree/main/problem-space" rel="external">some draft high-level problem statement summaries</a>, and added code examples</li>
<li>added 6 new <a href="https://github.com/rustfoundation/interop-initiative/issues" rel="external">interop use cases</a></li>
<li>added more relationships between problems/use cases and existing project goals &amp; unstable compiler features</li>
<li>prepared for the Rust All Hands, and started mentoring for Outreachy</li>
</ul>
<p>Specifically, the last month we've identified and prioritised two high-priority use cases for more detailed work:</p>
<ul>
<li><a href="https://github.com/rustfoundation/interop-initiative/issues/14" rel="external">calling an overloaded C++ function from Rust</a>, with a <a href="https://github.com/rust-lang/rust/pull/153697" rel="external">Rust lang experiment</a> - <a href="https://rust-lang.zulipchat.com/#narrow/channel/213817-t-lang/topic/On.20overloading/near/579590336" rel="external">implementation discussion</a></li>
<li><a href="https://github.com/rustfoundation/interop-initiative/issues/13" rel="external">adding Rust to an existing C++ build system</a>, this currently works for basic cases, but the tooling could be improved on the Rust side</li>
</ul>
<p>And I <a href="https://github.com/rustfoundation/interop-initiative/issues/3#issuecomment-4151337653" rel="external">analysed the problems / use cases we've collected so far</a>, with priorities, responsible language, and a split into semantics or tooling changes.</p>
<p>Next step is continuing to work on overloading and build systems in more detail. If you have specific Rust/C/C++ build system blockers, please open a chat or ticket.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#blockers-5"/>
Blockers</h4>
<p>Nothing at the moment, everyone has been extremely helpful, and I'm getting good feedback on use cases, problems, priorities, and Rust language experiments.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/teor2345" rel="external">teor</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/388#issuecomment-4357141346" rel="external">comment from 2026-05-01</a></p>
<blockquote>
<p>In the last month, I've:</p>
<ul>
<li>prepared for RustWeek and the All Hands, where I will be <a href="https://2026.rustweek.org/schedule/wednesday/#teor" rel="external">giving a Rust Project track talk</a> and running an All Hands interop session (schedule TBC)</li>
<li>added new <a href="https://github.com/rustfoundation/interop-initiative/issues" rel="external">interop use cases and problem statements</a>, and continued categorising them using GitHub tags</li>
<li>continued to expand the <a href="https://github.com/rustfoundation/interop-initiative/tree/main/problem-space" rel="external">draft high-level problem statement summaries</a></li>
<li>added interop code examples, including many examples from Outreachy applicants</li>
<li>continued mentoring Outreachy applicants</li>
<li>continued working on the Overloading Rust language experiment</li>
</ul>
<p>Specifically, the last month we've made detailed progress on two high-priority use cases:</p>
<ul>
<li><a href="https://github.com/rustfoundation/interop-initiative/issues/14" rel="external">calling an overloaded C++ function from Rust</a>, with a <a href="https://github.com/rust-lang/rust/issues/153629" rel="external">Rust lang experiment</a> - <a href="https://rust-lang.zulipchat.com/#narrow/channel/213817-t-lang/topic/On.20overloading/near/579590336" rel="external">implementation discussion</a>
<ul>
<li>we've <a href="https://github.com/rust-lang/rust/pull/155223" rel="external">merged a refactor</a> to prepare for this experiment, which gave some nice perf wins</li>
<li>the initial <a href="https://github.com/rust-lang/rust/pull/153697" rel="external">overloading experiment PR</a> has been through two rounds of review, and is waiting for my revisions and rebasing</li>
</ul>
</li>
<li><a href="https://github.com/rustfoundation/interop-initiative/issues/13" rel="external">adding Rust to an existing C++ build system</a>
<ul>
<li>Outreachy applicants wrote <a href="https://github.com/rustfoundation/interop-initiative/pulls?q=is%3Apr" rel="external">interop example code PRs</a></li>
<li>these interop user experiences are waiting for analysis, so they can be summarised in the build system and overloading problem statements</li>
<li>this will likely happen after RustWeek and the All Hands</li>
</ul>
</li>
</ul>
<p>Next step is continuing to work on the overloading experiment, along with RustWeek/All Hands preparation, and collecting feedback during the conference.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#blockers-6"/>
Blockers</h4>
<p>Nothing at the moment. There is a steady stream of new use cases, problems, code examples and Rust language experiment feedback.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#comprehensive-niche-checks-for-rust"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/262" rel="external">Comprehensive niche checks for Rust</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/1c3t3a" rel="external">Bastian Kersting</a></strong>, <a href="https://github.com/jakos-sec" rel="external">Jakob Koschel</a></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/Saethlin" rel="external">Ben Kimock</a>), <a href="https://github.com/rust-lang/opsem-team" rel="external">opsem</a> (<a href="https://github.com/Saethlin" rel="external">Ben Kimock</a>)</li>
<li><strong>Status:</strong> Not completed</li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#const-generics"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/100" rel="external">Const Generics</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/BoxyUwU" rel="external">Boxy</a></strong>, <a href="https://github.com/camelid" rel="external">Noah Lev</a></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/const-generics.html" rel="external">Continued</a></li>
</ul>
<details>
6 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/100#issuecomment-3806305532" rel="external">comment from 2026-01-27</a></p>
<blockquote>
<p><a href="https://github.com/BoxyUwU" rel="external">Boxy</a> and I have established a regular time to check-in on formalizing this within a-mir-formality. Today we mostly worked on the "model" of const values, starting with this</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>#</span><span>[</span><span>term</span><span>]</span></span>
<span class="giallo-l"><span class="z-keyword">pub</span><span class="z-storage z-type"> enum</span><span class="z-entity z-name z-type"> ConstData</span><span> {</span></span>
<span class="giallo-l"><span class="z-punctuation z-definition z-comment z-comment">    //</span><span class="z-comment z-line z-double-slash z-comment"> Sort of equivalent to `ValTreeKind::Branch`</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>cast</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    RigidValue</span><span>(</span><span class="z-entity z-name z-type">RigidConstData</span><span>)</span><span>,</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span class="z-punctuation z-definition z-comment z-comment">    //</span><span class="z-comment z-line z-double-slash z-comment"> Sort of equivalent to `ValTreeKind::Leaf`</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>cast</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    Scalar</span><span>(</span><span class="z-entity z-name z-type">ScalarValue</span><span>)</span><span>,</span></span>
<span class="giallo-l"/>
<span class="giallo-l"><span>    #</span><span>[</span><span>variable</span><span>(</span><span class="z-entity z-name z-type">ParameterKind</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Const</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    Variable</span><span>(</span><span class="z-entity z-name z-type">Variable</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>}</span></span>
<span class="giallo-l"/>
<span class="giallo-l"/>
<span class="giallo-l"/>
<span class="giallo-l"><span>#</span><span>[</span><span>term</span><span>]</span></span>
<span class="giallo-l"><span class="z-keyword">pub</span><span class="z-storage z-type"> enum</span><span class="z-entity z-name z-type"> ScalarValue</span><span> {</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>grammar</span><span>(</span><span class="z-entity z-name z-type">u8</span><span>(</span><span class="z-keyword z-operator">$</span><span>v0</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    U8</span><span>(</span><span class="z-entity z-name z-type">u8</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>grammar</span><span>(</span><span class="z-entity z-name z-type">u16</span><span>(</span><span class="z-keyword z-operator">$</span><span>v0</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    U16</span><span>(</span><span class="z-entity z-name z-type">u16</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>grammar</span><span>(</span><span class="z-entity z-name z-type">u32</span><span>(</span><span class="z-keyword z-operator">$</span><span>v0</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    U32</span><span>(</span><span class="z-entity z-name z-type">u32</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>grammar</span><span>(</span><span class="z-entity z-name z-type">u64</span><span>(</span><span class="z-keyword z-operator">$</span><span>v0</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    U64</span><span>(</span><span class="z-entity z-name z-type">u64</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>grammar</span><span>(</span><span class="z-entity z-name z-type">i8</span><span>(</span><span class="z-keyword z-operator">$</span><span>v0</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    I8</span><span>(</span><span class="z-entity z-name z-type">i8</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>grammar</span><span>(</span><span class="z-entity z-name z-type">i16</span><span>(</span><span class="z-keyword z-operator">$</span><span>v0</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    I16</span><span>(</span><span class="z-entity z-name z-type">i16</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>grammar</span><span>(</span><span class="z-entity z-name z-type">i32</span><span>(</span><span class="z-keyword z-operator">$</span><span>v0</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    I32</span><span>(</span><span class="z-entity z-name z-type">i32</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>grammar</span><span>(</span><span class="z-entity z-name z-type">i64</span><span>(</span><span class="z-keyword z-operator">$</span><span>v0</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    I64</span><span>(</span><span class="z-entity z-name z-type">i64</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>grammar</span><span>(</span><span class="z-keyword z-operator">$</span><span>v0</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    Bool</span><span>(</span><span class="z-entity z-name z-type">bool</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>grammar</span><span>(</span><span class="z-entity z-name z-type">usize</span><span>(</span><span class="z-keyword z-operator">$</span><span>v0</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    Usize</span><span>(</span><span class="z-entity z-name z-type">usize</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>    #</span><span>[</span><span>grammar</span><span>(</span><span class="z-entity z-name z-type">isize</span><span>(</span><span class="z-keyword z-operator">$</span><span>v0</span><span>)</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    Isize</span><span>(</span><span class="z-entity z-name z-type">isize</span><span>)</span><span>,</span></span>
<span class="giallo-l"><span>}</span></span>
<span class="giallo-l"/>
<span class="giallo-l"/>
<span class="giallo-l"><span>#</span><span>[</span><span>term</span><span>(</span><span class="z-keyword z-operator">$</span><span>name </span><span class="z-keyword z-operator">$</span><span>&lt;</span><span>parameters</span><span>&gt;</span><span> {</span><span class="z-keyword z-operator"> $</span><span>,</span><span>values </span><span>}</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-keyword">pub</span><span class="z-storage z-type"> struct</span><span class="z-entity z-name z-type"> RigidConstData</span><span> {</span></span>
<span class="giallo-l"><span class="z-keyword">    pub</span><span class="z-variable"> name</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> RigidName</span><span>,</span></span>
<span class="giallo-l"><span class="z-keyword">    pub</span><span class="z-variable"> parameters</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> Parameters</span><span>,</span></span>
<span class="giallo-l"><span class="z-keyword">    pub</span><span class="z-variable"> values</span><span class="z-keyword z-operator">:</span><span class="z-entity z-name z-type"> Vec</span><span>&lt;</span><span class="z-entity z-name z-type">Const</span><span>&gt;</span><span>,</span></span>
<span class="giallo-l"><span>}</span></span></code></pre>
<p>i.e., a const value can be a scalar value (as today) or a struct literal like <code>Foo { ... }</code> (which would also cover tuples and things). We got the various tests passing. Huzzah!</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BoxyUwU" rel="external">Boxy</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/100#issuecomment-3823289633" rel="external">comment from 2026-01-30</a></p>
<blockquote>
<p>In addition to what niko posted previously there's been a lot of other stuff happening. A lot of people have opened PRs to improve mGCA this month: <a href="https://github.com/fmease" rel="external">León Orell Valerian Liehr</a> <a href="https://github.com/camelid" rel="external">Noah Lev</a> @enthropy7 <a href="https://github.com/Kivooeo" rel="external">Kivooeo</a> <a href="https://github.com/mu001999" rel="external">mu001999</a> @Human9000-bit <a href="https://github.com/reddevilmidzy" rel="external">Redddy</a> @Keith-Cancel @AprilNEA</p>
<p>A rough list of things that have been improved for mGCA:</p>
<ul>
<li>Lots of new expressions now supported by mGCA: const constructors, tuple constructor calls, array expressions, tuple expression, literals</li>
<li><code>associated_const_equality</code> has been merged into <code>min_generic_const_args</code>. the former was effectively dependent on the latter already so this just makes it nicer to use the former :)</li>
<li>traits can now be dyn compatible if all associated constants are type consts and are specified in the trait object (e.g. <code>dyn Trait&lt;ASSOC = 10&gt;</code>)</li>
<li>type consts are enforced to be non-generic</li>
<li>a bunch of ICEs have been fixed</li>
<li>camelid has been working on "non-min" version of mGCA which will allow arbitrary expressions to be used in the type system (a blog post with more detail will be published once this actually lands)</li>
</ul>
<p>In non-mGCA updates, as niko says, we've been meeting regularly to make progress on modelling const generics in a-mir-formality. I've also been spending time thinking about the interactions between <code>adt_const_params</code> and ADTs with privacy/safety invariants and I think I know how to structure the RFC in this area so can make progress on that again</p>
<p>There's some more detail about the various bits of work people have done and who did what here: <a href="https://rust-lang.zulipchat.com/#narrow/channel/260443-project-const-generics/topic/perfectly.20adequately.20sized.20wins/near/566850721" rel="external">#project-const-generics &gt; perfectly adequately sized wins @ 💬</a></p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/100#issuecomment-3897552648" rel="external">comment from 2026-02-13</a></p>
<blockquote>
<p><a href="https://github.com/BoxyUwU" rel="external">Boxy</a> and I have met (and continue to meet) and work on modeling const generics in a-mir-formality. We're still working on laying the groundwork.</p>
<p>There is a proposed <a href="https://rust-lang.github.io/rust-project-goals/2026/const-generics.html" rel="external">project goal</a> for next year.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BoxyUwU" rel="external">Boxy</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/100#issuecomment-3977295413" rel="external">comment from 2026-02-28</a></p>
<blockquote>
<p>There's been a lot of miscellaneous fixes for mGCA this month. I've also started drafting some blog posts to explain what's going on with mGCA/oGCA as well as soliciting use cases/experience reports for them and <code>adt_const_params</code>. I also talked with some folks at Rust Nation this month about const generics and what features would be useful for them and why.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BoxyUwU" rel="external">Boxy</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/100#issuecomment-4179111762" rel="external">comment from 2026-04-02</a></p>
<blockquote>
<p>Late on the update :') niko and i continue to meet to discuss const generics. we've made some progress on figuring out problems around privacy/safety in const generics. we've also been discussing the big picture stuff for const generics and where we're "heading".</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BoxyUwU" rel="external">Boxy</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/100#issuecomment-4359546137" rel="external">comment from 2026-05-01</a></p>
<blockquote>
<p>started running weekly meetings about const generics to make it easier to keep up to date with all the people who are working on const generics stuff. i think <code>min_adt_const_params</code> is now at the point of what the RFC is going to specify.</p>
<p>GCA is making good progress thanks to ashley's work. i also met with lcnr where we talked about whether there was some version of mGCA that is stabilizeable in the near future or not (maybe!)</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#continue-resolving-cargo-semver-checks-blockers-for-merging-into-cargo"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/104" rel="external">Continue resolving <code>cargo-semver-checks</code> blockers for merging into cargo</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/obi1kenobi" rel="external">Predrag Gruevski</a></strong></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/cargo" rel="external">cargo</a> (<a href="https://github.com/epage" rel="external">Ed Page</a>), <a href="https://github.com/rust-lang/rust" rel="external">rustdoc</a> (<a href="https://github.com/adotinthevoid" rel="external">Alona Enraght-Moony</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/cargo-semver-checks.html" rel="external">Continued</a></li>
</ul>
<details>
1 detailed update available.
<ul>
<li>
<p><strong><a href="https://github.com/obi1kenobi" rel="external">Predrag Gruevski</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/104#issuecomment-3764211880" rel="external">comment from 2026-01-17</a></p>
<blockquote>
<p>I posted a <a href="https://predr.ag/blog/cargo-semver-checks-2025-year-in-review/" rel="external">"year in review" for cargo-semver-checks</a>.</p>
<p>It has a section on <a href="https://predr.ag/blog/cargo-semver-checks-2025-year-in-review/#the-path-forward-for-2026-and-beyond" rel="external">how I think we should move forward in 2026 and beyond</a>.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#develop-the-capabilities-to-keep-the-fls-up-to-date"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/391" rel="external">Develop the capabilities to keep the FLS up to date</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/PLeVasseur" rel="external">Pete LeVasseur</a></strong>, <code>t-spec</code>, and contributors from <a href="https://ferrous-systems.com/" rel="external">Ferrous Systems</a></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/rust" rel="external">bootstrap</a> (<a href="https://github.com/kobzol" rel="external">Jakub Beránek</a>), <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a>), <a href="https://github.com/rust-lang/spec" rel="external">spec</a> (<a href="https://github.com/PLeVasseur" rel="external">Pete LeVasseur</a>)</li>
<li><strong>Status:</strong> Superseded by the <a href="https://rust-lang.github.io/rust-project-goals/2026/stabilize-fls-releases.html" rel="external">Stabilize FLS Release Cadence</a> 2026 goal</li>
</ul>
<details>
2 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/PLeVasseur" rel="external">Pete LeVasseur</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/391#issuecomment-3999761277" rel="external">comment from 2026-03-04</a></p>
<blockquote>
<p>We have a Project Goal in 2026 that we'll take on: <a href="https://rust-lang.github.io/rust-project-goals/2026/stabilize-fls-releases.html" rel="external">Stabilize FLS Release Cadence</a>. Progress towards 1.93.1 looks good, most issues are <a href="https://github.com/rust-lang/fls/issues?q=is%3Aissue%20state%3Aopen%20%5BChange%5D%3A%20%5B1.93%5D" rel="external">closed</a>.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#help-wanted-2"/>
Help wanted</h4>
<p>We'd love more folks from the safety-critical community to contribute to picking up <a href="https://github.com/rust-lang/fls/issues" rel="external">issues</a> or opening an issue if you notice something is missing.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/PLeVasseur" rel="external">Pete LeVasseur</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/391#issuecomment-4178437764" rel="external">comment from 2026-04-02</a></p>
<blockquote>
<p>Trying to prepare FLS releases earlier:</p>
<ul>
<li>since we completed the 1.94.0 release of the FLS a bit early this time, we checked into the stretch part of our goal this year to look at 1.95.0 early</li>
<li>we learned a bit more of the release notes process thanks to tips from <a href="https://github.com/ehuss" rel="external">Eric Huss</a> and <a href="https://github.com/traviscross" rel="external">TC</a></li>
<li><a href="https://github.com/tshepang" rel="external">Tshepang Mbambo</a> and I attended the t-release meeting last week where we chatted about working a little "upstream" with them on generating the release notes a bit earlier</li>
<li>tomorrow in our t-fls meeting we'll discuss our interest with engaging over there; at a minimum I'll get engaged with t-release</li>
</ul>
<p>Glossary and main-body text harmonization:</p>
<ul>
<li>the first PR landed from <a href="https://github.com/tshepang" rel="external">Tshepang Mbambo</a> removing IDs from the glossary</li>
<li>further steps planned, we have a tracking issue for it</li>
</ul>
<p>Developer guide:</p>
<ul>
<li>akin to how the Reference now has a developer's guide now for contributing we'll do the same in the FLS</li>
<li><a href="https://github.com/kirtchev-adacore" rel="external">Hristian Kirtchev</a> has been working on this</li>
</ul>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#emit-retags-in-codegen"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/392" rel="external">Emit Retags in Codegen</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/icmccorm" rel="external">Ian McCormack</a></strong></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/RalfJung" rel="external">Ralf Jung</a>), <a href="https://github.com/rust-lang/opsem-team" rel="external">opsem</a> (<a href="https://github.com/RalfJung" rel="external">Ralf Jung</a>)</li>
<li><strong>Status:</strong> Superseded by the <a href="https://rust-lang.github.io/rust-project-goals/2026/borrowsanitizer.html" rel="external">BorrowSanitizer</a> 2026 goal</li>
</ul>
<details>
4 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/icmccorm" rel="external">Ian McCormack</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/392#issuecomment-3730419629" rel="external">comment from 2026-01-09</a></p>
<blockquote>
<p>Here's our January status update!</p>
<ul>
<li>Yesterday, we posted <a href="https://github.com/rust-lang/compiler-team/issues/958" rel="external">an MCP</a> for our retag intrinsics. While that's in progress, we'll start adapting our current prototype to remove our dependence on MIR-level retags. Once that's finished, we'll be ready to submit a PR.</li>
<li>We published our first monthly <a href="https://borrowsanitizer.com/status/january_2026.html" rel="external">blog post</a> about BorrowSanitizer.</li>
<li>Our overall goal for 2026 is to transition from a research prototype to a functional tool. Three key features have yet to be implemented: garbage collection, error reporting, and support for atomic memory accesses. Once these are complete, we'll be able to start testing real-world libraries and auditing our results against Miri.</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/icmccorm" rel="external">Ian McCormack</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/392#issuecomment-3955255197" rel="external">comment from 2026-02-24</a></p>
<blockquote>
<p>We just posted our <a href="https://borrowsanitizer.com/status/february_2026.html" rel="external">February status update</a> for BorrowSanitizer. TL;DR:</p>
<ul>
<li>We provide detailed error messages for aliasing violations, which look <em>almost</em> like Miri's do!</li>
<li>We have two forms of retag intrinsic: <code>__rust_retag_mem</code> and <code>__rust_retag_reg</code>. We no longer require a compiler plugin to determine the permission associated with a retag, which will make it possible to use BorrowSanitizer by providing a single <code>-Zsanitizer=borrow</code> flag to rustc. You can check out our <a href="https://github.com/rust-lang/compiler-team/issues/958" rel="external">MCP</a> for more detailed design updates.</li>
<li>We are starting to have a better understanding of how BorrowSanitizer performs in practice, but we do not have enough data yet to be certain. From one test case, it seems like we are somewhat faster but still in the same category of performance as Miri when we compare against other sanitizers. Expect more detailed results to come as we scale up our benchmarking pipeline.</li>
<li>We have a tentative plan for upstreaming BorrowSanitizer in 2026, starting with its LLVM components. We intend to start the RFC process on the LLVM side this spring, once our API is stable.</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/icmccorm" rel="external">Ian McCormack</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/392#issuecomment-4158528895" rel="external">comment from 2026-03-30</a></p>
<blockquote>
<p>We just posted our <a href="https://borrowsanitizer.com/status/march_2026.html" rel="external">March status update</a> for BorrowSanitizer. TL;DR:</p>
<ul>
<li>We added hundreds more relevant tests from Miri's test suite. At the moment, 80% pass.</li>
<li>We improved our cargo plugin (<code>cargo-bsan</code>) to better support multilanguage libraries. This will let us start to recreate the bugs from our <a href="https://dl.acm.org/doi/10.1109/ICSE55347.2025.00167" rel="external">earlier evaluation</a>.</li>
</ul>
<p>Our goal for April is to continue expanding our test suite, finish an initial version of the LLVM components of BorrowSanitizer, and hopefully start the RFC process on the LLVM side.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/icmccorm" rel="external">Ian McCormack</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/392#issuecomment-4346250277" rel="external">comment from 2026-04-29</a></p>
<blockquote>
<p>We have some exciting news: our talk on BorrowSanitizer was accepted <a href="https://rustconf2026.sched.com/event/2KHtb" rel="external">at RustConf</a> this year! We’re grateful for the opportunity and looking forward to sharing our results with the broader community this September.</p>
<p>We just posted <a href="https://borrowsanitizer.com/status/april_2026.html" rel="external">our April status update</a>. It’s a bit of a technical one. Here’s the TL;DR:</p>
<ul>
<li>BorrowSanitizer now uses a shadow stack to track metadata at runtime - this is a significantly different strategy than other LLVM sanitizers, and it will help us support garbage collection.</li>
<li>We are now ready to start sending in PRs for our retag intrinsics. It will take a little time to split our changes up into meaningful, reviewable chunks—you can expect to see these throughout the next week.</li>
</ul>
<p>The RFC for our LLVM components is taking a little longer than expected, but it was worth taking the extra time to test out compiler changes and make sure that we had the core parts of the instrumentation pass settled. We’ll be drafting the RFC throughout the next few weeks.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#expand-the-rust-reference-to-specify-more-aspects-of-the-rust-language"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/394" rel="external">Expand the Rust Reference to specify more aspects of the Rust language</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a></strong>, <a href="https://github.com/Amanieu" rel="external">Amanieu d'Antras</a>, <a href="https://github.com/GuillaumeGomez" rel="external">Guillaume Gomez</a>, <a href="https://github.com/jackh726" rel="external">Jack Huey</a>, <a href="https://github.com/lcnr" rel="external">lcnr</a>, <a href="https://github.com/m-ou-se" rel="external">Mara Bos</a>, <a href="https://github.com/petrochenkov" rel="external">Vadim Petrochenkov</a>, <a href="https://github.com/yaahc" rel="external">Jane Lusby</a></li>
<li><strong>Champions:</strong> <a href="https://www.rust-lang.org/governance/teams" rel="external">lang-docs</a> (<a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a>), <a href="https://github.com/rust-lang/spec" rel="external">spec</a> (<a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a>)</li>
<li><strong>Status:</strong> Superseded by the <a href="https://rust-lang.github.io/rust-project-goals/2026/experimental-language-specification.html" rel="external">Experimental language specification</a> 2026 goal</li>
</ul>
<details>
1 detailed update available.
<ul>
<li>
<p><strong><a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/394#issuecomment-4245135894" rel="external">comment from 2026-04-14</a></p>
<blockquote>
<p>This work is now continuing into a <a href="https://github.com/rust-lang/rust-project-goals/pull/490" rel="external">new goal</a> by <a href="https://github.com/jackh726" rel="external">Jack Huey</a>.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#finish-the-libtest-json-output-experiment"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/255" rel="external">Finish the libtest json output experiment</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/epage" rel="external">Ed Page</a></strong></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/cargo" rel="external">cargo</a> (<a href="https://github.com/epage" rel="external">Ed Page</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/libtest-json.html" rel="external">Continued</a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#finish-the-std-offload-module"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/109" rel="external">Finish the std::offload module</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/ZuseZ4" rel="external">Manuel Drehwald</a></strong>, LLVM offload/GPU contributors</li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/ZuseZ4" rel="external">Manuel Drehwald</a>), <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/traviscross" rel="external">TC</a>)</li>
<li><strong>Status:</strong> Superseded by the <a href="https://rust-lang.github.io/rust-project-goals/2026/high-level-ml.html" rel="external">High-Level ML optimizations</a> 2026 goal</li>
</ul>
<details>
2 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/ZuseZ4" rel="external">Manuel Drehwald</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/109#issuecomment-3762217620" rel="external">comment from 2026-01-16</a></p>
<blockquote>
<p><code>std::autodiff</code> is moving closer to nightly, and <code>std::offload</code> is gaining various performance, feature, and hardware support improvements.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#autodiff"/>
autodiff</h5>
<p><a href="https://github.com/kobzol" rel="external">Jakub Beránek</a>, <a href="https://github.com/sgasho" rel="external">sgasho</a>, and I continued working on enabling autodiff in nightly. We have a PR up that builds autodiff in CI, and verified that the artifacts can be installed and work on Linux. For apple however, we noticed that any autodiff usage hangs. After some investigation, it turns out that we ended up embedding two LLVM copies, one in rustc, and one in Enzyme. It should be comparably easy to get rid of the second one. Once we verified that this fixes the build, we'll merge the PR to enable autodiff on both targets in nightly.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#offload"/>
offload</h5>
<p>A lot of interesting updates on the performance, feature, and hardware support side.</p>
<ol>
<li><a href="https://github.com/Sa4dus" rel="external">Marcelo Domínguez</a>, @kevinsala, @jdoerfert, and I started implementing the first benchmarks, since that's generally the best way to find missing features or performance issues. We were positively surprised by how good the out-of-the-box performance was. We will implement a few more benchmarks and post the results once we have verified them. We also implemented multiple PRs which implement bugfixes, cleanups, and needed features like <a href="https://github.com/rust-lang/rust/pull/150288" rel="external">support for scalars</a>. We also started working on LLVM optimizations which make sure that we can achieve even better performance.</li>
<li>I noticed that our offload intrinsic allowed running Rust code on the GPU, but it wasn't of much help when calling gpu vendor libraries like cuBLAS. I <a href="https://github.com/rust-lang/rust/pull/150683" rel="external">implemented</a> a new helper intrinsic which allows calling those functions conveniently, without having to manually move data to or from the device. It will benefit from the same LLVM optimizations as our full offload intrinsic. It also a bit simpler to set up on the compiler and linker side, so it already works with <code>std</code> and mangled kernel names, something that we still have to improve for our main offload intrinsic.</li>
<li>A lot of work happened on the LLVM offload side for SPIRV and Intel GPU support. At the moment, our Rust frontend is tested on NVIDIA and AMD server and consumer GPUs, as well as AMD HPC and Lapotop APUs. <a href="https://github.com/karolzwolak" rel="external">Karol Zwolak</a> reached out since he wants to help with with also running Rust on Intel GPUs. Offload relies on LLVM which started gaining Intel support, so hopefully we won't need much work beyond a new intel-gpu target and a new stdarch module. There is also work on a new spirv target for rustc, which we could also support if it goes through LLVM. Due to some open questions around typed pointers it does not seem clear yet whether it will, so we will have to wait.</li>
<li>Nikita started working on <a href="https://github.com/rust-lang/rust/pull/150722" rel="external">updating</a> our submodule to LLVM 22. This hopefully does not only brings some compile and runtime performance improvements, but also greatly simplifies how we can build and use offload. Once it landed I'll refactor our bootstrapping logic, and as part of that start building offload in CI.</li>
</ol>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/ZuseZ4" rel="external">Manuel Drehwald</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/109#issuecomment-4166618042" rel="external">comment from 2026-04-01</a></p>
<blockquote>
<p><code>std::autodiff</code> is now partly in CI, and <code>std::offload</code> got tested on a lot more benchmarks.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#autodiff-1"/>
autodiff</h5>
<p>Work continued on enabling autodiff in nightly. Since the last update, we have enabled autodiff in some Mingw and Linux runners. Users can now download libEnzyme artifacts, place them locally in the right spot for their toolchain, and then use autodiff on their nightly compiler. Once macOS is added, we will enable a new rustup component that will handle the download for users. Before enabling autodiff on macOS, however, we want to change how we distribute LLVM on this target (from static to dynamic linking). There are a lot of workflows and users of this target, not all of which can be modelled in the Rust CI. Our last two attempts sadly broke such downstream users and local contributors, so both attempts had to be reverted. Since testing here is tricky, progress here might be on the slower side; we will see.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#offload-1"/>
offload</h5>
<p>Most of the work on the offload side lately has been invisible, since we were working on implementing more benchmarks and LLVM optimizations, as well as missing features, discovered by those benchmarks. We achieved excellent performance on those benchmarks; more details will soon be presented by <a href="https://github.com/Sa4dus" rel="external">Marcelo Domínguez</a> at the EuroLLVM conference in two weeks!</p>
<p>Beyond benchmarks, there was a lot of tinkering on smaller PRs, reviewing, and housekeeping. LLVM-22 landed, so we updated our bootrstrap code to make use of new APIs, and tried to move a few smaller PRs forward, mainly around a better user experience and for making more Rust features available. Since the focus is still on benchmarks, not many of those PRs landed. They are in a mostly ready state, so it's a good time to pick them up if you're considering contributing. Please ping me on Zulip or in any PR with the offload label if you are interested!</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#getting-rust-for-linux-into-stable-rust-compiler-features"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/407" rel="external">Getting Rust for Linux into stable Rust: compiler features</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong>, compiler contributors</li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/WesleyWiser" rel="external">Wesley Wiser</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/rust-for-linux-compiler-features.html" rel="external">Continued</a></li>
</ul>
<details>
4 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/407#issuecomment-3760359980" rel="external">comment from 2026-01-16</a></p>
<blockquote>
<p>Update from the 2026-01-14 meeting:</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#register-tool-rust-66079"/>
<code>#![register_tool]</code> <a href="https://github.com/rust-lang/rust/issues/66079" rel="external">rust#66079</a></h5>
<p>Tyler Mandry proposed FCP of the <a href="https://github.com/rust-lang/rfcs/pull/3808" rel="external">RFC#3808</a> and nominated it for a Lang discussion.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#zdebuginfo-compression-rust-120953"/>
<code>-Zdebuginfo-compression</code> <a href="https://github.com/rust-lang/rust/issues/120953" rel="external">rust#120953</a></h5>
<p>Wesley Wiser proposed stabilization: <a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/">rust#150625</a>.</p>
<p>Josh Triplett suggested trying to bring <a href="https://github.com/trifectatechfoundation/zlib-rs" rel="external">zlib-rs</a> in the kernel as a case study.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#zdirect-access-external-data-rust-127488"/>
<code>-Zdirect-access-external-data</code> <a href="https://github.com/rust-lang/rust/issues/127488" rel="external">rust#127488</a></h5>
<p><a href="https://github.com/rust-lang/rust/pull/150494" rel="external">rust#150494</a> was merged two days ago, what reminds is updating the documentation and stabilizing the feature.</p>
<p>There's an <a href="https://rust-lang.zulipchat.com/#narrow/channel/425075-rust-for-linux/topic/New.20relocation.20model.20for.20relocatable.20code.20but.20static.20data/with/566044955" rel="external">ongoing discussion about the feature on the Rust Zulip</a> as well.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/407#issuecomment-3914550342" rel="external">comment from 2026-02-17</a></p>
<blockquote>
<p>Updates from the 2026-01-28 and 2026-02-11 meetings:</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#zdirect-access-external-data-rust-127488-1"/>
-Zdirect-access-external-data <a href="https://github.com/rust-lang/rust/issues/127488" rel="external">rust#127488</a></h5>
<p><a href="https://github.com/nbdd0121" rel="external">Gary Guo</a>'s <a href="https://github.com/rust-lang/rust/pull/150494" rel="external">fix PR</a> was merged.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#emit-noreturn"/>
<code>--emit=noreturn</code></h5>
<p><a href="https://github.com/ojeda" rel="external">Miguel Ojeda</a> reiterated that this is high on the list of compiler features the project needs. Right now, they're <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/objtool/check.c#n186" rel="external">doing these checks manually</a>.</p>
<p>Improving objtool's handling of noreturn is on <a href="https://github.com/nbdd0121" rel="external">Gary Guo</a>'s radar but there wasn't time yet.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/407#issuecomment-4068915161" rel="external">comment from 2026-03-16</a></p>
<blockquote>
<p>Update from the 2026-03-11 meeting:</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#emit-noreturn-1"/>
<code>--emit=noreturn</code></h5>
<p>It seems that figuring out which functions are <code>noreturn</code> is at a level too low for rustc. Function signatures are not sufficient and there are cases where <a href="https://godbolt.org/z/jexfjGanf" rel="external">rustc doesn't know</a> whether to emit <code>noreturn</code>. It is something we should ask the LLVM to give us that information.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#zsanitizer-kernel-hwaddress"/>
<a href="https://github.com/rust-lang/compiler-team/issues/975" rel="external"><code>-Zsanitizer=kernel-hwaddress</code></a></h5>
<p><a href="https://github.com/Darksonn" rel="external">Alice Ryhl</a> opened a new issue to introduce the <code>-Zsanitizer=kernel-hwaddress</code> sanitizer for aarch64 targets: https://github.com/rust-lang/compiler-team/issues/975</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#zharden-sls"/>
<a href="https://github.com/rust-lang/rust/issues/116851" rel="external"><code>-Zharden-sls</code></a></h5>
<p><a href="https://github.com/WesleyWiser" rel="external">Wesley Wiser</a> is working on <a href="https://github.com/rust-lang/rust/pull/152821" rel="external">allowing forbidden target features to be hard errors</a>, which the <code>-Zharden-sls</code> patch should be rebased on top of.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#register-tool"/>
<a href="https://github.com/rust-lang/rust/issues/66079" rel="external"><code>#![register_tool]</code></a></h5>
<p>The <a href="https://github.com/rust-lang/rfcs/pull/3808" rel="external">corresponding RFC</a> has been discussed by the Lang team on 2026-03-11. The overall vibe was positive and <a href="https://github.com/traviscross" rel="external">TC</a> is going to read through it and hopefully check a box on the proposed FCP.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#zdebuginfo-compression"/>
<a href="https://github.com/rust-lang/rust/issues/120953" rel="external"><code>-Zdebuginfo-compression</code></a></h5>
<p>The <a href="https://github.com/rust-lang/rust/pull/150625" rel="external">proposed stabilization</a> received some feedback that needs to be addressed.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#zdirect-access-external-data"/>
<a href="https://github.com/rust-lang/rust/issues/127488" rel="external"><code>-Zdirect-access-external-data</code></a></h5>
<p>The discussion here has stalled.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/407#issuecomment-4223621611" rel="external">comment from 2026-04-10</a></p>
<blockquote>
<p>Update from the 2026-04-08 meeting:</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#zsanitize-kernel-hwaddress"/>
<a href="https://github.com/rust-lang/rust/pull/153049" rel="external"><code>-Zsanitize=kernel-hwaddress</code></a></h5>
<p><a href="https://github.com/rust-lang/rust/pull/153049" rel="external">rust#153049</a> is merged. What remains of the <a href="https://github.com/rust-lang/rust/issues/154171" rel="external">tracking issue rust#154171</a> is a few docs checklists.</p>
<p><a href="https://github.com/Darksonn" rel="external">Alice Ryhl</a> added the unstable book doc changes in the PR itself and <a href="https://github.com/WesleyWiser" rel="external">Wesley Wiser</a> confirmed that's all the documentation needed for sanitizers.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#getting-rust-for-linux-into-stable-rust-language-features"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/116" rel="external">Getting Rust for Linux into stable Rust: language features</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong>, <a href="https://github.com/dingxiangfei2009" rel="external">Ding Xiang Fei</a></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a>), <a href="https://www.rust-lang.org/governance/teams" rel="external">lang-docs</a> (<a href="https://github.com/traviscross" rel="external">TC</a>)</li>
<li><strong>Status:</strong> Superseded by the <a href="https://rust-lang.github.io/rust-project-goals/2026/roadmap-rust-for-linux.html" rel="external">Rust for Linux</a> 2026 roadmap</li>
</ul>
<details>
6 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/116#issuecomment-3768690708" rel="external">comment from 2026-01-19</a></p>
<blockquote>
<p>Update from the 2026-01-14 meeting.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#deref-receiver"/>
<code>Deref</code> / <code>Receiver</code></h5>
<p>Ding's arbitrary_self_types: Split the Autoderef chain <a href="https://github.com/rust-lang/rust/pull/146095" rel="external">rust#146095</a> is waiting on reviews. It updates the method resolution to essentially: <code>deref_chain(T).flat_map(|U| receiver_chain(U))</code>.</p>
<p>The perf run was a wash and a carter has completed yesterday. Analysis pending.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rfc-3851-supertrait-auto-impl"/>
<a href="https://github.com/rust-lang/rfcs/pull/3851" rel="external">RFC #3851: Supertrait Auto-impl</a></h5>
<p>Ding has submitted a <a href="https://github.com/rust-lang/rust-project-goals/pull/436" rel="external">Rust Project goal for Supertrait Auto Impl</a>.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#arbitrary-self-types-rust-44874"/>
Arbitrary Self Types <a href="https://github.com/rust-lang/rust/issues/44874" rel="external">rust#44874</a></h5>
<p>We've discovered the <code>#[feature(arbitrary_self_types_pointer)]</code> feature gate. As the Lang consensus is to not support the <code>Receiver</code> trait on raw pointer types we're probably going to remove it (but this needs further discussion). This was a remnant from the original proposal, but the Lang has changed direction since.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#derive-coercepointee-rust-123430"/>
<code>derive(CoercePointee)</code> <a href="https://github.com/rust-lang/rust/issues/123430" rel="external">rust#123430</a></h5>
<p>Ding is working on a fix to prevent accidental specialization of the trait implementation. <a href="https://github.com/rust-lang/rust/pull/149968" rel="external">rust#149968</a> is adding an interim fix.</p>
<p>Alice opened a Reference PR for <a href="https://github.com/rust-lang/rust/pull/136776" rel="external">rust#136776</a>. There are questions around the behaviour of the <code>as</code> cast vs. coercions.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#pass-pointers-to-const-in-assembly-rfc-3848"/>
Pass pointers to const in assembly <a href="https://github.com/rust-lang/rfcs/pull/3848" rel="external">rfc#3848</a></h5>
<p>Gary opened implementation for the RFC: <a href="https://github.com/rust-lang/rust/pull/138618" rel="external">rust#138618</a>.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#field-projections-goal-390"/>
Field Projections <a href="https://github.com/rust-lang/rust-project-goals/issues/390" rel="external">goal#390</a></h5>
<p>Benno updated the Field Representing Types PR to the latest design. This makes the PR much simpler.</p>
<p>Tyler opened a <a href="https://rust-lang.github.io/beyond-refs" rel="external">Beyond References wiki</a> to keep all the proposals, resources in one place.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#in-place-initialization-goal-395"/>
In-place initialization <a href="https://github.com/rust-lang/rust-project-goals/issues/395" rel="external">goal#395</a></h5>
<p>Ding is writing a post to describe all the open proposals including Alice's new one that she brouhght up during the <a href="https://lpc.events/event/19/" rel="external">LPC 2025</a>. He'll merge it in the <a href="https://rust-lang.github.io/beyond-refs" rel="external">Beyond References wiki</a>.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#macros-attributes-derives-etc"/>
Macros, attributes, derives, etc.</h5>
<p>Josh brought up his work on adding more capable declarative macros for writing attributes and derives. He's asked the Rust for Linux team for what they need to stop using proc macros.</p>
<p>Miguel noted they've just added dependency on <a href="https://crates.io/crates/syn" rel="external">syn</a>, but they would like to remove it some day if their could.</p>
<p>Benno provided a few cases of large macros that he thought were unlikely to be replaceable by declarative-style ones. Josh suggested there may be a way and suggested an asynchronous discussion.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/116#issuecomment-3909582195" rel="external">comment from 2026-02-16</a></p>
<blockquote>
<p>Updates from the 2026-01-28 and 2026-02-11 meetings:</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#removing-the-likely-unlikely-hints-in-favour-of-cold-path"/>
Removing the <code>likely</code>/<code>unlikely</code> hints in favour of <code>cold_path</code></h5>
<p>The <a href="https://github.com/rust-lang/rust/pull/151576" rel="external">stabilization of <code>core::hint::cold_path</code> lint</a> is imminent and after it, the <code>likely</code> and <code>unlikely</code> hints are likely (pardon the pun) to be removed.</p>
<p>The team discussed the impact of this. These hints are used in C but not yet in Rust. <code>cold_path</code> would be sufficient, but <code>likely</code>/<code>unlikely</code> would still be more convenient in cases where there isn't an <code>else</code> branch. <a href="https://github.com/tmandry" rel="external">Tyler Mandry</a> mentioned that these can be implemented in terms of <code>cold_path</code>.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#niche-optimizations"/>
Niche optimizations</h5>
<p>We discussed the feasibility of embedding data in lower bits of a pointer -- something the kernel is doing in C. This could also enable setting the top bit in the integers (which is otherwise never set) and make it represent an error in that case (and a regular pointer otherwise).</p>
<p>Ideally, this would be done in safe Rust, as the idea is to improve the safety of the C code in question.</p>
<p>Extending the niches is something Rust wants to see, but it's waiting on pattern types. There are short/medium-term options by using <code>unsafe</code> and wrapping it in a safe macro, but the long-term hope is to have this supported in the language.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#vendoring-zerocopy"/>
Vendoring zerocopy</h5>
<p>The project has interest in vendoring <a href="https://github.com/google/zerocopy" rel="external">zerocopy</a>. We had its maintainers <a href="https://github.com/jswrenn" rel="external">Jack Wrenn</a> and <a href="https://github.com/joshlf" rel="external">Joshua Liebow-Feeser</a> join us to discuss this and answer our questions. The main question was about whether to vendor at all, how often should we (or will have to) upgrade, and how much of it is expected to end up in the standard library.</p>
<p>The project follows semver with the extended promise to not break minor versions even before 1.0.0. We could vendor the current 0.8 and we should be upgrade on our own terms (e.g. when we bring in new features) rather than being forced to.</p>
<p>Right now, the project is able to experiment with various approaches and capabilities. Any stdlib integration a long way away, but there is interest in integrating these to the language and libraries where appropriate.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#new-trait-solver"/>
New trait solver</h5>
<p>There's been a long-term effort to finish the new trait solver, which will unblock a lot of things. <a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a> asked about things it's blocking for Rust for Linux.</p>
<p>This is the list: unmovable types, guaranteed destructors, Type Alias Impl Trait (TAIT), Return Type Notation (RTN), const traits, const generics (over integer types), extern type.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#2026-project-goals"/>
2026 Project goals</h5>
<p>This year brings in the concept of roadmaps. We now have a <a href="https://rust-lang.github.io/rust-project-goals/2026/roadmap-rust-for-linux.html" rel="external">Rust for Linux</a> and a few more granular Goals. We'll be adding more goals over time, but the one merged cover what we've been focusing on for now.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/116#issuecomment-4039494143" rel="external">comment from 2026-03-11</a></p>
<blockquote>
<p>Update from the 2026-02-25 meeting:</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#2026-project-goals-1"/>
2026 Project goals</h5>
<p>We spent most of the meeting going over the open Project goals, the <a href="https://rust-lang.github.io/rust-project-goals/2026/roadmap-rust-for-linux.html" rel="external">Rust for Linux roadmap</a> and other things we'd like to see that aren't the right shape for a goal.</p>
<p><a href="https://github.com/ojeda" rel="external">Miguel Ojeda</a> brought up the upcoming Debian 14 release (coming out probably somewhere around Q2 of 2027) and we went over each item and decided whether it's something we need to make sure is in that release or not.</p>
<p>Debian stable is an important milestone and the Rust version in it serves as a baseline for Rust for Linux development.</p>
<p>I'll add all this data into the <a href="https://rust-lang.github.io/rust-project-goals/2026/roadmap-rust-for-linux.html" rel="external">roadmap</a>.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/116#issuecomment-4068513211" rel="external">comment from 2026-03-16</a></p>
<blockquote>
<p>Update from the 2026-03-11 meeting:</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#field-projections"/>
Field projections</h5>
<p>We now have a <a href="https://lore.kernel.org/rust-for-linux/20260302164239.284084-1-gary@kernel.org/" rel="external">macro and machinery that uses the projection mechanism</a>.</p>
<p>The <code>dma_read!</code> / <code>dma_write!</code> macros switched over to it. This also fixes a soundness issue <a href="https://rust-for-linux.zulipchat.com/#narrow/channel/288089-General/topic/Soundness.20of.20.60dma_read!.28.29.60/with/573645610" rel="external">1</a>.</p>
<p>Note: this is done entirely via macros and doesn't use any Field projections language features. The Field projection syntax and traits should make this more ergonomic and integrate the borrow checker so we can accept more code.</p>
<p>We're planning to have a design meeting with the Lang team in the last week of March.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rustfmt-imports-formatting-and-trailing-slashes"/>
rustfmt imports formatting and trailing slashes</h5>
<p>We talked about the rustfmt formatting of the <code>use</code> statements again. While the trailing empty comment <code>//</code> workaround (<a href="https://github.com/rust-lang/rust-project-goals/issues/116#issuecomment-3442107142" rel="external">see this update</a>) is acceptable as a temporary measure, we need to find a long-term solution where you can configure rustfmt to accept this style.</p>
<p>We don't have a issue for this specific formatting yet, though it was discussed in <a href="https://github.com/rust-lang/rustfmt/issues/3361#issuecomment-3382614679" rel="external">#3361</a>.</p>
<p>The next step are to create such an issue. We were hesitant to add burden to a team that's already at limit, but having the issue would let us track it from the Rust for Linux side.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/116#issuecomment-4136755115" rel="external">comment from 2026-03-26</a></p>
<blockquote>
<p>Update from the 2026-03-26 meeting:</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#const-generics-1"/>
Const generics</h5>
<p><a href="https://github.com/BoxyUwU" rel="external">Boxy</a> asked the team for features that are most important under the const generics umbrella. This might help with prioritisation and just understanding of practical uses.</p>
<ol>
<li><strong>Ability to do arithmetic on const generic types</strong>: e.g. the kernel has a type <a href="https://rust.docs.kernel.org/next/kernel/num/bounded/struct.Bounded.html" rel="external">Bounded</a> which has a value and a maximum size (in bits). Both the bit width and value are const values. They want to be able to do arithmetics on these types (starting with bit shifts) that will guarantee the the result will fit within the specified size at compile time.</li>
<li><strong>Argument-position const generics</strong>: right now, the const generic types must be specified in the type bound section (within the angle brackets). So for example you have to write: <code>Bounded::&lt;u8, 4&gt;::new::&lt;7&gt;()</code> instead of the more natural <code>Bounded::&lt;u8, 4&gt;::new(7)</code>. This gets more complicated when there's const-time calculation happening rather than just a numerical constant -- in which case this also needs to be wrapped in curly brackets: <code>{ ... }</code>.</li>
<li>Being generic over types other than numbers: pointers would be useful for <a href="https://rust-lang.github.io/rfcs/3848-asm-const-ptr.html" rel="external">asm_const_ptr</a>. String literals too -- even if they're just passed through without being processed / operated on. And if going from a passthrough string makes it possible to pass through any type, that would help the team replace some typestate patterns they're using with an <code>enum</code>.</li>
</ol>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#statx"/>
<code>statx</code></h5>
<p><a href="https://github.com/Darksonn" rel="external">Alice Ryhl</a> <a href="https://github.com/rust-lang/libs-team/issues/761" rel="external">proposed</a> being able to create <code>std::fs::Metadata</code> from Linux <code>statx</code> syscall.</p>
<p>This was discussed in the Libs-API meeting and they had questions about possible evolutions of the <code>statx</code> ABI -- if/how it can grow in the future and how they could handle that if they wanted some of the new data available. So we discussed it in the Rust for Linux meeting.</p>
<p>In the end, it seems prudent to be reasonably defensive rather than relying on the syscall pre-filling default values.</p>
<p><a href="https://github.com/Darksonn" rel="external">Alice Ryhl</a> <a href="https://github.com/rust-lang/libs-team/issues/761#issuecomment-4132354333" rel="external">proposed</a> an opaque <code>statx</code> struct that would give the stdlib a way to decide on the struct's size, pre-filled contents and mask.</p>
<p><a href="https://github.com/ojeda" rel="external">Miguel Ojeda</a> suggested contacting Christian Brauner and Alexander Viro (i.e. the VFS maintainers); <a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a> agreed that it would be good if we can get a thread with the right people in linux-fsdevel.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/tomassedovic" rel="external">Tomas Sedovic</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/116#issuecomment-4224585576" rel="external">comment from 2026-04-10</a></p>
<blockquote>
<p>Update from the 2026-04-08 meeting:</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#zerocopy-features-in-rust-s-std"/>
zerocopy features in Rust's std</h5>
<p>zerocopy uses two traits that are both polyfills for unstable traits : <code>KnownLayout</code> (for <code>ptr_metadata</code>) and <code>Immutable</code> (for <code>Freeze</code>). It would <a href="https://github.com/rust-lang/rust/issues/81513#issuecomment-2414679019" rel="external">help maintenance of zerocopy</a> (which Rust for Linux plans to start using) if these were stabilised.</p>
<p><code>ptr_metadata</code> is something the team wants in the kernel independently. It's possibly blocked on (or at least might have interactions with) the <a href="https://github.com/rust-lang/rust/issues/144404" rel="external">Sized Hierarchy work</a>.</p>
<p><code>Freeze</code> (now <code>NoCell</code>) has an <a href="https://github.com/rust-lang/rfcs/pull/3633" rel="external">RFC</a>.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#deref-receiver-1"/>
<code>Deref</code>/<code>Receiver</code></h5>
<p><a href="https://github.com/jackh726" rel="external">Jack Huey</a> started reviewing <a href="https://github.com/dingxiangfei2009" rel="external">Ding Xiang Fei</a>'s <a href="https://github.com/rust-lang/rust/pull/146095" rel="external">PR to split the autoderef chain</a> and feels it's not ready to go in front of the full Lang team.</p>
<p>We also discussed the dependence/independence of the <code>Deref</code> and <code>Receiver</code> implementations, in particular whether it ever makes sense to implement <code>Deref</code> but <em>not</em> <code>Receiver</code>. <a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a> suggested gathering examples for cases like that (where you can't use the type as a <code>Self</code> type in the function declaration, but allow calling methods on it).</p>
<p>The current plan for the experiment is to have these traits separate, but have the compiler enforce that if they implement the same type, their targets are identical. This will let us open the door for any future possibilities (a supertrait / subtrait relation, or having diverging targets in the future).</p>
<p>We want to experiment to see where and how these traits and their possible evolution might be helpful.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#null-ptr-deref"/>
null-ptr-deref</h5>
<p>The team would like to have a (an optional) compiler guarantee, that the compiler never removes null checks on raw pointers. What can currently happen in C is that if you deref a null pointer, the compiler can do optimisations including removing any subsequent checks whether that pointer is null, because dereferencing a null pointer is undefined behaviour.</p>
<p>But the null check can still help prevent further bugs and in C, the kernel now disables the optimisation that would remove it.</p>
<p><a href="https://github.com/ojeda" rel="external">Miguel Ojeda</a> is going to open an MCP for this.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#in-place-initialization-1"/>
In-Place Initialization</h5>
<p><a href="https://github.com/BennoLossin" rel="external">Benno Lossin</a> opened a <a href="https://github.com/rust-lang/all-hands-2026/issues/17" rel="external">proposal for an in-person room</a> at the 2026 All Hands for In-place initialization.</p>
<p>Here's a <a href="https://github.com/rust-lang/rust/issues/153825" rel="external">meta issue</a> tracking all the proposals and discussions about the feature.</p>
<p>The design space is complex and the team hopes that discussing it in person will help move it forward.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#implement-open-api-namespace-support"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/256" rel="external">Implement Open API Namespace Support</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/epage" rel="external">Ed Page</a></strong>, <a href="https://github.com/b-naber" rel="external">b-naber</a></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/cargo" rel="external">cargo</a> (<a href="https://github.com/epage" rel="external">Ed Page</a>), <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/b-naber" rel="external">b-naber</a>), <a href="https://github.com/rust-lang/crates.io" rel="external">crates-io</a> (<a href="https://github.com/carols10cents" rel="external">Carol Nichols</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/open-namespaces.html" rel="external">Continued</a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#mir-move-elimination"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/396" rel="external">MIR move elimination</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/Amanieu" rel="external">Amanieu d'Antras</a></strong></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/Amanieu" rel="external">Amanieu d'Antras</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/mir-move-elimination.html" rel="external">Continued</a></li>
</ul>
<details>
1 detailed update available.
<ul>
<li>
<p><strong><a href="https://github.com/Amanieu" rel="external">Amanieu d'Antras</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/396#issuecomment-4183522763" rel="external">comment from 2026-04-03</a></p>
<blockquote>
<p>The RFC has just been <a href="https://github.com/rust-lang/rfcs/pull/3943" rel="external">published</a>. It has been significantly reworked since the last draft.</p>
<p>Notable changes:</p>
<ul>
<li>Removed the concept of activation/de-activation. Now the semantics don't need to deal with partially allocated locals. This is less powerful optimization-wise but should still cover most cases.</li>
<li>Added byref/byval to call arguments to clarify how they are passed.</li>
<li>Added a separate section for the surface language changes to separate it from the MIR changes.</li>
<li>Added more details on the MIR optimization which eliminates moves.</li>
<li>Changed the MIR operand evaluation order to be left-to-right, except for destination places which are always evaluated last.</li>
<li>Added StorageLive back: we need it to mark the location where <code>llvm.lifetime.start</code> should be inserted, which is not the same as the location where a local is initialized. In the opsem, <code>StorageLive</code> doesn't actually allocate the local, that's still done when it is initialized by a write.</li>
</ul>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#prototype-a-new-set-of-cargo-plumbing-commands"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/264" rel="external">Prototype a new set of Cargo "plumbing" commands</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/epage" rel="external">Ed Page</a></strong></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/cargo" rel="external">cargo</a> (<a href="https://github.com/epage" rel="external">Ed Page</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/cargo-plumbing.html" rel="external">Continued</a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#prototype-cargo-build-analysis"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/398" rel="external">Prototype Cargo build analysis</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/weihanglo" rel="external">Weihang Lo</a></strong></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/cargo" rel="external">cargo</a> (<a href="https://github.com/weihanglo" rel="external">Weihang Lo</a>)</li>
<li><strong>Status:</strong> Completed</li>
</ul>
<details>
1 detailed update available.
<ul>
<li>
<p><strong><a href="https://github.com/weihanglo" rel="external">Weihang Lo</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/398#issuecomment-3725163795" rel="external">comment from 2026-01-08</a></p>
<blockquote>
<p>The prototype of this project goal is basically complete.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#current-state"/>
Current state</h4>
<p>This project goal introduces <strong>build analysis support in Cargo</strong>, with the aim of making build behavior understandable across multiple invocations, not just a single run.</p>
<p>At a high level, the prototype:</p>
<ul>
<li>Records build metadata over time, including:
<ul>
<li>rebuild reasons</li>
<li>timing information</li>
<li>relevant invocation context</li>
</ul>
</li>
<li>Stores this data locally in a structured log format suitable for later analysis</li>
<li>Exposes the data via unstable <code>cargo report</code> subcommands, such as:
<ul>
<li><code>cargo report sessions</code> - list session IDs</li>
<li><code>cargo report timings</code> - HTML timing report</li>
<li><code>cargo report rebuilds</code> - Why things rebuilt</li>
</ul>
</li>
</ul>
<p>See <a href="https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#build-analysis" rel="external">the Reference</a> for a more thorough usage documentation</p>
<hr/>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#path-towards-stabilization"/>
Path towards stabilization</h4>
<p>Before this feature can be stabilized, the following unresolved questions must be answered. They might not block stabilization, but need to be evaluated if it is fine to leave for future.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#cargo-report-commands"/>
<code>cargo report</code> commands</h5>
<p>This is a stabilization blocker.</p>
<ul>
<li><input disabled="" type="checkbox"/>
Currently all three report commands (<code>sessions</code>, <code>rebuilds</code>, <code>timings</code>)
implicitly inspect global log files when if not in a workspace.
<ul>
<li>Should this be explicit with a flag?</li>
<li>Should this be an error if not in a workspace?</li>
</ul>
</li>
<li><input disabled="" type="checkbox"/>
Bikeshed on command names
<ul>
<li>Currently we have all nouns
<ul>
<li>For <code>sessions</code>
<ul>
<li><code>runs</code> simple but ambiguous</li>
<li>Just <code>log</code> like <code>git log</code></li>
<li><code>history</code> user-friendly (<code>docker history</code>, shell <code>history</code>, though not alike)</li>
</ul>
</li>
<li>For <code>timings</code>:
<ul>
<li>Not controversial, as we have <code>--timings</code> flag already</li>
</ul>
</li>
<li>For <code>rebuilds</code>:
<ul>
<li><code>rebuild-reasons</code> more explicit</li>
</ul>
</li>
</ul>
</li>
<li>Or move to action-oriented verbs:</li>
<li><code>cargo report list-sessions</code></li>
<li><code>cargo report analyze-timings</code> (<a href="https://bazel.build/docs/user-manual#analyze-profile" rel="external"><code>bazel analyze-profile</code></a>)</li>
<li><code>cargo report explain-rebuilds</code></li>
<li>Or question-oriented verbs:</li>
<li><code>cargo report what-ran</code> more general (<a href="https://buck2.build/docs/developers/what-ran/" rel="external"><code>buck2 log what-ran</code></a>)</li>
<li><code>cargo report why-rebuilt/why-reran</code></li>
</ul>
</li>
</ul>
<h6><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#cargo-report-sessions"/>
<code>cargo report sessions</code></h6>
<ul>
<li>Currently it prints a human-readable output without a format for programmable use cases.
<ul>
<li>Should we provide a programmable output (for example behind <code>--message-format=json</code>)?</li>
</ul>
</li>
</ul>
<h6><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#cargo-report-rebuilds"/>
<code>cargo report rebuilds</code></h6>
<ul>
<li>Extend the report from fingerprint to new hash (<code>-Cmetadata</code>/<code>-Cextra-filename</code>)
<ul>
<li>We currently can't distinguish whether a fresh build is a real new build or just rustflags changed</li>
<li><a href="https://github.com/rust-lang/cargo/pull/16456#discussion_r2662364819" rel="external">https://github.com/rust-lang/cargo/pull/16456#discussion_r2662364819</a></li>
</ul>
</li>
<li>Make each rebuilt reason more actionable and friendly for end-users.</li>
<li>Should we log the fingerprint values being compared, or just the diff result?</li>
<li><a href="https://rust-lang.zulipchat.com/#narrow/channel/246057-t-cargo/topic/logging.20unit.20fingerprint/near/565825913" rel="external">#t-cargo &gt; logging unit fingerprint @ 💬</a></li>
</ul>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#log-message-schema"/>
Log message schema</h5>
<p>This is a stabilization blocker.</p>
<ul>
<li><input disabled="" type="checkbox"/>
Providing types for reading log messages
<ul>
<li>We should export <code>LogMessage</code> enum and related types in <code>cargo-util-schemas</code></li>
<li>Users may want to parse logs programmatically</li>
<li><a href="https://github.com/rust-lang/cargo/pull/16150#discussion_r2462065538" rel="external">https://github.com/rust-lang/cargo/pull/16150#discussion_r2462065538</a></li>
</ul>
</li>
<li><input disabled="" type="checkbox"/>
JSON schema evolution and versioning
<ul>
<li>Should we version the schema explicitly in each message?</li>
<li>Compatibility might be the same as <a href="https://doc.rust-lang.org/nightly/cargo/commands/cargo-metadata.html?highlight=compa#compatibility" rel="external">https://doc.rust-lang.org/nightly/cargo/commands/cargo-metadata.html?highlight=compa#compatibility</a></li>
</ul>
</li>
<li><input disabled="" type="checkbox"/>
Message structure consistency
<ul>
<li>Current log messages deviate from cargo's normal JSON message structure</li>
<li>Should we align with existing cargo JSON output format, for example the <code>target</code> field?</li>
<li><a href="https://github.com/rust-lang/cargo/pull/16414#discussion_r2632724893" rel="external">https://github.com/rust-lang/cargo/pull/16414#discussion_r2632724893</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/16303#discussion_r2565526807" rel="external">https://github.com/rust-lang/cargo/pull/16303#discussion_r2565526807</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/16303#discussion_r2561862478" rel="external">https://github.com/rust-lang/cargo/pull/16303#discussion_r2561862478</a></li>
</ul>
</li>
<li><input disabled="" type="checkbox"/>
Should we expose the entire <code>DirtyReason</code> enum as-is?
<ul>
<li>Currently exposes internal implementation details</li>
<li>May want to create a separate public-facing enum</li>
<li>Need to decide which variants are user-facing vs internal</li>
</ul>
</li>
<li><input disabled="" type="checkbox"/>
Check usefulness of each variant
<ul>
<li>Some variants may be obsolete (e.g., <code>RustflagsChanged</code> may be rare after <code>-Cmetadata</code> changes)</li>
<li>Need audit of which variants actually occur in practice</li>
<li>Remove or consolidate rarely-used variants</li>
</ul>
</li>
<li><input disabled="" type="checkbox"/>
Make dirty reasons end-user friendly
<ul>
<li>Current reasons are technical (e.g., "local fingerprint type changed")</li>
<li>Users need actionable messages (e.g., "file modified: src/lib.rs")</li>
</ul>
</li>
<li><input disabled="" type="checkbox"/>
Expose <code>target</code> and <code>mode</code>
<ul>
<li>Are they universal for all kind of units?
We might want to rename mode to action, as an action kind of a unit.</li>
<li><a href="https://rust-lang.zulipchat.com/#narrow/channel/246057-t-cargo/topic/build.20analysis.20log.20format/near/564781487" rel="external">https://rust-lang.zulipchat.com/#narrow/channel/246057-t-cargo/topic/build.20analysis.20log.20format/near/564781487</a></li>
</ul>
</li>
</ul>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#log-infrastructure"/>
Log infrastructure</h5>
<p>These are mostly future possibilities, not a stabilization blocker,
as it is highly possible to do incremental improvements.</p>
<ul>
<li><input disabled="" type="checkbox"/>
log compression <a href="https://github.com/rust-lang/cargo/issues/16475" rel="external">https://github.com/rust-lang/cargo/issues/16475</a></li>
<li><input disabled="" type="checkbox"/>
log rotation <a href="https://github.com/rust-lang/cargo/issues/16471" rel="external">https://github.com/rust-lang/cargo/issues/16471</a></li>
<li><input disabled="" type="checkbox"/>
Is losing data on crashes ok? https://github.com/rust-lang/cargo/pull//16150#discussion_r2462056940</li>
</ul>
<p>See also <a href="https://github.com/rust-lang/cargo/issues/16471#issuecomment-3724915770" rel="external">https://github.com/rust-lang/cargo/issues/16471#issuecomment-3724915770</a></p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#nested-cargo-calls"/>
Nested Cargo calls</h5>
<p>See <a href="https://github.com/rust-lang/cargo/issues/16477" rel="external">https://github.com/rust-lang/cargo/issues/16477</a>.</p>
<p>Basically, we need to have a way to associate log files of nested Cargo calls.
That helps other tools as well as <code>cargo fix</code> itself.</p>
<p>This is a stabilization blocker.</p>
<h5><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#how-contributors-can-help"/>
How contributors can help</h5>
<p>Future contributors can help by:</p>
<ul>
<li>picking up any linked issues below or in <a href="https://github.com/rust-lang/cargo/issues/15844" rel="external">https://github.com/rust-lang/cargo/issues/15844</a></li>
<li>building external tools utilizing the log messages, and providing feedback</li>
<li>providing real-world feedback from large or unusual builds</li>
</ul>
<p>A series of follow-up tasks has been cut to track remaining work:</p>
<ul>
<li>https://github.com/rust-lang/cargo/issues/16470</li>
<li>https://github.com/rust-lang/cargo/issues/16471</li>
<li>https://github.com/rust-lang/cargo/issues/16472</li>
<li>https://github.com/rust-lang/cargo/issues/16473</li>
<li>https://github.com/rust-lang/cargo/issues/16474</li>
<li>https://github.com/rust-lang/cargo/issues/16475</li>
<li>https://github.com/rust-lang/cargo/issues/16477</li>
<li>https://github.com/rust-lang/cargo/issues/16488</li>
</ul>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#reflection-and-comptime"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/406" rel="external">reflection and comptime</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a></strong></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a>), <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/scottmcm" rel="external">Scott McMurray</a>), <a href="https://github.com/rust-lang/libs-team" rel="external">libs</a> (<a href="https://github.com/joshtriplett" rel="external">Josh Triplett</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/reflection-and-comptime.html" rel="external">Continued</a></li>
</ul>
<details>
5 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/406#issuecomment-3749416638" rel="external">comment from 2026-01-14</a></p>
<blockquote>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/146923" rel="external">The MVP</a> has landed, and we even got the first contribs adding array support to reflection.
<ul>
<li>there are lots more types and type information that we could support, and it's rather easy to add more. Happy to review any work here.</li>
</ul>
</li>
<li><a href="https://github.com/rust-lang/rust/pull/150033" rel="external"><code>try_as_dyn</code> and <code>try_as_dyn_mut</code></a> have landed, and I'm working on <a href="https://github.com/rust-lang/rust/pull/150161" rel="external">removing the <code>'static</code> requirement</a>.</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/406#issuecomment-3871224433" rel="external">comment from 2026-02-09</a></p>
<blockquote>
<ul>
<li>@BD103 added <a href="https://github.com/rust-lang/rust/pull/151019" rel="external"><code>Type::of</code> for unsized types</a> and support for <a href="https://github.com/rust-lang/rust/pull/151118" rel="external">slices</a>, <a href="https://github.com/rust-lang/rust/pull/151031" rel="external">arrays</a>, and <a href="https://github.com/rust-lang/rust/pull/151119" rel="external">raw pointer</a></li>
<li><a href="https://github.com/SpriteOvO" rel="external">Asuna</a> added <a href="https://github.com/rust-lang/rust/pull/151123" rel="external">all of our primitives</a></li>
<li><a href="https://github.com/clubby789" rel="external">Jamie Hill-Daniel</a> gave us <a href="https://github.com/rust-lang/rust/pull/151222" rel="external">references</a></li>
<li>@izagawd made it possible to <a href="https://github.com/rust-lang/rust/pull/151239" rel="external">extract some info from <code>dyn Trait</code></a></li>
</ul>
<p>There is ongoing work for Adts and function pointers, both of which will land as MVPs and will need some work to make them respect semver or generally become useful in practice</p>
<p><a href="https://github.com/rust-lang/rust/pull/150161" rel="external">Removing the <code>'static</code> bound from <code>try_as_dyn</code></a> turned out to have many warts, so I'm limiting it to a much smaller subset and will have borrowck emit the <code>'static</code> requirement if the other rules do not apply (instead of having an unconditional <code>'static</code> requirement)</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/406#issuecomment-4093308372" rel="external">comment from 2026-03-19</a></p>
<blockquote>
<ul>
<li>I added <a href="https://github.com/rust-lang/rust/pull/152381" rel="external">support for getting reflection information of any type, not just <code>'static</code> ones</a></li>
<li><a href="https://github.com/9SonSteroids" rel="external">9SonSteroids</a> added a <a href="https://github.com/rust-lang/rust/pull/152173" rel="external">function pointer MVP</a> and <a href="https://github.com/rust-lang/rust/pull/152003" rel="external">trait object support</a></li>
<li><a href="https://github.com/SpriteOvO" rel="external">Asuna</a> added <a href="https://github.com/rust-lang/rust/pull/151142" rel="external">basic struct/enum/union support</a></li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/406#issuecomment-4294713163" rel="external">comment from 2026-04-22</a></p>
<blockquote>
<p>No changes since last time.</p>
<p>I'm writing a document for the lang team meeting on reflection next week</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/oli-obk" rel="external">Oliver Scherer</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/406#issuecomment-4294725433" rel="external">comment from 2026-04-22</a></p>
<blockquote>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#help-wanted-3"/>
Help wanted</h4>
<ul>
<li>add more information to adts (e.g. doc comments, attributes, ...), whatever else is usually used by crates like bevy-reflect</li>
<li>need to make struct field reflection respect privacy</li>
</ul>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rework-cargo-build-dir-layout"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/401" rel="external">Rework Cargo Build Dir Layout</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/ranger-ross" rel="external">Ross Sullivan</a></strong></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/cargo" rel="external">cargo</a> (<a href="https://github.com/weihanglo" rel="external">Weihang Lo</a>)</li>
<li><strong>Status:</strong> Completed; the <a href="https://rust-lang.github.io/rust-project-goals/2026/cargo-cross-workspace-cache.html" rel="external">Cargo cross workspace cache</a> 2026 goal will build on this work</li>
</ul>
<details>
2 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/ranger-ross" rel="external">Ross Sullivan</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/401#issuecomment-3752502595" rel="external">comment from 2026-01-15</a></p>
<blockquote>
<p><a href="https://github.com/rust-lang/cargo/pull/16155" rel="external">Fine grain locking for <code>build-dir</code></a> was merged and now available on nightly via <code>-Zfine-grain-locking</code> unstable flag. 🎉</p>
<p>There are some known issues we'd like to address before doing a formal call for testing. Notably, improving blocking messages, fixing potential thread starvation in Cargo's job queue when locks block, and investigate increasing rlimits to reduce risk of hitting max file descriptors for large projects.</p>
<p>I am hopeful that these issues will be resolved over the coming month and we can do a call for testing to start gathering feedback from the community on whether the new locking strategy improves workflows.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/ranger-ross" rel="external">Ross Sullivan</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/401#issuecomment-4024119674" rel="external">comment from 2026-03-09</a></p>
<blockquote>
<p>After the initial PR from the last update was merged, we shifted our focus to resolving some of the known issues. Notably, locking blocks the Cargo job queue slowly causing thread starvation if many build units are held by another Cargo instance.</p>
<p>We investigated adding the ability for Cargo to "suspend" a job internally while waiting for a lock, but we felt this change was a bit invasive and did not fit well with how the job queue was designed. Instead we plan to change our design to acquire all build unit locks prior to running the job queue (see <a href="https://github.com/rust-lang/cargo/pull/16657" rel="external">#16657</a>).</p>
<p>At the same time, we have continued to refine the new <code>build-dir</code> to prepare it for a call for testing and eventual stabilization. (<a href="https://github.com/rust-lang/cargo/pull/16542" rel="external">#16542</a>, <a href="https://github.com/rust-lang/cargo/pull/16502" rel="external">#16502</a>, <a href="https://github.com/rust-lang/cargo/pull/16515" rel="external">#16515</a>, <a href="https://github.com/rust-lang/cargo/pull/16514" rel="external">#16514</a>)</p>
<p>Finally we decided to split <code>.cargo-lock</code> into 2 locks to allow <code>cargo check</code> and <code>cargo build</code> to run in parallel when <code>artifact-dir == build-dir</code> (and <code>-Zfine-grain-locking</code> is enabled)</p>
<p>I suspect this may be the last update on this goal, as the 2026 slate of goals is coming up. While I did not renew this goal for 2026, I do plan to continue work on this and eventually stabilize this within this year.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#run-more-tests-for-gcc-backend-in-the-rust-s-ci"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/402" rel="external">Run more tests for GCC backend in the Rust's CI</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/GuillaumeGomez" rel="external">Guillaume Gomez</a></strong></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/WesleyWiser" rel="external">Wesley Wiser</a>), <a href="https://github.com/rust-lang/infra-team" rel="external">infra</a> (<a href="https://github.com/marcoieni" rel="external">Marco Ieni</a>)</li>
<li><strong>Status:</strong> Completed</li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rust-stabilization-of-memorysanitizer-and-threadsanitizer-support"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/403" rel="external">Rust Stabilization of MemorySanitizer and ThreadSanitizer Support</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/jakos-sec" rel="external">Jakob Koschel</a></strong>, <a href="https://github.com/1c3t3a" rel="external">Bastian Kersting</a></li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/stabilization-of-sanitizer-support.html" rel="external">Continued</a></li>
</ul>
<details>
3 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/jakos-sec" rel="external">Jakob Koschel</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/403#issuecomment-3750257467" rel="external">comment from 2026-01-14</a></p>
<blockquote>
<p>The <a href="https://github.com/rust-lang/compiler-team/issues/951" rel="external">MCP</a> has been seconded and is still waiting 3 days to be approved. Once that is done, we can proceed with merging the Tier 2 target.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/jakos-sec" rel="external">Jakob Koschel</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/403#issuecomment-3907370057" rel="external">comment from 2026-02-16</a></p>
<blockquote>
<p>Both the <a href="https://github.com/rust-lang/compiler-team/issues/951" rel="external">MCP</a> and the <a href="https://github.com/rust-lang/rust/pull/149644" rel="external">PR</a> for the AddressSanitizer target have been merged. Next up I should prepare the MCP for the Memory- and ThreadSanitizer targets, hopefully sending out soon.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/jakos-sec" rel="external">Jakob Koschel</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/403#issuecomment-4161071545" rel="external">comment from 2026-03-31</a></p>
<blockquote>
<p>The <a href="https://github.com/rust-lang/rust/pull/152757" rel="external">targets for MSan and TSan</a> are merged now.</p>
<p>Next, I'll be working on stabilizing those two, now that we have a way to use it without other unstable features (<code>build-std</code>).</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rust-vision-document"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/269" rel="external">Rust Vision Document</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a></strong>, vision team</li>
<li><strong>Status:</strong> Partially completed; work continues outside of Project Goals</li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rustc-perf-improvements"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/275" rel="external">rustc-perf improvements</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/Jamesbarford" rel="external">James Barford</a></strong>, <a href="https://github.com/kobzol" rel="external">Jakub Beránek</a>, <a href="https://github.com/davidtwco" rel="external">David Wood</a></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/davidtwco" rel="external">David Wood</a>), <a href="https://github.com/rust-lang/infra-team" rel="external">infra</a> (<a href="https://github.com/kobzol" rel="external">Jakub Beránek</a>)</li>
<li><strong>Status:</strong> Technical work completed; remaining policy and infrastructure work postponed</li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilize-public-private-dependencies"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/272" rel="external">Stabilize public/private dependencies</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/epage" rel="external">Ed Page</a></strong></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/cargo" rel="external">cargo</a> (<a href="https://github.com/epage" rel="external">Ed Page</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/pub-priv.html" rel="external">Continued</a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilize-rustdoc-doc-cfg-feature"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/404" rel="external">Stabilize rustdoc <code>doc_cfg</code> feature</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/GuillaumeGomez" rel="external">Guillaume Gomez</a></strong></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/rust" rel="external">rustdoc</a> (<a href="https://github.com/GuillaumeGomez" rel="external">Guillaume Gomez</a>)</li>
<li><strong>Status:</strong> Not completed (<a href="https://github.com/rust-lang/rust-project-goals/issues/404#issuecomment-3667410003" rel="external">blocked</a>)</li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#sve-and-sme-on-aarch64"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/270" rel="external">SVE and SME on AArch64</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/davidtwco" rel="external">David Wood</a></strong></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/davidtwco" rel="external">David Wood</a>), <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a>), <a href="https://github.com/rust-lang/libs-team" rel="external">libs</a> (<a href="https://github.com/Amanieu" rel="external">Amanieu d'Antras</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/scalable-vectors.html" rel="external">Continued</a></li>
</ul>
<details>
5 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/davidtwco" rel="external">David Wood</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/270#issuecomment-3754437263" rel="external">comment from 2026-01-15</a></p>
<blockquote>
<p><a href="http://github.com/rust-lang/rust/pull/143924" rel="external">rust-lang/rust#143924</a> has been merged, enabling scalable vector types to be defined on nightly, and I'm working on a patch to introduce unstable intrinsics/scalable vector types to <code>std::arch</code></p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/davidtwco" rel="external">David Wood</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/270#issuecomment-3914105881" rel="external">comment from 2026-02-17</a></p>
<blockquote>
<p>Progress has been slow since the last update because I've been busy, but I've been working on a rebase of <a href="https://github.com/rust-lang/stdarch/pull/1509" rel="external">rust-lang/stdarch#1509</a>, which has bitrot quite a bit. <a href="https://github.com/lqd" rel="external">Rémy Rakic</a> is joining me to work on the Sized Hierarchy parts of the goal.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/davidtwco" rel="external">David Wood</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/270#issuecomment-4073820988" rel="external">comment from 2026-03-17</a></p>
<blockquote>
<p>On the scalable vector half of the goal, I've got a branch with <a href="https://github.com/rust-lang/stdarch/pull/1509" rel="external">rust-lang/stdarch#1509</a> rebased, though without the <code>intrinsic-test</code> tool having been updated - that ended up being tricky and we've agreed to do it as a follow-up. We've opened <a href="http://github.com/rust-lang/rust/pull/153286" rel="external">rust-lang/rust#153286</a> with the compiler fixes that the stdarch patch requires, which should land soon (<a href="http://github.com/rust-lang/rust/pull/153653" rel="external">rust-lang/rust#153653</a> was opened and landed in the interim).</p>
<p>On the sized hierarchy half of the goal, <a href="https://github.com/lqd" rel="external">Rémy Rakic</a> has been updating our RFC such that we can discuss it in design meetings with the language team on the 18th and 25th - we'll update <a href="https://github.com/rust-lang/rfcs/pull/3729" rel="external">rust-lang/rfcs#3729</a> later today. We've split out the <code>const Sized</code> parts as a future possibility (though one we are committed to pursuing) as that has more open design questions, and we've discussed the proposed syntax and approach to migration - which are what we intend to focus on in the design meetings. He's also been working out how we can start implementing our migration strategy and help resolve blockers in other areas.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/davidtwco" rel="external">David Wood</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/270#issuecomment-4076740397" rel="external">comment from 2026-03-17</a></p>
<blockquote>
<p>Per last comment, <a href="https://github.com/rust-lang/rfcs/pull/3729#issuecomment-4076702909" rel="external">rust-lang/rfcs#3729 has been updated</a></p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/davidtwco" rel="external">David Wood</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/270#issuecomment-4245300680" rel="external">comment from 2026-04-14</a></p>
<blockquote>
<p>For the scalable vector half of the goal, we've landed a bunch of compiler fixes - <a href="http://github.com/rust-lang/rust/pull/153286" rel="external">rust-lang/rust#153286</a>, <a href="http://github.com/rust-lang/rust/pull/153608" rel="external">rust-lang/rust#153608</a>, <a href="http://github.com/rust-lang/rust/pull/154850" rel="external">rust-lang/rust#154850</a>, <a href="http://github.com/rust-lang/rust/pull/154950" rel="external">rust-lang/rust#154950</a>, <a href="http://github.com/rust-lang/rust/pull/155106" rel="external">rust-lang/rust#155106</a> and <a href="http://github.com/rust-lang/rust/pull/155243" rel="external">rust-lang/rust#155243</a> - and opened our stdarch patch with intrinsics - <a href="https://github.com/rust-lang/stdarch/pull/2071" rel="external">rust-lang/stdarch#2071</a>. That patch should be passing CI tomorrow once nightly updates to fix an unrelated spurious CI failure. We've got a handful of follow-ups to do afterwards, listed on <a href="http://github.com/rust-lang/rust/pull/145052" rel="external">rust-lang/rust#145052</a>.</p>
<p>For the sized hierarchy half of the goal, <a href="https://github.com/lqd" rel="external">Rémy Rakic</a> and I had two design meetings with the language team (<a href="https://hackmd.io/@rust-lang-team/SJlubIO5bl" rel="external">2026/03/18</a> and <a href="https://hackmd.io/@rust-lang-team/r1TBpYZsWg" rel="external">2026/03/25</a>) discussing the syntax/naming and migration strategy respectively.</p>
<p>On syntax, the language team preferred introducing an "only bounds" syntax to control opting-out of default bounds and opting-in to alternative bounds in a family of traits (described in <a href="https://github.com/davidtwco/rfcs/blob/1bb22f00880cb6d24192af4041585683b56e9b3a/text/3729-sized-hierarchy.md#adding-only-bounds" rel="external">an alternative in the RFC</a>), but there was an open question of whether that syntax should apply to an individual bound or all of the bounds - <a href="https://github.com/nikomatsakis" rel="external">Niko Matsakis</a> is investigating that.</p>
<p>On naming, the language team also preferred the name <code>SizeOfVal</code> over <code>MetaSized</code>, and didn't like <code>Pointee</code> but had no better alternatives. <a href="https://github.com/lqd" rel="external">Rémy Rakic</a> prepared rust-lang/rust#154374 to do that renaming and started <a href="https://rust-lang.zulipchat.com/#narrow/channel/219381-t-libs/topic/vibeck.20on.20Sized.20Hierarchy.20trait.20names/near/583074346" rel="external">a discussion with the library team</a> to confirm they were happy with the name, because changing it involves an amount of churn. The library team <a href="https://rust-lang.zulipchat.com/#narrow/channel/219381-t-libs/topic/vibeck.20on.20Sized.20Hierarchy.20trait.20names/near/584067359" rel="external">wanted to know what other traits in the hierarchy might later be introduced</a>, as that would help inform the naming of the currently proposed traits, so <a href="https://github.com/lqd" rel="external">Rémy Rakic</a> <a href="https://rust-lang.zulipchat.com/#narrow/channel/219381-t-libs/topic/vibeck.20on.20Sized.20Hierarchy.20trait.20names/near/584637057" rel="external">wrote up a document</a> with that information. We're holding off on doing any name changes until we find some consensus between libs and lang - who is responsible for these traits' names is a bit unclear.</p>
<p>On migration, the language team were largely happy with our proposed approach, and we realised that the approach proposed by lcnr for associated types might also work for our other migrations. <a href="https://github.com/lqd" rel="external">Rémy Rakic</a> has had meetings with lcnr to better understand that approach and to work out the next steps for implementing it.</p>
</blockquote>
</li>
</ul>
</details>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#type-system-documentation"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/405" rel="external">Type System Documentation</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/BoxyUwU" rel="external">Boxy</a></strong>, <a href="https://github.com/lcnr" rel="external">lcnr</a></li>
<li><strong>Champions:</strong> <a href="https://github.com/rust-lang/types-team" rel="external">types</a> (<a href="https://github.com/BoxyUwU" rel="external">Boxy</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/typesystem-docs.html" rel="external">Continued</a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#unsafe-fields"/>
<a href="https://github.com/rust-lang/rust-project-goals/issues/273" rel="external">Unsafe Fields</a></h4>
<ul>
<li><strong>People involved:</strong> <strong><a href="https://github.com/jswrenn" rel="external">Jack Wrenn</a></strong>, <a href="https://github.com/jhpratt" rel="external">Jacob Pratt</a>, <a href="https://github.com/veluca93" rel="external">Luca Versari</a></li>
<li><strong>Champions:</strong> <a href="http://github.com/rust-lang/compiler-team" rel="external">compiler</a> (<a href="https://github.com/jswrenn" rel="external">Jack Wrenn</a>), <a href="http://github.com/rust-lang/lang-team" rel="external">lang</a> (<a href="https://github.com/scottmcm" rel="external">Scott McMurray</a>)</li>
<li><strong>Status:</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/unsafe-fields.html" rel="external">Continued</a></li>
</ul>
<details>
2 detailed updates available.
<ul>
<li>
<p><strong><a href="https://github.com/jswrenn" rel="external">Jack Wrenn</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/273#issuecomment-3922926899" rel="external">comment from 2026-02-18</a></p>
<blockquote>
<p>RFC has been accepted. I'm preparing a 2026 continuing goal for stabilization.</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/jswrenn" rel="external">Jack Wrenn</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/273#issuecomment-4244724055" rel="external">comment from 2026-04-14</a></p>
<blockquote>
<p>Opened PR (<a href="https://github.com/rust-lang/rust/issues/16767" rel="external">#16767</a>(https://github.com/rust-lang/rust-clippy/pull/16767)) extending Clippy support to unsafe fields.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#blockers-7"/>
Blockers</h4>
<p>Waiting for t-clippy to review <a href="https://github.com/rust-lang/rust/issues/16767" rel="external">#16767</a>(https://github.com/rust-lang/rust-clippy/pull/16767).</p>
</blockquote>
</li>
</ul>
</details></div>
    </content>
    <updated>2026-05-18T00:00:00Z</updated>
    <published>2026-05-18T00:00:00Z</published>
    <author>
      <name>Nurzhan Saken</name>
    </author>
    <source>
      <id>https://blog.rust-lang.org/</id>
      <author>
        <name>Maintained by the Rust Teams.</name>
        <uri>https://github.com/rust-lang/blog.rust-lang.org/</uri>
      </author>
      <link href="https://blog.rust-lang.org/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://blog.rust-lang.org/" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en">Empowering everyone to build reliable and efficient software.</subtitle>
      <title xml:lang="en">Rust Blog</title>
      <updated>2026-06-11T14:20:46Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/netpolicy/?p=2577</id>
    <link href="https://blog.mozilla.org/netpolicy/2026/05/15/mozilla-to-uk-regulators-vpns-are-essential-privacy-and-security-tools-and-should-not-be-undermined/" rel="alternate" type="text/html"/>
    <title>Mozilla to UK regulators: VPNs are essential privacy and security tools and should not be undermined</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>In the context of concerns around young people’s interactions with digital technologies, the UK’s Department for Science, Innovation and Technology is consulting on additional measures to prepare young people for … <a class="go" href="https://blog.mozilla.org/netpolicy/2026/05/15/mozilla-to-uk-regulators-vpns-are-essential-privacy-and-security-tools-and-should-not-be-undermined/">Read more</a></p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/05/15/mozilla-to-uk-regulators-vpns-are-essential-privacy-and-security-tools-and-should-not-be-undermined/">Mozilla to UK regulators: VPNs are essential privacy and security tools and should not be undermined </a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>In the context of concerns around young people’s interactions with digital technologies, the UK’s Department for Science, Innovation and Technology is <a href="https://www.gov.uk/government/consultations/growing-up-in-the-online-world-a-national-consultation">consulting</a> on additional measures to prepare young people for growing up in a digital world. Before the backdrop of users circumventing age assurance systems mandated under the UK’s Online Safety Act, the consultation considers age-gating virtual private networks (VPNs).</p>
<p>Mozilla’s mission is grounded in the belief that the internet must remain open and accessible to all, and that privacy and security online are fundamental human rights. We recognize that the protection of young people online is one of the most pressing and challenging questions of our time, and we are committed to supporting policy proposals that address the root causes of online harms. We are <a href="https://blog.mozilla.org/netpolicy/2026/05/05/mozilla-calls-on-uk-policymakers-to-address-the-roots-of-online-harm-not-undermine-the-open-web/">concerned</a>, however, that blunt interventions like <a href="https://blog.mozilla.org/netpolicy/2025/12/19/australias-social-media-ban-why-age-limits-wont-fix-what-is-wrong-with-online-platforms/">mandatory age assurance</a> and restricting access to tools like VPNs are not effective in improving the protection afforded to young people online, while undermining the fundamental rights of all users.</p>
<p>VPNs serve as critical privacy and security tools for users across all ages. By hiding users’ IP addresses, VPNs help protect users’ location, reduce tracking and avoid IP-based profiling. People use VPNs for lots of different reasons: to connect to their school’s or employer’s network remotely, to avoid censorship or to simply protect their privacy and security online. While being able to access VPNs is especially important for vulnerable groups like activists, dissidents or journalists, VPNs improve everyone’s baseline protection online.</p>
<p>Young people are particularly vulnerable to online tracking, targeted advertising, and the risks that flow from personal data being collected and processed for commercial purposes without adequate consent or transparency. In a world in which young people are interacting with digital technologies as part of their realities from young ages onward, restricting young people’s access to privacy-protecting technologies is in tension with the goal of equipping them to navigate the internet safely and competently. In order to be able to develop agency and responsible habits in engaging with digital technologies, it is crucial for young people to be introduced to best practices and key safety and privacy tools as they engage with the online world.</p>
<p>Rather than age-gating technologies like VPNs, we believe that regulators should address the root causes of online harm by holding platforms to account, encouraging the responsible use of parental controls and investing in digital skills and a whole of society approach to digital wellbeing.</p>
<p>Read our <a href="https://blog.mozilla.org/netpolicy/files/2026/05/Mozilla-submission_-Growing-up-in-the-digital-world-consultation.pdf">full submission</a> to the Department for Science, Innovation and Technology.</p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/05/15/mozilla-to-uk-regulators-vpns-are-essential-privacy-and-security-tools-and-should-not-be-undermined/">Mozilla to UK regulators: VPNs are essential privacy and security tools and should not be undermined </a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </content>
    <updated>2026-05-15T12:23:31Z</updated>
    <published>2026-05-15T12:23:31Z</published>
    <category term="Uncategorized"/>
    <author>
      <name>Svea Windwehr</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/netpolicy/</id>
      <link href="https://blog.mozilla.org/netpolicy/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/netpolicy/" rel="alternate" type="text/html"/>
      <subtitle>Mozilla's official blog on open Internet policy initiatives and developments</subtitle>
      <title>Open Policy &amp; Advocacy</title>
      <updated>2026-06-11T14:28:25Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148293</id>
    <link href="https://discourse.mozilla.org/t/mozphab-2-15-1-released/148293" rel="alternate" type="text/html"/>
    <title>MozPhab 2.15.1 Released</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Bugs resolved in Moz-Phab 2.15.1:</p>
<ul>
<li><a href="https://bugzilla.mozilla.org/2036719">bug 2036719</a> moz-phab --no-stack doesn’t work as suggested?</li>
</ul>
<p>Discuss these changes in <span class="hashtag-raw">#engineering-workflow</span> on Slack or <span class="hashtag-raw">#Conduit</span> Matrix.</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/mozphab-2-15-1-released/148293">Read full topic</a></p></div>
    </summary>
    <updated>2026-05-13T20:14:01Z</updated>
    <published>2026-05-13T20:14:01Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>sheehan</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/mozphab-2-15-1-released/148293.rss" title="MozPhab 2.15.1 Released"/>
      <updated>2026-06-12T10:58:53Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/netpolicy/?p=2567</id>
    <link href="https://blog.mozilla.org/netpolicy/2026/05/11/six-million-selections-later-how-the-dma-is-giving-people-browser-choice/" rel="alternate" type="text/html"/>
    <title>Six Million Selections Later: How the DMA Is Giving People Browser Choice</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>At Mozilla, we’ve long believed in giving people choice and agency over their experiences online. As power in digital markets has concentrated in a small number of large companies, there … <a class="go" href="https://blog.mozilla.org/netpolicy/2026/05/11/six-million-selections-later-how-the-dma-is-giving-people-browser-choice/">Read more</a></p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/05/11/six-million-selections-later-how-the-dma-is-giving-people-browser-choice/">Six Million Selections Later: How the DMA Is Giving People Browser Choice</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>At Mozilla, we’ve long believed in giving people choice and agency over their experiences online. As power in digital markets has concentrated in a small number of large companies, there have been efforts in the <a href="https://blog.mozilla.org/en/mozilla/calling-for-antitrust-reform/">US</a>, <a href="https://www.jftc.go.jp/en/pressreleases/yearly-2025/July/250729.html">Japan</a>, <a href="https://blog.mozilla.org/netpolicy/2025/07/23/a-pivotal-moment-for-the-uk-in-digital-competition-lead-from-the-front-or-let-the-opportunity-slip/">UK</a>, <a href="https://www.moneycontrol.com/news/opinion/india-s-digital-competition-bill-unlocking-innovation-and-fair-competition-13524260.html">India</a>, <a href="https://www.kmcc.go.kr/download.do;jsessionid=C50HiXGjtWzTp13uP4bA8Sy5IUw1iUL3WTnUZJIT.servlet-aihgcldhome20?fileSeq=52595">Korea</a>, <a href="https://www.gov.br/fazenda/pt-br/assuntos/noticias/2025/setembro/governo-federal-envia-a-camara-dos-deputados-projeto-para-regulacao-concorrencial-das-big-techs">Brazil</a> and elsewhere to restore competition and put choice back in people’s hands.</p>
<p>These efforts are at various stages, but first among them was the EU’s Digital Markets Act. Over two years since obligations came into effect, the DMA is <a href="https://www.beuc.eu/news/first-bloom-new-report-shows-increased-consumer-choice-after-eighteen-months-digital-markets">delivering for people</a> in some key areas.</p>
<p>Not everywhere. Not perfectly. And not without enforcement. But browser choice is the clearest example.</p>
<p><b><i>Every 10 seconds, someone picks Firefox through a DMA choice screen</i></b></p>
<p>Operating systems like iOS, Android, Windows, and MacOS lean on pre-installed browsers, tricky default settings, and deceptive design to make it hard for people to exercise choice and to keep independent browsers from competing on a level playing field. But where the DMA has created opportunities for genuine browser choice, people are taking it.</p>
<p>New Mozilla data is clear: since the rules took effect, Firefox is selected through a DMA browser choice screen every 10 seconds. That adds up to more than <i>six million</i> Firefox selections. And people are sticking with us: retention is five times higher when people choose Firefox through a choice screen.</p>
<p>Academic analysis points the same way. <a href="https://www.nber.org/system/files/working_papers/w35112/w35112.pdf">Independent researchers compared Firefox daily active users in the EU with 43 non-EU countries</a>. Comparing the 15 months before and after browser choice screens rolled out on iOS, they found that Firefox daily active users (DAU) were 113% higher in the EU than it would have been without the DMA. On Android, it was 12% higher. The smaller Android effect is due to the fact that Firefox usage there started from a much higher base, and the Android rollout has been more uneven than on iOS. The research also shows that the DMA’s effect is growing over time.</p>
<p><a href="https://blog.mozilla.org/netpolicy/files/2026/05/Picture-2f.png"><img alt="" class="alignnone size-full wp-image-2571" height="390" src="https://blog.mozilla.org/netpolicy/files/2026/05/Picture-2f.png" width="870"/></a></p>
<p><a href="https://blog.mozilla.org/netpolicy/files/2026/05/Picture-1f.png"><img alt="" class="alignnone size-full wp-image-2570" height="424" src="https://blog.mozilla.org/netpolicy/files/2026/05/Picture-1f.png" width="898"/></a></p>
<p><b><i>Browser choice on mobile is moving, but desktop is left behind</i></b></p>
<p>The DMA’s work isn’t done. There remains room for improvement on mobile (including making it easier to import your data to a new browser and switch with one click). However, desktop remains largely untouched – leaving roughly 310 million desktops and laptops in the EU without equivalent browser choice. For example, Windows users are <a href="https://research.mozilla.org/browser-competition/over-the-edge-the-use-of-design-tactics-to-undermine-browser-choice/">subject to deceptive design tactics</a> and are not given an active choice. Even where choice screens exist, they are <a href="https://research.mozilla.org/browser-competition/remedyconcepts/">not a silver bullet</a>; ecosystem lock-in and interoperability barriers still hold back competition and innovation.</p>
<p>Still, the signal is clear: when people get real browser choice, they take it and select alternatives. It’s easy for gatekeepers to dismiss this as a couple of competitors benefiting. This ignores <a href="https://digital-markets-act.ec.europa.eu/about-dma/dma-review-qa_en#:~:text=Alternative,Germany">the range of challenger browsers</a> also reporting huge growth in the EU. What’s more, it ignores the benefit to people. DMA browser choice screens are reaching different audiences. Mozilla analysis shows that women make up a significantly higher share of Firefox selections on iOS via a choice screen than organic downloads, suggesting that choice screens may successfully reach a demographic that <a href="https://assets.publishing.service.gov.uk/media/66b47c8afc8e12ac3edb0c3e/Verian_Mobile_Browsers_Research_Final_Report.pdf">reports lower confidence</a> in manually changing browser defaults. The DMA’s effects are only starting to be felt and understood.</p>
<p><b><i>The road ahead</i></b></p>
<p>Effective enforcement of the obligations is the way forward. Gatekeepers continue to test and, in many instances, openly push back against the intent of the DMA provisions. This can take the form of implementation choices that limit real user uptake, delays in rolling out effective solutions, or sustained efforts to reinterpret, weaken, or roll back key provisions.</p>
<p>Most evidently, privacy and security arguments are often elevated in ways that risk diverting attention from whether compliance is delivering genuine choice and competition in practice. In reality, privacy, security, and effective competition can and should be designed to work hand-in-hand. They do not always have to be traded off.</p>
<p>Policymakers and enforcers should remain focused on outcomes: ensuring that the DMA delivers real-world competition and user choice, and resisting efforts to dilute its impact through partial compliance or narrative reframing.</p>
<p><b><i>Browser choice is just the start</i></b></p>
<p>Mozilla’s hope is that real browser choice will become the rule, rather than the exception. And that the lessons of browser choice screens will be applied to other areas of the DMA, including data portability and interoperability. Only with full compliance – including applying the existing DMA text to AI – can the full benefits of competition and innovation be brought to people in the EU.</p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/05/11/six-million-selections-later-how-the-dma-is-giving-people-browser-choice/">Six Million Selections Later: How the DMA Is Giving People Browser Choice</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </content>
    <updated>2026-05-11T19:03:25Z</updated>
    <published>2026-05-11T19:03:25Z</published>
    <category term="Competition"/>
    <category term="Consumer Choice"/>
    <author>
      <name>Gemma Petrie and Tasos Stampelos</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/netpolicy/</id>
      <link href="https://blog.mozilla.org/netpolicy/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/netpolicy/" rel="alternate" type="text/html"/>
      <subtitle>Mozilla's official blog on open Internet policy initiatives and developments</subtitle>
      <title>Open Policy &amp; Advocacy</title>
      <updated>2026-06-11T14:28:25Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.thunderbird.net/?p=4303</id>
    <link href="https://blog.thunderbird.net/2026/05/community-office-hours-contributor-spotlight-on-bogomil-shopov/" rel="alternate" type="text/html"/>
    <title>Community Office Hours: Contributor Spotlight on Bogomil Shopov</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>If you have ever used Thunderbird in Bulgarian, the subject of this month’s office hours is one of the contributors who made that possible! Office Hours hosts Heather and Monica have been lucky enough to chat with long-time localizer Bogamil Shopov at conferences like FOSDEM. Now, they’re sitting down to talk to him about how […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/05/community-office-hours-contributor-spotlight-on-bogomil-shopov/">Community Office Hours: Contributor Spotlight on Bogomil Shopov</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2026/05/blog-banner-community-hours6-768x432.jpg" width="640"/></p>
<p>If you have ever used Thunderbird in Bulgarian, the subject of this month’s office hours is one of the contributors who made that possible! Office Hours hosts Heather and Monica have been lucky enough to chat with long-time localizer Bogamil Shopov at conferences like FOSDEM. Now, they’re sitting down to talk to him about how his contributor story started, and to hear the advice he has for anyone curious about being part of Thunderbird.</p>



<p>We’ll be back next time, checking in on <a href="https://tb.pro">Thunderbird Pro</a>! It’s been <a href="https://blog.thunderbird.net/2025/06/video-thunderbird-pro-and-thundermail/">almost a year</a> since we sat down with members of our team making this possible. As we’ve slowly started opening up the service to our Early Birds from the waitlist, it seemed a great opportunity to learn what users can expect, now and in the future!</p>



<h3>A Contributor Origin Story</h3>



<p>Bogomil has been a contributor to Thunderbird from the start! Even if he didn’t like the UI in the early days, he loved our commitment to software freedom. He wanted people to have the software in their own language, and so he started localizing Thunderbird into Bulgarian. This was in the days before Pontoon, Mozilla’s localization platform, and so this wasn’t easy work! Another hurdle, which still happens, is that small language locales tend to have smaller numbers of contributors doing localizing work.</p>



<h3>From Mentee to Mentor</h3>



<p>Thankfully, Bogomil had unofficial mentors to help them find their way. On the localization side, he had a Bulgarian mentor who he, in turn, introduced to Mozilla and other open source projects. More experienced Mozilla contributors answered his questions as he expressed his interest in getting more involved. Bogomil points out that this need for both good onboarding docs and genuine human connection is still something all open source projects needs – and something we can keep improving!</p>



<p>Now Bogomil is the experienced mentor, and he’s had some key steps to helping grow the Thunderbird localizer community. He sends thank you notes to new translators and sends resources for specific computer and email terminology to new Bulgarian volunteers. He gives his mentees specific tasks to help focus their energy and excitement, and maybe even more importantly, he gives them encouragement. </p>



<h3>This Speaker goes to 11</h3>



<p>While Bogomil had given several public talks in Bulgarian before COVID, after 2020 he decided to try giving conference talks in English. His first talk was at <a href="https://halfstackconf.com/vienna">Halfstack</a>, sponsored by Mozilla, in Vienna, on what made him happy as a developer and IT person in general. He even brought a violin player on stage with him! His talk got a warm reception, and it encouraged him to keep talking about what brought him joy, whether it was using heavy metal to help him focus or <a href="https://fosdem.org/2026/schedule/event/93VVPX-what_translating_thunderbird_taught_me/">his involvement with Thunderbird</a> and open source. If you’ve ever considered giving a talk, especially about one of your passions, and hesitated, Bogomil would tell you to do it! People are more welcoming than you might think.</p>



<h3>Tools and Advice</h3>



<p>Bogomil still uses Pontoon for Thunderbird desktop translations, in addition to <a href="https://weblate.org/">Weblate</a>, where Thunderbird for Android and many other open source projects live. In addition to this localization platforms, he uses <a href="https://github.com/vipulraheja/coedit">CoEdIt</a> along with web-based tools that allow him to see how certain words were previously translated. And of course, he has three release channels of Thunderbird on his computer at all times, something most of the Thunderbird team understands!</p>



<p>From newer contributors, Bogomil has learned how language is changing and how to keep terms, like the Bulgarian word for “browser,” up to date, in addition to other feedback. His advice to new and potential volunteers is to be open to critique. This is especially true joining a project with a long history like Thunderbird, especially before wanting to change something. And he says don’t be afraid to do things and experiment, even if things go wrong.</p>



<h3>Watch the Talk (available on <a href="https://tilvids.com/w/7PDTJoYZn7GqP3jSX39v6x">PeerTube</a>)</h3>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<h3>Resources</h3>



<p>Desktop Thunderbird Translation docs: <a href="https://source-docs.thunderbird.net/en/latest/l10n/index.html">https://source-docs.thunderbird.net/en/latest/l10n/index.html</a></p>



<p>Desktop Thunderbird Translation on Pontoon: <a href="https://pontoon.mozilla.org/projects/thunderbird/">https://pontoon.mozilla.org/projects/thunderbird/</a></p>



<p>Thunderbird for Android Translation docs: <a href="https://docs.weblate.org/en/latest/user/translating.html">https://docs.weblate.org/en/latest/user/translating.html</a></p>



<p>Thunderbird for Android Translation on Weblate: <a href="https://hosted.weblate.org/projects/tb-android/">https://hosted.weblate.org/projects/tb-android/</a></p>
<p>The post <a href="https://blog.thunderbird.net/2026/05/community-office-hours-contributor-spotlight-on-bogomil-shopov/">Community Office Hours: Contributor Spotlight on Bogomil Shopov</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></div>
    </content>
    <updated>2026-05-08T19:15:13Z</updated>
    <published>2026-05-08T19:15:13Z</published>
    <category term="Community"/>
    <category term="Office Hours"/>
    <author>
      <name>Monica Ayhens-Madon</name>
    </author>
    <source>
      <id>https://blog.thunderbird.net/</id>
      <logo>https://blog.thunderbird.net/files/2024/01/cropped-Thunderbird_Logo_512-32x32.png</logo>
      <link href="https://blog.thunderbird.net/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.thunderbird.net/" rel="alternate" type="text/html"/>
      <subtitle>News, previews, and guides from the Thunderbird Team</subtitle>
      <title>The Thunderbird Blog</title>
      <updated>2026-05-08T19:15:15Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://hacks.mozilla.org/?p=48309</id>
    <link href="https://hacks.mozilla.org/2026/05/behind-the-scenes-hardening-firefox/" rel="alternate" type="text/html"/>
    <title>Behind the Scenes Hardening Firefox with Claude Mythos Preview</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Two weeks ago we announced that we had identified and fixed an unprecedented number of latent security bugs in Firefox with the help of Claude Mythos Preview and other AI models. In this post, we’ll go into more detail about how we approached this work, what we found, and advice for other projects on making […]</p>
<p>The post <a href="https://hacks.mozilla.org/2026/05/behind-the-scenes-hardening-firefox/">Behind the Scenes Hardening Firefox with Claude Mythos Preview</a> appeared first on <a href="https://hacks.mozilla.org">Mozilla Hacks - the Web developer blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Two weeks ago we <a href="https://blog.mozilla.org/en/privacy-security/ai-security-zero-day-vulnerabilities/">announced</a> that we had identified and fixed an unprecedented number of latent security bugs in Firefox with the help of Claude Mythos Preview and other AI models. In this post, we’ll go into more detail about how we approached this work, what we found, and advice for other projects on making good use of emerging capabilities to harden themselves against attack.</p>
<h3>Suddenly, the bugs are very good</h3>
<p>Just a few months ago, AI-generated security bug reports to open source projects were mostly known for being unwanted slop. Dealing with reports that look plausibly correct but are wrong imposes an asymmetric cost on project maintainers: it’s cheap and easy to prompt an LLM to find a “problem” in code, but slow and expensive to respond to it.</p>
<p>It is difficult to overstate how much this dynamic changed for us over a few short months. This was due to a combination of two main factors. First, the models got a lot more capable. Second, we dramatically improved our techniques for <i>harnessing</i> these models — steering them, scaling them, and stacking them to generate large amounts of signal and filter out the noise.</p>
<p>Ordinarily we keep detailed bug reports private for several months after shipping fixes and issuing security advisories, largely as a precaution to protect any users who, for whatever reason, were slow to update to the latest version of Firefox. Given the extraordinary level of interest in this topic and the urgency of action needed throughout the software ecosystem, we’ve made the calculated decision to unhide a small sample of the reports behind the fixes we recently shipped. We’ve attempted to draw them from a range of browser subsystems, but the selection process was still somewhat arbitrary. Nevertheless, we hope that the depth and diversity of these reports lends credence to our assessment of the capabilities and our calls for defenders to begin applying these techniques:</p>
<table>
<thead>
<tr>
<th>Bug ID</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2024918">2024918</a></td>
<td>An incorrect equality check can cause the JIT to optimize away the initialization of a live WebAssembly GC struct, creating a fake-object primitive with potential arbitrary read/write in code that had undergone extensive fuzzing by internal and external researchers.</td>
</tr>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2024437">2024437</a></td>
<td>A 15-year-old bug in the &lt;legend&gt; element triggered by meticulous orchestration of edge cases across distant parts of the browser, including recursion stack depth limits, expando properties, and cycle collection.</td>
</tr>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2021894">2021894</a></td>
<td>Reliably exploits a race condition over IPC, allowing a compromised content process to manipulate IndexedDB refcounts in the parent to trigger a UAF and potential sandbox escape.</td>
</tr>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022034">2022034</a></td>
<td>A raw NaN crossing an IPC boundary can masquerade as a tagged JS object pointer, turning double deserialization into a parent-process fake-object primitive for a sandbox escape.</td>
</tr>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2024653">2024653</a></td>
<td>An intricate testcase weaving through nested event loops, pagehide listeners, and garbage collection to trigger a UAF in the attribute setter for &lt;object&gt; elements.</td>
</tr>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022733">2022733</a></td>
<td>Triggers a parent UAF by flooding WebTransport with thousands of certificate hashes to stretch a race condition in a refcount-heavy copy loop, and exploits that race condition over IPC from a compromised content process.</td>
</tr>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2023958">2023958</a></td>
<td>Simulates a malicious DNS server by intercepting glibc DNS function calls in order to reproduce a UDP-&gt;TCP fallback edge case, triggering a buffer over-read and parent-process stack memory leak during HTTPS RR &amp; ECH parsing.</td>
</tr>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2025977">2025977</a></td>
<td>20-year-old XSLT bug in which reentrant key() calls cause a hash table rehash that frees its backing store while a raw entry pointer is still in use (one of several sec-high issues we fixed involving XSLT).</td>
</tr>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027298">2027298</a></td>
<td>Patches the color picker to simulate otherwise non-automatable user selection, then uses a synchronous input event to spin a nested event loop that re-enters actor teardown and frees the callback while it is still unwinding, triggering a content process UAF.</td>
</tr>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2023817">2023817</a></td>
<td>A compromised content process could send an arbitrary wallpaper image to be decoded in the parent process, which could be paired with a hypothetical vulnerability in an image decoder to escape the sandbox. This entailed difficult-to-automate reasoning about the trust-level of inputs in the parent process.</td>
</tr>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029813">2029813</a></td>
<td>Escapes our in-process sandboxing technology for third-party libraries (<a href="https://blog.mozilla.org/attack-and-defense/2021/12/06/webassembly-and-back-again-fine-grained-sandboxing-in-firefox-95/">RLBox</a>) by leveraging a gap in the verification logic used to copy values from the untrusted to the trusted side of the sandbox boundary.</td>
</tr>
<tr>
<td><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026305">2026305</a></td>
<td>Extremely small testcase that exploits the special rowspan=0 semantics in HTML tables by appending &gt;65535 rows to bypass clamping and overflow a 16-bit layout bitfield, which went undetected for years by fuzzers.</td>
</tr>
</tbody>
</table>
<p>Note that a number of these bugs are <i>sandbox escapes</i>, which would need to be combined with other exploits to achieve a <i>full-chain</i> Firefox compromise. These reports presume that the sandboxed process that renders site content has already been compromised with some separate bug, and is now running attacker-controlled machine code attempting to escalate control into the privileged parent process. When crafting a sandbox escape, the model is permitted to patch the Firefox source code, so long as the modified code is restricted to run only in the sandboxed process<sup><a href="https://hacks.mozilla.org/feed/#fn1" id="ref1">[1]</a></sup>. Such bugs are notoriously difficult to find with fuzzing, and while we’ve had some success <a href="https://blog.mozilla.org/attack-and-defense/2024/06/24/ipc-fuzzing-with-snapshots/">developing new techniques</a> to close this gap, AI analysis provides much more comprehensive coverage of this critical surface.</p>
<p>Just as interesting as what the models found is what they <i>didn’t</i> find — not because they didn’t try, but because they were unable to circumvent Firefox’s layered defenses. For example, in recent years we received several clever reports from security researchers that managed to escape the process sandbox by triggering prototype pollution in the privileged parent process. Rather than fixing these problems one-by-one, we made an <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1771084">architectural change</a> to freeze these prototypes by default. While auditing logs from the harness, we saw many <i>attempts</i> to pursue this line of escape that were thwarted by this design. Observing such direct payoff from previous hardening work was even more rewarding than finding and fixing more bugs.</p>
<h3>Harnessing Models to Build a Hardening Pipeline</h3>
<p>We’ve experimented internally with LLM code audits over the past few years, with early attempts using models like GPT 4 or Sonnet 3.5 to statically analyze high risk code for vulnerabilities. These experiments showed some promise, but the high rate of false positives made them impractical to scale.</p>
<p>The introduction of agentic harnesses that can reliably detect security issues has completely changed this. These can find real bugs <i>and</i> dismiss unreproducible speculation. The key feature of such a harness is that, given the right interfaces and instructions, it can create and run reproducible test cases to dynamically test hypotheses about bugs in code. After fixing the initial set of issues that <a href="https://blog.mozilla.org/en/firefox/hardening-firefox-anthropic-red-team/">Anthropic sent to us</a> in February, we built our own harness atop our <a href="https://hacks.mozilla.org/2021/02/browser-fuzzing-at-mozilla/">existing fuzzing infrastructure</a>.</p>
<p>We began with small-scale experiments prompting the harness to look for sandbox escapes with Claude Opus 4.6. Even with this model, we identified an impressive amount of previously-unknown vulnerabilities which required complex reasoning over multiprocess browser engine code. At first, we supervised the process in the terminal to observe the process in real-time and tune the prompts and logic. Once this was working well, we parallelized the jobs across multiple ephemeral VMs, each tasked to hunt for bugs within a specific target file and write its findings back to a bucket.</p>
<p>A discovery subsystem is necessary but not sufficient. In order to scale the effort, we needed to integrate it with our full security bug lifecycle: determining what to look for, where to look, and how to handle what it produces. This last part includes deduplicating against known issues, tracking bugs, triaging them, and getting fixes shipped. While the model is the core primitive powering the harness, this full pipeline is necessary to make it useful at scale.</p>
<p>While harnesses may be reusable across projects, this pipeline is inherently project-specific, reflecting each codebase’s semantics, tooling, and processes. Standing this up required significant iteration, with a tight feedback loop alongside the Firefox engineers who were fielding the incoming bugs.</p>
<h3>Upgrading the Models</h3>
<p>Once the end-to-end pipeline is in place, it’s trivial to swap in different models when they become available. Building this pipeline early helped us find a number of serious bugs using publicly-available models, and it also helped us hit the ground running when we had the opportunity to evaluate Claude Mythos Preview. In our experience, model upgrades increase the effectiveness of the entire pipeline: the system gets simultaneously better at finding potential bugs, creating proof-of-concept test cases to demonstrate them, and articulating their pathology and impact.</p>
<p>In addition to fixing the 271 bugs identified by Claude Mythos Preview in the <a href="https://www.firefox.com/en-US/firefox/150.0/releasenotes/">150 release</a>, we’ve shipped more of these fixes in <a href="https://www.firefox.com/en-US/firefox/149.0.2/releasenotes/">149.0.2</a>, <a href="https://www.firefox.com/en-US/firefox/150.0.1/releasenotes/">150.0.1</a>, and <a href="https://www.firefox.com/en-US/firefox/150.0.2/releasenotes/">150.0.2</a>. We also continue to find bugs with other means internally, and, similar to other projects, we’ve seen a significant uptick in external reports in the last few months.</p>
<p><img alt="A graph showing the volume of Firefox security bug fixes shipped by month, trending in the 20-30 range throughout each month in 2025, with a spike to 60-70 in February and March 2026, up to 423 in April 2026" class="alignnone size-full wp-image-48325" height="1440" src="https://hacks.mozilla.org/wp-content/uploads/2026/05/security-bug-fixes-1-scaled.png" width="2560"/></p>
<p>Ultimately, every bug requires care and attention to properly fix. Staying on top of this unprecedented volume has led to a lot of work and long days over the last few months, and we’re extremely proud of how the team has stepped up to meet this challenge. Over 100 people contributed code to this effort to ship the most secure Firefox yet. In addition to writing and reviewing patches, others have been building and scaling this pipeline, triaging, testing the fixes, and managing the release process for each bug.</p>
<h3>Takeaways</h3>
<p>Anyone building software can start using a harness with a modern model to find bugs and harden their code today. We recommend getting started now. You will find bugs, and you will set yourself up to take advantage of new models as soon as they become available.</p>
<p>You can start with very simple prompting, then observe and iterate. Our initial prompts were not dissimilar from those described <a href="https://youtu.be/1sd26pWhfmg?si=tRU14Bpc4MwTeMAT&amp;t=316">here</a>. Through iteration we’ve built out a lot of orchestration and tooling to optimize and scale the pipeline, but the essence of the inner loop remains the same: there is a bug in this part of the code, please find it and build a testcase.</p>
<p>We haven’t bottomed on all the latent bugs in Firefox, but are quite pleased with the trajectory. Today, our scanning is largely focused on specific areas of the code (files, functions) where we instruct the system to look, based on a mix of human judgement and automated signals. In the near future, we intend to integrate this analysis into our continuous integration system to scan patches as they land in the tree. Models are quite flexible with the form of context provided, and we expect patch-based scanning to work as well or even better than file-based scanning.</p>
<p>The current moment is a perilous one, but also full of opportunity. Let’s work together to secure the internet.</p>
<p> </p>
<p> </p>
<hr/>
<h3>FAQ</h3>
<h4>The announcement said “271 bugs”, but I count something different. What’s going on?</h4>
<p>On the <a href="https://www.mozilla.org/en-US/security/advisories/mfsa2026-30/#CVE-2026-6784">advisories web page</a> we group all internally-reported bugs as “rollup” CVEs with multiple bugs underneath them. The web page is built from <a href="https://github.com/mozilla/foundation-security-advisories/blob/dcb9392460ff2026f02ca45d37142c4cad17eb83/announce/2026/mfsa2026-30.yml#L236-L262">yaml</a> in the <a href="https://github.com/mozilla/foundation-security-advisories">foundation-security-advisories</a> repo, the canonical location for our CVE assignments. While some browsers do not create CVE identifiers for internally-discovered issues at all, we provide this information in order to be as transparent as possible.</p>
<p>In Firefox 150, there were three internal rollups: CVE-2026-6784 (154 bugs), CVE-2026-6785 (55 bugs), and CVE-2026-6786 (107 bugs).</p>
<p>Astute readers will notice the number of bugs in those internal rollups adds up to 316, which is more than the 271 we announced finding with Claude Mythos Preview. That’s because our security team hunts for new bugs every day by attacking Firefox with a combination of (a) fuzzing systems (b) manual inspection and (c) this new agentic pipeline across a variety of models.</p>
<p>We fixed a total of 423 security bugs in releases in April. In addition to the 271 bugs announced two weeks ago, there were 41 externally reported bugs, with the remaining 111 discovered internally and split roughly in third between:</p>
<ol>
<li>Bugs found using this pipeline with Claude Mythos Preview but fixed in releases other than Firefox 150</li>
<li>Bugs found using this pipeline with other models</li>
<li>Bugs found with other techniques like fuzzing</li>
</ol>
<p>Note that we also directly credited 3 CVEs to Anthropic separate from this latest effort (CVE-2026-6746, CVE-2026-6757, CVE-2026-6758). These were fixes for bugs <a href="https://blog.mozilla.org/en/firefox/hardening-firefox-anthropic-red-team/">sent to us</a> by the outstanding Anthropic Frontier Red team a couple months ago and we assigned unique CVEs for each as per our normal process.</p>
<h4>What do security ratings mean?</h4>
<p>As additional context, we apply <a href="https://wiki.mozilla.org/Security_Severity_Ratings/Client">security severity ratings</a> from critical to low to indicate the urgency of a bug:</p>
<ul>
<li>sec-critical and sec-high are assigned to vulnerabilities that can be triggered with normal user behavior, like browsing to a web page. We make no <i>technical</i> difference between these, but sec-critical bugs are reserved for issues that are publicly disclosed or known to be exploited in the wild.</li>
<li>sec-moderate is assigned to vulnerabilities that would otherwise be rated sec-high but require unusual and complex steps from the victim.</li>
<li>sec-low is assigned to bugs that are annoying but far from causing user harm (e.g, a safe crash).</li>
</ul>
<p>Of the 271 bugs we announced for Firefox 150: 180 were sec-high, 80 were sec-moderate, and 11 were sec-low.</p>
<p>While we care most about critical/high bugs, it’s normal for us to prioritize moderate and low security bugs in order to fix correctness issues and as a defense-in-depth mechanism.</p>
<h4>Is a sec-high or sec-critical bug the same as a practical exploit?</h4>
<p>Not necessarily.</p>
<p>In most cases, a single critical/high bug is not actually enough to compromise Firefox. This is because Firefox has a defense-in-depth architecture, so for example exploiting a JIT bug only achieves remote code execution in a sandboxed and site-specific process. Real-world attackers generally need to chain multiple exploits together to escalate privileges through one or more layers of sandboxing along with OS-level mitigations like ASLR.</p>
<p>We also generally don’t build exploits to see whether a bug could be used by an attacker in the real world. We classify sec-high based on predictable crash symptoms such as use-after-free or out-of-bounds memory issues being reported by AddressSanitizer, and our threat model assumes that any of them could be exploitable with sufficient effort. This reduces the risk of a false negative during exploitability analysis, and more importantly it allows us to focus our resources on finding and fixing more vulnerabilities.</p>
<hr/>
<p id="fn1">[1] Our bug bounty program has <a href="https://www.mozilla.org/en-US/security/client-bug-bounty/">similar rules</a>. <a href="https://hacks.mozilla.org/feed/#ref1" title="Jump back to reference"><img alt="&#x21A9;" class="wp-smiley" src="https://s.w.org/images/core/emoji/17.0.2/72x72/21a9.png" style="height: 1em;"/></a></p>
<p>The post <a href="https://hacks.mozilla.org/2026/05/behind-the-scenes-hardening-firefox/">Behind the Scenes Hardening Firefox with Claude Mythos Preview</a> appeared first on <a href="https://hacks.mozilla.org">Mozilla Hacks - the Web developer blog</a>.</p></div>
    </content>
    <updated>2026-05-07T16:01:21Z</updated>
    <published>2026-05-07T16:01:21Z</published>
    <category term="Featured Article"/>
    <category term="Firefox"/>
    <category term="Security"/>
    <author>
      <name>Brian Grinstead</name>
    </author>
    <source>
      <id>https://hacks.mozilla.org/</id>
      <link href="https://hacks.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://hacks.mozilla.org/" rel="alternate" type="text/html"/>
      <subtitle>hacks.mozilla.org</subtitle>
      <title>Mozilla Hacks – the Web developer blog</title>
      <updated>2026-05-21T18:30:22Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148235</id>
    <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-may-7-2026/148235" rel="alternate" type="text/html"/>
    <title>Firefox Profiler Deployment (May 7, 2026)</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The latest version of the <a href="https://profiler.firefox.com/" rel="noopener nofollow ugc">Firefox Profiler</a> is now live! Check out the full changelog below to see what’s changed:</p>
<p><strong>Highlights:</strong></p>
<ul>
<li>[Markus Stange] Use custom splitter component (<a href="https://github.com/firefox-devtools/profiler/pull/4606" rel="noopener nofollow ugc">#4606</a>)</li>
<li>[fatadel] Fix Download button text color when clicked (<a href="https://github.com/firefox-devtools/profiler/pull/5985" rel="noopener nofollow ugc">#5985</a>)</li>
<li>[Nazım Can Altınova] Add <code>profiler-cli</code> for querying profiles (<a href="https://github.com/firefox-devtools/profiler/pull/5963" rel="noopener nofollow ugc">#5963</a>)
<ul>
<li>Firefiox Profiler now has a CLI! <img alt=":tada:" class="emoji" height="20" src="https://emoji.discourse-cdn.com/twitter/tada.png?v=15" title=":tada:" width="20"/> You can download it here: <a href="https://www.npmjs.com/package/@firefox-devtools/profiler-cli" rel="noopener nofollow ugc">https://www.npmjs.com/package/@firefox-devtools/profiler-cli</a></li>
</ul>
</li>
<li>[Nazım Can Altınova] Fix the unnecessary stringify of Uint8Array contents during zip profile extraction (<span class="hashtag-raw">#6004</span>)</li>
</ul>
<p><strong>Other Changes:</strong></p>
<ul>
<li>[Samuel Glauser] Fix fullscreen icon size in bottom box (<a href="https://github.com/firefox-devtools/profiler/pull/5987" rel="noopener nofollow ugc">#5987</a>)</li>
<li>[Nazım Can Altınova] Bump profiler cli version to 0.1.0 (<a href="https://github.com/firefox-devtools/profiler/pull/5996" rel="noopener nofollow ugc">#5996</a>)</li>
<li>[Markus Stange] Switch from max-height to maxHeight in JSX style={{…}}. (<a href="https://github.com/firefox-devtools/profiler/pull/5990" rel="noopener nofollow ugc">#5990</a>)</li>
<li>[carverdamien] Fix comment about how time and duration are stored (<a href="https://github.com/firefox-devtools/profiler/pull/5997" rel="noopener nofollow ugc">#5997</a>)</li>
<li>[Nazım Can Altınova] Do not show console error when libnames are failed to parse as a URL (<a href="https://github.com/firefox-devtools/profiler/pull/5993" rel="noopener nofollow ugc">#5993</a>)</li>
<li>[Nazım Can Altınova] Fix the unnecessary stringify of Uint8Array contents during zip profile extraction (<a href="https://github.com/firefox-devtools/profiler/pull/6004" rel="noopener nofollow ugc">#6004</a>)</li>
</ul>
<p>Big thanks to our amazing localizers for making this release possible:</p>
<ul>
<li>en-CA: chutten</li>
<li>en-CA: Saurabh</li>
<li>en-GB: Ian Neal</li>
<li>es-CL: ravmn</li>
<li>fy-NL: Fjoerfoks</li>
<li>ia: Melo46</li>
<li>nl: Mark Heijl</li>
<li>ru: Valery Ledovskoy</li>
<li>sv-SE: Andreas Pettersson</li>
</ul>
<p>Find out more about the Firefox Profiler on <a href="https://profiler.firefox.com" rel="noopener nofollow ugc">profiler.firefox.com</a>! If you have any questions, join the discussion on our <a href="https://chat.mozilla.org/#/room/#profiler:mozilla.org" rel="noopener nofollow ugc">Matrix channel</a>!</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/firefox-profiler-deployment-may-7-2026/148235">Read full topic</a></p></div>
    </summary>
    <updated>2026-05-07T14:59:02Z</updated>
    <published>2026-05-07T14:59:02Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>canova</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-may-7-2026/148235.rss" title="Firefox Profiler Deployment (May 7, 2026)"/>
      <updated>2026-06-12T10:58:53Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148223</id>
    <link href="https://discourse.mozilla.org/t/new-deploy-of-perfcompare-may-5th/148223" rel="alternate" type="text/html"/>
    <title>New deploy of PerfCompare! May 5th</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The latest version of<a href="https://perf.compare" rel="noopener nofollow ugc"> PerfCompare</a> is now live!</p>
<p>Check out the change-log below to see the updates:</p>
<p><strong>Highlights</strong></p>
<p>[kala]</p>
<ul>
<li>
<p><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2032537">Bug 2032537: Results Page: show count of the improvements and regressions in the subtests per platform</a></p>
</li>
<li>
<p><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026346">Bug 2026346: Created cookies to save previous sort and filter selection</a></p>
</li>
<li>
<p><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026353">Bug 2026353: Sorting CLES by abs value - 0.5</a></p>
</li>
</ul>
<p><strong>Other contributions:</strong></p>
<p>[kala]</p>
<ul>
<li><a href="https://github.com/mozilla/perfcompare/pull/1027" rel="noopener nofollow ugc">Added the optional param enable_silverman_kde to loaders and treeherder logic</a></li>
</ul>
<p>[moijes]</p>
<ul>
<li><a href="https://github.com/mozilla/perfcompare/pull/1011" rel="noopener nofollow ugc">Bug-2022758: Remove redundant Dark fonts</a></li>
</ul>
<p>Thank you for the contributions!</p>
<p>Bugs or feature requests can be <a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Testing&amp;component=PerfCompare&amp;status_whiteboard=%5Bpcf%5D">filed on Bugzilla</a>. The team can also be found on <a href="https://matrix.to/#/#perfcompare:mozilla.org" rel="noopener nofollow ugc">the #perfcompare channel on Element</a>. Come and chat!</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/new-deploy-of-perfcompare-may-5th/148223">Read full topic</a></p></div>
    </summary>
    <updated>2026-05-05T18:22:09Z</updated>
    <published>2026-05-05T18:22:09Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>csevere</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/new-deploy-of-perfcompare-may-5th/148223.rss" title="New deploy of PerfCompare! May 5th"/>
      <updated>2026-06-12T10:58:53Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148222</id>
    <link href="https://discourse.mozilla.org/t/mozphab-2-15-0-released/148222" rel="alternate" type="text/html"/>
    <title>MozPhab 2.15.0 Released</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Bugs resolved in Moz-Phab 2.15.0:</p>
<ul>
<li><a href="https://bugzilla.mozilla.org/2033810">bug 2033810</a> Open the browser to the uplift request form on successful <code>moz-phab uplift</code></li>
<li><a href="https://bugzilla.mozilla.org/2036007">bug 2036007</a> test_integration_patch.py flaky since v2.14.0</li>
<li><a href="https://bugzilla.mozilla.org/2036394">bug 2036394</a> moz-phab: circleci =&gt; github action</li>
<li><a href="https://bugzilla.mozilla.org/2036890">bug 2036890</a> Push <code>moz-phab</code> to PyPI using Trusted Publisher workflow</li>
</ul>
<p>Discuss these changes in <span class="hashtag-raw">#engineering-workflow</span> on Slack or <span class="hashtag-raw">#Conduit</span> Matrix.</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/mozphab-2-15-0-released/148222">Read full topic</a></p></div>
    </summary>
    <updated>2026-05-05T16:23:33Z</updated>
    <published>2026-05-05T16:23:33Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>sheehan</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/mozphab-2-15-0-released/148222.rss" title="MozPhab 2.15.0 Released"/>
      <updated>2026-06-12T10:58:53Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://hacks.mozilla.org/?p=48312</id>
    <link href="https://hacks.mozilla.org/2026/05/trustworthy-javascript-for-the-open-web/" rel="alternate" type="text/html"/>
    <title>Trustworthy JavaScript for the Open Web</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The open web is a critical platform for applications that handle highly sensitive data, from private communications to financial transactions and medical records. Traditionally, servers are trusted to deliver the appropriate code and resources for their web applications to browsers, who then provide a secure and isolated environment for their execution. In some circumstances, this […]</p>
<p>The post <a href="https://hacks.mozilla.org/2026/05/trustworthy-javascript-for-the-open-web/">Trustworthy JavaScript for the Open Web</a> appeared first on <a href="https://hacks.mozilla.org">Mozilla Hacks - the Web developer blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The open web is a critical platform for applications that handle highly sensitive data, from private communications to financial transactions and medical records. Traditionally, servers are trusted to deliver the appropriate code and resources for their web applications to browsers, who then provide a secure and isolated environment for their execution. In some circumstances, this trust model falls short.</p>
<p>Consider a browser-based messaging application, like Signal or WhatsApp, which uses end-to-end encryption. The browser depends on the server to provide a trustworthy javascript implementation of the app; which ensures the user’s messages and cryptographic keys are suitably protected. A malicious or compromised server could selectively serve modified code to some users, undermining their security with little risk of detection. This challenges the basic premise of end-to-end encryption: that a misbehaving server should not be able to compromise user security.</p>
<h3><b><i>Towards Verifiable Security on the Web</i></b></h3>
<p>For web applications to be trustworthy in the presence of malicious servers, two properties are essential:</p>
<ul>
<li><b>Integrity:</b> The code executed by the user matches what the developer committed to in a manifest.</li>
<li><b>Transparency:</b> These manifests are publicly logged and can be independently audited.</li>
</ul>
<p><a href="https://github.com/waict-wg">Web Application Integrity, Consistency and Transparency (WAICT)</a> brings these properties to the web platform.</p>
<p><img alt="" class="alignnone size-large wp-image-48313" height="163" src="https://hacks.mozilla.org/wp-content/uploads/2026/05/waict_2_blogpost-500x163.png" width="500"/></p>
<p>WAICT allows websites to cryptographically bind their client-side code to a manifest and commit that manifest to a publicly auditable log. Sites which need this stronger trust model can then opt in to WAICT enforcement. If an opted-in site delivers code that has not been publicly logged, the browser rejects it and attacks that were previously invisible become observable and attributable. This ensures that the code delivered to user’s machines is consistent with the publicly available code which security researchers can inspect.</p>
<p><b><i>Bringing Integrity and Transparency to the Open Web</i></b></p>
<p>We are collaborating with partners across the ecosystem – including Cloudflare, the Freedom of the Press Foundation and Meta – to ensure the deployment model is practical, secure, and as simple as possible. You can learn more about WAICT in our <a href="https://www.youtube.com/watch?v=tCLGt0L174c">joint talk</a> at <a href="https://rwc.iacr.org/">Real World Cryptography 2026</a>.</p>
<p>An early prototype of WAICT is available behind a pref in <a href="https://firefox.com/nightly">Firefox Nightly</a> to help validate the approach in real-world scenarios. You can test drive the prototype on <a href="https://waict.dev/">https://waict.dev/</a> – including an end-to-end encrypted video calling app secured by WAICT. The implementation is a work in progress, not a finished solution, but it provides a concrete foundation for iteration and standardization. We’re developing the <a href="https://github.com/waict-wg">specifications</a> in the open and welcome early feedback.</p>
<p>WAICT marks an important step toward making strong, verifiable application security a first-class property of the open web.</p>
<p><i>With special thanks to Anna Weine, Benjamin Beurdouche, Christoph Kerschbaumer, Dennis Jackson, Frederik Braun, and Tom Schuster.</i></p>
<p>The post <a href="https://hacks.mozilla.org/2026/05/trustworthy-javascript-for-the-open-web/">Trustworthy JavaScript for the Open Web</a> appeared first on <a href="https://hacks.mozilla.org">Mozilla Hacks - the Web developer blog</a>.</p></div>
    </content>
    <updated>2026-05-05T15:49:11Z</updated>
    <published>2026-05-05T15:49:11Z</published>
    <category term="Firefox"/>
    <category term="Security"/>
    <author>
      <name>Firefox Security Team</name>
    </author>
    <source>
      <id>https://hacks.mozilla.org/</id>
      <link href="https://hacks.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://hacks.mozilla.org/" rel="alternate" type="text/html"/>
      <subtitle>hacks.mozilla.org</subtitle>
      <title>Mozilla Hacks – the Web developer blog</title>
      <updated>2026-05-21T18:30:22Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:E5j6BoxZ-7w</id>
    <link href="https://www.youtube.com/watch?v=E5j6BoxZ-7w" rel="alternate" type="text/html"/>
    <title>Last Lecture: Writing the Data Docs</title>
    <summary>Will Lachance gives a last lecture on writing data documentation at Mozilla.</summary>
    <updated>2026-05-05T11:46:43Z</updated>
    <published>2021-12-20T14:58:29Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/netpolicy/?p=2565</id>
    <link href="https://blog.mozilla.org/netpolicy/2026/05/05/mozilla-calls-on-uk-policymakers-to-address-the-roots-of-online-harm-not-undermine-the-open-web/" rel="alternate" type="text/html"/>
    <title>Mozilla calls on UK policymakers to address the roots of online harm, not undermine the open web</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Mozilla has joined a coalition of 19 digital rights organizations and technology providers in a joint statement, urging UK policymakers not to undermine the open web in their efforts to … <a class="go" href="https://blog.mozilla.org/netpolicy/2026/05/05/mozilla-calls-on-uk-policymakers-to-address-the-roots-of-online-harm-not-undermine-the-open-web/">Read more</a></p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/05/05/mozilla-calls-on-uk-policymakers-to-address-the-roots-of-online-harm-not-undermine-the-open-web/">Mozilla calls on UK policymakers to address the roots of online harm, not undermine the open web</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Mozilla has joined a coalition of 19 digital rights organizations and technology providers in a <a href="https://blog.mozilla.org/netpolicy/files/2026/05/UK-joint-statement-against-age-gates_final.pdf">joint statement</a>, urging UK policymakers not to undermine the open web in their efforts to protect young people online.</p>
<p>Our mission is grounded in the belief that the internet must remain open and accessible to all, and that privacy and security online are fundamental. Around the globe, we are witnessing blunt policy interventions like age gates or restrictions on VPNs that put these values at risk. Child safety is a complex and central issue to us all, and as we have <a href="https://blog.mozilla.org/netpolicy/2025/12/19/australias-social-media-ban-why-age-limits-wont-fix-what-is-wrong-with-online-platforms/">said before</a>, Mozilla supports robust, proportionate safeguards for minors. However, we are concerned that mandatory age verification or VPN restrictions undermine online privacy and security, people’s ability to express themselves and access information, and ultimately the health of the web itself.</p>
<p>In an attempt to address tough questions surrounding online harms, UK policymakers are currently consulting on which services and features should be placed behind age gates as part of a <a href="https://www.gov.uk/government/consultations/growing-up-in-the-online-world-a-national-consultation">national consultation on online harms</a>. A broad range of services are being considered for age restrictions, including search engines, games and VPNs. Even targeted age restrictions of certain features would require all users to submit to age assurance systems. However, existing age assurance technologies <a href="https://kgi.georgetown.edu/wp-content/uploads/2026/01/Age_Assurance_Online_Technical-Assessment_Report_KGI.pdf">have been found</a> to either undermine users’ privacy and data security, to be insufficiently accurate or not widely accessible across populations. Age restrictions could also entrench the dominance of gatekeepers and fragment the web into a patchwork of age-gated jurisdictions.</p>
<p>Beyond the significant risks associated with mandating age assurance across core internet services, we are particularly concerned about proposals to restrict the use of VPNs. VPNs and similar services are essential privacy and security tools used by millions of users for legitimate purposes. Restricting the use of privacy-preserving technologies undermines efforts to empower users to navigate the web safely and to develop digital literacy.</p>
<p>Rather than age-restricting a growing number of services, we believe that addressing the roots of child safety concerns, such as poor content moderation, irresponsible data practices, and deceptive design, is a more proportionate and effective way forward. We thus urge policymakers to prioritize policy interventions that centre children’s’ rights and all users’ agency and choice, and protect, not undermine, the open web.</p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/05/05/mozilla-calls-on-uk-policymakers-to-address-the-roots-of-online-harm-not-undermine-the-open-web/">Mozilla calls on UK policymakers to address the roots of online harm, not undermine the open web</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </content>
    <updated>2026-05-05T09:32:36Z</updated>
    <published>2026-05-05T09:32:36Z</published>
    <category term="Age Verification"/>
    <category term="Europe"/>
    <category term="Openness"/>
    <author>
      <name>Svea Windwehr</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/netpolicy/</id>
      <link href="https://blog.mozilla.org/netpolicy/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/netpolicy/" rel="alternate" type="text/html"/>
      <subtitle>Mozilla's official blog on open Internet policy initiatives and developments</subtitle>
      <title>Open Policy &amp; Advocacy</title>
      <updated>2026-06-11T14:28:25Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:OTe47t0gGAE</id>
    <link href="https://www.youtube.com/watch?v=OTe47t0gGAE" rel="alternate" type="text/html"/>
    <title>An opinionated intro to NLP (text analytics)</title>
    <summary>Rebecca BurWei from Mozilla Data Science gives an introduction to Natural Language Processing.</summary>
    <updated>2026-05-05T03:14:33Z</updated>
    <published>2021-12-20T14:59:21Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://tantek.com/2026/124/b1/may-the-focus-be-with-you-iphone-grayscale</id>
    <link href="https://tantek.com/2026/124/b1/may-the-focus-be-with-you-iphone-grayscale" rel="alternate" title="May the Focus Be With You!" type="text/html"/>
    <title xml:lang="en-US">May the Focus Be With You!</title>
    <content type="xhtml" xml:lang="en-US"><div xmlns="http://www.w3.org/1999/xhtml"><div class="entry-content e-content">
<p>
Last weekend at IndieWebCamp I noticed 
<a href="https://jamesg.blog/">James</a> 
had setup his iPhone in grayscale. 
I think I first saw that on 
<a href="https://adactio.com">Jeremy’s</a> 
phone years ago. 
I remember trying it on my iPod Touch for a while, eventually switching back to see color photos.
</p>
<p>
This morning while chatting with James I asked him about his grayscale setup and why. He pointed out it’s less distracting, a calmer experience, and helps him stay focused when he uses his iPhone for specific tasks.
</p>
<p>
I decided to give it another try. The setting is quite buried. Here are the items to tap, starting from your home screen, or wherever you moved your <b>⚙️ Settings</b> app:
</p>
<ul>
<li>⚙️ Settings</li>
<li>🟦 Accessibility &gt;</li>
<li>🟦 Display &amp; Text Size &gt;</li>
<li>Color Filters &gt;</li>
<li>Color Filters (⚫️__) [slide this toggle to the right to turn it on]</li>
<li>Greyscale [tap this and you should see it checked]</li>
</ul>
<p>
James said one more setting has helped him stick with grayscale for years now. 
Triple-press the side button to toggle color/grayscale modes helps quickly switch to color to view a photo or a video, actual color content, then triple-press-side-button to return to a calmer UI.
</p>
<ul>
<li>⚙️ Settings</li>
<li>⏺ Accessibility &gt;</li>
<li>⏺ Accessibility Shortcut &gt;</li>
<li>Color Filters [tap this and you should see it checked]</li>
</ul>
<p>
In addition, I have found the back-tap feature handy and personally more memorable.
Double (or triple) back-tap to toggle color/grayscale mode and toggle back.
</p>
<ul>
<li>⚙️ Settings</li>
<li>⏺ Accessibility &gt;</li>
<li>👆🏻 Touch &gt;</li>
<li>Back Tap &gt;</li>
<li>Double-tap &gt;</li>
<li>Color Filters [tap this and you should see it checked]</li>
</ul>
<p>
When using my phone outside in the sun, I noticed the absence of color made it hard to distinguish or even read some things. I changed a few more settings to improve sunlight readability/usability.
</p>
<ul>
<li>⚙️ Settings</li>
<li>⏺ Accessibility &gt;</li>
<li>⏺ Display &amp; Text Size &gt;</li>
<li>Bold Text (⚫️__) [tap/slide this toggle to the right to turn it on]</li>
<li>Increase Contrast (⚫️__) [tap/slide this too]</li>
<li>Differentiate Without Color (⚫️__) [tap/slide this too]</li>
</ul>
<p>
In the absence of color on my iPhone, I have spent less time using it today, felt more focused when I used it for a specific task, and have started to feel both less compelled to check things, and less of a “rush” when interacting with iPhone apps and their user interfaces.
</p>
<p>
Color saturated apps stripped of their color are starting to feel like older apps or appliances. Switching Spotify playlists felt a bit like pressing station presets on a car radio. Discord felt like an enhanced IRC client. Even some of my rotating lock screen landscape photos have strong Ansel Adams vibes, while my urban lockscreen photos have a calmer dreamlike quality.
</p>
<p>
Perhaps the use of color in modern mobile app user interfaces is the new 
<a href="https://en.wikipedia.org/wiki/Chartjunk">chartjunk</a>, extraneous and distracting from the task at hand, just as classic chartjunk is extraneous and distracting from the information being presented. Most mobile apps seem to be in an attention-seeking arms race against each other, ever more saturated colors to draw you in like a casino.
</p>
<p>
Using a grayscale iPhone user interface for most of the day has felt noticeably calmer. Enough for me to try it again for at least a few days and see how it goes.
</p>
<p>
Thanks again to James for his explanations and encouragement. See his write-up: 
<a href="https://jamesg.blog/2026/05/04/using-greyscale">Using greyscale</a>, when he started, why, why he continues to use it, and instructions for his setup.
</p>
<p>
Try it for yourself and see how it feels.
</p>
<p>
May the Force of your will be with you, free of distractions and dopamine conditioned impulses.
</p>
<h3>Further Reading</h3>
<ul>
<li><time>2018-01-12</time> The New York Times: 
<a href="https://www.nytimes.com/2018/01/12/technology/grayscale-phone.html">Is the Answer to Phone Addiction a Worse Phone?</a> / I’ve gone gray, and it’s great.</li>
<li><time>2018-05-03</time> The Observer: 
<a href="https://observer.com/2018/05/grayscale-can-cure-smartphone-addiction/">Grayscale Is a Quick Cure to Smartphone Addiction—And Here’s How to Use It</a></li>
<li><time>2019-12-01</time> WIRED: 
<a href="https://www.wired.com/story/grayscale-ios-android-smartphone-addiction/">Try Grayscale Mode to Curb Your Phone Addiction</a></li>
</ul>
</div></div>
    </content>
    <updated>2026-05-05T02:20:00Z</updated>
    <published>2026-05-05T02:20:00Z</published>
    <source>
      <id>https://tantek.com/updates.atom?ot=article</id>
      <author>
        <name>Tantek</name>
        <uri>https://tantek.com/</uri>
      </author>
      <link href="https://tantek.com/" rel="alternate" title="Tantek &#xC7;elik" type="text/html"/>
      <link href="https://tantek.com/updates.atom?ot=article" rel="self" type="application/atom+xml"/>
      <link href="https://pubsubhubbub.superfeedr.com/" rel="hub" type="text/html"/>
      <title xml:lang="en-US">Tantek Çelik</title>
      <updated>2026-05-05T02:20:00Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:k1cvnVKOmM8</id>
    <link href="https://www.youtube.com/watch?v=k1cvnVKOmM8" rel="alternate" type="text/html"/>
    <title>GLAM Datasets</title>
    <summary>Marina Samuel and Anthony Miyaguchi talk about the ETL pipeline created for the GLAM project (https://github.com/mozilla/glam).</summary>
    <updated>2026-05-04T22:44:24Z</updated>
    <published>2021-01-15T16:09:41Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:V5FgVbxm-cc</id>
    <link href="https://www.youtube.com/watch?v=V5FgVbxm-cc" rel="alternate" type="text/html"/>
    <title>Data Club Lightning Talk: Jan-Erik Rediger - Your personal Glean data pipeline</title>
    <summary>This talk was given as part of the Data Club Lightning Talk Session on February 11th, 2022.
More on https://blog.mozilla.org/data/2022/02/25/this-week-in-glean-your-personal-glean-data-pipeline
Information about Glean: https://mozilla.github.io/glean/book/index.html</summary>
    <updated>2026-05-04T22:23:40Z</updated>
    <published>2022-02-25T13:41:22Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:nZupfJy6I0A</id>
    <link href="https://www.youtube.com/watch?v=nZupfJy6I0A" rel="alternate" type="text/html"/>
    <title>Data Club: Jan-Erik Rediger - Little Bobby Tables - from metrics.yaml to data-filled columns</title>
    <summary>A short story about Little Bobby Tables and how we know what data to fill in where.</summary>
    <updated>2026-05-04T18:06:43Z</updated>
    <published>2024-02-05T15:18:38Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:Y3IOY-kmk70</id>
    <link href="https://www.youtube.com/watch?v=Y3IOY-kmk70" rel="alternate" type="text/html"/>
    <title>Data Club Talk: Jan-Erik Rediger - The Glean UniFFI migration and how no one noticed</title>
    <summary>Given at the Mozilla Data Club on August 12th, 2022.</summary>
    <updated>2026-05-04T17:13:30Z</updated>
    <published>2022-08-15T12:01:56Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/05/04/outreachy-2026-may/</id>
    <link href="https://blog.rust-lang.org/2026/05/04/outreachy-2026-may/" rel="alternate" title="Rust is participating in Outreachy" type="text/html"/>
    <title xml:lang="en">Rust is participating in Outreachy</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>The Rust Project has been building up a good history of participating in various open-source mentorship programs, including <a href="https://blog.rust-lang.org/2026/04/30/gsoc-2026-selected-projects/" rel="external">Google Summer of Code</a> for three years (including this year) and <a href="https://blog.rust-lang.org/2024/05/07/OSPP-2024/" rel="external">previously OSPP</a>. We're happy to announce that this year we are also participating in <a href="https://www.outreachy.org/" rel="external">Outreachy</a> starting in the May 2026 cohort.</p>
<p>Each of these mentorship programs has different criteria for eligibility depending on who they target and the motivations of the program. Outreachy provides internships in open source, to people from any background who face underrepresentation, systemic bias, or discrimination in the technical industry where they are living. You can learn more about the Outreachy program <a href="https://www.outreachy.org/" rel="external">on their website</a>.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/04/outreachy-2026-may/#what-is-outreachy-and-how-is-it-different-than-google-summer-of-code"/>
What is Outreachy and how is it different than Google Summer of Code</h3>
<p>Outreachy is similar to Google Summer of Code (GSoC) in some aspects, but different in others. First off, unlike GSoC, Outreachy interns first apply to the overall program and only <em>then</em> can apply to specific communities. Second, while oftentimes GSoC applicants submit various contributions prior to their application, Outreachy has a dedicated period where contributions are not just optional, but required. Finally, Outreachy applicants submit an application similar to GSoC applications and communities pick interns based on those applications and the interns' contributions. Outreachy has two internship periods per year, one running from May to August (in which we are currently participating) and one from December to March.</p>
<p>The other major difference between Google Summer of Code and Outreachy is the source of intern stipends. For GSoC, Google graciously covers contributor stipends and overhead. For Outreachy, communities instead cover the interns' stipends and overhead.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/04/outreachy-2026-may/#we-are-mentoring-4-interns-for-the-may-2026-cohort"/>
We are mentoring 4 interns for the May 2026 cohort</h3>
<p>Because of limited funding availability and mentoring capacity, the Rust Project decided to select four interns for mentorship. We'll briefly share these projects below.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/04/outreachy-2026-may/#calling-overloaded-c-functions-from-rust"/>
Calling overloaded C++ functions from Rust</h4>
<p><a href="https://www.github.com/Ajay-singh1" rel="external">Ajay Singh</a> has been selected, mentored by <a href="https://github.com/teor2345" rel="external">teor</a>, <a href="https://github.com/cramertj" rel="external">Taylor Cramer</a>, and <a href="https://github.com/thunderseethe" rel="external">Ethan Smith</a>.</p>
<p>This project aims to implement an experimental feature for calling overloaded C++ functions from Rust, and to begin testing that feature in a few representative use cases.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/04/outreachy-2026-may/#code-coverage-of-the-rust-compiler-at-scale"/>
Code coverage of the Rust compiler at scale</h4>
<p><a href="https://github.com/akintewe" rel="external">Akintewe Oluwasola</a> has been selected, mentored by <a href="https://github.com/jackh726/" rel="external">Jack Huey</a>.</p>
<p>This project aims to develop the workflows to run and analyze code coverage of the compiler at the scale of the entire compiler test suite and on ecosystem crates detected by crater. The hope is to be able to detect when the compiler is inadequately tested, both within the compiler and in the ecosystem, and to build tools to do continuous analysis on this.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/04/outreachy-2026-may/#fuzzing-the-a-mir-formality-type-system-implementation"/>
Fuzzing the a-mir-formality type system implementation</h4>
<p><a href="https://github.com/System625" rel="external">Tunde-Ajayi Olamiposi</a> has been selected, mentored by <a href="https://github.com/nikomatsakis/" rel="external">Niko Matsakis</a>, <a href="https://github.com/lqd/" rel="external">Rémy Rakic</a>, and <a href="https://github.com/tiif" rel="external">tiif</a>.</p>
<p>This project aims to implement fuzzing for <a href="https://github.com/rust-lang/a-mir-formality/" rel="external">a-mir-formality</a>, an in-progress model for Rust's type and trait system.  The goal is to generate programs in order to identify rules with underspecified semantics in a-mir-formality.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/04/outreachy-2026-may/#improve-the-security-of-github-actions-of-the-rust-project"/>
Improve the security of GitHub Actions of the Rust Project</h4>
<p><a href="https://github.com/rukysandy" rel="external">oghenerukevwe Sandra Idjighere</a> has been selected, mentored by <a href="https://github.com/marcoieni" rel="external">Marco Ieni</a> and <a href="https://github.com/ubiratansoares" rel="external">Ubiratan Soares</a>.</p>
<p>This project aims to improve the security of GitHub Actions workflows of the repositories owned by the Rust Project. It will develop tools and workflows, integrating with existing software, to analyze Github repositories and detect if they follow the best security practices, fix existing issues, and ensure that good security practices are followed in the future.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/04/outreachy-2026-may/#what-s-next"/>
What's next</h3>
<p>Over the next 3 months, the interns will work closely with their mentors to make progress on their projects. When the internship period is over, we'll write another blog post to share the results! See you then!</p>
<p>We also want to thank all the people that submitted applications and made contributions. It was quite tough to decide which applicants to select. Hopefully we will participate in Outreachy again in the future and there are other opportunities to participate. We also very much welcome you to stick around and continue being involved - there is a ton of places in the Rust Project with opportunities to be involved.</p></div>
    </content>
    <updated>2026-05-04T00:00:00Z</updated>
    <published>2026-05-04T00:00:00Z</published>
    <author>
      <name>Jack Huey</name>
    </author>
    <source>
      <id>https://blog.rust-lang.org/</id>
      <author>
        <name>Maintained by the Rust Teams.</name>
        <uri>https://github.com/rust-lang/blog.rust-lang.org/</uri>
      </author>
      <link href="https://blog.rust-lang.org/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://blog.rust-lang.org/" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en">Empowering everyone to build reliable and efficient software.</subtitle>
      <title xml:lang="en">Rust Blog</title>
      <updated>2026-06-11T14:20:46Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://williamdurand.fr/2026/05/01/moziversary-8</id>
    <link href="https://williamdurand.fr/2026/05/01/moziversary-8/" rel="alternate" type="text/html"/>
    <title>Moziversary #8</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><em>Today is my eighth Moziversary 🎂 I joined Mozilla as a full-time employee on
May 1st, 2018. I previously blogged in <del>2019</del>, <a href="https://williamdurand.fr/2020/05/01/moziversary-2/">2020</a>, <a href="https://williamdurand.fr/2021/05/01/moziversary-3/">2021</a>, <a href="https://williamdurand.fr/2022/05/01/moziversary-4/">2022</a>,
<a href="https://williamdurand.fr/2023/05/01/moziversary-5/">2023</a>, <a href="https://williamdurand.fr/2024/05/01/moziversary-6/">2024</a>, and <a href="https://williamdurand.fr/2025/05/05/moziversary-7/">2025</a>.</em></p>

<p>You might have come across this <a href="https://blog.mozilla.org/addons/tag/data-consent/">built-in data consent</a> thing for extensions
in Firefox. I spent a good chunk of last year working on this project, from
developing a technical proposal to implementing the feature in <a href="https://firefox-source-docs.mozilla.org/overview/gecko.html">Gecko</a>,
Firefox for desktop and Firefox for Android.</p>

<p>Talking about Android, I <a href="https://groups.google.com/a/mozilla.org/g/governance/c/OPdtww0H07I/m/Hc5WnwwPFgAJ">became the module owner</a> for
<a href="https://firefox-source-docs.mozilla.org/mots/index.html#fenix-add-ons"><em>Fenix::Add-ons</em></a>, a module for all the code related to
add-ons in Firefox for Android (which we call “Fenix” internally). Between the
creation of this new module, and an ever-solidifying collaboration between the
Add-ons and Android teams, the support for extensions in Firefox for Android has
a bright future! Having started my Android journey in 2023, this feels like a
noteworthy achievement.</p>

<p>Near the end of last year, I moved back to being a full-time <a href="https://addons.mozilla.org/">AMO</a> engineer to
support a team that was down to two engineers. I redesigned the detail page, and
started some refactoring on our security scanners, which I had originally
created back in 2019 😬</p>

<p>In other news, I joined the AI/LLM/vibe-coding crowd thanks to my colleague
<a href="https://paul.cx/">Paul</a>, and it took me about a month to get brain-fried… <a href="https://siddhantkhare.com/writing/ai-fatigue-is-real">AI
fatigue is real</a>, indeed. That said, Claude code has been somewhat useful to
me, and I don’t <em>hate</em> it, but I also don’t <em>love</em> it.</p>

<p>Thank you to everyone in the Add-ons team as well as to all the folks I had the
pleasure to work with so far. Cheers!</p></div>
    </content>
    <updated>2026-05-01T00:00:00Z</updated>
    <source>
      <id>https://williamdurand.fr/</id>
      <author>
        <name>William Durand</name>
        <email>will@drnd.me</email>
      </author>
      <link href="https://williamdurand.fr/mozilla.xml" rel="self" type="application/atom+xml"/>
      <link href="https://williamdurand.fr" rel="alternate" type="text/html"/>
      <title>Mozilla // William Durand</title>
      <updated>2026-05-01T13:00:04Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/05/01/nvptx-baseline-update/</id>
    <link href="https://blog.rust-lang.org/2026/05/01/nvptx-baseline-update/" rel="alternate" title="Raising the baseline for the `nvptx64-nvidia-cuda` target" type="text/html"/>
    <title xml:lang="en">Raising the baseline for the `nvptx64-nvidia-cuda` target</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>The <code>nvptx64-nvidia-cuda</code> target is a compilation target for NVIDIA GPUs. When using this target, the final output is <a href="https://docs.nvidia.com/cuda/parallel-thread-execution/index.html" rel="external">PTX</a>. Two version choices shape that output:</p>
<ul>
<li>a GPU architecture (for example, <code>sm_70</code>, <code>sm_80</code>, …), which determines which GPUs can run the PTX, and</li>
<li>a PTX ISA version, which determines which CUDA driver versions can load (and JIT-compile) the PTX.</li>
</ul>
<p>In Rust 1.97 (scheduled for release on July 9, 2026), the baseline PTX ISA version and GPU architecture for <code>nvptx64-nvidia-cuda</code> will be <a href="https://github.com/rust-lang/compiler-team/issues/965" rel="external">increased</a>. These changes affect both the Rust compiler (<code>rustc</code>) and related host tooling, and they make it impossible to generate PTX artifacts compatible with older GPUs and older CUDA drivers.</p>
<p>The new minimum supported versions will be:</p>
<ul>
<li><strong>PTX ISA 7.0</strong> (requires a CUDA 11 driver or newer)</li>
<li><strong>SM 7.0</strong> (GPUs with compute capability below 7.0 are no longer supported)</li>
</ul>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/01/nvptx-baseline-update/#why-are-the-requirements-being-changed"/>
Why are the requirements being changed?</h3>
<p>Until now, Rust has supported emitting PTX for a wide range of GPU architectures and PTX ISA versions. In practice, several defects existed that could cause valid Rust code to trigger compiler crashes or miscompilations. Raising the baseline addresses these issues and enables more complete support for the remaining supported hardware.</p>
<p>Removing support affects users of the architectures being removed. In this case, the most recent affected GPU architectures date back to 2017 and are no longer actively supported by NVIDIA. We therefore expect the overall impact of this change to be limited.</p>
<p>Maintaining support for these architectures would require substantial effort. These removals let us focus development efforts on improving correctness and performance for currently supported hardware.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/01/nvptx-baseline-update/#what-happens-when-i-update-to-rust-1-97"/>
What happens when I update to Rust 1.97?</h3>
<p>If you need to target a CUDA driver that does not support PTX ISA 7.0 (CUDA 10-era drivers and older), Rust 1.97 will no longer be able to generate PTX compatible with that environment. Similarly, if you need to run on GPUs with compute capability below 7.0 (for example, Maxwell or Pascal), Rust 1.97 will no longer be able to generate compatible PTX for those GPUs.</p>
<p>Assuming you are targeting a CUDA driver compatible with CUDA 11 or newer and using GPUs with compute capability 7.0 or newer:</p>
<ul>
<li>If you do <strong>not</strong> specify <code>-C target-cpu</code>, the new default will be <code>sm_70</code>, and your build should continue to work (but will no longer be compatible with pre-Volta GPUs).</li>
<li>If you currently specify an older <code>-C target-cpu</code> (for example, <code>sm_60</code>), you will need to either:
<ul>
<li>remove that flag and let it default to <code>sm_70</code>, or</li>
<li>update it to <code>sm_70</code> or a newer architecture.</li>
</ul>
</li>
<li>If you already specify <code>-C target-cpu=sm_70</code> (or newer), there should be no behavioral changes from this update.</li>
</ul>
<p>For more details on building and configuring <code>nvptx64-nvidia-cuda</code>, see <a href="https://doc.rust-lang.org/rustc/platform-support/nvptx64-nvidia-cuda.html" rel="external">the platform support documentation</a>.</p></div>
    </content>
    <updated>2026-05-01T00:00:00Z</updated>
    <published>2026-05-01T00:00:00Z</published>
    <author>
      <name>Kjetil Kjeka</name>
    </author>
    <source>
      <id>https://blog.rust-lang.org/</id>
      <author>
        <name>Maintained by the Rust Teams.</name>
        <uri>https://github.com/rust-lang/blog.rust-lang.org/</uri>
      </author>
      <link href="https://blog.rust-lang.org/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://blog.rust-lang.org/" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en">Empowering everyone to build reliable and efficient software.</subtitle>
      <title xml:lang="en">Rust Blog</title>
      <updated>2026-06-11T14:20:46Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.nightly.mozilla.org/?p=2052</id>
    <link href="https://blog.nightly.mozilla.org/2026/04/30/import-ant-updates-these-weeks-in-firefox-issue-201/" rel="alternate" type="text/html"/>
    <title>Import-ant Updates – These Weeks in Firefox: Issue 201</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Highlights Import attributes will be supported for WebExtensions, starting in Firefox 150! This allows WebExtension authors to import CSS module scripts and JSON into their JavaScript modules. Examples: import sheet … <a class="go" href="https://blog.nightly.mozilla.org/2026/04/30/import-ant-updates-these-weeks-in-firefox-issue-201/">Read more</a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><h3>Highlights</h3>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import/with">Import attributes</a> will be supported for WebExtensions, starting in Firefox 150!
<ul>
<li>This allows WebExtension authors to import CSS module scripts and JSON into their JavaScript modules.</li>
<li>Examples:
<ul>
<li>import sheet from ‘./styles.css’ assert { type: ‘css’ };</li>
<li>import schema from “./policies-schema.json” with { type: “json” };</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API">The Web Serial API</a> is now available for testing in Firefox Nightly!
<ul>
<li>See <a href="https://fosstodon.org/@balloob/116398481380578311">https://fosstodon.org/@balloob/116398481380578311</a> for more details on how to test this our yourself.</li>
</ul>
</li>
<li>Dharma <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1953491">created a new quick action</a> for Firefox Library
<ul>
<li>You can test this out in Firefox Nightly 151 by typing “library” in the URL bar</li>
</ul>
</li>
</ul>
<p><img alt="Word &quot;library&quot; typed out in the URL bar to see the Firefox Library quick action" class="aligncenter wp-image-2033 size-full" height="173" src="https://blog.nightly.mozilla.org/files/2026/04/image3-1.png" width="326"/></p>
<ul>
<li>Alexandre Poirot [:ochameau] <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022844">Enabled the JS Tracer DevTool</a> by default on Nightly
<ul>
<li>Read up on how to use the JS Tracer <a href="https://firefox-source-docs.mozilla.org/devtools-user/javascript_tracer/index.html">to analyze JavaScript usage on the web here</a></li>
</ul>
</li>
</ul>
<h3>Friends of the Firefox team</h3>
<h3><a href="https://bugzilla.mozilla.org/buglist.cgi?title=Resolved%20bugs%20(excluding%20employees)&amp;quicksearch=1767617%2C2023779%2C2022175%2C2017985%2C2024960%2C1856191%2C1705177%2C1874155%2C1938466%2C2021421%2C2022400%2C2022402%2C2022403%2C2022405%2C2022406%2C2022407%2C1891970%2C1936929%2C1953621%2C2019901%2C1846829%2C1876108%2C1945835%2C2018841%2C2025287%2C2009917%2C2016934%2C1910902%2C1952061%2C2014334%2C2025701%2C1773932%2C2006572%2C2008178%2C2026551%2C1982888%2C2019235%2C2026649%2C1897102%2C1984029%2C1901274%2C2015071%2C2019936%2C2023180%2C958957%2C1876109%2C1997388%2C2000797%2C1950995%2C1986020%2C2018272%2C2018276%2C2021681%2C2027969%2C2022115%2C1999012%2C2016058%2C2026585%2C2023913%2C2028167%2C2028293%2C2028927%2C1998002%2C2011343%2C1997925%2C2026574%2C2029398%2C2029684%2C1948019%2C2008756%2C2022601%2C2026032%2C2030428%2C1968244%2C1975391%2C944228%2C1962904%2C1977741%2C1997346%2C2027867%2C2030631%2C1807516%2C2030998%2C2030999%2C2015491%2C2026697%2C2028153%2C2028628">Resolved bugs (excluding employees)</a></h3>
<h4>Volunteers that fixed more than one bug</h4>
<ul>
<li>Chris Vander Linden</li>
<li>Chukwuka Rosemary</li>
<li>DrSeed</li>
<li>EJiro Oghenekome</li>
<li>Frédéric Wang Nélar</li>
<li>Itoro James</li>
<li>japandi</li>
<li>John Iweh</li>
<li>jonathancabera</li>
<li>Josh Aas</li>
<li>Justin Peter</li>
<li>Keji Bakare</li>
<li>kofoworola shonuyi</li>
<li>konyhéa</li>
<li>Noble Chinonso</li>
<li>Okhuomon Ajayi</li>
<li>Oluwatobi</li>
<li>Pranjali Srivastava</li>
<li>ROSHAAN</li>
<li>Sameeksha</li>
</ul>
<h4>New contributors (🌟 = first patch)</h4>
<ul>
<li>🌟 Ben:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1705177"> UI issue in AST locale in Responsive design mode &gt; (open Device picker) &gt; Edit List… &gt; Add Custom Device</a></li>
<li>Brian Tsoi [:btsoi]:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1897102"> Create a badram checking library</a></li>
<li>🌟 Chidimma Okoloigwe:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1901274"> Port over tests in browser/base/content/test/sidebar</a></li>
<li>japandi:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986020">Use cenum for nsIHelperAppLauncherDialog reason constants to enable better typescript annotations</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1977741">The height of the pinned tabs area should be responsive to the number of pins</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2015071">Tab notes should not be saved when input contains only spaces</a></li>
</ul>
</li>
<li>Nathan Johnson [:narjoDev]:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1950995"> Remove browser.display.use_system_colors pref</a></li>
<li>DrSeed:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982888">Remove the defaultLauncherVisible Nimbus variable</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1962904">Firefox shows vertical tabs in new windows despite “Hide tabs and sidebar” setting</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1968244">The “Expand sidebar on hover” option is not kept after the vertical tabs are disabled and enabled again</a></li>
</ul>
</li>
<li>EJiro Oghenekome:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1938466">Tests required for view&gt;sidebar menu items</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1910902">Remove old sidebar icons no longer and replace with new.</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1952061">Rename SidebarController.initializeUIState() and SidebarState.loadInitialState()</a></li>
</ul>
</li>
<li>Keji Bakare:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2025287"> Hide “Open Link in Split View” menu option for pinned tabs</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2006572">The right tab name and icon slightly move when the Split View is selected</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2008756">Split view’s focus-outline is clipped on the right side of left tab</a></li>
</ul>
</li>
<li>🌟 gotyaoi:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1807516"> Reload toolbar button is active on about:newtab</a></li>
<li>🌟 Hailia:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2016934"> Copied profile edit page heading should enclose profile name in quotes</a></li>
<li>geppy:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1767617"> Rename –theme-graphs-* CSS variables</a></li>
<li>Itoro James:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1936929"> [FxMS Docs] Document the feature callout anchor selector’s ::%shadow% token</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2015491">[A11y][Keyboard Navigation]Cancelling a note via Keyboard Navigation still saves it</a></li>
</ul>
</li>
<li>John Iweh:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1997925"> The notification dot is not displayed if the tab is in a Split View</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027867">sidebar-shown attribute remains when sidebar.revamp is false</a></li>
</ul>
</li>
<li>jonathancabera:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2016058"> A Note with long text (1003 characters) is saved by pressing ENTER even if the “Save” button is disabled</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026032">Tab group guide line becomes disconnected under certain conditions related to split views in vertical tab mode</a></li>
</ul>
</li>
<li>Aloys:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2000797"> Remove logic that forces distribution language packs to be reinstalled when upgrading from Firefoxes older than 67</a></li>
<li>Mary cathline:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022115"> Tab Group Label does not respect touch density in vertical tab bar</a></li>
<li>🌟 Brandon Lucier:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030631"> Popups opened with window.open give window type normal instead of popup</a></li>
<li>karan68:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1997388"> [dialog] New Shortcut dialog needs a label/accessible name</a></li>
<li>🌟 Osoble:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1876109"> Update font size and weight for synced tabs device name headers in Firefox View</a></li>
<li>konyhéa:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1856191"> don’t restrict the sidebar width so much (to better support non-English locales)</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1876108">Add hairline separators between synced tabs device lists on the Recent Browsing page in Fx View</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1891970">Firefox View breakpoint for collapsing the sidebar triggers too late</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2014334">Split view does not show colored outline when used as a group target during dragging</a></li>
</ul>
</li>
<li>Noble Chinonso:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1953621"> Add the ‘command’ property to the SidebarStateProps definition</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1945835">Timestamp not displayed for items under “Tabs from other devices” in Firefox View Next tab</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019235">Move tab to Start/ End options are enabled and not working, even if the Split View tab is already at start/en,d and the other view is focused</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2025701">Mismatched closing tag in syncedtabs-tab-list.mjs itemTemplate</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026697">Do not capitilize “tagName” returned from “WebDriver:GetElementTagName” command</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028628">#shouldHandleEvent in SidebarTreeView.js compares event.keyCode to string values, causing Home/End keys to never be handled</a></li>
</ul>
</li>
<li>Knot False:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1773932"> Remove nsIScriptableUnicodeConverter from services/common/</a><a href="http://utils.js">utils.js</a></li>
<li>Pranjali Srivastava:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1874155">Remove virtualizer pref</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=944228">Add a test to verify that the space above tabs is consistent across PB, LWT and sizemode (where appropriate)</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2009917">In the about:opentabs page the containers icons have no padding on the right side while hovered</a></li>
</ul>
</li>
<li>Okhuomon Ajayi:
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2018272">More spacing is needed between the tab note icon and the close icon on the tab</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026649">Split view container and vertical tabs are misaligned when resizing the sidebar down</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029684">Vertical split view tabs can be too big or small when tabs are overflowing</a></li>
</ul>
</li>
<li>🌟 Rishan:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030428"> Fix duplicated arrow function in browser_history_sidebar.js</a></li>
<li>Chukwuka Rosemary:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1846829"> Remove the max-history-rows pref used in Fx View</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1948019">“Forget About This Site” context menu option missing from Firefox View history</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026574">Long strings are not displayed properly on the about:opentabs page search filed</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028153">Add test for Forget This Site option in Fxview history context menu.</a></li>
</ul>
</li>
<li>ROSHAAN:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2018276"> Tab note background colour is incorrect for default light theme</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1997346">[win/linux] The splitter between content areas does not match Figma spec</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028927">Fix typo in OpenInTabsUtils.confirmOpenInTabs()</a></li>
</ul>
</li>
<li>Sameeksha:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2021421"> Remove redundant lazy pref getters in SidebarPinsPromo</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2008178">Dialog lacks accessible name (Recent activity section &gt; ••• disclosure &gt; Delete from History dialog)</a></li>
</ul>
</li>
<li>kofoworola shonuyi:
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1999012">Actually hide or remove sidebar-shown attribute when in fullscreen.</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019901">&lt;sidebar-main&gt; has “sidebar-ongoing-animations” set but never removed</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028293">Add a test for checking sidebar-shown attribute in fullscreen mode</a></li>
</ul>
</li>
<li>🌟 Sayd Mateen:<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2021681"> Page URL is displayed as tab name when page’s &lt;title&gt; contains about:reader?</a></li>
<li>Oluwatobi:
<ul>
<li>🌟<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019936"> Remove the IE importer and tests</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1975391">Unable to delete selected history entries from sidebar</a></li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2023913">The city name heading level doesn’t follow the correct heading level order</a></li>
</ul>
</li>
</ul>
<h3>Project Updates</h3>
<h4>Add-ons / Web Extensions</h4>
<h5>Addon Manager &amp; about:addons</h5>
<ul>
<li>Removed obsolete migration logic that forced distribution language packs to be reinstalled when upgrading from Firefox versions older than 67 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2000797"> Bug 2000797</a>
<ul>
<li>Thanks to Aloys for contributing the changes needed to cleanup this old XPIProvider migration logic</li>
</ul>
</li>
</ul>
<h5>WebExtensions Framework</h5>
<ul>
<li>Fixed a regression where WebRTC permission popups were queued and suppressed while an extension popup was open –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982832"> Bug 1982832</a></li>
</ul>
<h5>WebExtension APIs</h5>
<ul>
<li>Fixed an edge case where tabs.move would revert splitview tabs order while moving splitview tab to a new window  –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028832"> Bug 2028832</a></li>
<li>Fixed windows API reporting window type normal instead of popup for windows opened via window.open() –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030631"> Bug 2030631</a>
<ul>
<li>Thanks to Brandon Lucier for contributing this small but very much appreciated fix to the windows WebExtensions API!</li>
</ul>
</li>
</ul>
<h4>DevTools</h4>
<ul>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> added support for multi-conditions @container rules in the Inspector (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2023125">#2023125</a>), add specific style for unmatched conditions (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030236">#2030236</a>)</li>
</ul>
<p><img alt="Multi containers support in the Inspector panel" class="aligncenter size-full wp-image-2034" height="40" src="https://blog.nightly.mozilla.org/files/2026/04/image2-1.png" width="808"/></p>
<ul>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> added container-name in the @container tooltip (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030731">#2030731</a>)</li>
</ul>
<p><img alt="&quot;hello section-container&quot; name displayed in the container tooltip under the Inspector panel" class="aligncenter size-full wp-image-2032" height="298" src="https://blog.nightly.mozilla.org/files/2026/04/image4-1.png" width="1074"/></p>
<h4><img alt="An unmatched container rule in the Inspector panel" class="aligncenter size-full wp-image-2031" height="250" src="https://blog.nightly.mozilla.org/files/2026/04/image1-1.png" width="1134"/></h4>
<h4>WebDriver</h4>
<ul>
<li>Henrik Skupin fixed a bug in the WebDriver BiDi session.new command where <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1916463">an empty proxy object was returned in the capabilities</a> when no proxy was requested, even though that is not valid according to the CDDL.</li>
<li>Henrik Skupin landed <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1855028">support for browser.setClientWindowState</a>, originally started by Dan and continued by Liam DeBeasi, with final fixes and improvements completed after earlier contributors were unable to continue.</li>
<li>Alexandra Borovova improved <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2005054">the “text” field of the “log.entryAdded” event to better align with Firefox DevTools behavior and Google Chrome WebDriver BiDi implementation.</a></li>
</ul>
<h4>Lint, Docs and Workflow</h4>
<ul>
<li>A <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027218">problem with the ESLint-build builder</a> has been resolved. This had meant that the <a href="https://firefox-source-docs.mozilla.org/code-quality/lint/linters/eslint-plugin-mozilla/rules/valid-ci-uses.html">valid-ci-uses</a> and <a href="https://firefox-source-docs.mozilla.org/code-quality/lint/linters/eslint-plugin-mozilla/rules/valid-services-property.html">valid-services-property</a> rules were not being run.</li>
<li>Work is ongoing to get <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022975">various</a> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022976">css</a> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022978">files</a> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022980">passing</a> the use-design-tokens rules.</li>
</ul>
<h4>New Tab Page</h4>
<ul>
<li>You can preview Nova on the New Tab browser.newtabpage.activity-stream.nova.enabled to true, and then opening a few tabs.
<ul>
<li>The browser.nova.enabled pref was just introduced to turn on the Nova design tokens. That’s still very much a work in progress.</li>
</ul>
</li>
</ul>
<h4>Picture-in-Picture</h4>
<ul>
<li>aoia7rz7l for <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978290">added PiP wrapper captions support to various public Invidious instances</a></li>
<li>chutten <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029692">removed all legacy PiP telemetry</a></li>
<li>sfarre is <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1463402">working on PiP API support</a> and has a <a href="https://phabricator.services.mozilla.com/D286142">patch</a> up integrating it nicely with our native implementation</li>
</ul>
<h4>Search and Urlbar</h4>
<h5>Search</h5>
<ul>
<li>Mandy updated the search-config-v2 schema for partnerCodes (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027191">2027191</a>)</li>
<li>Florian fixed a high frequency intermittent test failure in the search code (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2009494">2009494</a>)</li>
<li>Standard8 fixed a bug with duplicate keywords for search engines, so that we now prefer the default search engine (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2024714">2024714</a>)</li>
</ul>
<h5>Nova</h5>
<ul>
<li>mconley made a rounder search input for about:newtab and about:privatebrowsing (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027144">2027144</a>)</li>
<li>Drew is continuing his work on making Nova updates to the urlbar  (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026859">2026859</a>)</li>
</ul>
<h5>New searchbar</h5>
<ul>
<li>Moritz and Dao continue re-implementing the search bar using urlbar modules  (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027749">2027749</a>,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027578"> 2027578</a>,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2002834"> 2002834</a>,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2025904"> 2025904</a>,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027565"> 2027565</a>)</li>
</ul>
<h5>Urlbar</h5>
<ul>
<li>Dharma also fixed a quick action telemetry error (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1955058">1955058</a>)</li>
<li>James has been working on Adaptive History for Autofill Improvements (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019695">2019695</a>,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019695"> 2019695</a>,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2021079"> 2021079</a>,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019719"> 2019719</a>,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2021036"> 2021036</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028730">2028730</a>,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2021039"> 2021039</a>,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019626"> 2019626</a>)</li>
<li>Gijs landed a patch so that we use aria-notify instead of A11yUtils.announce for UrlbarView’s “special” announcements (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026753">2026753</a>)</li>
<li>Dale added a tooltip to engines in the unified search panel (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028668">2028668</a>)</li>
<li>Drew has been working on sports suggestions (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2025052">2025052</a>)</li>
<li>James fixed a bug where persisted search was not working for Fx versions prior to 148 (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2025933">2025933</a>)</li>
</ul>
<h4>Smart Window</h4>
<ul>
<li>preparing for 150 mvp with various uplifts from 151</li>
<li>telemetry: assistant <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2024869">2024869</a>, input/suggestions <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2009615">2009615</a>, MLtelemetry <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019772">2019772</a>, settings <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2009612">2009612</a></li>
<li>security: spotlighting <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2020807">2020807</a>, url ledger <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2023001">2023001</a></li>
<li>polish: autoopen sidebar pref <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029686">2029686</a>, memories strings <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029262">2029262</a>, report issues link <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029257">2029257</a></li>
<li>bugs: keeping conversations when switching windows <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2026239">2026239</a>, switching tabs <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2023284">2023284</a>, transition fullpage to sidebar <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2024781">2024781</a></li>
<li>a11y: ask button state <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2015485">2015485</a>, smartbar announce <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2016758">2016758</a></li>
</ul>
<h4>Storybook/Reusable Components/Acorn Design System</h4>
<ul>
<li>From more than two weeks ago (sorry I wasn’t here and forget if they were shared):
<ul>
<li>Finn converted the Settings page nav to match Firefox View/new design <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1867385">Bug 1867385</a></li>
<li>Mark S imported the initial Nova design from Figma <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2021477">Bug 2021477</a>
<ul>
<li>Currently behind browser.design-tokens.nova but moving to browser.nova.enabled today most likely</li>
</ul>
</li>
<li>Mark S created an <a href="https://firefoxux.github.io/firefox-desktop-components/?path=/story/docs-icon-directory--default">Icon Directory in Storybook</a> – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1990228">Bug 1990228</a></li>
</ul>
</li>
<li>Mark Striemer added <a href="https://bugzil.la/2014603">breadcrumbs to sub-panes in Settings</a></li>
<li>Anna Kulyk <a href="https://bugzil.la/2017385">fixed arrow keys not working with panel-list variant of moz-select with separators</a></li>
<li>Mark Kennedy <a href="https://bugzil.la/2023496">fixed an display issue with the Applications view not updating when cancelling the Use other option</a></li>
<li>Finn Terdal fixed some page navigation issues:<a href="https://bugzil.la/2027100">page nav leaves a large gap when it first collapses to icon-only</a>, <a href="https://bugzil.la/2028160">sub-pane content being clipped by sticky search bar</a>, <a href="https://bugzil.la/2028254">reintroduced the vertical border next to static sidebar in prefers-reduced-motion</a></li>
<li>Jules Simplicio<a href="https://bugzil.la/2011984"> landed a UI polish pass for the Settings Redesign</a> with spacing, focus-ring, and contrast tweaks across subpanes, improving readability and target sizes.
<ul>
<li>This also updated some global styling for card, message bar, text input border radiuses/colors and the moz-promo component got a refactor with better support for image styling by default</li>
</ul>
</li>
<li>Hanna Jones<a href="https://bugzil.la/2013115"> updated copy and illustrations for the Account and sync page</a>, so it’s ready for SRD release</li>
<li>Osmond Arnesto<a href="https://bugzil.la/2008598"> converted urlbar variables to design tokens</a>, preparing for JSON conversion and Nova import from Figma</li>
<li>Jon Oliver<a href="https://bugzil.la/1988809"> converted tab variables into design tokens</a>, and set them up in JSON for Nova import from Figma</li>
<li>Jules Simplicio has been updating variable names in the Figma Nova Components/Styles files so our design token naming is consistent between Figma and central (so we can run our import script for more Nova automation)</li>
</ul>
<h4>UX Fundamentals</h4>
<ul>
<li>Felt Privacy error pages now support more NSS errors instead of falling through to the legacy page. Updated introductory text for the denied-port-access error. – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2024150">2024150</a></li>
<li>Fixed a test in browser_aboutCertError.js that was failing on Linux opt standalone and removed the platform skip. – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028651">2028651</a></li>
<li>Added clock skew detection to the Felt Privacy error pages. When a certificate error is caused by a wrong system clock, the Felt Privacy error pages now show the same dedicated clock-skew message that the legacy error pages had, and helps guide users to correct their system time. – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2025049">2025049</a></li>
<li>​​Fixed misaligned bullet points in the “What can you do?” section of Felt Privacy network error pages, restoring correct visual indentation for that list. – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028632">2028632</a></li>
</ul></div>
    </content>
    <updated>2026-04-30T16:29:24Z</updated>
    <published>2026-04-30T16:29:24Z</published>
    <category term="News"/>
    <author>
      <name>Katherine Patenio</name>
    </author>
    <source>
      <id>https://blog.nightly.mozilla.org</id>
      <logo>https://blog.nightly.mozilla.org/files/2024/04/cropped-Fx-Browser-Nightly-icon-fullColor-512-32x32.png</logo>
      <link href="https://blog.nightly.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.nightly.mozilla.org" rel="alternate" type="text/html"/>
      <subtitle>Let's improve quality, build after build!</subtitle>
      <title>Firefox Nightly News</title>
      <updated>2026-06-03T18:27:38Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=85605</id>
    <link href="https://blog.mozilla.org/en/mozilla/leadership/coo-abigail-besdin/" rel="alternate" type="text/html"/>
    <title>Welcoming Abigail Besdin, Mozilla’s new Chief Operating Officer</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>We’re delighted that Abigail Besdin has joined Mozilla as our new Chief Operating Officer. This is an incredibly exciting time for Mozilla. Our focus is to become the world’s most trusted software company by building products that let people use the internet openly, safely, and on their terms. As technology changes rapidly, we are working […]</p>
<p>The post <a href="https://blog.mozilla.org/en/mozilla/leadership/coo-abigail-besdin/">Welcoming Abigail Besdin, Mozilla’s new Chief Operating Officer</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><figure class="wp-block-image size-large"><img alt="Headshot of Abigail Besdin, Mozilla COO, smiling against a dark background" class="wp-image-85608" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/04/Distilled_AbigailBesdin-1024x576.png" width="1024"/></figure>



<p>We’re delighted that <a href="https://www.linkedin.com/in/abigailbesdin/" rel="noreferrer noopener" target="_blank">Abigail Besdin</a> has joined Mozilla as our new Chief Operating Officer.</p>



<p>This is an incredibly exciting time for Mozilla. Our focus is to become the world’s most trusted software company by building products that let people use the internet openly, safely, and on their terms. As technology changes rapidly, we are working to strengthen the business foundation and infrastructure that champions our mission. Delivering on that ambition takes more than great products; it demands operational rigor. Abigail will lead this effort, demonstrating how values-driven organizations can scale with discipline, speed, and trust in the AI era.</p>



<p>As COO, Abigail will drive company strategy and oversee Mozilla’s Core Services teams: Business Operations, Data, Infrastructure, IT, Legal, People, Security, and Strategy. These are the functions that enable us to move quickly and scale with focus. Abigail will sharpen how we plan, prioritize, and execute across the company.</p>



<p>Abigail brings more than 18 years of experience building and scaling high-impact platforms. She co-founded Great Jones, a venture-backed property management startup where she raised $30M, reached $10M in ARR, and led a successful acquisition by Roofstock. At Roofstock, she served as Chief of Staff to the CEO — functioning as an internal COO — where she launched new product lines, closed and integrated two acquisitions, and led the company’s strategic planning process. </p>



<p>Earlier in her career, she spent six years at Skillshare, where she launched the company’s online learning platform and built its growth and content engines from the ground up.</p>



<p>That combination of founder’s instinct and operator’s discipline is exactly what Mozilla needs right now. Abigail will report directly to our CEO and join the executive team.</p>



<blockquote class="wp-block-quote">
<p><strong><em>I’ve learned firsthand that ambitious product goals are only as effective as the operations underpinning them. Mozilla’s mission is as big as it gets, and I’m thrilled to lead our Core Services organization to enable rigorous, smart, and quick decision-making across the business. With a powerful execution engine, we can make sure the best of Mozilla’s mission materializes.</em></strong><em> </em></p>
<cite>Abigail Besdin, Chief Operating Officer</cite></blockquote>



<p>Abigail studied Philosophy at NYU, with a focus on Ethics and Mathematical Logic. Born and raised in New York City, she still lives there with her husband and three kids. </p>



<p>Please join us in welcoming Abigail to Mozilla.</p>
<p>The post <a href="https://blog.mozilla.org/en/mozilla/leadership/coo-abigail-besdin/">Welcoming Abigail Besdin, Mozilla’s new Chief Operating Officer</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-04-30T12:57:15Z</updated>
    <published>2026-04-30T12:57:15Z</published>
    <category term="From the Team"/>
    <category term="Our Work"/>
    <category term="homepage"/>
    <author>
      <name>Mozilla</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/en/</id>
      <link href="https://blog.mozilla.org/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/en/" rel="alternate" type="text/html"/>
      <subtitle>News and Updates about Mozilla</subtitle>
      <title>The Mozilla Blog</title>
      <updated>2026-06-10T17:43:34Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148154</id>
    <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-april-28-2026/148154" rel="alternate" type="text/html"/>
    <title>Firefox Profiler Deployment (April 28, 2026)</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The latest version of the <a href="https://profiler.firefox.com/" rel="noopener nofollow ugc">Firefox Profiler</a> is now live! Check out the full changelog below to see what’s changed:</p>
<p><strong>Highlights:</strong></p>
<ul>
<li>
<p>[fatadel] Dim non-matching nodes in the stack chart when searching (<a href="https://github.com/firefox-devtools/profiler/pull/5935" rel="noopener nofollow ugc">#5935</a>)</p>
</li>
<li>
<p>[Markus Stange] Always render the CPU-usage-aware activity graph when CPU information is available (<a href="https://github.com/firefox-devtools/profiler/pull/5918" rel="noopener nofollow ugc">#5918</a>)</p>
</li>
<li>
<p>[fatadel] Add CounterDisplayConfig to counters in the processed profile format (<a href="https://github.com/firefox-devtools/profiler/pull/5912" rel="noopener nofollow ugc">#5912</a>)</p>
</li>
<li>
<p>[Nazım Can Altınova] Fallback to javascript highlighting in the source view as a backup (<a href="https://github.com/firefox-devtools/profiler/pull/5936" rel="noopener nofollow ugc">#5936</a>)</p>
</li>
<li>
<p>[fatadel] Replace 4 counter track components with a single generic TrackCounter (<a href="https://github.com/firefox-devtools/profiler/pull/5944" rel="noopener nofollow ugc">#5944</a>)</p>
</li>
<li>
<p>[Ryan Hunt] Add a fullscreen button to the bottom box (<a href="https://github.com/firefox-devtools/profiler/pull/5605" rel="noopener nofollow ugc">#5605</a>)</p>
</li>
<li>
<p>[Nazım Can Altınova] Add “Include idle samples” toggle to the call tree settings (<a href="https://github.com/firefox-devtools/profiler/pull/5968" rel="noopener nofollow ugc">#5968</a>)</p>
</li>
<li>
<p>[Markus Stange] Update the hovered item when panning any viewport canvas (<a href="https://github.com/firefox-devtools/profiler/pull/5903" rel="noopener nofollow ugc">#5903</a>)</p>
</li>
<li>
<p>[Nazım Can Altınova] Fix loading .json.gz profiles from inside zip archives (<a href="https://github.com/firefox-devtools/profiler/pull/5959" rel="noopener nofollow ugc">#5959</a>)</p>
</li>
<li>
<p>[Markus Stange] Replace symbolicator-cli with a profiler-edit node tool (<a href="https://github.com/firefox-devtools/profiler/pull/5965" rel="noopener nofollow ugc">#5965</a>)</p>
</li>
</ul>
<p><strong>Other Changes:</strong></p>
<ul>
<li>
<p>[fatadel] Fix arrow panel appearing behind marker tooltips (<a href="https://github.com/firefox-devtools/profiler/pull/5926" rel="noopener nofollow ugc">#5926</a>)</p>
</li>
<li>
<p>[fatadel] Upgrade Node.js from v22 to v24 (<a href="https://github.com/firefox-devtools/profiler/pull/5923" rel="noopener nofollow ugc">#5923</a>)</p>
</li>
<li>
<p>[Markus Stange] Use createStackTableBySkippingDiscarded in focusSelf. (<a href="https://github.com/firefox-devtools/profiler/pull/5916" rel="noopener nofollow ugc">#5916</a>)</p>
</li>
<li>
<p>[Markus Stange] Propagate isJS to symbolicated funcs (<a href="https://github.com/firefox-devtools/profiler/pull/5907" rel="noopener nofollow ugc">#5907</a>)</p>
</li>
<li>
<p>[Nazım Can Altınova] Properly type the return value of _languageExtForPath (<a href="https://github.com/firefox-devtools/profiler/pull/5937" rel="noopener nofollow ugc">#5937</a>)</p>
</li>
<li>
<p>[Nazım Can Altınova] Update typescript eslint dependencies (<a href="https://github.com/firefox-devtools/profiler/pull/5938" rel="noopener nofollow ugc">#5938</a>)</p>
</li>
<li>
<p>[Markus Stange] Modernize more of the transform functions (<a href="https://github.com/firefox-devtools/profiler/pull/5934" rel="noopener nofollow ugc">#5934</a>)</p>
</li>
<li>
<p>[Paul Adenot] Fix extractGeckoLogs for structured Log marker format (bug 2022540) (<a href="https://github.com/firefox-devtools/profiler/pull/5927" rel="noopener nofollow ugc">#5927</a>)</p>
</li>
<li>
<p>[Nazım Can Altınova] Move some profile fetching code into a separate module. (<a href="https://github.com/firefox-devtools/profiler/pull/5939" rel="noopener nofollow ugc">#5939</a>)</p>
</li>
<li>
<p>[Markus Stange] Migrate Home page animation to CSS transitions and remove react-transition-group (<a href="https://github.com/firefox-devtools/profiler/pull/5649" rel="noopener nofollow ugc">#5649</a>)</p>
</li>
<li>
<p>[Nazım Can Altınova] Fix test/lint commands on Windows and fix CI (<a href="https://github.com/firefox-devtools/profiler/pull/5947" rel="noopener nofollow ugc">#5947</a>)</p>
</li>
<li>
<p>[Nazım Can Altınova] Convert profile-logic/js-tracer.tsx to a ts file (<a href="https://github.com/firefox-devtools/profiler/pull/5942" rel="noopener nofollow ugc">#5942</a>)</p>
</li>
<li>
<p>[Markus Stange] Remove panelLayoutGeneration (<a href="https://github.com/firefox-devtools/profiler/pull/5946" rel="noopener nofollow ugc">#5946</a>)</p>
</li>
<li>
<p>[Nazım Can Altınova] Fix eslint-config-prettier silently overriding custom rules (<a href="https://github.com/firefox-devtools/profiler/pull/5955" rel="noopener nofollow ugc">#5955</a>)</p>
</li>
<li>
<p>[Markus Stange] Speed up _computeCallNodeTableHierarchy by keeping siblings ordered by func (<a href="https://github.com/firefox-devtools/profiler/pull/5964" rel="noopener nofollow ugc">#5964</a>)</p>
</li>
<li>
<p>[Nazım Can Altınova] Add dark mode versions of the fullscreen icons (<a href="https://github.com/firefox-devtools/profiler/pull/5972" rel="noopener nofollow ugc">#5972</a>)</p>
</li>
<li>
<p>[fatadel] Use ephemeral port for esbuild’s internal dev server (<a href="https://github.com/firefox-devtools/profiler/pull/5974" rel="noopener nofollow ugc">#5974</a>)</p>
</li>
<li>
<p>[carverdamien] Remove category from LongTaskMarkerPayload (<a href="https://github.com/firefox-devtools/profiler/pull/5975" rel="noopener nofollow ugc">#5975</a>)</p>
</li>
</ul>
<p>Big thanks to our amazing localizers for making this release possible:</p>
<ul>
<li>
<p>de: Ger</p>
</li>
<li>
<p>de: Michael Köhler</p>
</li>
<li>
<p>el: Jim Spentzos</p>
</li>
<li>
<p>en-GB: Ian Neal</p>
</li>
<li>
<p>es-CL: ravmn</p>
</li>
<li>
<p>fr: Théo Chevalier</p>
</li>
<li>
<p>ia: Melo46</p>
</li>
<li>
<p>it: Francesco Lodolo [:flod]</p>
</li>
<li>
<p>nl: Mark Heijl</p>
</li>
<li>
<p>pt-BR: Marcelo Ghelman</p>
</li>
<li>
<p>ru: Valery Ledovskoy</p>
</li>
<li>
<p>ru: berry</p>
</li>
<li>
<p>sv-SE: Andreas Pettersson</p>
</li>
<li>
<p>tr: Grk</p>
</li>
<li>
<p>zh-CN: Olvcpr423</p>
</li>
<li>
<p>zh-CN: wxie</p>
</li>
<li>
<p>zh-TW: Pin-guang Chen</p>
</li>
</ul>
<p>Find out more about the Firefox Profiler on <a href="https://profiler.firefox.com" rel="noopener nofollow ugc">profiler.firefox.com</a>! If you have any questions, join the discussion on our <a href="https://chat.mozilla.org/#/room/#profiler:mozilla.org" rel="noopener nofollow ugc">Matrix channel</a>!</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/firefox-profiler-deployment-april-28-2026/148154">Read full topic</a></p></div>
    </summary>
    <updated>2026-04-30T12:09:45Z</updated>
    <published>2026-04-30T12:09:45Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>fatadel</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-april-28-2026/148154.rss" title="Firefox Profiler Deployment (April 28, 2026)"/>
      <updated>2026-06-12T10:58:53Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:tzDQSnK45dA</id>
    <link href="https://www.youtube.com/watch?v=tzDQSnK45dA" rel="alternate" type="text/html"/>
    <title>Outreachy Mentorship: A Retrospective</title>
    <summary>Will Lachance does a retrospective on the Glean Dictionary outreachy internship. 

See also "Linh's Outreachy Internship Highlights" https://www.youtube.com/watch?v=UJdIkHDPgGQ

To learn more about Outreachy, see https://www.outreachy.org/</summary>
    <updated>2026-04-30T07:37:48Z</updated>
    <published>2021-03-29T20:25:24Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/l10n/?p=1883</id>
    <link href="https://blog.mozilla.org/l10n/2026/04/30/l10n-report-april-edition-2026/" rel="alternate" type="text/html"/>
    <title>L10n Report: April Edition 2026</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Please note some of the information provided in this report may be subject to change as we are sometimes sharing information about projects that are still in early stages and … <a class="go" href="https://blog.mozilla.org/l10n/2026/04/30/l10n-report-april-edition-2026/">Read more</a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><i>Please note some of the information provided in this report may be subject to change as we are sometimes sharing information about projects that are still in early stages and are not final yet. </i></p>
<h3>Welcome!</h3>
<p>Are you a locale leader and want us to include new members in our upcoming reports? <a href="mailto:l10n-drivers@mozilla.org">Contact us!</a></p>
<h3>What’s new or coming up in Firefox desktop</h3>
<h4>Firefox string deadline changes</h4>
<p>Starting with 149, some changes in developer deadlines relating to Nightly and Beta have resulted in a slight shift in string translation deadlines, giving us 2 extra days to land strings. Previously deadlines in Pontoon were set to the Sunday ahead of the final Release Candidate but going forward they will be set to a Tuesday. For example the upcoming deadline for <a href="https://whattrainisitnow.com/release/?version=151">Firefox 151</a> is Tuesday, May 12.</p>
<p>If you’re interested to see more details on upcoming Firefox releases and milestones, <a href="https://whattrainisitnow.com/">https://whattrainisitnow.com</a> has all the latest details.</p>
<h4>UI Refresh</h4>
<p>Behind the scenes a refresh on the visual look of Firefox has been ongoing using the internal name “Nova”. You may have seen some blog reports recently on this, or perhaps have been seeing bugs in Bugzilla with this in the title. We will start seeing new strings related to these changes here and there as development work progresses, however we don’t expect a large number of string changes stemming from this work.</p>
<p>That being said, these updates also bring some changes in how we communicate directly to our users within Firefox. One of these changes you may have already met: our new mascot Kit. If you missed the announcement give it a read <a href="https://blog.mozilla.org/en/firefox/meet-kit/">here</a>. You may also notice a shift voice for user directed messages — with source strings becoming more Genuine, Fiery, and Playful. See this recent <a href="https://brand.mozilla.com/d/5UkPdpbtt8LS/voice-tone#/-/writing-for-firefox">update</a> in Firefox’s brand voice for more details.</p>
<h4>Settings redesign</h4>
<p>Localization for the update to about:settings has been going on for some time (starting early this year) and the bulk of the translation work is behind us at this point. You may see some new strings (particularly around Privacy &amp; Security) but many of the strings are in a viewable/testable state in Nightly 152. You can check your translations and test out the redesign by typing <code>about:config</code> into your URL bar, proceeding past the warning message, and searching for <code>browser.settings-redesign.enabled</code> and setting the value to <code>true</code>.</p>
<h3>What’s new or coming up in mobile</h3>
<p>Things have been particularly busy on mobile over the past couple of months. For example, Firefox for Android saw a significant spike in April, with the number of new strings increasing to over 200 compared to fewer than 50 in March — more than eight times the typical monthly volume<sup>*</sup>.</p>
<p>There are two main drivers behind this increase. First, Firefox for Android is introducing a built-in VPN feature, bringing it in line with the functionality already available in Firefox. Second, both iOS and Android teams are working on a new widget for the upcoming 2026 World Cup, allowing users to follow their team directly from the browser.</p>
<p><a href="https://blog.mozilla.org/l10n/files/2026/04/firefox_android_worldcup.png"><img alt="Screenshot of Firefox for Android with the upcoming widget." class="aligncenter size-large wp-image-1885" height="915" src="https://blog.mozilla.org/l10n/files/2026/04/firefox_android_worldcup-600x915.png" width="600"/></a>Given the short turnaround time for this feature, you will notice that many strings are intentionally kept consistent across platforms — and started landing on Desktop as well. We’re also pre-landing as many strings as possible, ahead of implementation, to give localizers more time to complete translations.</p>
<p><sup>*</sup> Did you know that you can track the number of new strings in a project from the Insights page in Pontoon? Check for example <a href="https://pontoon.mozilla.org/projects/firefox-for-android/insights/">Firefox for Android</a>. In the <i>Translation activity</i> chart, click on <i>New source strings</i> in the legend to display this data. Given the difference in scale, it can also help to hide other metrics to make the chart easier to read.</p>
<h3>What’s new or coming up in Pontoon</h3>
<p><b>New documentation system</b>. Pontoon now features a brand-new, unified <a href="https://pontoon.mozilla.org/docs/">documentation system</a>. This new hub brings together previously scattered resources into a single, streamlined experience, consolidating developer, localizer, and admin documentation from three separate sites into one cohesive platform. By centralizing content, the new system makes it easier to find, navigate, and maintain documentation, ensuring contributors of all roles have quick access to up-to-date and consistent guidance.</p>
<p><b>Search</b>. You can now set default <a href="https://pontoon.mozilla.org/docs/localizer/translation-workspace/#search-options">search options</a> directly in <a href="https://pontoon.mozilla.org/docs/localizer/users/#default-search-options">your profile</a>. This allows you to tailor your search without having to adjust filters each time.</p>
<p>The same settings are also applied when using the <a href="https://blog.mozilla.org/l10n/2026/02/12/pontoon-translation-search-unifying-localization-across-mozilla/">recently introduced</a> global <a href="https://pontoon.mozilla.org/search/">search page</a>, which brings a major step forward in unifying localization across Mozilla by allowing users to search for strings across all projects and locales in one place. Inspired by Transvision and designed as its successor, the feature integrates deeply with Pontoon, making it easy to filter results, compare translations across languages, and jump directly into the translation workflow.</p>
<p><a href="https://blog.mozilla.org/l10n/files/2026/02/translation_search.png"><img alt="Screenshot of Pontoon with the results of a search." class="aligncenter size-large wp-image-1845" height="436" src="https://blog.mozilla.org/l10n/files/2026/02/translation_search-600x436.png" width="600"/></a><b>AI integration</b>. We’ve also refined the prompt used by <a href="https://pontoon.mozilla.org/docs/localizer/translation-workspace/#large-language-model-llm-integration">the LLM-powered translation feature</a>. The goal is not to change how the feature works, but to make its output more consistent and better aligned with the context available in Pontoon. For example, the updated prompt improves how punctuation is handled, reducing variability in suggestions.</p>
<p>In addition, the prompt now includes more contextual data:</p>
<ul>
<li>String ID.</li>
<li>Comments, including pinned comments from project managers.</li>
<li>Matches from terminology.</li>
</ul>
<p>This additional context helps the model generate more relevant suggestions. It also represents a first step toward making LLM suggestions more useful, ahead of potential experiments with displaying them by default alongside suggestions from traditional machine translation.</p>
<p><b>New contributors</b>. We’re also excited to welcome a group of new contributors who have started making an impact on Pontoon over the past few months. <a href="https://github.com/mozilla/pontoon/commits?author=MundiaNderi">MundiaNderi</a>, <a href="https://github.com/mozilla/pontoon/commits?author=nishitmistry">nishitmistry</a>, <a href="https://github.com/mozilla/pontoon/commits?author=dannycolin">dannycolin</a>, <a href="https://github.com/mozilla/pontoon/commits?author=first-afk">first-afk</a>, <a href="https://github.com/mozilla/pontoon/commits?author=wassafshahzad">wassafshahzad</a>, <a href="https://github.com/mozilla/pontoon/commits?author=huseynovvusal">huseynovvusal</a>, and <a href="https://github.com/mozilla/pontoon/commits?author=Peacanduck">Peacanduck</a> have all contributed valuable improvements across different parts of the project, helping us move faster and improve the overall experience.</p>
<p>A special shoutout goes to Serah (MundiaNderi), who not only made significant contributions but also shared insights into her work in a recent <a href="https://blog.mozilla.org/l10n/2026/04/03/enhancing-comment-management-in-pontoon/">blog post</a> about enhancing comment management in Pontoon—an excellent example of the kind of collaboration and knowledge sharing we love to see in the community.</p>
<p><a href="https://blog.mozilla.org/l10n/files/2026/04/Screenshot-2026-04-01-at-11.20.35.png"><img alt="Screenshot of Pontoon with multiple comments" class="aligncenter size-large wp-image-1865" height="340" src="https://blog.mozilla.org/l10n/files/2026/04/Screenshot-2026-04-01-at-11.20.35-600x340.png" width="600"/></a></p>
<h3>Newly published localizer facing documentation</h3>
<p>As part of the recent documentation update for Pontoon, we’ve reorganized the content around pretranslation to make it clearer and easier to navigate. There is now a <a href="https://mozilla-l10n.github.io/localizer-documentation/tools/pretranslation.html">dedicated page</a> outlining the criteria required to enable pretranslation for a locale, along with guidance on how to monitor its effectiveness over time (for example, by tracking metrics like acceptance rate or time to review). If you’re a locale manager and want to try pretranslation for your locale, you can request it <a href="https://pontoon.mozilla.org/docs/localizer/teams-projects/#requesting-pretranslation">directly from Pontoon</a>.</p>
<p>Over the past 12 months, we also ran a limited experiment using paid translation agencies for two locales. The goal was to restore the localization level of Firefox for Android in cases where the community was inactive — situations that have since improved, with both communities now active again.<br/>
Because volunteer communities remain the foundation of Mozilla’s localization model, we wanted to be transparent about when and why this approach was used, and what it means in practice. This includes clarifying how external support fits within a community-driven ecosystem, where localizers retain ownership and responsibility for quality and direction. You can find more details in <a href="https://mozilla-l10n.github.io/localizer-documentation/misc/lsp_products.html">this page</a>.</p>
<h3>Friends of the Lion</h3>
<div class="wp-caption aligncenter" id="attachment_1131" style="width: 262px;"><img alt="" class="wp-image-1131 size-medium" height="232" src="https://blog.mozilla.org/l10n/files/2017/07/2-Lions-01-252x232.png" width="252"/><p class="wp-caption-text" id="caption-attachment-1131">Image by Elio Qoshi</p></div>
<p>We continue the localizer spotlight series this year.</p>
<ul>
<li>Meet <a href="https://blog.mozilla.org/l10n/2026/02/04/localizer-spotlight-oliver/">Oliver</a> from China Firefox localizer, accounting student, former Minecraft translator, and Bocchi the Rock! fan He talks about starting with a single typo, why Firefox’s independence matters to him, and how the Simplified Chinese community keeps quality high with cross-review and shared responsibility.</li>
<li><a href="https://blog.mozilla.org/l10n/2026/02/27/localizer-spotlight-marcelo/">Marcelo</a> from Argentina needs no introduction to the localization communities. From Phoenix 0.3 to 24 years later, he shares how he got started, what it meant to be part of the Firefox 1.0 release, his experience as an l10n manager, and why using Mozilla products in his own language — Spanish (Argentina) — continues to motivate him.</li>
<li>What does 18 years of volunteer localization look like? From discovering Firefox and Linux out of curiosity to leading the Portuguese translation team, <a href="https://pontoon.mozilla.org/contributors/C3/">Cláudio</a> from Portugal reflects on why localization is a form of digital activism, and how every translated word helps build a more inclusive internet.</li>
<li><a href="https://pontoon.mozilla.org/contributors/baurzhanm/">Baurzhan</a> from Kazakhstan began his localization journey with a simple question: why wasn’t Kazakh available in widely used software? That curiosity grew into a long-term commitment to localization, leading to the successful translation of Firefox and many other open source projects. His work demonstrates the power of perseverance in making technology accessible to all.</li>
</ul>
<p>If you enjoy the series, please help us identify the localizers you’d like to see featured filling out this <a href="https://survey.alchemer.com/s3/8493108/Nominate-the-Next-Featured-Localizer">nomination form</a>. If you have stories to share, tell us in your own words.</p>
<p>Know someone in your l10n community who’s been doing a great job and should appear here? <a href="mailto:l10n-drivers@mozilla.org">Contact us</a> and we’ll make sure they get a shout-out!</p>
<h3>Useful Links</h3>
<ul>
<li><a href="https://chat.mozilla.org/#/room/#l10n-community:mozilla.org">#l10n-community channel on Element (chat.mozilla.org)</a></li>
<li><a href="https://discourse.mozilla.org/c/l10n/547">Localization category on Discourse</a></li>
<li><a href="https://fosstodon.org/@mozilla_l10n">Mastodon</a></li>
<li><a href="https://twitter.com/mozilla_l10n">Twitter</a></li>
<li><a href="https://blog.mozilla.org/l10n/">L10n blog</a></li>
</ul>
<h3>Questions? Want to get involved?</h3>
<p>If you want to get involved, or have any question about l10n, reach out to:</p>
<ul>
<li><a href="https://pontoon.mozilla.org/contributors/mZuzEFP7EcmgBBTbvtgJP2LFFTY/">Francesco Lodolo (flod)</a> – Engineering Manager</li>
<li><a href="https://pontoon.mozilla.org/contributors/CMLZ_n1lNNSfQScLGE2yBmlS55w/">Bryan</a> – L10n Project Manager</li>
<li><a href="https://pontoon.mozilla.org/contributors/jIdunhnZ8Edgi9npILuSoFvf5ZY/">Peiying (CocoMo)</a> – L10n Project Manager for mozilla.org, marketing, and legal</li>
<li><a href="https://pontoon.mozilla.org/contributors/m6r3HOfoijMdyeJNKKFHchjjRbw/">Francis</a> – L10n Project Manager for Common Voice, Mozilla Foundation</li>
<li><a href="https://pontoon.mozilla.org/contributors/lY_FTvtnYcVoDP7JYZjMsm6tRno/">Théo Chevalier</a> – L10n Project Manager for Mozilla Foundation</li>
<li><a href="https://pontoon.mozilla.org/contributors/9rSAS6h8LlBD9DQQtHgdCwvVen0/">Kiki</a> – L10n Project Manager for SUMO</li>
<li><a href="https://pontoon.mozilla.org/contributors/dvgiVCmoeidF2xcqSnBHtpzLTFU/">Matjaž (mathjazz)</a> – Pontoon dev</li>
<li><a href="https://pontoon.mozilla.org/contributors/pmz0uSCe_Mk9Td1cksHLI1y471k/">Eemeli</a> – Pontoon, Fluent dev</li>
</ul>
<p>Did you enjoy reading this report? <a href="mailto:l10n-drivers@mozilla.org">Let us know</a> how we can improve it.</p></div>
    </content>
    <updated>2026-04-30T06:13:53Z</updated>
    <published>2026-04-30T06:13:53Z</published>
    <category term="L10n Reports"/>
    <category term="Planet"/>
    <author>
      <name>Francesco Lodolo [:flod]</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/l10n</id>
      <link href="https://blog.mozilla.org/l10n/category/planet/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/l10n" rel="alternate" type="text/html"/>
      <subtitle>Users first, no matter where they are</subtitle>
      <title>Planet – Mozilla L10N</title>
      <updated>2026-04-30T06:13:53Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://servo.org/blog/2026/04/30/march-in-servo/</id>
    <link href="https://servo.org/blog/2026/04/30/march-in-servo/" rel="alternate" type="text/html"/>
    <title>March in Servo: keyboard navigation, better debugging, FreeBSD support, and more!</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="https://github.com/servo/servo/releases/tag/v0.1.0"><strong>Servo 0.1.0</strong></a> represents Servo’s biggest month ever, with a record <strong>530 commits</strong> and <a href="https://servo.org/blog/2026/04/13/servo-0.1.0-release/"><strong>our first ever release on crates.io</strong></a>!
For security fixes, see <a href="https://servo.org/blog/2026/04/30/march-in-servo/#security"><strong>§ Security</strong></a>.</p>
<p>With this release Servo becomes more accessible, thanks to <strong>tab navigation</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/42952">#42952</a>, <a href="https://github.com/servo/servo/pull/43019">#43019</a>, <a href="https://github.com/servo/servo/pull/43058">#43058</a>, <a href="https://github.com/servo/servo/pull/43246">#43246</a>, <a href="https://github.com/servo/servo/pull/43267">#43267</a>, <a href="https://github.com/servo/servo/pull/43067">#43067</a>), <strong>keyboard navigation</strong> with Alt+Shift and the <strong>accesskey</strong> attribute (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43031">#43031</a>, <a href="https://github.com/servo/servo/pull/43144">#43144</a>, <a href="https://github.com/servo/servo/pull/43434">#43434</a>), and <strong>keyboard scrolling</strong> with Space and Shift+Space (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43322">#43322</a>).</p>
<p>We’ve shipped several new web platform features:</p>
<ul>
<li><strong>&lt;input type=range&gt;</strong> (<a href="https://github.com/BudiArb">@BudiArb</a>, <a href="https://github.com/rayguo17">@rayguo17</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/41562">#41562</a>)</li>
<li><strong>&lt;script blocking=render&gt;</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43150">#43150</a>)</li>
<li><strong>&lt;svg width&gt;</strong> and <strong>&lt;svg height&gt;</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43583">#43583</a>)</li>
<li><strong>‘X-Frame-Options’</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43539">#43539</a>, <a href="https://github.com/servo/servo/pull/43708">#43708</a>)</li>
<li><strong>‘Content-Security-Policy: frame-ancestors’</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43630">#43630</a>)</li>
<li><strong>‘::first-letter’</strong> styling (<a href="https://github.com/minghuaw">@minghuaw</a>, <a href="https://github.com/xiaochengh">@xiaochengh</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43027">#43027</a>)</li>
<li><strong>‘::placeholder’</strong> styling (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/servo/servo/pull/43053">#43053</a>)</li>
<li><strong>‘::file-selector-button’</strong> styling (<a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/AlexVasiluta">@AlexVasiluta</a>, <a href="https://github.com/servo/servo/pull/43498">#43498</a>)</li>
<li><strong>‘background-blend-mode’</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43666">#43666</a>)</li>
<li><strong>‘content’</strong> on <strong>‘::marker’</strong> (<a href="https://github.com/niyabits">@niyabits</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43515">#43515</a>)</li>
<li><strong>‘list-style-type: &lt;string&gt;’</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43111">#43111</a>)</li>
<li><strong>‘attr(namespace|local)’</strong> and <strong>‘clamp(none)’</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43045">#43045</a>)</li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/system-color"><strong>&lt;system-color&gt;</strong></a> (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/42529">#42529</a>, <a href="https://github.com/servo/servo/pull/43105">#43105</a>, <a href="https://github.com/servo/servo/pull/43107">#43107</a>)</li>
<li><a href="https://drafts.csswg.org/css-easing/#typedef-step-position"><strong>&lt;step-position&gt;</strong></a> values <strong>‘jump-start’</strong>, <strong>‘jump-end’</strong>, <strong>‘jump-none’</strong>, and <strong>‘jump-both’</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/43061">#43061</a>)</li>
</ul>
<p>Plus a bunch of new DOM APIs:</p>
<ul>
<li><strong>CommandEvent</strong> (<a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/servo/servo/pull/43190">#43190</a>)</li>
<li><strong>moveBefore()</strong> on <strong>Node</strong> (<a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/servo/servo/pull/41238">#41238</a>)</li>
<li><strong>relatedTarget</strong> on <strong>MouseEvent</strong> and <strong>PointerEvent</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/42989">#42989</a>)</li>
<li><strong>command</strong> on <strong>HTMLButtonElement</strong> (<a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/servo/servo/pull/43190">#43190</a>)</li>
<li><strong>selectedOptions</strong> on <strong>HTMLSelectElement</strong> (<a href="https://github.com/jakubadamw">@jakubadamw</a>, <a href="https://github.com/servo/servo/pull/43017">#43017</a>)</li>
<li><strong>url</strong> on <strong>LargestContentfulPaint</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/42901">#42901</a>, <a href="https://github.com/servo/servo/pull/42949">#42949</a>)</li>
<li><strong>crypto.subtle.digest()</strong> for <strong>TurboSHAKE</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/43551">#43551</a>)</li>
<li><strong>crypto.subtle.getPublicKey()</strong> for <strong>ECDH</strong>, <strong>ECDSA</strong>, <strong>Ed25519</strong>, <strong>RSASSA-PKCS1-v1_5</strong>, <strong>RSA-PSS</strong>, <strong>RSA-OAEP</strong>, and <strong>X25519</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/43073">#43073</a>, <a href="https://github.com/servo/servo/pull/43093">#43093</a>, <a href="https://github.com/servo/servo/pull/43106">#43106</a>, <a href="https://github.com/servo/servo/pull/43115">#43115</a>)</li>
</ul>
<figure>
    <a href="https://servo.org/img/blog/2026-04-diffie.png"><img alt="servoshell 0.1.0 showing several new features: `&lt;input type=range&gt;`; the character &#x201C;&#x8FD4;&#x201D; rendered differently depending on whether the &#x2018;lang&#x2019; is &#x2018;zh&#x2019;, &#x2018;ja&#x2019;, or &#x2018;ko&#x2019;; the emoji &#x201C;&#x2708;&#xFE0F;&#x201D; rendered on a 2D canvas in both emoji presentation and text presentation; a screenshot of the DevTools debugger, showing live variable values; a text field with label &#x201C;Diffie&#x201D; that can be focused with Alt+Shift+D; and examples of styling &#x2018;::first-letter&#x2019;, &#x2018;::placeholder&#x2019;, and &#x2018;::file-selector-button&#x2019;" src="https://servo.org/img/blog/2026-04-diffie.png"/></a>
</figure>
<p><strong>servoshell</strong> is now installed as <code>servoshell</code> or <code>servoshell.exe</code>, rather than <code>servo</code> or <code>servo.exe</code> (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/42958">#42958</a>).
<code>--userscripts</code> has been removed for now, but anyone who uses it is welcome to reinstate it as a wrapper around <a href="https://doc.servo.org/servo/struct.UserContentManager.html"><code>User­Content­Manager</code></a>::<a href="https://doc.servo.org/servo/struct.UserContentManager.html#method.add_script"><code>add­_script</code></a> (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/43573">#43573</a>).
We’ve fixed a bug where link hover status lines are sometimes not legible (<a href="https://github.com/simartin">@simartin</a>, <a href="https://github.com/servo/servo/pull/43320">#43320</a>), and we’re working on getting servoshell signed for macOS to avoid getting blocked by Gatekeeper (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/42912">#42912</a>).</p>
<p><a href="https://github.com/servo/servo/issues/11625">After a long effort</a> by <a href="https://github.com/valpackett">@valpackett</a>, <a href="https://github.com/dlrobertson">@dlrobertson</a>, and more recently <a href="https://github.com/nortti0">@nortti0</a> and <a href="https://github.com/sagudev">@sagudev</a> (<a href="https://github.com/servo/servo/pull/43116">#43116</a>, <a href="https://github.com/servo/servo/pull/43134">#43134</a>), we can now build Servo for <strong>FreeBSD</strong>!
Note that Servo 0.1.0 still has some issues that need to be worked around, but you can get all the details in <a href="https://github.com/servo/servo/issues/44601">#44601</a>.</p>
<figure>
<p><a href="https://servo.org/img/blog/2026-04-freebsd.png"><img alt="servoshell 0.1.0 showing the FreeBSD website and the Servo new tab page, alongside a terminal that ran fastfetch, showing that this is FreeBSD 15" src="https://servo.org/img/blog/2026-04-freebsd.png"/></a></p>
</figure>
<p>A great deal of work went into making the <strong><a href="http://crates.io/">crates.io</a> release</strong> possible, including renaming <code>libservo</code> to just <code>servo</code> (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/43141">#43141</a>), making each package self-contained (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/43180">#43180</a>, <a href="https://github.com/servo/servo/pull/43165">#43165</a>), fixing build issues (<a href="https://github.com/delan">@delan</a>, <a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/43170">#43170</a>, <a href="https://github.com/servo/servo/pull/43458">#43458</a>, <a href="https://github.com/servo/servo/pull/43463">#43463</a>) and <a href="http://crates.io/">crates.io</a> compliance issues (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/43459">#43459</a>), configuring package metadata (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/StaySafe020">@StaySafe020</a>, <a href="https://github.com/servo/servo/pull/43078">#43078</a>, <a href="https://github.com/servo/servo/pull/43264">#43264</a>, <a href="https://github.com/servo/servo/pull/43451">#43451</a>, <a href="https://github.com/servo/servo/pull/43457">#43457</a>, <a href="https://github.com/servo/servo/pull/43654">#43654</a>), and organising our dependency tree (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/42916">#42916</a>, <a href="https://github.com/servo/servo/pull/43243">#43243</a>, <a href="https://github.com/servo/servo/pull/43263">#43263</a>, <a href="https://github.com/servo/servo/pull/43516">#43516</a>, <a href="https://github.com/servo/servo/pull/43526">#43526</a>, <a href="https://github.com/servo/servo/pull/43552">#43552</a>, <a href="https://github.com/servo/servo/pull/43615">#43615</a>, <a href="https://github.com/servo/servo/pull/43622">#43622</a>, <a href="https://github.com/servo/servo/pull/43273">#43273</a>, <a href="https://github.com/servo/servo/pull/43092">#43092</a>).
As a result, you can now take your first step towards <a href="https://book.servo.org/embedding/overview.html">embedding Servo</a> in a Rust app with:</p>
<figure>
<pre><code>$ cargo add servo
</code></pre>
</figure>
<p>This is another big update, so here’s an outline:</p>
<ul>
<li>
<p><a href="https://servo.org/blog/2026/04/30/march-in-servo/#security"><strong>Security</strong></a></p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/04/30/march-in-servo/#work-in-progress"><strong>Work in progress</strong></a></p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/04/30/march-in-servo/#for-developers"><strong>For developers</strong></a></p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/04/30/march-in-servo/#embedding-and-automation"><strong>Embedding and automation</strong></a></p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/04/30/march-in-servo/#more-on-the-web-platform"><strong>More on the web platform</strong></a></p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/04/30/march-in-servo/#performance-and-stability"><strong>Performance and stability</strong></a></p>
</li>
</ul>
<h3>Security <a class="header-anchor" href="https://servo.org/blog/2026/04/30/march-in-servo/#security">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p><strong>crypto.subtle.deriveBits()</strong> for <strong>X25519</strong> checking for all-zero secrets, and <strong>verify()</strong> for <strong>HMAC</strong> comparing signatures, are now done <strong>in constant time</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/43775">#43775</a>, <a href="https://github.com/servo/servo/pull/43773">#43773</a>).</p>
<p><strong>‘Content-Security-Policy’</strong> now handles redirects correctly (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43438">#43438</a>), and sends violation reports with the correct <strong>blockedURI</strong> and <strong>referrer</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43367">#43367</a>, <a href="https://github.com/servo/servo/pull/43645">#43645</a>, <a href="https://github.com/servo/servo/pull/43483">#43483</a>).
The policy in &lt;meta&gt; now combines with the policy sent in HTTP headers, rather than overriding it (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/elomscansio">@elomscansio</a>, <a href="https://github.com/servo/servo/pull/43063">#43063</a>).
When checking nonces, we now reject elements with duplicate attributes (<a href="https://github.com/dyegoaurelio">@dyegoaurelio</a>, <a href="https://github.com/servo/servo/pull/43216">#43216</a>).</p>
<p>The document containing an <strong>&lt;iframe&gt;</strong> can no longer access the contents of error pages (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43539">#43539</a>), and CSP violations inside an &lt;iframe&gt; are now correctly reported (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43652">#43652</a>).</p>
<h3>Work in progress <a class="header-anchor" href="https://servo.org/blog/2026/04/30/march-in-servo/#work-in-progress">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>We’ve landed more work towards supporting <strong>IndexedDB</strong>, under <code>--pref dom­_indexeddb­_enabled</code> (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/gterzian">@gterzian</a>, <a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/jerensl">@jerensl</a>, <a href="https://github.com/servo/servo/pull/42139">#42139</a>, <a href="https://github.com/servo/servo/pull/42727">#42727</a>, <a href="https://github.com/servo/servo/pull/43096">#43096</a>, <a href="https://github.com/servo/servo/pull/43041">#43041</a>, <a href="https://github.com/servo/servo/pull/42451">#42451</a>, <a href="https://github.com/servo/servo/pull/43721">#43721</a>, <a href="https://github.com/servo/servo/pull/43754">#43754</a>, <a href="https://github.com/servo/servo/pull/42786">#42786</a>),
and towards supporting <strong>IntersectionObserver</strong>, under <code>--pref dom­_intersection­_observer­_enabled</code> (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/42251">#42251</a>).</p>
<p>We’re continuing to implement <strong>document.execCommand()</strong> for <strong>rich text editing</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43177">#43177</a>), under <code>--pref dom­_exec­_command­_enabled</code>.
<strong>‘beforeinput’</strong> and <strong>‘input’</strong> events are now fired when executing supported and enabled commands (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43087">#43087</a>), the <strong>‘defaultParagraphSeparator’</strong> and <strong>‘styleWithCSS’</strong> commands are now supported (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43028">#43028</a>), and the <strong>‘delete’</strong> command is partially supported (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43016">#43016</a>, <a href="https://github.com/servo/servo/pull/43082">#43082</a>).</p>
<p>We’re also working on the <a href="https://drafts.csswg.org/css-font-loading/"><strong>Font Loading API</strong></a> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/43286">#43286</a>), under <code>--pref dom­_fontface­_enabled</code>.
<strong>new FontFace()</strong> now accepts ArrayBuffer in its <code>source</code> argument (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/43281">#43281</a>).</p>
<p>All of the features above are enabled in servoshell’s experimental mode.</p>
<p>Work on <strong>accessibility</strong> support for web contents continues under <code>--pref accessibility­_enabled</code>.
There was a <a href="https://servo.org/blog/2026/04/30/march-in-servo/#embedding-and-automation"><strong>breaking change</strong></a> in the embedding API (<a href="https://github.com/delan">@delan</a>, <a href="https://github.com/alice">@alice</a>, <a href="https://github.com/servo/servo/pull/43029">#43029</a>), and we’ve landed support for “grafting” the accessibility tree of a document into that of its containing webview (<a href="https://github.com/delan">@delan</a>, <a href="https://github.com/alice">@alice</a>, <a href="https://github.com/servo/servo/pull/43012">#43012</a>, <a href="https://github.com/servo/servo/pull/43013">#43013</a>, <a href="https://github.com/servo/servo/pull/43556">#43556</a>).
As a result, when you navigate, separate documents can have separate accessibility trees without complicating the embedder.</p>
<p><strong>&lt;link rel=modulepreload&gt;</strong> is now partially supported (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/servo/servo/pull/42964">#42964</a>), though recursive fetching of descendants is gated by <code>--pref dom­_allow­_preloading­_module­_descendants</code> (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/servo/servo/pull/43353">#43353</a>).</p>
<p>For a long time, Servo has had some support for the <a href="https://webbluetoothcg.github.io/web-bluetooth/"><strong>Web Bluetooth API</strong></a> under <code>--pref dom­_bluetooth­_enabled</code>.
We’ve recently reworked our implementation to adopt <a href="https://nonpolynomial.com/2023/10/30/how-to-beg-borrow-steal-your-way-to-a-cross-platform-bluetooth-le-library/"><strong>btleplug</strong></a>, the cross-platform Rust-native Bluetooth LE library (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/43529">#43529</a>, <a href="https://github.com/servo/servo/pull/43581">#43581</a>).</p>
<p>We’re now implementing the <a href="https://www.w3.org/TR/web-animations/"><strong>Web Animations API</strong></a>, starting with AnimationTimeline and DocumentTimeline (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43711">#43711</a>).</p>
<p>We’ve landed more fixes to Servo’s <a href="https://servo.org/blog/2026/03/31/february-in-servo/#:~:text=Parsing%20web%20pages"><strong>async parser</strong></a> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/42930">#42930</a>, <a href="https://github.com/servo/servo/pull/42959">#42959</a>), under <code>--pref dom­_servoparser­_async­_html­_tokenizer­_enabled</code>.
If we can get the feature working more reliably (<a href="https://github.com/servo/servo/issues/37418">#37418</a>), it could <strong>halve the energy</strong> Servo spends on parsing, <strong>lower latency</strong> for pages that don’t use document.write(), and even <strong>improve the html5ever API</strong> for the ecosystem.</p>
<h3>For developers <a class="header-anchor" href="https://servo.org/blog/2026/04/30/march-in-servo/#for-developers">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>Servo’s DevTools feature now has partial support for inspecting <strong>service workers</strong> (<a href="https://github.com/CynthiaOketch">@CynthiaOketch</a>, <a href="https://github.com/servo/servo/pull/43659">#43659</a>), as well as using the <strong>navigation controls</strong> along the top of the UI (<a href="https://github.com/brentschroeter">@brentschroeter</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/servo/servo/pull/43026">#43026</a>).</p>
<p>In the <strong>Inspector</strong> tab, we’ve fixed a bug where the UI stops updating when navigating to a new page (<a href="https://github.com/brentschroeter">@brentschroeter</a>, <a href="https://github.com/servo/servo/pull/43153">#43153</a>).</p>
<p>In the <strong>Console</strong> tab, you can now evaluate JavaScript in <strong>web workers</strong> and <strong>service workers</strong> (<a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/servo/servo/pull/43361">#43361</a>, <a href="https://github.com/servo/servo/pull/43492">#43492</a>).</p>
<p>In the <strong>Debugger</strong> tab, you can now <strong>Step In</strong>, <strong>Step Out</strong>, and <strong>Step Over</strong> (<a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/pull/42907">#42907</a>, <a href="https://github.com/servo/servo/pull/43040">#43040</a>, <a href="https://github.com/servo/servo/pull/43042">#43042</a>, <a href="https://github.com/servo/servo/pull/43135">#43135</a>).
We’ve landed partial support for the <strong>Scopes</strong> panel (<a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/pull/43166">#43166</a>, <a href="https://github.com/servo/servo/pull/43167">#43167</a>, <a href="https://github.com/servo/servo/pull/43232">#43232</a>), the <strong>Call stack</strong> panel (<a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/servo/servo/pull/43015">#43015</a>, <a href="https://github.com/servo/servo/pull/43039">#43039</a>), and showing you information when <strong>hovering over objects</strong>, <strong>arrays</strong>, <strong>functions</strong>, and other values (<a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/servo/servo/pull/43319">#43319</a>, <a href="https://github.com/servo/servo/pull/43356">#43356</a>, <a href="https://github.com/servo/servo/pull/43456">#43456</a>, <a href="https://github.com/servo/servo/pull/42996">#42996</a>, <a href="https://github.com/servo/servo/pull/42936">#42936</a>, <a href="https://github.com/servo/servo/pull/42994">#42994</a>).</p>
<figure>
    <a href="https://servo.org/img/blog/2026-04-debugger.png"><img alt="screenshot of the DevTools debugger, showing live variable values" src="https://servo.org/img/blog/2026-04-debugger.png"/></a>
</figure>
<p>We’ve fixed some long-outstanding bugs where the <strong>DevTools UI may stop responding</strong> due to protocol desyncs (<a href="https://github.com/brentschroeter">@brentschroeter</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/servo/servo/pull/43230">#43230</a>, <a href="https://github.com/servo/servo/pull/43236">#43236</a>), or due to messages from multiple Servo threads being interleaved (<a href="https://github.com/brentschroeter">@brentschroeter</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/servo/servo/pull/43472">#43472</a>).</p>
<p>For developers of Servo itself, <a href="https://book.servo.org/building/building.html#mach"><strong>mach</strong></a> can be a bit opaque at times.
To make mach more transparent and composable, we’ve added <code>mach print-env</code> and <code>mach exec</code> commands (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/42888">#42888</a>).</p>
<p>We’re also working on a new <a href="https://containers.dev/"><strong>dev container</strong></a>, which will provide an alternative to <a href="https://book.servo.org/building/building.html">our usual procedures</a> for setting up a Servo build environment (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/43127">#43127</a>, <a href="https://github.com/servo/servo/pull/43131">#43131</a>, <a href="https://github.com/servo/servo/pull/43139">#43139</a>).</p>
<h3>Embedding and automation <a class="header-anchor" href="https://servo.org/blog/2026/04/30/march-in-servo/#embedding-and-automation">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>Breaking changes:</p>
<ul>
<li>
<p><a href="https://doc.servo.org/servo/struct.Servo.html"><code>Servo</code></a>::<code>set­_accessibility­_active()</code> is now <a href="https://doc.servo.org/servo/struct.WebView.html"><code>WebView</code></a>::<a href="https://doc.servo.org/servo/struct.WebView.html#method.set_accessibility_active"><code>set­_accessibility­_active()</code></a> (<a href="https://github.com/delan">@delan</a>, <a href="https://github.com/alice">@alice</a>, <a href="https://github.com/servo/servo/pull/43029">#43029</a>), to make the API harder to misuse (see the docs for more details).</p>
</li>
<li>
<p>What was previously named <a href="https://doc.servo.org/servo/struct.WebView.html"><code>WebView</code></a>::<code>pinch­_zoom()</code> has been renamed to <a href="https://doc.servo.org/servo/struct.WebView.html#method.adjust_pinch_zoom"><code>adjust­_pinch­_zoom()</code></a>, and we’ve added a <a href="https://doc.servo.org/servo/struct.WebView.html#method.pinch_zoom"><code>pinch­_zoom()</code></a> method that lets you read the current pinch zoom level (<a href="https://github.com/chrisduerr">@chrisduerr</a>, <a href="https://github.com/servo/servo/pull/43228">#43228</a>).</p>
</li>
<li>
<p><a href="https://doc.servo.org/servo/struct.WebView.html"><code>WebView</code></a>::<code>set­_delegate()</code>, <code>set­_clipboard­_delegate()</code>, and <code>set­_gamepad­_provider()</code> are now <a href="https://doc.servo.org/servo/struct.WebViewBuilder.html"><code>WebViewBuilder</code></a>::<a href="https://doc.servo.org/servo/struct.WebViewBuilder.html#method.delegate"><code>delegate()</code></a>, <a href="https://doc.servo.org/servo/struct.WebViewBuilder.html#method.clipboard_delegate"><code>clipboard­_delegate()</code></a>, and <a href="https://doc.servo.org/servo/struct.WebViewBuilder.html#method.gamepad_delegate"><code>gamepad­_delegate()</code></a> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43205">#43205</a>, <a href="https://github.com/servo/servo/pull/43233">#43233</a>). Note that set­_gamepad­_<strong>provider</strong>() is now gamepad­_<strong>delegate</strong>(), consistent with the <code>GamepadProvider</code> rename below.</p>
</li>
<li>
<p><a href="https://doc.servo.org/servo/trait.WebViewDelegate.html"><code>WebViewDelegate</code></a>::<a href="https://doc.servo.org/servo/trait.WebViewDelegate.html#method.show_bluetooth_device_dialog"><code>show­_bluetooth­_device­_dialog()</code></a> has been reworked to use the same “request object” pattern as the <code>request­_*()</code> methods, giving you a <a href="https://doc.servo.org/servo/struct.BluetoothDeviceSelectionRequest.html"><code>Bluetooth­Device­Selection­Request</code></a> with clear methods (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/43580">#43580</a>).</p>
</li>
<li>
<p><code>GamepadProvider</code> has been renamed to <a href="https://doc.servo.org/servo/trait.GamepadDelegate.html"><code>GamepadDelegate</code></a>, and <code>gamepad­_provider()</code> on <a href="https://doc.servo.org/servo/struct.WebView.html"><code>WebView</code></a> has been renamed to <code>gamepad­_delegate()</code> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43233">#43233</a>).</p>
</li>
<li>
<p>The empty default implementation of <a href="https://doc.servo.org/servo/trait.EventLoopWaker.html"><code>EventLoopWaker</code></a>::<a href="https://doc.servo.org/servo/trait.EventLoopWaker.html#tymethod.wake"><code>wake</code></a> has been removed, because it almost never makes sense for a new custom impl to leave the method empty (<a href="https://github.com/chrisduerr">@chrisduerr</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43250">#43250</a>).</p>
</li>
<li>
<p><a href="https://doc.servo.org/servo/struct.Opts.html"><code>Opts</code></a>::<code>print­_pwm</code> is now <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><code>DiagnosticsLogging</code></a>::<a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html#structfield.progressive_web_metrics"><code>progressive­_web­_metrics</code></a> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43209">#43209</a>).</p>
</li>
</ul>
<p>Removed from our API:</p>
<ul>
<li>
<p><a href="https://doc.servo.org/servo/struct.Opts.html"><code>Opts</code></a>::<code>nonincremental­_layout</code> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43207">#43207</a>) – no replacement. This only really worked in legacy layout.</p>
</li>
<li>
<p><a href="https://doc.servo.org/servo/struct.Opts.html"><code>Opts</code></a>::<code>user­_stylesheets</code> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43206">#43206</a>) – use <a href="https://doc.servo.org/servo/struct.UserContentManager.html"><code>UserContentManager</code></a>::<a href="https://doc.servo.org/servo/struct.UserContentManager.html#method.add_stylesheet"><code>add­_stylesheet()</code></a> instead. This is how servoshell’s <code>--user-stylesheet</code> option works.</p>
</li>
</ul>
<p>You can now read and write cookies with <a href="https://doc.servo.org/servo/struct.SiteDataManager.html"><code>SiteDataManager</code></a>::<a href="https://doc.servo.org/servo/struct.SiteDataManager.html#method.cookies_for_url"><code>cookies­_for­_url()</code></a> and <a href="https://doc.servo.org/servo/struct.SiteDataManager.html#method.set_cookie_for_url"><code>set­_cookie­_for­_url()</code></a> (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/servo/servo/pull/43600">#43600</a>).</p>
<p><a href="https://doc.servo.org/servo/trait.ClipboardDelegate.html"><code>ClipboardDelegate</code></a> and <a href="https://doc.servo.org/servo/struct.StringRequest.html"><code>StringRequest</code></a> are now exposed to the public API, allowing you to implement custom clipboard delegates (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/chrisduerr">@chrisduerr</a>, <a href="https://github.com/servo/servo/pull/43203">#43203</a>, <a href="https://github.com/servo/servo/pull/43261">#43261</a>).
You can pass your custom delegate to <a href="https://doc.servo.org/servo/struct.WebViewBuilder.html"><code>WebViewBuilder</code></a>::<a href="https://doc.servo.org/servo/struct.WebViewBuilder.html#method.clipboard_delegate"><code>clipboard­_delegate()</code></a>.</p>
<p>You can now get the <a href="https://doc.servo.org/servo/struct.EmbedderControlId.html"><code>EmbedderControlId</code></a> associated with an <a href="https://doc.servo.org/servo/struct.InputMethodControl.html"><code>InputMethodControl</code></a> by calling <a href="https://doc.servo.org/servo/struct.InputMethodControl.html"><code>InputMethodControl</code></a>::<a href="https://doc.servo.org/servo/struct.InputMethodControl.html#method.id"><code>id()</code></a> (<a href="https://github.com/chrisduerr">@chrisduerr</a>, <a href="https://github.com/servo/servo/pull/43248">#43248</a>).</p>
<p><a href="https://doc.servo.org/servo/enum.PixelFormat.html"><code>PixelFormat</code></a> now implements <a href="https://doc.rust-lang.org/1.92.0/core/fmt/trait.Debug.html"><code>Debug</code></a> (<a href="https://github.com/chrisduerr">@chrisduerr</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43249">#43249</a>).</p>
<p>We’ve improved the docs for <a href="https://doc.servo.org/servo/struct.Servo.html"><code>Servo</code></a>, <a href="https://doc.servo.org/servo/struct.ServoBuilder.html"><code>ServoBuilder</code></a>, <a href="https://doc.servo.org/servo/struct.WebViewBuilder.html"><code>WebViewBuilder</code></a>, <a href="https://doc.servo.org/servo/trait.RenderingContext.html"><code>RenderingContext</code></a> (<a href="https://github.com/chrisduerr">@chrisduerr</a>, <a href="https://github.com/servo/servo/pull/43229">#43229</a>), <a href="https://doc.servo.org/servo/struct.EmbedderControlId.html"><code>EmbedderControlId</code></a>, <a href="https://doc.servo.org/servo/enum.EmbedderControlRequest.html"><code>EmbedderControlRequest</code></a>, <a href="https://doc.servo.org/servo/enum.EmbedderControlResponse.html"><code>EmbedderControlResponse</code></a>, <a href="https://doc.servo.org/servo/enum.SimpleDialogRequest.html"><code>SimpleDialogRequest</code></a>, <a href="https://doc.servo.org/servo/enum.AlertResponse.html"><code>AlertResponse</code></a>, <a href="https://doc.servo.org/servo/enum.ConfirmResponse.html"><code>ConfirmResponse</code></a>, <a href="https://doc.servo.org/servo/enum.PromptResponse.html"><code>PromptResponse</code></a>, <a href="https://doc.servo.org/servo/enum.EmbedderMsg.html"><code>EmbedderMsg</code></a> (<a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/43564">#43564</a>), <a href="https://doc.servo.org/servo/resources/trait.ResourceReaderMethods.html"><code>ResourceReaderMethods</code></a> (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43769">#43769</a>), <a href="https://doc.servo.org/servo/"><code>servo</code></a>::<a href="https://doc.servo.org/servo/input_events/index.html"><code>input­_events</code></a> (<a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/43681">#43681</a>), and <a href="https://doc.servo.org/servo/struct.WheelDelta.html"><code>WheelDelta</code></a> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43210">#43210</a>).</p>
<p>We fixed a deadlock in <strong>WebDriver</strong> that occurs under heavy use of <strong><a href="https://w3c.github.io/webdriver/#actions">actions</a></strong> from multiple input sources (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/43202">#43202</a>, <a href="https://github.com/servo/servo/pull/43169">#43169</a>, <a href="https://github.com/servo/servo/pull/43262">#43262</a>, <a href="https://github.com/servo/servo/pull/43275">#43275</a>, <a href="https://github.com/servo/servo/pull/43301">#43301</a>), <strong>‘pointerMove’ actions</strong> with a ‘duration’ are now smoothly interpolated (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/42946">#42946</a>, <a href="https://github.com/servo/servo/pull/43076">#43076</a>).</p>
<p><strong>Add Cookie</strong> is now more conformant (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/43690">#43690</a>), which led to Servo developers landing <a href="https://github.com/w3c/webdriver/pull/1955">a spec patch</a>.
<strong>‘pause’ actions</strong> are now slightly more efficient (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/43014">#43014</a>), and we’ve fixed a bug where <strong>‘wheel’ actions</strong> fail to interleave with other actions (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/43126">#43126</a>).</p>
<h3>More on the web platform <a class="header-anchor" href="https://servo.org/blog/2026/04/30/march-in-servo/#more-on-the-web-platform">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p><strong>Carets now blink</strong> in text fields (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43128">#43128</a>).
You can <a href="https://doc.servo.org/servo/prefs/struct.Preferences.html#structfield.editing_caret_blink_time">configure or disable</a> blinking carets with <code>--pref editing_caret_blink_time=0</code> or a duration in milliseconds.
<strong>Clicking to move the caret</strong> is more forgiving now (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43238">#43238</a>), and moving the caret by a <strong>word at a time</strong> is more conventional on Windows and Linux, with Ctrl instead of Alt (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43436">#43436</a>).
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 (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/freyacodes">@freyacodes</a>, <a href="https://github.com/servo/servo/pull/43247">#43247</a>, <a href="https://github.com/servo/servo/pull/42218">#42218</a>).</p>
<p><strong>Input</strong> has improved, with more responsive <strong>touchpad scrolling</strong> on Linux (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/chrisduerr">@chrisduerr</a>, <a href="https://github.com/servo/servo/pull/43350">#43350</a>).
<strong>Pointer events</strong> and <strong>mouse events</strong> can now be <strong><a href="https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Scripting/Event_bubbling#event_capture">captured</a> across shadow DOM boundaries</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/42987">#42987</a>), and we’ve now started working towards shadow-DOM-compatible focus (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43811">#43811</a>).
Pressing <strong>Space</strong> or <strong>Enter</strong> inside text fields no longer causes them to be clicked (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43343">#43343</a>).</p>
<p>The <strong>lang</strong> attribute is now taken into account when shaping, which is important for the correct rendering of Chinese and Japanese text (<a href="https://github.com/RichardTjokroutomo">@RichardTjokroutomo</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43447">#43447</a>).
<strong>‘font-weight’</strong> is now matched more accurately when no available font is an exact match (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/43125">#43125</a>).</p>
<p><strong>Navigation</strong> is one of the most complicated parts of HTML: navigating can <a href="https://servo.org">run some JavaScript that replaces the page</a>, <a href="https://servo.org">just run some JavaScript</a>, or depending on the response, <a href="http://google.com/generate_204">do nothing at all</a>.
<strong>&lt;iframe&gt;</strong> makes navigation doubly complicated: the document containing an &lt;iframe&gt; can observe and interact with the document inside the &lt;iframe&gt; in various ways, often synchronously.
This has been the source of <a href="https://github.com/servo/servo/issues/14856">many</a> <a href="https://github.com/servo/servo/issues/23373">bugs</a> <a href="https://github.com/servo/servo/issues/24901">over</a> <a href="https://github.com/servo/servo/issues/31242">the</a> <a href="https://github.com/servo/servo/issues/31973">years</a>, but we’ve recently fixed one of those major issues (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/43496">#43496</a>).</p>
<figure><div style="display: flex;">
<p><img alt="screenshot of the HTML specification, showing that &#x201C;the javascript: URL special case&#x201D; is referenced in eight other sections" src="https://servo.org/img/blog/2026-04-javascript-url-special-case.png"/></p>
<p><img alt="screenshot of the HTML specification, showing that &#x201C;is initial about:blank&#x201D; is referenced in eighteen other sections" src="https://servo.org/img/blog/2026-04-is-initial-about-blank.png"/></p>
</div><figcaption>
<p><code>javascript:</code> URLs are <a href="https://html.spec.whatwg.org/multipage/#the-javascript:-url-special-case">a massive special case</a> with <a href="https://github.com/whatwg/html/issues?q=label%3A%22topic%3A%20javascript%3A%20URLs%22">many quirks</a>, and &lt;iframe&gt; has <a href="https://html.spec.whatwg.org/multipage/#is-initial-about:blank">its own big edge cases</a>.</p>
</figcaption></figure>
<p><strong>new Worker()</strong> now supports <strong>JS modules</strong> (<a href="https://github.com/pylbrecht">@pylbrecht</a>, <a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/servo/servo/pull/40365">#40365</a>), and <strong>CanvasRenderingContext2D</strong> now supports drawing text with <strong>Variation Selectors</strong>, allowing you to control things like emoji presentation and CJK shaping (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/43449">#43449</a>).</p>
<p>Servo now fires <strong>‘pointerover’</strong>, <strong>‘pointerout’</strong>, <strong>‘pointerenter’</strong>, and <strong>‘pointerleave’</strong> events on web content (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/42736">#42736</a>), <strong>‘scroll’</strong> events on <strong>VisualViewport</strong> (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/servo/servo/pull/42771">#42771</a>), and <strong>‘scrollend’</strong> events on <strong>Document</strong>, <strong>Element</strong>, and <strong>VisualViewport</strong> (<a href="https://github.com/abdelrahman1234567">@abdelrahman1234567</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/38773">#38773</a>).
We also fire <strong>‘error’</strong> events when <strong>event handler</strong> attributes contain syntax errors (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/43178">#43178</a>).</p>
<p>We’ve improved the default appearance of <strong>&lt;summary&gt;</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43111">#43111</a>), <strong>&lt;select&gt;</strong> (<a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/servo/servo/pull/43175">#43175</a>), <strong>&lt;input type=file&gt;</strong> (<a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/AlexVasiluta">@AlexVasiluta</a>, <a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/servo/servo/pull/43498">#43498</a>, <a href="https://github.com/servo/servo/pull/43186">#43186</a>), and <strong>&lt;textarea&gt;</strong> and <strong>&lt;input type=text&gt;</strong> and friends (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43132">#43132</a>), plus <strong>‘::marker’</strong> in mixed LTR/RTL content (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43201">#43201</a>).
<strong>&lt;select&gt;</strong> also now requires user interaction to open the picker (<a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/servo/servo/pull/43485">#43485</a>).</p>
<p><strong>&lt;form action&gt;</strong>, <strong>&lt;iframe src&gt;</strong>, <strong>open(url)</strong> on <strong>XMLHttpRequest</strong>, <strong>new EventSource(url)</strong>, and <strong>new Worker(url)</strong> now correctly resolve the URL with the page encoding (<a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/jayant911">@jayant911</a>, <a href="https://github.com/Veercodeprog">@Veercodeprog</a>, <a href="https://github.com/sabbCodes">@sabbCodes</a>, <a href="https://github.com/servo/servo/pull/43521">#43521</a>, <a href="https://github.com/servo/servo/pull/43554">#43554</a>, <a href="https://github.com/servo/servo/pull/43572">#43572</a>, <a href="https://github.com/servo/servo/pull/43537">#43537</a>, <a href="https://github.com/servo/servo/pull/43634">#43634</a>, <a href="https://github.com/servo/servo/pull/43588">#43588</a>).</p>
<p><strong>‘direction’</strong> now works on grid containers (<a href="https://github.com/nicoburns">@nicoburns</a>, <a href="https://github.com/servo/servo/pull/42118">#42118</a>), <strong>SVG images</strong> can now be used in <strong>‘border-image’</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/42566">#42566</a>), <strong>‘linear-gradient()’</strong> now dithers to reduce banding (<a href="https://github.com/Messi002">@Messi002</a>, <a href="https://github.com/servo/servo/pull/43603">#43603</a>), <strong>‘letter-spacing’</strong> no longer applies to invisible zero-width formatting characters (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/42961">#42961</a>), and <strong>‘:active’</strong> now matches disabled or non-focusable elements too, as long as they are being clicked (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/42935">#42935</a>).</p>
<p><strong>DOMContentLoaded</strong> timings in <strong>Performance­Navigation­Timing</strong> are more accurate (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/43151">#43151</a>). <strong>Performance­Paint­Timing</strong> and <strong>Largest­Contentful­Paint</strong> are more accurate too, taking &lt;iframe&gt; into account (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/42149">#42149</a>), and checking for and ignoring things like broken images and transparent backgrounds (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/42833">#42833</a>, <a href="https://github.com/servo/servo/pull/42975">#42975</a>, <a href="https://github.com/servo/servo/pull/43475">#43475</a>).</p>
<p>We’ve improved the conformance of <strong>JS modules</strong> (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/servo/servo/pull/43585">#43585</a>), <strong>&lt;button command&gt;</strong> (<a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/servo/servo/pull/42883">#42883</a>), <strong>&lt;font size&gt;</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/43103">#43103</a>), <strong>&lt;link media&gt;</strong> and <strong>&lt;link type&gt;</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43043">#43043</a>), <strong>&lt;option selected&gt;</strong> (<a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/servo/servo/pull/43582">#43582</a>), <strong>&lt;script integrity&gt;</strong> and <strong>&lt;style integrity&gt;</strong> (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/servo/servo/pull/42931">#42931</a>), <strong>EventSource</strong> (<a href="https://github.com/mishop-15">@mishop-15</a>, <a href="https://github.com/servo/servo/pull/42179">#42179</a>), <strong>SubtleCrypto</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/42984">#42984</a>, <a href="https://github.com/servo/servo/pull/43315">#43315</a>, <a href="https://github.com/servo/servo/pull/43533">#43533</a>, <a href="https://github.com/servo/servo/pull/43519">#43519</a>), <strong>Worker</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/43329">#43329</a>), <strong>HTMLVideoElement</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/43341">#43341</a>), <strong>dataset</strong> on <strong>Element</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43046">#43046</a>), and <strong>querySelector()</strong> and <strong>querySelectorAll()</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/42991">#42991</a>).</p>
<p>We’ve fixed bugs related to <strong>error reporting</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/xZaisk">@xZaisk</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/eyupcanakman">@eyupcanakman</a>, <a href="https://github.com/servo/servo/pull/43191">#43191</a>, <a href="https://github.com/servo/servo/pull/43323">#43323</a>, <a href="https://github.com/servo/servo/pull/43101">#43101</a>, <a href="https://github.com/servo/servo/pull/43560">#43560</a>), <strong>event loops</strong> (<a href="https://github.com/jayant911">@jayant911</a>, <a href="https://github.com/servo/servo/pull/43523">#43523</a>), <strong>focus</strong> (<a href="https://github.com/jakubadamw">@jakubadamw</a>, <a href="https://github.com/servo/servo/pull/43431">#43431</a>), <strong>quirks mode</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/servo/servo/pull/42960">#42960</a>, <a href="https://github.com/servo/servo/pull/43368">#43368</a>), <strong>&lt;iframe&gt;</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/43539">#43539</a>, <a href="https://github.com/servo/servo/pull/43732">#43732</a>), the <strong>‘animationstart’</strong> and <strong>‘animationend’</strong> events (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/43454">#43454</a>), the <strong>‘touchmove’</strong> event (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/42926">#42926</a>), <strong>CanvasRenderingContext2D</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/43218">#43218</a>), <strong>Worker</strong> (<a href="https://github.com/bruno-j-nicoletti">@bruno-j-nicoletti</a>, <a href="https://github.com/servo/servo/pull/43213">#43213</a>), <strong>‘:active’</strong> on &lt;input&gt; (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43722">#43722</a>), <strong>‘overflow: scroll’</strong> on ‘::before’ and ‘::after’ (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/servo/servo/pull/43231">#43231</a>), <strong>‘position: absolute’</strong> (<a href="https://github.com/yoursanonymous">@yoursanonymous</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43084">#43084</a>), and <strong>&lt;img&gt;</strong> and <strong>&lt;svg&gt;</strong> without width or height attributes (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/42666">#42666</a>).
Fixing that last bug led to Servo developers finding two <a href="https://github.com/w3c/csswg-drafts/issues/12612">spec</a> <a href="https://github.com/w3c/csswg-drafts/issues/13149">issues</a>!</p>
<p>We’ve landed partial support for using <strong>CSS <a href="https://drafts.csswg.org/css-lists/#counter">counters</a></strong> 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 <code>0.</code> or similar.
In any case, you can use a &lt;counter-style-name&gt; or ‘symbols()’ in ‘list-style-type’, and ‘counter()’ and ‘counters()’ in ‘content’ (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43111">#43111</a>).</p>
<p>We’ve also landed partial support for <strong>&lt;marquee&gt;</strong> and the <strong>HTMLMarqueeElement</strong> interface, including basic layout, but the contents are not animated yet (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/servo/servo/pull/43520">#43520</a>, <a href="https://github.com/servo/servo/pull/43610">#43610</a>).</p>
<p>Servo now exposes several attributes that have no direct effect, but are needed for web compatibility (<a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/servo/servo/pull/43500">#43500</a>, <a href="https://github.com/servo/servo/pull/43499">#43499</a>, <a href="https://github.com/servo/servo/pull/43502">#43502</a>, <a href="https://github.com/servo/servo/pull/43518">#43518</a>):</p>
<ul>
<li><strong>noHref</strong> on <strong>HTMLAreaElement</strong></li>
<li><strong>hreflang</strong>, <strong>type</strong>, <strong>charset</strong> on <strong>HTMLAnchorElement</strong></li>
<li><strong>useMap</strong> on <strong>HTMLInputElement</strong> and <strong>HTMLObjectElement</strong></li>
<li><strong>longDesc</strong> on <strong>HTMLIFrameElement</strong> and <strong>HTMLFrameElement</strong></li>
</ul>
<h3>Performance and stability <a class="header-anchor" href="https://servo.org/blog/2026/04/30/march-in-servo/#performance-and-stability">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>We’ve fixed <strong>sluggish scrolling</strong> on long documents like <a href="https://docs.rs/iced-x86/1.21.0/iced_x86/code_asm/struct.CodeAssembler.html">this page on docs.rs</a> (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/43074">#43074</a>, <a href="https://github.com/servo/servo/pull/43138">#43138</a>), and reduced the <strong>memory usage of BoxFragment</strong> by <strong>10%</strong> (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/servo/servo/pull/43056">#43056</a>).
<strong>about:memory</strong> now has a <strong>Force GC</strong> button (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/42798">#42798</a>), and no longer reports all processes as content processes in multiprocess mode (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/42923">#42923</a>).</p>
<p><strong>Web fonts</strong> are no longer fetched more than once, and they no longer cause reflow when they fail to load (<a href="https://github.com/minghuaw">@minghuaw</a>, <a href="https://github.com/servo/servo/pull/43382">#43382</a>, <a href="https://github.com/servo/servo/pull/43595">#43595</a>).
We’re also working towards better caching for shaping results (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/lukewarlow">@lukewarlow</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/43653">#43653</a>).
<strong>Event handler</strong> attribute lookup is more efficient now (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/servo/servo/pull/43337">#43337</a>), and we’ve made <strong>DOM tree walking</strong> more efficient in many cases (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/servo/servo/pull/42781">#42781</a>, <a href="https://github.com/servo/servo/pull/42978">#42978</a>, <a href="https://github.com/servo/servo/pull/43476">#43476</a>).</p>
<p><strong>crypto.subtle.encrypt()</strong>, <strong>decrypt()</strong>, <strong>sign()</strong>, <strong>verify()</strong>, <strong>digest()</strong>, <strong>importKey()</strong>, <strong>unwrapKey()</strong>, <strong>decapsulateKey()</strong>, and <strong>decapsulateBits()</strong> are more efficient now (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/42927">#42927</a>), thanks to a recent <a href="https://github.com/w3c/webcrypto/issues/422">spec</a> <a href="https://github.com/w3c/webcrypto/pull/426">update</a>.</p>
<p>More of Servo now <strong>uses cheaper crossbeam channels</strong> instead of IPC channels, unless Servo is running in multiprocess mode, or <strong>avoids IPC altogether</strong> (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/42077">#42077</a>, <a href="https://github.com/servo/servo/pull/43309">#43309</a>, <a href="https://github.com/servo/servo/pull/42966">#42966</a>).
We’ve also reduced clones, allocations, conversions, comparisons, and borrow checks in many parts of Servo (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/servo/servo/pull/43212">#43212</a>, <a href="https://github.com/servo/servo/pull/43055">#43055</a>, <a href="https://github.com/servo/servo/pull/43066">#43066</a>, <a href="https://github.com/servo/servo/pull/43304">#43304</a>, <a href="https://github.com/servo/servo/pull/43452">#43452</a>, <a href="https://github.com/servo/servo/pull/43717">#43717</a>, <a href="https://github.com/servo/servo/pull/43780">#43780</a>, <a href="https://github.com/servo/servo/pull/43088">#43088</a>, <a href="https://github.com/servo/servo/pull/43226">#43226</a>).</p>
<p><strong>DOM data structures</strong> (<code>#[dom_struct]</code>) can refer to one another, with the help of <a href="https://research.mozilla.org/2014/08/26/javascript-servos-only-garbage-collector/">garbage collection</a>.
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 <code>impl Drop</code>.
To help prevent that class of bug, we’re reworking our DOM types so that none of them have <code>#[dom_struct]</code> and <code>impl Drop</code> at the same time (<a href="https://github.com/willypuzzle">@willypuzzle</a>, <a href="https://github.com/servo/servo/pull/42937">#42937</a>, <a href="https://github.com/servo/servo/pull/42982">#42982</a>, <a href="https://github.com/servo/servo/pull/43018">#43018</a>, <a href="https://github.com/servo/servo/pull/43071">#43071</a>, <a href="https://github.com/servo/servo/pull/43222">#43222</a>, <a href="https://github.com/servo/servo/pull/43288">#43288</a>, <a href="https://github.com/servo/servo/pull/43544">#43544</a>, <a href="https://github.com/servo/servo/pull/43563">#43563</a>, <a href="https://github.com/servo/servo/pull/43631">#43631</a>).</p>
<p>We’ve fixed a crash caused by an IPC resource leak when making <strong>many requests over time</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/43381">#43381</a>), and some bugs found by <strong>ThreadSanitizer</strong> and <strong>--debug-mozjs</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/42976">#42976</a>, <a href="https://github.com/servo/servo/pull/42963">#42963</a>, <a href="https://github.com/servo/servo/pull/43487">#43487</a>).
We’ve also fixed crashes in <strong>CanvasRenderingContext2D</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/43449">#43449</a>), <strong>Crypto</strong> (<a href="https://github.com/rogerkorantenng">@rogerkorantenng</a>, <a href="https://github.com/servo/servo/pull/43501">#43501</a>), <strong>devtools</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/43133">#43133</a>), <strong>event handler</strong> attributes (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/43178">#43178</a>), <strong>Promise</strong> (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/43470">#43470</a>), and <strong>WebDriver</strong> (<a href="https://github.com/Tarmil">@Tarmil</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/42739">#42739</a>, <a href="https://github.com/servo/servo/pull/43381">#43381</a>).</p>
<p>We’ve continued our long-running effort to <strong>use the Rust type system</strong> to make certain kinds of dynamic borrow failures impossible (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/Uiniel">@Uiniel</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/PuercoPop">@PuercoPop</a>, <a href="https://github.com/pylbrecht">@pylbrecht</a>, <a href="https://github.com/arabson99">@arabson99</a>, <a href="https://github.com/jayant911">@jayant911</a>, <a href="https://github.com/servo/servo/pull/42957">#42957</a>, <a href="https://github.com/servo/servo/pull/43108">#43108</a>, <a href="https://github.com/servo/servo/pull/43130">#43130</a>, <a href="https://github.com/servo/servo/pull/43215">#43215</a>, <a href="https://github.com/servo/servo/pull/43183">#43183</a>, <a href="https://github.com/servo/servo/pull/43219">#43219</a>, <a href="https://github.com/servo/servo/pull/43245">#43245</a>, <a href="https://github.com/servo/servo/pull/43220">#43220</a>, <a href="https://github.com/servo/servo/pull/43252">#43252</a>, <a href="https://github.com/servo/servo/pull/43268">#43268</a>, <a href="https://github.com/servo/servo/pull/43184">#43184</a>, <a href="https://github.com/servo/servo/pull/43277">#43277</a>, <a href="https://github.com/servo/servo/pull/43278">#43278</a>, <a href="https://github.com/servo/servo/pull/43284">#43284</a>, <a href="https://github.com/servo/servo/pull/43302">#43302</a>, <a href="https://github.com/servo/servo/pull/43312">#43312</a>, <a href="https://github.com/servo/servo/pull/43348">#43348</a>, <a href="https://github.com/servo/servo/pull/43327">#43327</a>, <a href="https://github.com/servo/servo/pull/43362">#43362</a>, <a href="https://github.com/servo/servo/pull/43365">#43365</a>, <a href="https://github.com/servo/servo/pull/43383">#43383</a>, <a href="https://github.com/servo/servo/pull/43432">#43432</a>, <a href="https://github.com/servo/servo/pull/43259">#43259</a>, <a href="https://github.com/servo/servo/pull/43439">#43439</a>, <a href="https://github.com/servo/servo/pull/43473">#43473</a>, <a href="https://github.com/servo/servo/pull/43481">#43481</a>, <a href="https://github.com/servo/servo/pull/43480">#43480</a>, <a href="https://github.com/servo/servo/pull/43479">#43479</a>, <a href="https://github.com/servo/servo/pull/43525">#43525</a>, <a href="https://github.com/servo/servo/pull/43535">#43535</a>, <a href="https://github.com/servo/servo/pull/43543">#43543</a>, <a href="https://github.com/servo/servo/pull/43549">#43549</a>, <a href="https://github.com/servo/servo/pull/43570">#43570</a>, <a href="https://github.com/servo/servo/pull/43571">#43571</a>, <a href="https://github.com/servo/servo/pull/43569">#43569</a>, <a href="https://github.com/servo/servo/pull/43579">#43579</a>, <a href="https://github.com/servo/servo/pull/43584">#43584</a>, <a href="https://github.com/servo/servo/pull/43657">#43657</a>, <a href="https://github.com/servo/servo/pull/43713">#43713</a>).</p>
<p>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 (<a href="https://github.com/elomscansio">@elomscansio</a>, <a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/43646">#43646</a>), cleanups (<a href="https://github.com/simartin">@simartin</a>, <a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/sabbCodes">@sabbCodes</a>, <a href="https://github.com/niyabits">@niyabits</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/pull/43276">#43276</a>, <a href="https://github.com/servo/servo/pull/43285">#43285</a>, <a href="https://github.com/servo/servo/pull/43532">#43532</a>, <a href="https://github.com/servo/servo/pull/43778">#43778</a>, <a href="https://github.com/servo/servo/pull/43771">#43771</a>, <a href="https://github.com/servo/servo/pull/43566">#43566</a>, <a href="https://github.com/servo/servo/pull/43567">#43567</a>, <a href="https://github.com/servo/servo/pull/43587">#43587</a>, <a href="https://github.com/servo/servo/pull/43140">#43140</a>, <a href="https://github.com/servo/servo/pull/43316">#43316</a>), and refactors (<a href="https://github.com/sabbCodes">@sabbCodes</a>, <a href="https://github.com/arabson99">@arabson99</a>, <a href="https://github.com/jayant911">@jayant911</a>, <a href="https://github.com/StaySafe020">@StaySafe020</a>, <a href="https://github.com/saydmateen">@saydmateen</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/elomscansio">@elomscansio</a>, <a href="https://github.com/CynthiaOketch">@CynthiaOketch</a>, <a href="https://github.com/servo/servo/pull/43614">#43614</a>, <a href="https://github.com/servo/servo/pull/43641">#43641</a>, <a href="https://github.com/servo/servo/pull/43619">#43619</a>, <a href="https://github.com/servo/servo/pull/43642">#43642</a>, <a href="https://github.com/servo/servo/pull/43623">#43623</a>, <a href="https://github.com/servo/servo/pull/43656">#43656</a>, <a href="https://github.com/servo/servo/pull/43644">#43644</a>, <a href="https://github.com/servo/servo/pull/43672">#43672</a>, <a href="https://github.com/servo/servo/pull/43664">#43664</a>, <a href="https://github.com/servo/servo/pull/43676">#43676</a>, <a href="https://github.com/servo/servo/pull/43684">#43684</a>, <a href="https://github.com/servo/servo/pull/43679">#43679</a>, <a href="https://github.com/servo/servo/pull/43678">#43678</a>, <a href="https://github.com/servo/servo/pull/43655">#43655</a>, <a href="https://github.com/servo/servo/pull/43675">#43675</a>, <a href="https://github.com/servo/servo/pull/43731">#43731</a>, <a href="https://github.com/servo/servo/pull/43729">#43729</a>, <a href="https://github.com/servo/servo/pull/43728">#43728</a>, <a href="https://github.com/servo/servo/pull/43740">#43740</a>, <a href="https://github.com/servo/servo/pull/43751">#43751</a>, <a href="https://github.com/servo/servo/pull/43748">#43748</a>, <a href="https://github.com/servo/servo/pull/43747">#43747</a>, <a href="https://github.com/servo/servo/pull/43752">#43752</a>, <a href="https://github.com/servo/servo/pull/43745">#43745</a>, <a href="https://github.com/servo/servo/pull/43724">#43724</a>, <a href="https://github.com/servo/servo/pull/43723">#43723</a>, <a href="https://github.com/servo/servo/pull/43765">#43765</a>, <a href="https://github.com/servo/servo/pull/43767">#43767</a>, <a href="https://github.com/servo/servo/pull/43181">#43181</a>, <a href="https://github.com/servo/servo/pull/43269">#43269</a>, <a href="https://github.com/servo/servo/pull/43270">#43270</a>, <a href="https://github.com/servo/servo/pull/43279">#43279</a>, <a href="https://github.com/servo/servo/pull/43437">#43437</a>, <a href="https://github.com/servo/servo/pull/43597">#43597</a>, <a href="https://github.com/servo/servo/pull/43607">#43607</a>, <a href="https://github.com/servo/servo/pull/43602">#43602</a>, <a href="https://github.com/servo/servo/pull/43616">#43616</a>, <a href="https://github.com/servo/servo/pull/43609">#43609</a>, <a href="https://github.com/servo/servo/pull/43612">#43612</a>, <a href="https://github.com/servo/servo/pull/43647">#43647</a>, <a href="https://github.com/servo/servo/pull/43651">#43651</a>, <a href="https://github.com/servo/servo/pull/43662">#43662</a>, <a href="https://github.com/servo/servo/pull/43714">#43714</a>, <a href="https://github.com/servo/servo/pull/43774">#43774</a>).</p>
<h3>Donations <a class="header-anchor" href="https://servo.org/blog/2026/04/30/march-in-servo/#donations">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>Thanks again for your generous support!
We are now receiving <strong>7167 USD/month</strong> (+2.6% from February) in recurring donations.
This helps us cover the cost of our <strong><a href="https://ci0.servo.org/">speedy</a> <a href="https://ci1.servo.org/">CI</a> <a href="https://ci2.servo.org/">and</a> <a href="https://ci3.servo.org/">benchmarking</a> <a href="https://ci4.servo.org/">servers</a></strong>, one of our latest <strong><a href="https://www.outreachy.org/alums/2025-06/#:~:text=Servo">Outreachy interns</a></strong>, and funding <strong><a href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/">maintainer work</a></strong> that helps more people contribute to Servo.</p>
<p>Servo is also on <a href="https://thanks.dev/">thanks.dev</a>, and already <strong>37 GitHub users</strong> (+5 from February) that depend on Servo are sponsoring us there.
If you use Servo libraries like <a href="https://crates.io/crates/url/reverse_dependencies">url</a>, <a href="https://crates.io/crates/html5ever/reverse_dependencies">html5ever</a>, <a href="https://crates.io/crates/selectors/reverse_dependencies">selectors</a>, or <a href="https://crates.io/crates/cssparser/reverse_dependencies">cssparser</a>, signing up for <a href="https://thanks.dev/">thanks.dev</a> could be a good way for you (or your employer) to give back to the community.</p>
<p>We now have <a href="https://servo.org/blog/2025/11/21/sponsorship-tiers/"><strong>sponsorship tiers</strong></a> 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 <a href="mailto:join@servo.org">join@servo.org</a>.</p>
<figure class="_fig" style="width: 100%; margin: 1em 0;"><div class="_flex">
    <div style="text-align: right;">
        <div><strong>7167</strong> USD/month</div>
        <div/>
        <div/>
        <div style="padding-right: 1em;"><strong>10000</strong></div>
    </div>
    <progress max="10000" value="7167"/>
</div></figure>
<p>Use of donations is decided transparently via the Technical Steering Committee’s public <strong><a href="https://github.com/servo/project/blob/main/FUNDING_REQUEST.md">funding request process</a></strong>, and active proposals are tracked in <a href="https://github.com/servo/project/issues/187">servo/project#187</a>.
For more details, head to our <a href="https://servo.org/sponsorship/">Sponsorship page</a>.</p></div>
    </content>
    <updated>2026-04-30T00:00:00Z</updated>
    <source>
      <id>https://servo.org</id>
      <author>
        <name>Servo Team</name>
        <email>info@servo.org</email>
      </author>
      <link href="https://servo.org/blog/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://servo.org" rel="alternate" type="text/html"/>
      <subtitle>All the entries in the Servo blog.</subtitle>
      <title>Servo Blog</title>
      <updated>2026-05-31T00:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/04/30/gsoc-2026-selected-projects/</id>
    <link href="https://blog.rust-lang.org/2026/04/30/gsoc-2026-selected-projects/" rel="alternate" title="Announcing Google Summer of Code 2026 selected projects" type="text/html"/>
    <title xml:lang="en">Announcing Google Summer of Code 2026 selected projects</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>As <a href="https://blog.rust-lang.org/2026/02/19/Rust-participates-in-GSoC-2026/" rel="external">previously announced</a>, the Rust Project is participating in <a href="https://summerofcode.withgoogle.com" rel="external">Google Summer of Code (GSoC)</a> 2026. GSoC is a global program organized by Google that is designed to bring new contributors to the world of open source.</p>
<p>A few months ago, we published a list of <a href="https://github.com/rust-lang/google-summer-of-code" rel="external">GSoC project ideas</a>, and started discussing these projects with potential GSoC applicants on our <a href="https://rust-lang.zulipchat.com/#narrow/stream/421156-gsoc" rel="external">Zulip</a>. We had many interesting discussions with the potential contributors, and even saw some of them making non-trivial contributions to various Rust Project repositories before GSoC officially started!</p>
<p>The applicants prepared and submitted their project proposals by the end of March. This year, we received 96 proposals, which is a 50% increase from last year. We are glad that there was again a lot of interest in our projects! Like many other GSoC organizations this year, we somewhat struggled with some AI-generated proposals and low-quality contributions generated using AI agents, but it stayed manageable.</p>
<p>GSoC requires us to produce an ordered list of the best proposals, which is always challenging, as Rust is a big project with many priorities. Our mentors examined the submitted proposals and evaluated them based on their prior interactions with the given applicant, their contributions so far, the quality of the proposal itself, but also the importance of the proposed project for the Rust Project and its wider community. We also had to take mentor bandwidth and availability into account. Unfortunately, we had to cancel some projects due to several mentors losing their funding for Rust work in the past few weeks.</p>
<p>As is usual in GSoC, even though some project topics received multiple proposals<sup class="footnote-reference" id="fr-most-popular-1"><a href="https://blog.rust-lang.org/2026/04/30/gsoc-2026-selected-projects/#fn-most-popular">1</a></sup>, we had to pick only one proposal per project topic. We also had to choose between proposals targeting different work to avoid overloading a single mentor with multiple projects. In the end, we narrowed the list down to the best proposals that we could still realistically support with our available mentor pool. We submitted this list and eagerly awaited how many of them would be accepted into GSoC.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/04/30/gsoc-2026-selected-projects/#selected-projects"/>
Selected projects</h3>
<p>On the 30th of April, Google has announced the accepted projects. We are happy to share that <strong>13</strong> Rust Project proposals were accepted by Google for Google Summer of Code 2026. That is a lot of projects! We are really happy and excited about GSoC 2026!</p>
<p>Below you can find the list of accepted proposals (in alphabetical order), along with the names of their authors and the assigned mentor(s):</p>
<ul>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/eF3fkjrN" rel="external">A Frontend for Safe GPU Offloading in Rust</a></strong> by <a href="https://github.com/sa4dus" rel="external">Marcelo Domínguez</a>, mentored by <a href="https://github.com/ZuseZ4" rel="external">Manuel Drehwald</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/Fx0vHvcq" rel="external">Adding WebAssembly Linking Support to Wild</a></strong> by <a href="https://github.com/lapla-cogito" rel="external">Kei Akiyama</a>, mentored by <a href="https://github.com/davidlattimore" rel="external">David Lattimore</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/Wg1mCCHL" rel="external">Bringing autodiff and offload into Rust CI</a></strong> by <a href="https://github.com/sgasho" rel="external">Shota Sugano</a>, mentored by <a href="https://github.com/ZuseZ4" rel="external">Manuel Drehwald</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/TBpqK07H" rel="external">Debugger for Miri</a></strong> by <a href="https://github.com/moabo3li" rel="external">Mohamed Ali Mohamed</a>, mentored by <a href="https://github.com/oli-obk" rel="external">Oli Scherer</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/xFrskRCv" rel="external">Implementing impl and mut restrictions</a></strong> by <a href="https://github.com/CoCo-Japan-pan" rel="external">Ryosuke Yamano</a>, mentored by <a href="https://github.com/jhpratt" rel="external">Jacob Pratt</a> and <a href="https://github.com/Urgau" rel="external">Urgau</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/g4xMTT5l" rel="external">Improving Ergonomics and Safety of serialport-rs</a></strong> by <a href="https://github.com/NONnonHere" rel="external">Tanmay</a>, mentored by <a href="https://github.com/sirhcel" rel="external">Christian Meusel</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/AObylxqh" rel="external">libc: transition differing bit-width time and offset variants and deprecate bug-prone constants</a></strong> by <a href="https://github.com/dybucc" rel="external">Adam Martinez</a>, mentored by <a href="https://github.com/tgross35" rel="external">Trevor Gross</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/svblODn5" rel="external">Link Linux kernel and its Modules with Wild</a></strong> by <a href="https://github.com/vishruth-thimmaiah" rel="external">Vishruth Thimmaiah</a>, mentored by <a href="https://github.com/davidlattimore" rel="external">David Lattimore</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/lif4YQOE" rel="external">Migrating rust-analyzer assists to SyntaxEditor</a></strong> by <a href="https://github.com/Shourya742" rel="external">Shourya Sharma</a>, mentored by <a href="https://github.com/ChayimFriedman2" rel="external">Chayim Refael Friedman</a> and <a href="https://github.com/Veykril" rel="external">Lukas Wirth</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/Aak8J6RB" rel="external">Port std::arch test suite to rust-lang/rust</a></strong> by <a href="https://github.com/xonx4l" rel="external">Sumit Kumar</a>, mentored by <a href="https://github.com/Kobzol" rel="external">Jakub Beránek</a> and <a href="https://github.com/folkertdev" rel="external">Folkert de Vries</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/l4jlMDP9" rel="external">Reorganizing tests/ui/issues</a></strong> by <a href="https://github.com/zedddie" rel="external">zedddie</a>, mentored by <a href="https://github.com/Teapot4195" rel="external">Teapot</a> and <a href="https://github.com/Kivooeo" rel="external">Kivooeo</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/gzkF5BG0" rel="external">Utilize debugger APIs to improve debug info test accuracy and error reporting</a></strong> by <a href="https://github.com/Walnut356" rel="external">Anthony Bolden</a>, mentored by <a href="https://github.com/Kobzol" rel="external">Jakub Beránek</a> and <a href="https://github.com/jieyouxu" rel="external">Jieyou Xu</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/jP7dTlN6" rel="external">XDG path support for rustup</a></strong> by <a href="https://github.com/Cloud0310" rel="external">Guicheng Liu</a>, mentored by <a href="https://github.com/rami3l" rel="external">rami3l</a></li>
</ul>
<p><strong>Congratulations to all applicants whose project was selected!</strong> Our mentors are looking forward to working with you on these exciting projects to improve the Rust ecosystem. You can expect to hear from us soon, so that we can start coordinating the work on your GSoC projects.</p>
<p>We are excited to mentor three contributors who already experienced GSoC with us in the previous year. Welcome back, Kei, Marcelo and Shourya!</p>
<p>We would like to thank all the applicants whose proposal was sadly not accepted, for their interactions with the Rust community and contributions to various Rust projects. There were some great proposals that did not make the cut, in large part because of limited mentorship capacity. However, even if your proposal was not accepted, we would be happy if you would consider contributing to the projects that got you interested, even outside GSoC! Our <a href="https://github.com/rust-lang/google-summer-of-code" rel="external">project idea list</a> is still current and could serve as a general entry point for contributors that would like to work on projects that would help the Rust Project and the Rust ecosystem. Some of the <a href="https://rust-lang.github.io/rust-project-goals/2026/goals.html" rel="external">Rust Project Goals</a> are also looking for help.</p>
<p>There is a good chance we'll participate in GSoC next year as well (though we can't promise anything at this moment), so we hope to receive your proposals again in the future!</p>
<p>The accepted GSoC projects will run for several months. After GSoC 2026 finishes (in autumn of 2026), we will publish a blog post in which we will summarize the outcome of the accepted projects.</p>
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn-most-popular">
<p>The most popular project topic received fourteen different proposals! <a href="https://blog.rust-lang.org/2026/04/30/gsoc-2026-selected-projects/#fr-most-popular-1">↩</a></p>
</li>
</ol>
</section></div>
    </content>
    <updated>2026-04-30T00:00:00Z</updated>
    <published>2026-04-30T00:00:00Z</published>
    <author>
      <name>Jakub Beránek</name>
    </author>
    <source>
      <id>https://blog.rust-lang.org/</id>
      <author>
        <name>Maintained by the Rust Teams.</name>
        <uri>https://github.com/rust-lang/blog.rust-lang.org/</uri>
      </author>
      <link href="https://blog.rust-lang.org/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://blog.rust-lang.org/" rel="alternate" type="text/html"/>
      <subtitle xml:lang="en">Empowering everyone to build reliable and efficient software.</subtitle>
      <title xml:lang="en">Rust Blog</title>
      <updated>2026-06-11T14:20:46Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148130</id>
    <link href="https://discourse.mozilla.org/t/mozphab-2-14-0-released/148130" rel="alternate" type="text/html"/>
    <title>MozPhab 2.14.0 Released</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Bugs resolved in Moz-Phab 2.14.0:</p>
<ul>
<li><a href="https://bugzilla.mozilla.org/2032102">bug 2032102</a> Parallelize revision creation and diff property calls in submit for faster stack submission</li>
</ul>
<p>Discuss these changes in <span class="hashtag-raw">#engineering-workflow</span> on Slack or <span class="hashtag-raw">#Conduit</span> Matrix.</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/mozphab-2-14-0-released/148130">Read full topic</a></p></div>
    </summary>
    <updated>2026-04-29T04:15:13Z</updated>
    <published>2026-04-29T04:15:13Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>sheehan</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/mozphab-2-14-0-released/148130.rss" title="MozPhab 2.14.0 Released"/>
      <updated>2026-06-12T10:58:53Z</updated>
    </source>
  </entry>

  <entry>
    <id>yt:video:B635wgZy7Iw</id>
    <link href="https://www.youtube.com/watch?v=B635wgZy7Iw" rel="alternate" type="text/html"/>
    <title>Glean Dictionary Looker Demo</title>
    <summary>A quick demonstration of the Glean Dictionary's new integration with Mozilla's instance of Looker.</summary>
    <updated>2026-04-28T21:37:03Z</updated>
    <published>2021-06-01T21:23:08Z</published>
    <author>
      <name>Mozilla Data</name>
      <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
    </author>
    <source>
      <id>yt:channel:S1zp4AVNvykWzPC-vB_Daw</id>
      <author>
        <name>Mozilla Data</name>
        <uri>https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw</uri>
      </author>
      <link href="http://www.youtube.com/feeds/videos.xml?channel_id=UCS1zp4AVNvykWzPC-vB_Daw" rel="self" type="application/atom+xml"/>
      <link href="https://www.youtube.com/channel/UCS1zp4AVNvykWzPC-vB_Daw" rel="alternate" type="text/html"/>
      <title>Mozilla Data</title>
      <updated>2020-03-03T15:46:33Z</updated>
    </source>
  </entry>
</feed>
