<?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-07-16T07:54:27Z</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>
    <id>tag:this-week-in-rust.org,2026-07-15:/blog/2026/07/15/this-week-in-rust-660/</id>
    <link href="https://this-week-in-rust.org/blog/2026/07/15/this-week-in-rust-660/" rel="alternate" type="text/html"/>
    <title>This Week in Rust 660</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/07/09/Rust-1.97.0/">Announcing Rust 1.97.0</a></li>
<li><a href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/">crates.io: development update</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://bun.com/blog/bun-in-rust">Rewriting Bun in Rust</a></li>
<li><a href="https://bullmq.io/news/260712/rust-release/">Announcing BullMQ for Rust</a></li>
<li><a href="https://github.com/zs-dima/prost-protovalidate/releases/tag/v0.6.0">prost-protovalidate 0.6 — buf.validate (protovalidate) for prost and buffa: compile-time codegen + runtime CEL, 2872/2872 conformance</a></li>
<li><a href="https://github.com/StaszeKrk/plaza/releases/tag/v1.0.0">plaza 1.0: a ratatui package-manager TUI that searches pacman, the AUR, apt, dnf, and Flatpak at once</a></li>
<li><a href="https://github.com/danube-messaging/danube/releases/tag/v0.15.1">Danube v0.15.1: native Apache Iceberg integration for streaming-to-lakehouse export</a></li>
<li><a href="https://www.willsearch.com.br/sentinel/">Guardian Sentinel. The Terminal User Interface for Guardian Decentralized Database - P2P</a></li>
<li><a href="https://github.com/kunobi-ninja/kobe/releases/tag/v0.33.0">kobe 0.33.0: a Rust operator for instant CI Kubernetes clusters</a></li>
<li><a href="https://navigatorbuilds.github.io/elara-mesh/blog/black-box-for-ai-agents.html">Elara Mesh: what the black box for AI agents actually does</a></li>
<li>
<p><a href="https://github.com/kunobi-ninja/kache/releases/tag/v0.10.0">kache 0.10.0: instant download dedup, no more polling</a></p>
</li>
<li>
<p><a href="https://richer-richard.github.io/cochlea/">cochlea 0.1.0: a headless, deterministic audio engine for AI agents</a></p>
</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://opensourcesecurity.io/2026/2026-07-rfmf-lori-niko/">Open Source Security Podcast: Rust Foundation Maintainers Fund with Lori and Niko</a></li>
<li><a href="https://pulsebeam.dev/blog/moving-to-thread-per-core">Moving a Rust WebRTC SFU to thread-per-core</a></li>
<li><a href="https://abundance.build/blog/2026-07-11-faster-rust-tests-in-ci-with-parallel-steps/">Faster Rust tests in CI with parallel steps</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=fugcSHD-9Jw">The Only Diagram You Need to Understand Rust Ownership</a></li>
<li><a href="https://encore.dev/blog/typescript-parser-wasm">We compiled our TypeScript parser to WASM</a></li>
<li><a href="https://kerkour.com/rust-hype">Understanding the Rust hype for the busy developer</a></li>
<li><a href="https://dev.to/akavlabs_69/i-red-teamed-my-own-llm-security-gateway-in-four-passes-heres-every-gap-i-found-5cl9">I red-teamed my own LLM security gateway (Rust) in four passes — every detection gap and how I closed it</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5>
<ul>
<li>[video] <a href="https://www.youtube.com/watch?v=DJhhy6YQe8k">Backend Concepts in Rust: HTTP Servers</a></li>
<li><a href="https://dystroy.org/blog/picamobile/">Fearless Embedded Rust: A FPV Lego car</a></li>
<li><a href="https://www.aravpanwar.com/writing/building-decayfmt-in-rust/">What I learned building a self-corrupting file format in Rust</a></li>
<li><a href="https://corentin-core.github.io/posts/ruxe-async-runtime-agnostic/">Come Async You Are</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://blog.theembeddedrustacean.com/oxidize-xiao">Oxidize XIAO — An Embedded Rust Community Program</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://crates.io/crates/dashu">dashu</a>, a pure Rust set of libraries of arbitrary precision numbers.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1628">JacobZ</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/supernovae-st/nika/issues/424">Nika - showcase: CSV → chart PNG → markdown report (nika:chart has no example yet)</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>550 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-07-07..2026-07-14">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/158931">inline some <code>Symbol</code> functions</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157104">predicate/clause cleanups</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158942">remove some AST <code>tokens</code> fields</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159019">resolver: wrap arenas in <code>WorkerLocal</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158794">rework read deduplication with pooled read recorders</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159012">shrink <code>mir::Statement</code> to 40 bytes</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157491">shrink no-op drop elaboration</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158865">specialize common <code>(1, 1)</code> case for arg unification</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158842">use SmallVec for return places in MIR</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/158866">add explicit <code>Iterator::count</code> impl for <code>ChunkBy</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157153">allow <code>Allocator</code>s to be used as <code>#[global_allocator]</code>s</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158876">fix multiple logic bugs in <code>Arc::make_mut</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158940">implement feature <code>char_to_u32</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159092">make volatile operations const</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158541">move <code>std::io::Write</code> to <code>core::io</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159099">stabilize <code>String::from_utf8_lossy_owned</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/151379">stabilize <code>VecDeque::retain_back</code> from <code>truncate_front</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/17199"><code>install</code>: Move --debug to Compilation options</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17204"><code>source</code>: incorrect duplicate package warning</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17202">fix manifest schema generation: <code>TomlDebugInfo</code> enum-variants doesn't renamed</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17198">dont apply host-config gating to stable behavior</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17191">reduce library search path length in new build dir layout</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17168">reduce rustc <code>-L</code> args used in the new <code>build-dir</code> layout</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17149">rename <code>-Zno-embed-metadata</code> to <code>-Zembed-metadata=no</code></a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17203">test: fix race in <code>cargo_compile_with_invalid_code_in_deps</code></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/15000">add new lints: <code>rest_pattern_accessible_field</code> and <code>unnecessary_rest_pattern</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16965">new lint: <code>definition_in_module_root</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17343"><code>arbitrary_source_item_ordering</code>: add configurable trait impl item ordering modes</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17387"><code>tests_outside_test_module</code>: put code in backticks in the lint message</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17215">count length of the first paragraph by its text</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16980">fix <code>suboptimal_flops</code> false negative with ambiguous float literals</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17416">partly disable <code>unneeded_wildcard_pattern</code> when <code>rest_pattern_accessible_field</code> is enabled</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17404">respect the configured MSRV in <code>implicit_saturating_sub</code>'s <code>if x != 0 { x -= 1 }</code> rewrite</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16513">trigger <code>single_element_loop</code> if the block contains only a final expression</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16808">optimize <code>nonstandard_macro_braces</code> by 99.9683% (1.1b → 351K)</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17381">perf: bail out of the <code>disallowed_methods</code> rule if the disallowed list is empty</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/22771">ask for disclosure in AI contributions</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22734">add fixes for array length for <code>type_mismatch</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22741">add parens in transformed dyn type in ref type</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22736">avoid panic in merge imports on trailing path separator</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22654">change some things for <code>#[doc = macro!()]</code> expansion</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22770">clamp cttz const-eval result to type width</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22751">correctly handled cfg'ed tail expr, take 2</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22749">crash on code actions when an unresolved module is present</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22707">crash when computing diagnostics with MIR and error types</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22744">don't complete default in default impl</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22283">early late classification of lifetimes</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22583">fix <code>render_const_using_debug_impl</code> constructing outdated std layouts</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22735">fix proc macros <code>TokenStream::from_str()</code> for doc comments</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22464">hide private fields on hover depending on context</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22753">make lsp-server <code>Response</code> type closer aligned to JSON-RPC</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22535">pretty assoc const when trait in macro</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22747">reimplement <code>crate_supports_no_std</code> syntactic heuristic</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22773">resolve non-plain paths in blocks correctly</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22683">support Cargo 1.97.0 lockfile path setting</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22405">hir-ty: walk container exprs for <code>unused_must_use</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22768">fix onEnter erroneously deleting/interpreting <code>$foo</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22726">suggest code action fixes produced from diagnostics under cursor, even if they have effects elsewhere</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22777">treat library files as truly client immutable</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22534">turn <code>BlockLoc</code> into a tracked struct, take 3</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 many new optimizations landed, making this a very good week for performance.
The only real regression was a fix for a miscompile that will likely be re-landed in the future.</p>
<p>Triage done by <strong>@JonathanBrouwer</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=3659db0d3e2cd634c766fcda79ed118eca31a9fd&amp;end=5503df87342a73d0c29126a7e08dc9c1255c46ad&amp;absolute=false&amp;stat=instructions%3Au">3659db0d..5503df87</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.2%, 0.4%]</td>
<td style="text-align: center;">3</td>
</tr>
<tr>
<td style="text-align: center;">Regressions ❌ <br/> (secondary)</td>
<td style="text-align: center;">0.9%</td>
<td style="text-align: center;">[0.1%, 2.5%]</td>
<td style="text-align: center;">25</td>
</tr>
<tr>
<td style="text-align: center;">Improvements ✅ <br/> (primary)</td>
<td style="text-align: center;">-1.2%</td>
<td style="text-align: center;">[-9.9%, -0.2%]</td>
<td style="text-align: center;">195</td>
</tr>
<tr>
<td style="text-align: center;">Improvements ✅ <br/> (secondary)</td>
<td style="text-align: center;">-3.4%</td>
<td style="text-align: center;">[-92.1%, -0.1%]</td>
<td style="text-align: center;">174</td>
</tr>
<tr>
<td style="text-align: center;">All ❌✅ (primary)</td>
<td style="text-align: center;">-1.2%</td>
<td style="text-align: center;">[-9.9%, 0.4%]</td>
<td style="text-align: center;">198</td>
</tr>
</tbody>
</table>
<p>2 Regressions, 10 Improvements, 10 Mixed; 7 of them in rollups
36 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/212da2d63f1edf2ab22293547a99f0fbf8cb68a8/triage/2026/2026-07-13.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/3955">Named <code>Fn</code> trait parameters</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/159179">enable <code>unreachable_cfg_select_predicates</code> lint as part of <code>unused</code> lint group</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/156906">Stabilize <code>dyn Allocator</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/146954">Tracking Issue for vec_try_remove</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157226">Partially stabilize <code>box_vec_non_null</code></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#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/1015">Enable <code>-Zpolonius=next</code> on nightly</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1014">Enable <code>-Znext-solver</code> on nightly by default for testing</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1012">Stabilizing the state of the debuginfo test suite</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/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/cargo/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Cargo</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/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/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a>,
<a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</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/3983">bf16 primitive type</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-07-15 - 2026-08-12 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-07-15 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/21k797xr"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-15 | 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/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/312045926/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-19 | 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/314329045/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-21 | 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/315102297/"><strong>Lunch &amp; Learn: Learning Rust as First Programming Language</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (Tel Aviv-yafo, IL) | <a href="https://www.meetup.com/rust-tlv/events/">Rust 🦀 TLV</a><ul>
<li><a href="https://www.meetup.com/rust-tlv/events/315676843/"><strong>שיחה חופשית ווירטואלית על ראסט</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/315279653/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
<li>2026-07-22 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/hd8mlw56"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-23 | 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/315418155/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
</ul>
</li>
<li>2026-07-28 | 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/310254777/"><strong>Fourth Tuesday</strong></a></li>
</ul>
</li>
<li>2026-07-29 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/uo5ek1f4"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-30 | 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/312045928/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-08-02 | 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/314095294/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-08-04 | 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/315213885/"><strong>👋 Community Catch Up</strong></a></li>
</ul>
</li>
<li>2026-08-05 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/f2hnzrug"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-08-05 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs/events/">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/315210367/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
</li>
<li>2026-08-11 | 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/310254776/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-08-12 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/f2hnzrug"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-19 | Virtual (Bangalore, IN) | <a href="https://discord.gg/VJyv3NfVdw">Embedded Rust Discord</a><ul>
<li><a href="https://discord.gg/6gwCNpFP?event=1526087936234225814"><strong>Silicon Sundays</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-07-18 | Bangalore, IN | <a href="https://hasgeek.com/rustbangalore">Rust Bangalore</a><ul>
<li><a href="https://hasgeek.com/rustbangalore/july-2026-rustacean-meetup/"><strong>July 2026 Rustacean Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-19 | Virtual (Bangalore, IN) | <a href="https://discord.gg/VJyv3NfVdw">Embedded Rust Discord</a><ul>
<li><a href="https://discord.gg/6gwCNpFP?event=1526087936234225814"><strong>Silicon Sundays</strong></a></li>
</ul>
</li>
<li>2026-07-25 | Mumbai, IN | <a href="https://luma.com/mumbai">Rust Mumbai</a><ul>
<li><a href="https://luma.com/7ksabwbm/"><strong>​Rust Mumbai — July Meetup 🦀</strong></a></li>
</ul>
</li>
<li>2026-07-26 | Pune, MA, IN | <a href="https://www.meetup.com/rust-pune/events/">Rust Pune</a><ul>
<li><a href="https://www.meetup.com/rust-pune/events/315651505/"><strong>Rust Pune: July 2026</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-07-15 | Dortmund, DE | <a href="https://www.meetup.com/rust-dortmund/events/">Rust Dortmund</a><ul>
<li><a href="https://www.meetup.com/rust-dortmund/events/315496876/"><strong>Teach and Hack at Projektspeicher</strong></a></li>
</ul>
</li>
<li>2026-07-21 | 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/313816470/"><strong>Supercharge Rust funcs with implicit arguments and context-generic programming</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/315484101/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
<li>2026-07-23 | London, UK | <a href="https://www.meetup.com/london-rust-project-group">London Rust Project Group</a><ul>
<li><a href="https://www.meetup.com/london-rust-project-group/events/315366453/"><strong>Rama modular service framework for Rust</strong></a></li>
</ul>
</li>
<li>2026-07-23 | 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/315612916/"><strong>LDN Talks: July 2026 Antithesis Takeover</strong></a></li>
</ul>
</li>
<li>2026-07-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/315309633/"><strong>Rust meetup #87</strong></a></li>
</ul>
</li>
<li>2026-07-29 | Poland, PL | <a href="https://www.meetup.com/rust-poland-meetup">Rust Poland</a><ul>
<li><a href="https://www.meetup.com/rust-poland-meetup/events/315582674/"><strong>Rust Poland x Kraków #10</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Manchester, GB | <a href="https://www.meetup.com/rust-manchester/events/">Rust Manchester</a><ul>
<li><a href="https://www.meetup.com/rust-manchester/events/315037685/"><strong>Rust Manchester July Code Night</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-07-15 | 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/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-18 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225872/"><strong>North End Rust Lunch, July 18</strong></a></li>
</ul>
</li>
<li>2026-07-21 | 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/314997214/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-07-22 | 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/xvkdgtyjckbdc/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-07-22 | 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/315376271/"><strong>Rust LA: Rust in Distributed Systems with Flight Science!</strong></a></li>
</ul>
</li>
<li>2026-07-22 | 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/315636854/"><strong>Rust NYC: Write A Custom Coding Agent and wasm_zero</strong></a></li>
</ul>
</li>
<li>2026-07-25 | 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/315582650/"><strong>Porter Square Rust Lunch, July 25</strong></a></li>
</ul>
</li>
<li>2026-07-25 | Brooklyn, NY, US | <a href="https://flowercomputer.com/">Flower</a><ul>
<li><a href="https://partiful.com/e/Vq9fyDNCMSO7ia4ulK5b"><strong>BOG-A-THON 2</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Atlanta, GA, US | <a href="https://www.meetup.com/rust-atl/events/">Rust Atlanta</a><ul>
<li><a href="https://www.meetup.com/rust-atl/events/313539329/"><strong>Rust-Atl</strong></a></li>
</ul>
</li>
<li>2026-08-01 | 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/315582653/"><strong>Chinatown Rust Lunch, Aug 1</strong></a></li>
</ul>
</li>
<li>2026-08-04 | 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/314660176/"><strong>Evening Boston Rust Meetup at Red Hat, Aug 4</strong></a></li>
</ul>
</li>
<li>2026-08-06 | 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/314701905/"><strong>Shipping Temporal: How a Global Rust Ecosystem Built Chrome’s Newest Web API</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-08-08 | São Paulo, SP | <a href="https://luma.com/calendar/cal-bif2oHITU1aVvsr">Rust-SP</a><ul>
<li><a href="https://luma.com/41oiyhtk"><strong>Rust SP - Aug/2026</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-07-21 | Barton, 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/315307280/"><strong>July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Perth, AU | <a href="https://www.meetup.com/perth-rust-meetup-group">Rust Perth Meetup Group</a><ul>
<li><a href="https://www.meetup.com/perth-rust-meetup-group/events/315451138/"><strong>Rust Perth: July Meetup!</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Melbourne, AU | <a href="https://www.meetup.com/rust-melbourne/events/">Rust Melbourne</a><ul>
<li><a href="https://www.meetup.com/rust-melbourne/events/315039480/"><strong>Rust Melbourne July 2026</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>Thank you for your PR, but please edit the description like you are a chainsaw-wielding maniac that just discovered the sentences are young adults who came to the lake at summer camp after sunset.</p>
</blockquote>
<p>– <a href="https://github.com/rust-lang/rust/pull/159039#issuecomment-4931084997">workingjubilee on Rust github</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1786">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/1uxsigp/this_week_in_rust_660/">Discuss on r/rust</a></small></p></div>
    </content>
    <updated>2026-07-15T04:00:00Z</updated>
    <published>2026-07-15T04: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-07-15T04:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.thunderbird.net/?p=4460</id>
    <link href="https://blog.thunderbird.net/2026/07/community-office-hours-a-thundermail-update/" rel="alternate" type="text/html"/>
    <title>Community Office Hours: A Thundermail Update</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Our Community Office Hours series is all about connecting with the people behind Thunderbird and our products, and sharing the work that’s happening behind the scenes. These conversations are a chance to learn more about the direction of our projects and to hear directly from the people making it happen. In this episode, we are […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/07/community-office-hours-a-thundermail-update/">Community Office Hours: A Thundermail Update</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/07/blog-banner-community-hours-768x432.jpg" width="640"/></p>
<p>Our Community Office Hours series is all about connecting with the people behind Thunderbird and our products, and sharing the work that’s happening behind the scenes. These conversations are a chance to learn more about the direction of our projects and to hear directly from the people making it happen.</p>



<p>In this episode, we are talking about <strong>Thundermail</strong>!</p>



<p>Since we first shared our plans for Thundermail, we have seen an incredible amount of excitement, curiosity, and thoughtful feedback from the community of early bird testers. In this Community Office Hours session, members of the Thunderbird team sit down to talk about the project’s vision, share where things stand today, and answer some of the questions we’ve been getting along the way.</p>



<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>



<p>In this conversation, you’ll hear about:</p>



<ul>
<li>Progress since the initial announcement of Thunderbird Pro and Thundermail</li>



<li>Many of the community’s questions submitted via Reddit.</li>



<li>What we’re working on next and what you can expect in the months ahead.</li>
</ul>



<p>One of the best parts of Community Office Hours is the opportunity to have open conversations with our community. Your questions, ideas, and feedback help shape Thunderbird and its products, and we are excited to keep sharing updates as Thundermail continues to evolve.</p>



<h3>Resources</h3>



<p><strong>Resources for Suggesting Features:</strong></p>



<p>Thunderbird on Desktop and Mobile –<a href="https://connect.mozilla.org"> https://connect.mozilla.org</a></p>



<p>Thundermail and Thunderbird Pro –<a href="https://ideas.tb.pro"> https://ideas.tb.pro</a></p>



<p><strong>Resources for diving into Thundermail:</strong></p>



<p>Thundermail (and other services) roadmap: <a href="https://roadmaps.thunderbird.net/en-US/services/">https://roadmaps.thunderbird.net/en-US/services/</a></p>



<p>Subreddit: <a href="https://www.reddit.com/r/ThunderbirdPro/">https://www.reddit.com/r/ThunderbirdPro/</a></p>



<p>Thunderbird Pro addon repo that is now shipped natively in Thunderbird: <a href="https://github.com/thunderbird/tbpro-add-on">https://github.com/thunderbird/tbpro-add-on</a></p>



<p>Thunderbird Accounts repo: <a href="https://github.com/thunderbird/thunderbird-accounts">https://github.com/thunderbird/thunderbird-accounts</a></p>



<p>Webmail client repo: <a href="https://github.com/thunderbird/stormbox">https://github.com/thunderbird/stormbox</a></p>



<p>Appointment repo: <a href="https://github.com/thunderbird/appointment">https://github.com/thunderbird/appointment</a></p>



<p>Thundermail deployment repo: <a href="https://github.com/thunderbird/thundermail-deploy">https://github.com/thunderbird/thundermail-deploy</a></p>



<p>SieveConnect repo: <a href="https://github.com/philpennock/sieve-connect">https://github.com/philpennock/sieve-connect</a></p>



<p><strong>Resources for Getting Help with Thunderbird:</strong></p>



<p>Thunderbird for Android Support Channel (Matrix) –<a href="https://matrix.to/#/#tb-android:mozilla.org"> https://matrix.to/#/#tb-android:mozilla.org</a></p>



<p>Thunderbird Desktop Support Channel (Matrix) –<a href="https://matrix.to/#/#thunderbird:mozilla.org"> https://matrix.to/#/#thunderbird:mozilla.org</a></p>
<p>The post <a href="https://blog.thunderbird.net/2026/07/community-office-hours-a-thundermail-update/">Community Office Hours: A Thundermail Update</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></div>
    </content>
    <updated>2026-07-14T19:36:40Z</updated>
    <published>2026-07-14T19:36:40Z</published>
    <category term="Product"/>
    <category term="Thunderbird"/>
    <category term="thundermail"/>
    <author>
      <name>Heather Ellsworth</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-07-14T19:36:44Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148934</id>
    <link href="https://discourse.mozilla.org/t/happy-bmo-push-day-20260713-1/148934" rel="alternate" type="text/html"/>
    <title>Happy BMO Push Day! (20260713.1)</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="https://github.com/mozilla-bteam/bmo/tree/release-20260713.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=2053330">Bug 2053330</a> - “Close and move to invalid bugs” button jumps way to the left (possibly under your mouse, asking for a mis-click) when you close a bug with another resolution.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2052048">Bug 2052048</a> - Make the “Close as invalid” button a bit more targeted</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2053269">Bug 2053269</a> - BMO API bugzilla.login helper needs to support Bugzilla_api_token + cookie for authenication support</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2051396">Bug 2051396</a> - Make form.web.bounty stop adding the bounty flag and more strongly push people to HackerOne</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1355999">Bug 1355999</a> - Autocomplete on https://bugzilla.mozilla.org/form.web.bounty</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2049554">Bug 2049554</a> - Cloned security bugs should default to being secure even if they aren’t in the default security group</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2036191">Bug 2036191</a> - Crash Signature Field Mismatch in Bugzilla REST API</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2043733">Bug 2043733</a> - Live Github Status for Pull Requests</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1619459">Bug 1619459</a> - Updated QA test to stop testing XMLRPC/JSONRPC and only test REST</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2052429">Bug 2052429</a> - “Show: Open/Closed/All” selects “All” incorrectly</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2052188">Bug 2052188</a> - “Close as Invalid” button is too close to the Attach New File button so can be confusing</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-20260713-1/148934">Read full topic</a></p></div>
    </summary>
    <updated>2026-07-14T18:44:01Z</updated>
    <published>2026-07-14T18:44:01Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>dkl1</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/happy-bmo-push-day-20260713-1/148934.rss" title="Happy BMO Push Day! (20260713.1)"/>
      <updated>2026-07-15T16:59:02Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=86378</id>
    <link href="https://blog.mozilla.org/en/mozilla/browser-choice-windows-report-over-the-edge-2/" rel="alternate" type="text/html"/>
    <title>Over The Edge 2.0: what independent researchers found about browser choice on Windows</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Two years ago Mozilla asked two leading experts on deceptive design, Dr. Harry Brignull and Cennydd Bowles, to look at how Microsoft was treating people who tried to use a different browser on Windows. Their report, Over The Edge, documented a pattern of design choices in Windows, Edge, and Bing that nudged, pressured, and at […]</p>
<p>The post <a href="https://blog.mozilla.org/en/mozilla/browser-choice-windows-report-over-the-edge-2/">Over The Edge 2.0: what independent researchers found about browser choice on Windows</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"><p>Two years ago Mozilla asked two leading experts on deceptive design, Dr. Harry Brignull and Cennydd Bowles, to look at how Microsoft was treating people who tried to use a different browser on Windows. Their report, Over The Edge, documented a pattern of design choices in Windows, Edge, and Bing that nudged, pressured, and at times tricked people into using Edge.</p>



<p>This morning, the same researchers are publishing Over The Edge 2.0. They retested the same questions across Windows 10 and Windows 11, and added two new dimensions. First, how does Microsoft’s approach change from one jurisdiction to another? They assessed Microsoft’s tactics across four regions: the USA, India, the UK, and Germany, as a representative country in the European Economic Area. Second, they examined how AI features, specifically Copilot, are being used to shape the same outcomes the original report identified.</p>



<p>Their conclusion is short. <strong>Microsoft still does not allow users to download, set as the default, or keep using alternative browsers without harmful interference.</strong> The patterns are documented, and they meet established definitions of coercion, deception, and manipulation.</p>



<p>There is one bright spot. In Europe, where the Digital Markets Act applies, <em>some</em> harmful design tactics are gone. The Bing ‘All you need is right here’ panel and its trick wording. The nagging Windows 10 ‘You’re almost done setting up your PC’ journey. The Copilot data toggles that default to “On” in the US and India, by contrast default to “Off” in the EEA and the UK. Same Windows. Same Edge. Same Copilot. Different design choices, because the law required them.</p>



<figure class="wp-block-image size-large"><img alt="" class="wp-image-86379" height="819" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/07/Global-Summary-Table-1024x819.jpeg" width="1024"/></figure>



<p>That is the heart of the report. Although the EEA product still has obvious harmful design patterns, Microsoft has built a fairer user experience for browser choice. It has shipped that experience to one region. Everywhere else, including the US, the UK, India, and Brazil, harmful design patterns continue. This is an active choice – and one that can be made differently.  </p>



<p>The findings are the researchers’ own. Mozilla commissioned the work, and the report discloses that role, but the methodology, the screenshots, and the public journey database at <a href="http://edge.brignull.com">edge.brignull.com</a> let anyone check the evidence for themselves.</p>



<p>We make Firefox because we believe the web should serve people, not platforms. Firefox is independent, built by Mozilla, and designed around what is best for users, not what increases lock-in. </p>



<p>Read the full report <a href="https://research.mozilla.org/browser-competition/over-the-edge-2">here</a>.</p>
<p>The post <a href="https://blog.mozilla.org/en/mozilla/browser-choice-windows-report-over-the-edge-2/">Over The Edge 2.0: what independent researchers found about browser choice on Windows</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-07-14T12:30:00Z</updated>
    <published>2026-07-14T12:30:00Z</published>
    <category term="Internet Policy"/>
    <category term="News"/>
    <category term="Our Work"/>
    <category term="Browsers"/>
    <author>
      <name>Kush Amlani and Gemma Petrie</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-07-14T12:38:41Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=86366</id>
    <link href="https://blog.mozilla.org/en/mozilla/mozilla-state-of-open-source-ai-report/" rel="alternate" type="text/html"/>
    <title>Mozilla’s Inaugural ‘State of Open Source AI’ Report Is Here</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Open source AI has crossed a threshold. For years the debate has centered around whether open models could ever compete with closed ones. This is no longer a debate we should be having. Today Mozilla is publishing its inaugural State of Open Source AI report, built on new analysis and a global survey of 950+ […]</p>
<p>The post <a href="https://blog.mozilla.org/en/mozilla/mozilla-state-of-open-source-ai-report/">Mozilla’s Inaugural ‘State of Open Source AI’ Report Is Here</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"><p>Open source AI has crossed a threshold. For years the debate has centered around whether open models could ever compete with closed ones. This is no longer a debate we should be having. Today Mozilla <a href="https://stateofopensource.ai/">is publishing its inaugural <strong>State of Open Source AI report</strong></a>, built on new analysis and a global survey of 950+ developers, showing that open models are no longer playing catch-up. The <strong>performance gap with top proprietary systems like ChatGPT and Claude has narrowed to just 3%, while costs have fallen up to 50x in three years.</strong></p>



<p>But <a href="https://stateofopensource.ai/">the report</a> also surfaces a harder truth. Open models now power roughly a third of real-world AI usage, but capture only 4% of the revenue. So while the value is there, it just isn’t flowing back into the open ecosystem that made it possible. Meanwhile, the geopolitical picture is shifting fast.</p>



<h3><strong>Asia is racing ahead</strong></h3>



<p>China and East Asia now lead the world in open source AI adoption, at 89%, far ahead of the West, treating open source as a cornerstone of national strategy. Governments elsewhere are responding, with 12 new national AI strategies launched last year, and 47 countries now restrict foreign processing for critical workloads. The EU, Canada, and India are backing open ecosystems with real public investment, treating AI infrastructure as a strategic asset.</p>



<h3><strong>Developers want open models, but they can’t always ship them.</strong></h3>



<p>For developers, the appetite for open source is there, and cost and privacy rank as developers’ top reasons for choosing models. But wanting to use open models and running them in production are different things. 79% of developers use open models, yet only 51% have deployed them in production, versus 63% for closed models.</p>



<p>As <strong>Álvaro Ruiz Cubero of SlashData,</strong> which fielded the survey for Mozilla, put it: “this gap indicates that there is not an issue purely of model quality, but of missing infrastructure. Deployment rates for open models barely increase with company size, highlighting a lack of mature tooling and support. At the same time, buyers are prioritising licensing terms (31%) and ownership (26%), signalling a clear shift toward control and flexibility over raw capability.”</p>



<h3><strong>The real battle has moved beyond the model</strong></h3>



<p>Perhaps the most important finding may be the least obvious. The layer that matters most isn’t the model. It’s the agentic harness: the software between people and models that decides what an AI system can see, remember, and do. Changing the surrounding software can affect performance more than switching the model itself. Whoever controls that layer controls how AI behaves in the world.</p>



<p>Right now, that layer is being built with very few guardrails. Users approve AI agent requests by default up to 93% of the time, with so-called “consent fatigue” going largely unnoticed.</p>



<p>“Open source AI has reached a turning point,” said <strong>Raffi Krikorian, Mozilla’s Chief Technology Officer.</strong> “It’s no longer about expanding access to models; it’s about who has the power to shape, audit, and improve them. Without investment in the infrastructure, tooling, and governance around open models, we risk locking in a system where only restrictive, closed AI can scale – and that doesn’t serve the public interest, or sovereignty over tech policy decisions.”</p>



<h3><strong>Be owners, not renters</strong></h3>



<p>Open models offer what a subscription never can: owning your infrastructure instead of renting someone else’s. Companies like Microsoft and Uber are already rethinking their reliance on paid, closed AI tools as the bills add up. The economics are shifting and so is the thinking. </p>



<p>If you’re a CTO, a policymaker, a developer or an investor, <a href="https://stateofopensource.ai/">this is the report for you.</a> Read it, share it, and help build the infrastructure to make openness usable, not just possible.</p>



<p><a href="https://stateofopensource.ai/"><em>Read the full Mozilla State of Open Source AI report here</em></a><em>. </em></p>
<p>The post <a href="https://blog.mozilla.org/en/mozilla/mozilla-state-of-open-source-ai-report/">Mozilla’s Inaugural ‘State of Open Source AI’ Report Is Here</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-07-14T12:00:00Z</updated>
    <published>2026-07-14T12:00:00Z</published>
    <category term="AI"/>
    <category term="News"/>
    <category term="Our Work"/>
    <category term="homepage"/>
    <author>
      <name>Raffi Krikorian</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-07-14T12:38:41Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://mozillagfx.wordpress.com/?p=1487</id>
    <link href="https://mozillagfx.wordpress.com/2026/07/14/hdr-video-in-firefox-for-windows-tech-retrospective/" rel="alternate" type="text/html"/>
    <title>HDR video in Firefox for Windows tech retrospective</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">HDR video is coming to Firefox for Windows users (and has been available for some time on macOS).  This blog post explains how we developed the feature and gives a retrospective on the technical choices we made. A primer on video playback for the web: As we began designing Firefox’s HDR support, we had to … <a class="more-link" href="https://mozillagfx.wordpress.com/2026/07/14/hdr-video-in-firefox-for-windows-tech-retrospective/">Continue reading <span class="screen-reader-text">HDR video in Firefox for Windows tech retrospective</span> <span class="meta-nav">→</span></a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p class="wp-block-paragraph">HDR video is coming to Firefox for Windows users (and has been available for some time on macOS).  This blog post explains how we developed the feature and gives a retrospective on the technical choices we made.</p>



<p class="wp-block-paragraph">A primer on video playback for the web:</p>



<ul class="wp-block-list">
<li><strong>Video file demux and decode</strong>: A video stream generally consists of parallel image and audio streams, along with captions, HDR scene metadata, and the like. “Container” formats like MP4 or MKV specify how these streams are combined, or multiplexed, into a single byte stream for transmission. On receipt, Firefox needs to divide that byte stream back into the individual media streams; this is de-multiplexing or “demuxing”. Then Firefox must uncompress the data to get images, audio samples, and so on. Firefox’s media team provides the demuxers, and pulls in appropriate codecs to decode them. We prefer using hardware video decoders if they work reasonably well. Video decompression usually produces roughly a YUV 4:2:0 image in <a href="https://learn.microsoft.com/en-us/windows/win32/medfound/recommended-8-bit-yuv-formats-for-video-rendering">NV12 for SDR</a> or <a href="https://learn.microsoft.com/en-us/windows/win32/medfound/10-bit-and-16-bit-yuv-video-formats">P010 for HDR</a>. (If you visit <strong>about:support</strong> in Firefox, and search for <strong>Codec Support Information</strong> (or one of the codec names like <strong>AV1</strong>), you can see a whole feature matrix of support details for which codecs are hardware and software on your system.)</li>



<li><strong>Gecko displaylist building</strong>: Given a demultiplexed, uncompressed frame of video, Gecko displaylist building incorporates it into a video element in the displaylist being sent to WebRender. If the frame was decoded in hardware, it is generally represented by a texture in GPU memory. Or, if it was decoded in software, then it is represented by a memory mapping holding some raw pixel data in system memory shared with Firefox’s media decoder process.</li>



<li><strong>WebRender</strong>: Given the video element in the displaylist, WebRender decides whether to promote it to a desktop compositor overlay, or whether it must instead be rendered using a pathway more like an ordinary HTML element. A compositor overlay is faster and uses less power; on Windows this uses DWM with the <a href="https://learn.microsoft.com/en-us/windows/win32/api/_directcomp/">DirectComposition API</a>, which manages a graph of <a href="https://learn.microsoft.com/en-us/windows/win32/api/dcomp/nn-dcomp-idcompositionvisual">visuals</a>. But if complex CSS is involved (rounded corners, blur filters, or similar features), Firefox must use WebRender’s ordinary rendering pathway. Currently the latter is not HDR capable, so Firefox favors the desktop compositor overlay for animated elements such as video and canvas.</li>
</ul>



<p class="wp-block-paragraph">As we began designing Firefox’s HDR support, we had to lay out some assumptions and found many complications:</p>



<ul class="wp-block-list">
<li>Initially, we had hoped that on a modern system, <a href="https://en.wikipedia.org/wiki/Rec._2100">BT2100</a> HDR videos could be displayed on Windows by simply sending them to DirectComposition.
<ul class="wp-block-list">
<li>In theory, the Desktop Window Manager (DWM) honors the <a href="https://learn.microsoft.com/en-us/windows/win32/api/dxgi1_4/nn-dxgi1_4-idxgiswapchain3">DXGISwapChain3</a>::<a href="https://learn.microsoft.com/en-us/windows/win32/api/dxgi1_4/nf-dxgi1_4-idxgiswapchain3-setcolorspace1">SetColorSpace1</a> method which should let us request either <a href="https://learn.microsoft.com/en-us/windows/win32/api/dxgicommon/ne-dxgicommon-dxgi_color_space_type">DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020</a> or <a href="https://learn.microsoft.com/en-us/windows/win32/api/dxgicommon/ne-dxgicommon-dxgi_color_space_type">DXGI_COLOR_SPACE_YCBCR_STUDIO_GHLG_LEFT_P2020</a>. The former refers to SMPTE 2084, more commonly called PQ, the <a href="https://en.wikipedia.org/wiki/Perceptual_quantizer">Perceptual Quantizer</a> function and the latter is ARIB-STD-B67  also known as HLG, the <a href="https://en.wikipedia.org/wiki/Hybrid_log%E2%80%93gamma">Hybrid Log Gamma</a> function, most commonly used on HDR TV broadcasts.</li>



<li>Unfortunately, this was a dead end. In testing with a mocked up <a href="https://github.com/FirefoxGraphics/compositor_colortest/tree/main">compositor test app</a>, calling SetColorSpace1 with this value seems to be ignored on P010 (at least in testing on AMD), so it incorrectly displays BT2100 PQ video as if it were BT709, which makes the video dull and muddy, since BT709 is a narrower gamut than BT2020, and the BT1886 transfer function used by BT709 is very different from PQ defined by BT2100. SetColorSpace1 may work on other vendors with P010, so it may be a valid optimization, but we were looking for a universal solution.</li>



<li>For the future, Windows 11 23H2 has added a new interface called IDCompositionTexture which may serve our purposes better; from what we have been told, it is universally supported for all formats and color spaces. We haven’t used it for video so far, but it’s an interesting future direction.</li>
</ul>
</li>



<li>As noted above, HDR videos must use a desktop compositor overlay. HDR video uses the BT2100 PQ colorspace with an RGB10A2 format, while WebRender can only work with images in the sRGB colorspace (appropriate for standard-dynamic-range BT709 video).
<ul class="wp-block-list">
<li>Until HDR came along, Gecko and WebRender only used desktop compositor overlays as a power/performance optimization. With HDR, overlays become a necessity as the pixel format and color space differ from classic sRGB.</li>



<li>Fortunately, HDR videos tend to be shown without particularly fancy CSS rendering such as clip masks and rounded corners, which would require WebRender to perform further copies. Technically, DirectComposition does support all of those features, but Firefox doesn’t use that functionality much.</li>



<li>In the future, we expect to upgrade WebRender for HDR rendering, allowing us to deal with complex cases like clip masks or blur filters on video elements.</li>
</ul>
</li>



<li>We considered whether we could use VideoProcessorBlt, or whether we should write our own shader instead.
<ul class="wp-block-list">
<li>In favor of VideoProcessorBlt:
<ul class="wp-block-list">
<li>It uses less power on GPUs that have a video processor unit.</li>



<li>We discovered in testing (using <a href="https://learn.microsoft.com/en-us/windows/win32/api/d3d11_1/nf-d3d11_1-id3d11videoprocessorenumerator1-checkvideoprocessorformatconversion">CheckVideoProcessorFormatConversion</a>) that while many modern GPUs support one of the needed conversions (P010 PQ -&gt; RGB10 PQ), few support the ones we need for HLG videos (P010 HLG -&gt; RGB10 PQ).</li>



<li>The ‘video-dynamic-range’ query used on the web is not fine-grained enough to be able to say “the web browser can display PQ video but not HLG video”, so if we went with VideoProcessorBlt as a required feature, only about 20% of HDR desktop users would be able to use the feature.</li>



<li>In the future, we could explore using VideoProcessorBlit to save power on hardware that supports the conversions we need. But other web browsers are not using this functionality, so there may be more issues we haven’t found yet.</li>
</ul>
</li>



<li>In favor of writing our own shader with all of the features:
<ul class="wp-block-list">
<li>This would work consistently on all vendors – nothing special here.</li>



<li>This would look the same on all vendors, regardless of hardware capabilities. This is generally the aim of web standards.</li>



<li>This would support anything we want it to. HDR tonemapping can be implemented. Video orientation can be implemented (for videos recorded on phones which may be rotated 90, 180 or 270 degrees). We can support any kind of YUV-&gt;RGB conversion with a color matrix (even weird legacy formats like GBR 4:2:0).  We can support conversion between color primaries (e.g. BT2020-&gt;BT709).  We can convert to linear color (for scRGB using RGBA16F) or any EOTF we want (notably BT2100 PQ with RGB10A2, for our use-case).</li>
</ul>
</li>



<li>In the end we went with the shader after a significant period of time experimenting with VideoProcessorBlt in our Nightly releases.</li>
</ul>
</li>



<li>There is a very large amount of graphics code in Gecko and WebRender that needs to be upgraded for HDR.
<ul class="wp-block-list">
<li>We decided that the most important code paths to upgrade first are the ones for regular video playback and DRM-protected video playback, and later canvas video import (Canvas2D, WebGL, WebGPU) which will require upgrading canvas for HDR first – another big project.</li>



<li>We had to upgrade several dozen structs to carry the transfer function for video data, as previously all code assumed video used BT1886 EOTF.</li>
</ul>
</li>



<li>We hope we can avoid tone mapping HDR content when viewed on HDR displays.
<ul class="wp-block-list">
<li>It’s reasonable to expect that most displays going forward will be HDR displays (partly because of marketing momentum, partly because displays are made by a very finite set of manufacturers who are all making HDR display panels), and eventually tone mapping may become unnecessary on the web.</li>



<li>For the short-term we will have to apply a tone mapping effect when HDR content is viewed on SDR displays, likely using  ‘Reinhard tonemapping’ which refers to the widely available paper <a href="https://doi.org/10.1145/566654.566575">Photographic Tone Reproduction for Digital Images</a> by Erik Reinhard et al, and configuring it for a fixed brightness ratio of 400 cd/m^2 -&gt; 100 cd/m^2 when used on SDR displays, and see if that fits all HDR content on the web well enough for a good user experience – and if it does not, we will iterate based on feedback from users on Firefox Nightly.</li>



<li>We are hoping that we will never have to apply tonemapping for HDR content on HDR displays, there are multiple factors in this decision:
<ul class="wp-block-list">
<li>Varying the brightness limit would make it a significant fingerprinting vector if not handled very carefully if the script can inspect pixels or parameters related to that.  There are ways to mitigate this but they are all awkward restrictions to impose, and queries would have to get a different answer than what the rendering is using.</li>



<li>Phones and laptops with light sensors may vary the reference brightness in real time, and this changes the maximum displayable ratio (aka HDR headroom) every refresh, which is also a major battery drain if we keep redrawing all of the time.</li>



<li>Documents composed of multiple images (a gallery or some form of art composition) would apply different tonemapping to each image if the brightest pixel in each image is different brightness.  We’d have to do something about that to make it controllable via CSS.</li>



<li>In general the detailed parts of an image are within a certain brightness band – see <a href="https://www.yedlin.net/DebunkingHDR/">Debunking HDR</a> for a detailed lecture on film grading and why you would not have significant difference in brightness between scene elements.</li>



<li>User feedback so far has indicated that not applying tonemapping has given them a better viewing experience on some videos.</li>
</ul>
</li>
</ul>
</li>



<li>WebRTC is implemented using a library, common to all web browsers, which has limited support for HDR.
<ul class="wp-block-list">
<li>While we didn’t prioritize this for an initial feature launch, we are looking at how to implement HDR support properly in libwebrtc. This is in the early assessment phase but we know this is wanted for a couple of use-cases, like video calls for meetings, or game streaming with friends watching.</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">In general, one of the biggest challenges in working on graphics code in a web browser is a lack of documentation for how to best use features like video playback and desktop compositing in the context of a web browser (e.g. multiple processes, sandboxing, shared memory, sharing external textures, etc). This parallels the rarity of graphics engineers with such experience. Building new features in this space requires a lot of research (and a lot of trial and error). The solution you end up with may not look at all like the one you initially imagined.</p>



<p class="wp-block-paragraph">On behalf of the graphics team at Mozilla, I want to thank the people who use Firefox Nightly regularly and file bug reports when things aren’t working the way they want. Comments on <a href="https://mozillagfx.wordpress.com/2026/01/16/experimental-high-dynamic-range-video-playback-on-windows-in-firefox-nightly-148/">Experimental High Dynamic Range video playback on Windows in Firefox Nightly 148</a>, <a href="https://connect.mozilla.org/">Mozilla Connect</a>, and <a href="https://bugzilla.mozilla.org/">Bugzilla</a> bug reports have guided us to focus on the use-cases that matter to people using Firefox. When we succeed, it’s a great feeling.</p>



<p class="wp-block-paragraph">We’re working on extending HDR support to photos, apps/games and general web content.</p></div>
    </content>
    <updated>2026-07-14T04:15:19Z</updated>
    <published>2026-07-14T04:15:19Z</published>
    <category term="Uncategorized"/>
    <category term="firefox"/>
    <category term="graphics"/>
    <category term="hdr"/>
    <category term="high-dynamic-range"/>
    <category term="technology"/>
    <category term="video"/>
    <author>
      <name>Ashley Hale</name>
    </author>
    <source>
      <id>https://mozillagfx.wordpress.com</id>
      <logo>https://s2.wp.com/i/webclip.png</logo>
      <link href="https://mozillagfx.wordpress.com/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://mozillagfx.wordpress.com" rel="alternate" type="text/html"/>
      <link href="https://mozillagfx.wordpress.com/osd.xml" rel="search" title="Mozilla Gfx Team Blog" type="application/opensearchdescription+xml"/>
      <link href="https://mozillagfx.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <title>Mozilla Gfx Team Blog</title>
      <updated>2026-07-14T18:58:54Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/07/13/crates-io-development-update/</id>
    <link href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/" rel="alternate" title="crates.io: development update" type="text/html"/>
    <title xml:lang="en">crates.io: development update</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>Another six months have passed since our <a href="https://blog.rust-lang.org/2026/01/21/crates-io-development-update/" rel="external">last development update</a>, and the crates.io team has been busy. Here's a summary of the most notable changes and improvements made to <a href="https://crates.io/" rel="external">crates.io</a> since then.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#source-code-viewer"/>
Source Code Viewer</h3>
<p>Crate pages now have a "Code" tab that lets you browse the contents of published crate versions directly on crates.io. This shows you the exact files that <code>cargo</code> downloads when you add a crate as a dependency, which might differ from the linked repository. This makes it much easier to audit your dependencies, including files that never appear in the repository, like the normalized <code>Cargo.toml</code> files that <code>cargo</code> generates.</p>
<p><img alt="Source code viewer showing the &quot;Code&quot; tab of the serde crate" src="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/code-tab.png"/></p>
<p>The viewer comes with a file tree sidebar with search functionality, syntax highlighting, and GitHub-style line selection, where clicking or dragging line numbers produces shareable <code>#L10-L20</code> URLs.</p>
<p>Under the hood, the server now builds a zip file for every published version. Since the <code>.crate</code> files that <code>cargo</code> consumes are gzipped tarballs without random access support, a background job re-packs each of them into a seekable zip archive plus a JSON manifest describing the contained files. Both are served from our static CDN. The frontend then fetches only the manifest and loads each file on demand with an HTTP range request. Because of this architecture, browsing crate sources essentially adds no load on the crates.io API servers. Existing crate versions have been backfilled, so this works for old releases too.</p>
<p>The rendering library behind the code viewer is a diff renderer at heart, and that's no accident: a version-to-version diff viewer built on the same infrastructure is currently in the works. This will allow you to review exactly what changed between two published versions, right on crates.io. Stay tuned!</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#untangling-crates-io-accounts-from-github"/>
Untangling crates.io Accounts from GitHub</h3>
<p>At the end of May, the crates.io team accepted <a href="https://github.com/rust-lang/rfcs/pull/3946" rel="external">RFC #3946</a>. Crates.io accounts always have been tightly coupled to GitHub: signing in means "Log in with GitHub", and your crates.io identity is your GitHub username. The RFC changes that. It introduces usernames that are native to crates.io and independent of linked GitHub accounts, as a prerequisite for eventually supporting login via other identity providers.</p>
<p>The implementation of crates.io usernames has started, but there is still a lot left to do, most visibly the ability to change your crates.io username. After that is complete, there will be future RFCs and implementation for signing in with identity providers other than GitHub. Since all of this touches authentication and account security, we are deliberately taking it slow and rolling these changes out in small, carefully reviewed steps.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#advisories-and-suggestions"/>
Advisories and Suggestions</h3>
<p>In our <a href="https://blog.rust-lang.org/2026/01/21/crates-io-development-update/" rel="external">January update</a> we introduced the "Security" tab, which shows security advisories from the <a href="https://rustsec.org/" rel="external">RustSec</a> database. We have since taken this integration one step further: crates that RustSec has flagged as unmaintained now show a warning banner directly on their crate pages, linking to the corresponding advisory for details and possible alternatives. Thanks to <a href="https://github.com/djc" rel="external">Dirkjan Ochtman</a> for implementing this feature!</p>
<p><img alt="Unmaintained warning banner on the ansi_term crate page" src="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/unmaintained-banner.png"/></p>
<p>Related to this, some popular crates have been largely absorbed into the Rust standard library over the years, like <code>lazy_static</code>, which has been superseded by <code>std::sync::LazyLock</code> since Rust 1.80. Crate pages of such crates now show a friendly "You might not need this dependency" banner describing the standard library replacement, and superseded crates in dependency lists get a small light bulb icon with a similar hint.</p>
<p><img alt="&quot;You might not need this dependency&quot; banner on the lazy_static crate page" src="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/std-replacement-banner.png"/></p>
<p>The dataset behind this feature lives in the new <a href="https://github.com/rust-lang/std-replacement-data" rel="external">rust-lang/std-replacement-data</a> repository, together with a documented inclusion policy: standard library replacements only, every entry must cite the stable <code>std</code>, <code>core</code>, or <code>alloc</code> API and Rust version, and crate maintainers get a notice-and-comment window before an entry is added. New entries can be proposed upstream and can benefit other tools too.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#ferris"/>
Ferris</h3>
<p>The most delightful change of this cycle: the Ferris on our error pages now follows your mouse cursor with its eyes:</p>
<p><img alt="Ferris' eyes following the mouse cursor on the error page" src="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/ferris.gif"/></p>
<p>Getting a 404 error on crates.io is now slightly less sad.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#svelte-frontend-migration-completed"/>
Svelte Frontend Migration Completed</h3>
<p>In our <a href="https://blog.rust-lang.org/2026/01/21/crates-io-development-update/" rel="external">January update</a>, we announced that we were experimenting with porting the crates.io frontend from Ember.js to <a href="https://svelte.dev/" rel="external">Svelte</a>. This experiment has concluded successfully: the new frontend reached feature parity, went through a <a href="https://blog.rust-lang.org/inside-rust/2026/04/17/crates-io-svelte-public-testing/" rel="external">public testing phase</a> in April, became the default at the beginning of May, and the Ember.js app has been removed from our repository.</p>
<p>We designed this change to be invisible for our users, since the new frontend is a 1:1 port of the previous design and functionality. For the team and our contributors, however, it is a big deal: the frontend is now built on a more modern framework, which should make it easier for new contributors to get started. It also allows us to iterate faster, as the source code viewer above demonstrates.</p>
<p>We want to thank the <a href="https://emberjs.com/teams/" rel="external">Ember.js team</a> for a framework that served crates.io well for many years, and the Svelte team for making the transition so enjoyable.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#miscellaneous"/>
Miscellaneous</h3>
<p>These were some of the more visible changes to crates.io over the past six months, but a lot has happened "under the hood" as well:</p>
<ul>
<li>
<p><strong>Search performance</strong>: Relevance-sorted search queries previously ranked every crate matching the query, which could take 1-2 seconds for short or common search terms. Ranking is now bounded to the 1,000 matching crates with the highest recent download counts.</p>
</li>
<li>
<p><strong>Reverse dependencies performance</strong>: The reverse dependencies endpoint no longer recomputes the full dependent set on every request. It is now served from a precomputed table kept in sync by database triggers, turning an expensive join into a bounded index scan and greatly reducing the chance of getting a timeout error.</p>
</li>
<li>
<p><strong>New ARCHITECTURE.md</strong>: If you've ever wondered how crates.io actually works, our <a href="https://github.com/rust-lang/crates.io/blob/main/docs/ARCHITECTURE.md" rel="external"><code>ARCHITECTURE.md</code></a> document got a complete rewrite. It is now organized around the high-level systems that make up crates.io and how they fit together, and includes walkthroughs of what happens when you run <code>cargo publish</code>, why a typical crate download never touches our API servers, and how download counts are derived from CDN access logs.</p>
</li>
<li>
<p><strong>Definition lists</strong>: READMEs now render Markdown <a href="https://github.com/rust-lang/crates.io/pull/13950" rel="external">definition lists</a>, a widely used Markdown extension. Our markdown renderer <a href="https://crates.io/crates/comrak" rel="external">comrak</a> already supported them, the extension just wasn't enabled yet. Thanks to <a href="https://github.com/mistaste" rel="external">@mistaste</a> for this contribution!</p>
</li>
<li>
<p><strong>CDN cache tags</strong>: Files uploaded to our static CDN now carry cache-tag metadata, allowing us to invalidate all cached files of a crate or a specific release in a single operation, instead of issuing one invalidation per file URL.</p>
</li>
<li>
<p><strong>Caching improvements</strong>: We removed a global <code>Vary: Cookie</code> response header that was preventing our CDNs from caching public API responses and frontend assets effectively. Per-user responses now use <code>Cache-Control: no-store</code> instead, resulting in better cache hit rates at the CDN edge.</p>
</li>
<li>
<p><strong>Accessibility</strong>: We have made crates.io friendlier to screen readers: decorative icons are now hidden from the accessibility tree, heading hierarchies have been fixed, and lists are marked up as proper lists. ARIA snapshot tests now ensure that regressions can't slip in unnoticed. We plan to continue to improve crates.io accessibility over the coming months.</p>
</li>
<li>
<p><strong>Git index performance</strong>: The background worker's local clone of the git index is now a bare and shallow repository, eliminating roughly 250,000 checked-out files and the full commit history from its disk, improving its performance as we see increased rates of crate publication. The periodic index squashing now goes through the GitHub API instead of generating large git packs locally, which had previously caused out-of-memory failures on the production worker.</p>
</li>
</ul>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#feedback"/>
Feedback</h3>
<p>We hope you enjoyed this update on the development of crates.io. If you have any feedback or questions, please let us know on <a href="https://rust-lang.zulipchat.com/#narrow/stream/318791-t-crates-io" rel="external">Zulip</a> or <a href="https://github.com/rust-lang/crates.io/discussions" rel="external">GitHub</a>. We are always happy to hear from you and are looking forward to your feedback!</p></div>
    </content>
    <updated>2026-07-13T00:00:00Z</updated>
    <published>2026-07-13T00:00:00Z</published>
    <author>
      <name>Tobias Bieniek</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-07-15T14:56:21Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://attackanddefense.dev/2026/07/12/firefox-security-privacy-newsletter-2026-q2</id>
    <link href="https://attackanddefense.dev/2026/07/12/firefox-security-privacy-newsletter-2026-q2.html" rel="alternate" title="Firefox Security &amp;amp; Privacy Newsletter 2026 Q2" type="text/html"/>
    <title>Firefox Security &amp; Privacy Newsletter 2026 Q2</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Welcome to the Q2 2026 edition of the Firefox Security &amp; Privacy Newsletter.</p>

<p>Security and privacy are core principles of <a href="https://www.mozilla.org/en-US/about/manifesto/">Mozilla’s Manifesto</a> and remain at the heart of Firefox’s development. In this edition, we highlight some of the key security and privacy initiatives from Q2 2026, grouped into the following areas:</p>

<ul>
  <li><strong>Firefox Product Security &amp; Privacy</strong>, new security and privacy features, protections, and integrations in Firefox</li>
  <li><strong>Core Security</strong>, platform security improvements, hardening efforts, and foundational enhancements</li>
  <li><strong>Community Engagement</strong>, highlights from our security research community and bug bounty program</li>
  <li><strong>Web Security &amp; Standards</strong>, progress on web technologies and standards that help websites better protect users from online threats</li>
</ul>

<h3>Preface</h3>

<p>Note: Some of the bugs linked below might not be accessible to the general public and restricted to specific work groups. <a href="https://firefox-source-docs.mozilla.org/bug-mgmt/processes/fixing-security-bugs.html#keeping-private-information-private">We de-restrict fixed security bugs after a grace-period</a>, until the majority of our user population have received Firefox updates. If a link does not work for you, please accept this as a precaution for the safety of all Firefox users.</p>

<h3>Firefox Product Security &amp; Privacy</h3>

<p><strong>Private Access Control Tokens (PACT):</strong> PACT is a cross-industry initiative designed to tackle one of the web’s most urgent challenges: enabling websites to reliably distinguish legitimate users and authorized automated agents from abusive traffic without compromising user privacy. To introduce the initiative, we published a <a href="https://hacks.mozilla.org/2026/06/pact-anonymous-credentials-for-the-web/">technical deep dive on Mozilla Hacks</a> alongside a <a href="https://blog.mozilla.org/en/privacy-security/keeping-the-web-open-and-private-in-the-bot-era/">companion Mozilla blog post</a> that explains the vision, motivation, and privacy-preserving design behind PACT.</p>

<p><strong>Qualified Website Authentication Certificates (QWACs):</strong> Firefox is prepared to meet upcoming eIDAS requirements under the <a href="https://eidas.ec.europa.eu/efda/home">EU Digital Identity Framework.</a> <a href="https://eidas.ec.europa.eu/efda/discover/qwac">Qualified Website Authentication Certificates (QWACs), as required by the framework, are supported</a> in Firefox 153 (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2043399">Bug 2043399</a>) onwards.</p>

<p><strong>Hardening Firefox with Claude Mythos:</strong> In a <a href="https://hacks.mozilla.org/2026/05/behind-the-scenes-hardening-firefox/">blogpost</a> we shared how our AI-assisted security testing pipeline, powered by Claude Mythos, uncovered and helped remediate hundreds of previously hidden vulnerabilities in Firefox, significantly strengthening the browser’s security while demonstrating the transformative potential of AI to enhance defensive cybersecurity.</p>

<p><strong>Visual Indications for Geolocation Access:</strong> In light of some web pages using geolocation for activities that are not related to their maps functionality, Firefox now displays <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2038194">a real-time visual indicator</a> whenever a web page is accessing the user’s geolocation. Starting with Firefox 153, the address bar now provides a <a href="https://bug2038194.bmoattachments.org/attachment.cgi?id=9586032">real-time visual indicator</a> the moment a website begins accessing a user’s location, providing users with  immediate awareness and greater transparency into when and how their geolocation data is being used.</p>

<p><strong>Improving Website Compatibility in Private Browsing:</strong> Starting with Firefox 152, Private Browsing Mode now offers users the option to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1994405">temporarily lower tracking protections</a> for the current tab when stricter tracker blocking could be causing a website to malfunction.  Previously, this may have resulted in users turning off privacy protections completely to continue using visited web page. With our new feature, users can quickly restore site functionality of the current tab, preserving users’ overall privacy settings.</p>

<p><strong>Instant fresh start through new <a href="https://support.mozilla.org/en-US/kb/private-browsing-use-firefox-without-history">Fire Button</a>:</strong> Firefox 151 introduced the new Fire Button for Private Browsing, giving users an instant fresh start with a single click. Instead of closing and reopening a Private Window, users can <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1846495">immediately clear all browsing data and continue browsing in a clean session</a>, making Private Browsing faster, more convenient, and just as private.</p>

<p><strong>Advanced Anti-Fingerprinting Protections:</strong> Firefox 151 expands our default anti-fingerprinting defenses by ensuring the Available Screen Resolution, Touch Points, and Canvas APIs will provide uniform results for all of our users while also maintaining performance and compatibility. On macOS, for example, these enhancements are expected to reduce the share of users identified as unique by more than 20%, making it significantly harder for websites to uniquely identify and track users using obscure fingerprinting.</p>

<p><strong>Local Network Access Protections:</strong> Firefox now requires user permission before websites can access apps and services on a user’s local network or device, helping prevent unauthorized access and sneaky tracking attempts. The <a href="https://support.mozilla.org/en-US/kb/control-personal-device-local-network-permissions-firefox">LNA</a> feature is rolling out gradually, starting with Firefox Desktop 151 through 153. Android support will follow in upcoming releases.</p>

<h3>Core Security</h3>

<p><strong>Firefox CA Root Program:</strong> We published <a href="https://blog.mozilla.org/security/2026/06/29/improving-transparency-and-assurance-in-the-web-pki-mozilla-root-store-policy-v3-1/">Root Store Policy v3.1</a>, introducing stricter transparency, documentation, and audit requirements for public CAs to strengthen trust in the Web PKI.</p>

<p><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2010193"><strong>WebAuthn Related Origin Requests</strong></a><strong>:</strong> This feature allows seamless passkey sign-ins across related domains e.g., the same provider using multiple top-level domains. In contrast to other browsers, Firefox UI provides transparency and choice so users are aware and can control when websites request for passkeys from other, related sites.</p>

<h3>Community Engagement</h3>

<p><strong>Hosting Events:</strong> We organized and hosted multiple <a href="https://www.meetup.com/de-DE/berlin-mozilla-meetup/">web tech meet-ups in the Mozilla Berlin office</a>, bringing together the developer community to explore the latest advances in web technology, privacy, and security. If you’re in the area, we’d love to have you join us at a future event.</p>

<p><strong>Community Shares:</strong>  Firefox tracking protection was presented at the <a href="https://www.reddit.com/r/SnooSec/comments/1te55fx/thanks_for_joining_us_at_snoosec_nyc/">SnooSec conference held in the Reddit NYC office</a>. We also had a presentation about existing and upcoming protections against web tracking at the <a href="https://chemnitzer.linux-tage.de/2026/en">Chemnitz Linux Days</a> conference, and a talk about the latest browser-based XSS protections at <a href="https://owasp.glueup.com/event/owasp-global-appsec-eu-2026-vienna-austria-162243/">OWASP AppSec ‘26</a> in Vienna.</p>

<h3>Web Security &amp; Standards</h3>

<p><strong>Web Application Integrity, Consistency and Transparency (WAICT):</strong> We are working on WAICT, a new proposal to bring stronger integrity and transparency guarantees to web applications, helping make the web a more trustworthy platform for security-sensitive applications such as end-to-end encrypted messaging. We shared our technical vision in a <a href="https://hacks.mozilla.org/2026/05/trustworthy-javascript-for-the-open-web/">Mozilla Hacks blog post</a>, including a prototype implementation in Firefox Nightly that works with our <a href="https://demo.waict.dev/">WAICT Demo</a> and a <a href="https://github.com/waict-wg">draft specification</a>.</p>

<p><strong>Sanitizer API:</strong> We are advancing the Sanitizer API to make robust protection against cross-site scripting (XSS) vulnerabilities more accessible. By exploring an <a href="https://github.com/mozilla/explainers/blob/main/trusted-or-sanitized-html.md">implicit sanitizer policy</a> that integrates with Trusted Types, we aim to prevent an entire class of XSS attacks with no application code changes, making secure-by-default web applications easier to build and deploy.</p>

<h3>Looking Ahead</h3>

<p>Firefox users will receive these security and privacy improvements automatically. If you’re not already a user, <a href="https://firefox.com/">we recommend you give it a try</a>. Firefox helps you shape a more personal internet that puts you back in control - all while supporting the non-profit Mozilla in its mission to keep the web open, safe, and accessible for everyone.</p>

<p>Thank you to everyone who contributes to making Firefox and the web more secure and privacy-focused. You can have an impact too, just by <a href="https://bugzilla.mozilla.org/enter_bug.cgi">reporting bugs</a>, conducting research, contributing code, or providing feedback.</p>

<p>We look forward to sharing more updates in the Q3 2026 edition.</p>

<p><em>— The Firefox Security &amp; Privacy Teams</em></p></div>
    </content>
    <updated>2026-07-12T23:00:00Z</updated>
    <published>2026-07-12T23:00:00Z</published>
    <author>
      <name>Frederik Braun, Christoph Kerschbaumer</name>
    </author>
    <source>
      <id>https://attackanddefense.dev/feed.xml</id>
      <link href="https://attackanddefense.dev/feed.xml" rel="self" type="application/atom+xml"/>
      <link href="https://attackanddefense.dev/" rel="alternate" type="text/html"/>
      <subtitle>A blog from the Firefox Application Security Team</subtitle>
      <title>Attack &amp; Defense</title>
      <updated>2026-07-13T12:44:07Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148883</id>
    <link href="https://discourse.mozilla.org/t/engineering-effectiveness-newsletter-q2-2026-edition/148883" rel="alternate" type="text/html"/>
    <title>Engineering Effectiveness Newsletter (Q2 2026 Edition)</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Welcome to the Q2 edition of the Engineering Effectiveness Newsletter! The Engineering Effectiveness org makes it easy to develop, test and release Mozilla software at scale. See below for some highlights, then read on for more detailed info!</p>
<h3><a class="anchor" href="https://discourse.mozilla.org#p-295620-highlights-image29x31uploadsijwaz2bmu1cm7txaoyutaj3g7djpeg-1" name="p-295620-highlights-image29x31uploadsijwaz2bmu1cm7txaoyutaj3g7djpeg-1"/>Highlights <div class="lightbox-wrapper"><a class="lightbox" href="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/c/6/c64f1102bb6b55e5a9e11c7390019d84dcc69fbf.jpeg" rel="noopener nofollow ugc" title="image"><img alt="image" height="31" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/optimized/3X/c/6/c64f1102bb6b55e5a9e11c7390019d84dcc69fbf_2_29x31.jpeg" width="29"/></a></div></h3>
<ul>
<li>
<p>Improved <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1775197">mach startup overhead</a> by 30-50%, as well as a 75% improvement for <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2018327">mach test on Windows</a> and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2017746">10s faster configure</a> for subsequent runs</p>
</li>
<li>
<p>Moved to weekly scheduled dot releases and <a href="https://docs.google.com/document/d/1oktCbzZ3M7NZTMBxv8yEOYmNHHxaIstZ55vRMI9PmzM/edit?tab=t.0#heading=h.r7335u1pggl8" rel="noopener nofollow ugc">faster rollouts</a>, allowing us to deliver fixes and uplifts to users faster and more reliably</p>
</li>
<li>
<p>Created a <a href="https://tests.firefox.dev/" rel="noopener nofollow ugc">huge number of dashboards</a> to help developers dig into Mochitest and XPCShell tests</p>
</li>
<li>
<p>Stood up <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2037084">MacOS worker pools</a> that can run multiple tasks at once using VMs, greatly improving our Mac capacity issues</p>
</li>
<li>
<p>Can now <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2034982">navigate to about:pdf</a> in Nightly to open and edit arbitrary PDF files, including the ability to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2047633">set Firefox as your default PDF editor</a> on MacOS</p>
</li>
</ul>
<h3><a class="anchor" href="https://discourse.mozilla.org#p-295620-detailed-project-updates-2" name="p-295620-detailed-project-updates-2"/>Detailed Project Updates</h3>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-ai-for-development-image38x38uploaduslsg1wyqmsnwpkkcpts9bzsgdspng-3" name="p-295620-ai-for-development-image38x38uploaduslsg1wyqmsnwpkkcpts9bzsgdspng-3"/>AI for Development <div class="lightbox-wrapper"><a class="lightbox" href="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/d/5/d581d7036fa3d622443350328d622c936216ecf6.png" rel="noopener nofollow ugc" title="image"><img alt="image" height="38" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/d/5/d581d7036fa3d622443350328d622c936216ecf6.png" width="38"/></a></div></h4>
<ul>
<li>
<p>Suhaib Mujahid deployed the initial version of <a href="https://docs.google.com/document/d/1cLIuNnhefePsixu8iRiqAn75EcVvgQHw48pUTkhpwok/edit?tab=t.0" rel="noopener nofollow ugc">Hackbot</a>, a platform for building and running AI agents to automate parts of the Firefox development workflow.</p>
</li>
<li>
<p>Evgeny Pavlov ported the “Build Repair Agent” to Hackbot and deployed it for testing. It now monitors Firefox build failures and triggers the agent. When an analysis and a proposed patch are ready developers can be notified by email.</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-bugzilla-image16x16uploadrcf6wygovavtrjvslvu8pj7vnyhpng-4" name="p-295620-bugzilla-image16x16uploadrcf6wygovavtrjvslvu8pj7vnyhpng-4"/>Bugzilla <img alt="image" height="16" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/b/e/bea92544acb6ddb5aa665316f3c7411bc860c8db.png" width="16"/></h4>
<ul>
<li>
<p>David Lawrence added a new GitHubPullRequests extension that renders a live status panel in the bug modal for any attachment whose content type is text/x-github-pull-request. A new REST endpoint fetches PR metadata (state, author, labels, latest review per reviewer) from the GitHub REST API on demand, and a client-side script populates a table with a “show closed/merged” toggle.[image]</p>
</li>
<li>
<p>Xavier L’Hour improved the user experience for developers, adding shortcuts to buglist.cgi for all, open, or closed bugs (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1764713">1764713</a>)</p>
</li>
<li>
<p>Xavier L’Hour added a new shortcut button to the bug page that allows users to quickly move spam bugs to the Invalid Bugs product (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1684509">1684509</a>).</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-build-system-and-mach-environment-image27x27uploadoumafz5bcpgk6de6ddcb6m1uzptpng-5" name="p-295620-build-system-and-mach-environment-image27x27uploadoumafz5bcpgk6de6ddcb6m1uzptpng-5"/>Build System and Mach Environment <div class="lightbox-wrapper"><a class="lightbox" href="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/a/e/ae9342c7f7dcfe9d427c191b43c7aaf993ceeffb.png" rel="noopener nofollow ugc" title="image"><img alt="image" height="27" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/optimized/3X/a/e/ae9342c7f7dcfe9d427c191b43c7aaf993ceeffb_2_27x27.png" width="27"/></a></div></h4>
<ul>
<li>
<p>Alex Hochheiden has been moving build system logic out of make to pave the way for a new build system backend (coming soon). See <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2038789">Bug 2038789</a>.</p>
</li>
<li>
<p>Alex Hochheiden landed a 30%-50% (platform dependent) speedup for mach startup. See <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1775197">Bug 1775197</a>.</p>
</li>
<li>
<p>Alex Hochheiden sped up subsequent configure runs by ~10s by adding caching to the mach taskgraph toolchain step. See <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2017746">Bug 2017746</a>.</p>
</li>
<li>
<p>Alex Hochheiden reduced mach test startup overhead on Windows by 75%. See <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2018327">Bug 2018327</a>.</p>
</li>
<li>
<p>Alex Hochheiden has achieved significant code deduplication and simplification by consolidating the Android Gradle configuration into convention plugins. There were also various Gradle configure-cache improvements. See <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2007013">Bug 2007013</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1950099">Bug 1950099</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2013417">Bug 2013417</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2017752">Bug 2017752</a>, and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2017753">Bug 2017753</a>.</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-firefox-ci-image25x26uploadga1rfuc1fs6gwtrx3kk92r8hfncjpeg-6" name="p-295620-firefox-ci-image25x26uploadga1rfuc1fs6gwtrx3kk92r8hfncjpeg-6"/>Firefox-CI <div class="lightbox-wrapper"><a class="lightbox" href="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/7/4/74356ec644bf30f10ea5f0ce6067cdd819ea96e4.jpeg" rel="noopener nofollow ugc" title="image"><img alt="image" height="26" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/optimized/3X/7/4/74356ec644bf30f10ea5f0ce6067cdd819ea96e4_2_25x26.jpeg" width="25"/></a></div></h4>
<ul>
<li>
<p>Julien Cristau <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2050408">added support</a> for interactive tasks (aka one click loaners) on Windows and macOS</p>
</li>
<li>
<p>Andrew Halberstadt <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2044330">implemented</a> mach try support with Github, being used in mozilla/enterprise-firefox-try and coming to Firefox soon.</p>
</li>
<li>
<p>Andrew Halberstadt <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033838">implemented the machinery</a> to start making Gecko CI tasks clone from Github.</p>
</li>
<li>
<p>Ryan Curran <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2037084">brought Firefox CI’s Apple Silicon VM infrastructure into production</a>. Building on the MacOS CI image pipeline established last year, he migrated test suites onto virtual machines and grew the macosx1500-aarch64-vms pool so Taskcluster now routes eligible jobs to VMs alongside physical hardware. This reduces reliance on physical Macs, increases CI capacity, and supports the ongoing migration off of older Intel-based macOS infrastructure</p>
</li>
<li>
<p>Jonathan Moss migrated Firefox CI’s cloud-based Windows testing from Windows 11 24H2 to 25H2, moving the bulk of Firefox’s Windows test coverage to Microsoft’s latest platform and keeping CI aligned with the Windows version most commonly used by Firefox Desktop users</p>
</li>
<li>
<p>Florian Quèze <a href="https://tests.firefox.dev/" rel="noopener nofollow ugc">created many dashboards</a> to help dig into Mochitests and XPCShell tests</p>
</li>
<li>
<p>Ryan VanderMeulen landed a set of improvements to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2032657">mach try chooser</a>. The update adds an exclude filter, a clearer preview pane with removable job rows, an artifact-builds toggle, and a warning when a selection exceeds task-prioritization thresholds. It also fixes a bug where choosing Firefox for Android jobs would unintentionally clear selections for other platforms.</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-lint-static-analysis-and-code-coverage-image27x27uploadkn3nhhyhkaolavr6gxkheo6anzipng-7" name="p-295620-lint-static-analysis-and-code-coverage-image27x27uploadkn3nhhyhkaolavr6gxkheo6anzipng-7"/>Lint, Static Analysis and Code Coverage <div class="lightbox-wrapper"><a class="lightbox" href="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/9/1/91b73ae1a5bbfd19ca329cc65f4d62b37af7e5aa.png" rel="noopener nofollow ugc" title="image"><img alt="image" height="27" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/optimized/3X/9/1/91b73ae1a5bbfd19ca329cc65f4d62b37af7e5aa_2_27x27.png" width="27"/></a></div></h4>
<ul>
<li>
<p>Valentin Rigal and Bastien Abadie created a Code Review Bot prototype for publication of review comments using various source linters on Github</p>
</li>
<li>
<p>Morgan Rae Reschenberg added support for accessibility review to Code Review Bot</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-mozregression-image39x39uploadylbryrsvu4qhpj3mc4hc711j7vtpng-8" name="p-295620-mozregression-image39x39uploadylbryrsvu4qhpj3mc4hc711j7vtpng-8"/>Mozregression <div class="lightbox-wrapper"><a class="lightbox" href="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/f/0/f0af28d9caa6771eea75f11a03fc36a70c4f99d3.png" rel="noopener nofollow ugc" title="image"><img alt="image" height="39" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/f/0/f0af28d9caa6771eea75f11a03fc36a70c4f99d3.png" width="39"/></a></div></h4>
<ul>
<li>Zeid fixed a bug in mozregression-gui on macOS, where the camera and microphone capture request was getting rejected (released in 7.3.0). Thanks to bug report + tip from Andreas Pehrson.</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-pdfjs-image29x29upload2uk22g71cqevreav3jhzijhygjypng-9" name="p-295620-pdfjs-image29x29upload2uk22g71cqevreav3jhzijhygjypng-9"/>PDF.js <div class="lightbox-wrapper"><a class="lightbox" href="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/1/4/14623e0fefd12c91cad11a97baf9fca17c37df1c.png" rel="noopener nofollow ugc" title="image"><img alt="image" height="29" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/1/4/14623e0fefd12c91cad11a97baf9fca17c37df1c.png" width="29"/></a></div></h4>
<ul>
<li>
<p>Calixte <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2034982">added about:pdf to use an entrypoint</a> for opening and editing arbitrary PDF files[image]</p>
</li>
<li>
<p>Calixte added support for playing videos/sounds embedded in PDF files</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-phabricator-image24x24upload2ptgi5cxdz7gakmm6kmos0gcoebpng-moz-phab-and-lando-image31x31uploadgmikcks6na3yujyuukfnivfqrmwpng-10" name="p-295620-phabricator-image24x24upload2ptgi5cxdz7gakmm6kmos0gcoebpng-moz-phab-and-lando-image31x31uploadgmikcks6na3yujyuukfnivfqrmwpng-10"/>Phabricator <img alt="image" height="24" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/1/3/13d60ed2ffbfe1aa32c2cc2ccc5121ba3b8c5a87.png" width="24"/>, moz-phab, and Lando <div class="lightbox-wrapper"><a class="lightbox" href="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/7/5/75a4b58f20908eed139910e672355b6e4ac88562.png" rel="noopener nofollow ugc" title="image"><img alt="image" height="31" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/7/5/75a4b58f20908eed139910e672355b6e4ac88562.png" width="31"/></a></div></h4>
<ul>
<li>
<p>Connor Sheehan improved the uplift experience by leveraging Lando to manage the assessment forms, train selection, and automatic application, so conflicts are detected earlier. The number of uplifts via Lando has <a href="https://sql.telemetry.mozilla.org/dashboard/uplift-dashboard?p_date_range=d_last_12_months">out-paced</a> those via Moz-Phab, and sailed through the rise in uplift numbers (likely due to more sec-bugs getting fixed and uplifted).</p>
</li>
<li>
<p>Zeid added support for private GitHub repositories in Lando, allowing security patches to be implemented in a private clone of a repo, and pushed to the public one.</p>
</li>
<li>
<p>Olivier Mehani finalized support for using the new Lando instance for try-pushes. This brings a host of QoL improvements which weren’t backported to the old instance: better UTF-8 support, smarter conflict resolution and improved security and authentication. It is <a href="https://sql.telemetry.mozilla.org/dashboard/new-lando-try-dashboard?p_date_range=d_last_7_days&amp;p_repo_name=try">now processing about 1500 pushes / week</a> (old Lando still processes about 50 / week).</p>
</li>
<li>
<p>Magnolia Liu implemented automatic pushes to Try for uplift requests, for faster feedback in case of issues.</p>
</li>
<li>
<p>Olivier Mehani added a view of a user’s current and recent jobs on <a href="https://lando.moz.tools" rel="noopener nofollow ugc">the landing page of Lando</a> when authenticated.</p>
</li>
<li>
<p>Zeid identified and fixed the causes of some stability and reliability issues in Lando, which were causing increased downtime during deployments and on an ongoing basis.</p>
</li>
<li>
<p>Olivier Mehani deployed a PoC of reviewer selection on the GitHub pilot, allowing Herald-like mechanisms to GitHub PRs.</p>
</li>
<li>
<p>Olivier Mehani and Connor Sheehan (with Corey Bryant and Daniel Darnell) migrated the COMM project to GitHub <a href="http://github.com/thunderbird/thunderbird-desktop" rel="noopener nofollow ugc">https://github.com/thunderbird/thunderbird-desktop</a>, sharing Firefox’s syncing model.</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-release-management-and-engineering-image29x29uploadgyvgvdmglodpm14lqcrvtdappfzpng-11" name="p-295620-release-management-and-engineering-image29x29uploadgyvgvdmglodpm14lqcrvtdappfzpng-11"/>Release Management and Engineering <div class="lightbox-wrapper"><a class="lightbox" href="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/7/6/76f9deb903b684961e54fa3afbdabcc30db09731.png" rel="noopener nofollow ugc" title="image"><img alt="image" height="29" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/optimized/3X/7/6/76f9deb903b684961e54fa3afbdabcc30db09731_2_29x29.png" width="29"/></a></div></h4>
<ul>
<li>
<p>Donal Meehan drove the Release Management team’s move to a weekly scheduled dot release cadence for Desktop and Android, starting with Firefox 151. This allows us to deliver fixes and approved uplifts to users faster and more predictably. This change is expected to reduce unplanned releases, improve release flexibility, and create a more consistent release rhythm across teams.</p>
</li>
<li>
<p>Dianna Smith drove the update to the Release Management team’s <a href="https://docs.google.com/document/d/1oktCbzZ3M7NZTMBxv8yEOYmNHHxaIstZ55vRMI9PmzM/edit?tab=t.0#heading=h.r7335u1pggl8" rel="noopener nofollow ugc">Desktop major release rollout process</a>, starting with Firefox 152. Instead of throttling to 0% on day 2, it will remain at 25% rollout for two days before moving to 100%, unless any issues arise. This should help us collect uptake and stability signals earlier while still allowing time to catch problems before full rollout.</p>
</li>
<li>
<p>Pascal Chevrel completed the update to the dictionaries shipped with Firefox Desktop. The update added eleven new dictionaries, covering Croatian, English (UK), Georgian, Persian, Slovenian, Tajik, Tamil, Tibetan, Turkish, Welsh, and Xhosa, and refreshed nine others. This expanded the number of locales with a built-in spellchecker from 30 to 41 beginning in Firefox 152. Special thanks to Francesco Lodolo, Bryan Olsson, and the localization community for reviewing the patches and helping assess the quality of the dictionaries.</p>
</li>
<li>
<p>Pascal Chevrel delivered a range of improvements to <a href="https://whattrainisitnow.com/" rel="noopener nofollow ugc">WhatTrainIsItNow</a>, including expanded it to cover weekly dot releases and ESR planned dot releases, added new uplift views including a <a href="https://whattrainisitnow.com/release/uplifts/" rel="noopener nofollow ugc">dot-release uplifts page</a> and a <a href="https://whattrainisitnow.com/beta/uplifts/graph/" rel="noopener nofollow ugc">beta uplift graph</a>, and published <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2045812">new APIs</a> that surface train-selection and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2044143">uplift guidance inside Lando</a>. He also made performance improvements and a steady stream of fixes across the site.</p>
</li>
<li>
<p>At Pwn2Own 2026, Firefox came through with no successful exploits, thanks to preparation across many teams and individuals. Within Release Management, Ryan VanderMeulen drove pre-event patch readiness and Dianna Smith coordinated the releases during the event, including the 150.0.3 dot release, which mitigated the root cause behind several of the contest entries.</p>
</li>
<li>
<p>Dianna Smith built out release-health monitoring and alerting in Bigeye, giving Release Management a growing set of automated alerts that surface data anomalies earlier to aid in release health and regression detection. To make the capability easy to extend, she also <a href="https://docs.google.com/document/d/11WAYaMt2RQOAZLjYti3VZY6Bcws1fjF5q8hBlYUKgHo/edit?tab=t.0" rel="noopener nofollow ugc">created a guide for other teams</a> to add monitoring and alerts for the areas they know best. Teams that want an earlier signal on their own metrics are encouraged to use the guide and help grow the coverage.</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-release-operations-12" name="p-295620-release-operations-12"/>Release Operations <img alt=":wrench:" class="emoji" height="20" src="https://emoji.discourse-cdn.com/twitter/wrench.png?v=15" title=":wrench:" width="20"/></h4>
<ul>
<li>
<p>Ryan Curran built <a href="https://github.com/mozilla-platform-ops/hangar" rel="noopener nofollow ugc">Hangar</a>, a live dashboard for monitoring Firefox CI’s worker pools. It consolidates fleet data from several systems into one view, giving Release Operations a single place to check fleet health and catch problems such as missing or quarantined workers early.</p>
</li>
<li>
<p>Ryan Curran created the <a href="https://github.com/mozilla-platform-ops/BuildWatch" rel="noopener nofollow ugc">iOS version of BuildWatch</a>, and Andrew Erickson ported it to <a href="https://github.com/mozilla-platform-ops/BuildWatch-Android" rel="noopener nofollow ugc">Android</a>. BuildWatch lets you monitor Firefox CI try pushes from your phone, including live per-platform build status, failure summaries, and one-tap retriggers. It uses only public APIs, so no VPN is required.</p>
</li>
<li>
<p>Andrew Erickson and Mark Cornmesser developed <a href="https://github.com/mozilla-platform-ops/fleetbench" rel="noopener nofollow ugc">Fleetbench</a>, a tool for benchmarking Firefox CI workers. It currently measures CPU and ADB/USB I/O performance, helping Release Operations identify slow or outlier hosts before they skew performance test results such as Speedometer and trigger noisy or false regressions.</p>
</li>
<li>
<p>Andrew Erickson built <a href="https://pool-classifier.relops.mozilla.com" rel="noopener nofollow ugc">Pool Classifier</a>, a web app for viewing per-worker success rates across Taskcluster worker pools. It classifies newly completed tasks every 15 minutes, giving Release Operations a continuously updated view of worker health and helping surface problematic workers proactively.</p>
</li>
<li>
<p>Andrew Erickson created <a href="https://github.com/mozilla-platform-ops/fleetroll_mvp" rel="noopener nofollow ugc">Fleetroll</a>, a command-line tool Release Operations uses to manage and monitor long-running Linux, macOS, and Windows hardware hosts in Firefox CI Taskcluster. It deploys Puppet branch overrides and Vault secrets, audits what is actually applied, and surfaces each host’s Puppet and Taskcluster state in a live dashboard.</p>
</li>
<li>
<p>Mark Cornmesser built out a set of new worker-metrics dashboards in Yardstick, giving Release Operations clearer real-time visibility into the health of the Firefox CI hardware fleet. These include <a href="https://yardstick.mozilla.org/d/linux-all-status-v1/linux-all-status?orgId=1&amp;from=now-6h&amp;to=now&amp;timezone=browser&amp;var-pool=$__all&amp;var-hostname=$__all">Linux worker</a> status, <a href="https://yardstick.mozilla.org/d/windows-all-metrics-v1/windows-all-metrics?orgId=1&amp;from=now-6h&amp;to=now&amp;timezone=browser&amp;var-pool=$__all&amp;var-hostname=$__all">Windows worker CPU and disk</a> metrics, and a <a href="https://yardstick.mozilla.org/d/windows-pickup-wait-timeline-v1/066c1e0?orgId=1&amp;from=now-24h&amp;to=now&amp;timezone=browser&amp;var-pool=$__all">Windows job pickup and wait</a> timeline, with alerting on key thresholds. The full set lives in the <a href="https://yardstick.mozilla.org/dashboards/f/cffmfl1sfr1moe/fxci-hardware-workers">FXCI Hardware Workers folder</a> in Yardstick.</p>
</li>
<li>
<p>Jonathan Moss expanded cloud cost reporting in Looker, adding <a href="https://mozilla.cloud.looker.com/dashboards/2861?Submission%20Date=30%20day&amp;Cloud%20Provider=" rel="noopener nofollow ugc">Azure support</a> alongside the existing GCP data and a cloud-provider filter on the FXCI task overview dashboard. The team can now break down Firefox CI compute costs by cloud provider, making it easier to track and compare spend across Azure and GCP.</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-taskcluster-image20x25uploado7keh2uqbjtt24xnmh0gz4v0lympng-13" name="p-295620-taskcluster-image20x25uploado7keh2uqbjtt24xnmh0gz4v0lympng-13"/>Taskcluster <img alt="image" height="25" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/a/9/a9086272fd26499516b5a852c89ed3f55df11142.png" width="20"/></h4>
<ul>
<li>
<p>Yaraslau Kurmyza added Azure fast deprovision <a href="https://github.com/taskcluster/taskcluster/pull/8790" rel="noopener nofollow ugc">taskcluster#8790</a>  and concurrency <a href="https://github.com/taskcluster/taskcluster/issues/8815" rel="noopener nofollow ugc">taskcluster#8815</a> to improve worker scanner performance. This shows ~2x-4x scan time improvements already.</p>
</li>
<li>
<p>Contributor <a href="https://github.com/nitishagar" rel="noopener nofollow ugc">nitishagar</a>  and Yaraslau Kurmyza added patches <a href="https://github.com/taskcluster/taskcluster/pull/8514" rel="noopener nofollow ugc">taskcluster#8514</a>,  <a href="https://github.com/taskcluster/taskcluster/pull/8784" rel="noopener nofollow ugc">taskcluster#8784</a>  to support compression in Taskcluster services API and Yarik worked with Fastly to resolve broken brotli support on the WAF edge side. Now services transmit significantly less data.</p>
</li>
<li>
<p>Yarik added a dedicated service account to log with read only permissions <a href="https://github.com/mozilla/webservices-infra/pull/11197" rel="noopener nofollow ugc">webservices-infra#11197</a>. This allows <a href="https://github.com/taskcluster/tc-logview/pull/4" rel="noopener nofollow ugc">tc-logview</a> to be used safely by untrusted agents inside containers with narrow short-lived access tokens.</p>
</li>
<li>
<p>Yarik published <a href="http://35.202.240.190/" rel="noopener nofollow ugc">queue forecasting dashboard</a> experiments that continuously collects task events and trains models to enable and improve predictions on a task level (how long will it run, and when will it start). With future plans including extending it to the whole task group (mach try)</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-treeherder-image32x32upload9mg2vslsdl1se97nhycpirqkvuvpng-14" name="p-295620-treeherder-image32x32upload9mg2vslsdl1se97nhycpirqkvuvpng-14"/>Treeherder <img alt="image" height="32" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/4/4/449439d59f33f7cc62df6501dd75c5f88d6f5fe5.png" width="32"/></h4>
<ul>
<li>
<p>Florian Quèze added <a href="https://github.com/mozilla/treeherder/pull/9540" rel="noopener nofollow ugc">treeherder#9540</a> “Show task group profile” item to the push action menu</p>
</li>
<li>
<p>Cameron Dawson, juungo and moijes12 implemented various Treeherder API performance improvements</p>
</li>
<li>
<p>Heitor Neiva added Git branch labels to pushes in Treeherder</p>
</li>
<li>
<p>Andrew Halberstadt <a href="https://github.com/mozilla/treeherder/pull/9496" rel="noopener nofollow ugc">implemented</a> the ability for Treeherder to display multiple Git branches at once, enabling support for “try like” repositories in Github</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-version-control-image35x35uploadfgrydspdrdwuflvmedhcxxzrhwtpng-15" name="p-295620-version-control-image35x35uploadfgrydspdrdwuflvmedhcxxzrhwtpng-15"/>Version Control <div class="lightbox-wrapper"><a class="lightbox" href="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/6/d/6ded138b62af5c8222b8f5fab637590ba2920993.png" rel="noopener nofollow ugc" title="image"><img alt="image" height="35" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/6/d/6ded138b62af5c8222b8f5fab637590ba2920993.png" width="35"/></a></div></h4>
<ul>
<li>
<p>Upgrade <a href="http://hg.mozilla.org">hg.mozilla.org</a> to Mercurial 7.2.2</p>
</li>
<li>
<p>Created the <a href="https://hg-edge.mozilla.org/releases/mozilla-esr153">mozilla-esr153</a> and <a href="https://hg-edge.mozilla.org/releases/comm-esr153">comm-esr153</a> repositories.</p>
</li>
</ul>
<h4><a class="anchor" href="https://discourse.mozilla.org#p-295620-other-image30x30upload1b45rv2lz4qu5bjwdcrkbeihtshpng-16" name="p-295620-other-image30x30upload1b45rv2lz4qu5bjwdcrkbeihtshpng-16"/>Other <div class="lightbox-wrapper"><a class="lightbox" href="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/0/8/08426801fd78ca4953d83a1589119ec724b9c801.png" rel="noopener nofollow ugc" title="image"><img alt="image" height="30" src="https://us1.discourse-cdn.com/flex001/uploads/mozilla/original/3X/0/8/08426801fd78ca4953d83a1589119ec724b9c801.png" width="30"/></a></div></h4>
<ul>
<li>Sylvestre converted our documentation from reStructuredText to MyST flavored Markdown</li>
</ul>
<p>Thanks for reading and see you next quarter!</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/engineering-effectiveness-newsletter-q2-2026-edition/148883">Read full topic</a></p></div>
    </summary>
    <updated>2026-07-09T16:26:27Z</updated>
    <published>2026-07-09T16:26:27Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>ahal</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/engineering-effectiveness-newsletter-q2-2026-edition/148883.rss" title="Engineering Effectiveness Newsletter (Q2 2026 Edition)"/>
      <updated>2026-07-15T16:59:02Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148882</id>
    <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-july-9-2026/148882" rel="alternate" type="text/html"/>
    <title>Firefox Profiler Deployment (July 9, 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>[Florian Quèze] Add “/” and “f” keyboard shortcuts to focus the panel filter box (<a href="https://github.com/firefox-devtools/profiler/pull/6025" rel="noopener nofollow ugc">#6025</a>)</li>
<li>[Markus Stange] Change profile.shared.stackTable.prefix to prefixOffset (delta from current index) (<a href="https://github.com/firefox-devtools/profiler/pull/6089" rel="noopener nofollow ugc">#6089</a>)</li>
<li>[Markus Stange] Implement column sorting in the marker table (<a href="https://github.com/firefox-devtools/profiler/pull/6083" rel="noopener nofollow ugc">#6083</a>)</li>
<li>[cathaysia] feat: invert call stack in flame graph to render as icicle graph (<a href="https://github.com/firefox-devtools/profiler/pull/6090" rel="noopener nofollow ugc">#6090</a>)</li>
</ul>
<p><strong>Other Changes:</strong></p>
<ul>
<li>[Sky Ning] Add workflow to insert PR preview links (<a href="https://github.com/firefox-devtools/profiler/pull/6133" rel="noopener nofollow ugc">#6133</a>)</li>
<li>[Markus Stange] Make it easier to create upside-down flame graphs (<a href="https://github.com/firefox-devtools/profiler/pull/6128" rel="noopener nofollow ugc">#6128</a>)</li>
<li>[Markus Stange] Use appropriate highlighter dialects for ts + jsx (<a href="https://github.com/firefox-devtools/profiler/pull/6141" rel="noopener nofollow ugc">#6141</a>)</li>
<li>[cathaysia] style: add .editorconfig (<a href="https://github.com/firefox-devtools/profiler/pull/6142" rel="noopener nofollow ugc">#6142</a>)</li>
<li>[Nazım Can Altınova] Prevent long source URLs from overflowing the code error overlay (<a href="https://github.com/firefox-devtools/profiler/pull/6147" rel="noopener nofollow ugc">#6147</a>)</li>
<li>[Nazım Can Altınova] Extract a runCommand helper for profiler-cli command handlers (<a href="https://github.com/firefox-devtools/profiler/pull/6148" rel="noopener nofollow ugc">#6148</a>)</li>
<li>[cathaysia] feat(theme): add color-scheme meta (<a href="https://github.com/firefox-devtools/profiler/pull/6150" rel="noopener nofollow ugc">#6150</a>)</li>
<li>[Nazım Can Altınova] Add an early throw for the this.querier and remove the non-null asserts in the cli codebase (<a href="https://github.com/firefox-devtools/profiler/pull/6145" rel="noopener nofollow ugc">#6145</a>)</li>
<li>[skylarkning] Improve preview link discovery (<a href="https://github.com/firefox-devtools/profiler/pull/6149" rel="noopener nofollow ugc">#6149</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 (July 9, 2026) (<a href="https://github.com/firefox-devtools/profiler/pull/6155" rel="noopener nofollow ugc">#6155</a>)</li>
</ul>
<p>Big thanks to our amazing localizers for making this release possible:</p>
<ul>
<li>de: Michael Köhler</li>
<li>el: Jim Spentzos</li>
<li>en-GB: Ian Neal</li>
<li>es-CL: ravmn</li>
<li>fr: Théo Chevalier</li>
<li>fy-NL: Fjoerfoks</li>
<li>ia: Melo46</li>
<li>it: Francesco Lodolo [:flod]</li>
<li>nl: Fjoerfoks</li>
<li>ru: Valery Ledovskoy</li>
<li>tr: Nazım Can Altınova</li>
<li>zh-TW: Pin-guang Chen</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-july-9-2026/148882">Read full topic</a></p></div>
    </summary>
    <updated>2026-07-09T13:58:29Z</updated>
    <published>2026-07-09T13:58:29Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>canova</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-july-9-2026/148882.rss" title="Firefox Profiler Deployment (July 9, 2026)"/>
      <updated>2026-07-15T16:59:02Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/</id>
    <link href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/" rel="alternate" title="Announcing Rust 1.97.0" type="text/html"/>
    <title xml:lang="en">Announcing Rust 1.97.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.97.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.97.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 get <a href="https://www.rust-lang.org/install.html" rel="external"><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-1970-2026-07-09" rel="external">detailed release notes for 1.97.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/07/09/Rust-1.97.0/#what-s-in-1-97-0-stable"/>
What's in 1.97.0 stable</h3>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#symbol-mangling-v0-enabled-by-default"/>
Symbol mangling v0 enabled by default</h4>
<p>When Rust is compiled into object files and binaries, each item (functions,
statics, etc) must have a globally unique "symbol" identifying it. To avoid
conflicts when linking together different Rust programs, Rust mangles the
original name of items to include additional context such as the module path,
defining crate, generics, and more. Historically, this mangling was based on
the <a href="https://refspecs.linuxbase.org/cxxabi-1.86.html#mangling" rel="external">Itanium ABI</a>,
also (sometimes) used by C++.</p>
<p>The new mangling scheme resolves a number of drawbacks from the previous one:</p>
<ul>
<li>Generic parameter instantiations preserve their values, rather than being tracked solely behind a hash</li>
<li>Inconsistencies: not all parts used the Itanium ABI, meaning that custom demangling was still necessary</li>
</ul>
<p>Since Rust 1.59, the compiler has supported opting into a Rust-specific
mangling scheme via <code>-Csymbol-mangling-version=v0</code>. Since November 2025, this
scheme has been enabled by default on nightly, and 1.97 is now enabling it on
stable Rust. The legacy mangling scheme can only be enabled on nightly, and the
current plan is to fully remove it.</p>
<p>See the previous <a href="https://blog.rust-lang.org/2025/11/20/switching-to-v0-mangling-on-nightly/" rel="external">blog post</a> for more details.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#cargo-support-for-denying-warnings"/>
Cargo support for denying warnings</h4>
<p>It's common practice to deny warnings in CI. Historically, doing so is
typically done through <code>RUSTFLAGS=-Dwarnings</code>. With Rust 1.97, Cargo controls
how warnings interact with build success: either silencing them (via <code>allow</code>
level), rendering without failing (default, <code>warn</code>), or denying them (via <code>deny</code>).</p>
<p>As a  result of Cargo configuration determining the behavior, using this
feature doesn't invalidate the underlying build cache, meaning that it's easy
to temporarily opt-in. For example, if warnings are adding unwanted noise while
working through fixing errors after a refactor, you can run
<code>CARGO_BUILD_WARNINGS=allow cargo check</code>, temporarily silencing them.</p>
<p>In CI, jobs can instead set <code>CARGO_BUILD_WARNINGS=deny</code> to deny warnings. This
can be combined with <code>--keep-going</code> to collect all errors and warnings rather
than stopping on the first failing package.</p>
<p>See the <a href="https://doc.rust-lang.org/cargo/reference/config.html#buildwarnings" rel="external">documentation</a> for more details.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#linker-output-no-longer-hidden-by-default"/>
Linker output no longer hidden by default</h4>
<p>rustc invokes a linker on behalf of users. Historically, rustc has silenced
linker output by default if the link completes successfully. This can mask real
problems, though, so in Rust 1.97 we are enabling linker messages by default.
These are emitted as a warning lint, for example:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>warning: linker stderr: ignoring deprecated linker optimization setting '1'</span></span>
<span class="giallo-l"><span>  |</span></span>
<span class="giallo-l"><span>  = note: `#[warn(linker_messages)]` on by default</span></span></code></pre>
<p>Common linker messages that have been diagnosed as false positives or intentional behavior
are filtered out by rustc. Several defects have already been fixed as a result
of no longer hiding this output on nightly.</p>
<p>Note that currently, <code>linker_messages</code> is a special lint that is <em>not</em> affected
by the <code>warnings</code> lint group. This is intentional as rustc generally doesn't
control linker output as precisely, and it's not uncommon for output to only
appear on some platforms. If you are seeing what you think is a false positive
output from the linker, please <a href="https://github.com/rust-lang/rust/issues/new/choose" rel="external">file an issue</a>.</p>
<p>To silence the warning in the mean time, you can configure the lint level to
allow. This can be done through <code>Cargo.toml</code> by adding a <a href="https://doc.rust-lang.org/nightly/cargo/reference/manifest.html#the-lints-section" rel="external">lints section</a> like this:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>[</span><span>lints</span><span>.</span><span>rust</span><span>]</span></span>
<span class="giallo-l"><span class="z-variable">linker_messages</span><span> =</span><span class="z-punctuation z-definition z-string z-string"> "</span><span class="z-string z-quoted z-string">allow</span><span class="z-punctuation z-definition z-string z-string">"</span></span></code></pre><h4><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#stabilized-apis"/>
Stabilized APIs</h4>
<ul>
<li><a href="https://doc.rust-lang.org/stable/std/iter/struct.RepeatN.html#impl-Default-for-RepeatN%3CA%3E" rel="external"><code>Default for RepeatN</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/ffi/struct.FromBytesUntilNulError.html#impl-Copy-for-FromBytesUntilNulError" rel="external"><code>Copy for ffi::FromBytesUntilNulError</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/154003" rel="external"><code>Send for std::fs::File</code> on UEFI</a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_highest_one" rel="external"><code>&lt;{integer}&gt;::isolate_highest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_lowest_one" rel="external"><code>&lt;{integer}&gt;::isolate_lowest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.u32.html#method.highest_one" rel="external"><code>&lt;{integer}&gt;::highest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.u32.html#method.lowest_one" rel="external"><code>&lt;{integer}&gt;::lowest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.u32.html#method.bit_width" rel="external"><code>&lt;{uN}&gt;::bit_width</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_highest_one" rel="external"><code>NonZero&lt;{integer}&gt;::isolate_highest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_lowest_one" rel="external"><code>NonZero&lt;{integer}&gt;::isolate_lowest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.highest_one" rel="external"><code>NonZero&lt;{integer}&gt;::highest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.lowest_one" rel="external"><code>NonZero&lt;{integer}&gt;::lowest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.bit_width" rel="external"><code>NonZero&lt;{uN}&gt;::bit_width</code></a></li>
</ul>
<p>These previously stable APIs are now stable in const contexts:</p>
<ul>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.char.html#method.is_control" rel="external"><code>char::is_control</code></a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#other-changes"/>
Other changes</h4>
<p>Check out everything that changed in <a href="https://github.com/rust-lang/rust/releases/tag/1.97.0" rel="external">Rust</a>, <a href="https://doc.rust-lang.org/nightly/cargo/CHANGELOG.html#cargo-197-2026-07-09" rel="external">Cargo</a>, and <a href="https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-197" rel="external">Clippy</a>.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#contributors-to-1-97-0"/>
Contributors to 1.97.0</h3>
<p>Many people came together to create Rust 1.97.0. We couldn't have done it without all of you. <a href="https://thanks.rust-lang.org/rust/1.97.0/" rel="external">Thanks!</a></p></div>
    </content>
    <updated>2026-07-09T00:00:00Z</updated>
    <published>2026-07-09T00: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-07-15T14:56:21Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=86291</id>
    <link href="https://blog.mozilla.org/en/firefox/wrexham-afc-firefox-partnership/" rel="alternate" type="text/html"/>
    <title>Wrexham AFC and Firefox announce a multi-year, front-of-kit partnership</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>We don’t put our name on much. So when we do, it means something. Starting with the 2026/27 season, Firefox is Wrexham AFC’s Official Web Browser Partner and front-of-kit sponsor on the men’s and women’s teams.  More than 160 years old and nearly lost for good, the football club was saved by the community that […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/wrexham-afc-firefox-partnership/">Wrexham AFC and Firefox announce a multi-year, front-of-kit partnership</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="Wrexham AFC crest beside the Firefox logo on a purple background" class="wp-image-86298" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/07/WXM_Partner_FireFox_FINAL_ARTBOARDS_BLOG-DISTILLED-1024x576.png" width="1024"/></figure>



<p>We don’t put our name on much. So when we do, it means something.</p>



<p>Starting with the 2026/27 season, Firefox is Wrexham AFC’s Official Web Browser Partner and front-of-kit sponsor on the men’s and women’s teams. <br/><br/>More than 160 years old and nearly lost for good, the football club was saved by the community that loved it and has been climbing ever since. Wrexham AFC built something real by doing things their own way and staying close to the community that carries them. </p>



<p>That’s a story we recognize. Firefox has spent more than 20 years as the browser people choose — not the one they’re handed. Backed by a nonprofit, we’ve never had to answer to shareholders, just to the people who use us. Two challengers, never the default, both here because our communities showed up for us.</p>



<p>Our partnership debuts this weekend on the new away kit, when Wrexham travels to Kraków for their opening pre-season fixture. And this is just the start: Expect content, product integrations and fan moments all season long.</p>



<p>“Both Wrexham AFC and Firefox are challenger brands that built passionate global communities by doing things differently and staying true to who they are,” Mozilla CMO John Solomon said. “Firefox has approached the internet with that same philosophy — building it as it should be, with people at the center.” </p>



<p>“We are thrilled to welcome Firefox as our new front-of-kit partner,” said Rob Mac and Ryan Reynolds, co-chairmen of Wrexham AFC. “We love an underdog story and both Wrexham and Firefox know the feeling of having to battle giants. It takes inventiveness, relentlessness and a pristine browsing history. So let’s effing go…”</p>



<p>Football needs Wrexham. The internet needs Firefox.</p>



<p>For more information on our partnership and upcoming 2026/27 season, follow @wrexham_afc on social media. <a href="http://www.firefox.com" rel="noreferrer noopener" target="_blank">Click here</a> to download the independent browser that puts you first.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><strong>About Mozilla and Firefox</strong></p>



<p>Mozilla is a global nonprofit backed technology organization that builds products, invests in startups, and advances policy to keep the internet open, fair, and worthy of trust. Firefox is the independent browser from Mozilla, known for strong tracking protection, open source code, and a focus on user choice, privacy and security.</p>



<p><strong>About Wrexham AFC</strong></p>



<p>Wrexham Association Football Club is based in Wrexham, North Wales, and after an historic, record-breaking three consecutive promotions are competing in the EFL Championship, the second tier of the English football league pyramid. Formed in 1864, they are the oldest Club in Wales and the third oldest professional team in the world. Wrexham have won the Welsh Cup a record 23 times and beaten some of the biggest clubs in the game in the English FA Cup and UEFA European Cup Winners Cup. The Racecourse Ground, home to Wrexham AFC, is the world’s oldest international stadium that continues to host international games.</p>



<p>Wrexham AFC is owned by Rob Mac and Ryan Reynolds. The goal of the owners is to grow the team and establish Wrexham AFC as a Premier League club in front of increased attendances, and in an improved stadium, while making a positive difference to the wider community in Wrexham. For more information, please visit <a href="http://wrexhamafc.co.uk" rel="noreferrer noopener" target="_blank">wrexhamafc.co.uk</a> or follow @wrexham_afc.</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">
     <h3>Take control of your internet</h3>      <span>Download Firefox</span>   </div>
</a>
<p>The post <a href="https://blog.mozilla.org/en/firefox/wrexham-afc-firefox-partnership/">Wrexham AFC and Firefox announce a multi-year, front-of-kit partnership</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-07-08T13:00:06Z</updated>
    <published>2026-07-08T13:00:06Z</published>
    <category term="Firefox"/>
    <category term="News"/>
    <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-07-14T12:38:41Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:this-week-in-rust.org,2026-07-08:/blog/2026/07/08/this-week-in-rust-659/</id>
    <link href="https://this-week-in-rust.org/blog/2026/07/08/this-week-in-rust-659/" rel="alternate" type="text/html"/>
    <title>This Week in Rust 659</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/07/07/maintainer-spotlight-gen-li-rami3l/">Maintainer spotlight: Gen Li (@rami3l)</a></li>
<li><a href="https://blog.rust-lang.org/inside-rust/2026/07/06/unite-for-clippy/">Together for a healthier Clippy</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://www.theembeddedrustacean.com/p/the-embedded-rustacean-issue-75">The Embedded Rustacean Issue #75</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://www.copper-robotics.com/whats-new/copper-rs-v100">copper-rs v1.0.0</a>: the open source deterministic robotics OS is now stable.</li>
<li><a href="https://rayfish.xyz/blog/01-introducing-rayfish">Rayfish: Your own private network. No servers, no setup.</a></li>
<li><a href="https://plabayo.tech/blog/rama-0-3">rama v0.3.0 — network service framework ready to be used by the wider Rust community</a></li>
<li><a href="https://github.com/kunobi-ninja/kache/releases/tag/v0.9.0">kache 0.9.0: supply-chain hardening + read-only CI cache</a></li>
<li><a href="https://www.willsearch.com.br/blog/2026/07/04/meet-guardiandbs-new-postgresql-compatibility-layer/">GuardianDB - PostgreSQL and P2P/Local-First Together</a></li>
<li><a href="https://buildnectar.com/">Nectar: a Rust-like language that compiles your whole web app to WebAssembly</a></li>
<li><a href="https://thekeeper.io/blog/logdrain-log-template-mining-in-rust/">logdrain: Fast, Embeddable Log-Template Mining in Rust</a></li>
<li><a href="https://medium.com/@vbasky/packaging-the-worlds-video-in-pure-rust-ff1f6b884fec">sheathe: Packaging the World's Video in Pure Rust</a></li>
<li><a href="https://docs.wickra.org/Quickstart-Rust">wickra: streaming-first technical indicators</a></li>
<li><a href="https://github.com/TeamXcelerator/xcelerator-solver/releases/tag/v0.1.0">Xcelerator Solver v0.1.0 -- deterministic symbolic regression</a></li>
<li><a href="https://github.com/tkmsikd/dlt-tui/releases/tag/v1.1.0">dlt-tui 1.1.0 - a fast TUI viewer for automotive DLT (AUTOSAR Diagnostic Log and Trace) files</a></li>
<li><a href="https://github.com/shihuili1218/rssh/releases/tag/v0.2.11">RSSH v0.2.11 — terminal workflows, safer SSH key import, and observable AI ops</a></li>
<li><a href="https://blog.none.at/blog/2026/2026-07-06-k8s-scale-app-rs/">k8s-scale-app-rs: Scale or Restart a Kubernetes Deployment from a CronJob</a></li>
<li><a href="https://dev.to/sicklefire/m-vis-v050-rc1-update-11cp">M-vis v0.5.0-rc1 update</a></li>
<li><a href="https://ganeshsivakumar.substack.com/p/flaredb">FlareDB: An Apache Beam Native Streaming Database built in Rust</a></li>
<li><a href="https://holovskyi.github.io/blog/typed-mqtt-topics-for-rust/">mqtt-typed-client 0.2: a type-safe async MQTT client on rumqttc</a></li>
<li><a href="https://github.com/LeChatP/RootAsRole/releases/tag/v4.0.0">RootAsRole: v4.0.0 Major release, secure execution, new logo</a></li>
<li><a href="https://www.qt.io/blog/rust-ui-framework-via-bridging-technology">A Cross-Platform Rust UI Framework via Qt’s Bridging Technology</a></li>
<li><a href="https://rapha.land/jam-programming-language/">Jam Programming Language</a></li>
<li><a href="https://www.clever.cloud/blog/company/2026/07/01/sozu-2-1-0-udp-load-balancer-programmable-edge/">Sōzu 2.1.0: UDP load balancing for the programmable edge</a></li>
<li><a href="https://op3kay.dev/writing/b0nker">b0nker: a minimal container runtime written 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>[video] <a href="https://www.youtube.com/watch?v=SGR5qBdwk30">Rust Berlin Meetup 25/06/2026 Livestream</a></li>
<li>[video] <a href="https://www.youtube.com/live/_LtgHxuysUo">How do you rewrite C/C++ projects to Rust? – JetBrains interview with Luca Palmieri, Mainmatter</a></li>
<li><a href="https://kerkour.com/rustcrypto-slow-simd-rust">Investigating why RustCrypto is slow: Deep dive into SIMD instructions and hardware acceleration</a></li>
<li><a href="https://parsa.wtf/cast/">bool as u32</a></li>
<li><a href="https://arxiv.org/html/2605.30106">A Rust-to-Lean Verification Pipeline with AI Provers: An Experience Report</a></li>
<li><a href="https://blog.dureuill.net/articles/wip/">Work In Progress Rust</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=Fk165jYfHpc">OpenAI just spent $600k on Rust</a></li>
<li>[audio] <a href="https://corrode.dev/podcast/s06e07-rising-academies/">Rising Academies with Dylan Brown - Rust in Production Podcast</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/bevy-tutorial-build-your-first-3d-editor-in-rust/">Bevy Tutorial: Build Your First 3D Editor - Create a 3D Space on an Infinite Grid</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-axum-basics-and-routing-by-building-a-url-shortener/">Learn Axum Basics and Routing by Building a URL Shortener</a></li>
<li>[series] <a href="https://plabayo.tech/blog/rama-101-1-https-clients-and-abstractions">Rama 101.1: HTTPS clients and layers of abstraction</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://seanborg.tech/tiny-blog/rust-week-ven-diagram/">Clickable euler diagram of all the Rust week talks</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://crates.io/crates/apis-saltans-core">apis-saltans</a>, a Zigbee implementation including a coordinator API.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1627">Richard Neumann</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>

<p>* <a href="https://github.com/name970/Protocol/issues/4">Protocol - Extend bit-exactness tests to f64 reconstruction targets</a>                                                                          <br/>
* <a href="https://github.com/lenra-io/dofigen/issues/278">Dofigen - No image tag replacement flag for the generate command</a></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>



<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>598 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-06-30..2026-07-07">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/156976">enable eager <code>param_env</code> norm in new solver</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156379">lint on <code>core::ffi::c_void</code> as a return type</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158577">polish some macro parsing code</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158604">resolve: no allocation in <code>resolve_ident_in(_local)_module_*</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158627">simplify option-iterator flattening in the compiler</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157857">stabilize <code>#[my_macro] mod foo;</code> (part of <code>proc_macro_hygiene</code>)</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/158537">add <code>std::io::cursor::WriteThroughCursor</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157347">implement <code>Box::as_non_null()</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156737">implement <code>DoubleEndedIterator::next_chunk_back</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/134021">implement <code>IntoIterator</code> for <code>[&amp;[mut]] Box&lt;[T; N], A&gt;</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158427">implement <code>ptr::{read,write}_unaligned</code> via <code>repr(packed)</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158539">move <code>SizeHint</code> and <code>IoHandle</code> to <code>core::io</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158540">move <code>std::io::Seek</code> to <code>core::io</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158704">optimize <code>ArrayChunks::try_rfold</code> with <code>DoubleEndedIterator::next_chunk_back</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158573">stabilize <code>feature(atomic_from_mut)</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/17135"><code>bindeps</code>: register transitive artifact targets</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17167">avoid cloning parsed TOML manifest in <code>ManifestErrorContext</code></a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17176">avoid extra clone of parsed TOML manifest</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17178">remove unneeded cloning when parsing package index</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17169">change HashMaps and HashSets in Cargo to use Fxhasher</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17174">do not pass lint rustflags when <code>--cap-lints=allow</code> is set</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17164">fixed <code>Compilation::deps_output</code> only taking the last dep</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17177">pre-allocate a few vectors</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/16807">stabilize <code>build-dir</code> layout v2</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17180">use a set when checking visited workspace members</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/158751">fix crash when trying to inline foreign item which cannot have attributes</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158334">show use-site paths for unevaluated const array lengths</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/17319"><code>chunks_exact_to_as_chunks</code>: Don't report expressions with const parameters</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17360"><code>chunks_exact_to_as_chunks</code>: Don't report expressions with type params</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17309"><code>missing_trait_methods</code>: MSRV/unstable awareness</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17289"><code>vec_init_then_push</code>: don't lint pushes from a macro expansion</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17346"><code>inline_modules</code>: ignore <code>cfg(test)</code> modules in test builds</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17345"><code>match_same_arms</code>: keep arm-level expectations working under an outer allow</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17341"><code>unnecessary_operation</code>: avoid bad <code>!</code> suggestions</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17351"><code>unnecessary_unwrap_unchecked</code>: don't trigger inside the <code>_unchecked</code> fn</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17348">add required parentheses when the <code>needless_bool</code> suggestion is an operand</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17353">fix ICE when resolving local in <code>unnecessary_unwrap_unchecked</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17311">fix <code>infinite_loop</code> false positive inside gen blocks</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17358">fix <code>manual_c_str_literals</code> suggestion when the trailing backslash is escaped</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17337">fix <code>strlen_on_c_strings</code> incorrect suggestion logic</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17323">fix <code>suspicious_operation_groupings</code> duplications</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16902">lint bit width</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17338">optimize <code>Msrv::meets</code> calls</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17273">bail out of unicode lint scans when the snippet is pure ASCII</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17224">skip the HIR parent walk in <code>is_in_test_function</code> when there are no test items</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17366">place generated impl block after the existing impl block</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17333">refactor <code>StringAdd</code> lint pass</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17334">refactor <code>suspicious_xor_used_as_pow</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17293">remove <code>lower_ty</code> in <code>uninhabited_reference</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17328">respect the configured MSRV in <code>manual_is_variant_and</code>'s <code>map() == Some(_)</code> rewrite</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17332">rewrite <code>mut_mut</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17329">rewrite <code>redundant_else</code> as a late pass</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17354">rewrite <code>tuple_array_conversions</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/22595">SCIP: exclude leading/trailing trivia in definition ranges</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22708">SCIP: remove dead <code>inlay_hints</code> field</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22433"><code>feat(ide-diagnostics)</code>: add diagnostics for invalid union patterns (E0784)</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22704"><code>internal(query-group-macro)</code>: remove the arity test</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22668">add tree top method to Syntax node</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22665">add handler for E0627</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22231">supports multi arms for <code>replace_match_with_if_let</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22690">fix UB in <code>smol_str borsh_non_utf8</code> test cases</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/20362">fix generic param for <code>generate_default_from_enum_variant</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22703"><code>walkthrough_create_project</code> file not packaged</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22677">assertion failure on closure with unbound function</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22613">avoid panic in <code>convert_tuple_struct_to_named_struct</code> on nested pattern usage</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22649">configuration syntax for nvim-lsp</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22706">correct resolution to value when it shares the same name with type</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22619">exclude impls on the error type from impl enumeration</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22705">fix crash on <code>extract_variable</code> when selecting unresolved macro call</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22715">fix crash on completion inside macros</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22673">fix handling of params of coroutine fns</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22675">handle more cases of cfgs in expr store lowering</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22488">no generate with default assoc item</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22674">panics in <code>unwrap_return_type</code>, <code>remove_underscore</code>, and <code>promote_local_to_const</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22711">hoist attribute qualifier segment collection</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22709">reduce parser joint-token allocation</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22676">project-model: don't pass metadata extra args to sysroot</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22679">project-model: introduce cargo.configPath</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22581">provide startup time to ready log point and associated benchmark</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 dominated by wild swings in benchmarks of the new-solver, which is not enabled by default, yet.
Apart from that, we got a very few notable changes, only one unexpected speedup from a bugfix in rustdoc.</p>
<p>Triage done by <strong>@panstromek</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=7dc2c162b9c197aaa76a6f9e7534569537830a01&amp;end=3659db0d3e2cd634c766fcda79ed118eca31a9fd&amp;absolute=false&amp;stat=instructions%3Au">7dc2c162..3659db0d</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.2%</td>
<td style="text-align: center;">[0.2%, 0.2%]</td>
<td style="text-align: center;">3</td>
</tr>
<tr>
<td style="text-align: center;">Regressions ❌ <br/> (secondary)</td>
<td style="text-align: center;">162.1%</td>
<td style="text-align: center;">[0.2%, 1116.3%]</td>
<td style="text-align: center;">20</td>
</tr>
<tr>
<td style="text-align: center;">Improvements ✅ <br/> (primary)</td>
<td style="text-align: center;">-1.4%</td>
<td style="text-align: center;">[-8.4%, -0.1%]</td>
<td style="text-align: center;">7</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;">[-8.4%, -0.1%]</td>
<td style="text-align: center;">11</td>
</tr>
<tr>
<td style="text-align: center;">All ❌✅ (primary)</td>
<td style="text-align: center;">-0.9%</td>
<td style="text-align: center;">[-8.4%, 0.2%]</td>
<td style="text-align: center;">10</td>
</tr>
</tbody>
</table>
<p>1 Regression, 1 Improvement, 4 Mixed; 3 of them in rollups
17 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/9f1bc6e374b5ae202366df1cbef850b79be8c641/triage/2026/2026-07-06.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/pull/158522">Lint against invalid POSIX symbol definitions</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158325">Document NonNull layout guarantees</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/112811">Tracking Issue for <code>slice_split_once</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/1011">Let the OS handle stack growth</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1010">Add <code>target_feature_available_at_call_site</code></a></li>
</ul>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#language-reference"/><a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/reference/pull/2293">Empty repr(Rust) enums are ZSTs</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/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a>,
<a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</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>
<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/3982">Update RFC template</a></li>
<li><a href="https://github.com/rust-lang/rfcs/pull/3981">RFC: Store registry tokens in the OS credential store by default</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-07-08 - 2026-08-05 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-07-08 | 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/315506435/"><strong>Operating Systems Book Club: Introduction + Processes</strong></a></li>
</ul>
</li>
<li>2026-07-08 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/jv9lom12"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-09 | 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/315517604/"><strong>Rust Nürnberg online</strong></a></li>
</ul>
</li>
<li>2026-07-14 | 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/310254778/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-07-15 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/21k797xr"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-15 | 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/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/312045926/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-19 | 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/314329045/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-21 | 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/315102297/"><strong>Lunch &amp; Learn: Learning Rust as First Programming Language</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/315279653/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
<li>2026-07-22 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/hd8mlw56"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-28 | 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/310254777/"><strong>Fourth Tuesday</strong></a></li>
</ul>
</li>
<li>2026-07-29 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/uo5ek1f4"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-30 | 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/312045928/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-08-02 | 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/314095294/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-08-04 | 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/315213885/"><strong>👋 Community Catch Up</strong></a></li>
</ul>
</li>
<li>2026-07-29 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/ii2jrwva"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-08-05 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs/events/">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/315210367/"><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#asia">Asia</a></h5>
<ul>
<li>2026-07-18 | Bangalore, IN | <a href="https://hasgeek.com/rustbangalore">Rust Bangalore</a><ul>
<li><a href="https://hasgeek.com/rustbangalore/july-2026-rustacean-meetup/"><strong>July 2026 Rustacean Meetup</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-07-14 | Johannesburg, ZA | <a href="https://www.meetup.com/johannesburg-rust-meetup/events/">Johannesburg Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/johannesburg-rust-meetup/events/315573758/"><strong>Debugging a production grade Open Source Rust crate</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-07-08 | Dublin, IE | <a href="https://www.meetup.com/rust-dublin">Rust Dublin</a><ul>
<li><a href="https://www.meetup.com/rust-dublin/events/315150327/"><strong>Join us live and INPERSON for Rust 262</strong></a></li>
</ul>
</li>
<li>2026-07-09 | 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/315585121/"><strong>Rust Berlin on location 🏳️‍🌈 - Edition 015</strong></a></li>
</ul>
</li>
<li>2026-07-09 | Frankfurt, DE | <a href="https://www.meetup.com/rust-rhein-main/events/">Rust Rhein-Main</a><ul>
<li><a href="https://www.meetup.com/rust-rhein-main/events/315366165/"><strong>Building Cross Platform Applications with Ply</strong></a></li>
</ul>
</li>
<li>2026-07-09 | 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-07-15 | Dortmund, DE | <a href="https://www.meetup.com/rust-dortmund/events/">Rust Dortmund</a><ul>
<li><a href="https://www.meetup.com/rust-dortmund/events/315496876/"><strong>Teach and Hack at Projektspeicher</strong></a></li>
</ul>
</li>
<li>2026-07-21 | 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/313816470/"><strong>Supercharge Rust funcs with implicit arguments and context-generic programming</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/315484101/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
<li>2026-07-23 | London, UK | <a href="https://www.meetup.com/london-rust-project-group">London Rust Project Group</a><ul>
<li><a href="https://www.meetup.com/london-rust-project-group/events/315366453/"><strong>Rama modular service framework for Rust</strong></a></li>
</ul>
</li>
<li>2026-07-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/315309633/"><strong>Rust meetup #87</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Manchester, GB | <a href="https://www.meetup.com/rust-manchester/events/">Rust Manchester</a><ul>
<li><a href="https://www.meetup.com/rust-manchester/events/315037685/"><strong>Rust Manchester July Code Night</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-07-09 | 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/314696647/"><strong>Utah Rust July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-09 | 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/315338107/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
</ul>
</li>
<li>2026-07-11 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225865/"><strong>MIT Rust Lunch, July 11</strong></a></li>
</ul>
</li>
<li>2026-07-15 | 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/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-18 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225872/"><strong>North End Rust Lunch, July 18</strong></a></li>
</ul>
</li>
<li>2026-07-21 | 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/314997214/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-07-22 | 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/xvkdgtyjckbdc/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-07-22 | 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/315376271/"><strong>Rust LA: Rust in Distributed Systems with Flight Science!</strong></a></li>
</ul>
</li>
<li>2026-07-25 | 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/315582650/"><strong>Porter Square Rust Lunch, July 25</strong></a></li>
</ul>
</li>
<li>2026-07-25 | Brooklyn, NY, US | <a href="https://flowercomputer.com/">Flower</a><ul>
<li><a href="https://partiful.com/e/Vq9fyDNCMSO7ia4ulK5b"><strong>BOG-A-THON 2</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Atlanta, GA, US | <a href="https://www.meetup.com/rust-atl/events/">Rust Atlanta</a><ul>
<li><a href="https://www.meetup.com/rust-atl/events/313539329/"><strong>Rust-Atl</strong></a></li>
</ul>
</li>
<li>2026-08-01 | 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/315582653/"><strong>Chinatown Rust Lunch, Aug 1</strong></a></li>
</ul>
</li>
<li>2026-08-04 | 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/314660176/"><strong>Evening Boston Rust Meetup at Red Hat, Aug 4</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-07-09 | 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/315563251/"><strong>Rust Brisbane • July 2026</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Barton, 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/315307280/"><strong>July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Perth, AU | <a href="https://www.meetup.com/perth-rust-meetup-group">Rust Perth Meetup Group</a><ul>
<li><a href="https://www.meetup.com/perth-rust-meetup-group/events/315451138/"><strong>Rust Perth: July Meetup!</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Melbourne, AU | <a href="https://www.meetup.com/rust-melbourne/events/">Rust Melbourne</a><ul>
<li><a href="https://www.meetup.com/rust-melbourne/events/315039480/"><strong>Rust Melbourne July 2026</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 a ptr is dereferenced in a forest and nobody hears it, is it sound?</p>
</blockquote>
<p>– <a href="https://users.rust-lang.org/t/does-the-indirection-of-a-pointer-immediately-create-a-reference/141071/10">Kornel on rust-users</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1785">Cerber-Ursi</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/1ureq0r/this_week_in_rust_659/">Discuss on r/rust</a></small></p></div>
    </content>
    <updated>2026-07-08T04:00:00Z</updated>
    <published>2026-07-08T04: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-07-15T04:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.thunderbird.net/?p=4419</id>
    <link href="https://blog.thunderbird.net/2026/07/desktopsettings/" rel="alternate" type="text/html"/>
    <title>Desktop settings research: what we learned from your feedback</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>A few weeks ago, we conducted hour-long conversations with 10 of our users to dig deep into how you manage your preferences and configurations in Thunderbird desktop. While this specific research cycle focused on the desktop experience, our ultimate goal is a holistic strategy that ensures our mobile settings feel like a natural extension of […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/07/desktopsettings/">Desktop settings research: what we learned from your feedback</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="Black square with typography that says &quot;Desktop Settings: User research, July 2026&quot; with the Thunderbird Logo at the bottom." class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2026/07/blog-banner-generic1-768x432.jpg" width="640"/></p>
<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>



<p>A few weeks ago, we conducted hour-long conversations with 10 of our users to dig deep into how you manage your preferences and configurations in Thunderbird desktop. While this specific research cycle focused on the desktop experience, our ultimate goal is a holistic strategy that ensures our mobile settings feel like a natural extension of your workspace.</p>



<p>Here is a quick look at what we discovered, what you valued, and how your feedback is actively shaping our design roadmap.</p>



<div class="wp-block-spacer" style="height: 20px;"/>



<figure class="wp-block-image size-full is-resized"><a href="https://blog.thunderbird.net/files/2026/07/Screenshot-2026-07-07-at-7.29.34&#x202F;AM.png"><img alt="&quot;Key themes&quot; is written along the top of the graphic with 6 boxes under, noting each theme: trust, reduce the clutter, settings are setup once, hard to navigate, users manage their inbox like a to-do list/workflow, and configuring settings is confusing and time consuming." class="wp-image-4442" height="1136" src="https://blog.thunderbird.net/files/2026/07/Screenshot-2026-07-07-at-7.29.34&#x202F;AM.png" style="width: 863px; height: auto;" width="2024"/></a></figure>



<h3 class="wp-block-heading">What you told us</h3>



<p>You are incredibly passionate about customization, and appreciate Thunderbird’s robust functionality. Overall, a common thread that stood out was that most of you want to set up your space once and then make small tweaks to your preferences, you want it to look modern, and navigate effortlessly without running into issues with technical jargon. </p>



<p>Here are the key themes that emerged from our conversations:</p>



<ul>
<li><strong>Ecosystem trust</strong>: Your commitment to Thunderbird is rooted in a deep trust for open-source software, the Mozilla brand, absolute transparency, and reliability.</li>



<li><strong>Set and forget</strong>: You customize extensively during your initial setup, followed only by minor tweaks to get your workspace just right. </li>



<li><strong>Clutter &amp; noise:</strong> There is a strong desire to reduce workspace clutter and the cognitive “noise” within dense configuration menus.</li>



<li><strong>Search to navigate</strong>: While deep navigation menus can feel hard to find your way through, an in-app search function is your go-to for finding what you need quickly. </li>



<li><strong>The “inbox as a to-do list” workflow</strong>: Many of you don’t just read mail, you actively treat your unread inbox as a task list or interactive to-do queue.</li>



<li><strong>Terminology barriers</strong>: Even for advanced users, many settings feel overly technical, which causes hesitation when you’re trying to explore your options.</li>
</ul>



<ul>
<div class="wp-block-spacer" style="height: 20px;"/>
</ul>



<figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2026/07/image.png"><img alt="&quot;Recommendations&quot; is written along the top of the graphic with 6 boxes under, noting each theme: Demystify advanced settings, grouping one-time configurations, surface quick controls, group tasks, explain security and privacy practices, and pair with modern UI." class="wp-image-4436" height="1155" src="https://blog.thunderbird.net/files/2026/07/image.png" width="2048"/></a></figure>



<h3 class="wp-block-heading">Improvements we want to make</h3>



<p>We don’t want to just make minor fixes, we want to design a better workflow. Based on your feedback, here are the core design actions that will be driving our next phase focusing on general and account settings: </p>



<ul>
<li><strong>Demystify the language</strong>: We are planning to replace confusing technical terminology with plain, clear language, so you always know exactly what each function does.</li>



<li><strong>Streamline information architecture</strong>: We are regrouping settings into logical, task-oriented categories to make manual navigation smooth and intuitive.</li>



<li><strong>Bring context to privacy &amp; security</strong>: Instead of a flat list of checkboxes, we want to add clear explanations around data security and defaults so you can make confident, informed decisions.</li>



<li><strong>Functionality meets modern UI:</strong> Thunderbird’s robust functionality is its superpower, but a dated interface shouldn’t be a barrier to entry for newer users.</li>



<li><strong>Accessibility update</strong>: Based on a community member’s recent audit, we are also taking this opportunity to improve the overall accessibility of the settings experience.</li>
</ul>



<div class="wp-block-spacer" style="height: 20px;"/>



<h3 class="wp-block-heading">What’s next?</h3>



<p>We are hitting the ground running with these insights. Right now, our team is actively:</p>



<ol>
<li>Finalizing our project scope to directly incorporate these research findings.</li>



<li>Mapping out and proposing a streamlined information architecture for settings.</li>



<li>Designing this layout holistically so that desktop preferences and mobile configurations</li>
</ol>



<p>A massive thank you to everyone who offered their time and feedback for this study! We look forward to sharing more with you soon.</p>



<p>Let us know your thoughts in the comments below! </p>



<div class="wp-block-spacer" style="height: 38px;"/>
<p>The post <a href="https://blog.thunderbird.net/2026/07/desktopsettings/">Desktop settings research: what we learned from your feedback</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></div>
    </content>
    <updated>2026-07-07T18:56:45Z</updated>
    <published>2026-07-07T18:56:45Z</published>
    <category term="Community"/>
    <category term="Product"/>
    <category term="Thunderbird"/>
    <category term="Desktop"/>
    <category term="Feedback"/>
    <category term="Research"/>
    <category term="Settings"/>
    <author>
      <name>Aly Blenkin</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-07-14T19:36:44Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-us">
    <id>https://eqrion.net/ten-years-at-mozilla/</id>
    <link href="https://eqrion.net/ten-years-at-mozilla/" rel="alternate" type="text/html"/>
    <title>Just Keep At It: A Decade at Mozilla</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Well, that went by quick!</p>
<p>I joined Mozilla as an intern in 2016. I wouldn’t believe you if you told me I’d still be here in 2026, working on their WebAssembly engine and contributing to the WebAssembly standards process.</p>
<p>Ten years at one company is a long time in this industry. I’m feeling a bit sentimental, so I thought I’d share how that happened, and why I’m still here.</p></div>
    </summary>
    <updated>2026-07-07T15:00:00Z</updated>
    <published>2026-07-07T15:00:00Z</published>
    <source>
      <id>https://eqrion.net/tags/mozilla/</id>
      <author>
        <name>Ryan Hunt</name>
      </author>
      <link href="https://eqrion.net/tags/mozilla/" rel="alternate" type="text/html"/>
      <link href="https://eqrion.net/tags/mozilla/index.xml" rel="self" type="application/rss+xml"/>
      <subtitle>Recent content in Mozilla on Ryan Hunt's Blog</subtitle>
      <title>Mozilla on Ryan Hunt's Blog</title>
      <updated>2026-07-07T15:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/l10n/?p=1887</id>
    <link href="https://blog.mozilla.org/l10n/2026/07/06/giving-pontoons-editor-its-own-theme/" rel="alternate" type="text/html"/>
    <title>Giving Pontoon’s Editor Its Own Theme</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Each year, Mozilla welcomes interns who work alongside our engineering teams on projects that ship to production and improve the experience for contributors around the world. This year, Ayush joined … <a class="go" href="https://blog.mozilla.org/l10n/2026/07/06/giving-pontoons-editor-its-own-theme/">Read more</a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><blockquote>
<p class="PDq2pG_selectionAnchorContainer">Each year, Mozilla welcomes interns who work alongside our engineering teams on projects that ship to production and improve the experience for contributors around the world. This year, Ayush joined the Firefox Localization team to work on Pontoon, Mozilla’s open source localization platform, where he already tackled several user-facing improvements while learning how large-scale open source software is built.</p>
<p>In this post, Ayush shares the story behind one of his first projects: giving Pontoon’s translation editor its own appearance settings. From understanding long-standing design decisions to balancing accessibility with user expectations, he walks through both the technical implementation and the product thinking that shaped the feature.</p>
<p class="isSelectedEnd">You can follow Ayush’s work on <a href="https://github.com/ayshushus">GitHub</a> and connect with him on <a href="https://www.linkedin.com/in/ayshushus">LinkedIn</a>.</p>
</blockquote>
<h3>Introduction</h3>
<p>Studying <a href="https://future.utoronto.ca/program/computer-engineering">Computer Engineering</a> with a <a href="https://discover.engineering.utoronto.ca/experiential-learning/professional-experience-year-pey/">Professional Experience Year (PEY)</a> at the <a href="https://www.engineering.utoronto.ca/">University of Toronto’s Faculty of Applied Science</a> gave me a variety of opportunities and companies to choose spending a year interning at. I chose Software Engineering at <a href="https://www.mozilla.org/">Mozilla</a> because it’s an open source company that puts people first, which matters to me a lot and allows me to equip my portfolio using snippets and examples from real code used in production.</p>
<p>I joined <a href="https://language.mozilla.org/">Mozilla’s Firefox Localization (l10n) team</a> as part of <a href="https://www.mozilla.org/foundation/moco/">Mozilla Corporation</a>’s Firefox Desktop Engineering Team, based in Downtown Toronto. I officially began my internship on Friday, May 1, 2026, but I unofficially began in mid February. Since my team’s flagship product’s (<a href="https://pontoon.mozilla.org/">Pontoon</a>) codebase is entirely open source, I talked to both my <a href="https://github.com/flodolo">manager</a> and <a href="https://github.com/mathjazz">Pontoon owner</a> right after signing my offer and got early access to our weekly meetings and some confidential data. I then started to learn as much as I possibly could.</p>
<p><a href="https://blog.mozilla.org/l10n/files/2026/07/image7.png"><img alt="" class="alignnone size-full wp-image-1889" height="856" src="https://blog.mozilla.org/l10n/files/2026/07/image7.png" width="1662"/></a></p>
<p>Even before I started learning the <a href="https://github.com/mozilla/pontoon">codebase</a>, just looking at the Pontoon’s default translation UI was rather interesting because of our editor pane’s glaring white color in dark mode/theme.</p>
<p><a href="https://blog.mozilla.org/l10n/files/2026/07/image3.png"><img alt="" class="alignnone size-full wp-image-1890" height="950" src="https://blog.mozilla.org/l10n/files/2026/07/image3.png" width="1664"/></a></p>
<p>Even though I saw the <a href="https://github.com/mozilla/pontoon/issues/4001">issue (#4001)</a> filed for working on that, I thought that the stark contrast was a stylistic choice because an average user would spend most of their time on said pane editing strings anyway, so I just went on with it.</p>
<p><a href="https://blog.mozilla.org/l10n/files/2026/07/image11.png"><img alt="" class="alignnone size-full wp-image-1891" height="794" src="https://blog.mozilla.org/l10n/files/2026/07/image11.png" width="1664"/></a></p>
<p>However, once I officially started to work, I got my onboarding document and saw my starting set of issues. That’s where I came across the very same <a href="https://github.com/mozilla/pontoon/issues/4001">issue (#4001)</a> on my todo batch, which made me very happy since I could address it and I’d already looked at the surrounding context before working with it.</p>
<h3>The Original Experience</h3>
<p>At first, the user could only change Pontoon’s appearance from their `profile menu` or <a href="https://pontoon.mozilla.org/settings/">Pontoon’s `/settings` page</a>. This is where they have the ability to change their appearance to `dark mode`, `light mode`, or keep the `system theme` that matches their device’s preferences.</p>
<div class="wp-caption alignnone" id="attachment_1892" style="width: 1318px;"><a href="https://blog.mozilla.org/l10n/files/2026/07/image10.png"><img alt="" class="wp-image-1892 size-full" height="362" src="https://blog.mozilla.org/l10n/files/2026/07/image10.png" width="1308"/></a><p class="wp-caption-text" id="caption-attachment-1892">This is the view from Pontoon’s Settings page.</p></div>
<div class="wp-caption alignnone" id="attachment_1893" style="width: 1164px;"><a href="https://blog.mozilla.org/l10n/files/2026/07/image2.png"><img alt="" class="wp-image-1893 size-full" height="1046" src="https://blog.mozilla.org/l10n/files/2026/07/image2.png" width="1154"/></a><p class="wp-caption-text" id="caption-attachment-1893">This is the view from Pontoon’s Profile menu.</p></div>
<div class="wp-caption alignnone" id="attachment_1894" style="width: 2009px;"><a href="https://blog.mozilla.org/l10n/files/2026/07/image1.png"><img alt="" class="wp-image-1894 size-full" height="1126" src="https://blog.mozilla.org/l10n/files/2026/07/image1.png" width="1999"/></a><p class="wp-caption-text" id="caption-attachment-1894">Ironically, the dark appearance warrants a light themed `editor pane`.</p></div>
<div class="wp-caption alignnone" id="attachment_1895" style="width: 1792px;"><a href="https://blog.mozilla.org/l10n/files/2026/07/image9.png"><img alt="" class="size-full wp-image-1895" height="628" src="https://blog.mozilla.org/l10n/files/2026/07/image9.png" width="1782"/></a><p class="wp-caption-text" id="caption-attachment-1895">There is also no option to change the `editor pane` appearance from the `editor menu`.</p></div>
<h3>Design Considerations</h3>
<p>In general, when a product has a large, established user base that has grown accustomed to a particular interface, it’s important to approach visual changes with care. Even if a redesign is arguably more visually appealing and offers clear accessibility benefits, changing familiar workflows and appearance can still disrupt the user experience.</p>
<p>In fact, according to <a href="https://research.mozilla.org/">this Mozilla Research</a> article I read, which explored <a href="https://research.mozilla.org/browser-competition/remedyconcepts/">browser choice design interventions</a>, “It is important that the organizations tasked with designing and regulating current and future interventions (including browser choice screens) are mindful of the design principles we have articulated with this research.”</p>
<p>Even though the relevance of said <a href="https://research.mozilla.org/browser-competition/remedyconcepts/">research</a> is for the browser use-case, the impacts are for a user interface design like in this blog, as the article also mentions “The inertia is a strong force to overcome”, and Pontoon’s inertia dates back over a decade.</p>
<p>This meant that if we were to change the editor pane color, we would have to allow the user to have things as they currently are.</p>
<h3>The New Experience</h3>
<p>In the update Appearance section of the <a href="https://pontoon.mozilla.org/settings/">Settings page</a>, users have the ability to change the main interface as before, but now have the ability to update editor to `dark mode`, `light mode`, or match their `main interface theme` to automatically sync the colors.</p>
<p>The editor theme remains light by default, regardless of the main interface theme.</p>
<div class="wp-caption alignnone" id="attachment_1896" style="width: 1600px;"><a href="https://blog.mozilla.org/l10n/files/2026/07/image5.png"><img alt="" class="size-full wp-image-1896" height="652" src="https://blog.mozilla.org/l10n/files/2026/07/image5.png" width="1590"/></a><p class="wp-caption-text" id="caption-attachment-1896">This is the view from Pontoon’s Settings page.</p></div>
<div class="wp-caption alignnone" id="attachment_1897" style="width: 1722px;"><a href="https://blog.mozilla.org/l10n/files/2026/07/image8.png"><img alt="" class="size-full wp-image-1897" height="896" src="https://blog.mozilla.org/l10n/files/2026/07/image8.png" width="1712"/></a><p class="wp-caption-text" id="caption-attachment-1897">Editor appearance can also be quickly changed from the editor menu.</p></div>
<div class="wp-caption aligncenter" id="attachment_1902" style="width: 1010px;"><a href="https://blog.mozilla.org/l10n/files/2026/07/pontoon_dark_editor.png"><img alt="" class="wp-image-1902 size-extra-large" height="482" src="https://blog.mozilla.org/l10n/files/2026/07/pontoon_dark_editor-1000x482.png" width="1000"/></a><p class="wp-caption-text" id="caption-attachment-1902">This UI now matches the dark theme, either by explicitly selecting it or matching the main interface theme.</p></div>
<div class="wp-caption alignnone" id="attachment_1899" style="width: 1708px;"><a href="https://blog.mozilla.org/l10n/files/2026/07/image4.png"><img alt="" class="size-full wp-image-1899" height="914" src="https://blog.mozilla.org/l10n/files/2026/07/image4.png" width="1698"/></a><p class="wp-caption-text" id="caption-attachment-1899">Since the issue was with `dark interface mode` having a `light editor`, setting the default `editor` to `light` neatly agreed with how the UI looked before the changes were brought in.</p></div>
<h3>Looking Ahead</h3>
<p>These changes neatly allow the user to modify their theme keeping their general preferences in mind. The change is also remembered by Pontoon and stays consistent at every instance the user logs back in.</p>
<p>Furthermore, we now track if the user has interacted with the `editor theme` which gives us knowledge on if we want to eventually change the default editor theme, addressing the concerns of `UI inertia` brought up in <a href="https://research.mozilla.org/browser-competition/remedyconcepts/">Mozilla’s research</a>.</p>
<p>For more information and technical details, please visit: <a href="https://www.ayshush.us/mozilla/issue-notes/4001">https://www.ayshush.us/mozilla/issue-notes/4001</a></p></div>
    </content>
    <updated>2026-07-06T16:13:33Z</updated>
    <published>2026-07-06T16:13:33Z</published>
    <category term="Planet"/>
    <category term="Pontoon"/>
    <author>
      <name>Matjaž Horvat</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-07-08T10:16:45Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/community/?p=2543</id>
    <link href="https://blog.mozilla.org/community/2026/07/06/newsletter-jun-2026/" rel="alternate" type="text/html"/>
    <title>A new Firefox look, hidden features, and more</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Hi Mozillians, welcome to another Mozilla community roundup! This month, we’re taking a look at what’s next for Firefox. From an upcoming visual refresh and a peek behind the new … <a class="go" href="https://blog.mozilla.org/community/2026/07/06/newsletter-jun-2026/">Read more</a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Hi Mozillians, welcome to another Mozilla community roundup!</p>
<p>This month, we’re taking a look at what’s next for Firefox. From an upcoming visual refresh and a peek behind the new design system to hidden features you may never have used before. We’re also highlighting a recent Reddit AMA on the new Firefox product Roadmap and celebrating community contribution that’s making collaboration in Pontoon even better.</p>
<p>Let’s dive in!</p>
<p><strong>✨ Firefox gets a fresh new look. Soon!</strong></p>
<p><a href="https://blog.mozilla.org/community/files/2026/07/nova.png"><img alt="" class="alignnone size-full wp-image-2545" height="1427" src="https://blog.mozilla.org/community/files/2026/07/nova.png" width="2485"/></a></p>
<p>Firefox is evolving with a refreshed design that makes the browser feel more modern, approachable, and consistent across desktop and mobile. The refresh also extends to Firefox’s voice and writing style, making product experience feel more human, direct, and unmistakably Firefox. If you’re excited about these changes, make sure to keep an eye out for an upcoming foxfooding opportunity later this month!</p>
<p><a href="https://connect.mozilla.org/t5/discussions/sharing-more-about-project-nova/td-p/125996/">Learn more</a></p>
<p><strong> Firefox can do all this?</strong></p>
<p>Sreenath from <em>It’s FOSS</em> rounded up 21 Firefox features that many users never discover. From the built-in Eyedropper tool and Picture-in-Picture to vertical tabs and other productivity features, there’s plenty to explore. See how many you’ve already used! We could even turn it into a fun bingo at our next community event.</p>
<p><a href="https://itsfoss.com/firefox-additional-features/">Read more</a></p>
<p><strong> From the Reddit Community</strong></p>
<p><a href="https://blog.mozilla.org/community/files/2026/07/Firefox_Distilled_Roadmap-1000x563-1.webp"><img alt="Fx roadmap" class="alignnone size-full wp-image-2544" height="563" src="https://blog.mozilla.org/community/files/2026/07/Firefox_Distilled_Roadmap-1000x563-1.webp" width="1000"/></a></p>
<p>Firefox leaders recently joined<a href="https://www.reddit.com/r/firefox/"> r/firefox</a> for a live AMA to answer questions about the newly launched Firefox Product Roadmap. Community members asked about everything from Android improvements and Containers to Project Nova, PWAs, performance, and future browser development. The conversation generated a wide range of discussions and provided valuable insight into what Firefox users are most excited, and concerned, about.</p>
<p><a href="https://www.reddit.com/r/firefox/comments/1u7cyh7/introducing_the_firefox_roadmap_ama_next_week/">Read the full AMA</a></p>
<p><strong> Community spotlight</strong></p>
<p>Collaboration in Pontoon just got a little easier. Thanks to volunteer contributor <strong>Serah Nderi</strong>, users can now edit and delete their own comments, while project managers can remove comments for moderation purposes. This long-requested feature helps reduce clutter, improve discussions, and makes collaboration smoother for localization teams.</p>
<p><a href="https://blog.mozilla.org/l10n/2026/04/03/enhancing-comment-management-in-pontoon/">Read more</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-07-06T03:45:11Z</updated>
    <published>2026-07-06T03:45:11Z</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-07-06T03:53:50Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/netpolicy/?p=2595</id>
    <link href="https://blog.mozilla.org/netpolicy/2026/07/03/mozilla-mornings-comes-to-the-uk-privacy-enhancing-technologies-and-the-questions-they-raise/" rel="alternate" type="text/html"/>
    <title>Mozilla Mornings comes to the UK: privacy-enhancing technologies and the questions they raise</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>During London Tech Week, Mozilla hosted the first UK edition of Mozilla Mornings, our breakfast-discussion series on the digital questions of the moment. We brought together technologists, policymakers, industry, civil … <a class="go" href="https://blog.mozilla.org/netpolicy/2026/07/03/mozilla-mornings-comes-to-the-uk-privacy-enhancing-technologies-and-the-questions-they-raise/">Read more</a></p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/07/03/mozilla-mornings-comes-to-the-uk-privacy-enhancing-technologies-and-the-questions-they-raise/">Mozilla Mornings comes to the UK: privacy-enhancing technologies and the questions they raise</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><i>During London Tech Week, Mozilla hosted the first UK edition of Mozilla Mornings, our breakfast-discussion series on the digital questions of the moment. We brought together technologists, policymakers, industry, civil society and researchers to ask how the UK can drive forward responsible innovation in privacy-enhancing technologies (PETs) in ways that protect people, strengthen trust and keep digital markets open. </i></p>
<h3><b>The role of PETs in building a better internet</b></h3>
<p>Protecting people’s privacy has always been central to Mozilla’s mission to build a better internet – one where privacy and security are fundamental, people have meaningful control over their data and online lives, and independent actors can compete on a level playing field. Privacy-enhancing technologies (PETs) are an important part of that vision. They help minimise the amount of personal data that needs to be collected and processed while enabling useful functionality. In Firefox, this work includes technologies such as <a href="https://support.mozilla.org/en-US/kb/ohttp-explained">Oblivious HTTP</a>, differential privacy, the Distributed Aggregation Protocol and <a href="https://support.mozilla.org/en-US/kb/firefox-dns-over-https">DNS over HTTPS</a>.</p>
<p>PETs encompass a broad family of technical, architectural and product-design approaches where data analysis, measurement, collaboration, access and computation happen with lower privacy risk.</p>
<p>Advancing both privacy and competition together is key to a healthier internet ecosystem. Advertising illustrates both the challenge and the opportunity. It keeps most of the web free and accessible, but today’s dominant model leans on hidden data collection and opaque systems that work around people rather than with them. Solutions that simply hand more data, more infrastructure or more decision-making power to a handful of large companies do not fix that.</p>
<p>Importantly, PETs should not be viewed as a way to bypass privacy rules. Their value lies in reducing the amount of personal data that needs to be collected, shared or processed in the first place, while preserving useful functionality where appropriate. That is why we have been <a href="https://blog.mozilla.org/en/advertising/principles/improving-online-advertising/">investing in and building around privacy-preserving advertising</a>, recognising that PETs are not a silver bullet but an important part of a better model.</p>
<p>Responsible deployment of PETs depends not only on the technical design, but also on the governance, assurance, and market context around it. PETs should be grounded in open standards and interoperable architectures. Otherwise, they risk reinforcing walled gardens, limiting choice or creating new dependencies rather than supporting a more open and competitive ecosystem.</p>
<h3><b>The discussion</b></h3>
<p>The event opened with remarks from the Information Commissioner’s Office (ICO). This included the ICO’s work on PETs, online tracking, privacy-preserving attribution and the questions raised under Regulation 6 of the Privacy and Electronic Communications Regulations (PECR). Shortly before the event, the ICO had published <a href="https://ico.org.uk/media2/yefdqvk4/20260505-report-for-dsit-on-changes-to-regulation-6-pecr-for-online-advertising.pdf">advice</a> to the government on possible online advertising exceptions to Regulation 6 PECR. As we set out in our submission to the ICO’s call for views on online advertising, we support reform that incentivises privacy-preserving practices while keeping consent the default for high-risk practices.</p>
<p>Gijs Kruitbosch, Principal Engineer at Mozilla, then gave a technical demonstration of how Mozilla uses PETs and privacy-preserving design in Firefox, including on New Tab, where relevance can be improved through approaches that reduce reliance on user identifiers and server-side user profiles.</p>
<p>The panel, moderated by Mozilla’s Kirsten Nelson-de Búrca, widened the lens well beyond advertising. Speakers from eyeo, OpenMined, the Open Data Institute and the Information Society Law Centre discussed how PETs are governed and used across sectors, and how their deployment could affect competition as well as privacy. The discussion explored public-interest examples, including federated rare-disease and genomic research that lets analysis happen without data leaving an institution or a country, and emerging routes for external researchers to study platform data.</p>
<p>A recurring theme was that successful deployment depends as much on governance and public trust as it does on mathematics. PETs have the potential to reduce the competitive advantages associated with large-scale personal data collection, but they could also entrench incumbents if the relevant infrastructure is closed, proprietary or expensive to audit. The discussion complicated the familiar trade-off between privacy and competition, arguing that it eases when PETs are built in the open, on shared standards, with interoperable and auditable implementations and real routes for smaller players and new entrants to take part.</p>
<h3><b>What comes next</b></h3>
<p>The most important questions were the ones we left without tidy answers. Who gets to set standards, and are they set in the open? How do smaller players actually participate, rather than being told they may? What forms of assurance or audit are needed before policymakers can rely on privacy claims? And how should PETs be built into the next generation of AI, where the most sensitive data and the strongest case for protection often sit together? These are the questions we want to keep working on with those who joined us and the wider community.</p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/07/03/mozilla-mornings-comes-to-the-uk-privacy-enhancing-technologies-and-the-questions-they-raise/">Mozilla Mornings comes to the UK: privacy-enhancing technologies and the questions they raise</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </content>
    <updated>2026-07-03T10:36:33Z</updated>
    <published>2026-07-03T10:36:33Z</published>
    <category term="privacy"/>
    <category term="Uncategorized"/>
    <author>
      <name>Kirsten Nelson-de Búrca</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-07-03T10:36:33Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:this-week-in-rust.org,2026-07-01:/blog/2026/07/01/this-week-in-rust-658/</id>
    <link href="https://this-week-in-rust.org/blog/2026/07/01/this-week-in-rust-658/" rel="alternate" type="text/html"/>
    <title>This Week in Rust 658</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/06/30/Rust-1.96.1/">Announcing Rust 1.96.1 | Rust Blog</a></li>
<li><a href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/">The many journeys of learning Rust | Rust Blog</a></li>
</ul>
<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/rust-foundation-trusted-training-program-launches-giving-learners-a-mark-of-quality-to-trust/">Rust Foundation Trusted Training Program Launches, Giving Learners a Mark of Quality to Trust</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://scientificcomputing.rs/monthly/2026-06">Scientific Computing in Rust #19 (June 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://slint.dev/blog/slint-1.17-released">Slint 1.17 Released</a></li>
<li><a href="https://blog.antoyo.xyz/rustc_codegen_gcc-progress-report-42">rustc_codegen_gcc: Progress Report #42</a></li>
<li><a href="https://hovinen.me/announcements/2026/06/24/introducing-test-that.html">Introducing Test That!</a></li>
<li><a href="https://github.com/shihuili1218/rssh/blob/main/docs/article_arch_en.md">Inside RSSH: one Rust crate, three binaries, and the Tauri lessons along the way</a></li>
<li><a href="https://github.com/Aleixenandros/Rustty/releases/tag/v1.38.0">Rustty 1.38 – accessibility &amp; keyboard nav</a></li>
<li><a href="https://www.willsearch.com.br/blog/2026/06/25/guardiandb-0-17-0-secure-namespaces-iroh-1-0-and-the-arrival-of-the-odm/">GuardianDB 0.17.0: Secure namespaces, Iroh 1.0, and the arrival of the ODM</a></li>
<li><a href="https://dev.to/iam_suriyan_b9078a5b3a553/building-a-real-time-voice-agent-runtime-in-rust-no-gil-one-binary-2000-calls-a-box-12ko">Building a real-time voice-agent runtime in Rust: no GIL, one binary, 2,000 calls a box</a></li>
<li><a href="https://aimdb.dev/blog/aimdb-bring-your-own-connector">AimDB: Bring Your Own Connector</a></li>
<li><a href="https://github.com/kunobi-ninja/kache/releases/tag/v0.8.0">kache 0.8.0: zero-copy restores on Windows (ReFS)</a></li>
<li><a href="https://miskibin.github.io/warbell/">Warbell — a castle-defense action-RPG built with Bevy 0.19</a></li>
<li><a href="https://dev.to/gregorymc86/i-built-a-macos-ftp-client-entirely-in-rust-no-electron-no-webview-2a8i">I built a macOS FTP client entirely in Rust - no Electron, no webview</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://blog.yoshuawuyts.com/hoisting-expressions">Hoisting Expressions</a></li>
<li><a href="https://blog.jetbrains.com/rust/2026/06/25/rust-web-development-2026/">The Unglamorous Side of Rust Web Development</a></li>
<li><a href="https://dev.to/ernesto_arias_148b35bc25d/-how-i-found-out-52-of-my-knowledge-graph-was-duplicates-and-what-i-did-about-it-3coh">How I Found Out 52% of My Knowledge Graph Was Duplicates (and What I Did About It)</a></li>
<li><a href="https://jtjlehi.github.io/2026/06/25/novel-rust-error-handling.html">A Novel Approach to Rust Error Handling</a></li>
<li><a href="https://encore.dev/blog/redis-runtime">We put a Redis server inside our runtime</a></li>
<li><a href="https://kerkour.com/rust-high-performance-memory-fragmentation-allocations">High-performance Rust: Understanding and eliminating memory fragmentation</a></li>
<li><a href="https://kunobi.ninja/blog/kache-storage-worktrees">AI and worktrees are filling our disks: kache storage, measured</a></li>
<li><a href="https://dev.to/sicklefire/designing-a-cross-platform-terminal-memory-visualizer-in-rust-2365">Designing a cross-platform terminal memory visualizer in Rust</a></li>
<li><a href="https://pranitha.dev/posts/rust-and-memory-allocators">Your Rust Service Isn't Leaking — It Could Be the Allocator</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://medium.com/@vbasky/measure-dont-guess-building-viser-a-content-adaptive-video-encoding-optimizer-in-rust-7675edd6943a">Measure, Don't Guess: Building viser, a Content-Adaptive Video Encoding Optimizer in Rust</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-sql-and-sqlx-by-building-a-book-library-cli-in-rust/">Learn SQL and SQLx by Building a Book Library CLI in Rust</a></li>
<li>[series] <a href="https://aibodh.com/posts/async-rust-chapter-2-what-async-fn-compiles-into/">Reasoning About Async Rust with State Machines</a></li>
<li><a href="https://mainmatter.com/c-to-rust-migration-book/">The C to Rust Migration Book</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/pbkx/deconvolution">deconvolution</a>, a image deconvolution and restoration library.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1621">pbkx</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/kmolan/multicalc-rust/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22">multicalc - good first issues</a></li>
<li><a href="https://github.com/aimdb-dev/aimdb/issues/93">AimDB - Add minimal example: hello-single-latest</a></li>
<li><a href="https://github.com/aimdb-dev/aimdb/issues/109">AimDB - Wire <code>.transform()</code> and <code>.transform_join()</code> into stage profiling</a></li>
<li><a href="https://github.com/SzilvasiPeter/edid-info/issues/1">edid-info - Increase test coverage with real EDID data</a></li>
<li><a href="https://github.com/SzilvasiPeter/edid-info/issues/2">edid-info - Finalize CTA-861 extension implementation</a></li>
<li><a href="https://github.com/SzilvasiPeter/edid-info/issues/3">edid-info - Support additional EDID extension block types</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>426 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-06-23..2026-06-30">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/157996">drop the full-crate AST walk in <code>check_unused</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158185">make <code>stable_crate_ids</code> reads lock-free after crate loading</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158239">rework lint pass running</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157271">simplify some <code>proc_macro</code> things</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/158326">add <code>io::ErrorKind::TooManyOpenFiles</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/153097">expand <code>OptionFlatten</code>'s iterator methods</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155625">move <code>std::io::Error</code> into <code>core</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158053">optimize network address parser</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/17106">add <code>-Zhint-msrv</code> flag</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/17237"><code>filter_map_next</code>: clean-up, overhaul suggestions</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17318"><code>chunks_exact_to_as_chunks</code>: Prevent syntactically invalid suggestions</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17317"><code>chunks_exact_to_as_chunks</code>: Use correct method name in message</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17316"><code>chunks_exact_to_as_chunks</code>: Pick iter method depending on mut-ness</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17302"><code>non_ascii_literal</code>, <code>invisible_characters</code>: don't suggest a fix on raw strings</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17228">create a single <code>ConstEvalCtxt</code> in <code>expr_eagerness</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17299">detect new range types in <code>higher::Range</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17270">do not trigger <code>manual_option_zip</code> when map receiver is a lazy evaluated expression</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16746">enhance <code>needless_late_init</code> to cover grouped assignments</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17257">fix: <code>borrow_as_ptr</code> is triggered on generated 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/22466">add diagnostic for E0596</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22645">add fixes add '.await' for <code>type_mismatch</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22646">crash on lowering consts with associated types</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22640">crash when hovering on anonymous consts</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22582">only run <code>Drop::drop</code> when implemented</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22633">mark <code>inline_convert_while_ascii()</code> as <code>unsafe</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22115">switch out lsp-types for gen-lsp-types</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>Overall, the week was fairly neutral, with no meaningful shift on most benchmarks on any of our statistics.</p>
<p>Triage done by <strong>@simulacrum</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=8b6558a02b2774acfb25cf15e199467c37ba7490&amp;end=7dc2c162b9c197aaa76a6f9e7534569537830a01&amp;absolute=false&amp;stat=instructions%3Au">8b6558a0..7dc2c162</a></p>
<p>2 Regressions, 1 Improvement, 7 Mixed; 5 of them in rollups
34 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/master/triage/2026/2026-06-29.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/143989">Tracking Issue for LocalKey/Cell::update</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/142312">Tracking Issue for <code>{str, [T], Path}::trim_prefix</code> and <code>{str, [T]}::trim_suffix</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155697">Stabilize c-variadic function definitions</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/69835">Tracking Issue for layout information behind pointers</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158523">Fix feature gate for <code>repr(simd)</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/154585">reat no_mangle_generic_items as hard error instead of lint warning</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158522">Lint against invalid POSIX symbol definitions</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158302">Fix <code>overflowing_literals</code> lint with repeated negation</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158504">stabilize <code>extern "custom"</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158057">Don't escape U+FF9E and U+FF9F in <code>escape_debug_ext</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/1007">Decouple <code>BackendRepr</code> from ABI alignment</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1005">MCP: Stabilization strategy for rustc parallel frontend</a></li>
</ul>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#language-reference"/><a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/reference/pull/2166">Fields must fit in the type, even for repr(Rust)</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/3527">RFC: Associated const underscore</a></li>
<li><a href="https://github.com/rust-lang/rfcs/pull/3980">Add <code>extern "custom"</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/615">Opsem extension proposal: atomic volatile accesses</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> or
<a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</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/3977">Method chain as item</a></li>
<li><a href="https://github.com/rust-lang/rfcs/pull/3980">Add <code>extern "custom"</code></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-07-01 - 2026-07-29 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<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/315210366/"><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">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 (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/315211402/"><strong>Learning Game Development the Hard Way with Rust and Bevy</strong></a></li>
</ul>
</li>
<li>2026-07-02 | 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/313345243/"><strong>Rust Nürnberg online</strong></a></li>
</ul>
</li>
<li>2026-07-04 | 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-07-05 | 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/314095287/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-07 | 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/315060981/"><strong>👋 Community Catch Up</strong></a></li>
</ul>
</li>
<li>2026-07-14 | 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/310254778/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-07-15 | 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/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/312045926/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-19 | 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/314329045/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-21 | 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/315102297/"><strong>Lunch &amp; Learn: Learning Rust as First Programming Language</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/315279653/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
<li>2026-07-28 | 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/310254777/"><strong>Fourth Tuesday</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-07-18 | Bangalore, IN | <a href="https://hasgeek.com/rustbangalore">Rust Bangalore</a><ul>
<li><a href="https://hasgeek.com/rustbangalore/july-2026-rustacean-meetup/"><strong>July 2026 Rustacean Meetup</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-07-01 | Köln, DE | <a href="https://www.meetup.com/rust-cologne-bonn">Rust Cologne</a><ul>
<li><a href="https://www.meetup.com/rustcologne/events/315404678/"><strong>Rust in July: Vecs and Strings and Slices, Oh My!</strong></a></li>
</ul>
</li>
<li>2026-07-01 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul>
<li><a href="https://www.meetup.com/rust-manchester/events/315200163/"><strong>Rust Manchester June Talks</strong></a></li>
</ul>
</li>
<li>2026-07-01 | Oxford, UK | <a href="https://www.meetup.com/oxford-rust-meetup-group">Oxford ACCU/Rust Meetup.</a><ul>
<li><a href="https://www.meetup.com/oxford-rust-meetup-group/events/315409335/"><strong>Building a file system from scratch</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Edinburgh, UK | <a href="https://www.meetup.com/rust-edi">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, NL | <a href="https://www.meetup.com/dutch-rust-meetup">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">Rust Dublin</a><ul>
<li><a href="https://www.meetup.com/rust-dublin/events/315150327/"><strong>Join us live and INPERSON for Rust 262</strong></a></li>
</ul>
</li>
<li>2026-07-09 | 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-07-21 | 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/313816470/"><strong>Supercharge Rust funcs with implicit arguments and context-generic programming</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/315484101/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
<li>2026-07-23 | London, UK | <a href="https://www.meetup.com/london-rust-project-group">London Rust Project Group</a><ul>
<li><a href="https://www.meetup.com/london-rust-project-group/events/315366453/"><strong>Rama modular service framework for Rust</strong></a></li>
</ul>
</li>
<li>2026-07-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/315309633/"><strong>Rust meetup #87</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-07-02 | 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/315103359/"><strong>Git is easy?</strong></a></li>
</ul>
</li>
<li>2026-07-04 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225861/"><strong>Boston University Rust Lunch, July 4</strong></a></li>
</ul>
</li>
<li>2026-07-09 | 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/314696647/"><strong>Utah Rust July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-11 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225865/"><strong>MIT Rust Lunch, July 11</strong></a></li>
</ul>
</li>
<li>2026-07-15 | 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/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-18 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225872/"><strong>North End Rust Lunch, July 18</strong></a></li>
</ul>
</li>
<li>2026-07-21 | 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/314997214/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-07-22 | 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/xvkdgtyjckbdc/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-07-22 | 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/315376271/"><strong>Rust LA: Rust in Distributed Systems with Flight Science!</strong></a></li>
</ul>
</li>
<li>2026-07-25 | Brooklyn, NY, US | <a href="https://flowercomputer.com/">Flower</a><ul>
<li><a href="https://partiful.com/e/Vq9fyDNCMSO7ia4ulK5b"><strong>BOG-A-THON 2</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-07-21 | Barton, 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/315307280/"><strong>July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Perth, AU | <a href="https://www.meetup.com/perth-rust-meetup-group">Rust Perth Meetup Group</a><ul>
<li><a href="https://www.meetup.com/perth-rust-meetup-group/events/315451138/"><strong>Rust Perth: July 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/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>I <em>do</em> rather hope anyone using <code>-Zllvm-target-features</code> or any stabilized form thereof would know that they are getting a conversation with the dragon directly and they should mind their words carefully if they do not wish to be barbecued by it and served over a nice plate of iron filings.</p>
</blockquote>
<p>– <a href="https://rust-lang.zulipchat.com/#narrow/channel/233931-t-compiler.2Fmajor-changes/topic/Add.20.60-Zllvm-target-feature.60.20target.20.2Amodif.E2.80.A6.20compiler-team.23994/near/606147265">workingjubilee on rust zulip</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1784">Tomáš Šedovič</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/1ul6xfl/this_week_in_rust_658/">Discuss on r/rust</a></small></p></div>
    </content>
    <updated>2026-07-01T04:00:00Z</updated>
    <published>2026-07-01T04: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-07-15T04:00:00Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148802</id>
    <link href="https://discourse.mozilla.org/t/happy-bmo-push-day-20260630-1/148802" rel="alternate" type="text/html"/>
    <title>Happy BMO Push Day! (20260630.1)</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="https://github.com/mozilla-bteam/bmo/tree/release-20260630.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=1726931">Bug 1726931</a> - New issues should displayed on “My Dashboard” for first time users instead of assigned bugs</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1834454">Bug 1834454</a> - [WEBHOOKS] Webhooks for a product change don’t fire if product is changed away from the target product</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1684509">Bug 1684509</a> - Have a single button to mark a bug as abusive/spam</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-20260630-1/148802">Read full topic</a></p></div>
    </summary>
    <updated>2026-07-01T00:55:49Z</updated>
    <published>2026-07-01T00:55:49Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>dkl1</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/happy-bmo-push-day-20260630-1/148802.rss" title="Happy BMO Push Day! (20260630.1)"/>
      <updated>2026-07-15T16:59:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>https://servo.org/blog/2026/06/30/may-in-servo/</id>
    <link href="https://servo.org/blog/2026/06/30/may-in-servo/" rel="alternate" type="text/html"/>
    <title>May in Servo: user scripts, mp4 compat, blackboxing in DevTools, 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.3.0"><strong>Servo 0.3.0</strong></a> contains all of the changes we landed in May, which came out to <strong>391 commits</strong> (March: 534).
For security fixes, see <a href="https://servo.org/blog/2026/06/30/may-in-servo/#security"><strong>§ Security</strong></a>.</p>
<figure>
    <a href="https://servo.org/img/blog/2026-06-diffie.png"><img alt="servoshell 0.3.0 showing several new features: the `document.execCommand()` commands &#x2018;back&#xAD;Color&#x2019;, &#x2018;create&#xAD;Link&#x2019;, &#x2018;unlink&#x2019;, &#x2018;superscript&#x2019;, &#x2018;subscript&#x2019;, and &#x2018;remove&#xAD;Format&#x2019;, plus &#x2018;font-kerning&#x2019; and &#x2018;font-variant-ligatures&#x2019;" src="https://servo.org/img/blog/2026-06-diffie.png"/></a>
</figure>
<p>We’ve shipped several new web platform features:</p>
<ul>
<li><strong>‘font-kerning: none’</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44634">#44634</a>)</li>
<li><strong>‘font-variant-east-asian’</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44989">#44989</a>)</li>
<li><strong>‘font-variant-ligatures’</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44903">#44903</a>)</li>
<li><strong>‘font-variant-numeric’</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44950">#44950</a>)</li>
<li><strong>‘font-variant-position’</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/45142">#45142</a>)</li>
<li><strong>mp4</strong> files <strong>without fast start</strong> in <strong>&lt;video&gt;</strong> (<a href="https://github.com/calvaris">@calvaris</a>, <a href="https://github.com/servo/servo/pull/45084">#45084</a>)</li>
<li><code>&lt;form enctype="multipart/form-data"&gt;</code> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/45028">#45028</a>)</li>
<li><code>&lt;form enctype="text/plain"&gt;</code> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/45111">#45111</a>)</li>
<li><strong>&lt;![CDATA[]]&gt;</strong> layout (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44791">#44791</a>)</li>
</ul>
<p>Plus a bunch of new DOM APIs:</p>
<ul>
<li><strong>onslotchange</strong> property on <strong>Shadow­Root</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44688">#44688</a>)</li>
<li><strong>screen­Left</strong> and <strong>screen­Top</strong> on <strong>Window</strong> (<a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/servo/servo/pull/45128">#45128</a>)</li>
<li><strong>new Blob()</strong> with <code>{endings: "native"}</code> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44803">#44803</a>)</li>
<li><strong>new Performance­Mark()</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/44702">#44702</a>)</li>
<li><strong>parse­HTML()</strong> on <strong>Document</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/44952">#44952</a>)</li>
<li><strong>read­As­Binary­String()</strong> on <strong>File­Reader</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44858">#44858</a>, <a href="https://github.com/servo/servo/pull/44921">#44921</a>)</li>
<li><strong>performance.measure()</strong> with mark values <strong>‘redirect­Start’</strong>, <strong>‘redirect­End’</strong>, <strong>‘secure­Connection­Start’</strong>, and <strong>‘response­End’</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/44673">#44673</a>, <a href="https://github.com/servo/servo/pull/44624">#44624</a>, <a href="https://github.com/servo/servo/pull/44850">#44850</a>, <a href="https://github.com/servo/servo/pull/44739">#44739</a>)</li>
</ul>
<p>We’ve also fixed some build issues on Windows (<a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/45079">#45079</a>), FreeBSD (<a href="https://github.com/delan">@delan</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/44600">#44600</a>), and for anyone building Servo on NixOS or with Nix (<a href="https://github.com/freyacodes">@freyacodes</a>, <a href="https://github.com/servo/servo/pull/45051">#45051</a>, <a href="https://github.com/servo/servo/pull/45135">#45135</a>).</p>
<p>This is another big update, so here’s an outline:</p>
<ul>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#security"><strong>Security</strong></a><br/>– memory safety fixes</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#work-in-progress"><strong>Work in progress</strong></a><br/>– execCommand(), Sanitizer, IndexedDB, accessibility, workers</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#embedding-api"><strong>Embedding API</strong></a><br/>– MSRV, cookies, preferences, diagnostics</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#for-users-and-developers"><strong>For users and developers</strong></a><br/>– <code>--host-file</code>, <code>--userscripts</code>, DevTools Debugger</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#more-on-the-web-platform"><strong>More on the web platform</strong></a><br/>– focus, forms, navigation, SubtleCrypto, WebGPU</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#performance"><strong>Performance</strong></a><br/>– about:memory, threads, layout, DOM, build times</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#stability"><strong>Stability</strong></a><br/>– crashes, hangs, static analysis</p>
</li>
</ul>
<h3>Security <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#security">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>Servo’s JS runtime, <strong>SpiderMonkey 140.10.0</strong>, had several <strong>memory safety bugs</strong> that have been fixed in Servo 0.3.0 with the update to SpiderMonkey 140.10.1 (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44755">#44755</a>).
For more details, see <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-7322">CVE-2026-7322</a>, <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-7323">CVE-2026-7323</a>, and <a href="https://www.mozilla.org/en-US/security/advisories/mfsa2026-36/">MFSA 2026-36</a>.</p>
<h3>Work in progress <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#work-in-progress">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>We’re continuing to implement <strong>document.exec­Command()</strong> for <strong>rich text editing</strong>, under <code>--pref dom­_exec­_command­_enabled</code> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44735">#44735</a>, <a href="https://github.com/servo/servo/pull/44973">#44973</a>, <a href="https://github.com/servo/servo/pull/44887">#44887</a>).
This release adds support for the <strong>‘back­Color’</strong>, <strong>‘fore­Color’</strong>, <strong>‘create­Link’</strong>, <strong>‘unlink’</strong>, <strong>‘superscript’</strong>, <strong>‘subscript’</strong>, and <strong>‘remove­Format’</strong> commands (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44644">#44644</a>, <a href="https://github.com/servo/servo/pull/44682">#44682</a>, <a href="https://github.com/servo/servo/pull/44657">#44657</a>, <a href="https://github.com/servo/servo/pull/44710">#44710</a>, <a href="https://github.com/servo/servo/pull/44677">#44677</a>), plus partial support for the <strong>‘insert­Paragraph’</strong> command (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44909">#44909</a>).</p>
<p>We’re also working on the <strong>Sanitizer</strong> API, under <code>--pref dom­_sanitizer­_enabled</code>.
With the feature now enabled in servoshell’s experimental mode (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/44701">#44701</a>), this release adds support for <strong>set­Comments()</strong>, <strong>set­Data­Attributes()</strong>, <strong>allow­Processing­Instruction()</strong>, <strong>remove­Processing­Instruction()</strong>, and <strong>remove­Unsafe()</strong> on <strong>Sanitizer</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/44734">#44734</a>, <a href="https://github.com/servo/servo/pull/44983">#44983</a>).</p>
<p><strong>IndexedDB</strong> continues to improve, under <code>--pref dom­_indexeddb­_enabled</code>.
This release brings a more conformant <strong>abort()</strong> on <strong>IDB­Transaction</strong> (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/43950">#43950</a>).</p>
<p>All of the features above are enabled in servoshell’s experimental mode.</p>
<p>We’ve made more progress towards <strong>accessibility</strong> support, including the <a href="https://w3c.github.io/aria/#namefromcontent"><strong>name from contents</strong></a> algorithm (<a href="https://github.com/alice">@alice</a>, <a href="https://github.com/delan">@delan</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44439">#44439</a>) and several changes towards <strong>building the accessibility tree incrementally</strong> (<a href="https://github.com/alice">@alice</a>, <a href="https://github.com/delan">@delan</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44766">#44766</a>, <a href="https://github.com/servo/servo/pull/45035">#45035</a>, <a href="https://github.com/servo/servo/pull/45207">#45207</a>, <a href="https://github.com/servo/servo/pull/44768">#44768</a>, <a href="https://github.com/servo/servo/pull/44785">#44785</a>, <a href="https://github.com/servo/servo/pull/44801">#44801</a>, <a href="https://github.com/servo/servo/pull/44767">#44767</a>, <a href="https://github.com/servo/servo/pull/45029">#45029</a>).
The latter is critical for performance in real-world web content.</p>
<p>We’re now working on <strong>SharedWorker</strong> and <strong>ServiceWorker</strong>, under <code>--pref dom­_sharedworker­_enabled</code> and <code>--pref dom­_serviceworker­_enabled</code> respectively.
This release adds support for <strong>new Shared­Worker()</strong> (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/44761">#44761</a>), and parts of the ServiceWorker API (<a href="https://github.com/gterzian">@gterzian</a>, <a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/servo/servo/pull/45082">#45082</a>, <a href="https://github.com/servo/servo/pull/44787">#44787</a>).</p>
<h3>Embedding API <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#embedding-api">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>Servo now requires <strong>Rust 1.88.0</strong> or newer, up from the old MSRV of 1.86.0 (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/44815">#44815</a>).
We run compile tests with the MSRV, but most of our testing is now done with Rust 1.95.0 (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44632">#44632</a>).</p>
<p><strong>Breaking changes</strong> to the <strong>cookies</strong> methods in our <a href="https://doc.servo.org/servo/struct.SiteDataManager.html"><strong>SiteDataManager</strong></a> API (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/servo/servo/pull/44708">#44708</a>):</p>
<ul>
<li>
<p><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_cookies"><code>clear­_cookies</code></a> now takes an additional <code>callback</code> argument, allowing it to be called async – to continue calling it sync, pass <code>None</code> as the <code>callback</code></p>
</li>
<li>
<p><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> now takes an additional <code>callback</code> argument, allowing it to be called async – to continue calling it sync, pass <code>None</code> as the <code>callback</code></p>
</li>
<li>
<p><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.set_cookie_for_url"><code>set­_cookie­_for­_url</code></a> now takes an additional <code>callback</code> argument, allowing it to be called async – to continue calling it sync, pass <code>None</code> as the <code>callback</code></p>
</li>
<li>
<p><a href="https://doc.servo.org/servo/struct.SiteDataManager.html"><code>Site­Data­Manager</code></a>::<code>set­_cookie­_for­_url­_async</code> has been removed in favour of <a href="https://doc.servo.org/servo/struct.SiteDataManager.html#method.set_cookie_for_url"><code>set­_cookie­_for­_url</code></a> – to migrate, replace <code>set­_cookie­_for­_url­_async(​callback)</code> with <code>set­_cookie­_for­_url(​Some(​Box::new(​callback)))</code></p>
</li>
</ul>
<p><strong>Breaking changes</strong> to our <a href="https://doc.servo.org/servo/struct.Preferences.html"><strong>Preferences</strong></a> API (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44307">#44307</a>):</p>
<ul>
<li>
<p><code>threadpools­_image­_cache­_workers­_max</code>, <code>threadpools­_indexeddb­_workers­_max</code>, and <code>threadpools­_webstorage­_workers­_max</code> have been <strong>removed</strong> in favour of a combined <a href="https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_workers_max"><code>thread­_pool­_workers­_max</code></a></p>
</li>
<li>
<p><code>threadpools­_fallback­_worker­_num</code> has been <strong>renamed</strong> to <a href="https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_fallback_workers"><code>thread­_pool­_fallback­_workers</code></a></p>
</li>
<li>
<p><code>threadpools­_async­_runtime­_workers­_max</code> has been <strong>renamed</strong> to <a href="https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_async_runtime_workers_max"><code>thread­_pool­_async­_runtime­_workers­_max</code></a></p>
</li>
<li>
<p><code>threadpools­_webrender­_workers­_max</code> has been <strong>renamed</strong> to <a href="https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_webrender_workers_max"><code>thread­_pool­_webrender­_workers­_max</code></a></p>
</li>
</ul>
<p>We’ve also reworked our <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><strong>DiagnosticsLogging</strong></a> API (<a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/44703">#44703</a>):</p>
<ul>
<li>
<p>You can now set options with <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><code>DiagnosticsLogging</code></a>::<a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.toggle_option"><code>toggle­_option</code></a>, and check if they are enabled with <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><code>DiagnosticsLogging</code></a>::<a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.is_enabled"><code>is­_enabled</code></a></p>
</li>
<li>
<p>Each option is a variant of <a href="https://doc.servo.org/servo/enum.DiagnosticsLoggingOption.html"><code>DiagnosticsLoggingOption</code></a>, a new type that also has useful methods for exposing these options in embedder UI</p>
</li>
<li>
<p><strong>(Breaking change)</strong> <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><code>DiagnosticsLogging</code></a> no longer has <code>pub</code> fields representing each option – to migrate, replace field writes and field reads with <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.toggle_option"><code>toggle­_option</code></a> and <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.is_enabled"><code>is­_enabled</code></a> respectively</p>
</li>
<li>
<p><strong>(Breaking change)</strong> <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><code>DiagnosticsLogging</code></a>::<a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.extend_from_string"><code>extend­_from­_string</code></a> no longer accepts a <code>help</code> option – this option only existed to support servoshell’s <code>-Z help</code> / <code>--debug=help</code> option, so the code implementing it has been moved to servoshell</p>
</li>
</ul>
<h3>For users and developers <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#for-users-and-developers">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p><strong>servoshell</strong> has two new options:</p>
<ul>
<li>
<p>You can now configure the path to a <a href="https://en.wikipedia.org/w/index.php?title=Hosts_(file)&amp;oldid=1360805760"><strong>hosts file</strong></a> with <strong>--host-file=</strong> (singular), as an alternative to the <strong>HOST_FILE</strong> (singular) environment variable (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44880">#44880</a>).</p>
</li>
<li>
<p>You can now provide a directory of <strong>user scripts</strong> to run in every document with <strong>--userscripts=</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44754">#44754</a>).</p>
</li>
</ul>
<p>When using the <strong>Debugger</strong> tab in the Firefox <strong>DevTools</strong>:</p>
<ul>
<li>
<p>You can now <a href="https://antongunnarsson.com/devtools-blackbox/">“blackbox”</a> a script by clicking <strong>Ignore source</strong> (<a href="https://github.com/freyacodes">@freyacodes</a>, <a href="https://github.com/servo/servo/pull/44359">#44359</a>).
This prevents breakpoints from being hit inside that script, and it should also allow you to step through execution in the debugger without pausing inside that script.</p>
</li>
<li>
<p>The <strong>Scopes</strong> panel is more accurate now (<a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/servo/servo/pull/44765">#44765</a>).</p>
</li>
</ul>
<p>For developers of Servo itself, please note that <a href="https://book.servo.org/contributing/getting-started.html#ai-contributions">per project policy</a>, you <strong>must not</strong> use the output of <strong>large language models</strong> or other <strong>generative AI tools</strong> in your contributions.
To help us enforce that, we now have CI checks that reject AI agents as coauthors (<a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/delan">@delan</a>, <a href="https://github.com/servo/servo/pull/44723">#44723</a>).</p>
<p>We’ve also fixed build issues with <code>--features vello</code> (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44875">#44875</a>, <a href="https://github.com/servo/servo/pull/45036">#45036</a>).</p>
<h3>More on the web platform <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#more-on-the-web-platform">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>We’ve improved the default appearance of <strong>&lt;dl&gt;</strong>, <strong>&lt;ol&gt;</strong>, <strong>&lt;ul&gt;</strong>, <strong>&lt;table&gt;</strong>, <strong>&lt;thead&gt;</strong>, <strong>&lt;tbody&gt;</strong>, <strong>&lt;tfoot&gt;</strong>, <strong>&lt;tr&gt;</strong>, <strong>&lt;td&gt;</strong>, <strong>&lt;th&gt;</strong>, <strong>&lt;dir&gt;</strong>, <strong>&lt;menu&gt;</strong>, and <strong>&lt;form&gt;</strong> (<a href="https://github.com/avis137">@avis137</a>, <a href="https://github.com/servo/servo/pull/44837">#44837</a>, <a href="https://github.com/servo/servo/pull/44920">#44920</a>).</p>
<p><strong>CryptoKey</strong> is now <strong>serializable</strong>, allowing it to be used in structuredClone() and postMessage() (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/45163">#45163</a>).</p>
<p>We’ve improved <strong>JS error messages</strong> in several parts of the DOM (<a href="https://github.com/n0blenote">@n0blenote</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/PuercoPop">@PuercoPop</a>, <a href="https://github.com/servo/servo/pull/44704">#44704</a>, <a href="https://github.com/servo/servo/pull/45186">#45186</a>, <a href="https://github.com/servo/servo/pull/44656">#44656</a>).</p>
<p>We’ve improved the conformance of <strong>form submission</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44943">#44943</a>, <a href="https://github.com/servo/servo/pull/44953">#44953</a>, <a href="https://github.com/servo/servo/pull/44954">#44954</a>, <a href="https://github.com/servo/servo/pull/44957">#44957</a>), <strong>tab navigation</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44684">#44684</a>), <strong>javascript: url navigation</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43490">#43490</a>), <strong>‘Refresh’ headers</strong> and <strong>&lt;meta http-equiv=Refresh&gt;</strong> (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/45113">#45113</a>, <a href="https://github.com/servo/servo/pull/45116">#45116</a>), <strong>‘line-break: anywhere’</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/44609">#44609</a>), <strong>assign()</strong> on <strong>Location</strong> (<a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44298">#44298</a>), <strong>crypto.subtle.derive­Bits()</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/44706">#44706</a>), <strong>get­Computed­Style()</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/44856">#44856</a>), <strong>performance.measure()</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/44675">#44675</a>), <strong>read­As­Data­URL()</strong> on <strong>File­Reader</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44897">#44897</a>, <a href="https://github.com/servo/servo/pull/44924">#44924</a>), <strong>stream()</strong> on <strong>Blob</strong> (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/45133">#45133</a>), and <strong>ML-KEM</strong> in <strong>Subtle­Crypto</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/45153">#45153</a>).</p>
<p>We’ve also landed improvements to <strong>GPU­Supported­Limits</strong> (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/45114">#45114</a>), <strong>GPU­Texture</strong> (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/45154">#45154</a>), <strong>create­Bind­Group()</strong> on <strong>GPU­Device</strong> (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/45140">#45140</a>), and other <strong>WebGPU</strong> features (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/45097">#45097</a>).</p>
<p>We’ve fixed bugs related to <strong>&lt;svg&gt;</strong> with <strong>‘Content-Security-Policy’</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/44974">#44974</a>), <strong>‘:active’</strong> (<a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43953">#43953</a>), <strong>‘:hover’</strong> (<a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43979">#43979</a>), <strong>‘align-items’</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44396">#44396</a>), <strong>‘border-image-outset’</strong> (<a href="https://github.com/lumiscosity">@lumiscosity</a>, <a href="https://github.com/servo/servo/pull/45039">#45039</a>), <strong>‘padding’</strong> with <strong>‘overflow: scroll’</strong> (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/servo/servo/pull/44263">#44263</a>), <strong>‘pointerup’ events</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44666">#44666</a>), <strong>‘slotchange’ events</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44688">#44688</a>), <strong>dynamic import()</strong> (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/servo/servo/pull/44741">#44741</a>), and <strong>clip()</strong> on <strong>CanvasRenderingContext2D</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44831">#44831</a>).</p>
<h3>Performance <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#performance">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>We’ve built a tool that will help us improve <strong>‘about:memory’</strong> by finding untracked allocations (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/44674">#44674</a>, <a href="https://github.com/servo/servo/pull/44980">#44980</a>).</p>
<p>Servo now requires fewer OS threads per CPU, after we combined the <strong>thread pools</strong> for the image cache, web storage, and IndexedDB (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44307">#44307</a>).</p>
<p>We’ve landed a bunch of <strong>layout</strong> optimisations:</p>
<ul>
<li>
<p>The fragment tree is now <strong>immutable</strong> for the most part, with small pockets of interior mutability where mutability is needed.
This means that most fragment tree accesses no longer have to incur the runtime cost of borrowing an <a href="https://docs.rs/atomic_refcell/0.1.14/atomic_refcell/">AtomicRefCell</a> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/44849">#44849</a>).</p>
</li>
<li>
<p>Two steps in the layout process, calculating <strong>containing blocks</strong> and building the <strong>stacking context tree</strong>, require traversing the fragment tree.
This can be expensive, but we’ve now combined them into a <strong>single fragment tree traversal</strong> in most cases (<a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44911">#44911</a>, <a href="https://github.com/servo/servo/pull/45210">#45210</a>).</p>
</li>
<li>
<p>Another step in the layout process, calculating <strong>scrollable overflow</strong>, used to require traversing the entire fragment tree.
We’ve effectively eliminated that traversal, by making the calculation both <strong>lazy</strong> and <strong>incremental</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/44854">#44854</a>).</p>
</li>
<li>
<p>We’ve improved the caching of fragments, shaping results, and other layout results between reflows (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/45038">#45038</a>, <a href="https://github.com/servo/servo/pull/44769">#44769</a>).</p>
</li>
<li>
<p>We’ve made incremental fragment layout more precise (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44925">#44925</a>).</p>
</li>
<li>
<p>We’ve reduced the memory usage of text shaping (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/44609">#44609</a>).</p>
</li>
</ul>
<p><strong>DOM attributes</strong> are much more efficient in this release:</p>
<ul>
<li>
<p>When scripts write attribute values, we avoid serialising them until the attribute is read back by a script (if ever), speeding up frequent writes to inline styles by up to 25% (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44931">#44931</a>).</p>
</li>
<li>
<p>When we parse attributes in HTML or read attribute values internally, we avoid constructing <a href="https://developer.mozilla.org/en-US/docs/Web/API/Attr">Attr</a> nodes until a script <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNode">actually</a> <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/attributes">needs</a> them, reducing memory usage and making garbage collection less likely (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44209">#44209</a>, <a href="https://github.com/servo/servo/pull/45023">#45023</a>, <a href="https://github.com/servo/servo/pull/45031">#45031</a>, <a href="https://github.com/servo/servo/pull/45060">#45060</a>).</p>
</li>
</ul>
<p>We’ve eliminated a traversal of the whole DOM tree whenever an <strong>&lt;iframe&gt;</strong> is attached to the tree, which is especially noticeable when parsing documents with many &lt;iframe&gt; tags (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/45236">#45236</a>).</p>
<p>Stylesheet locks now use <a href="https://docs.rs/atomic_refcell/0.1.14/atomic_refcell/">AtomicRefCell</a>, which is even more efficient than a <a href="https://docs.rs/parking_lot/0.12.5/parking_lot/">parking_lot</a>::<a href="https://docs.rs/parking_lot/0.12.5/parking_lot/type.RwLock.html">RwLock</a> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44883">#44883</a>).</p>
<p>On OpenHarmony, we now have a real refresh driver for reduced idle CPU usage (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44927">#44927</a>), and we now cache the font list on disk for faster startup (<a href="https://github.com/RichardTjokroutomo">@RichardTjokroutomo</a>, <a href="https://github.com/d-desyatkin">@d-desyatkin</a>, <a href="https://github.com/servo/servo/pull/44158">#44158</a>).</p>
<p>We’ve also reduced allocations, GC rooting steps, and other operations in many parts of Servo (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/SteveSharonSam">@SteveSharonSam</a>, <a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/nodelpit">@nodelpit</a>, <a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44961">#44961</a>, <a href="https://github.com/servo/servo/pull/44944">#44944</a>, <a href="https://github.com/servo/servo/pull/44972">#44972</a>, <a href="https://github.com/servo/servo/pull/45231">#45231</a>, <a href="https://github.com/servo/servo/pull/45078">#45078</a>, <a href="https://github.com/servo/servo/pull/44662">#44662</a>, <a href="https://github.com/servo/servo/pull/44679">#44679</a>, <a href="https://github.com/servo/servo/pull/44967">#44967</a>, <a href="https://github.com/servo/servo/pull/44963">#44963</a>, <a href="https://github.com/servo/servo/pull/44933">#44933</a>, <a href="https://github.com/servo/servo/pull/44935">#44935</a>, <a href="https://github.com/servo/servo/pull/44905">#44905</a>).</p>
<p>To improve Servo’s <strong>build times</strong>, we’re moving more code out of our massive <strong>script crate</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/44598">#44598</a>, <a href="https://github.com/servo/servo/pull/44636">#44636</a>, <a href="https://github.com/servo/servo/pull/44823">#44823</a>), and reduced the size of our dependency tree (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44818">#44818</a>).</p>
<h3>Stability <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#stability">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>Several crashes and hangs have been fixed:</p>
<ul>
<li>in <strong>‘content’</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/45227">#45227</a>, <a href="https://github.com/servo/servo/pull/44762">#44762</a>)</li>
<li>in <strong>Media­Stream</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44781">#44781</a>)</li>
<li>in <strong>item()</strong> on <strong>attributes</strong> on <strong>Element</strong> (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/44721">#44721</a>)</li>
<li>in <strong>append­Rule()</strong> on <strong>CSS­Keyframes­Rule</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/45173">#45173</a>)</li>
<li>in <strong>init­Event()</strong> on <strong>Focus­Event</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44870">#44870</a>)</li>
<li>in <strong>stop()</strong> on <strong>Window</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44804">#44804</a>)</li>
<li>in <code>document.exec­Command(​"delete")</code> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44748">#44748</a>)</li>
<li>in <code>--debug-mozjs</code> builds (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/servo/servo/pull/44745">#44745</a>, <a href="https://github.com/servo/servo/pull/45001">#45001</a>)</li>
<li>when evaluating scripts in DevTools while paused (<a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/pull/45050">#45050</a>)</li>
<li>when previewing some JS values in DevTools (<a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/pull/45054">#45054</a>)</li>
<li>when shaping zero-width spaces in layout (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/45176">#45176</a>)</li>
<li>when toggling servoshell’s experimental mode at runtime (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/45226">#45226</a>)</li>
</ul>
<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/Gae24">@Gae24</a>, <a href="https://github.com/MavenRain">@MavenRain</a>, <a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/SteveSharonSam">@SteveSharonSam</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/elomscansio">@elomscansio</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44712">#44712</a>, <a href="https://github.com/servo/servo/pull/44759">#44759</a>, <a href="https://github.com/servo/servo/pull/44879">#44879</a>, <a href="https://github.com/servo/servo/pull/45014">#45014</a>, <a href="https://github.com/servo/servo/pull/45058">#45058</a>, <a href="https://github.com/servo/servo/pull/45061">#45061</a>, <a href="https://github.com/servo/servo/pull/45076">#45076</a>, <a href="https://github.com/servo/servo/pull/45098">#45098</a>, <a href="https://github.com/servo/servo/pull/45110">#45110</a>, <a href="https://github.com/servo/servo/pull/45149">#45149</a>, <a href="https://github.com/servo/servo/pull/45117">#45117</a>, <a href="https://github.com/servo/servo/pull/45184">#45184</a>, <a href="https://github.com/servo/servo/pull/45201">#45201</a>, <a href="https://github.com/servo/servo/pull/44806">#44806</a>, <a href="https://github.com/servo/servo/pull/44930">#44930</a>, <a href="https://github.com/servo/servo/pull/44942">#44942</a>, <a href="https://github.com/servo/servo/pull/44946">#44946</a>, <a href="https://github.com/servo/servo/pull/45233">#45233</a>, <a href="https://github.com/servo/servo/pull/45181">#45181</a>, <a href="https://github.com/servo/servo/pull/44659">#44659</a>, <a href="https://github.com/servo/servo/pull/44660">#44660</a>, <a href="https://github.com/servo/servo/pull/44664">#44664</a>, <a href="https://github.com/servo/servo/pull/44668">#44668</a>, <a href="https://github.com/servo/servo/pull/44992">#44992</a>, <a href="https://github.com/servo/servo/pull/45000">#45000</a>, <a href="https://github.com/servo/servo/pull/45081">#45081</a>, <a href="https://github.com/servo/servo/pull/45009">#45009</a>, <a href="https://github.com/servo/servo/pull/45225">#45225</a>, <a href="https://github.com/servo/servo/pull/45087">#45087</a>, <a href="https://github.com/servo/servo/pull/45244">#45244</a>, <a href="https://github.com/servo/servo/pull/45245">#45245</a>, <a href="https://github.com/servo/servo/pull/45247">#45247</a>, <a href="https://github.com/servo/servo/pull/44663">#44663</a>, <a href="https://github.com/servo/servo/pull/44665">#44665</a>, <a href="https://github.com/servo/servo/pull/44993">#44993</a>, <a href="https://github.com/servo/servo/pull/45040">#45040</a>, <a href="https://github.com/servo/servo/pull/45053">#45053</a>, <a href="https://github.com/servo/servo/pull/44647">#44647</a>, <a href="https://github.com/servo/servo/pull/44671">#44671</a>, <a href="https://github.com/servo/servo/pull/44681">#44681</a>, <a href="https://github.com/servo/servo/pull/44717">#44717</a>, <a href="https://github.com/servo/servo/pull/44733">#44733</a>, <a href="https://github.com/servo/servo/pull/44686">#44686</a>, <a href="https://github.com/servo/servo/pull/44653">#44653</a>).</p>
<h3>New contributors <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#new-contributors">
        <span class="icon hashlink"><i class="fas fa-link"/></span>
      </a></h3>
<p>A special thanks to the following people for landing their first patch in Servo:</p>
<ul>
<li>AbdAlRahman Gad (<a href="https://github.com/AbdAlRahmanGad">@AbdAlRahmanGad</a>, <a href="https://github.com/servo/servo/pull/45213">#45213</a>)</li>
<li>Onyeka Obi (<a href="https://github.com/MavenRain">@MavenRain</a>, <a href="https://github.com/servo/servo/pull/44806">#44806</a>)</li>
<li>Steve Sharon Sam (<a href="https://github.com/SteveSharonSam">@SteveSharonSam</a>, <a href="https://github.com/servo/servo/pull/45030">#45030</a>)</li>
<li>avis137 (<a href="https://github.com/avis137">@avis137</a>, <a href="https://github.com/servo/servo/pull/44837">#44837</a>)</li>
<li>Xabier Rodríguez (<a href="https://github.com/calvaris">@calvaris</a>, <a href="https://github.com/servo/servo/pull/45084">#45084</a>)</li>
<li>June (<a href="https://github.com/kimjune01">@kimjune01</a>, <a href="https://github.com/servo/servo/pull/44816">#44816</a>)</li>
<li>Matt Van Horn (<a href="https://github.com/mvanhorn">@mvanhorn</a>, <a href="https://github.com/servo/servo/pull/44740">#44740</a>)</li>
<li>nicole (<a href="https://github.com/n0blenote">@n0blenote</a>, <a href="https://github.com/servo/servo/pull/44704">#44704</a>)</li>
<li>panxt8 (<a href="https://github.com/panxt8">@panxt8</a>, <a href="https://github.com/servo/servo/pull/44991">#44991</a>)</li>
</ul>
<p>Interested in helping build a web browser?
Take a look at our <a href="https://starters.servo.org/">curated list</a> of issues that are good for new contributors!</p>
<h3>Donations <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-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>7659 USD/month</strong> (+4.2% from April) 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/2026-05/#:~: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>35 GitHub users</strong> (+2 from April) 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>7659</strong> USD/month</div>
        <div/>
        <div/>
        <div style="padding-right: 1em;"><strong>10000</strong></div>
    </div>
    <progress max="10000" value="7659"/>
</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-06-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-06-30T00:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/06/30/Rust-1.96.1/</id>
    <link href="https://blog.rust-lang.org/2026/06/30/Rust-1.96.1/" rel="alternate" title="Announcing Rust 1.96.1" type="text/html"/>
    <title xml:lang="en">Announcing Rust 1.96.1</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p>The Rust team has published a new point release of Rust, 1.96.1. Rust is a programming language that is empowering everyone to build reliable and efficient software.</p>
<p>If you have a previous version of Rust installed via rustup, getting Rust 1.96.1 is as easy as:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><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.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/30/Rust-1.96.1/#what-s-in-1-96-1"/>
What's in 1.96.1</h3>
<p>Rust 1.96.1 fixes:</p>
<ul>
<li><a href="https://github.com/rust-lang/cargo/pull/17131" rel="external">Missing retries / timeouts in Cargo's HTTP client</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158214" rel="external">Miscompilation in a MIR optimization</a></li>
</ul>
<p>It also <a href="https://github.com/rust-lang/cargo/pull/17140" rel="external">fixes</a> three CVEs
affecting libssh2 (which is compiled into Cargo):</p>
<ul>
<li><a href="https://www.cve.org/CVERecord?id=CVE-2025-15661" rel="external">CVE-2025-15661</a></li>
<li><a href="https://www.cve.org/CVERecord?id=CVE-2026-55199" rel="external">CVE-2026-55199</a></li>
<li><a href="https://www.cve.org/CVERecord?id=CVE-2026-55200" rel="external">CVE-2026-55200</a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/30/Rust-1.96.1/#contributors-to-1-96-1"/>
Contributors to 1.96.1</h4>
<p>Many people came together to create Rust 1.96.1. We couldn't have done it without all of you. <a href="https://thanks.rust-lang.org/rust/1.96.1/" rel="external">Thanks!</a></p></div>
    </content>
    <updated>2026-06-30T00:00:00Z</updated>
    <published>2026-06-30T00: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-07-15T14:56:21Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/security/?p=2922</id>
    <link href="https://blog.mozilla.org/security/2026/06/29/improving-transparency-and-assurance-in-the-web-pki-mozilla-root-store-policy-v3-1/" rel="alternate" type="text/html"/>
    <title>Improving Transparency and Assurance in the Web PKI: Mozilla Root Store Policy v3.1</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Mozilla remains committed to maintaining a secure, trustworthy, and transparent Web PKI. Today we are announcing the publication of Mozilla Root Store Policy (MRSP) version 3.1, effective July 1, 2026. … <a class="go" href="https://blog.mozilla.org/security/2026/06/29/improving-transparency-and-assurance-in-the-web-pki-mozilla-root-store-policy-v3-1/">Read more</a></p>
<p>The post <a href="https://blog.mozilla.org/security/2026/06/29/improving-transparency-and-assurance-in-the-web-pki-mozilla-root-store-policy-v3-1/">Improving Transparency and Assurance in the Web PKI: Mozilla Root Store Policy v3.1</a> appeared first on <a href="https://blog.mozilla.org/security">Mozilla Security Blog</a>.</p></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Mozilla remains committed to maintaining a secure, trustworthy, and transparent Web PKI. Today we are announcing the publication of <a href="https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/policy/">Mozilla Root Store Policy</a> (MRSP) version 3.1, effective July 1, 2026.</p>
<p>While previous policy updates focused heavily on certificate revocation, automation, and operational resilience, MRSP v3.1 focuses on a different challenge: ensuring that Certification Authority (CA) operations are sufficiently transparent, understandable, and auditable.</p>
<p>Trust in the Web PKI depends not only on technical requirements, but also on the ability of Mozilla, auditors, and the broader community to understand how CA systems are designed, operated, and assessed. MRSP v3.1 introduces new requirements intended to improve the quality of CA documentation and strengthen independent assurance of the design and effectiveness of controls that protect CA systems.</p>
<h3><b>Improving CP/CPS Documentation</b></h3>
<p>Certification Practice Statements (CPSes) and combined Certificate Policy / Certification Practice Statement documents (CP/CPSes) are among the most important public documents published by a CA. They describe how a CA conducts its operations and meets industry requirements.</p>
<p>Over the years, we have seen significant variation in the quality, structure, and level of detail provided in CP/CPS documentation. Some documents provide extensive implementation detail, while others rely heavily on incorporation by reference or provide only high-level descriptions of CA practices.</p>
<p>The revised policy will continue to require conformance with RFC 3647, as modified by applicable CA/Browser Forum requirements. Improvements to section 3.3 in the MRSP will establish clearer expectations regarding the content and quality of CP/CPS documentation. The new requirements emphasize that documentation must be explicit, bounded, auditable, and sufficiently detailed to describe the CA operator’s certificate issuance and management activities, while also establishing requirements for version control, accessibility, and ongoing maintenance. The objective is to ensure that a technically competent reviewer will be better-able to determine what commitments the CA has made, how those commitments are implemented, and whether the documented practices support technical, operational, and performance oversight.</p>
<p>Mozilla believes that these new CP/CPS requirements will improve transparency, reduce misunderstandings, support more effective audits, and help reduce the risk of certificate misissuance by ensuring that operational practices are documented accurately, consistently, and in sufficient detail to permit meaningful review.</p>
<h3><b>Introducing Detailed Controls Reports</b></h3>
<p>A second major enhancement in MRSP v3.1 is the introduction of Detailed Controls Reports (DCRs). Traditional WebTrust and ETSI audit reports provide valuable independent assurance regarding compliance with established criteria. However, they generally provide only limited visibility into the specific controls, testing procedures, and operational environments that support those conclusions.</p>
<p>Beginning with audit periods starting on or after July 1, 2027, CA operators with root certificates enabled for TLS website authentication will be required to obtain a DCR. The purpose of the DCR is to provide CA management, auditors, and Mozilla with greater visibility into the controls, testing, and operating effectiveness of CA systems that support compliance with the CA/Browser Forum’s TLS Baseline Requirements and Network and Certificate System Security Requirements. Mozilla generally expects to review DCRs only on an as-needed basis, such as during compliance reviews, incident investigations, root inclusion evaluations, or other oversight activities.</p>
<p>A DCR must include:</p>
<ul>
<li>The scope and boundaries of the audited CA systems;</li>
<li>Applicable audit criteria;</li>
<li>Controls implemented by the CA;</li>
<li>The auditor’s testing procedures;</li>
<li>Results of control testing; and</li>
<li>Information regarding control exceptions or deficiencies.</li>
</ul>
<p>Mozilla expects that DCRs will complement existing audit reports and strengthen transparency and assurance by providing additional detail regarding system boundaries, control implementation, testing procedures, and control effectiveness that is not typically available in traditional audit reports. Effective compliance requires more than documented policies and successful audits; it also requires management understanding, oversight, and engagement. By providing greater visibility into CA systems, controls, testing activities, and operational risks, DCRs can help reinforce a strong tone at the top regarding compliance expectations, support informed decision-making and resource allocation, enable earlier identification of weaknesses, and promote a culture of continuous improvement. The intent is not to replace existing audit reports, but to provide additional information that supports effective governance, oversight, and informed trust decisions.</p>
<h3><b>Additional Clarifications and Improvements</b></h3>
<p>MRSP v3.1 also includes several targeted clarifications and refinements:</p>
<ul>
<li>aligns Mozilla’s mass revocation planning requirements with the corresponding CA/Browser Forum Baseline Requirements, helping ensure consistency across compliance frameworks;</li>
<li>clarifies audit expectations for root inclusion requests, including requirements relating to audit continuity and root key generation ceremonies;</li>
<li>requires root CA key pairs submitted for inclusion to have been generated within the previous five years, helping ensure that newly included roots are based on contemporary cryptographic practices and controls; and</li>
<li>clarifies expectations when ownership or operational control of a CA changes, helping ensure that Mozilla receives timely notice and can evaluate the impact of acquisitions or organizational changes on continued compliance.</li>
</ul>
<h3><b>Looking Forward</b></h3>
<p>Mozilla recognizes that these changes will require preparation by CA operators, auditors, and other ecosystem participants. To support implementation, Mozilla is publishing accompanying wiki guidance regarding both <a href="https://wiki.mozilla.org/CA/CP-CPS_Guidance">CP/CPS Documentation</a> and <a href="https://wiki.mozilla.org/CA/DCRs">Detailed Controls Reports</a>.</p>
<p>As with previous policy updates, these changes were informed by discussions with CA operators, auditors, and members of the Web PKI community. We appreciate the feedback received during the review process and look forward to continued collaboration as the ecosystem evolves.</p>
<p>Mozilla has a longstanding focus on building confidence in the Web PKI through transparency, accountability, and continuous improvement. By requiring higher-quality CP/CPS documentation and strengthening independent assurance, MRSP v3.1 advances Mozilla’s commitment to protecting its users and maintaining their trust in the systems that help secure the web.</p>
<p>The post <a href="https://blog.mozilla.org/security/2026/06/29/improving-transparency-and-assurance-in-the-web-pki-mozilla-root-store-policy-v3-1/">Improving Transparency and Assurance in the Web PKI: Mozilla Root Store Policy v3.1</a> appeared first on <a href="https://blog.mozilla.org/security">Mozilla Security Blog</a>.</p></div>
    </content>
    <updated>2026-06-29T11:33:46Z</updated>
    <published>2026-06-29T11:33:46Z</published>
    <category term="Announcements"/>
    <category term="CA Program"/>
    <category term="CCADB"/>
    <category term="certificate authority"/>
    <category term="Certificates"/>
    <category term="MRSP"/>
    <category term="root store policy"/>
    <category term="TLS"/>
    <author>
      <name>Ben Wilson</name>
    </author>
    <source>
      <id>https://blog.mozilla.org/security/</id>
      <link href="https://blog.mozilla.org/security/feed/" rel="self" type="application/rss+xml"/>
      <link href="https://blog.mozilla.org/security/" rel="alternate" type="text/html"/>
      <title>Mozilla Security Blog</title>
      <updated>2026-06-29T11:33:46Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148795</id>
    <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-june-29-2026/148795" rel="alternate" type="text/html"/>
    <title>Firefox Profiler Deployment (June 29, 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] First typed array: Allow profile.shared.stackTable.frame to be an Int32Array (<a href="https://github.com/firefox-devtools/profiler/pull/6087" rel="noopener nofollow ugc">#6087</a>)</li>
<li>[Nazım Can Altınova] Show more user friendly errors for unsupported profile version in both the frontend and the cli (<a href="https://github.com/firefox-devtools/profiler/pull/6107" rel="noopener nofollow ugc">#6107</a>)</li>
<li>[fatadel] Expose counter information in profiler-cli (<a href="https://github.com/firefox-devtools/profiler/pull/6084" rel="noopener nofollow ugc">#6084</a>)</li>
</ul>
<p><strong>Other Changes:</strong></p>
<ul>
<li>[Nazım Can Altınova] Bump profiler-cli version to 0.3.0 (<a href="https://github.com/firefox-devtools/profiler/pull/6104" rel="noopener nofollow ugc">#6104</a>)</li>
<li>[Markus Stange] Split getSelfAndTotal. (<a href="https://github.com/firefox-devtools/profiler/pull/6113" rel="noopener nofollow ugc">#6113</a>)</li>
<li>[Markus Stange] Add missing transform shortcut key handling for S (focus-self) (<a href="https://github.com/firefox-devtools/profiler/pull/6117" rel="noopener nofollow ugc">#6117</a>)</li>
<li>[Markus Stange] Remove unused isInverted prop from FlameGraphCanvas. (<a href="https://github.com/firefox-devtools/profiler/pull/6116" rel="noopener nofollow ugc">#6116</a>)</li>
<li>[Markus Stange] Change sidebar splitter CSS to only apply to the sidebar, not to all splitters under .DetailsContainer (<a href="https://github.com/firefox-devtools/profiler/pull/6114" rel="noopener nofollow ugc">#6114</a>)</li>
<li>[Markus Stange] Pass callNodeInfo to handleCallNodeTransformShortcut. (<a href="https://github.com/firefox-devtools/profiler/pull/6115" rel="noopener nofollow ugc">#6115</a>)</li>
<li>[Markus Stange] Move column declarations out into a separate file (<a href="https://github.com/firefox-devtools/profiler/pull/6119" rel="noopener nofollow ugc">#6119</a>)</li>
<li>[fatadel] Keep menu panels above the selected-marker tooltip (<a href="https://github.com/firefox-devtools/profiler/pull/6125" rel="noopener nofollow ugc">#6125</a>)</li>
<li>[Nazım Can Altınova] Make sure to always sanitize source contents even when no PII sanitization is requested (<a href="https://github.com/firefox-devtools/profiler/pull/6127" rel="noopener nofollow ugc">#6127</a>)</li>
<li>[Markus Stange] Compute FlameGraphTiming rows lazily (<a href="https://github.com/firefox-devtools/profiler/pull/6126" rel="noopener nofollow ugc">#6126</a>)</li>
<li>[Markus Stange] Create a non-connected FlameGraph component (<a href="https://github.com/firefox-devtools/profiler/pull/6118" rel="noopener nofollow ugc">#6118</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 (June 29, 2026) (<a href="https://github.com/firefox-devtools/profiler/pull/6130" rel="noopener nofollow ugc">#6130</a>)</li>
</ul>
<p>Big thanks to our amazing localizers for making this release possible:</p>
<ul>
<li>de: Michael Köhler</li>
<li>el: Jim Spentzos</li>
<li>en-GB: Ian Neal</li>
<li>es-CL: ravmn</li>
<li>fr: Théo Chevalier</li>
<li>fur: Fabio Tomat</li>
<li>fy-NL: Fjoerfoks</li>
<li>ia: Melo46</li>
<li>it: Francesco Lodolo [:flod]</li>
<li>nl: Mark Heijl</li>
<li>ru: Valery Ledovskoy</li>
<li>sv-SE: Luna Jernberg</li>
<li>zh-TW: Pin-guang Chen</li>
</ul>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/firefox-profiler-deployment-june-29-2026/148795">Read full topic</a></p></div>
    </summary>
    <updated>2026-06-29T09:25:09Z</updated>
    <published>2026-06-29T09:25:09Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>canova</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-june-29-2026/148795.rss" title="Firefox Profiler Deployment (June 29, 2026)"/>
      <updated>2026-07-15T16:59:02Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.thunderbird.net/?p=4337</id>
    <link href="https://blog.thunderbird.net/2026/06/thunderbird-monthly-development-digest-june-2026/" rel="alternate" type="text/html"/>
    <title>Thunderbird Monthly Development Digest: June 2026</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Welcome back from the Thunderbird development team! The past few months have been exceptionally busy across the project. As we approach the midpoint of the year, we’ve been focused on a mixture of delivering user-facing features, investing in long-term architectural improvements, and preparing for the next ESR cycle. A significant amount of effort has gone […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/06/thunderbird-monthly-development-digest-june-2026/">Thunderbird Monthly Development Digest: June 2026</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/06/blog-banner-developer6-768x432.jpg" width="640"/></p>
<p>Welcome back from the Thunderbird development team!</p>



<p>The past few months have been exceptionally busy across the project. As we approach the midpoint of the year, we’ve been focused on a mixture of delivering user-facing features, investing in long-term architectural improvements, and preparing for the next ESR cycle.</p>



<p>A significant amount of effort has gone into modernizing Exchange support, where the team is now approaching Graph API feature parity with our existing EWS implementation. At the same time, progress has continued on the Account Hub, the Global Message Database, and improvements to the add-ons ecosystem that will help extension developers transition toward a more secure and sustainable future.</p>



<p>Behind the scenes, we’ve also continued the less visible but equally important work of maintaining a large application: adapting to upstream platform changes, improving test reliability, addressing long-standing bugs, and supporting the growing community of contributors who help move Thunderbird forward every day.</p>



<p>This month we’d especially like to recognize one of those contributors, Maxe, whose sustained efforts tackling decades-old MIME bugs have been making a meaningful impact across the codebase.</p>



<h3 class="wp-block-heading"><strong>Exchange Email Support</strong></h3>



<p>One of the largest efforts underway in Thunderbird continues to be our modernization of Exchange support.</p>



<p>Over the past several months, the team has pushed through multiple Graph API implementation phases and is now entering the final stretch toward feature parity with our existing EWS implementation. At the time of writing, only a small number of remaining email features separate the two implementations, with completion expected imminently.</p>



<p>Reaching this point has involved considerably more than simply implementing new API calls. The work required substantial investment in shared understanding, protocol abstractions, automated code generation, testing frameworks, request batching, synchronization mechanisms, and interoperability between legacy and modern components. Many of these improvements will continue to benefit future protocol work long after Graph support itself is complete.</p>



<p>A notable development came from our ongoing engagement with Microsoft, and following discussions around Graph API permissions, Microsoft confirmed that approved mail clients such as Thunderbird will continue to be able to obtain user consent for permissions that were previously unavailable to third-party applications. This removed a significant long-term uncertainty around Graph support and helps to ensure Thunderbird users can continue connecting Exchange accounts without requiring administrator intervention.</p>



<p>With email functionality nearing completion, the team has already begun planning the next stage of Exchange support, including calendar integration work that will build upon the foundation established over the past year.</p>



<p><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1995792"><u>Keep track of our Graph API implementation here.</u></a> </p>



<h3 class="wp-block-heading"><strong>20+ year old MIME bugs?! – Contributor Spotlight</strong></h3>



<p>This month we’d like to highlight <strong>Maxe</strong>, who has been on an impressive run tackling some of Thunderbird’s oldest and most stubborn MIME issues.</p>



<p>Open source projects often benefit from contributors who quietly and consistently improve areas of the codebase that most people would rather avoid. Over the past several months, Maxe has become one of those contributors for Thunderbird.</p>



<p>What began as a handful of fixes has grown into a sustained effort to tackle some of the oldest MIME-related bugs in our tracker. Many of these issues date back decades, touching parts of the mail stack that have accumulated years of edge cases, historical assumptions, and compatibility quirks.</p>



<p>MIME handling sits at the heart of how Thunderbird interprets messages, attachments, encodings, and content types. While users rarely think about it when everything works correctly, it is often involved when messages display incorrectly, attachments behave unexpectedly, or unusual emails expose long-standing inconsistencies. Fixing these issues requires a deep understanding of both email standards and Thunderbird’s historical behavior.</p>



<p>What has impressed us most is not any single patch, but the consistency. Over the past few months Maxe has continued to identify issues, develop fixes, respond to review feedback, and refine solutions until they work reliably across platforms and message types. Along the way, several fixes have uncovered additional problems and improved behaviour in places that weren’t originally expected.</p>



<p>This kind of work is rarely flashy. It involves patiently navigating decades-old code, reproducing obscure bugs, and developing enough confidence to modify systems that affect virtually every Thunderbird user. Yet these are exactly the sorts of contributions that make open source software better over the long term.</p>



<p>On behalf of the team, thank you Maxe for the energy, persistence, and technical skill you’ve brought to Thunderbird this year. Your work is making a real difference.</p>



<h3 class="wp-block-heading"><strong>Add-ons, Extensions and Ecosystem</strong></h3>



<p>The add-ons ecosystem remains an important part of Thunderbird, and over the last few months we’ve continued working toward a safer and more maintainable extension platform.</p>



<p>One significant decision was the postponement of experiment deprecation on the Monthly Release channel for an additional year. Feedback from extension developers made it clear that many maintainers needed more time to migrate away from legacy experiment APIs, and we want to ensure that transition is successful rather than disruptive.</p>



<p>This extra time allows us to focus on expanding official WebExtension APIs, improve migration paths, and work directly with extension developers to understand their priorities. To support this effort, we’re preparing a broader outreach initiative later this year that will gather feedback from experiment maintainers and help guide future API development.</p>



<p>A great deal of this work has been driven by John, who has been balancing ecosystem improvements alongside onboarding new team members and supporting several other strategic projects. Ensuring that extension developers have a sustainable path forward remains a key investment area for Thunderbird.</p>



<h3 class="wp-block-heading"><strong>Authentication and OAuth</strong></h3>



<p>Over the past several months we’ve continued modernizing Thunderbird’s authentication experience, with a particular focus on OAuth and account setup.</p>



<p>One of the most visible improvements has been the continued rollout of browser-based OAuth flows. Instead of embedding authentication within Thunderbird itself, users can now complete sign-in using their system browser, providing a more familiar experience while benefiting from the security features and account state already present in their preferred browser.</p>



<p>As we expanded support for these flows, we also uncovered an interesting interoperability challenge. RFC 8252, the standard commonly used by native applications, recommends the use of loopback redirects with dynamically assigned local ports. While most providers support this approach correctly, several major providers have historically handled these redirects differently. As a result, we’ve been working directly with providers including Yahoo!/AOL, Comcast/Xfinity, and Yandex/Mail.ru to improve compatibility and ensure Thunderbird users continue to enjoy a smooth sign-in experience as authentication requirements evolve.</p>



<p>We’ve also been simplifying account setup for users of Thunderbird’s growing ecosystem of services. Recent work allows users to launch authentication for a Thundermail account directly from Thunderbird without first manually entering account details. This significantly streamlines onboarding and lays the groundwork for similar experiences with other major providers in the future.</p>



<p>Another important addition has been the introduction of a Thunderbird-specific protocol handler. This enables web-based account dashboards, management interfaces, and enterprise deployment tools to communicate directly with Thunderbird and complete account configuration automatically. For Thundermail users, this creates a much smoother path from account creation to a fully configured desktop client. Looking ahead, the same technology opens the door to deeper integration opportunities for enterprise deployments and other hosted services.</p>



<p>While much of this work happens behind the scenes, it represents an important investment in making account setup faster, more reliable, and more secure for both individual users and organizations deploying Thunderbird at scale.</p>



<h3 class="wp-block-heading"><strong>Panorama – Global Message Database</strong></h3>



<p>Behind the scenes, work continues on one of Thunderbird’s most ambitious long-term architectural projects: the Global Message Database.</p>



<p>Recent months have focused on strengthening the foundations needed to connect Panorama’s user experience with the underlying storage architecture. Geoff has resumed significant front-end work following ESR-related priorities, while Brendan has joined the project to help accelerate development and planning efforts. At the same time, Ben has been refactoring portions of the IMAP codebase to establish cleaner interfaces that will simplify integration with the new database architecture.</p>



<p>While much of this work remains infrastructural and therefore less visible to users today, it represents important progress toward a more modern foundation capable of supporting future performance, search, and organizational improvements throughout Thunderbird.</p>



<h3 class="wp-block-heading"><strong>Maintenance, Upstream adaptations, Recent Features and Fixes</strong></h3>



<p>While major features tend to attract the most attention, a significant portion of Thunderbird’s engineering effort continues to be devoted to maintenance and adaptation work required to keep pace with our upstream platform.</p>



<p>This period is traditionally one of the busiest times of the ESR cycle. As Firefox prepares its next ESR release, large volumes of platform changes land in a relatively short period of time. While these improvements benefit Thunderbird in the long term, they can also introduce unexpected regressions, styling inconsistencies, test failures, and compatibility issues that require immediate attention.</p>



<p>One particularly notable example has been Mozilla’s ongoing Nova initiative, which introduces substantial visual and styling changes throughout Firefox. Without intervention, many of these changes would create inconsistencies across Thunderbird’s user experience. Richard (Paenglab) has done exceptional work identifying, triaging, and adapting these upstream changes to ensure Thunderbird continues to present a coherent and polished interface. Much of this work goes unnoticed when done well, which is perhaps the highest compliment for maintenance engineering.</p>



<p>Alongside these adaptation efforts, the team and contributor community have continued landing a steady stream of reliability, stability, and usability improvements across the application. Recent highlights include:</p>



<ul>
<li>Improvements to threaded message handling and sorting behaviour.</li>



<li>Fixes for long-standing IMAP synchronization and data integrity issues.</li>



<li>Improvements to POP3 reliability, including protections against queue deadlocks.</li>



<li>Multi-monitor and mixed-DPI fixes for mail notifications.</li>



<li>Continued migration work to Fluent as part of our localization modernization efforts.</li>



<li>and many more which are listed in <a href="https://www.thunderbird.net/en-US/thunderbird/153.0beta/releasenotes/"><u>release notes for beta</u></a>.</li>
</ul>



<p>If you would like to see new features as they land, and help us find some early bugs, you can try running <a href="https://archive.mozilla.org/pub/thunderbird/nightly/latest-comm-central/"><u>daily</u></a> and check the pushlog to see what has recently landed. This assistance is immensely helpful for catching problems early.</p>



<p>—</p>



<p><strong>Toby Pilling</strong></p>



<p><strong>Senior Manager, Desktop Engineering</strong></p>
<p>The post <a href="https://blog.thunderbird.net/2026/06/thunderbird-monthly-development-digest-june-2026/">Thunderbird Monthly Development Digest: June 2026</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></div>
    </content>
    <updated>2026-06-25T18:34:34Z</updated>
    <published>2026-06-25T18:34:34Z</published>
    <category term="Development"/>
    <category term="Development Digest"/>
    <category term="Exchange"/>
    <author>
      <name>Toby Pilling</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-07-14T19:36:44Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148767</id>
    <link href="https://discourse.mozilla.org/t/mozphab-2-15-3-released/148767" rel="alternate" type="text/html"/>
    <title>MozPhab 2.15.3 Released</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Bugs resolved in Moz-Phab 2.15.3:</p>
<ul>
<li><a href="https://bugzilla.mozilla.org/2049293">bug 2049293</a> [moz-phab] Init errors get swallowed by Jujutsu backend</li>
<li><a href="https://bugzilla.mozilla.org/2049296">bug 2049296</a> [moz-phab] Add <code>jj util backend name</code> check for Jujutsu integration</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-3-released/148767">Read full topic</a></p></div>
    </summary>
    <updated>2026-06-25T17:11:40Z</updated>
    <published>2026-06-25T17:11:40Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>sheehan</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/mozphab-2-15-3-released/148767.rss" title="MozPhab 2.15.3 Released"/>
      <updated>2026-07-15T16:59:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/</id>
    <link href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/" rel="alternate" title="The many journeys of learning Rust" type="text/html"/>
    <title xml:lang="en">The many journeys of learning Rust</title>
    <content type="xhtml" xml:lang="en"><div xmlns="http://www.w3.org/1999/xhtml"><p><em>This is another post in our series covering what we learned through the Vision Doc process. We previously <a href="https://blog.rust-lang.org/2025/12/03/lessons-learned-from-the-rust-vision-doc-process/" rel="external">described the overall approach and what we learned about doing user research</a>, we <a href="https://blog.rust-lang.org/2025/12/19/what-do-people-love-about-rust/" rel="external">explored what people love about Rust</a>, <a href="https://blog.rust-lang.org/2026/01/14/what-does-it-take-to-ship-rust-in-safety-critical/" rel="external">dug into what it takes to ship safety-crticial Rust</a>, and <a href="https://blog.rust-lang.org/2026/03/20/rust-challenges/" rel="external">described some of the major challenges that people face when using Rust</a>.</em></p>
<p>In this post we walk through what folks have found on their journey to learn the Rust programming language with ups and downs covered.</p>
<p>As a disclaimer, LLMs (Large Language Models) come up in this post because our interviewees brought them up. We're scoping discussion to their use as a learning tool, covering research and example generation, not broader questions about AI (Artificial Intelligence) in software development.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#many-paths-to-needing-rust"/>
Many paths to needing Rust</h3>
<p>The interviews surfaced several different paths into Rust: curiosity, embedded work, job-market pressure, organizational adoption, and reassignment after a team or company chose Rust. That last path matters because many learners are not evaluating Rust from a blank slate; they are trying to become productive after Rust has already arrived in their work.</p>
<blockquote>
<p>"Funny enough, I've advocated for more niche languages than Rust in the past. Rust has pretty much stopped being as much of a niche language as it was, but it's not Java." -- Fractional CTO</p>
</blockquote>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#rust-learning-resources"/>
Rust learning resources</h3>
<p>Likely as expected, the folks that we talked to reach for a range of resources to learn Rust. Some reach for official documentation, such as <a href="https://doc.rust-lang.org/book/" rel="external">The Rust Programming Language Book</a> and find that sufficient to build on what the compiler was already showing them.</p>
<blockquote>
<p>"I started with the official Rust documentation because there are a lot of great examples of how features like the borrow checker work." -- Software engineer at an Automotive supplier</p>
</blockquote>
<p>Others needed more passes and more formats, sometimes reaching for resources the community maintains, such as <a href="https://rustlings.rust-lang.org/" rel="external">Rustlings</a>, <a href="https://danielkeep.github.io/tlborm/book/index.html" rel="external">The Little Book of Rust Macros</a>, and <a href="https://rust-unofficial.github.io/too-many-lists/" rel="external">Learn Rust With Entirely Too Many Linked Lists</a>.</p>
<blockquote>
<p>"The first time I went through the chapter in [The Rust Programming Language] on borrow checking, I was like, what is this? I read it again, then I watched a YouTube video of someone explaining the chapter." -- Rust freelance consultant</p>
</blockquote>
<blockquote>
<p>"Rust book, Rustlings, Zero to Production in Rust, Jon Gjengset tutorials. A bunch of books. It's not a one-pass reading. Can't say how many times I've gone through it." -- Software engineer working on video streaming and storage</p>
</blockquote>
<p>These resources have brought up an entire generation of Rust programmers. But, to some, there is a perception that these resources have trouble keeping pace with the language.</p>
<blockquote>
<p>"We'd like to use [The Rust Programming Language/'the book'], but we've found that it's out of date, unfortunately. We've looked at the GitHub repo and found it's got a lot of unresolved issues and unmerged PRs" -- Principal Software Engineering work on Rust adoption in a regulated industry</p>
</blockquote>
<p>Whether or not this is factually true, Rust's growth has nonetheless put more scrutiny on these materials. Companies evaluating adoption and engineers getting reassigned to Rust teams are looking at them with fresh eyes and finding the gaps that affect their own evaluation.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#beginner-stumblings-and-unlearning-habits"/>
Beginner stumblings and unlearning habits</h3>
<p>It's pretty typical for Rust to be the 2nd, 3rd or Nth programming language that someone picks up. They'd end up writing their most familiar language in Rust, whether C++ patterns, Java patterns, or whatever they knew, for months or even years. Eventually they got comfortable enough to start writing idiomatic Rust.</p>
<blockquote>
<p>"There's a bit of a drop in productivity compared to C if you're already familiar with it just because you're learning new rules, new syntax."  -- Principal Firmware Engineer (mobile robotics)</p>
</blockquote>
<blockquote>
<p>"In the beginning it was more poking around the code and adding and removing some ampersands and asterisks to try to make sense of <code>mut</code> and not <code>mut</code> and whatever." -- Senior engineer with 20 years of Java experience in cloud and IoT</p>
</blockquote>
<p>We also spoke with someone who found that not having much of a programming background seemed to benefit people picking up Rust. Not having worn-in grooves from other languages may play a role here, and it's worth investigating further.</p>
<blockquote>
<p>"I had someone who had never programmed much before start working on the internals of [our Rust project]. She was just fine with getting into Rust. It's more of the senior people that struggle as they need to unlearn practices which may work in other languages, but it's not the 'Rust' way." -- Researcher, Automotive OEM R&amp;D Lab</p>
</blockquote>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#learning-to-work-with-the-borrow-checker"/>
Learning to work with the borrow checker</h3>
<p>We heard a lot about learning to work with the borrow checker instead of against it. People get there through different paths, but a few patterns came up repeatedly.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#the-compiler-as-teacher"/>
The compiler as teacher</h4>
<p>Rust's diagnostics did the teaching on their own, especially around lifetimes.</p>
<blockquote>
<p>"If you mess up the lifetimes in a piece of code that you've written by hand, I usually find that Rust's diagnostics are very helpful" -- Researcher working on static analysis of Rust programs</p>
</blockquote>
<blockquote>
<p>"Whatever's missing, the compiler usually fills in: it tells me 'you need to declare the lifetime of this reference', so I know and can figure it out. That all generally works pretty well." -- Senior Software Engineer</p>
</blockquote>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#learning-by-doing"/>
Learning by doing</h4>
<p>Others felt like they only really internalized the borrow checker after writing a lot of Rust. It took projects, coding challenges, prototyping and so on until at some point it clicked.</p>
<blockquote>
<p>"I actually did not understand the borrow checker until I spent a lot of time writing Rust" -- Founder of a startup built on Rust</p>
</blockquote>
<blockquote>
<p>"Besides the prototyping work, I also did coding-challenge-type stuff to get familiar with Rust for Advent of Code. [..] It eventually clicked to the point where I wasn't fighting with Rust, it was working for me. I had that experience other people describe: when I managed to get my program to fit with Rust, it worked. I didn't spend time debugging." -- Principal Software Engineer, large SaaS provider</p>
</blockquote>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#letting-go-of-clone-guilt"/>
Letting go of "clone guilt"</h4>
<p>Some learners arrive with the assumption that good Rust means zero clones, zero copies, lifetimes threaded through everything. They set the bar at optimal before they've learned how to write idiomatic Rust, and it makes the borrow checker feel harder than it needs to be at the outset.</p>
<blockquote>
<p>"On one of my first projects, I was like, 'I don't ever want to copy or clone anything,' so I carefully wove through all the lifetimes and got myself into a bit of a bind. Then I saw someone else just cloning the struct I was working with, and it was super cheap. Sometimes you can just clone and it's going to be okay." -- Researcher at a university</p>
</blockquote>
<p>The experienced Rust developers we spoke with consistently said the same thing: clone freely while you're learning, then optimize when you understand the problem. Rust's reputation for performance and correctness feeds this. Newcomers assume anything less than optimal is wrong before they've written a first working program, and clone guilt is how that shows up.</p>
<p>We think it could be an interesting area of future study to check into the patterns Rust programmers employ at different levels of experience and under which circumstances. One member of the Rust Vision doc team that's very experienced with Rust noted that there's kind of an "expected shape" they understand as passing the compiler. This knowledge influences how they approach writing code which wouldn't take that shape and they naturally find themselves understanding when to use so-called workarounds, such as passing around indices into arrays or <code>Vec</code>s.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#multi-paradigm-but-not-the-oop-some-are-used-to"/>
Multi-paradigm, but not the OOP some are used to</h3>
<p>The Rust programming language is multi-paradigm, and how that lands depends on what you're coming from. We heard some that came from a functional background were delighted with digging into learning how much Rust inherits from that lineage. Some others noted that they and others on their teams struggled to unlearn the object-oriented style they'd come to use heavily in other languages like C++ and Java.</p>
<blockquote>
<p>"Developers coming from C++ tend to think object-oriented. I think that's a difference between C++ and Rust." -- Architect at Automotive OEM</p>
</blockquote>
<blockquote>
<p>"I had exactly that thing, where I would apply all my years of Java and JS thinking, where I could just create some object, not care about it, return it, have it sloshing around between various functions. Found myself reaching for these patterns and then being told 'no, you cannot do that'." -- Principal Engineer at a SaaS company</p>
</blockquote>
<p>Developers coming from functional programming had less to unlearn: strong typing, pattern matching, and an expression-oriented style were already familiar.</p>
<blockquote>
<p>"My background has been more functional programming, strong typing. That originated for me as a Lisper: once a Lisper, always a Lisper." -- Principal Software Engineer working on Rust tooling for safety-regulated industries</p>
</blockquote>
<blockquote>
<p>"The languages I primarily used before Rust were things like OCaml. Way back, I came from C and C++, the classic languages, and then I spent quite a long time doing primarily pure functional stuff. These days I've ended up back in what I like to think of as a pragmatic center ground [with Rust]." -- Fractional CTO</p>
</blockquote>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#teaching-rust-in-academia"/>
Teaching Rust in academia</h3>
<p>We spoke with a university professor that's been teaching Rust generally. In the academic environment, they were able to use proxies for some things such as "traits are like interfaces in Java" because the students had already gone through a set of courses in their first and second years that taught them Java. They introduced concepts slowly throughout the course, choosing to deal with some more complex topics like generics later. The outcome generally was that students had no problem picking up Rust in this setting.</p>
<blockquote>
<p>"I couldn't see any big difference on the embedded side. We also teach an embedded class, and we did an experiment. Half of the students' feedback was worse on the Rust class, mostly because they needed to build the project themselves. The C students just got one from [an LLM], absolutely no problem." -- University Professor, on teaching Rust</p>
</blockquote>
<p>The C cohort leaned on LLMs for the project in ways the Rust cohort couldn't. We don't yet have a clear answer for why.</p>
<p>What did come through clearly was the Rust cohort's experience with the community. Some students needed to figure out which drivers to use for the embedded project and how to use them. Their professor encouraged them to open issues and ask questions directly on GitHub, and the maintainers responded. Students who had never contributed to open source before were getting answers from the people who wrote the code.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#learning-using-llms"/>
Learning using LLMs</h3>
<p>Some experienced folks shared that they saw LLMs as a tool that can help someone come up to speed quickly, either as a research tool or for generating example Rust code to understand concepts.</p>
<blockquote>
<p>"I'm optimistic that there's a way to work [LLMs] in that will cut down that learning curve. One of the big things these tools bring is reducing the learning curve in general; these are very good tools to help you navigate a space that you don't know yet." -- Maintainer of large open source Rust crate</p>
</blockquote>
<blockquote>
<p>"I try [LLMs] out once a month, usually for generating an example or something like this. Just like with Stack Overflow: when you read an example, you should read it carefully and try to understand it. Not copy and paste it, but type it in your own words in code and then check it, because that's where the teeny tiny little mistakes are." -- Founder of startup built on Rust</p>
</blockquote>
<p>For some learners, an LLM is just another way to find answers, no different than a search engine.</p>
<blockquote>
<p>"So for the most part, picking up Rust - how do I learn? I'll [use web search for] things, I'll ask [an LLM], I'll just poke around and read the code." -- Senior Software Engineer working in a regulated space</p>
</blockquote>
<p>One founder went further and claimed that LLMs change who can become a Rust developer. One consulting company founder described hiring high school graduates with no systems programming background and training them as Rust developers, with LLMs filling in the learning gaps that would previously have required years of experience.</p>
<blockquote>
<p>"At the beginning, I was worried, but now that we have [LLMs] supporting development, the difficulty of the language doesn't matter. I'm seeing a huge opportunity behind strong runtime languages like Rust. [..] In [Developing Country] we hire 20-25 high school graduates, train them to be Rust programmers, then they enhance our workforce worldwide." -- Founder of a consulting company</p>
</blockquote>
<p>We heard this from one organization. This is a claim that the combination of Rust's compiler and LLM tooling can dramatically shorten the path from beginner to working developer. Whether it generalizes depends on questions we can't answer from a single interview: how long these developers stay, what kind of code they can maintain independently, and whether this training/learning model works outside this company's particular structure. If it holds up, the pool of people who can become Rust developers is much larger than the usual hiring profile suggests.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#organizational-considerations-for-rust-learners"/>
Organizational considerations for Rust learners</h3>
<p>We spoke with a number of folks on teams that are using Rust in larger organizations. Teams wanted to know that everyone would end up at roughly the same level of competence, which led a good number to invest in training courses to get there. Some leaders found that staff was able to ramp well enough by reading The Rust Programming Language, going through Rustlings, and then picking up lower risk and priority tickets to work on. Having a sense of community was also important within companies; it helps people know they are not alone when they are asked to work on Rust after, say, a reorganization happens.</p>
<blockquote>
<p>"[..] the idea with the class as opposed to 'just read the Rust book on your own' was that this gives everyone kind of the same baseline going in."  -- Principal Firmware Engineer (mobile robotics)</p>
</blockquote>
<blockquote>
<p>"So typically we're going to have people work through Rustlings, work through The Rust Programming Language. We have them then start to pick up lower risk tickets to work on." -- Principal Engineer at a large SaaS provider</p>
</blockquote>
<blockquote>
<p>"We've got an internal Slack channel for Rust learning where people can drop questions and others will come in and answer them. That helps build up understanding and community." -- Software Engineer at a large corporation</p>
</blockquote>
<p>Some organizations found that while the person they'd hire would need to learn Rust, it was still preferable to the alternative of hiring someone for a critical piece of software written in another language.</p>
<blockquote>
<p>"They needed to grow and maintain this C++ codebase. They had a C++ wizard, and they tried for about two years to find someone with the same level of expertise. They ended up hiring people that didn't know Rust and ramping them up, creating FFI bindings from the C++ side so they could work in Rust. And you can feel it: the borrow checker is teaching these people the right way to handle their systems." -- Principal Engineer at an Automotive OEM</p>
</blockquote>
<p>The community and helping each other aspect seems to grow bonds as organizations mature.</p>
<blockquote>
<p>"Our team is [all about] mentorship. I've mentored people coming up to speed on Rust, and people help each other hugely." -- Principal Software Engineer at a large SaaS company</p>
</blockquote>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#silent-attrition"/>
Silent attrition</h3>
<p>We identified some cases where people have approached Rust and bounced off of it, for one reason or another. In the below case, someone with a background in a language with fewer guardrails found themselves frustrated enough with Rust to walk away.</p>
<blockquote>
<p>"All of that means that that embedded ecosystem is very frustrating to somebody who comes from C and is like, why can't I just get a pointer to this peripheral and then write into the registers. What are you doing to me? [..] My friend never got over that. He looked at it and said, I'm not going to deal with this and walked away." -– A second University Professor</p>
</blockquote>
<p>There may be language features that for a particular domain are not seen as comfortable or usable yet, such as async Rust usage in a safety domain. We'd like to map which language features feel off-limits in which domains; async in safety-critical work probably isn't the only case.</p>
<blockquote>
<p>"We're not fully sure how async [Rust] will work out in the long run in our domain. [..] People don't feel comfortable yet since C++14 doesn't provide such concepts. [..] It's the chicken-and-egg problem again: we probably need to gain some experience to see whether we can actually benefit from these new concepts in the automotive and safety domains." -- Team Lead at Automotive Supplier (ASIL D target)</p>
</blockquote>
<p>We heard in at least one case, that while the language was challenging and there was a near bounce, the tooling helped keep them coming back and trying.</p>
<blockquote>
<p>"Well, I think my early impressions of Rust - one is I find C++ so intimidating, and I think a big part of why I was able to succeed at [..] learning Rust is the tooling. I mean, all this makes sense [..] but it's like, for me, getting started with Rust, the language was challenging, but the tooling was incredibly easy." -- Founder of another startup built on Rust</p>
</blockquote>
<p>While it might be considered more of a community concern, if there are interactions online and in spaces that point to learners having
so-called "skill issues" this feeds into the narrative that Rust must be hard to learn. We may be unintentionally turning away Rust Project contributors and maintainers due to the vibes being put out when new learners show up in certain spaces.</p>
<blockquote>
<p>"People are very helpful, but generally the attitude is: if your program is very complicated, it's mostly a skill issue. There's not that much empathy when people get stuck learning, and a lot of people are just pushed away by it. There's probably a huge number of people who silently stop wanting to write Rust, because at some point it gets complicated and the feedback they get is 'you just need to be a better programmer, obviously'." -- Software Engineer at a SaaS Provider</p>
</blockquote>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#feedback-on-near-bounces-from-survey"/>
Feedback on near-bounces from survey</h4>
<p>We found a few interesting perspectives collected in the Rust Vision doc survey which we administered with examples of bouncing and coming back:</p>
<blockquote>
<p>"I started before 1.0, got stuck very soon when trying to translate patterns from C++ to Rust (due to borrow checking). I tried again after 1.0 and it stuck. [..]" -- Survey Respondent A</p>
</blockquote>
<p>Survey Respondent A went on to share in a more detailed response about a perceived weakness in Rust learning materials related to lifetimes and the borrow checker are explained. There was an observation that it's fairly easy to run into more complex situations with lifetimes and the borrow checker. They felt that the current state of this sort of material and tutorials is fairly superficial and can leave learners stuck when they run into those more complex situations.</p>
<p>One respondent that bounced once and came back shared challenges around usage of async. In concert with Rust's memory-safety and the borrow checker, they found some of the nitty-gritty details of async were difficult to learn. While we're aware of the Rust Project's continuous efforts to improve Rust's async story, this is another data point of a user that faced challenges.</p>
<p>Another survey respondent shared how they had multiple times bounced in trying to learn Rust. They returned after a year or so and found Rustlings to be highly motivating. We note that having multiple pathways for folks to learn Rust opens up more possibilities for those that nearly bounced, just like this person.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#need-more-focused-work-on-silent-attritrion"/>
Need more focused work on silent attritrion</h4>
<p>The thing that stood out most to us was the lack of real, first-hand knowledge of having bounced when learning Rust. While this is an obvious effect of soliciting answers to our survey and opportunities to interview through Rust channels and our networks, this cohort is good future candidate where interviews could start.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#conclusions"/>
Conclusions</h3>
<p>Across these conversations, the experience of learning Rust depended heavily on context. Why someone was learning and what support they had mattered as much as the borrow checker. The same kinds of examples kept coming up: a training course that got a team to a shared baseline, a maintainer answering a student's first GitHub issue, and a colleague whose code showed that cloning was okay.</p>
<p>That context is largely something the community has a hand in. With that in mind, here is what we take away from what we heard, and what we still don't know.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#what-seems-worth-trying"/>
What seems worth trying</h4>
<p><strong>Learning materials aimed at unlearning.</strong> Syntax barely came up when people described their struggles. People struggled with unlearning habits from previous languages, whether OOP structuring from C++ and Java or the instinct to grab a raw pointer to a peripheral. Most of our learning materials teach Rust from first principles, and that works. What we didn't come across is much written for, say, the engineer with ten years of Java who lands on a Rust team after a reorg: material that names the patterns they'll reach for that won't transfer, and shows what to do instead. The professor we spoke with did a version of this in the classroom, leaning on "traits are like interfaces in Java" and saving generics for later in the course, and the students did fine. Something similar could work outside the classroom too.</p>
<p><strong>Put the "clone freely while you're learning" advice somewhere official.</strong> Every experienced developer we spoke with gave the same advice, but learners seem to mostly pick it up by accident, like the researcher who happened to see someone else cloning the struct they had been carefully threading lifetimes through. Saying it early in official materials would take some of the steepness out of the curve. The broader version belongs there too: idiomatic Rust doesn't have to mean optimal Rust, especially on a first project.</p>
<p><strong>Diagnostics are already a primary learning resource: several people told us the compiler taught them lifetimes before any documentation did.</strong> Diagnostics reach learners right at the moment they're stuck. When writing new ones, it seems worth keeping the confused newcomer in mind alongside the expert, because for a lot of people this is where the learning happens.</p>
<p><strong>Is "the book" actually out of date?</strong> Whether or not The Rust Programming Language or other materials are actually behind, a team evaluating Rust looked at its repository, saw unresolved issues and unmerged PRs, and moved on. As more companies evaluate adoption, more people will look at these materials with the same fresh eyes. Visible issue triage and some communication about what's current and what's planned would address the perception, separately from whatever content work may or may not be needed.</p>
<p><strong>How stuck learners get treated is shaping who stays.</strong> We heard about students getting answers on GitHub from the maintainers who wrote the code, and we heard about learners being told their struggles were a skill issue. The first group came away with a lasting good impression of Rust. Some of the second group walked away entirely, and because they leave quietly, it's easy to underestimate how many of them there are. The welcoming side of the community came up unprompted as a reason people stayed, so we know it makes a difference when we get this right.</p>
<p><strong>Every organization we spoke with described essentially the same ramp-up for bringing a team to Rust.</strong> Teams that brought groups of developers to Rust described roughly the same approach: get everyone to a shared baseline with a training course or with The Rust Programming Language and Rustlings, start people on lower-risk tickets, and give them somewhere internal to ask questions. Several organizations also found that hiring developers without Rust experience and ramping them up worked out better than continuing to search for rare expertise in another language. None of this is complicated, and teams weighing adoption don't need to invent a training program from scratch.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#what-we-still-don-t-know"/>
What we still don't know</h4>
<p>The biggest gap is the people we didn't reach. Nearly everyone we spoke with stuck with Rust long enough to be reachable through Rust channels, so the stories of bouncing off came to us second-hand: a friend who walked away from embedded Rust, colleagues who quietly stopped after the responses they got. As we wrote in <a href="https://blog.rust-lang.org/2025/12/03/lessons-learned-from-the-rust-vision-doc-process/" rel="external">our first post</a>, finding people who decided against Rust takes targeted outreach. If the proposed User Research team comes together, talking with learners who bounced would make a good early project, and learning is probably the area where that research would teach us the most.</p>
<p>We also don't know what to make of LLMs as a learning tool yet. They came up as a search engine, as an example generator, and in one organization's case as something that makes training high school graduates into working Rust developers possible. We saw a classroom where the C cohort leaned on LLMs in ways the Rust cohort couldn't, and we don't have an explanation for it. All of this comes from a handful of conversations, so we treat it as a set of leads to follow up on. Given how quickly the tools are changing, it seems better to study this deliberately than to wait and see what folklore develops.</p>
<p>The folks we spoke with showed that people do get there: with enough passes through the materials and enough code written, it eventually clicks. The opportunities above are mostly about making it work for the people who didn't pick Rust on purpose, and for the ones who would have stuck around if their early experience had gone a little differently.</p></div>
    </content>
    <updated>2026-06-25T00:00:00Z</updated>
    <published>2026-06-25T00:00:00Z</published>
    <author>
      <name>Pete LeVasseur</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-07-15T14:56:21Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:this-week-in-rust.org,2026-06-24:/blog/2026/06/24/this-week-in-rust-657/</id>
    <link href="https://this-week-in-rust.org/blog/2026/06/24/this-week-in-rust-657/" rel="alternate" type="text/html"/>
    <title>This Week in Rust 657</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/rust-foundation-welcomes-openai-as-platinum-member-announces-donation-to-rust-project/">Rust Foundation Welcomes OpenAI As Platinum Member</a></li>
<li><a href="https://rustfoundation.org/media/rust-commercial-network-launches-to-bring-commercial-users-of-rust-language-together/">Rust Commercial Network Launches to Unite Commercial Users of Rust</a></li>
<li><a href="https://rustfoundation.org/media/mainmatter-is-bringing-hands-on-rust-training-to-upskilling-week-in-barcelona/">Mainmatter Is Bringing Hands-On Rust Training</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://www.theembeddedrustacean.com/p/the-embedded-rustacean-issue-74">The Embedded Rustacean Issue #74</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://bevy.org/news/bevy-0-19">Bevy 0.19</a></li>
<li><a href="https://blog.image-rs.org/2026/06/18/png-adoption.html">Rust PNG crate gets even faster, used by GNOME and Chromium</a></li>
<li><a href="https://github.com/kunobi-ninja/kache/releases/tag/v0.7.0">kache 0.7.0: caching real-world C/C++ trees</a></li>
<li><a href="https://www.willsearch.com.br/blog/2026/06/23/new-feature-in-guardiandb-introducing-the-odm-object-document-mapper-layer/">New Feature in GuardianDB: Introducing the ODM (Object Document Mapper) Layer</a></li>
<li><a href="https://shnatsel.medium.com/safe-simd-in-rust-even-on-the-inside-c6f1ff381828">Safe SIMD in Rust, even on the inside</a></li>
<li><a href="https://ratatui.rs/highlights/v0302/">Ratatui 0.30.2 is released - a Rust library for cooking up terminal user interfaces</a></li>
<li><a href="https://dev.to/alexandr_litvinov/adding-a-post-quantum-hybrid-handshake-to-a-rust-vpn-pk8">Adding a post-quantum hybrid handshake to a Rust VPN</a></li>
<li><a href="https://tensor4all.org/blog/introducing-tenferro-rs/">From Julia to Rust: a differentiable tensor stack for scientific computing in the agentic AI era</a></li>
<li><a href="https://hotpath.rs/blog/profiling-async-rust">hotpath-rs 0.18: Profiling Async and Concurrent Rust - Channels and Lock Contention</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://blog.cloudflare.com/hyper-bug/">How we found a bug in the hyper HTTP library</a></li>
<li><a href="https://corrode.dev/podcast/s06e06-clickhouse/">ClickHouse with Alexey Milovidov and Austin Bonander</a></li>
<li><a href="https://kerkour.com/iroh-v1-p2p">Deep dive into iroh: A replacement for WireGuard or a peer-to-peer layer for your application?</a></li>
<li><a href="https://kobzol.github.io/rust/2026/06/21/optimizing-sqlx-test-rebuild-time.html">Optimizing #[sqlx::test] rebuild time</a></li>
<li><a href="https://bitfieldconsulting.com/posts/rewrite-in-rust">Rewriting the world in Rust</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://docs.litellm.ai/blog/litellm-rust-launch">Migrating LiteLLM to Rust - Building the Fastest and Litest AI Gateway</a></li>
<li><a href="https://medium.com/@shnatsel/safe-simd-in-rust-even-on-the-inside-c6f1ff381828">Safe SIMD in Rust, even on the inside</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-rust-async-await-by-building-an-http-server/">Learn Rust Async/Await, Tokio, and TCP Networking by Building an HTTP/1.1 Server</a></li>
<li><a href="https://blog.sheerluck.dev/posts/build-breakout-in-bevy-step-by-step/">Building Breakout in Bevy: Step by Step</a></li>
<li><a href="https://medium.com/@vbasky/porting-200-000-lines-of-c-to-rust-building-a-byte-identical-mediainfo-replacement-8e9b587d469a">Porting 300,000 Lines of C++ and Perl to Rust: A Dual-Oracle Media Metadata Engine</a></li>
<li><a href="https://corentin-core.github.io/posts/ruxe-type-level-disjointness/">A data race that doesn't compile</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=RKojTb9IVJc">RustCurious lesson 9: Traits are Interfaces</a></li>
<li>[Video] <a href="https://www.youtube.com/watch?v=X8GDc2AtbG8">BAML: a new programming language (created in Rust)</a></li>
<li>[Video] <a href="https://www.youtube.com/watch?v=O3YWQvNqwHc">The Future of Version Control</a></li>
<li>[Video] <a href="https://www.youtube.com/watch?v=1Xz1E_27Uqc">Borrowing Beauty: My Beginner's Quest to Create Approachable Bevy &amp; Rust Code</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/orium/cargo-rdme">cargo-rdme</a>, a cargo command to create your README from your crate’s documentation.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1616">Diogo Sousa</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/aimdb-dev/aimdb/issues/116">AimDB - Non-blocking fallible <code>try_produce</code> for bounded / non-overwriting buffers</a></li>
<li><a href="https://github.com/aimdb-dev/aimdb/issues/99">AimDB - Add minimal example: hello-mailbox-async</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>515 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-06-16..2026-06-23">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/157926">implement <code>#[diagnostic::on_unknown]</code> for modules</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158042">outline part of <code>evaluate_goal_raw</code> into its own <code>#[cold]</code> function</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157967">preserve <code>track_caller</code> for by-value dyn vtable shims</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/156983">add <code>io::Read::read_le</code> and <code>io::Read::read_be</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155616">constify <code>TryFrom&lt;Vec&gt;</code> for array</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157878"><code>impl [const] Default for BTreeMap</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157912">stabilize <code>str_from_utf16_endian</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158012">stabilize <code>strip_circumfix</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/141266">stabilize <code>substr_range</code> and <code>subslice_range</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/17112"><code>diag</code>: Support <code>build.warnings</code> for cargo lints</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17117"><code>add</code>: list too-new versions and how to override</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17123"><code>host-config</code>: dont apply target config to host artifacts</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17107"><code>install</code>: Run cargo lints like rustc lints</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17118"><code>resolver</code>: hint how to resolve too-new versions</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17127"><code>test</code>: skip dwp uplift test without packed debuginfo</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17110">add Solaris fcntl file locking</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17012"><code>-Zmin-publish-age</code></a> (RFC <a href="https://rust-lang.github.io/rfcs/3923-cargo-min-publish-age.html">#3923</a>)</li>
<li><a href="https://github.com/rust-lang/cargo/pull/17108">improved the test error messages when 'rustc -V' fails</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17115">remove windows-sys dependencies older than 0.61</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/16931">add lint to suggest <code>as_chunks</code> over <code>chunks_exact</code> with constant</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16252">new <code>unnecessary_unwrap_unchecked</code>: lint</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/15907"><code>extra_unused_type_parameters</code>: don't suggest an autofix</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17001"><code>let_underscore_future</code>: skip bindings with an explicit type annotation</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16976">avoid ICE when evaluating constants containing unsized type args</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16928">avoid <code>map_unwrap_or</code> fix when default is adjusted</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17256">do not check for unused lifetimes in expanded code</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17249">don't trigger <code>unnecessary_box_returns</code> when the size depends on generics</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17243">find a shared context for the format string and the <code>format!</code> call</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17205">fix OOM panic for large types on uninit check</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16964">fix <code>std_instead_of_core</code>: false positives for <code>core::io</code>/MSRV</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16926"><code>manual_slice_fill</code> detect for in loops over <code>&amp;mut [T; N]</code> slices</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17239">merge comment and cfg checking in <code>matches</code> lint pass</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17266">perf: check the method name first in <code>or_fun_call</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17265">perf: compare method names before type queries in three lint passes</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17275">perf: run structural checks before const context queries in <code>question_mark, manual_clamp</code> and ranges</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17272">perf: skip <code>match_same_arms</code> work when the lint is allowed</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17226">perf: skip tokenizing in <code>span_contains_cfg</code> when no '#' is present</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17278">treat <code>!</code> the same as <code>-</code> in <code>unnecessary_cast</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/22618"><code>assists/replace_match_with_if_let</code>: don't parenthesize if-let guards</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22617"><code>implements_trait_unique_with_infcx</code>: only forbid the self type from being an error type</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22516">bye bye ted</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22627">do not visit nodes in GC multiple times</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22594">MIR eval mixed bit and byte sizes</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22599">check for <code>#[cfg]s</code> in tail expression macros</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22601">crash on static constants in array length positions</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22486">don't complete <code>.await</code> on receivers of unknown type</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22621">don't panic on out-of-range integer literals in const positions</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22351">migrate merge imports to editor</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 had a lot of big swings, with two significant perf regressions that are accepted
because they unlock future features and perf improvements.
We also saw large improvements in the next trait solver due to the performance optimization work happening there.</p>
<p>Triage done by <strong>@JonathanBrouwer</strong> with help from <strong>@Kobzol</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=b5d46ecb51c3e4134b82570cfe718f093daa6390&amp;end=8b6558a02b2774acfb25cf15e199467c37ba7490&amp;absolute=false&amp;stat=instructions%3Au">b5d46ecb..8b6558a0</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.9%</td>
<td style="text-align: center;">[0.2%, 2.7%]</td>
<td style="text-align: center;">184</td>
</tr>
<tr>
<td style="text-align: center;">Regressions ❌ <br/> (secondary)</td>
<td style="text-align: center;">1.0%</td>
<td style="text-align: center;">[0.1%, 4.2%]</td>
<td style="text-align: center;">160</td>
</tr>
<tr>
<td style="text-align: center;">Improvements ✅ <br/> (primary)</td>
<td style="text-align: center;">-0.3%</td>
<td style="text-align: center;">[-0.3%, -0.2%]</td>
<td style="text-align: center;">2</td>
</tr>
<tr>
<td style="text-align: center;">Improvements ✅ <br/> (secondary)</td>
<td style="text-align: center;">-11.8%</td>
<td style="text-align: center;">[-69.9%, -0.2%]</td>
<td style="text-align: center;">25</td>
</tr>
<tr>
<td style="text-align: center;">All ❌✅ (primary)</td>
<td style="text-align: center;">0.8%</td>
<td style="text-align: center;">[-0.3%, 2.7%]</td>
<td style="text-align: center;">186</td>
</tr>
</tbody>
</table>
<p>5 Regressions, 3 Improvements, 2 Mixed; 4 of them in rollups
30 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/660052c17ccde865dff7c7ffd525affa0550c846/triage/2026/2026-06-21.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/pull/157497">rustc_lint: Allow scoped <code>non_ascii_idents</code> lint levels</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157857">Stabilize <code>#[my_macro] mod foo;</code> (part of <code>proc_macro_hygiene</code>)</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/134021">Implement <code>IntoIterator</code> for <code>[&amp;[mut]] Box&lt;[T; N], A&gt;</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/129436">Tracking Issue for <code>string_from_utf8_lossy_owned</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156508">Infer all anonymous lifetimes in assoc consts as <code>'static</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157820">consider subtyping when checking if an infer var is sized</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156749">remove <code>box_patterns</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156976">enable eager <code>param_env</code> norm in new solver</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/153563">Lint against iterator functions that panic when <code>N</code> is zero</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/298">Start a t-project-structure/t-comprehensibility</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/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>,
<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/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/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</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><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-06-24 - 2026-07-22 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-06-25 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/rust-girona?e=evt-rgneLvX1H85AmjV"><strong>Rust Girona Weekly Session</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/315210366/"><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">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 (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/315211402/"><strong>Learning Game Development the Hard Way with Rust and Bevy</strong></a></li>
</ul>
</li>
<li>2026-07-02 | 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/313345243/"><strong>Rust Nürnberg online</strong></a></li>
</ul>
</li>
<li>2026-07-04 | 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-07-05 | 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/314095287/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-07 | 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/315060981/"><strong>👋 Community Catch Up</strong></a></li>
</ul>
</li>
<li>2026-07-14 | 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/310254778/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-07-15 | 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/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/312045926/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-19 | 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/314329045/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-21 | 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/315102297/"><strong>Lunch &amp; Learn: Learning Rust as First Programming Language</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/315279653/"><strong>Mid-month Rustful</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-07-18 | Bangalore, IN | <a href="https://hasgeek.com/rustbangalore">Rust Bangalore</a><ul>
<li><a href="https://hasgeek.com/rustbangalore/july-2026-rustacean-meetup/"><strong>July 2026 Rustacean Meetup</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-24 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul>
<li><a href="https://www.meetup.com/rust-manchester/events/315200163/"><strong>Rust Manchester June Talks</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Trondheim, NO | <a href="https://www.meetup.com/rust-trondheim">Rust Trondheim</a><ul>
<li><a href="https://www.meetup.com/rust-trondheim/events/315298357/"><strong>The Chaos of Time and Time Intervals</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-06-25 | 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/315214426/"><strong>Rust meetup #69</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Toulouse, FR | <a href="https://www.meetup.com/rust-community-toulouse/">Rust Toulouse</a><ul>
<li><a href="https://www.meetup.com/rust-community-toulouse/events/314947457/"><strong>Rust Toulouse Meetup - Bevy &amp; ESP32</strong></a></li>
</ul>
</li>
<li>2026-06-27 | Stockholm, SE | <a href="https://www.meetup.com/stockholm-rust">Stockholm Rust</a><ul>
<li><a href="https://www.meetup.com/stockholm-rust/events/315371143/"><strong>Ferris' Fika Forum #27</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Edinburgh, UK | <a href="https://www.meetup.com/rust-edi">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, NL | <a href="https://www.meetup.com/dutch-rust-meetup">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">Rust Dublin</a><ul>
<li><a href="https://www.meetup.com/rust-dublin/events/315150327/"><strong>Join us live and INPERSON for Rust 262</strong></a></li>
</ul>
</li>
<li>2026-07-09 | 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>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<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/315105633/"><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-25 | 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/314825008/"><strong>RUST MEETUP at HACKER DOJO</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-06-27 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225857/"><strong>Somerville Union Square Rust Lunch, June 27</strong></a></li>
</ul>
</li>
<li>2026-07-02 | 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/315103359/"><strong>Git is easy?</strong></a></li>
</ul>
</li>
<li>2026-07-04 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225861/"><strong>Boston University Rust Lunch, July 4</strong></a></li>
</ul>
</li>
<li>2026-07-09 | 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/314696647/"><strong>Utah Rust July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-11 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225865/"><strong>MIT Rust Lunch, July 11</strong></a></li>
</ul>
</li>
<li>2026-07-15 | 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/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | 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/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-18 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225872/"><strong>North End Rust Lunch, July 18</strong></a></li>
</ul>
</li>
<li>2026-07-21 | 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/314997214/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-07-22 | 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/xvkdgtyjckbdc/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-07-22 | 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/315376271/"><strong>Rust LA: Rust in Distributed Systems with Flight Science!</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>
<li>2026-07-21 | Barton, 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/315307280/"><strong>July 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/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>I think this is the wrong decision, and I wish the lang team had stabilized the Late type instead.
Better Late than Never.</p>
</blockquote>
<p>– <a href="https://www.reddit.com/r/rust/comments/1u1v53c/the_never_type_is_likely_to_stabilize_soon/oqsxf3v/">/u/CouteauBleu on /r/rust</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1782">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/1uewqig/this_week_in_rust_657/">Discuss on r/rust</a></small></p></div>
    </content>
    <updated>2026-06-24T04:00:00Z</updated>
    <published>2026-06-24T04: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-07-15T04:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=86259</id>
    <link href="https://blog.mozilla.org/en/mozilla/news/announcing-mozilla-org-new-non-profit/" rel="alternate" type="text/html"/>
    <title>The web is evolving. So are we.</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Earlier this month, we officially stood up Mozilla.org: a new 501(c)(3) nonprofit created to steward the long term success of the Mozilla Project.  Over the last year or so, I’ve said a lot about how AI is reshaping the web — and how we need to simultaneously stand up for the open internet Mozilla helped build […]</p>
<p>The post <a href="https://blog.mozilla.org/en/mozilla/news/announcing-mozilla-org-new-non-profit/">The web is evolving. So are we.</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-full"><img alt="" class="wp-image-86275" height="667" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/Screenshot-2026-06-23-at-08-57-20-Illustration-Visual-Elements-Mozilla-Brand.png" width="936"/></figure>



<p>Earlier this month, we officially stood up Mozilla.org: a new 501(c)(3) nonprofit created to steward the long term success of the <a href="https://www.mozilla.org/en-US/about/#the-mozilla-project">Mozilla Project</a>. </p>



<p>Over the last year or so, <a href="https://blog.mozilla.org/en/mozilla/rewiring-mozilla-ai-and-web/">I’ve said a lot</a> about how AI is reshaping the web — and how <strong>we need to simultaneously stand up for the open internet Mozilla helped build </strong><strong><em>and</em></strong><strong> shape what the internet is becoming in the AI era</strong>. This is a huge and urgent challenge.</p>



<p>Mozilla has evolved and grown a great deal in order to step up to this challenge. </p>



<p>We are still a high impact philanthropic foundation and a browser company focused on user choice. But we are also: an email company built around privacy; an open source AI startup focused on developers; a place for people to create and share data on their own terms; and an investor in responsible tech startups. </p>



<p>These are all pieces of Mozilla today, and are all important levers as we try to shape where the internet is headed for the better. </p>



<p><strong>We have created Mozilla.org to pull all of the different pieces of Mozilla together. </strong>It will act like a strategic endowment — allocating funding, managing our brands and shaping long term strategy — to ensure every part of Mozilla is well set up to advance the vision outlined in the Mozilla Manifesto. And, if we’re successful, it will help all of the pieces of Mozilla add up to more than the sum of their parts.</p>



<p>This is an important milestone for Mozilla. The challenge of fusing the values of the Mozilla Manifesto into this next era of the internet is huge. This updated structure will make it easier to nimbly direct our resources and orchestrate our actions to step up to this challenge. </p>



<p>At the same time, <strong>what we love about Mozilla stays the same.</strong> All of Mozilla’s organizations remain under the umbrella of the 501(c)(3) Mozilla Foundation, with the new non-profit operating the Mozilla portfolio of organizations on its behalf. Our mission — and our commitment to nonprofit ownership at the top — remain steadfast. </p>



<p><em>For more information on the new Mozilla.org non profit including an FAQ, see </em><a href="http://wiki.mozilla.org/mozilla_org">wiki.mozilla.org/mozilla_org</a></p>
<p>The post <a href="https://blog.mozilla.org/en/mozilla/news/announcing-mozilla-org-new-non-profit/">The web is evolving. So are we.</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-06-23T17:59:27Z</updated>
    <published>2026-06-23T17:59:27Z</published>
    <category term="From the Team"/>
    <category term="News"/>
    <category term="Our Work"/>
    <author>
      <name>Mark Surman</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-07-14T12:38:41Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.thunderbird.net/?p=4329</id>
    <link href="https://blog.thunderbird.net/2026/06/thundermail-june-2026-update-what-we-learned-after-the-first-few-waves-of-invites/" rel="alternate" type="text/html"/>
    <title>Thundermail June 2026 update: what we learned after the first few waves of invites</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Over the past several weeks, we have been welcoming early users from our waitlist into Thundermail, a few waves at a time. Many of you are now setting up your accounts, trying things out, and sharing your thoughts with us. Naming updates You may have noticed that we are now saying Thundermail more often, and […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/06/thundermail-june-2026-update-what-we-learned-after-the-first-few-waves-of-invites/">Thundermail June 2026 update: what we learned after the first few waves of invites</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="Thundermail June Update Blog" class="attachment-640x360 size-640x360 wp-post-image" height="320" src="https://blog.thunderbird.net/files/2026/06/Thundermail-June-update.jpg" width="640"/></p>
<p>Over the past several weeks, we have been welcoming early users from our waitlist into Thundermail, a few waves at a time. Many of you are now setting up your accounts, trying things out, and sharing your thoughts with us.</p>



<h3>Naming updates</h3>



<p>You may have noticed that we are now saying Thundermail more often, and Thunderbird Pro less.</p>



<p>Thunderbird Pro started as the name for our subscription services, including Thundermail, Appointment, and Send. But early feedback made two things clear: people cared most about Thundermail, and “Pro” created confusion about whether Thunderbird itself was becoming a paid or limited product.</p>



<p>So, to clarify things, Thunderbird Pro is now simply <strong>Thundermail: the email service from Thunderbird, with features like Appointment and Send included</strong>.</p>



<p>The Thunderbird Desktop and Mobile apps remain exactly what they are today: powerful, compatible with any email service, and free.</p>



<h3>What we learned so far</h3>



<p>Every day, members of our team are reading through your survey responses, your messages in the Thundermail Early Bird community chat, your support requests, and every new idea and vote on the board. We discuss what we are hearing, and we sort it into what we can address right away and what we want to plan for. Then we keep working in the open, where you can see what we are up to and tell us when something is not quite right.</p>



<p>Here are some of the things we’ve learned so far:</p>



<ul>
<li><strong>Custom domains matter a lot.</strong> Many called this out directly, along with support for unlimited custom domain aliases. Several responses said these features stood out compared to other email providers.</li>



<li><strong>Multi-factor Authentication saw a lot of requests on the</strong><a href="https://ideas.tb.pro/"><strong> ideas board</strong></a>, and we listened. This is now in progress and will be available soon.</li>



<li><strong>Users appreciate that Thundermail is open and works with any email app.</strong> It has always been our intention to stick to open standards so Thundermail stays easy and open to use with Thunderbird or any other app. </li>



<li><strong>A bit of surprise that calendar and contacts are included.</strong> Apparently we should probably talk about that more.</li>



<li><a href="https://ideas.tb.pro/p/dnssec-dane-support"><strong>DNSSEC and DANE support</strong></a><strong> </strong><strong>picked up a lot of votes</strong> and is now on the roadmap.</li>



<li><strong>Requests for more pricing tiers and plans</strong> were frequently mentioned, which we will be adding once Thundermail is out of beta and open to the general public.
<ul>
<li><a href="https://ideas.tb.pro/p/additional-pricing-tiers">https://ideas.tb.pro/p/additional-pricing-tiers</a></li>



<li><a href="https://ideas.tb.pro/p/a-la-carte-pricing">https://ideas.tb.pro/p/a-la-carte-pricing</a></li>
</ul>
</li>
</ul>



<p>However, there was one request which came through louder than any other…</p>



<h4>Webmail</h4>



<p><a href="https://ideas.tb.pro/p/webmail-for-thundermail">Webmail</a> was, by a wide margin, the most requested idea from our community, and whereas we had it in the plans for down the road, many people expected this to be a feature available from day one.</p>



<p>We moved webmail to the top of the list, shifted resources into the work behind it and we are excited to share that an early alpha version of it is coming next month. As with most early releases, it will have some rough edges, but will also allow for a much more interactive user experience for our beta testers. Everyone will have a vote in how it’s shaped for the future.</p>



<h3>A look at what is coming next</h3>



<ul>
<li><strong>Webmail! </strong>Arriving soon.</li>



<li><a href="https://ideas.tb.pro/p/multifactor-authentication"><strong>Two factor authenticatio</strong>n</a> is now in progress.</li>



<li><strong>More reliable email</strong>, as we keep fine tuning things behind the scenes, training global mail servers and spam filters.</li>



<li><strong>Onboarding improvements</strong> for a smoother first time sign-up flow.</li>
</ul>



<h3>Send and Appointment</h3>



<p>Our scheduling and secure file sharing tools are still here, and they are still part of your subscription. Our main focus right now is Thundermail and webmail, but we are continuing to care for both with steady improvements along the way.</p>



<ul>
<li><strong>Send</strong>: Improved Thundermail integration, providing end-to-end encrypted file attachments without the need for a separate add-on. Users on our <a href="https://www.thunderbird.net/en-CA/download/daily">Daily </a>version can already test this feature today.</li>



<li><strong>Appointment</strong>: Streamlined the sign up flow, added an easy one click connection with the Thundermail calendar, and refreshed the calendar view design.</li>
</ul>



<h3>We’re looking for more ideas</h3>



<p>If you are an Early Bird, we would love for you to visit<a href="https://ideas.tb.pro/"> </a>our <a href="https://ideas.tb.pro">ideas board</a> to share your suggestions and vote on the ones you would most like to see. We really do read every single one.</p>



<p>And if you have not been invited yet, you can <a href="https://tb.pro/waitlist/">join the waitlist</a>. More waves are going out soon, and we are looking forward to welcoming you onboard.</p>



<p>Thank you for helping us build Thundermail.</p>
<p>The post <a href="https://blog.thunderbird.net/2026/06/thundermail-june-2026-update-what-we-learned-after-the-first-few-waves-of-invites/">Thundermail June 2026 update: what we learned after the first few waves of invites</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></div>
    </content>
    <updated>2026-06-23T17:24:23Z</updated>
    <published>2026-06-23T17:24:23Z</published>
    <category term="Product"/>
    <category term="tbpro"/>
    <category term="thundermail"/>
    <author>
      <name>Natalie Ivanova</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-07-14T19:36:44Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=86257</id>
    <link href="https://blog.mozilla.org/en/firefox/privacy-security/keeping-the-web-open-and-private-in-the-bot-era/" rel="alternate" type="text/html"/>
    <title>Keeping the web open and private in the bot era</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>If you’ve been running into endless CAPTCHAS or website login requests lately, you’re not imagining things.  Websites, facing a rising tide of abusive traffic from bots, are adopting increasingly aggressive countermeasures, damaging user’s experience of the web, their privacy and open access to the web.    In this post, we’ll talk about a new initiative we’re […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/privacy-security/keeping-the-web-open-and-private-in-the-bot-era/">Keeping the web open and private in the bot era</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"><p>If you’ve been running into endless CAPTCHAS or website login requests lately, you’re not imagining things. </p>



<p>Websites, facing a rising tide of abusive traffic from bots, are adopting increasingly aggressive countermeasures, damaging user’s experience of the web, their privacy and open access to the web.   </p>



<p>In this post, we’ll talk about a new <a href="https://www.cloudflare.com/press/press-releases/2026/cloudflare-collaborates-with-leading-browsers-to-develop-a-privacy-first-protocol-for-the-global-internet/" rel="noreferrer noopener" target="_blank">initiative</a> we’re launching with Cloudflare, other web browsers, and web stakeholders to address this challenge while <a href="https://blog.mozilla.org/en/privacy-security/web-anonymity/" rel="noreferrer noopener" target="_blank">keeping the web anonymous by default</a>.</p>



<p><strong>Privacy and access in tension</strong></p>



<p>The fight for privacy on the web has made real progress. Browsers that put privacy first are eliminating third-party cookies, restricting fingerprinting, and hiding IP addresses, pushing back against the trackers.</p>



<p>But every step forward has come with a cost.</p>



<p>Users are seeing more CAPTCHAs, more demands to log in, and more outright block pages than ever before. Building privacy into the browser means dismantling the passive signals, like IP addresses and browser fingerprints that are used to profile users, but are also relied on by anti-abuse systems. </p>



<p>At the same time, sites are facing large increases in bot traffic. The response from websites is understandable; volumetric abuse like credential stuffing and spam can do real damage. But the result is a lose-lose: users face mounting friction and reduced privacy, while sites drive away the legitimate visitors they wanted to serve.</p>



<p>If nothing changes, users will increasingly be forced to choose between their privacy and their access to the web. </p>



<p>Proposals have been made to tackle this dilemma, by asking users to prove to sites that their devices and software are ‘trusted’. These proposals, such as <a href="https://arstechnica.com/gadgets/2023/07/googles-web-integrity-api-sounds-like-drm-for-the-web/">Web Environment Integrity (WEI),</a> transfer control of devices away from users and to a small handful of operating system and hardware vendors. This deprives users of choice and control and gives those gatekeepers control over which devices and software can access the web, the opposite of the open web, which Mozilla is working to protect.   </p>



<p><strong>Finding a better way forward</strong></p>



<p>We think there’s a better way forward. It starts from a simple observation: bots cause harm because they operate at scale. To stop that kind of abuse, a site doesn’t need to know who you are, or that your device is restricted to running approved software. It only needs to know whether you’re staying within a reasonable rate limit.</p>



<p>To make a rate limit work, it must be hard for attackers to create new identities and reset their allowance. That’s one reason why sites demand an email address, a federated login or a device fingerprint: obtaining a new one is just costly enough to make the rate limit stick. The challenge is whether we can make rate limits work, without giving sites access to hard-to-change identifiers that also enable tracking. </p>



<p>Some sites naturally have a relationship with their users, like a subscription or a long-standing account. What if one of those existing relationships could quietly vouch for you elsewhere, so a site you’ve never visited could trust that you’re a real person within its limits, without learning who you are or even where the vouch came from?</p>



<p>For example, consider a VPN service. Many websites block VPN traffic entirely due to the high rates of abusive traffic blended with legitimate traffic. What if a VPN service could vouch for each of its subscribers? This would let sites manage a per-subscriber rate limit, meaning users get fewer roadblocks and sites get more of the legitimate traffic they want. Of course, this requires that the vouching system doesn’t enable sites to track VPN users, which would otherwise defeat the very purpose of using the VPN. </p>



<p>Enabling this kind of privacy-preserving vouching is already possible in a limited sense. Apple’s Private Access Tokens, built on a cryptographic protocol called Privacy Pass, let  Apple devices receive single use tokens they can later present to websites without those visits being linked together. </p>



<p>However, Private Access Tokens have some <a href="https://blog.mozilla.org/en/privacy-security/captcha-successor-privacy-pass-has-no-easy-answers-for-online-abuse/">critical shortcomings</a>. First, like WEI, they rely on device attestation, the very hardware gatekeeping we are determined to avoid. Second, there’s no easy way to open up the system to let more parties vouch for users without compromising on user privacy, which means concentrating control in the hands of a few. To keep the web open, we need a system where any site can vouch for users, and where other sites can decide who they trust to vouch for users responsibly.</p>



<p>This is a much harder problem, but we think the cryptographic foundations exist to deliver it. <a href="https://eprint.iacr.org/2024/1552">Anonymous credentials</a> let one party issue you a credential that you can later present to a site a limited number of times, whilst preventing sites and issuers from tracking its use. It’s even possible to hide which party issued it, proving only that it came from a set of trusted issuers. </p>



<p><strong>A fix is both essential and possible</strong></p>



<p>Building this into a system for the open web, where any site could vouch and any site could set its own limits is challenging, but we believe it’s both possible and essential in order to defuse the tension between privacy and access, while avoiding centralising control in a small number of gatekeepers.</p>



<p>Working with other web stakeholders, including Cloudflare and other browsers, we’ve started designing such a system. For a deeper dive, read our <a href="https://hacks.mozilla.org/2026/06/pact-anonymous-credentials-for-the-web/">post on Hacks</a>, which goes into more detail about the problem space and the approach we’re working on. </p>



<p>Our goal is simple: fewer CAPTCHAs, fewer unnecessary blocks and fewer demands to identify yourself, without compromising on privacy. This is the kind of web that Mozilla built Firefox to offer: easy to use, private and open to all. </p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/privacy-security/keeping-the-web-open-and-private-in-the-bot-era/">Keeping the web open and private in the bot era</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-06-23T15:56:54Z</updated>
    <published>2026-06-23T15:56:54Z</published>
    <category term="Firefox"/>
    <category term="Privacy &amp; Security"/>
    <author>
      <name>Dennis Jackson</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-07-14T12:38:41Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://hacks.mozilla.org/?p=48374</id>
    <link href="https://hacks.mozilla.org/2026/06/pact-anonymous-credentials-for-the-web/" rel="alternate" type="text/html"/>
    <title>PACT: Anonymous Credentials for the Web</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>This is the technical companion to our update on Distilled, “Keeping the web open and private in the bot era.” Here we take a deeper look at the problem space, the design we’re proposing, and the problems still left to solve. Bots (and privacy-preserving browsers) not welcome Browse a news site in a private window. Shop […]</p>
<p>The post <a href="https://hacks.mozilla.org/2026/06/pact-anonymous-credentials-for-the-web/">PACT: Anonymous Credentials for the 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 class="c43"><em><span class="c11 c1">This is the technical companion to our update on Distilled, </span><span class="c11 c1 c17"><a class="c5" href="https://blog.mozilla.org/en/privacy-security/keeping-the-web-open-and-private-in-the-bot-era/">“Keeping the web open and private in the bot era.”</a></span><span class="c11 c1"> Here we take a deeper look at the problem space, the design we’re proposing, and the problems still left to </span><span class="c1 c11">solve</span></em><span class="c13 c11 c1"><em>.</em> </span></p>
<h3 class="c24"><span class="c2 c1">Bots (and privacy-preserving browsers) not welcome </span></h3>
<p class="c40"><span class="c0">Browse a news site in a private window. Shop at a major retailer with a VPN. Visit a video streaming platform with anti-fingerprinting defenses tuned up. You’ll see the same responses: registration walls, block pages, and endless CAPTCHAs. The message is clear: </span><span class="c13 c11 c1">if we think you might be a bot, you’re not welcome</span><span class="c0">. </span></p>
<p class="c53"><span class="c0">Websites have valid reasons for wanting to block bots. Bots enable volumetric abuse</span><span class="c1">, abuse that wouldn’t otherwise be feasible if they had to be carried out by humans</span><span class="c0">. </span><span class="c0"> For example</span><span class="c1">: SEO comment spam, credential stuffing and DDoSing</span><span class="c0">.</span><span class="c0"> Consequently many sites employ dedicated anti-abuse tooling which aims to keep the bots out whilst minimizing friction for human visitors. </span></p>
<p class="c21"><span class="c0">Unfortunately, that tooling is increasingly failing at both tasks. Browser privacy protections are </span><span class="c3 c1"><a class="c5" href="https://blog.mozilla.org/en/firefox/fingerprinting-protections/">dismantling</a></span><span class="c0"> the passive signals that anti-abuse systems depended on to identify and distinguish </span><span class="c0">visitors</span><span class="c0">. Meanwhile advances in generative AI have rendered CAPTCHAs ineffective: bots now solve them </span><span class="c3 c1"><a class="c5" href="https://www.usenix.org/system/files/usenixsecurity23-searles.pdf">faster and more reliably</a></span><span class="c0"> than </span><span class="c0">humans</span><span class="c0">. </span></p>
<p class="c33"><span class="c0">Many sites are switching to more invasive mechanisms and now ask visitors to disclose </span><span class="c1">identifying information</span><span class="c0">,</span><span class="c0"> e.g. an email address, a federated login or </span><span class="c1">disabling their VPN</span><span class="c0">. This means greater friction for users, since providing these details on a first visit takes time. It also compromises their privacy, since these details enable the same kinds of cross-site tracking that browser privacy protections were intended to mitigate. </span></p>
<p class="c38"><span class="c0">This </span><span class="c1">leaves</span><span class="c0"> users </span><span class="c1">with a</span><span class="c0"> dilemma. The more effectively they protect their privacy, the harder it is for websites to distinguish them from bots and the worse the treatment they receive. Website operators are also suffering. The additional friction they inflict upon well-behaved visitors harms their site, but many are willing to pay the costs if it mitigates volumetric abuse. </span></p>
<p class="c44"><span class="c1">Browser-based AI agents make this tension more acute. Sites may want to allow agents which are acting on behalf of individual users while blocking agents engaged in volumetric abuse. However, with no effective mechanisms to distinguish the two, websites are opting to block </span><span class="c17 c1"><a class="c5" href="https://dl.acm.org/doi/epdf/10.1145/3730567.3732913">both</a></span><span class="c0">. That hurts users, who should be free to choose the user agent they use to access the web; it hurts new browsers and agents, which struggle to interoperate; and it hurts sites, which lose legitimate visitors.</span></p>
<p class="c30"><span class="c0">The consequence is that the web gets worse for everyone. Users get more friction or less privacy or both. Website operators see more volumetric abuse and the friction they add drives away users </span><span class="c1">who</span><span class="c0"> would otherwise want to consume their content or services. New user</span><span class="c1"> </span><span class="c0">agents struggle to access the same content as conventional browsers. </span></p>
<h3 class="c12"><span class="c20 c1">The</span><span class="c20 c1"> Costs of </span><span class="c2 c1">Convenient</span><span class="c2 c1"> Solutions</span></h3>
<p class="c9"><span class="c0">Some large ecosystem players have put forward solutions that leverage their control of the dominant operating systems and their deep integration with consumer hardware. These rely on device attestation: identifiers and privileged code baked into devices at the hardware level, which let manufacturers prove what software is running on a user’s device. Exposing this functionality to the web means attesting to sites that the user is running approved software with trusted hardware and therefore isn’t a bot. There have been two substantive proposals.</span></p>
<p class="c9"><span class="c0">Google’s Web Environment Integrity, <a href="https://www.theregister.com/software/2023/11/02/google-abandons-web-environment-integrity-api-proposal/335969">abandoned in 2023</a>, was the blunt version. It attested to the user agent itself, as well as the operating system and device in use. Users would have lost control in two ways: once to the attester, which would decide which operating systems and devices could be blessed, and again to the website, which would decide which software to accept. If sites had adopted allow-lists of approved user agents, building a new browser would have become virtually impossible, and sites could have withdrawn access from any user agent they chose.</span></p>
<p class="c9"><span class="c0">Apple’s Private Access Tokens, <a href="https://developer.apple.com/news/?id=huqjyh7k">deployed</a> across their ecosystem in 2022, have more subtle issues. Built on the Privacy Pass protocol standardized at the IETF, they get a lot right: a user receives a renewed, limited batch of one-time tokens that can be presented to websites without linking their visits together. This provides privacy for users and has shown rate limits to be an effective tool for sites – both points we’ll return to later in this post.</span></p>
<p class="c9"><span class="c1">However, Private Access Tokens rely on device attestation, requiring that the hardware manufacturer be in overall control of the user’s device. Presenting a PAT tells a website you are locked into Apple’s rules for what counts as acceptable software. </span><span class="c1">Due to PAT’s technical design</span><sup class="c1"><a href="https://hacks.mozilla.org/?p=48374#:~:text=PAT%20requires" id="ftnt_ref1">[1]</a></sup><span class="c1">, there’s no way to open the system to other sources of scarcity without compromising the system’s privacy properties, meaning that if more widely deployed, access to the web would</span><span class="c1"> become tied to having bought expensive hardware from a small, hard to change set of vendors</span><span class="c1">. </span></p>
<p class="c9"><span class="c1">Both approaches are ultimately hostile to users and to the openness of the web. Both are premised on parts of a user’s device that sit within the manufacturer’s control and beyond the user’s own. Were they widely deployed, the web would become just another walled garden with centralized gatekeepers controlling acceptable hardware, operating systems and software. As convenient as these solutions are for the players who already dominate the ecosystem, we think there’s a better path.</span></p>
<h3 class="c24"><span class="c2 c1">A Better Path Forward </span></h3>
<p class="c24"><span class="c1">Bots’ harms arise from their ability to operate beyond human scale. For sites to prevent volumetric abuse they</span><span class="c0"> don’t actually need to know </span><span class="c1">the user’s</span><span class="c0"> identity or </span><span class="c1">receive cryptographic</span><span class="c0"> proof that they’re running approved softwar</span><span class="c1">e. If sites knew their visitors were restricted to a rate </span><span class="c1">limit</span><span class="c1"> set by a site, that would be enough.  </span></p>
<p class="c34"><span class="c1">Rate limits</span><span class="c0"> only make sense if </span><span class="c1">they’re</span><span class="c0"> </span><span class="c1">tied to</span><span class="c0"> something scarce; something an attacker can’t cheaply replicate to evade the limit. </span><span class="c0">Without anchoring to a scarce resource, like the trusted hardware used in Private Access Tokens, attackers can generate as many fresh identities as they need to bypass the rate limit. </span></p>
<p class="c56"><span class="c1">However, </span><span class="c0">hardware is just one option for </span><span class="c1">scarcity</span><span class="c0">. Anything a user already has that an attacker can’t trivially spin up at scale will work</span><span class="c1">: e</span><span class="c0">mail addresses and phone numbers are naturally scarce</span><span class="c1">. A paid subscription costs an attacker the same as a real user.  </span><span class="c0">Even maintaining an account on a free service requires </span><span class="c1">some</span><span class="c0"> non-trivial work. </span></p>
<p class="c39"><span class="c0">What if we could use these scarce signals across the web? We</span><span class="c1"> could build </span><span class="c0">an open ecosystem with many parties offering scarcity signals, each site choosing which to accept. By </span><span class="c0">opening up who can provide a signal, and letting sites choose which to accept, we can avoid transferring control to device manufacturers and the resulting harms. </span></p>
<p class="c39"><span class="c1">As a concrete example of who might be well positioned to provide such a signal, we can consider VPN providers acting as a subscription service. Sites routinely block VPN users indiscriminately, whether through a deliberate policy choice or through an indirect consequence of rate limiting visitors per IP address. But a VPN subscription is a perfect source of scarcity. If the VPN provider could vouch for its users so that sites could rate limit each user individually – then users would be able to browse the web with less friction and without giving up their VPN usage. </span></p>
<p class="c35"><span class="c0">The catch is that building </span><span class="c1">a system that can enable this</span><span class="c0"> on the open web whilst </span><span class="c1">maintaining user’s privacy</span><span class="c0"> is genuinely difficult. </span><span class="c1">It requires that we take information from one site — that this user holds some scarce thing — and expose it to other sites so that they can use that as the basis for their rate limiting. </span><span class="c0">Letting one site verify a signal from another is </span><span class="c1">the sort of </span><span class="c0">information flow</span><span class="c1"> </span><span class="c0">that privacy-pr</span><span class="c1">eserving </span><span class="c0">browsers have spent the last decade locking down to </span><span class="c1">prevent cross-site tracking</span><span class="c0">. </span></p>
<p class="c35"><span class="c1">Our goal would be that no more than the minimum information gets through: a single bit communicating whether the user is below the rate limit set by the site. Leaking anything more – like the source of the scarcity that the rate limit is anchored to – would be unacceptable. Enabling a new cross-site information flow might feel like compromising privacy to gain better access, but reality is more nuanced. If a new system moves sites away from demanding that visitors be identifiable (whether through fingerprinting or login forms), </span><span class="c1">it can be a win for both privacy and access.</span></p>
<h3 class="c24"><span class="c2 c1">The Foundations </span></h3>
<p class="c50"><span class="c0">The good news is that the cryptographic foundations for a privacy preserving approach already exist. The </span><span class="c1 c3"><a class="c5" href="https://privacypass.github.io/">Privacy Pass protocol</a></span><span class="c3 c1"><a class="c5" href="https://www.google.com/url?q=https://privacypass.github.io/&amp;sa=D&amp;source=editors&amp;ust=1782228494401139&amp;usg=AOvVaw3uoXdqARBZKjQF5H8uwYKY">,</a></span><span class="c0"> </span><span class="c3 c1"><a class="c5" href="https://www.petsymposium.org/2018/files/papers/issue3/popets-2018-0026.pdf">originally developed in 2018</a></span><span class="c0"> to reduce the friction of Cloudflare CAPTCHAs for Tor users, introduced the core primitive: a token that is </span><span class="c13 c11 c1">unlinkable </span><span class="c0">between issuance and redemption. You prove something to an issuer (e.g. by </span><span class="c1">solving a CAPTCHA</span><span class="c0">), receive some tokens, and later present a token to a website. The website can verify the token is legitimate, but can’t link it to the user it was issued to. </span></p>
<p><img alt="A diagram showing the protocol flow for Privacy Pass." class="aligncenter size-full wp-image-48375" height="1639" src="https://hacks.mozilla.org/wp-content/uploads/2026/06/pact-drawings-1.excalidraw1-scaled.png" width="2560"/></p>
<p class="c27" style="text-align: left;"><img alt="" title=""/><span class="c20 c1 c57"><strong>Figure 1</strong>: </span><span class="c0"><em>In Privacy Pass, a CAPTCHA provider can issue tokens to a client which can then be used to bypass challenges for future site visits. Even if the CAPTCHA provider and sites collude, they can’t use the tokens to identify the user or their browsing history.</em> </span></p>
<p class="c52"><span class="c0">Privacy Pass has gone on to be successfully deployed in systems where the issuer and verifier have a prior trust relationship: </span><span class="c0">Apple</span><span class="c0"> uses it to authenticate users of </span><span class="c3 c1"><a class="c5" href="https://hacks.mozilla.org/feed/">Private Cloud Compute</a></span><span class="c0"> </span><span class="c1">and</span><span class="c0"> </span><span class="c3 c1"><a class="c5" href="https://www.apple.com/privacy/docs/iCloud_Private_Relay_Overview_Dec2021.PDF">Private Rel</a></span><span class="c17 c1"><a class="c5" href="https://www.google.com/url?q=https://www.apple.com/privacy/docs/iCloud_Private_Relay_Overview_Dec2021.PDF&amp;sa=D&amp;source=editors&amp;ust=1782228494402463&amp;usg=AOvVaw0KGoiSPg-8NLvNvIiSSbPt">ay</a></span><span class="c1"> </span><span class="c0">without linking their activity to their identity, </span><span class="c0">Chrome</span><span class="c0"> uses it for </span><span class="c3 c1"><a class="c5" href="https://github.com/GoogleChrome/ip-protection">two-hop IP protection</a></span><span class="c0">, and </span><span class="c0">Kagi</span><span class="c0"> uses it to provide </span><span class="c17 c1"><a class="c5" href="https://help.kagi.com/kagi/privacy/privacy-pass.html">private search</a></span><span class="c0">. </span><span class="c0">These deployments work in part because a small number of parties have agreed in advance on who issues tokens and who accepts them. </span></p>
<p class="c18"><span class="c0">Applying this approach to an open system where any site can act as</span><span class="c0"> an issuer</span><span class="c0"> </span><span class="c3 c1"><a class="c5" href="https://docs.google.com/document/d/1k3QJG2D_Sq4zJiJRn9DfY80hEHuz9UWrJdTt8LbRsMM/edit?tab=t.0#heading=h.r8jxzjcoeumo">brings real challenges</a></span><span class="c0">.</span><span class="c0"> Firstly, even though tokens are unlinkable, knowing a user has access to a specific issuer is a privacy leak on its own, because you can infer that the user meets the relevant issuance criteria. </span><span class="c1">If one site can learn that you have a token from another site, that reveals that you have been to that site, which can be a major privacy problem. </span><span class="c0">This compounds if </span><span class="c1">sites </span><span class="c0">can learn the set of issuers </span><span class="c1">you have visited</span><span class="c0">, since it becomes a fingerprint which can be used to identify </span><span class="c1">you</span><span class="c0">. </span></p>
<p class="c8"><span class="c3 c1"><a class="c5" href="https://blog.cryptographyengineering.com/2014/11/27/zero-knowledge-proofs-illustrated-primer/">Generic techniques</a></span><span class="c0"> exist for proving a statement in zero knowledge: we can prove that </span><span class="c1">a client</span><span class="c0"> ha</span><span class="c1">s</span><span class="c0"> a token from a set of acceptable issuers without revealing which specific issuer it is. We’ll call this issuer blinding. </span><span class="c0">The generic approach is often slow, but </span><span class="c3 c1"><a class="c5" href="https://www.ietf.org/archive/id/draft-orru-zkproof-sigma-protocols-01.html">bespoke approaches</a></span><span class="c0"> tailored to the underlying cryptography can improve this considerably. </span></p>
<p class="c54"><span class="c0">Another challenge is how sites using rate limits decide who to trust to issue tokens. If an issuer misbehaves then the site’s rate limits become ineffective, enabling volumetric abuse. However, if we need to prevent the site from learning which issuers a user has access to, the site is only going to know that one of its trusted issuers was used, not which one. This makes mistakes or misbehaviour by an issuer difficult to detect, and makes it hard for sites to evaluate new issuers. Solving this challenge is essential for openness. Without adequate information, </span><span class="c0">sites are likely to lean towards conservative issuer selection. </span><span class="c1">That could lead to less choice between Anchors, which in turn could lead to a new form of gatekeeper being created.</span><span class="c0"> </span></p>
<p class="c32"><span class="c0">To solve this, sites at least need a way to calculate an aggregate score for each issuer they use. This should roughly correspond to how much of the traffic it considers abusive to have come from users using that particular issuer. Mozilla has long invested in systems like </span><span class="c3 c1"><a class="c5" href="https://blog.mozilla.org/en/firefox/partnership-ohttp-prio/">Prio</a></span><span class="c0"> which use multiparty computation (MPC) to protect user privacy whilst enabling aggregate measurements of system behaviour. </span></p>
<p class="c59"><span class="c0">Privacy Pass also struggles to handle dynamic adjustments to rate limits. Once tokens have been issued, they’re difficult to invalidate without either revoking all active tokens or risking attacks which can compromise the privacy of users. It’s also beneficial if sites can adjust rate limits on a per </span><span class="c1">client</span><span class="c0"> basis, for example by increasing rate limits where they become more confident the </span><span class="c1">client</span><span class="c0"> is benign and withdrawing access </span><span class="c1">when abuse is detected</span><span class="c0">. </span></p>
<p class="c47"><span class="c3 c1"><a class="c5" href="https://www.ietf.org/archive/id/draft-schlesinger-cfrg-act-00.html">Anonymous Credit Tokens</a></span><span class="c0"> </span><span class="c0">offer a useful building block to solve this problem. Conventional Privacy Pass schemes rely on issuing a bucket of tokens but ACT works differently by enabling the use of a credential with state. For example, an ACT credential can hold an internal counter. When the credential is presented, the site can check the counter is over some threshold and mutate it, increasing or decreasing </span><span class="c1">the counter whenever</span><span class="c0"> the site’s perception of the holder has improved or worsened. Critically, the exact value is never leaked to the site, preventing the site from tracking the holder and ensuring successive presentations of the same credential can’t be linked. </span></p>
<h3 class="c24"><span class="c2 c1">Putting it together </span></h3>
<p class="c19"><span class="c1">So how can we combine these techniques to build a system which can enable privacy-preserving rate limiting on the open web? In May 2026, we participated in a </span><a href="https://pactworkshop.com/"><span class="c17 c1">W3C CG Meeting</span></a><span class="c0"> in collaboration with Cloudflare, Chrome and other web stakeholders in which we started sketching out a design we’re calling PACT – Private Access Control Tokens. </span></p>
<p class="c19"><span class="c0">Rate limits need a starting point, a source of scarcity to anchor on. We’ll call an entity that provides such a source an </span><span class="c2 c1">Anchor</span><span class="c0">. To a user who meets the Anchor’s criteria, like having a subscription,</span><span class="c0"> an account in good standing</span><span class="c0">, or a verified phone number, an Anchor issues a batch of </span><span class="c2 c1">Endorsement </span><span class="c0">tokens, following the Privacy Pass model. In practice, Anchors could be any website which has access to this kind of signal. An Endorsement conveys</span><span class="c1"> </span><span class="c0">scarcity to other sites. </span></p>
<p class="c51"><span class="c0">That’s enough for a simple system where access is </span><span class="c1">either granted or denied</span><span class="c0">. But as we discussed earlier, we also want the ability to increase access where a visitor behaves benignly and decrease it where they don’t. </span><span class="c1">The state needed to enforce a rate limit</span><span class="c0"> can’t live in the Endorsement, because Endorsements cross trust boundaries between unrelated sites. We need a second object that can hold that state, scoped to the party that maintains it. </span></p>
<p class="c48"><span class="c0">We’ll call that the party that handles rate limiting for a site a </span><span class="c2 c1">Moderator </span><span class="c0">and the stateful object a </span><span class="c2 c1">Credential</span><span class="c0">. </span><span class="c1">A Credential is specific to a Moderator and, unlike endorsements, we limit each site to nominating a single Moderator. In the common case the site itself plays the Moderator role, so there’s no new entity or trust boundary. </span><span class="c1">A Moderator can also be a third-party service shared across many sites, allowing those sites to cooperatively share a rate limit.</span><span class="c0"> </span></p>
<p class="c48"><span class="c0">In the terminology of the previous section, the Anchor is the issuer of Endorsements, and the Moderator both verifies Endorsements and issues Credentials. A Moderator manages rate-limit policy: it decides which Anchors it trusts, accepts their Endorsements, and issues a Credential in return.</span></p>
<p class="c14"><img alt="" title=""/><img alt="A diagram showing an overview of the PACT system" class="aligncenter size-full wp-image-48381" height="1655" src="https://hacks.mozilla.org/wp-content/uploads/2026/06/pact-drawings-5.excalidraw21-scaled.png" width="2560"/></p>
<p class="c14"><strong><span class="c1 c20">Figure 2: </span></strong><span class="c1"><em>(1) Clients acquire Endorsements from Anchors in the course of normal browsing to sites they have relationships with. (2) Clients can exchange Endorsements for a stateful Credential from a Moderator. (3) Credentials can be used to access sites which use that Moderator. Credentials can be updated over time.</em> </span></p>
<p class="c41"><span class="c0">Directly revealing which Anchor backed an Endorsement would leak a lot of information about the user. The issuer blinding techniques from the previous section solve this: when an Endorsement is redeemed, the Moderator only learns that it came from one of </span><span class="c1">the </span><span class="c0">Anchors it trusts, but not which one. </span></p>
<p class="c28"><span class="c0">When a Moderator covers more than one site, we let Credentials be presented across all of them but partition cookies and storage as</span><span class="c1"> we would for any other third party site</span><span class="c0">. The unlinkability of </span><span class="c1">Credential</span><span class="c0"> presentations keeps this from creating a new cross-site identifier. The benefit is that good behaviour on one site improves access on every site the Moderator covers, and bad behaviour cuts it everywhere. Websites can already build the same capability with a shared account system, so this doesn’t create a new way to lock users out, but it </span><span class="c1">does provide a</span><span class="c0"> new way to grant access without requiring users to give up their privacy. </span></p>
<p class="c28"><span class="c0">Enabling Moderators that cover many sites carries a centralisation risk, simila</span><span class="c1">r </span><span class="c0">to the concentration we see today in anti-abuse providers. The mitigation is that the choice of Moderator stays with each site, and the choice of trusted Anchors stays with each Moderator. Th</span><span class="c1">is</span><span class="c0"> </span><span class="c1">can’t</span><span class="c0"> reverse the centralisation pressure the web already faces, but it </span><span class="c1">ensures this system won’t lead to additional lock-in</span><span class="c0">: a new Anchor or a new Moderator can be adopted without coordinating with a dominant vendor. </span></p>
<p class="c46"><span class="c0">The </span><span class="c1">system then has three flows</span><span class="c0">.</span><span class="c0"> First, the user </span><span class="c1">receives</span><span class="c0"> Endorsements from an Anchor in the course of normal interaction</span><span class="c1">, based on the Anchor’s positive view of the user</span><span class="c0">. This is </span><span class="c0">a relatively rare operation for any given user and Anchor. After all, as our source of scarcity, Endorsements should not be too easy to accumulate.</span></p>
<p class="c10"><img alt="" title=""/><img alt="A diagram showing the PACT Anchor Flow" class="aligncenter size-full wp-image-48377" height="1789" src="https://hacks.mozilla.org/wp-content/uploads/2026/06/pact-drawings-3.excalidraw1-scaled.png" width="2560"/></p>
<p class="c10" style="text-align: left;"><strong><span class="c20 c1">Figure 3</span></strong><span class="c1">: <em>In the course of normal browsing, clients browse to websites they have a relationship with. These sites can act as Anchors by issuing Endorsements to clients.</em></span></p>
<p class="c26"><span class="c0">Second, when the user arrives at a site that works with a Moderator, the browser spends an Endorsement from an Anchor the Moderator trusts and receives a Credential in return. The presentation hides </span><span class="c13 c11 c1">which </span><span class="c0">Anchor was used, and </span><span class="c1">neither the Anchor nor the Moderator can trace the Endorsement back to where it was issued</span><span class="c0">. The Moderator decides what initial balance the Credential starts with. If the user has no Endorsements from suitable Anchors at all, existing mechanisms (CAPTCHAs, account creation, federated login) </span><span class="c1">could be used to</span><span class="c0"> bootstrap a Credential the same way, so the system degrades to today’s experience rather than locking the user out.</span></p>
<p class="c7"><img alt="" title=""/><img alt="A diagram showing the protocol flow between Anchors and Moderators" class="aligncenter size-full wp-image-48378" height="1789" src="https://hacks.mozilla.org/wp-content/uploads/2026/06/pact-drawings-4.excalidraw1-scaled.png" width="2560"/></p>
<p class="c7"><span class="c20 c1"><strong>Figure 4</strong></span><span class="c1"><strong>:</strong><em> When the client browses to a site, it can prompt the client for a Credential from the Moderator it uses. If the Client doesn’t have a suitable Credential, but does have a suitable Endorsement, it can exchange it for a Credential with the Moderator. In practice, the Moderator and the Site might be the same server. </em></span><em><span class="c0"> </span></em></p>
<p class="c25"><span class="c0">Third, as the user browses, the browser presents the Credential and the Moderator updates </span><span class="c1">the internal state of the Credential</span><span class="c0">. The </span><span class="c1">Moderator can reward </span><span class="c0">behaviour that looks benign and </span><span class="c1">penalize suspicious activity</span><span class="c0">, </span><span class="c1">but can’t track the use of the Credential or identify it if it’s used on other sites the Moderator covers</span><span class="c0">. </span><span class="c0">Revocation falls out of the same mechanism: a Moderator </span><span class="c1">can refuse to return an updated Credential</span><span class="c0">.</span><span class="c0"> </span></p>
<p class="c7"><img alt="" title=""/><img alt="A diagram showing the PACT Moderator Flow" class="aligncenter size-full wp-image-48379" height="1618" src="https://hacks.mozilla.org/wp-content/uploads/2026/06/pact-drawings-5.excalidraw1-scaled.png" width="2560"/></p>
<p class="c7"><strong><span class="c20 c1">Figure 5</span></strong><span class="c0"><strong>:</strong> <em>The Client can present the Credential on sites which use the matching Moderator. Sites can check if the Credential is in good standing. The sites can then adjust the access the Credential has in response to behaviour. E.g. increasing it when they gain confidence in the client or reducing it in response to malicious behaviour.</em></span></p>
<p class="c23"><span class="c0">In practice, all of this would happen transparently to the user through a WebAPI that sites acting as Anchors or Moderators would call from JavaScript. In an ideal ecosystem, users would accumulate Endorsements through normal browsing, just by virtue of the sites they already visit, and the rest of the flow would happen in the background as they move around the web, leaving </span><span class="c1">users</span><span class="c0"> with meaningfully less friction. </span></p>
<p class="c16"><span class="c0">AI agents acting on behalf of a user slot into the same flow. An agent can carry its user’s Credentials, in which case the user remains accountable for how the agent </span><span class="c1">behaves.</span><span class="c0"> </span><span class="c1">S</span><span class="c0">ites would not need to grant any more access than they would to the user themselves. Alternatively, the operator of an agent can run its own Anchor and vouch for its agents the way other Anchors vouch for human users. </span><span class="c0">Sites retain control over which Anchors they accept, so they can choose how to treat agent traffic without needing a separate detection mechanism. </span></p>
<p class="c6"><span class="c0">Several mechanisms combine to keep the information about a user that flows out close to a single bit. Cryptographic unlinkability ensures successive Credential presentations cannot be tied to each other or to the original issuance, so a user’s visits cannot be </span><span class="c1">joined</span><span class="c0"> into a history. Each site is bound to a single Moderator, so the set of Moderators a user has Credentials with never becomes a cross-site fingerprint. The Anchor-to-Credential exchange happens in an isolated browsing context, so during ordinary browsing the only thing the site or its Moderator ever observes is a Credential presentation: </span><span class="c1">the site only learns if </span><span class="c0">the user has a valid Credential below the rate limit, or </span><span class="c1">nothing</span><span class="c0">. </span><span class="c1">W</span><span class="c0">hen the Moderator updates a </span><span class="c1">Credential</span><span class="c0">, it</span><span class="c0"> adjusts the credentials state without learning what it is.</span></p>
<p class="c6"><span class="c1">The additional privacy given to users from </span><span class="c0">Issuer blinding</span><span class="c1"> makes participating in the system more challenging for Moderators</span><span class="c0">. Because the Moderator can’t see which Anchor backed a Credential at issuance, it can’t give a Credential from a strong Anchor </span><span class="c1">more access</span><span class="c0"> than one from a weak Anchor: doing so would itself leak which Anchor was used. The initial </span><span class="c1">access</span><span class="c0"> has to be uniform across the Moderator’s whole pool of Anchors, which in practice means setting it at the strength of the weakest. </span><span class="c1">However, this is only relevant for that initial access, the Moderator can update credentials according to the holder’s behavior, enabling Credential’s to accrue access over time.</span></p>
<p class="c42"><span class="c0">Building an open ecosystem also requires that sites can make effective decisions about the Anchors they choose to trust</span><span class="c1">. M</span><span class="c0">ultiparty computation systems like </span><span class="c0">Prio</span><span class="c0"> enable aggregate scoring without compromising pr</span><span class="c1">ivacy</span><span class="c0">. When users present Credentials, they can provide an encrypted share which identifies the anchor they use</span><span class="c1">d and can be privately aggregated to compute the quality of an issuer.</span></p>
<h3 class="c24"><span class="c2 c1">Next Steps </span></h3>
<p class="c49"><span class="c1">We think the</span><span class="c0"> architecture we</span><span class="c1">’ve </span><span class="c0">sketched </span><span class="c1">for PACT </span><span class="c0">has the right shape, but many of the details still need to be worked out</span><span class="c1"> and the entire system needs rigorous privacy and security analysis.</span></p>
<p class="c45"><span class="c0">We want to do that work in the open. The IETF is the natural venue for the cryptographic protocols underneath, and the W3C for the WebAPI surface that sits on top. </span><span class="c0">We’ll be </span><span class="c1">bringing</span><span class="c0"> </span><span class="c3 c1"><a class="c5" href="https://github.com/Moderation-of-unLinkable-Endorsements">draft specifications</a></span><span class="c1"> to these bodies as soon as they’re ready</span><span class="c0">, and we welcome collaborators from across the ecosystem: browser vendors, site operators, anti-abuse providers, and the cryptography community. </span></p>
<p class="c29"><span class="c0">If successful, we think we can provide a system which will keep the web open and </span><span class="c1">private</span><span class="c0">, while still giving sites the rate-limiting signal they need. </span></p>
<h3 class="c29"><span class="c2 c1">Acknowledgements</span></h3>
<p class="c4"><em><span class="c11 c1">The ideas described here are the result of collaboration and conversations with many people, including: Watson Ladd, Thibault Meunier, Michele Orrù, Trevor Perrin, Eric Rescorla, Samuel Schlesinger, Martin Thomson, Eric Trouton, Benjamin Vandersloot &amp; Cathie Yun.</span></em><span class="c11 c1"><em> </em> </span></p>
<hr class="c58"/>
<div>
<p class="c31"><a href="https://hacks.mozilla.org/?p=48374#:~:text=%5B1%5D" id="ftnt1">[1]</a><span class="c0"> PAT requires that the source of scarcity and an independent issuer be trusted not to collude. If they do, they can track users as they interact with the system. This is not suitable in the context of an open system where any party could play those two roles.</span></p>
</div>
<p>The post <a href="https://hacks.mozilla.org/2026/06/pact-anonymous-credentials-for-the-web/">PACT: Anonymous Credentials for the Web</a> appeared first on <a href="https://hacks.mozilla.org">Mozilla Hacks - the Web developer blog</a>.</p></div>
    </content>
    <updated>2026-06-23T15:29:52Z</updated>
    <published>2026-06-23T15:29:52Z</published>
    <category term="Firefox"/>
    <category term="firefox"/>
    <category term="privacy"/>
    <category term="security"/>
    <author>
      <name>Dennis Jackson</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-06-28T21:06:41Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/netpolicy/?p=2586</id>
    <link href="https://blog.mozilla.org/netpolicy/2026/06/23/building-competitive-digital-markets-from-rules-to-results/" rel="alternate" type="text/html"/>
    <title>Building Competitive Digital Markets: From Rules to Results</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Two years ago, the Digital Markets Act was the first of its kind: an ex ante competition framework introducing contestability and supporting innovation. But, as much as its critics try … <a class="go" href="https://blog.mozilla.org/netpolicy/2026/06/23/building-competitive-digital-markets-from-rules-to-results/">Read more</a></p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/06/23/building-competitive-digital-markets-from-rules-to-results/">Building Competitive Digital Markets: From Rules to Results</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>Two years ago, the Digital Markets Act was the first of its kind: an ex ante competition framework introducing contestability and supporting innovation. But, as much as its critics try to cast it as a European experiment, it was never alone. In 2019, expert reports across the <a href="https://www.chicagobooth.edu/-/media/research/stigler/pdfs/digital-platforms---committee-report---stigler-center.pdf">US</a>, <a href="https://op.europa.eu/en/publication-detail/-/publication/21dc175c-7b76-11e9-9f05-01aa75ed71a1/language-en?afd_azwaf_tok=eyJraWQiOiIxNkY3M0JFMkNDMjZDOUM1ODBGMzM4NjAzN0I1ODRCQTc4REQ1ODcwQUFFRkJGNEZDRUJFOUZEQkNGMENGMTNEIiwiYWxnIjoiUlMyNTYifQ.eyJhdWQiOiJvcC5ldXJvcGEuZXUiLCJleHAiOjE3ODIyMTEwNDQsImlhdCI6MTc4MjIxMTAzNCwiaXNzIjoidGllcjEtNjhiNWZjODc3NC01NmdzOCIsInN1YiI6IjEyYTo0YjoyY2JmOmQ1OmZlNjQ6MjkyODo0MDdhOmMzOGUiLCJkYXRhIjp7InR5cGUiOiJpc3N1ZWQiLCJyZWYiOiIyMDI2MDYyM1QxMDM3MTRaLTE2OGI1ZmM4Nzc0NTZnczhoQzFMT04xcnUwMDAwMDAwMG40MDAwMDAwMDAwOHUydiIsImIiOiItd1FJa2stbVUtZzUtdVh3MmVYeWVUOHlWanlYR1RBdm1ncEhCNkNMb3VVIiwiaCI6ImVoaWl0cHljUEVfOFRsVkZpU1JIV3o4Zl9UdU14VGduMnU1Z3NOamxYSlUifX0.wo6Nkk6kIiuxtYkfP8FFChuDMWFumyPWkxmmoLJeGIejbeAoPSjBmGFf7S-RHyP-Ln0A-dgpvzp67_WnVqfulSjGbtSvq3CJCip63xfbJpnfPv7LcKLT3hZVrtEyAYxWXbeuFcaxqWuA3gvQQAD0AYOQ9AqMxOC62PkszaflA842DtjCzVMlHniH892tJTRyJSyP9j2VPVBMx9tJ6nidak7asAMr3G4cIUeYlB26L6TNrUpVP9LPmvMqtdlPRGb5_hs1HWX0oVyBLlbdwNImoo8pu9XIwSixIfbl4Qq2YbVZDYtO50PMP_IKGf0AvcG6fxRfX1maru_ptV9haCBPGw.WF3obl2IDtqgvMFRqVdYkD5s">EU</a>, <a href="https://assets.publishing.service.gov.uk/media/5c88150ee5274a230219c35f/unlocking_digital_competition_furman_review_web.pdf">UK</a> and elsewhere studied the competitive dynamics of digital platforms. Today, the conversation has moved on to how to restore competition and choice within digital markets.</p>
<p>That shift was on display at Mozilla’s event in Brussels on 2 June, <em>“Rebalancing Digital Markets: Delivering Competition, Choice, and the Road Ahead.”</em> Regulators and policymakers from the EU, UK, Japan, and Brazil came together to assess what two years of reform have delivered and what still needs to happen. The answer was clearer than expected: ex ante competition regulation works, but only where it has been properly enforced.</p>
<h3>The proof of concept holds</h3>
<p>The DMA’s browser choice screen obligations have produced real, measurable results. We have <a href="https://blog.mozilla.org/netpolicy/2026/05/11/six-million-selections-later-how-the-dma-is-giving-people-browser-choice/">written</a> about the data in detail. The headline numbers: Firefox has been selected via a DMA choice screen over six million times in two years, once every ten seconds. Daily active users in the EU have grown to double those in comparable countries. People who choose Firefox through a choice screen are five times more likely to stick with it than those who arrive organically. The core finding is simple: this is what competition looks like when it is allowed to work. When users are given a genuine, well-designed choice, they take it. That was not a given. Earlier choice screens resulting from ex post antitrust processes produced no measurable impact. What changed was rigour and enforcement: working with behavioural economists, testing interfaces carefully, focusing on outcomes rather than checkbox compliance.</p>
<p>The lesson extends well beyond browsers. Desktop remains largely untouched, leaving roughly 310 million desktops and laptops in the EU without an equivalent level of browser choice. Windows users are still frequently steered towards Microsoft’s own services through design choices that override user choice or make switching more difficult than it should be. Ensuring that users of all gatekeeper services can easily change default settings, free from manipulative practices or undue influence, remains a critical test for DMA implementation. Choice screens can help, but they are not a silver bullet. Ecosystem lock-in, interoperability barriers and entrenched defaults continue to limit competition and innovation. The window to address these issues before new forms of digital gatekeeping become entrenched remains open, but it will not stay open indefinitely.</p>
<h3>Reform is going global and fast</h3>
<p>The institutional approaches across jurisdictions may differ, but the direction of travel is increasingly similar. Policymakers are recognising the need to address concentrated power in digital markets, expand user choice, and create conditions for competition and innovation to flourish.</p>
<p>The UK has opted for a flexible, case-by-case model and has already designated Google and Apple in respect of their mobile platforms. Japan scoped its legislation tightly to mobile, moved quickly, and is now seeking to ensure effective compliance for Japanese smartphone users. Brazil is building a framework calibrated to its own market realities.</p>
<p>None of these jurisdictions is simply copying the EU’s DMA. All of them are drawing on their experience and developing ex ante frameworks that work for their people and their economies: what a good choice screen looks like in practice, what regulatory capacity is needed before a law enters into force, and what happens when the large tech companies seek to undermine rather than facilitate choice and competition.</p>
<h3>What the momentum demands</h3>
<p>The consistent lesson is unglamorous: the staff, expertise, and industry relationships needed to enforce these rules have to be built before the law arrives, not after.</p>
<p>A clearer consensus is also forming around what enforcement needs to deliver. Rules that look good on paper but do not change what users experience every day are not enough. Technical expertise matters, particularly as AI raises questions that economists and lawyers alone cannot answer. The European Commission’s ongoing proceedings in AI distribution are a test of exactly this: whether regulators can move fast enough to ensure competing AI services are able to reach users before vertical integration entrenches dominance. And regulators need to be clear-eyed about a pattern that has emerged across jurisdictions: gatekeepers framing incomplete compliance as a deliberate policy choice, rather than acknowledging it as a failure to meet their obligations.</p>
<p>These are sophisticated companies, and they will keep testing what regulators will accept. The measure of this generation of digital market frameworks is not whether they passed through legislatures, but whether they can deliver real impact for people.</p>
<p>For Mozilla, that means ensuring the lessons travel: to desktop, to AI, and to every jurisdiction building its own version of these rules. Competition, choice, and true innovation in digital markets should be the norm, not the exception.</p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/06/23/building-competitive-digital-markets-from-rules-to-results/">Building Competitive Digital Markets: From Rules to Results</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></div>
    </content>
    <updated>2026-06-23T12:43:11Z</updated>
    <published>2026-06-23T12:43:11Z</published>
    <category term="Competition"/>
    <author>
      <name>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-07-03T10:36:33Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.nightly.mozilla.org/?p=2087</id>
    <link href="https://blog.nightly.mozilla.org/2026/06/22/eyedropper-quick-action-geckodriver-0-37-and-tighter-file-permissions-these-weeks-in-firefox-issue-205/" rel="alternate" type="text/html"/>
    <title>Eyedropper Quick Action, geckodriver 0.37, and Tighter File Permissions – These Weeks in Firefox: Issue 205</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Highlights Dao added a new Eyedropper quick action! Check it out by typing “color” or “eyedropper” in the URL bar (Bug 1803575) on Nightly. Henrik Skupin released geckodriver 0.37.0, which … <a class="go" href="https://blog.nightly.mozilla.org/2026/06/22/eyedropper-quick-action-geckodriver-0-37-and-tighter-file-permissions-these-weeks-in-firefox-issue-205/">Read more</a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><h3>Highlights</h3>
<ul>
<li>Dao added a new Eyedropper quick action! Check it out by typing “color” or “eyedropper” in the URL bar (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1803575">Bug 1803575</a>) on Nightly.</li>
</ul>
<p><img alt="Firefox URL bar dropdown with &quot;col&quot; typed in, showing an eyedropper button labeled &quot;Pick a color&quot; below search suggestions." class="aligncenter size-full wp-image-2084" height="358" src="https://blog.nightly.mozilla.org/files/2026/06/image1-3.png" width="724"/></p>
<ul>
<li>Henrik Skupin <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1938333">released geckodriver 0.37.0</a>, which includes support for several new APIs and various bug fixes. See the <a href="https://github.com/mozilla/geckodriver/releases/tag/v0.37.0">release page for details</a>.</li>
<li>Starting from Firefox 153, access to local file: URLs is being restricted by default.
<ul>
<li>Extensions now require an explicit “Access local files on your computer” permission, separate from broad host permissions, that users must grant.</li>
<li>Extensions can call the extension.isAllowedFileSchemeAccess() API to determine whether they have been granted access to file: URLs (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2034168">Bug 2034168</a>).</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=1941404%2C2039281%2C2024187%2C1674047%2C1986161%2C2043187%2C2019260%2C2027580%2C2027582%2C2041640%2C2039294%2C2042309%2C1830551%2C2031735%2C2043952%2C1972065%2C2043958%2C2042419%2C2042820%2C2022661%2C1994826%2C2041802%2C1315558%2C1930776%2C2042921%2C2043938">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>:Vincent</li>
<li>Chris Vander Linden</li>
<li>DrSeed</li>
<li>Khalid AlHaddad</li>
<li>Sam Johnson</li>
</ul>
<h4>New contributors (🌟 = first patch)</h4>
<ul>
<li>Francis :mckenfra: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1315558">tld service for webextensions</a></li>
<li>any1here: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042309">about:preferences#privacy is broken with MOZ_DATA_REPORTING false</a></li>
<li>pullmana8: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031735">Fix protocol/Actor.js to throw an Error instead of an Actor</a></li>
<li>RAN1: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1830551">Firefox Crashes on Quit When Running Two Browsers With Separate Profiles</a></li>
</ul>
<h3>Project Updates</h3>
<h4>Accessibility</h4>
<ul>
<li>Morgan added a new accessibility-specific, front-end review skill to mozilla central! 🎉 You can read about it, and learn how to use it <a href="https://firefox-source-docs.mozilla.org/bug-mgmt/processes/accessibility-review.html#automated-accessibility-review-skill">in the accessibility review source docs</a>.</li>
</ul>
<h4>Add-ons / Web Extensions</h4>
<h5>Addon Manager &amp; about:addons</h5>
<ul>
<li>Migrated addon-page-header and addon-card action buttons to the reusable moz-button web component as part of the ongoing Nova restyling of about:addons –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042200"> Bug 2042200</a> /<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042204"> Bug 2042204</a></li>
<li>Extended moz-page-nav-button with a forwarded title property to fix an accessibility issue where the component lacked a label in collapsed state; Landed in Firefox 153, and uplifted to Firefox 152 for about:settings which was already riding the 152 release train –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2040971"> Bug 2040971</a></li>
<li>Fixed a shutdown-timing bug where a pending GMP update-check timer could fire after XPCOMShutdownThreads started, causing a pref write assertion; Fixed in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2043803"> Bug 2043803</a></li>
</ul>
<h5>WebExtensions Framework</h5>
<ul>
<li>Fixed MV2 content scripts incorrectly injecting into guarded hosts because MozDocumentMatcher::MatchesURI was not consulting CheckGuarded when mCheckPermissions was false; Fixed in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2041393"> Bug 2041393</a></li>
<li>Added support for accessing ObservableArray attributes (such as adoptedStyleSheets) from XrayWrappers and extension content scripts, unblocking extensions that rely on this Web API; Fixed in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1751346"> Bug 1751346</a></li>
<li>Wired runtime_blocked_hosts and runtime_allowed_hosts enterprise policy settings through ExtensionSettings to allow administrators to restrict extension host permissions on managed devices, starting in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1805205"> Bug 1805205</a>
<ul>
<li>Thanks to Mike Kaply for implementing this enterprise policy enhancement.</li>
</ul>
</li>
</ul>
<h5>WebExtension APIs</h5>
<ul>
<li>Fixed promiseTabWhenReady blocking indefinitely on discarded tabs, preventing cleanup of associated resources and potentially causing memory leaks; Fixed in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1653876"> Bug 1653876</a></li>
<li>Fixed webNavigation.onCommitted being dispatched twice for cross-origin iframes loaded under Fission, caused by a redundant OnStateChange trigger firing in addition to OnLocationChange; Fixed in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1750196"> Bug 1750196</a></li>
</ul>
<h4>DevTools</h4>
<ul>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=766005">Chris Vander Linden</a> made the Search input component shared as we plan to use it in the Netmonitor as well (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019260">#2019260</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027580">#2027580</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027582">#2027582</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=631103">pullmana8</a> improved error management in the DevTools protocol (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031735">#2031735</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=553004">Chris H-C :chutten</a> removed Legacy Telemetry devtools instrumentation (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2039650">#2039650</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=13647">:glob ✱</a> fixed an issue in the Inspector where the swatch color for variable in @starting-style rule could have the wrong color (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2016778">#2016778</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> exposed heading level more clearly in the accessibility tree (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1588784">#1588784</a>) and in the accessibility highlighter (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2044904">#2044904</a>)</li>
</ul>
<p><img alt="Accessibility panel in Firefox DevTools showing a selected &quot;heading (level 3)&quot; node named &quot;Backwards compatibility.&quot;" class="aligncenter size-full wp-image-2083" height="375" src="https://blog.nightly.mozilla.org/files/2026/06/image2-3.png" width="727"/></p>
<ul>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=559949">Julian Descottes [:jdescottes]</a> migrated the markup view to HTML (from XHTML) to fix an issue when editing the markup (CodeMirror 6 does not support XHTML) (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028058">#2028058</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> fixed an issue in Netmonitor search where it could appear the the search stalled (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042405">#2042405</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=656417">Hubert Boma Manilla (:bomsy)</a> added more connection information (ECH, Delegated Credentials, OCSP, Private DNS, …) in Netmonitor Security tab (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2036404">#2036404</a>)</li>
</ul>
<h4>WebDriver</h4>
<ul>
<li>Khalid AlHaddad improved the window manipulation commands in Marionette and WebDriver BiDi to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1941404">allow individual window geometry properties, such as x, y, width, and height, to be adjusted independently</a>.</li>
<li>Khalid AlHaddad updated our codebase to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1972065">use constants instead of hardcoded strings</a> for all our session data types.</li>
<li>Alexandra Borovova updated <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2015655">the “emulation.setLocaleOverride” command to also apply a locale emulation in dedicated and shared workers</a>.</li>
<li>Alexandra Borovova fixed <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042385">a regression when there would be no “script.realmCreated” events after the cross-origin navigation</a>.</li>
</ul>
<h4>Search and Urlbar</h4>
<ul>
<li>Dharma updated context search actions to trigger search instead of entering search mode @ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1945080">1945080</a></li>
<li>Daisuke and Drew worked on a lot of Nova updates, including ensuring Nova is tested @ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2041255">2041255</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030183">2030183</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019168">2019168</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2044849">2044849</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033583">2033583</a></li>
<li>Moritz has worked on several refactorings to allow the urlbar to be used in content @ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2039828">2039828</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2039298">2039298</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2041280">2041280</a></li>
<li>Middle click paste replaces content was fixed by Moritz @ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042893">2042893</a></li>
<li>Michel added feature to show registrable domain on desktop after its implementation on mobile @ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986161">1986161</a></li>
</ul></div>
    </content>
    <updated>2026-06-22T19:57:24Z</updated>
    <published>2026-06-22T19:57: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-22T19:57:24Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148663</id>
    <link href="https://discourse.mozilla.org/t/new-deploy-of-perfcompare-june-17th/148663" rel="alternate" type="text/html"/>
    <title>New Deploy of PerfCompare (June 17th)</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>[andra - <a href="https://github.com/mozilla/perfcompare/commits?author=esanuandra" rel="noopener nofollow ugc">esanuandra </a>]</p>
<ul>
<li>PCF-391 The keyboard handling for the revision dropdown should be done differently <strong>(</strong><span class="hashtag-raw">#926</span>)</li>
</ul>
<p>[david - <a href="https://github.com/mozilla/perfcompare/commits?author=davidmiculit" rel="noopener nofollow ugc">davidmiculit</a> ]</p>
<ul>
<li>Bug 2040649 - Remove Raptor framework from PerfCompare (<span class="hashtag-raw">#1042</span>)</li>
</ul>
<p>[kala - <a href="https://github.com/mozilla/perfcompare/commits?author=kala-moz" rel="noopener nofollow ugc">kala-moz</a> ]</p>
<ul>
<li>
<p>Results Page: Return the scatter series for base and new back to original order (<span class="hashtag-raw">#1046</span>)</p>
</li>
<li>
<p>Bug: 2044194 Port client-side KDE mode detection from kde-widget into CommonGraph (<span class="hashtag-raw">#1045</span>)</p>
</li>
<li>
<p>Bug 2034263: Give subtest column in subtest page a max-width (<span class="hashtag-raw">#1047</span>)</p>
</li>
</ul>
<p>[paul - <a href="https://github.com/mozilla/perfcompare/commits?author=padenot" rel="noopener nofollow ugc">padenot</a>]</p>
<ul>
<li>
<p>Two small followups on modal-work (<span class="hashtag-raw">#1049</span>)</p>
</li>
<li>
<p>Assorted fixes to improve the app when numbers are very large and not measuring time. (<span class="hashtag-raw">#1050</span>)</p>
</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-june-17th/148663">Read full topic</a></p></div>
    </summary>
    <updated>2026-06-17T16:46:44Z</updated>
    <published>2026-06-17T16:46:44Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>csevere</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/new-deploy-of-perfcompare-june-17th/148663.rss" title="New Deploy of PerfCompare (June 17th)"/>
      <updated>2026-07-15T16:59:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:this-week-in-rust.org,2026-06-17:/blog/2026/06/17/this-week-in-rust-656/</id>
    <link href="https://this-week-in-rust.org/blog/2026/06/17/this-week-in-rust-656/" rel="alternate" type="text/html"/>
    <title>This Week in Rust 656</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#projecttooling-updates">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://arxiv.org/abs/2606.15991">cuTile Rust - Fearless Concurrency on the GPU, memory-safe, data-race-free GPU kernels, B200 benchmarks</a></li>
<li><a href="https://www.iroh.computer/blog/v1">Iroh 1.0 - Dial Keys, not IPs</a></li>
<li><a href="https://manishearth.github.io/blog/2026/06/14/diplomat-multi-language-ffi-for-rust-libraries/">Diplomat - Multi-language FFI for Rust libraries</a></li>
<li><a href="https://sergey-melnychuk.github.io/2026/05/23/yevm/">I built EVM from scratch. Again.</a></li>
<li><a href="https://zelanton.github.io/processkit/">processkit 1.0 - async process tree management</a></li>
<li><a href="https://github.com/obazin/litchee/releases/tag/v0.1.0">litchee: Rust Lichess API client</a></li>
<li><a href="https://jolars.co/blog/2026-06-10-basin/">Basin - Numerical Optimization in Rust</a></li>
<li><a href="https://github.com/carboxyl-rs/carboxyl/releases/tag/v0.1.0-servo-rc.1">Carboxyl 0.1.0-rc - A servo-based browser for the terminal</a></li>
<li><a href="https://github.com/kunobi-ninja/kache/releases/tag/v0.6.0">kache 0.6.0 - a shareable Rust + C/C++ build cache</a></li>
<li><a href="https://github.com/GianIac/numax/releases/tag/v0.1.0">numax v0.1.0 - first stable release of the numax distributed WASM runtime</a></li>
<li><a href="https://dev.to/etoile_bleu/-i-built-a-sync-engine-for-clinics-that-run-on-2g-and-lose-power-mid-transfer-here-is-why-and-18od">ZamSync - offline-first Rust sync engine</a></li>
<li><a href="https://dev.to/phpcraftdream/ktav-i-got-fed-up-with-every-config-format-so-i-built-one-with-no-quotes-no-commas-no-54an">Ktav - a quote-free config format</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://trifectatech.org/blog/zlib-rs-in-firefox/">zlib-rs in Firefox</a></li>
<li><a href="https://corrode.dev/blog/rust-prevents-data-races-not-race-conditions/">Rust Prevents Data Races, Not Race Conditions</a></li>
<li><a href="https://fnordig.de/2026/06/16/build-your-project-zig-style/">Build your project Zig-style</a></li>
<li><a href="https://kobzol.github.io/rust/2026/06/15/how-memory-safety-cves-differ-between-rust-and-c-cpp.html">How memory safety CVEs differ between Rust and C/C++</a></li>
<li><a href="https://kerkour.com/stdx-cratesio">Why stdx is not on crates.io</a></li>
<li>[videos] <a href="https://www.youtube.com/watch?v=PrfMpCaIh0k&amp;list=PL8Q1w7Ff68DBpmF38rcIAf8Z9Gj2TnlgM">RustWeek 2026 by RustNL, all talks playlist</a></li>
<li><a href="https://www.p2claw.com/blog/2026-06-09-the-ipad-was-on-tailscale/">The iPad was on Tailscale</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://blog.sheerluck.dev/posts/learn-rust-concurrency-by-building-a-thread-pool/">Learn Rust Concurrency By Building a Thread Pool</a></li>
<li><a href="https://grack.com/blog/2026/06/11/life-before-main/">There Is Life Before Main in Rust</a></li>
<li><a href="https://wolfgirl.dev/blog/2026-06-16-async-task-locals-from-scratch/">Async Task Locals From Scratch</a></li>
<li><a href="https://dystroy.org/blog/picomobile/">Fearless Embedded Rust: Driving a Lego Car with a Pico W</a></li>
<li><a href="https://smista.ai/blog/how-we-built-a-provider-agnostic-llm-layer-in-rust-with-rig">Building a provider-agnostic LLM layer in Rust with Rig</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#miscellaneous">Miscellaneous</a></h5>
<ul>
<li>[video] <a href="https://2026.rustweek.org/blog/2026-06-10-rustweek-recordings-published/">RustWeek 2026 talk recordings</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/ArneCode/marser">marser</a>, a parser combinator library with a twist.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1611">Arne Code</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/satyakwok/solana-infra-doctor/issues/77">solana-infra-doctor - List exit codes in <code>sol-doctor --help</code></a></li>
<li><a href="https://github.com/satyakwok/solana-infra-doctor/issues/78">solana-infra-doctor - Make the invalid-URL error suggest the expected scheme</a></li>
<li><a href="https://github.com/satyakwok/solana-infra-doctor/issues/79">solana-infra-doctor - Add a glossary of RPC readiness terms</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>
</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>527 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-06-09..2026-06-16">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/156187"><code>obligations_for_self_ty</code>: skip irrelevant goals (recompute <code>sub_root</code> from <code>stalled_vars)</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157768"><code>codegen_ssa</code>: peel trans. wrappers on scalable vecs</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156934">add a check for impossible predicates to <code>trivial_const</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156816">add unstable loop unrolling hint attributes</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157714">improve polymorphization of raw pointer formatting</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155200">introduce <code>#[diagnostic::on_type_error(message)]</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157781">perf: reuse green-marking's edge walk when promoting a node</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/157355">add <code>or_try_*</code> variants for <code>HashMap</code> and <code>BTreeMap</code> Entry APIs</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/149749">make <code>BorrowedBuf</code> and <code>BorrowedCursor</code> generic over the data</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155527">replace printables table with <code>unicode_data.rs</code> tables</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157876">stabilize <code>#![feature(box_as_ptr)]</code></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/pull/152544">stabilize <code>int_format_into</code> feature</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157877">stabilize <code>nonzero_from_str_radix</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157029">stabilize feature <code>float_algebraic</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/17104"><code>trim-paths</code>: emit <code>CARGO_TRIM_PATHS_REMAP</code> for build.rs</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17101"><code>diag</code>: Give diagnostics the same display path behavior as rustc</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17095"><code>diag</code>: Report all errors, in order</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17071"><code>publish</code>: avoid false deadlock when <code>to_confirm</code> is non-empty</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17083"><code>resolver</code>: move yank policy to resolver layer</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/141000">also run lint <code>unused_doc_comments</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157874">cleanup and (micro-)optimize <code>print_where_clause</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157740">correct doctest span for trailing semicolon after item</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157838">don't strip hidden items in <code>AliasedNonLocalStripper</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157796">some more lazy formatting</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rustfmt">Rustfmt</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rustfmt/pull/6616">add <code>doc_comment_code_block_small_heuristics</code>, to override <code>use_small_heuristics</code> in doc code</a></li>
<li><a href="https://github.com/rust-lang/rustfmt/pull/6935">stabilize <code>hex_literal_case</code></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/17042">new <code>by_ref_peekable_peek</code> lint</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17192">add <code>with_capacity_zero</code> lint</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17191"><code>mem_replace_with_default</code>: also emit inside macros</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17175"><code>infallible_destructuring_match</code>: clean-up, split off the suggestion from the main message</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17184"><code>manual_is_variant_and</code>: lint <code>result.ok().is_some_and(f)</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17171"><code>needless_borrow</code>: same-name methods false positive</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17216"><code>unnecessary_lazy_evaluations</code>: handle closure <code>-&gt;</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17208">deprecate the <code>from_iter_instead_of_collect</code> lint</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17204">remove <code>is_integer_const</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17250">do not trigger <code>ref_patterns</code> lint on automatically derived code</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17145">enhance never loop</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/15779">add profile-specific configuration for disallowed methods and types</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16749">fix <code>collapsible_match</code> suggests wrongly when match body has no braces</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16868">fix <code>unnecessary_sort_by</code> reverse suggestion using wrong closure parameter name</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17107">fix redundant closure call async false positive</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17218">perf: check <code>is_in_test</code> last in <code>incompatible_msrv</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17219">perf: check the token kind before extracting source in early literal lints</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17220">perf: match expression shape before MSRV check in <code>cloned_ref_to_slice_refs</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17217">perf: skip <code>doc_markdown</code> text collection and word scan when the lint is allowed</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17225">perf: skip <code>single_component_path_imports</code> module walk when nothing to lint</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/22562">create directory for <code>cargo xtask metrics rustc_tests</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22575">don't count C-variadic <code>...</code> as a parameter for fn pointers</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22549">support flyimport exclude variants</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22566">fix destructuring assignments not introducing moves</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22584">offer inline macro in macro call and proc macro</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22591">prefer bench command when target is bench to avoid cargo run</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22551">supports inline variable in macro</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22574">use package id as argument to <code>--package</code> if package is not unique</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22545">assist <code>inline_type_alias</code> work on ADT definitions</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22579">perf: defer initial workspace flycheck until cache priming completes</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22561">remove docs about removed <code>analysis-bench</code> command</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22571">remove unnecessary feature flags from tests</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22585">use ASCII lowercase for dylib extensions check</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 had quite a lot of changes, a few small regressions that were a bit tough to diagnose, but the week is largely positive, overall.
Notably, we got one massive improvement on the next-solver benchmark in #<a href="https://github.com/rust-lang/rust/pull/156187">156187</a>,
and a nice speedup for incremental in <a href="https://github.com/rust-lang/rust/pull/157781">#157781</a>.</p>
<p>Triage done by <strong>@panstromek</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=f3ef3bd882dd24a275a60701a67c3bb330edd8c1&amp;end=b5d46ecb51c3e4134b82570cfe718f093daa6390&amp;absolute=false&amp;stat=instructions%3Au">f3ef3bd8..b5d46ecb</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.2%, 0.6%]</td>
<td style="text-align: center;">22</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%, 2.0%]</td>
<td style="text-align: center;">40</td>
</tr>
<tr>
<td style="text-align: center;">Improvements ✅ <br/> (primary)</td>
<td style="text-align: center;">-1.8%</td>
<td style="text-align: center;">[-5.9%, -0.1%]</td>
<td style="text-align: center;">125</td>
</tr>
<tr>
<td style="text-align: center;">Improvements ✅ <br/> (secondary)</td>
<td style="text-align: center;">-3.8%</td>
<td style="text-align: center;">[-69.4%, -0.1%]</td>
<td style="text-align: center;">90</td>
</tr>
<tr>
<td style="text-align: center;">All ❌✅ (primary)</td>
<td style="text-align: center;">-1.5%</td>
<td style="text-align: center;">[-5.9%, 0.6%]</td>
<td style="text-align: center;">147</td>
</tr>
</tbody>
</table>
<p>1 Regression, 4 Improvements, 8 Mixed; 5 of them in rollups
28 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/d36b1ad8679b65efbb98252fbb93f72a7d90d4c6/triage/2026/2026-06-16.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/pull/156047">Fix trait method resolution on an adjusted never type</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/76314">Tracking Issue for atomic_from_mut</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155499">stabilize never type</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/153563">Lint against iterator functions that panic when N is zero</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/1002">Single-byte counter support in coverage instrumentation</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1003">Rename the compiler files containing struct diagnostics to <code>diagnostics.rs</code></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/301">Delegate Project Grants to the Funding team</a></li>
<li><a href="https://github.com/rust-lang/leadership-council/issues/304">Allocate budget to the Funding team</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/3955">Named Fn trait parameters</a></li>
</ul>
<h7><a class="toclink" href="https://this-week-in-rust.org/atom.xml#language-reference"/><a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a></h7>
<ul>
<li><a href="https://github.com/rust-lang/reference/pull/2262">Structs with no fields or all-ZST fields are ZSTs</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> 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><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-06-17 - 2026-07-15 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<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/315210366/"><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 (Charlottesville, VA, US) | <a href="https://www.meetup.com/charlottesville-rust-meetup/events/">Charlottesville Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/charlottesville-rust-meetup/events/315211402/"><strong>Learning Game Development the Hard Way with Rust and Bevy</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, UK) | <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>
<li>2026-07-14 | 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/310254778/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-07-15 | 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/314233743/"><strong>Jiff</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-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 | 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/315093492/"><strong>Rust and Friends comes to Glasgow! (daytime coffee)</strong></a></li>
</ul>
</li>
<li>2026-06-18 | 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/315093500/"><strong>Rust and Friends comes to Glasgow! (evening pub)</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-24 | Manchester, GB | <a href="https://www.meetup.com/rust-manchester/events/">Rust Manchester</a><ul>
<li><a href="https://www.meetup.com/rust-manchester/events/315200163/"><strong>Rust Manchester June Talks</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-06-25 | Copenhagen, DK | <a href="https://www.meetup.com/copenhagen-rust-community/events/">Copenhagen Rust Community</a><ul>
<li><a href="https://www.meetup.com/copenhagen-rust-community/events/315214426/"><strong>Rust meetup #69</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>
<li>2026-07-09 | 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>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<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-18 | Nashville, TN, US | <a href="https://www.meetup.com/music-city-rust-developers/events/">Music City Rust Developers</a><ul>
<li><a href="https://www.meetup.com/music-city-rust-developers/events/315213927/"><strong>Community Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-20 | 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/315225854/"><strong>Northeastern Rust Lunch, June 20</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx/events/">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/315105633/"><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-06-27 | 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/315225857/"><strong>Somerville Union Square Rust Lunch, June 27</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>
<li>2026-07-04 | 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/315225861/"><strong>Boston University Rust Lunch, July 4</strong></a></li>
</ul>
</li>
<li>2026-07-09 | 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/314696647/"><strong>Utah Rust July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-11 | 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/315225865/"><strong>MIT Rust Lunch, July 11</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>"The never type is named after the date of its stabilization" was a good joke while it lasted.</p>
</blockquote>
<p>– <a href="https://www.reddit.com/r/rust/comments/1u1v53c/the_never_type_is_likely_to_stabilize_soon/oqss8ii/">Sergey "Shnatsel" Davidoff on /r/rust</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1780">Dos Moonen</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/1u8wwfp/this_week_in_rust_656/">Discuss on r/rust</a></small></p></div>
    </content>
    <updated>2026-06-17T04:00:00Z</updated>
    <published>2026-06-17T04: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-07-08T04:00:00Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://fxdx.dev/?p=547</id>
    <link href="https://fxdx.dev/firefox-webdriver-newsletter-152/" rel="alternate" type="text/html"/>
    <title>Firefox WebDriver Newsletter 152</title>
    <summary>Firefox 152 adds Private Browsing support for extension installs, enforces screenshot dimension limits, improves download behavior, and fixes navigation error reporting.</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 152 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 152, multiple WebDriver bugs were fixed by contributors:</p>



<ul id="block-b10e4a7c-ea74-4805-9e31-4bb37551e682">
<li>Khalid AlHaddad extended the <a href="https://bugzil.la/1947679">webExtension.install command to support installing web extensions enabled in Private Browsing mode.</a></li>



<li>Sameem improved the <a href="https://bugzil.la/2020302">Marionette and WebDriver BiDi screenshot commands to enforce maximum allowed dimensions</a>.</li>



<li>Amin Amir <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031599">fixed a bug in browsingContext.sys.mjs</a> where a private field was incorrectly assigned without the # prefix.</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>
<li>Improved the <a href="https://bugzil.la/2020302">Marionette and WebDriver BiDi screenshot commands to enforce maximum allowed dimensions</a>.</li>
</ul>



<h3>WebDriver BiDi</h3>



<ul>
<li>Extended the <a href="https://bugzil.la/1947679"><code>webExtension.install</code> command to support installing web extensions in Firefox enabled in Private Browsing mode</a>. </li>



<li>Improved the <a href="https://bugzil.la/2017252"><code>browser.setDownloadBehavior</code> command to allow overriding the download target folder</a> before the temporary file is created.</li>



<li>Fixed <a href="https://bugzil.la/2018237">network events to only forward in-memory cached JavaScript responses</a> when there is a matching network event collector, avoiding unnecessary data forwarding.</li>
</ul>



<h3>Marionette</h3>



<ul>
<li>Improved the <a href="https://bugzil.la/2033769"><code>WebDriver:Navigate</code> and <code>WebDriver:Refresh</code> commands to properly report errors when triggering the navigation fails</a>, instead of silently ignoring them.</li>
</ul></div>
    </content>
    <updated>2026-06-16T14:00:00Z</updated>
    <published>2026-06-16T14: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-06-16T08:14:14Z</updated>
    </source>
  </entry>

  <entry>
    <id>discourse.mozilla.org-topic-148655</id>
    <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-june-16-2026/148655" rel="alternate" type="text/html"/>
    <title>Firefox Profiler Deployment (June 16, 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>[Nazım Can Altınova] Add source map symbolication and source view support (<a href="https://github.com/firefox-devtools/profiler/pull/6018" rel="noopener nofollow ugc">#6018</a>)
<ul>
<li>It requires Firefox changes that will land in Firefox 154, but after these changes, you will be able to see the source mapped function names as well as the source contents!</li>
</ul>
</li>
<li>[fatadel] Upgrade to React 19 (<a href="https://github.com/firefox-devtools/profiler/pull/6067" rel="noopener nofollow ugc">#6067</a>)</li>
<li>[fatadel] Drive counter tooltips from a tooltipRows schema (<a href="https://github.com/firefox-devtools/profiler/pull/6023" rel="noopener nofollow ugc">#6023</a>)</li>
<li>[Markus Stange] Support reading profiles from JsonSlabs files (<a href="https://github.com/firefox-devtools/profiler/pull/6037" rel="noopener nofollow ugc">#6037</a>)</li>
<li>[fatadel] Replace the footer-links overlay with a settings menu (<a href="https://github.com/firefox-devtools/profiler/pull/6042" rel="noopener nofollow ugc">#6042</a>)</li>
</ul>
<p><strong>Other Changes:</strong></p>
<ul>
<li>[Nazım Can Altınova] Fix call node context menu being hidden behind source view bottom box (<a href="https://github.com/firefox-devtools/profiler/pull/6045" rel="noopener nofollow ugc">#6045</a>)</li>
<li>[Nazım Can Altınova] Pass <code>--use-env-proxy</code> only when the node version is &gt;= 24 (<a href="https://github.com/firefox-devtools/profiler/pull/6064" rel="noopener nofollow ugc">#6064</a>)</li>
<li>[fatadel] Upgrade <span class="mention">@firefox-devtools</span>/react-contextmenu to 5.2.4 (<a href="https://github.com/firefox-devtools/profiler/pull/6066" rel="noopener nofollow ugc">#6066</a>)</li>
<li>[Markus Stange] Switch profiler-edit from minimist to commander (<a href="https://github.com/firefox-devtools/profiler/pull/6065" rel="noopener nofollow ugc">#6065</a>)</li>
<li>[Florian Quèze] Don’t fail profile processing when a marker’s stack field is not a backtrace (<a href="https://github.com/firefox-devtools/profiler/pull/6069" rel="noopener nofollow ugc">#6069</a>)</li>
<li>[fatadel] Remove unused undici-types package (<a href="https://github.com/firefox-devtools/profiler/pull/6074" rel="noopener nofollow ugc">#6074</a>)</li>
<li>[cathaysia] Update isLocalURL to include LAN addresses, .local domains, and hostn… (<a href="https://github.com/firefox-devtools/profiler/pull/5973" rel="noopener nofollow ugc">#5973</a>)</li>
<li>[Markus Stange] Fix from-url with binary profiles (<a href="https://github.com/firefox-devtools/profiler/pull/6072" rel="noopener nofollow ugc">#6072</a>)</li>
<li>[Markus Stange] Add an insertStackLabels helper. (<a href="https://github.com/firefox-devtools/profiler/pull/6076" rel="noopener nofollow ugc">#6076</a>)</li>
<li>[fatadel] Add TrackPower–tooltip-average-power-microwatt (<a href="https://github.com/firefox-devtools/profiler/pull/6080" rel="noopener nofollow ugc">#6080</a>)</li>
<li>[Markus Stange] Downgrade to React 19.1 to fix unusable dev build performance. (<a href="https://github.com/firefox-devtools/profiler/pull/6082" rel="noopener nofollow ugc">#6082</a>)</li>
<li>[spokodev] fix(FilterNavigatorBar): clip overflow so many breadcrumbs do not expand the parent (<a href="https://github.com/firefox-devtools/profiler/pull/6085" rel="noopener nofollow ugc">#6085</a>)</li>
<li>[Markus Stange] Move paddings inside the tree header cells. (<a href="https://github.com/firefox-devtools/profiler/pull/6002" rel="noopener nofollow ugc">#6002</a>)</li>
<li>[Markus Stange] Add an --insert-label-frames argument to the profiler-edit tool (<a href="https://github.com/firefox-devtools/profiler/pull/5966" rel="noopener nofollow ugc">#5966</a>)</li>
<li>[Markus Stange] Stop printing “error: too many arguments” during tests. (<a href="https://github.com/firefox-devtools/profiler/pull/6088" rel="noopener nofollow ugc">#6088</a>)</li>
<li>[Markus Stange] More additions to profiler-edit, for sp3 profiles (<a href="https://github.com/firefox-devtools/profiler/pull/6009" rel="noopener nofollow ugc">#6009</a>)</li>
<li>[Nazım Can Altınova] Do not rely on localized texts in the settings menu tests (<a href="https://github.com/firefox-devtools/profiler/pull/6101" rel="noopener nofollow ugc">#6101</a>)</li>
</ul>
<p>Big thanks to our amazing localizers for making this release possible:</p>
<ul>
<li>be: Andrei Mukamolau</li>
<li>de: Ger</li>
<li>de: Michael Köhler</li>
<li>de: Ralf Duehnfahr</li>
<li>el: Jim Spentzos</li>
<li>en-CA: chutten</li>
<li>en-GB: Ian Neal</li>
<li>es-CL: ravmn</li>
<li>fr: Théo Chevalier</li>
<li>fr: wy</li>
<li>fur: Fabio Tomat</li>
<li>fy-NL: Fjoerfoks</li>
<li>ia: Melo46</li>
<li>it: Francesco Lodolo [:flod]</li>
<li>nl: Mark Heijl</li>
<li>ru: Valery Ledovskoy</li>
<li>sr: Марко Костић (Marko Kostić)</li>
<li>sv-SE: Andreas Pettersson</li>
<li>tr: Grk</li>
<li>tr: Selim Şumlu</li>
<li>zh-CN: Olvcpr423</li>
<li>zh-TW: Pin-guang Chen</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-june-16-2026/148655">Read full topic</a></p></div>
    </summary>
    <updated>2026-06-16T13:38:21Z</updated>
    <published>2026-06-16T13:38:21Z</published>
    <category term="Firefox Tooling Announcements"/>
    <author>
      <name>canova</name>
    </author>
    <source>
      <link href="https://discourse.mozilla.org/t/firefox-profiler-deployment-june-16-2026/148655.rss" title="Firefox Profiler Deployment (June 16, 2026)"/>
      <updated>2026-07-15T16:59:02Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=86157</id>
    <link href="https://blog.mozilla.org/en/firefox/firefox-settings/" rel="alternate" type="text/html"/>
    <title>Firefox is easier than ever to customize</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Firefox gives you many ways to make the browser your own, from privacy settings and AI controls to tab management, custom colors, and more. As we continue to improve Firefox, you get more control over how it works for you. Today, we’re introducing a redesigned settings experience that makes your options easier to find, understand, […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-settings/">Firefox is easier than ever to customize</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 Settings redesign showing privacy, layout, languages, contrast and search engine controls" class="wp-image-86189" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/SRD-Distilled_Hero-1024x576.png" width="1024"/></figure>



<p>Firefox gives you many ways to make the browser your own, from privacy settings and AI controls to tab management, custom colors, and more. As we continue to <a href="https://blog.mozilla.org/firefox/firefox-roadmap-152/">improve Firefox</a>, you get more control over how it works for you.</p>



<p>Today, we’re introducing a redesigned settings experience that makes your options easier to find, understand, and manage.</p>



<p>Over time, some settings pages became crowded, related preferences were spread across different sections, and it wasn’t always obvious where to look for a particular option. The redesign makes settings easier to navigate while preserving existing preferences and the flexibility and control that Firefox is known for.</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/06/SRD-Distilled-Passwords.png" rel="noreferrer noopener" target="_blank"><img alt="Firefox password and autofill settings shown before and after a redesigned interface." class="wp-image-86167" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/SRD-Distilled-Passwords-1024x576.png" style="width: 675px;" width="1024"/></a><figcaption class="wp-element-caption">The passwords and autofill sections, before (left) and after (right) the redesign.</figcaption></figure></div>


<p>The new settings feature a cleaner layout, modern visual design, improved labels and descriptions, and updated navigation, bringing related categories together. One of the most noticeable updates is the retirement of the long-standing “General” page. Many of the options that were previously there have now moved into more specific areas, including “Appearance,” “Accessibility,” “Languages,” and “Tabs and browsing.”</p>



<figure class="wp-block-image aligncenter size-large is-resized"><a href="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/SRD-Distilled-Languages-2.png" rel="noreferrer noopener" target="_blank"><img alt="Firefox Languages settings page with website language, translation and spell check options" class="wp-image-86178" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/SRD-Distilled-Languages-2-1024x576.png" style="width: 675px;" width="1024"/></a><figcaption class="wp-element-caption">The redesigned settings include dedicated pages for languages and other categories.
</figcaption></figure>



<p>Some options may have moved, but your existing preferences haven’t changed. The customization options you rely on are still available. If you’re not sure where to find something, the search bar can help you locate it quickly. You can also visit <a href="https://support.mozilla.org/en-US/topics/settings">Mozilla Support</a> for more detailed guidance.  </p>



<p>This redesign reflects extensive user research, including interviews, usability testing, card-sorting exercises, and analysis of usage data. It was also shaped by feedback from the Firefox community through <a href="https://connect.mozilla.org/">Mozilla Connect</a>, <a href="https://www.reddit.com/r/firefox/">Reddit</a>, and other channels, along with collaboration across Mozilla teams.</p>



<p>Thank you to everyone who shared their feedback along the way. Your insights helped shape the redesigned settings experience, and they’ll continue to guide future improvements as Firefox evolves.</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">
     <h3>Take control of your internet</h3>      <span>Download Firefox</span>   </div>
</a>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-settings/">Firefox is easier than ever to customize</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-06-16T12:58:29Z</updated>
    <published>2026-06-16T12:58:29Z</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-07-14T12:38:41Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.mozilla.org/?p=86156</id>
    <link href="https://blog.mozilla.org/en/firefox/firefox-roadmap-152/" rel="alternate" type="text/html"/>
    <title>What’s new in Firefox this June, and what’s next on the Firefox roadmap</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Firefox has been busy introducing updates across productivity, privacy and AI. From Project Nova and browser-wide AI controls to expanded privacy protections and new ways to stay organized, the goal is simple: help you spend less time managing your browser and more time getting things done online. But building the best browser isn’t just about […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-roadmap-152/">What’s new in Firefox this June, and what’s next on the Firefox roadmap</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 roadmap graphic with a fox running across a browser window and split view menu." class="wp-image-86201" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/Firefox_Distilled_Roadmap-1024x576.png" width="1024"/></figure>



<p>Firefox has been busy introducing updates across productivity, privacy and AI. From <a href="https://blog.mozilla.org/en/firefox/new-firefox-design/">Project Nova</a> and browser-wide <a href="https://blog.mozilla.org/en/firefox/ai-controls-firefox-mobile/">AI controls</a> to expanded <a href="https://blog.mozilla.org/en/firefox/built-in-vpn/">privacy protections</a> and new ways to <a href="https://blog.mozilla.org/en/firefox/split-view/">stay organized</a>, the goal is simple: help you spend less time managing your browser and more time getting things done online.</p>



<p>But building the best browser isn’t just about shipping new features. It’s also about building them alongside the people who use Firefox every day. </p>



<h3><strong>Introducing the Firefox roadmap</strong></h3>



<p>Today, we’re introducing the <a href="https://www.firefox.com/whatsnext">Firefox roadmap</a> to give people a closer look at what we’re building and a preview of where Firefox is heading next.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img alt="Firefox roadmap page shown in a dark browser theme with a productivity section and fox illustration." class="wp-image-86212" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2026/06/Browser-Dark-1024x576.png" style="width: 675px;" width="1024"/></figure></div>


<p>We’ve always built Firefox in the open and our new roadmap is an extension of that. </p>



<p>“Some of the best ideas in Firefox come directly from the people who use it,” said Ajit Varma, head of Firefox. “The roadmap gives our community a new way to see what’s taking shape, share feedback earlier and help guide where we’re heading next.”<br/></p>



<p>The roadmap highlights what we’re working on across Firefox, including productivity, privacy, performance, AI and the technologies that help make the web better for everyone. </p>



<p>Some items on the roadmap will be things we’ve already shared; others we’ll be sharing publicly for the first time. Together, it’ll provide a clearer picture of where Firefox is headed and the areas we’re investing in to build a better browser. </p>



<p>Here’s a look at what’s rolling out now in Firefox 152, and what we’re building next.</p>



<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><strong>New in </strong><a href="https://www.firefox.com/firefox/152.0/releasenotes/"><strong>Firefox 152</strong></a></h3>



<ul>
<li><strong>Tab Groups are now on Android</strong>: When “just a few” turns into dozens of tabs, it’s hard to tell what’s important or which tab had the thing you were actually looking for. <a href="https://blog.mozilla.org/firefox/firefox-tab-groups/">Tab Groups</a> have been helping Firefox desktop users bring order to the chaos. Now, they’re starting to roll out on Firefox for Android, turning related mobile tabs into clear threads you can name, color and come back to when you’re ready. iOS support will follow later this year.</li>



<li><strong>Simpler way to manage Firefox settings:</strong> We’ve redesigned Firefox settings to make it easier to find what you’re looking for, discover controls you might not have known existed, and truly make Firefox your own. Don’t worry: Your existing preferences aren’t changing; just better organized. Get the details <a href="https://blog.mozilla.org/firefox/firefox-settings/">here</a> and visit <a href="https://support.mozilla.org/en-US/topics/settings">Mozilla Support</a> for answers to all your settings questions.</li>



<li><strong>Privacy protections you can actually see:</strong> You shouldn’t have to worry about trackers every time you browse. Firefox blocks many of them automatically so you can focus on what you came to do. The new Blocked Tracker Widget brings that protection into view, showing how many trackers Firefox has blocked over time, what kinds of tracking activity it stopped and how Firefox is working behind the scenes.</li>
</ul>



<h3><strong>What’s next on the </strong><a href="https://www.firefox.com/whatsnext"><strong>Firefox roadmap</strong></a></h3>



<ul>
<li>Power users know that even small efficiency improvements add up over time. One of Firefox’s most requested customization features, <strong>customizable keyboard shortcuts</strong> give you more control over how Firefox fits into your workflow, whether you’re streamlining a routine task, adapting Firefox to your accessibility needs or simply prefer your own shortcuts.</li>



<li>Designed to help people handle everyday PDF tasks without leaving the browser, upcoming <strong>PDF editing improvements</strong> will include the ability to split, merge and reorganize documents directly in Firefox. </li>



<li><a href="https://addons.mozilla.org/en-US/firefox/addon/multi-account-containers/"><strong>Multi-Account Containers</strong></a>, one of Firefox’s most-loved browser extensions, helps people carve out a separate space for each part of their online life and keep work, personal and other online activities from bleeding into one another. We’re now bringing Containers into the native Firefox experience, so more people can take advantage of one of Firefox’s most distinctive tools without needing to install an add-on first.</li>



<li>Firefox’s <a href="https://blog.mozilla.org/en/firefox/firefox-built-in-vpn-summer/"><strong>free built-in VPN</strong></a> is coming to mobile devices, helping people stay protected across more of the devices they use every day. Whether you’re traveling, connecting from public Wi-Fi or simply browsing away from home, bringing VPN to mobile is part of a broader effort to make Firefox privacy protections available wherever you go.</li>



<li>Sometimes the fastest way to get information is simply to ask. With <strong>Quick Answers</strong>, people will be able to ask Firefox a question using their voice and receive a concise AI-generated answer right in the browser, with sources available when they want to learn more.</li>



<li>We’re continuing to build <strong>Smart Window</strong>, our optional and private AI browsing experience designed to help people get answers, compare information and make sense of what they’re already reading online. You can now <a href="https://www.firefox.com/en-US/smart-window/?view=enable">try it</a> without joining a waitlist. </li>



<li>We’re adding<strong> Power Saving Mode</strong> to help identify tabs that consume the most resources on your phone and automatically reduce their impact, extending battery life without constantly managing what’s running in the background.</li>
</ul>



<h3><strong>Join the conversation</strong></h3>



<p>Try out the latest features, explore what’s coming next and tell us what you think on <a href="https://connect.mozilla.org/t5/discussions/firefox-s-product-roadmap-see-what-s-next-and-share-your/m-p/129098#M51556">Mozilla Connect</a>. </p>



<p>We’re also hosting a <a href="https://www.reddit.com/user/Firefox_Official/">Reddit AMA</a> on June 24 with Firefox product leaders, so bring your questions. </p>



<p>Talk soon.</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-roadmap-152/">What’s new in Firefox this June, and what’s next on the Firefox roadmap</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></div>
    </content>
    <updated>2026-06-16T12:57:54Z</updated>
    <published>2026-06-16T12:57:54Z</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-07-14T12:38:41Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.thunderbird.net/?p=4319</id>
    <link href="https://blog.thunderbird.net/2026/06/mobile-progress-report-june-2026/" rel="alternate" type="text/html"/>
    <title>Mobile Progress Report: June 2026</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The past month was busy; the theme was evolution. We went into this quarter with our own ideas for what we wanted to accomplish. However, our users had better ideas. With the release of Thunderbird’s own mail service, Thundermail, the need for a better account settings import process across our services and apps became vital. […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/06/mobile-progress-report-june-2026/">Mobile Progress Report: June 2026</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/06/blog-banner-mobile7-768x432.jpg" width="640"/></p>
<p>The past month was busy; the theme was evolution. We went into this quarter with our own ideas for what we wanted to accomplish. However, our users had better ideas. With the release of Thunderbird’s own mail service, <a href="https://tb.pro/">Thundermail</a>, the need for a better account settings import process across our services and apps became vital. </p>



<p>We have also heard from our users about issues they had with syncing, notifications, bugs, and more. As such, we refined our <a href="https://roadmaps.thunderbird.net/android/">roadmap</a>, because the goal is always a better, safer, more private email client, and delivering that experience is more important than any foregone projects. Our roadmap can change, but our goal to deliver the best cannot.</p>



<h3>Android</h3>



<p>On Android, our focus turned to our import function through a QR code. This helps transfer settings from Thunderbird desktop to mobile. We also ensured that it would work for our new <a href="http://tb.pro/">Thundermail project</a>. This allows our early Thundermail users to quickly move their accounts to the Thunderbird mobile app. Additionally, we merged fixes for importing accounts, getting the avatar monogram to match the account immediately after setup, and new translations. </p>



<p>We also began some exploratory work on one of our biggest upcoming projects. Our users have been clear about a recurring issue that they want resolved. Notifications. Notifications on an email client are tricky, especially one like ours, where we support so many different services. Users report not receiving notifications for newly delivered emails, even when polling or push are enabled, notifications appearing improperly in the notification shade, and many others. </p>



<p>We broke this up into two projects. The first priority will be to work on the quick fixes. These are bugs discovered through reports or our own testing. These fixes won’t require an entire refactor of our sync, notification, or database features, allowing us to address user concerns without launching a big project. But we are intending to launch a big project. We’ll do whatever we have to in order to make notifications work as expected. That’s the second planned project, to consider larger performance improvements, even a full refactor of sync, notifications, and the app database if we have to. Prompt email delivery is essential. We’re going to ensure Thunderbird becomes a trusted client for rapid email syncing and notification. </p>



<p>We’ve also begun investigating potential feature flag options. While we currently have <a href="https://github.com/thunderbird/thunderbird-android/blob/main/docs/architecture/feature-flags.md">internal feature flags</a> for our debug builds, we’re looking into options that we could host ourselves to ensure privacy, while also allowing us to enable features more quickly, without a full update. This would also allow us to roll back any changes that introduce issues without an app update. We hope it can allow us to launch products more quickly, and potentially even give end users more control over the features they have enabled. </p>



<h3>iOS</h3>



<p>The iOS app is coming along nicely, with the core libraries (IMAP, SMTP, and MIME) set up. We’re working on how to store account data in the local database, as well as starting the email compose functionality. iOS will have a WYSIWYG editor for new messages, just as you’ve come to expect from other email clients. Also, this week has been busy with WWDC and understanding how the new tools and operating system will affect and improve our roadmap, mostly in the user interface.</p>



<h3>Our Open Source Community</h3>



<p>We wouldn’t be who we are without the open source community at our core. Open source isn’t just how we build software, it’s how we plan, make, and grow. Our community has a say in what we do, which includes making changes, bug fixes, suggesting new features, and voicing complaints – this insight from you is our greatest strength. Over the past month, we’ve heard requests for new features, bug fixes, and changes, and we’ve adapted our plans for the rest of the year to focus on this. And hopefully deliver them in more bite-sized pieces.</p>



<p>First, the community has helped drive our upcoming projects. From notifications to investigations into spam filters, our community is helping drive our objectives. Our priorities and our roadmap have shifted thanks to that feedback. With our community having our back, we’re making the best email client available on iOS and Android, and can’t wait to deliver these improvements. We’re listening and working on these <a href="https://thunderbird.github.io/thunderbird-support-reports/lisa/2026/may.html#android">highly requested changes</a>. </p>



<p>A notable contribution from our community came in the form of a fix for our notification widget. The text wasn’t scaling for users with different font size settings. This is a serious accessibility issue. Fortunately, a contributor pushed a fix which ensures the font size scales with the system. We’re grateful for this help, and it’s a perfect example of how we build better together. </p>



<h3>Becoming a Contributor</h3>



<p><a href="https://www.thunderbird.net/participate/">Interested in contributing</a> yourself? It can be tough to figure out where to start or how to go about it. Soon starting development on the Thunderbird for Android app will be easier than ever. We’re moving our documentation around and adding templates and examples to make everything from requesting new features to working on bug fixes, and even documenting your changes easier. We’ve also added a new pull request template to help you write a detailed message explaining your pull request. This includes letting us know if you’ve used AI in the development and to what level it was used.</p>



<p>One note to say with contributions, given our limited team size and resources, we are focusing our efforts on the top items on the roadmap first and foremost. Second, we will spend a couple of weeks solving the largest impact bugs. Then we will spend a week or two supporting what contributions help resolve bug reports or align with our roadmap. We are intrigued about how AI can help us in these efforts, but we are also vigilant about the quality of the code. Potential contributors need a strong understanding of what they are contributing. This means being able to change, improve, and support the code they contribute in the future.</p>



<p>We have just three engineers on each of our iOS and Android teams. We’re supported by wonderful designers and product folks, but we also couldn’t do it without your support. So, thank you. We’re doing our best to make a great product, and with your help, contributions, donations, bug reports, feature requests, and enthusiasm, we’re able to do it better than ever. Thanks for checking in with us!</p>



<p>– Danielle G. (she/her), Senior Android Engineer</p>
<p>The post <a href="https://blog.thunderbird.net/2026/06/mobile-progress-report-june-2026/">Mobile Progress Report: June 2026</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></div>
    </content>
    <updated>2026-06-16T11:00:00Z</updated>
    <published>2026-06-16T11:00:00Z</published>
    <category term="Development"/>
    <category term="Mobile"/>
    <category term="Android"/>
    <category term="Android Progress Report"/>
    <category term="iOS"/>
    <category term="K-9 Mail"/>
    <author>
      <name>Danielle G.</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-07-14T19:36:44Z</updated>
    </source>
  </entry>

  <entry xml:lang="en-US">
    <id>https://blog.nightly.mozilla.org/?p=2085</id>
    <link href="https://blog.nightly.mozilla.org/2026/06/15/giving-you-more-control-these-weeks-in-firefox-issue-204/" rel="alternate" type="text/html"/>
    <title>Giving You More Control – These Weeks in Firefox: Issue 204</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Highlights Maxx Crawford added a pref to hide the New Tab logo so users can opt out of branding without altering page layout or resorting to CSS overrides. Harshit enabled … <a class="go" href="https://blog.nightly.mozilla.org/2026/06/15/giving-you-more-control-these-weeks-in-firefox-issue-204/">Read more</a></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><h3>Highlights</h3>
<ul>
<li>Maxx Crawford <a href="https://bugzil.la/2041708">added a pref to hide the New Tab logo </a>so users can opt out of branding without altering page layout or resorting to CSS overrides.</li>
<li>Harshit <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2041819">enabled video overlay detection</a> in Nightly 153, allowing you to use the context menu to control videos on more pages! We plan on letting this ride out in Firefox 153.
<ul>
<li><a href="https://www.instagram.com/p/DXH8Rd6EcWo/">You can try it out on this Instagram reel</a> in Nightly</li>
</ul>
</li>
</ul>
<p><img alt="Firefox context menu video controls like Pause, Unmute, Speed and Loop." class="aligncenter size-full wp-image-2081" height="431" src="https://blog.nightly.mozilla.org/files/2026/06/image2-2.png" width="480"/></p>
<ul>
<li>A note to WebExtension authors – as part of a <a href="https://blog.mozilla.org/addons/2026/04/23/webextensions-api-changes-firefox-149-152/">planned deprecation announced last month</a>, executeScript and insertCSS are now restricted from moz-extension pages starting in Firefox 152 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2015559"> Bug 2015559</a></li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> added support and debugging for modern attr()(which is <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2038939">enabled on Nightly</a>) (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2014751">#2014751</a>)</li>
</ul>
<p><img alt="Tooltip in Firefox DevTools for mismatched syntax with attr()" class="aligncenter size-full wp-image-2082" height="164" src="https://blog.nightly.mozilla.org/files/2026/06/image1-2.png" width="872"/></p>
<h3>Friends of the Firefox team</h3>
<h4><a href="https://bugzilla.mozilla.org/buglist.cgi?title=Resolved%20bugs%20(excluding%20employees)&amp;quicksearch=1717176%2C2031328%2C2038948%2C2011485%2C1455294%2C2035084%2C2039455%2C2036767%2C2039878%2C2013176%2C2022414%2C2036237%2C2036578%2C2041612%2C1262773&amp;list_id=17986996">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>Sam Johnson</li>
<li>Sebastian Zartner [:sebo]</li>
</ul>
<h4>New contributors (🌟 = first patch)</h4>
<ul>
<li>Immaculate Atim: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2022414">Switch to using an array instead of an object string for browser.backup.enabled_on.profiles</a></li>
<li>liz: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2011485">Screenshots overlay visible on both splitview browsers</a></li>
<li>🌟 Rahman Mahmutović [:r_m]: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1717176">Can’t change content in box model in inspector for box-sizing:border-box elements</a></li>
<li>Takeru Mitsumori: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2038948">Fix typo in ID name about-translations-swap-langauges-icon in about-translations.html</a></li>
<li>🌟 Freya Arbjerg [:freyacodes]: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2036767">Blackboxed columns are ignored</a></li>
<li> tom.passarelli: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031328">tab-preview-panel emits unpaired popupshown/popuphidden events, breaking sidebar autohide</a></li>
</ul>
<h3>Project Updates</h3>
<h4>Add-ons / Web Extensions</h4>
<h5>Addon Manager &amp; about:addons</h5>
<ul>
<li>As part of the work for the Project Nova about:addons page restyling, the about:addons sidebar has been migrated to the moz-page-nav and moz-page-nav-button reusable components, improving accessibility and visual consistency with the Firefox Desktop about:settings page –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1881767"> Bug 1881767</a></li>
</ul>
<h5>WebExtensions Framework</h5>
<ul>
<li>Implemented WebExtensions negative permissions infrastructure, providing the foundations for enterprise policy “blocked host permissions” features –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1745823"> Bug 1745823</a></li>
<li>Restricted host permission changes for MV3 extensions force-installed via enterprise policy (matching similar behaviors provided by Chrome enterprise policy behaviors) –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1904054"> Bug 1904054</a>
<ul>
<li>Thanks to Mike Kaply for the implementation of this enterprise policy enforcement feature.</li>
</ul>
</li>
</ul>
<h5>WebExtension APIs</h5>
<ul>
<li>Fixed handling of &lt;all_urls&gt; as an API permission in Manifest V3, ensuring the permission is correctly initialized on extension install –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1758306"> Bug 1758306</a></li>
</ul>
<h4>DevTools</h4>
<ul>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=789324">Rahman Mahmutović [:r_m]</a> made it possible to edit width/height in the box model section of the Layout panel (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1717176">#1717176</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=446518">Sebastian Zartner [:sebo]</a> improved toggling tools driving in-page highlighters (e.g. the Measuring) (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1262773">#1262773</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=446518">Sebastian Zartner [:sebo]</a> added a setting to control visibility of HTML comments in the markup view (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1455294">#1455294</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=789044">Freya Arbjerg [:freyacodes]</a> fixed an issue in script blackboxing (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2036767">#2036767</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=283262">Alexandre Poirot [:ochameau]</a> replaced custom preference to log RDP messages with MOZ_LOG (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1622857">#1622857</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=283262">Alexandre Poirot [:ochameau]</a> fixed retrieval of garbage collected script text content (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1758454">#1758454</a>)</li>
</ul>
<h4>WebDriver</h4>
<ul>
<li>Sameem updated the “Take Element Screenshot” command from WebDriver Classic to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2013176">crop screenshots of elements which exceed the viewport</a>. This aligns with the specification and avoids errors when attempting to capture huge elements.</li>
<li>Alexandra Borovova updated the events for new top-level browsing contexts: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1930594">we will not send anymore “browsingContext.domContentLoaded” and “browsingContext.load” events for them, instead the “browsingContext.contextCreated” event will be sent when a tab is ready to be used</a>. This is required to align with the expected per-spec behavior.</li>
<li>Henrik Skupin landed a patch <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1430064">allowing geckodriver to gracefully shut down Firefox</a> when geckodriver itself is terminated.</li>
<li>Hiroyuki Ikezoe <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2040252">disabled Firefox’s “scroll axis lock” feature</a> so WebDriver actions for wheel input devices can scroll in arbitrary directions when using pan gestures.</li>
</ul>
<h4>Lint, Docs and Workflow</h4>
<ul>
<li>Added a rule to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1790711">prevent new uses of Preferences.sys.mjs</a>.</li>
<li>The browser environment globals within ESLint have <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1793814">now been updated</a>. These include Sanitizer, VideoFrame and a few other new ones.</li>
<li>Temporal, and some other definitions have been <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1999036">added to TypeScript</a>.</li>
</ul>
<h4>New Tab Page</h4>
<ul>
<li>Much has happened in the last 2 weeks! <a href="https://bugzilla.mozilla.org/buglist.cgi?bug_status=RESOLVED%2CVERIFIED%2CCLOSED&amp;resolution=FIXED&amp;chfieldfrom=2026-05-12T14%3A40%3A16.019Z&amp;chfieldto=Now&amp;bug_id=2015530%2C2024720%2C2028377%2C2028534%2C2033592%2C2035176%2C2036902%2C2037143%2C2037301%2C2037541%2C2037646%2C2037947%2C2038048%2C2038392%2C2038790%2C2038823%2C2038881%2C2038981%2C2038984%2C2039103%2C2039107%2C2039333%2C2039346%2C2039358%2C2039477%2C2039587%2C2039752%2C2039765%2C2039770%2C2039775%2C2039956%2C2039963%2C2040027%2C2040033%2C2040254%2C2040269%2C2040370%2C2040376%2C2040480%2C2040481%2C2040503%2C2040552%2C2040645%2C2040674%2C2040677%2C2041033%2C2041163%2C2041196%2C2041204%2C2041205%2C2041207%2C2041244%2C2041532%2C2041651%2C2041682%2C2041708%2C2041711%2C2041730%2C2041757%2C2041765%2C2041814%2C2042054&amp;product=Firefox&amp;component=New+Tab+Page">Here’s a full bug list</a>, and here are some highlights.</li>
<li>Dre fixed the List widget that was creating a new list too eagerly on the New Tab Page (<a href="https://bugzil.la/2033592">2033592</a>) — prevents accidental list creation and improves the Lists UI reliability.</li>
<li>Maxx Crawford<a href="https://bugzil.la/2035176"> fixed Weather widget small card layout issues with opt-in location options and an error message displayed</a>, resolving card overflow and removing the spurious opt-in error so users see a compact Weather card and correct location prompts on New Tab.</li>
<li>Reem Hamoui<a href="https://bugzil.la/2037301"> added key dates state to the Sports widget</a>, enabling the Sports card to surface event deadlines/key-date highlights on New Tab so sports users see timely date info.</li>
<li>Scott Downe<a href="https://bugzil.la/2037541"> added a manage widgets option to the New Tab nova widgets context menu</a>, giving users a direct context-menu entry to open the widget management flow from any widget with Nova enabled.</li>
<li>Scott Downe added a reusable Newtab widget base component to centralize lifecycle, focus/keyboard handling, DOM templates, and telemetry hooks, reducing duplication and making widget behavior more consistent; see<a href="https://bugzil.la/2037947"> Newtab widget base component</a>.</li>
<li>Dre converted per-widget expansion handling to a shared widget expansion handler to unify expand/collapse state management and prevent widgets from incorrectly retaining or losing expanded state; see<a href="https://bugzil.la/2038048"> Convert widget expansion handling to shared widget expansion</a>.</li>
<li>Nina Pypchenko [:nina-py]<a href="https://bugzil.la/2038881"> updated the Sports widget to populate the “follow teams” state from the /teams endpoint</a>, so follow/unfollow toggles now reflect server-side subscriptions and reduce incorrect follow states.</li>
<li>Scott Downe<a href="https://bugzil.la/2038981"> moved widget menu items</a> within New Tab widgets to standardize menu ordering and action grouping, so users find Add/Remove/Configure entries in expected positions across platforms.</li>
<li>Dre<a href="https://bugzil.la/2039346"> fixed a World Clock city search bug </a>for the word clocks widget, restoring expected search filtering/matching so city lookups return correct results.</li>
<li>Scott Downe fixed an issue where the New Tab small weather widget size change didn’t always apply by correcting the widget size update path (JS/CSS layout interactions), improving consistent rendering for small-tile weather across responsive breakpoints and platforms; see<a href="https://bugzil.la/2040033"> Newtab small weather widget size change doesn’t always work</a>.</li>
<li>Nina Pypchenko [:nina-py]<a href="https://bugzil.la/2040269"> added a group stage section to match highlights</a> in the sports widget on New Tab so users now see stage-aware grouping and stage labels on match highlight cards, making tournament context (group vs knockout) visible while browsing highlights.</li>
<li>Dre<a href="https://bugzil.la/2040376"> fixed the small world clock widget not expanding to large while editing clocks</a> so users can enter edit mode and expand the widget as expected; the change wires the edit-mode resize handler to update widget size/class during edits.</li>
<li>Maxx Crawford<a href="https://bugzil.la/2040480"> added WCW OMC message strings</a> so World Cup widget messaging flows on New Tab now display the correct copy (localized where available) instead of falling back to missing-text behavior.</li>
<li>Reem Hamoui<a href="https://bugzil.la/2040552"> added a “View all” button and a list view for the results tab at medium widget size</a> so Sports widget users on medium New Tab tiles can expand results and scroll full lists without resizing the widget.</li>
<li>Maxx Crawford<a href="https://bugzil.la/2040674"> added WCW “Watch Live” stream strings to the Sports widget strings bundle</a> so the widget can surface a localized “Watch Live” CTA for applicable events.</li>
<li>Dre<a href="https://bugzil.la/2040677"> restored VoiceOver reachability for Edit/Remove in World Clock on macOS</a> so macOS VoiceOver users can now focus and activate clock Edit/Remove controls thanks to accessibility role/label and focus-order fixes.</li>
<li>Maxx Crawford removed the persistent browser logo when all new-tab features (Top Sites, widgets, content feed) are disabled by adding a conditional render guard in the New Tab component, preventing an orphaned logo (<a href="https://bugzil.la/2041033">2041033</a>).</li>
<li>Mike Conley added New Tab jest tests to the node tests Tier 1 CI job<a href="https://bugzil.la/2041757"> Run newtab jest tests as part of node tests Tier 1 job</a> to catch regressions earlier in CI</li>
<li>Irene Ni shipped multiple visual fixes for the Sports widget<a href="https://bugzil.la/2041765"> Sports widget – various visual fixes</a> (spacing, truncation, icon alignment, clipping) to improve readability and layout on constrained viewports.</li>
</ul>
<h4>Picture-in-Picture</h4>
<ul>
<li>kpatenio <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2041113">adjusted our YouTube site specific wrapper so that the URL bar toggle appears more reliably</a>, especially when selecting videos from the YouTube search page.</li>
<li>Thanks to Sylvestre for patching <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2037420">some</a> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042141">bugs</a> to prevent some spurious console errors!</li>
<li>Niklas <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2013735">fixed captions on autopip videos failing to sync with the origin videos</a>.</li>
</ul>
<h4>Performance Tools (aka <a href="https://profiler.firefox.com/">Firefox Profiler</a>)</h4>
<ul>
<li>Firefox Profiler now has a CLI! We also added a profiler-analysis skill to the Firefox codebase. Once you capture a performance profile, you can ask Claude or an AI to analyze it by providing a link or local path. You can use it to analyze a performance regression or debug an issue if you have a profile at hand.
<ul>
<li><a href="https://www.npmjs.com/package/@firefox-devtools/profiler-cli">https://www.npmjs.com/package/@firefox-devtools/profiler-cli</a></li>
<li>You can install it with npm install -g @firefox-devtools/profiler-cli@latest</li>
</ul>
</li>
</ul>
<h4>Search and Urlbar</h4>
<h6>Nova UI refresh</h6>
<ul>
<li>Drew and Daisuke continued working on reorganizing styles and updating the urlbar for Nova.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019154">2019154</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019152">2019152</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2041501">2041501</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2040532">2040532</a></li>
</ul>
<h6>Suggest</h6>
<ul>
<li>Drew landed several Suggest improvements: realtime suggestions colors, sports suggestions received World Cup tweaks, and online Suggest via OHTTP was enabled for eligible users in Firefox 153.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2040561">2040561</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2039753">2039753</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035614">2035614</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2038843">2038843</a></li>
</ul>
<h6>Adaptive autofill</h6>
<ul>
<li>James fixed soft-block counting to track autofill dismisses, rather than consecutive backspaces on the same autofill, and added telemetry to measure URLs reintegration after blocking.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2040819">2040819</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2037177">2037177</a></li>
</ul>
<h6>Quick actions</h6>
<ul>
<li>Dharma created a new Firefox Labs quick action, fixed the Update action button, and re-enabled ScotchBonnet in some tests that were not updated yet.</li>
<li>Caleb added Calculator support for certain unicode operators.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2023169">2023169</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1928635">1928635</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1923383">1923383</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033861">2033861</a></li>
</ul>
<h6>Multi Context Address Bar</h6>
<ul>
<li>Moritz continued refactoring the urlbar code: converted some of the js modules to not be system modules, fixed dynamic results templates, incorrect reuse of result rows, and keyboard shortcuts on the unified search button panel.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2039297">2039297</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2036095">2036095</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2039844">2039844</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2037933">2037933</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030050">2030050</a></li>
</ul>
<h6><i>Other</i></h6>
<ul>
<li>Marco, Drew and Daisuke fixed several intermittent test failures.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2038510">2038510</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2023908">2023908</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2011584">2011584</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1938142">1938142</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1971091">1971091</a></li>
</ul>
<h5>Search</h5>
<ul>
<li>Mark removed old WebExtension-based search engines from the source tree, removed loading of search add-ons from <i>resource://search-extensions/</i>.</li>
<li>Caleb fixed multiple documentation issues and added a test covering searches from a private window.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1904613">1904613</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035878">2035878</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2037942">2037942</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033545">2033545</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2005724">2005724</a></li>
</ul>
<h5>Places</h5>
<ul>
<li>Marco removed some unnecessary database transactions, fixed the bookmarks panel folder dropdown on Windows, and resolved several intermittent test failures.</li>
<li>Thanks to Sam Johnson who fixed the bookmark edit panel showing “mobile” instead of “Mobile Bookmarks”.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2039534">2039534</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1505800">1505800</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2008829">2008829</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2029541">2029541</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2035084">2035084</a></li>
</ul>
<ul>
<li/>
</ul></div>
    </content>
    <updated>2026-06-15T17:26:57Z</updated>
    <published>2026-06-15T17:26:57Z</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-22T19:57:24Z</updated>
    </source>
  </entry>

  <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-07-06T03:53:50Z</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-07-03T10:36:33Z</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-27T08:09:10Z</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-07-15T16:59:01Z</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-07-14T12:38:41Z</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, 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["Accessibility 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 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 trait 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 if 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 wish 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 destructors 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-22T18:34:50Z</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-07-15T16:59:01Z</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-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>



<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. To get started, open a new tab and click the <a href="https://support.mozilla.org/kb/about-new-tab-page#w_customize-your-new-tab-page-to-hide-or-display-content">Customize icon</a> at the bottom of the page.</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>“I’m grateful to our incredible brand partner Firefox for helping make this series possible and for believing in the power of sport to bring people together,” said Noah.</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-07-14T12:38:41Z</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-22T19:57:24Z</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-07-15T14:56:21Z</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-22T19:57:24Z</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-07-15T16:58:59Z</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-07-15T16:58:26Z</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-06-30T00: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-07-15T14:56:21Z</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-07-15T16:59:02Z</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-07-15T16:59:02Z</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-07-03T10:36:33Z</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-07-15T14:56:21Z</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-07-15T14:56:21Z</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-07-14T12:38:41Z</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-06-28T21:06:41Z</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-07-14T12:38:41Z</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>
</feed>
