This is a valid RSS feed.
This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.
line 2796, column 0: (2 occurrences) [help]
<pre style="background: #2d2d2d; color: #ccc; padding: 10px; border- ...
<?xml version="1.0"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> <title>Planet Mozilla</title> <link>https://planet.mozilla.org/</link> <language>en</language> <description>Planet Mozilla - https://planet.mozilla.org/</description> <atom:link rel="self" href="https://planet.mozilla.org/rss20.xml" type="application/rss+xml"/> <item> <title>Mike Taylor: A new, new logo for the W3C</title> <guid isPermaLink="true">https://miketaylr.com/posts/2025/10/new-new-logo-for-w3c.html</guid> <link>https://miketaylr.com/posts/2025/10/new-new-logo-for-w3c.html</link> <description><p>In an effort to pivot this site into a full on graphic design side business after 2 blog posts about logos in a row (hit me up exclusivly on <a href="https://fishbrain.com/anglers/miketaylr">FB</a> to request a consultation), I thought I would reveal my new, new logo for the W3C.</p> <p>It turns out they recently launched a new one, but <a href="https://lists.w3.org/Archives/Public/www-archive/2025Oct/thread.html">some folks don’t love it</a>. As an artist, it’s not my job to critique other art, but instead to offer my own compelling vision for the web.</p> <p><img alt="a shitty drawing of a w, the word three spelled out, and followed by a period and the letter c" src="https://miketaylr.com/posts/assets/w3c.png" style="border: 1px solid gray;" /></p> <p>I shouldn’t have to explain why I went with the classic dark blue and asparagus colors—that much is obvious. And of course, turning c into a file extension as a reminder that NCSA Mosaic was written in C (I didn’t go with <a href="https://en.wikipedia.org/wiki/WorldWideWeb">WorldWideWeb</a> because that was written in Objective C and <code class="language-plaintext highlighter-rouge">.m</code> kinda messes it all up).</p></description> <pubDate>Sat, 25 Oct 2025 04:00:00 +0000</pubDate> <dc:creator>Mike Taylor</dc:creator></item><item> <title>Mozilla Localization (L10N): Localizer spotlight: Bogo</title> <guid isPermaLink="false">https://blog.mozilla.org/l10n/?p=1789</guid> <link>https://blog.mozilla.org/l10n/2025/10/24/localizer-spotlight-bogo/</link> <description><p><strong>About you</strong></p><p>My name is <a href="https://pontoon.mozilla.org/contributors/bogomil/">Bogomil</a> but people call me Bogo, and I am a translator for the Bulgarian locale. I think I got involved with the Mozilla project back in 2005 when I wrote a small search add-on/script. I became more active around 2008-2009 and with just a few gaps until this day.</p><p>I am European. I was born in Bulgaria, but I have been living for a long time in the Czech Republic. Bulgarian is my main language, but sometimes I contribute to localization projects in Turkish, Romanian, Macedonian and Czech.</p><p><a href="https://blog.mozilla.org/l10n/files/2025/10/image2.jpg"><img alt="" class="aligncenter wp-image-1790 size-large" height="338" src="https://blog.mozilla.org/l10n/files/2025/10/image2-600x338.jpg" width="600" /></a></p><p><strong>Q&amp;A</strong></p><p><em><strong>Q:</strong> What inspired you to join the Mozilla localization community?</em></p><p><strong>A:</strong> As I mentioned <a href="https://www.thunderbird.net/participate/">here</a> I decided to start localizing software because I knew some people had trouble using it in other languages. I believe everyone deserves the right to use software in a language they understand which helps them to get the maximum value out of it. As for Mozilla in particular I believe in <a href="https://www.mozilla.org/mission/">the mission</a> and this is the most efficient way for me to contribute.</p><p><em><strong>Q:</strong> How do you solve challenges like bugs or workflow hiccups, especially when collaborating virtually?</em></p><p><strong>A:</strong> Since we are a small team for the Bulgarian localizations we are almost always in sync on how to translate the strings. <span class="notranslate">We are following some basic rules, such as using a common dictionary and instructions on how to localize software in Bulgarian (shared across multiple FOSS projects),</span> set 15+ years ago and that are still relevant. When we have a conflict, I usually count on the team managers to share their wisdom, because they have a bit more knowledge than the rest of us.</p><p><em><strong>Q:</strong> Which projects or new product features were you most excited about this year, and why?</em></p><p><strong>A:</strong> In the last year I contributed mainly to the Thunderbird project. The items that are most exciting to me are:</p><ul><li>That finally we decided to remove the word “Junk” and replace it with “Spam”, I think this is self-explanatory 🙂</li><li>The new <a href="https://blog.thunderbird.net/2025/04/video-the-new-account-hub/">Account Hub</a> which improves significantly the consumer’s experience and their onboarding into the beautiful world of the free email. Free as in Freedom.</li><li>I am also excited about all the things in the <a href="https://developer.thunderbird.net/planning/roadmap">roadmap</a> to come.</li></ul><p><em><strong>Q:</strong> What tips, tools, or habits help you succeed as a localizer?</em></p><p><strong>A:</strong> If you look at my Pontoon <a href="https://pontoon.mozilla.org/contributors/bogomil/">profile</a>, you will see that for the last 2 months I contributed every day. I find this habit very useful for me, because it keeps me focused on my goal for consistently improving the localized experience.</p><p>Another item is that I like to provide a better experience to the mobile users. I often test and fix labels in <a href="https://play.google.com/store/apps/details?id=net.thunderbird.android">Thunderbird for Android</a> which, even translated correctly, are too long for a mobile phone UI.</p><p>And lastly, I love to engage with the community and ask them for help when we finish a section or a product. Last year we asked the Bulgarian community to help us validate a localization available in the beta version and we got some very helpful feedback.</p><p><strong>Something fun</strong></p><p><em><strong>Q:</strong> Could you share a few fun or unexpected facts about yourself that people might not know?</em></p><ul><li>I ran for the European Parliament in 2009 with the intention to fight for our digital rights.</li><li>I was on almost every media in the world in 2012 when I bought the data of millions of users for $5! <a href="https://www.forbes.com/sites/andygreenberg/2012/10/25/facebook-investigating-how-bulgarian-man-bought-1-1-million-users-email-addresses-for-five-dollars/">This</a> is the Forbes article.</li><li>I am a heavy metal fan and you can find me in underground clubs, enjoying bands you have never heard of.</li><li>Apart from technology I am an artist – I produced and performed my own theater play and shot a movie in Prague.</li><li>I realized my dream to have an opening talk at <a href="https://fosdem.org/">FOSDEM</a>. I was opening the Sunday session… but still!</li></ul><p><a href="https://blog.mozilla.org/l10n/files/2025/10/image3.jpg"><img alt="" class="aligncenter wp-image-1791 size-large" height="338" src="https://blog.mozilla.org/l10n/files/2025/10/image3-600x338.jpg" width="600" /></a></p></description> <pubDate>Fri, 24 Oct 2025 20:54:52 +0000</pubDate> <dc:creator>Delphine</dc:creator></item><item> <title>Mozilla Thunderbird: Your Workflow, Supercharged</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3983</guid> <link>https://blog.thunderbird.net/2025/10/your-workflow-supercharged/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="319" src="https://blog.thunderbird.net/files/2025/10/Screenshot-2025-10-24-at-12.46.53 PM.png" width="640" /></p><p>Extensions make <a href="https://www.thunderbird.net/en-US/">Thunderbird</a> truly yours, moving at your pace and reflecting your priorities. Thunderbird’s flexibility means you can tailor the app to how you actually work. We’ll cover tools for efficiency, consistency, and visibility so every send is faster and better informed, your future self will thank you. </p> <h3><strong>Clippings</strong></h3> <p>We’ve all been there, retyping the same line for the hundredth time and wondering if there’s a better way. <a href="https://services.addons.thunderbird.net/eN-US/thunderbird/addon/clippings-tb/">Clippings</a> lets you save text once and reuse it anywhere you compose in Thunderbird. You can organize by folders, apply color labels, and search by name with autocomplete, so the right text is always a couple of keystrokes away.</p> <p>When you paste a clipping, you can include fill‑in prompts for names, dates, or custom notes, and even keep simple HTML formatting and images when needed. It’s like a spellbook for your inbox–summon, swap, send. </p> <p>Below is a quick glance at how Clippings can help you: </p> <ul><li>Save and paste reusable snippets anywhere you write—no more repeat typing.<br /></li> <li>Include prompts for names, dates, or custom notes; HTML and inline images.<br /></li> <li>Organize with folders and labels; find snippets fast with autocomplete.<br /></li> <li>Paste instantly with keyboard shortcuts; import, export, or sync your library.</li></ul> <div class="wp-block-image is-style-default"><figure class="alignleft size-large is-resized"><a href="https://services.addons.thunderbird.net/eN-US/thunderbird/addon/clippings-tb/"><img alt="Link to Thunderbird Add-on library." class="wp-image-4000" height="217" src="https://blog.thunderbird.net/files/2025/10/Screenshot-2025-10-24-at-12.40.49 PM-1-600x217.png" style="width: 144px; height: auto;" title="TB Add-on Link" width="600" /></a></figure></div> <p><br /><br /><br />With the content process streamlined, now for a sign‑off that keeps your tone on track. <br /></p> <h3><strong>Signature Switch</strong></h3> <p>We rotate hats as we write: buttoned‑up for clients, warm for teammates, and careful punctuation for legal. <a href="https://addons.thunderbird.net/en-US/thunderbird/addon/signature-switch/">Signature Switch</a> helps you with that. Keep multiple signatures, and swap them in with a click or shortcut right from the composer. Turn a signature off entirely, pick from your saved set, or append a different one without retyping a thing.<br /><br />Use plain text for simplicity, or HTML with images and links for a more professional finish. Because everything is accessible while you write, choosing the right signature doesn’t break your flow—and it helps keep branding and tone consistent across messages. One click and your signature goes from handshake to high‑five.</p> <p>Below is a quick glance at how Signature Switch can help you: </p> <ul><li>Switch signatures on/off or choose from your saved set, no retyping.<br /></li> <li>Match by recipient, account, or context; keep tone aligned.<br /></li> <li>Use plain text or polished HTML with images and links.<br /></li> <li>Access quickly from the composer toolbar or menu while you write.</li></ul> <div class="wp-block-image is-style-default"><figure class="alignleft size-large is-resized"><a href="https://addons.thunderbird.net/en-US/thunderbird/addon/signature-switch/"><img alt="Link to Thunderbird Add-on library." class="wp-image-4000" height="217" src="https://blog.thunderbird.net/files/2025/10/Screenshot-2025-10-24-at-12.40.49 PM-1-600x217.png" style="width: 144px; height: auto;" title="TB Add-on Link" width="600" /></a></figure></div> <p><br /><br /><br />With the sign‑off sorted, now let’s measure the results. </p> <h3><strong>ThirdStat</strong>s</h3> <p>Looking for a way to interpret email trends on more than just vibes alone? <a href="https://addons.thunderbird.net/en-US/thunderbird/addon/thirdstats/">ThirdStats</a> turns your mailbox into clear, local analytics that reveal how your email work actually behaves, when volume spikes, which hours are busiest, how response times trend, and which folders see the most activity. Interactive charts make patterns easy to spot at a glance. </p> <p>You can compare accounts side by side, adjust date ranges to see changes over time, and focus on a specific folder for deeper context. All processing happens on your device with read‑only access, so your data isn’t transmitted elsewhere. It’s a simple, private way to understand your workload and time your effort better. </p> <p>Below is a quick glance at how ThirdStats can help you: </p> <ul><li>Visualize volume, peak hours, response times, and folder activity with interactive charts.<br /></li> <li>Compare accounts side by side; filter by date ranges; view by folder.<br /></li> <li>Keep it private: analysis runs locally with read‑only access, no external transmission.</li></ul> <div class="wp-block-image is-style-default"><figure class="alignleft size-large is-resized"><a href="https://addons.thunderbird.net/en-US/thunderbird/addon/thirdstats/"><img alt="Link to Thunderbird Add-on library." class="wp-image-4000" height="217" src="https://blog.thunderbird.net/files/2025/10/Screenshot-2025-10-24-at-12.40.49 PM-1-600x217.png" style="width: 144px; height: auto;" title="TB Add-on Link" width="600" /></a></figure></div> <p><br /><br /><br />Do you have a favorite extension? Share it with us in the comments below. </p> <p>To learn more about add-ons check out <a href="http://Maximize Your Day: Extend Your Productivity with Add-ons">Maximize Your Day: Extend Your Productivity with Add-ons</a>.</p> <p>Your workflow deserves a client that adapts to it. Add what accelerates you, trim the rest, and keep improving. When you’re ready to go further, the <a href="https://addons.thunderbird.net/en-US/thunderbird/">Thunderbird Add-ons Catalog </a>is the fastest path to new features. Check what’s popular, discover up‑and‑coming tools, and install directly from the page with built‑in version compatibility checks. Thanks for reading.</p><p>The post <a href="https://blog.thunderbird.net/2025/10/your-workflow-supercharged/">Your Workflow, Supercharged</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Fri, 24 Oct 2025 20:00:11 +0000</pubDate> <dc:creator>David Hathaway</dc:creator></item><item> <title>The Servo Blog: This month in Servo: experimental mode, Trusted Types, strokeText(), and more!</title> <guid isPermaLink="true">https://servo.org/blog/2025/10/24/this-month-in-servo/</guid> <link>https://servo.org/blog/2025/10/24/this-month-in-servo/</link> <description><p>September was another busy month for Servo, with a bunch of new features landing in our nightly builds:</p><ul><li>the <strong>Trusted Types</strong> API is now stable (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/39281">#39281</a>, <a href="https://github.com/servo/servo/pull/39263">#39263</a>)</li><li><strong>strokeText()</strong> on CanvasRenderingContext2D (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/39183">#39183</a>)</li><li><strong>invertSelf()</strong> on DOMMatrix (<a href="https://github.com/lumiscosity">@lumiscosity</a>, <a href="https://github.com/servo/servo/pull/39148">#39148</a>)</li><li><strong>getType()</strong> and <strong>supports()</strong> on ClipboardItem (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/servo/servo/pull/39296">#39296</a>)</li><li><strong>getAll()</strong> and <strong>getAllKeys()</strong> on IDBObjectStore (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/servo/servo/pull/38885">#38885</a>)</li><li><strong>scrollParent</strong> property on HTMLElement (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/39110">#39110</a>)</li><li><strong>sizes</strong> property on HTMLImageElement (<a href="https://github.com/tharkum">@tharkum</a>, <a href="https://github.com/servo/servo/pull/39466">#39466</a>)</li></ul><figure> <img alt="servoshell nightly showing new support for the strokeText() method on CanvasRenderingContext2D" src="https://servo.org/img/blog/2025-10-diffie.jpg" /></figure><p>servoshell now has a new <strong>experimental mode button</strong> (☢).Turning on experimental mode has the same effect as running Servo with <code>--enable-experimental-web-platform-features</code>: it enables all engine features, even those that may not be stable or complete.This works much like Chromium’s option with the same name, and it can be useful when a page is not functioning correctly, since it may allow the page to make further progress.</p><figure> <img alt="servoshell nightly showing the new experimental mode button (☢), which enables experimental web platform features" src="https://servo.org/img/blog/2025-10-experimental.png" /> &lt;figcaption&gt;Top to bottom: experimental mode off, experimental mode on.&lt;/figcaption&gt;</figure><p><strong>Viewport meta</strong> tags are now enabled on mobile devices only, fixing a bug where they were enabled on desktop (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/39133">#39133</a>).You can still enable them if needed with <code>--pref viewport_meta_enabled</code> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/39207">#39207</a>).</p><p>Servo now supports <strong>‘<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Encoding">Content-Encoding</a>: <a href="https://en.wikipedia.org/wiki/Zstd">zstd</a>’</strong> (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/36530">#36530</a>), and we’ve fixed a bug causing spurious credentials prompts when a HTTP 401 has no ‘WWW-Authenticate’ header (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/39215">#39215</a>).We’ve also made a bunch of progress on <strong>AbortController</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/39290">#39290</a>, <a href="https://github.com/servo/servo/pull/39295">#39295</a>, <a href="https://github.com/servo/servo/pull/39374">#39374</a>, <a href="https://github.com/servo/servo/pull/39406">#39406</a>) and <strong>&lt;link rel=preload&gt;</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/39033">#39033</a>, <a href="https://github.com/servo/servo/pull/39034">#39034</a>, <a href="https://github.com/servo/servo/pull/39052">#39052</a>, <a href="https://github.com/servo/servo/pull/39146">#39146</a>, <a href="https://github.com/servo/servo/pull/39167">#39167</a>).</p><p><strong>‘Content-Security-Policy: sandbox’</strong> now <strong>disables scripting</strong> unless <strong>‘allow-scripts’</strong> is given (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/39163">#39163</a>), and <strong>crypto.subtle.exportKey()</strong> can now export HMAC keys in <code>raw</code> format (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/servo/servo/pull/39059">#39059</a>).</p><p>The <strong>scrollIntoView()</strong> method on Element now works with shadow DOM (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/39144">#39144</a>), and recurses to parent iframes if they are same origin (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/39475">#39475</a>, <a href="https://github.com/servo/servo/pull/39397">#39397</a>, <a href="https://github.com/servo/servo/pull/39153">#39153</a>).</p><p>Several types of <strong>DOM exceptions can now have error messages</strong> (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/rodio">@rodio</a>, <a href="https://github.com/excitablesnowball">@excitablesnowball</a>, <a href="https://github.com/servo/servo/pull/39056">#39056</a>, <a href="https://github.com/servo/servo/pull/39394">#39394</a>, <a href="https://github.com/servo/servo/pull/39535">#39535</a>), and we’ve also fixed a bug where links often need to be clicked twice (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/39326">#39326</a>), and fixed bugs affecting &lt;img&gt; attribute changes (<a href="https://github.com/tharkum">@tharkum</a>, <a href="https://github.com/servo/servo/pull/39483">#39483</a>), the ‘:defined’ selector (<a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/39325">#39325</a>, <a href="https://github.com/servo/servo/pull/39390">#39390</a>), invertSelf() on DOMMatrix (<a href="https://github.com/lumiscosity">@lumiscosity</a>, <a href="https://github.com/servo/servo/pull/39113">#39113</a>), and the ‘href’ setter on Location (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/39051">#39051</a>).</p><p>One complex part of Servo isn’t even written in Rust, it’s written in Python!<a href="https://github.com/servo/servo/blob/25d3c5a157e781db8813071a5ba647463546d0cd/components/script_bindings/codegen/codegen.py"><strong>codegen.py</strong></a>, which describes how to generate Rust code with bindings for every known DOM interface from the WebIDL, is now <strong>fully type annotated</strong> (<a href="https://github.com/jerensl">@jerensl</a>, <a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/39070">#39070</a>, <a href="https://github.com/servo/servo/pull/38998">#38998</a>).</p><h3>Embedding and automation <a class="header-anchor" href="https://servo.org/blog/2025/10/24/this-month-in-servo/#embedding-and-automation"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>Servo now requires <strong>Rust 1.86</strong> to build (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/39185">#39185</a>).</p><p><strong>Keyboard scrolling</strong> is now automatically implemented by Servo (<a href="https://github.com/delan">@delan</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/39371">#39371</a>, <a href="https://github.com/servo/servo/pull/39469">#39469</a>), so embedders <a href="https://github.com/servo/servo/pull/39371/files#diff-24ced12025398fd76b233d19f4507362ae8b3848157577d8041effc4c4a229ae">no longer</a> need to translate <strong>arrow keys</strong>, <strong>Home</strong>, <strong>End</strong>, <strong>Page Up</strong>, and <strong>Page Down</strong> to WebView API calls.This change also improves the behaviour of those keys, scrolling the element or &lt;iframe&gt; that was focused or most recently clicked (or a nearby ancestor).</p><p><code><a href="https://doc.servo.org/servo_config/opts/struct.DebugOptions.html">DebugOptions</a>::convert_mouse_to_touch</code> (<code>-Z convert-mouse-to-touch</code>) has been removed (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/39352">#39352</a>), with no replacement.Touch event simulation continues to be available in servoshell as <code>--simulate-touch-events</code>.</p><p><code><a href="https://doc.servo.org/servo_config/opts/struct.DebugOptions.html">DebugOptions</a>::webrender_stats</code> (<code>-Z wr-stats</code> in servoshell) has been removed (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/39331">#39331</a>); instead call <code><a href="https://doc.servo.org/servo/struct.WebView.html#method.toggle_webrender_debugging">toggle_webrender_debugging</a>(<a href="https://doc.servo.org/servo/enum.WebRenderDebugOption.html#variant.Profiler">Profiler</a>)</code> on a WebView (or press <strong>Ctrl</strong>+<strong>F12</strong> in servoshell).</p><p><code><a href="https://doc.servo.org/servo_config/opts/struct.DebugOptions.html">DebugOptions</a>::trace_layout</code> (<code>-Z trace-layout</code>) has been removed (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/39332">#39332</a>), since it had no effect.</p><p>We’ve improved the docs for <code><a href="https://doc.servo.org/servo/trait.WebViewDelegate.html">WebViewDelegate</a>::<a href="https://doc.servo.org/servo/trait.WebViewDelegate.html#method.notify_history_changed">notify_history_changed</a></code> (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/39134">#39134</a>).</p><p>When automating servoshell with <strong>WebDriver</strong>, commands <strong>targeting elements</strong> now correctly <strong>scroll into view</strong> if needed (<a href="https://github.com/PotatoCP">@PotatoCP</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/38508">#38508</a>, <a href="https://github.com/servo/servo/pull/39265">#39265</a>), allowing <strong>Element Click</strong>, <strong>Element Send Keys</strong>, <strong>Element Clear</strong>, and <strong>Take Element Screenshot</strong> to work properly when the element is outside the viewport.</p><p><strong>WebDriver mouse inputs</strong> now work correctly with <strong>HiDPI scaling</strong> on more platforms (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/39472">#39472</a>), and we’ve improved the reliability of <strong>Take Screenshot</strong>, <strong>Take Element Screenshot</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/39499">#39499</a>, <a href="https://github.com/servo/servo/pull/39539">#39539</a>, <a href="https://github.com/servo/servo/pull/39543">#39543</a>), <strong>Switch To Frame</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/39086">#39086</a>), <strong>Switch To Window</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/39241">#39241</a>), and <strong>New Session</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/39040">#39040</a>).</p><p>These improvements have enabled us to run the <strong>WebDriver conformance tests</strong> in CI by default (<a href="https://github.com/PotatoCP">@PotatoCP</a>, <a href="https://github.com/servo/servo/pull/39087">#39087</a>), and also mean we’re closer than ever to running <a href="https://web-platform-tests.org/writing-tests/testdriver.html">WebDriver-based Web Platform Tests</a>.</p><h3>servoshell <a class="header-anchor" href="https://servo.org/blog/2025/10/24/this-month-in-servo/#servoshell"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p><strong>Favicons</strong> now update correctly when you <strong>navigate back and forward</strong> (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/39575">#39575</a>), not just when you load a new page.</p><p>servoshell’s <strong>command line argument parsing</strong> has been reworked (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/servo/servo/pull/37194">#37194</a>, <a href="https://github.com/servo/servo/pull/39316">#39316</a>), which should fix the confusing behaviour of some options.</p><p>On mobile devices, servoshell now resizes the webview correctly when the available space changes (<a href="https://github.com/blueguy1">@blueguy1</a>, <a href="https://github.com/yjx">@yjx</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/39507">#39507</a>).</p><p>On macOS, telling servoshell to <a href="https://w3c.github.io/webdriver/#screen-capture"><strong>take a screenshot</strong></a> no longer hides the window (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/39500">#39500</a>).This does not affect taking a screenshot in headless mode (<code>--headless</code>), where there continues to be no window at all.</p><h3>Performance <a class="header-anchor" href="https://servo.org/blog/2025/10/24/this-month-in-servo/#performance"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>Servo currently runs in <strong>single-process mode</strong> unless you opt in to <code>--multiprocess</code> mode, and we’ve landed a few perf improvements in that default mode.For one, in single-process mode, script can now <strong>communicate with the embedder directly</strong> for reduced latency (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/39039">#39039</a>).We also create one thread pool for the image cache now, rather than one pool per origin (<a href="https://github.com/rodio">@rodio</a>, <a href="https://github.com/servo/servo/pull/38783">#38783</a>).</p><p>Many components of Servo that <em>would</em> be <a href="https://book.servo.org/architecture/overview.html#architecture">separated by a process boundary</a> in multiprocess mode, now use <a href="https://docs.rs/crossbeam-channel/0.5.15/crossbeam_channel/">crossbeam channels</a> in single-process mode, rather than using <a href="https://docs.rs/ipc-channel/0.20.2/ipc_channel/">IPC channels</a> in both modes (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/39073">#39073</a>, <a href="https://github.com/servo/servo/pull/39076">#39076</a>, <a href="https://github.com/servo/servo/pull/39345">#39345</a>, <a href="https://github.com/servo/servo/pull/39347">#39347</a>, <a href="https://github.com/servo/servo/pull/39348">#39348</a>, <a href="https://github.com/servo/servo/pull/39074">#39074</a>).<a href="https://docs.rs/ipc-channel/0.20.2/ipc_channel/">IPC channels</a> are required when communicating with another process, but they’re more expensive, because they require serialising and deserialising each message, plus resources from the operating system.</p><p>We’ve started working on an optimisation for string handling in Servo’s DOM layer (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/servo/servo/pull/39480">#39480</a>, <a href="https://github.com/servo/servo/pull/39481">#39481</a>, <a href="https://github.com/servo/servo/pull/39504">#39504</a>).Strings in our DOM have historically been represented as <a href="https://doc.rust-lang.org/std/string/struct.String.html">ordinary Rust strings</a>, but they often come from SpiderMonkey, where they use <a href="https://searchfox.org/firefox-main/rev/8e5d58cfed616cb90586c614e53d8ab1ffc8af27/js/src/vm/StringType.h#83">a variety of representations</a>, none of which are entirely compatible.SpiderMonkey strings would continue to need conversion to Servo strings, but the idea we’re working towards is to <strong>make the conversion lazy</strong>, in the hope that many strings will never end up being converted at all.</p><p>We now use a faster hash algorithm for internal hashmaps that are not security-critical (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/servo/servo/pull/39106">#39106</a>, <a href="https://github.com/servo/servo/pull/39166">#39166</a>, <a href="https://github.com/servo/servo/pull/39202">#39202</a>, <a href="https://github.com/servo/servo/pull/39233">#39233</a>, <a href="https://github.com/servo/servo/pull/39244">#39244</a>, <a href="https://github.com/servo/servo/pull/39168">#39168</a>).These changes also switch that faster algorithm from <a href="https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function">FNV</a> to an <a href="https://docs.rs/rustc-hash/2.1.1/rustc_hash/">even simpler polynomial hash</a>, following in the footsteps of <a href="https://github.com/rust-lang/rust/pull/37229">Rust</a> and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1477628">Stylo</a>.</p><p>We’ve also landed a few more self-contained perf improvements:</p><ul><li>speeding up accesses to the event loop (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/servo/servo/pull/39274">#39274</a>, <a href="https://github.com/servo/servo/pull/39275">#39275</a>)</li><li>avoviding new display lists while loading CSS images (<a href="https://github.com/coding-joedow">@coding-joedow</a>, <a href="https://github.com/servo/servo/pull/39201">#39201</a>)</li><li>reducing memory usage (<a href="https://github.com/ritoban23">@ritoban23</a>, <a href="https://github.com/servo/servo/pull/39351">#39351</a>)</li><li>reducing binary size (<a href="https://github.com/lumiscosity">@lumiscosity</a>, <a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/servo/servo/pull/39437">#39437</a>, <a href="https://github.com/servo/servo/pull/39567">#39567</a>)</li></ul><h3>Donations <a class="header-anchor" href="https://servo.org/blog/2025/10/24/this-month-in-servo/#donations"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>Thanks again for your generous support!We are now receiving <strong>5654 USD/month</strong> (+1.8% over August) in recurring donations.</p><p>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.Keep an eye out for <a href="https://github.com/servo/servo/issues/38141">further CI improvements</a> in the coming months, including <a href="https://github.com/servo/servo/pull/39900">faster pull request checks</a> and <a href="https://github.com/servo/ci-runners/issues/21">ten-minute WPT builds</a>.</p><p>Servo is also on <a href="https://thanks.dev/">thanks.dev</a>, and already <strong>28 GitHub users</strong> (±13 from August) 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><figure class="_fig" style="width: 100%; margin: 1em 0;"><div class="_flex"> <div style="text-align: right;"> <div><strong>5654</strong> USD/month</div> <div></div> <div></div> <div style="padding-right: 1em;"><strong>10000</strong></div> </div> <progress max="10000" value="5654"></progress></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><h3>Conference talks <a class="header-anchor" href="https://servo.org/blog/2025/10/24/this-month-in-servo/#conference-talks"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p><strong><a href="https://ke.segmentfault.com/course/1650000043885605/section/1500000047216580">MiniApps Design and Servo</a></strong> (starting at ~2:37:00; <a href="https://www.w3.org/2024/01/webevolve-series-events/annual-2025/slides/gregory-terzian.pdf">slides</a>) — Gregory Terzian (<a href="https://github.com/gterzian">@gterzian</a>) spoke about how Servo can be used as a web engine for mini-app platforms at <a href="https://www.w3.org/2024/01/webevolve-series-events/annual-2025/high-perf.en.html">WebEvolve 2025</a></p><p><strong><a href="https://ke.segmentfault.com/course/1650000043885605/section/1500000047216580">独⽴的,轻量级,模块化与并⾏处理架构的Web引擎开发</a></strong> [zh] / <strong>Developing an independent, light-weight, modular and parallel web-engine</strong> [en] (starting at ~5:49:00; <a href="https://www.w3.org/2024/01/webevolve-series-events/annual-2025/slides/jonathan-schwender.pdf">slides</a>) — Jonathan Schwender (<a href="https://github.com/jschwe">@jschwe</a>) spoke about Servo’s goals and status at <a href="https://www.w3.org/2024/01/webevolve-series-events/annual-2025/high-perf.en.html">WebEvolve 2025</a></p><p><strong>Servo: A new web engine written in Rust</strong>* (<a href="https://docs.google.com/presentation/d/1t15UKit4UPkZ-4ankkvsTJdpQWdBCmeTXLALeLk9n34">slides</a>; <a href="https://blogs.igalia.com/mrego/servo-a-new-web-engine-written-in-rust/">transcript</a>) — Manuel Rego (<a href="https://github.com/rego">@rego</a>) spoke about the Servo project at <a href="https://hangzhou2025.gosim.org/">GOSIM Hangzhou 2025</a></p><p><strong>Driving Innovation with Servo and OpenHarmony: Unified Rendering and WebDriver</strong>* (<a href="https://servo.org/files/2025-09-13-driving-innovation-with-servo-and-openharmony-unified-rendering-and-webdriver.pdf">slides</a>) — Jingshi Shangguan &amp; Zhizhen Ye (<a href="https://github.com/yezhizhen">@yezhizhen</a>) spoke about a new OpenHarmony rendering backend and WebDriver support in Servo at <a href="https://hangzhou2025.gosim.org/">GOSIM Hangzhou 2025</a></p><p><strong>The Joy and Value of Embedded Servo Systems</strong>* (<a href="https://servo.org/files/2025-09-13-the-joy-and-value-of-embedded-servo-systems.pdf">slides</a>) — Gregory Terzian (<a href="https://github.com/gterzian">@gterzian</a>) spoke about embedding Servo at <a href="https://hangzhou2025.gosim.org/">GOSIM Hangzhou 2025</a></p><p><strong>A Dive Into the Servo Layout System</strong>* (<a href="https://servo.org/files/2025-09-13-a-dive-into-the-servo-layout-system.pdf">slides</a>) — Martin Robinson (<a href="https://github.com/mrobinson">@mrobinson</a>) &amp; Oriol Brufau (<a href="https://github.com/obrufau">@obrufau</a>) spoke about the architecture of Servo’s parallel and incremental layout system at <a href="https://hangzhou2025.gosim.org/">GOSIM Hangzhou 2025</a></p><p><small>* video coming soon; go to our <a href="https://servo.org/about/">About page</a> for updates</small></p></description> <pubDate>Fri, 24 Oct 2025 00:00:00 +0000</pubDate></item><item> <title>Mozilla Addons Blog: Announcing data collection consent changes for new Firefox extensions</title> <guid isPermaLink="false">https://blog.mozilla.org/addons/?p=9265</guid> <link>https://blog.mozilla.org/addons/2025/10/23/data-collection-consent-changes-for-new-firefox-extensions/</link> <description><p>As of November 3rd 2025, all <b>new</b> Firefox extensions will be required to <a href="https://extensionworkshop.com/documentation/develop/firefox-builtin-data-consent/#specifying-data-types">specify if they collect or transmit personal data</a> in their <code>manifest.json</code> file using the <code>browser_specific_settings.gecko.data_collection_permissions key</code>. This will apply to new extensions only, and <b>not new versions of existing extensions</b>. Extensions that do not collect or transmit any personal data are required to specify this by setting the none required data collection permission in this property.</p><p>This information will then be displayed to the user when they start to install the extension, alongside any permissions it requests.</p><p><a href="https://blog.mozilla.org/addons/files/2025/10/data-collection-permissions-prompt-install.460b7848.webp"><img alt="Screenshot of example Firefox extension installation prompt showing data that the extension collects" class="size-medium wp-image-9267 aligncenter" height="418" src="https://blog.mozilla.org/addons/files/2025/10/data-collection-permissions-prompt-install.460b7848-580x418.webp" width="580" /></a> <a href="https://blog.mozilla.org/addons/files/2025/10/data-collection-permissions-prompt-install-no-transmission.66cdd978.webp"><img alt="Screenshot of example Firefox extension installation prompt showing that the extension claims it collects no data" class="size-medium wp-image-9266 aligncenter" height="402" src="https://blog.mozilla.org/addons/files/2025/10/data-collection-permissions-prompt-install-no-transmission.66cdd978-580x402.webp" width="580" /></a></p><p>This information will also be displayed on the <a href="http://addons.mozilla.org">addons.mozilla.org</a> page, if it is publicly listed, and in the <i>Permissions and Data</i> section of the Firefox about:addons page for that extension. If an extension supports versions of Firefox prior to 140 for Desktop, or 142 for Android, then the developer will need to continue to provide the user with a clear way to control the add-on’s data collection and transmission immediately after installation of the add-on.</p><p>Once any extension starts using these <code>data_collection_permissions</code> keys in a new version, it will need to continue using them for all subsequent versions. Extensions that do not have this property set correctly, and are required to use it, will be prevented from being submitted to <a href="http://addons.mozilla.org">addons.mozilla.org</a> for signing with a message explaining why.</p><p>In the first half of 2026, Mozilla will require all extensions to adopt this framework. But don’t worry, we’ll give plenty of notice via the add-ons blog. We’re also developing some new features to ease this transition for both extension developers and users, which we will announce here.</p><p>The post <a href="https://blog.mozilla.org/addons/2025/10/23/data-collection-consent-changes-for-new-firefox-extensions/">Announcing data collection consent changes for new Firefox extensions</a> appeared first on <a href="https://blog.mozilla.org/addons">Mozilla Add-ons Community Blog</a>.</p></description> <pubDate>Thu, 23 Oct 2025 10:57:39 +0000</pubDate> <dc:creator>Alan Byrne</dc:creator></item><item> <title>Niko Matsakis: Explicit capture clauses</title> <guid isPermaLink="false">https://smallcultfollowing.com/babysteps/blog/2025/10/22/explicit-capture-clauses/</guid> <link>https://smallcultfollowing.com/babysteps/blog/2025/10/22/explicit-capture-clauses/?utm_source=atom_feed</link> <description><p>In my previous post about Ergonomic Ref Counting, I talked about how, whatever else we do, we need a way to have explicit handle creation that is ergonomic. The next few posts are going to explore a few options for how we might do that.</p><p>This post focuses on <strong>explicit capture clauses</strong>, which would permit closures to be annotated with an explicit set of captured places. My take is that explicit capture clauses are a no brainer, for reasons that I’ll cover below, and we should definitely do them; but they may not be enough to be considered <em>ergonomic</em>, so I’ll explore more proposals afterwards.</p><h3>Motivation</h3><p>Rust closures today work quite well but I see a few problems:</p><ul><li>Teaching and understanding closure desugaring is difficult because it lacks an explicit form. Users have to learn to desugar in their heads to understand what’s going on.</li><li>Capturing the “clone” of a value (or possibly other transformations) has no concise syntax.</li><li>For long closure bodies, it is hard to determine precisely which values are captured and how; you have to search the closure body for references to external variables, account for shadowing, etc.</li><li>It is hard to develop an intuition for when <code>move</code> is required. I find myself adding it when the compiler tells me to, but that’s annoying.</li></ul><h3>Let’s look at a strawperson proposal</h3><p>Some time ago, I wrote a proposal for explicit capture clauses. I actually see a lot of flaws with this proposal, but I’m still going to explain it: right now it’s the only solid proposal I know of, and it’s good enough to explain how an explicit capture clause <em>could be seen</em> as a solution to the “explicit <em>and</em> ergonomic” goal. I’ll then cover some of the things I like about the proposal and what I don’t.</p><h3>Begin with <code>move</code></h3><p>The proposal begins by extending the <code>move</code> keyword with a list of places to capture:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">.</span><span class="n">y</span><span class="p">)</span><span class="w"> </span><span class="o">||</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">do_something</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">c</span><span class="p">.</span><span class="n">d</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">.</span><span class="n">y</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></code></pre></div><p>The closure will then take ownership of those two places; references to those places in the closure body will be replaced by accesses to these captured fields. So that example would desugar to something like</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="o">=</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">struct</span> <span class="nc">MyClosure</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">a_b_c</span>: <span class="nc">Foo</span><span class="p">,</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">x_y</span>: <span class="nc">Bar</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">impl</span><span class="w"> </span><span class="nb">FnOnce</span><span class="o">&lt;</span><span class="p">()</span><span class="o">&gt;</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">MyClosure</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">call_once</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nc">Baz</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">do_something</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">a_b_c</span><span class="p">.</span><span class="n">d</span><span class="p">,</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">x_y</span><span class="p">)</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// ---------- --------</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// The place `a.b.c` is |</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// rewritten to the field |</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// `self.a_b_c` |</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// Same here but for `x.y`</span></span></span><span class="line"><span class="cl"><span class="c1"></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="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="w"> </span><span class="n">MyClosure</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">a_b_c</span>: <span class="nc">self</span><span class="p">.</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">c</span><span class="p">,</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">x_y</span>: <span class="nc">self</span><span class="p">.</span><span class="n">x</span><span class="p">.</span><span class="n">y</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></code></pre></div><p>When using a simple list like this, attempts to reference other places that were not captured result in an error:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">.</span><span class="n">y</span><span class="p">)</span><span class="w"> </span><span class="o">||</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">do_something</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">c</span><span class="p">.</span><span class="n">d</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">.</span><span class="n">z</span><span class="p">)</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// ------- ---</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// OK Error: `x.z` not captured</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">};</span><span class="w"></span></span></span></code></pre></div><h3>Capturing with rewrites</h3><p>It is also possible to capture a custom expression by using an <code>=</code> sign. So for example, you could rewrite the above closure as follows:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">c</span><span class="p">.</span><span class="n">clone</span><span class="p">(),</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">x</span><span class="p">.</span><span class="n">y</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 class="o">||</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">do_something</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">c</span><span class="p">.</span><span class="n">d</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="p">.</span><span class="n">z</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></code></pre></div><p>and it would desugar to:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="o">=</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">struct</span> <span class="nc">MyClosure</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* as before */</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">impl</span><span class="w"> </span><span class="nb">FnOnce</span><span class="o">&lt;</span><span class="p">()</span><span class="o">&gt;</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">MyClosure</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* as before */</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">MyClosure</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">a_b_c</span>: <span class="nc">self</span><span class="p">.</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">c</span><span class="p">.</span><span class="n">clone</span><span class="p">(),</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// ------------------</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">x_y</span>: <span class="nc">self</span><span class="p">.</span><span class="n">x</span><span class="p">.</span><span class="n">y</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></code></pre></div><p>When using this form, the expression assigned to <code>a.b.c</code> must have the same type as <code>a.b.c</code> in the surrounding scope. So this would be an error:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">22</span><span class="p">,</span><span class="w"> </span><span class="c1">// Error: `i32` is not `Foo`</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">x</span><span class="p">.</span><span class="n">y</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 class="o">||</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="cm">/* ... */</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></code></pre></div><h3>Shorthands and capturing by reference</h3><p>You can understand <code>move(a.b)</code> as sugar for <code>move(a.b = a.b)</code>. We support other convenient shorthands too, such as</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">move</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">clone</span><span class="p">())</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">{</span><span class="o">..</span><span class="p">.}</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// == anything that ends in a method call becomes ==&gt;</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">move</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">clone</span><span class="p">())</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">{</span><span class="o">..</span><span class="p">.}</span><span class="w"></span></span></span></code></pre></div><p>and two kinda special shorthands:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">move</span><span class="p">(</span><span class="o">&amp;</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="o">..</span><span class="p">.</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">move</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="o">..</span><span class="p">.</span><span class="w"> </span><span class="p">}</span><span class="w"></span></span></span></code></pre></div><p>These are special because the captured value is indeed <code>&amp;a.b</code> and <code>&amp;mut a.b</code> – but that by itself wouldn’t work, because the type doesn’t match. So we rewrite each access to <code>a.b</code> to desugar to a dereference of the <code>a_b</code> field, like <code>*self.a_b</code>:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">move</span><span class="p">(</span><span class="o">&amp;</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">foo</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">)</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></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// desugars to</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">struct</span> <span class="nc">MyStruct</span><span class="o">&lt;</span><span class="na">'l</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="n">a_b</span>: <span class="kp">&amp;</span><span class="na">'l</span> <span class="nc">Foo</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></span><span class="line"><span class="cl"><span class="w"></span><span class="k">impl</span><span class="w"> </span><span class="nb">FnOnce</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">MyStruct</span><span class="o">&lt;</span><span class="nb">'_</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">call_once</span><span class="p">(</span><span class="bp">self</span><span class="p">)</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">foo</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="p">.</span><span class="n">a_b</span><span class="p">)</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// ---------</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// we insert the `*` too</span></span></span><span class="line"><span class="cl"><span class="c1"></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="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="w"></span><span class="n">MyStruct</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">a_b</span>: <span class="kp">&amp;</span><span class="nc">a</span><span class="p">.</span><span class="n">b</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></span><span class="line"><span class="cl"><span class="w"></span><span class="k">move</span><span class="p">(</span><span class="o">&amp;</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">foo</span><span class="p">(</span><span class="o">*</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="p">}</span><span class="w"></span></span></span></code></pre></div><p>There’s a lot of precedence for this sort of transform: it’s precisely what we do for the <code>Deref</code> trait and for existing closure captures.</p><h3>Fresh variables</h3><p>We should also allow you to define fresh variables. These can have arbitrary types. The values are evaluated at closure creation time and stored in the closure metadata:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">move</span><span class="p">(</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">load_data</span><span class="p">(),</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">y</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 class="o">||</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">take</span><span class="p">(</span><span class="o">&amp;</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">y</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></code></pre></div><h3>Open-ended captures</h3><p>All of our examples so far fully enumerated the captured variables. But Rust closures today infer the set of captures (and the style of capture) based on the paths that are used. We should permit that as well. I’d permit that with a <code>..</code> sugar, so these two closures are equivalent:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">c2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="cm">/* closure */</span><span class="p">;</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// ---- capture anything that is used,</span></span></span><span class="line"><span class="cl"><span class="c1">// taking ownership</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="n">c1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="o">..</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="cm">/* closure */</span><span class="p">;</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// ---- capture anything else that is used,</span></span></span><span class="line"><span class="cl"><span class="c1">// taking ownership</span></span></span></code></pre></div><p>Of course you can combine:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">y</span><span class="p">.</span><span class="n">clone</span><span class="p">(),</span><span class="w"> </span><span class="o">..</span><span class="p">)</span><span class="w"> </span><span class="o">||</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></span><span class="line"><span class="cl"><span class="w"></span><span class="p">};</span><span class="w"></span></span></span></code></pre></div><p>And you could write <code>ref</code> to get the equivalent of <code>||</code> closures:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">c2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="cm">/* closure */</span><span class="p">;</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// -- capture anything that is used,</span></span></span><span class="line"><span class="cl"><span class="c1">// using references if possible</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">let</span><span class="w"> </span><span class="n">c1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="k">ref</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="cm">/* closure */</span><span class="p">;</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// --- capture anything else that is used,</span></span></span><span class="line"><span class="cl"><span class="c1">// using references if possible</span></span></span></code></pre></div><p>This lets you</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">clone</span><span class="p">(),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">c</span><span class="p">,</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">ref</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 class="o">||</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">combine</span><span class="p">(</span><span class="o">&amp;</span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">z</span><span class="p">)</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// --- - -</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// | | |</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// | | This will be captured by reference</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// | | since it is used by reference</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// | | and is not explicitly named.</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// | |</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// | This will be captured by value</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// | since it is explicitly named.</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// |</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// We will capture a clone of this because</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// the user wrote `a.b.clone()`</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span><span class="w"></span></span></span></code></pre></div><h3>Frequently asked questions</h3><h4>How does this help with our motivation?</h4><p>Let’s look at the motivations I named:</p><h5>Teaching and understanding closure desugaring is difficult</h5><p>There’s a lot of syntax there, but it also gives you an explicit form that you can use to do explanations. To see what I mean, consider the difference between these two closures (<a href="http://smallcultfollowing.com/babysteps/atom.xml">playground</a>).</p><p>The first closure uses <code>||</code>:</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">main</span><span class="p">()</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="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">c_attached</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">||</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="kd">let</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><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">replace</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">j</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="o">..</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></code></pre></div><p>While the second closure uses <code>move</code>:</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">main</span><span class="p">()</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="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">c_detached</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="w"> </span><span class="o">||</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="kd">let</span><span class="w"> </span><span class="n">j</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><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">replace</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">j</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></code></pre></div><p>These are in fact pretty different, <a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2024&amp;gist=fec374e4055a99aa3dda9e66a5c03495">as you can see in this playground</a>. But why? Well, the first closure desugars to capture a reference:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">c_attached</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="o">&amp;</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">{</span><span class="o">..</span><span class="p">.};</span><span class="w"></span></span></span></code></pre></div><p>and the second captures by value:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">c_attached</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">{</span><span class="o">..</span><span class="p">.};</span><span class="w"></span></span></span></code></pre></div><p>Before, to explain that, I had to resort to desugaring to structs.</p><h5>Capturing a clone is painful</h5><p>If you have a closure that wants to capture the clone of something today, you have to introduce a fresh variable. So something like this:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="w"> </span><span class="o">||</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">begin_actor</span><span class="p">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">tx</span><span class="p">.</span><span class="n">clone</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></code></pre></div><p>becomes</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="o">=</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="kd">let</span><span class="w"> </span><span class="n">self_tx</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">tx</span><span class="p">.</span><span class="n">clone</span><span class="p">();</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">move</span><span class="w"> </span><span class="o">||</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">begin_actor</span><span class="p">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="n">self_tx</span><span class="p">.</span><span class="n">clone</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></code></pre></div><p>This is awkward. Under this proposal, it’s possible to point-wise replace specific items:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">tx</span><span class="p">.</span><span class="n">clone</span><span class="p">(),</span><span class="w"> </span><span class="o">..</span><span class="p">)</span><span class="w"> </span><span class="o">||</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">begin_actor</span><span class="p">(</span><span class="n">data</span><span class="p">,</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">tx</span><span class="p">.</span><span class="n">clone</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></code></pre></div><h5>For long closure bodies, it is hard to determine precisely which values are captured and how</h5><p>Quick! What variables does this closure use from the environment?</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="p">.</span><span class="n">flat_map</span><span class="p">(</span><span class="k">move</span><span class="w"> </span><span class="o">|</span><span class="p">(</span><span class="n">severity</span><span class="p">,</span><span class="w"> </span><span class="n">lints</span><span class="p">)</span><span class="o">|</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">parse_tt_as_comma_sep_paths</span><span class="p">(</span><span class="n">lints</span><span class="p">,</span><span class="w"> </span><span class="n">edition</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="n">into_iter</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="n">flat_map</span><span class="p">(</span><span class="k">move</span><span class="w"> </span><span class="o">|</span><span class="n">lints</span><span class="o">|</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="c1">// Rejoin the idents with `::`, so we have no spaces in between.</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">lints</span><span class="p">.</span><span class="n">into_iter</span><span class="p">().</span><span class="n">map</span><span class="p">(</span><span class="k">move</span><span class="w"> </span><span class="o">|</span><span class="n">lint</span><span class="o">|</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="p">(</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">lint</span><span class="p">.</span><span class="n">segments</span><span class="p">().</span><span class="n">filter_map</span><span class="p">(</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="o">|</span><span class="n">segment</span><span class="o">|</span><span class="w"> </span><span class="n">segment</span><span class="p">.</span><span class="n">name_ref</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="n">join</span><span class="p">(</span><span class="s">"::"</span><span class="p">).</span><span class="n">into</span><span class="p">(),</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">severity</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="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></code></pre></div><p>No idea? Me either. What about this one?</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="p">.</span><span class="n">flat_map</span><span class="p">(</span><span class="k">move</span><span class="p">(</span><span class="n">edition</span><span class="p">)</span><span class="w"> </span><span class="o">|</span><span class="p">(</span><span class="n">severity</span><span class="p">,</span><span class="w"> </span><span class="n">lints</span><span class="p">)</span><span class="o">|</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="cm">/* same as above */</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></code></pre></div><p>Ah, pretty clear! I find that once a closure moves beyond a couple of lines, it can make a function kind of hard to read, because it’s hard to tell what variables it may be accessing. I’ve had functions where it’s important to correctness for one reason or another that a particular closure only accesses a subset of the values around it, but I have no way to indicate that right now. Sometimes I make separate functions, but it’d be nicer if I could annotate the closure’s captures explicitly.</p><h5>It is hard to develop an intuition for when <code>move</code> is required</h5><p>Hmm, actually, I don’t think this notation helps with that at all! More about this below.</p><p>Let me cover some of the questions you may have about this design.</p><h4>Why allow the “capture clause” to specify an entire place, like <code>a.b.c</code>?</h4><p>Today you can write closures that capture places, like <code>self.context</code> below:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="w"> </span><span class="o">||</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">send_data</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">context</span><span class="p">,</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">other_field</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></code></pre></div><p>My goal was to be able to take such a closure and to add annotations that change how particular places are captured, without having to do deep rewrites in the body:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">closure</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">move</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">context</span><span class="p">.</span><span class="n">clone</span><span class="p">(),</span><span class="w"> </span><span class="o">..</span><span class="p">)</span><span class="w"> </span><span class="o">||</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="c1">// --------------------------</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// the only change</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">send_data</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">context</span><span class="p">,</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">other_field</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></code></pre></div><p>This definitely adds some complexity, because it means we have to be able to “remap” a place like <code>a.b.c</code> that has multiple parts. But it makes the explicit capture syntax far more powerful and convenient.</p><h4>Why do you keep the type the same for places like <code>a.b.c</code>?</h4><p>I want to ensure that the type of <code>a.b.c</code> is the same wherever it is type-checked, it’ll simplify the compiler somewhat and just generally makes it easier to move code into and out of a closure.</p><h4>Why the move keyword?</h4><p>Because it’s there? To be honest, I don’t like the choice of <code>move</code> because it’s so <em>operational</em>. I think if I could go back, I would try to refashion our closures around two concepts</p><ul><li><em>Attached</em> closures (what we now call <code>||</code>) would <em>always</em> be tied to the enclosing stack frame. They’d always have a lifetime even if they don’t capture anything.</li><li><em>Detached</em> closures (what we now call <code>move ||</code>) would capture by-value, like <code>move</code> today.</li></ul><p>I think this would help to build up the intuition of “use <code>detach ||</code> if you are going to return the closure from the current stack frame and use <code>||</code> otherwise”.</p><h4>What would a max-min explicit capture proposal look like?</h4><p>A maximally minimal explicit capture close proposal would probably <em>just</em> let you name specific variables and not “subplaces”:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">move</span><span class="p">(</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">a_b_c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">b</span><span class="p">.</span><span class="n">c</span><span class="p">,</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">x_y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">x</span><span class="p">.</span><span class="n">y</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 class="o">||</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="o">*</span><span class="n">x_y</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">a_b_c</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></code></pre></div><p>I think you can see though that this makes introducing an explicit form a lot less pleasant to use and hence isn’t really going to do anything to support ergonomic RC.</p><h3>Conclusion: Explicit closure clauses make things better, but not great</h3><p>I think doing explicit capture clauses is a good idea – I generally think we should have explicit syntax for everything in Rust, for teaching and explanatory purposes if nothing else; I didn’t always think this way, but it’s something I’ve come to appreciate over time.</p><p>I’m not sold on this specific proposal – but I think working through it is useful, because it (a) gives you an idea of what the benefits would be and (b) gives you an idea of how much hidden complexity there is.</p><p>I think the proposal shows that adding explicit capture clauses goes <em>some</em> way towards making things explicit <em>and</em> ergonomic. Writing <code>move(a.b.c.clone())</code> is definitely better than having to create a new binding.</p><p>But for me, it’s not really nice <em>enough</em>. It’s still quite a mental distraction to have to find the start of the closure, insert the <code>a.b.c.clone()</code> call, and it makes the closure header very long and unwieldy. Particularly for short closures the overhead is very high.</p><p>This is why I’d like to look into other options. Nonetheless, it’s useful to have discussed a proposal for an explicit form: if nothing else, it’ll be useful to explain the precise semantics of other proposals later on.</p></description> <pubDate>Wed, 22 Oct 2025 10:08:27 +0000</pubDate></item><item> <title>This Week In Rust: This Week in Rust 622</title> <guid isPermaLink="false">tag:this-week-in-rust.org,2025-10-22:/blog/2025/10/22/this-week-in-rust-622/</guid> <link>https://this-week-in-rust.org/blog/2025/10/22/this-week-in-rust-622/</link> <description><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/master/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="http://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4> <h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#official">Official</a></h5><ul><li><a href="https://blog.rust-lang.org/2025/10/15/announcing-the-new-rust-project-directors-2025/">Announcing the New Rust Project Directors</a></li><li><a href="https://blog.rust-lang.org/2025/10/16/docsrs-changed-default-targets/">docs.rs: changed default targets</a></li><li><a href="https://blog.rust-lang.org/inside-rust/2025/10/16/infrastructure-team-q3-recap-and-q4-plan/">Infrastructure Team 2025 Q3 Recap and Q4 Plan</a></li><li><a href="https://blog.rust-lang.org/inside-rust/2025/10/16/renaming-the-default-branch-of-rust-langrust/">Renaming the default branch of rust-lang/rust</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#newsletters">Newsletters</a></h5><ul><li><a href="https://scientificcomputing.rs/monthly/2025-10">Scientific Computing in Rust #11 (October 2025)</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5><ul><li><a href="https://www.sea-ql.org/blog/2025-10-20-sea-orm-2.0/">SeaORM 2.0: new entity format and relational capabilities</a></li><li><a href="https://slint.dev/blog/slint-1.14-released">Slint 1.14 Released</a></li><li><a href="https://danube-docs.dev-state.com/architecture/persistence/">Danube Messaging - new topic persistence architecture (Wal + Cloud)</a></li><li><a href="https://tqwewe.com/blog/building-sierradb/">SierraDB: A Distributed Event Store Built in Rust</a></li><li><a href="https://immunant.com/blog/2025/10/c2rust_release/">Announcing C2Rust v0.21</a></li><li><a href="https://maguire.tech/posts/shove/"><code>Shove</code> Project Writeup</a></li><li><a href="https://news.ycombinator.com/item?id=45624186">ServiceRadar - Open Source Network Management and Observability</a> </li><li><a href="https://github.com/kyu08/fzf-make/releases/tag/v0.65.0">fzf-make v0.65.0 is released! (A command line tool that executes commands using fuzzy finder)</a></li><li><a href="https://diesel.rs/assets/NGICore%20Diesel%20penetration%20test%20report%202025%201.0.pdf">Diesel Code Audit Report</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5><ul><li><a href="https://lwn.net/SubscriberLink/1042172/c7e1cdef4a518cc3/">Git considers SHA-256, Rust, LLMs, and more</a></li><li><a href="https://lwn.net/SubscriberLink/1041095/2ef0281b0fec4d9d/">DebugFS on Rust</a></li><li><a href="https://medium.com/google-cloud/python-and-rust-interoperability-a-walkthrough-for-building-a-high-performance-mcp-server-56c04e4b651b">Python and Rust interoperability</a></li><li><a href="https://smallcultfollowing.com/babysteps/blog/2025/10/21/move-destruct-leak/">Controlled Destruction in Rust: Towards Async Drop and Safer Resource Management</a></li><li><a href="https://daymare.net/blogs/everbody-so-creative/">Everybody's so Creative!</a></li><li><a href="https://blog.goose.love/posts/organizing-a-feature-freeze/">How we organized the Rust Clippy feature freeze</a></li><li><a href="https://alexsaveau.dev/blog/tips/generalizing-over-mutability-in-rust">Generalizing over mutability in Rust</a></li><li>[audio] <a href="https://netstack.fm/#episode-10">Netstack.FM Episode 10 – zerocopy with Joshua Liebow-Feeser</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5><ul><li><a href="https://blog.vega.io/posts/partial_stream/">Real-Time Results in a Federated Query Engine</a></li><li><a href="https://crustyengineer.com/blog/axum-multi-tenancy-abstract-repository-layer/">Axum: Multi-tenancy (with Hexarch) and Abstracting the Repository</a></li><li><a href="https://tweedegolf.nl/en/blog/196/fixing-rust-lang-stdarch-issues-in-llvm">Fixing rust-lang stdarch issues in LLVM - Blog - Tweede golf</a></li><li><a href="https://jorgeortiz.dev/posts/rust_unit_testing_test_doubles_spy/">Rust unit testing: spies and dummy test doubles</a></li><li><a href="https://blog.0xshadow.dev/posts/backend-engineering-with-axum/axum-refresh-token-rotation/">Axum Backend Series: Refresh Token Rotation and Reuse Detection</a></li><li><a href="https://medium.com/@carlmkadie/vibe-validation-with-lean-chatgpt-5-claude-4-5-part-1-c57b430b3d7a">Vibe Validation with Lean, ChatGPT-5, &amp; Claude 4.5: Nine Rules for Proving (Rust) Algorithms Correct Without Knowing Formal Methods (Part 1)</a></li><li><a href="https://rvarago.github.io/typed-evaluator-in-rust/">A Typed Evaluator in Rust</a></li><li><a href="https://orxfun.github.io/orxfun-notes/#/zero-cost-composition-2025-10-15">Zero Cost Composition and the Power of GATs</a></li><li><a href="https://www.unwoundstack.com/blog/integration-testing-rust-binaries.html">Integration Testing Rust Binary Crates</a></li><li>[video] <a href="https://www.youtube.com/watch?v=hpGDCbO31Rg">Build with Naz : How to speed up Rust compiler for different workflows</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#miscellaneous">Miscellaneous</a></h5><ul><li><a href="https://filtra.io/rust/jobs-report/sep-25">September 2025 Rust Jobs Report</a></li></ul><h4><a class="toclink" href="http://this-week-in-rust.org/atom.xml#crate-of-the-week">Crate of the Week</a></h4><p>This week's crate is <a href="https://docs.rs/extend_mut">extend_mut</a>, a library to safely extend the lifetime of an exclusive reference under some constraints.P</p><p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1482">Oleksandr Babak</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="http://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 theimplementation 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/orguidance on which aspect(s) of the feature need testing.</p><p><a href="https://github.com/rust-lang/cargo/labels/call-for-testing">Cargo</a>* <a href="https://github.com/rust-lang/cargo/issues/12207">Tracking Issue for cargo-script RFC 3424</a> * <a href="https://github.com/rust-lang/cargo/issues/12207#issuecomment-3412997290">Testing Steps</a></p><ul><li><em>No calls for testing were issued this week by <a href="https://github.com/rust-lang/rust/labels/call-for-testing">Rust</a>, <a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing">Rust language RFCs</a> or <a href="https://github.com/rust-lang/rustup/labels/call-for-testing">Rustup</a>.</em></li></ul><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><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rfcs"></a><a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing">RFCs</a></h5><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust"></a><a href="https://github.com/rust-lang/rust/labels/call-for-testing">Rust</a></h5><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rustup"></a><a href="https://github.com/rust-lang/rustup/labels/call-for-testing">Rustup</a></h5><p>If you are a feature implementer and would like your RFC to appear on the above list, add the new <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 featureneed testing.</p><h4><a class="toclink" href="http://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="http://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/diesel-rs/diesel/issues/4764">Diesel - Improve documentation for Postgres loading modes</a></li><li><a href="https://github.com/diesel-rs/diesel/issues/4216">Diesel - Add support for currently unsupported postgres json/jsonb functions</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="http://this-week-in-rust.org/atom.xml#cfp-events">CFP - Events</a></h5><p>Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.</p> <ul><li><a href="https://tokio.rs/blog/2025-09-26-announcing-tokio-conf-cfp"><strong>TokioConf 2026</strong></a>| CFP closes 2025-12-08 | Portland, Oregon, USA | 2026-04-20</li></ul><p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p><h4><a class="toclink" href="http://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4><p>369 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2025-10-14..2025-10-21">merged in the last week</a></p><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/147619">add a <code>!=</code> check to <code>ChunkedBitSet::union</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/147630">bitset cleanups</a></li><li><a href="https://github.com/rust-lang/rust/pull/147695"><code>deduced_param_attrs</code>: check Freeze on monomorphic types</a></li><li><a href="https://github.com/rust-lang/rust/pull/146167">deny-by-default never type lints</a></li><li><a href="https://github.com/rust-lang/rust/pull/147577">improve error message for ambiguous numeric types in closure parameters</a></li><li><a href="https://github.com/rust-lang/rust/pull/146221">remove boxes from AST list elements</a></li><li><a href="https://github.com/rust-lang/rust/pull/147508"><code>TaskDeps</code> improvements</a></li><li><a href="https://github.com/rust-lang/rust/pull/147382"><code>unused_must_use</code>: Don't warn on <code>Result&lt;(), Uninhabited&gt;</code> or <code>ControlFlow&lt;Uninhabited, ()&gt;</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/147644">use regular Vec in BitSet</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#library">Library</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/147708">const <code>mem::drop</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/146976">constify basic Clone impls</a></li><li><a href="https://github.com/rust-lang/rust/pull/147258">iter repeat: panic on last</a></li><li><a href="https://github.com/rust-lang/rust/pull/146841">stabilise <code>rotate_left</code> and <code>rotate_right</code> in <code>[_]</code> as <code>const fn</code> items</a></li><li><a href="https://github.com/rust-lang/rust/pull/143191">stabilize <code>rwlock_downgrade</code> library feature</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6><ul><li><a href="https://github.com/rust-lang/cargo/pull/16127"><code>check</code>: Fix suggested command for bin package</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16120"><code>script</code>: Remove name sanitiztion outside what is strictly required</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16086"><code>script</code>: Tweak cargo script build-dir / target-dir</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rustdoc">Rustdoc</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/147660">search: stringdex 0.0.2</a></li><li><a href="https://github.com/rust-lang/rust/pull/147809">fix passes order so intra-doc links are collected after stripping passes</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6><ul><li><a href="https://github.com/rust-lang/rust-clippy/pull/15911"><code>empty_enum</code>: don't lint if all variants happen to be <code>cfg</code>-d out</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15870"><code>option_option</code>: split part of diagnostic message into help message</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15678"><code>unnecessary_safety_comment</code> Some fixes regarding comments above attributes</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15862">allow <code>explicit_write</code> in tests</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15706">dereference argument of <code>manual_div_ceil()</code> if needed</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15402"><code>manual_rotate</code>: also recognize non-consts</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15632">overhaul <code>mutex_{atomic,integer}</code></a></li></ul><h6><a class="toclink" href="http://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/20854">parser: Don't error on frontmatter</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20855">improve fixture support</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20880">fix invalid RestPat for <code>convert_tuple_struct_to_named_struct</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20872">fix missing RestPat for <code>convert_named_struct_to_tuple_struct</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20838">don't make <code>convert_to_guarded_return</code> applicable on <code>let-else</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20876">fix <code>signature_help</code> to proto conversion creating invalid utf16 offsets</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20673">support <code>break</code> with value in completions</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20758">support <code>else</code> blocks with <code>!</code> return type in <code>convert_to_guarded_return</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20772">support <code>match</code> inside <code>if</code> in <code>pull_assignment_up</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20841">migrate more stuff to the next solver</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20867">migrate variance to the next solver and remove lint allows from its stuff</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20873">rip Chalk out of the codebase 🎉</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20858">support underscore suffix parameter hide inlayHints</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20757">use <code>FileId::MAX</code> for id assertion in <code>PathInterner::intern</code></a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5><p>Fairly busy week, with lots of mixed results. However, overall we ended with aslight improvement on average.</p><p>Triage done by <strong>@simulacrum</strong>.Revision range: <a href="https://perf.rust-lang.org/?start=956f47c32f1bd97b22cd702d7ccf78f0f0d42c34&amp;end=4068bafedd8ba724e332a5221c06a6fa531a30d2&amp;absolute=false&amp;stat=instructions%3Au">956f47c3..4068bafe</a></p><p>2 Regressions, 5 Improvements, 10 Mixed; 5 of them in rollups</p><p>39 artifact comparisons made in total</p><p><a href="https://github.com/rust-lang/rustc-perf/blob/master/triage/2025/2025-10-20.md">Full report here</a></p><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#approved-rfcs"></a><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>. Theseare 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="http://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 PRswhich are reaching a decision. Express your opinions now.</p><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust_1"></a><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Rust</a><ul><li><a href="https://github.com/rust-lang/rust/issues/136306">Tracking Issue for NEON fp16 intrinsics</a></li><li><a href="https://github.com/rust-lang/rust/pull/146561">Change <code>Location&lt;'_&gt;</code> lifetime to <code>'static</code> in <code>Panic[Hook]Info</code></a></li><li><a href="https://github.com/rust-lang/rust/issues/126769">Tracking Issue for <code>substr_range</code> and related methods</a></li><li><a href="https://github.com/rust-lang/rust/pull/147185">repr(transparent): do not consider repr(C) types to be 1-ZST</a></li><li><a href="https://github.com/rust-lang/rust/pull/145665">Don't require <code>T: RefUnwindSafe</code> for <code>vec::IntoIter&lt;T&gt;: UnwindSafe</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/145974">Stabilize -Zno-jump-tables into -Cjump-tables=bool</a></li><li><a href="https://github.com/rust-lang/rust/issues/55724">Tracking issue for alloc_layout_extra</a></li><li><a href="https://github.com/rust-lang/rust/pull/147136">Add warn-by-default lint for visibility on <code>const _</code> declarations</a></li><li><a href="https://github.com/rust-lang/rust/issues/117729">Tracking Issue for <code>debug_closure_helpers</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/146882">fully deprecate the legacy integral modules</a></li><li><a href="https://github.com/rust-lang/rust/issues/146705">Tracking Issue for <code>fmt_from_fn</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/144090">Make <code>IoSlice</code> and <code>IoSliceMut</code> methods unstably const</a></li><li><a href="https://github.com/rust-lang/rust/issues/135889">Tracking Issue for <code>VecDeque::pop_front_if</code> &amp; <code>VecDeque::pop_back_if</code></a></li><li>[disposition: unspecified] <a href="https://github.com/rust-lang/rust/pull/145628">[std][BTree] Fix behavior of <code>::append</code> to match documentation, <code>::insert</code>, and <code>::extend</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/144113">Impls and impl items inherit <code>dead_code</code> lint level of the corresponding traits and trait items</a></li><li><a href="https://github.com/rust-lang/rust/pull/140463">Document MaybeUninit bit validity</a></li></ul><a class="toclink" href="http://this-week-in-rust.org/atom.xml#compiler-team-mcps-only"></a><a href="https://github.com/rust-lang/compiler-team/issues?q=label%3Amajor-change%20%20label%3Afinal-comment-period">Compiler Team</a> <a href="https://forge.rust-lang.org/compiler/mcp.html">(MCPs only)</a><ul><li><a href="https://github.com/rust-lang/compiler-team/issues/931">Move unreachable code lint from HIR type check to a proper lint</a></li><li><a href="https://github.com/rust-lang/compiler-team/issues/930">Rename <code>//@ add-core-stubs</code> to <code>//@ add-minicore</code></a></li><li><a href="https://github.com/rust-lang/compiler-team/issues/928">Move annotation for profiling compiler-generated moves and copies.</a></li><li><a href="https://github.com/rust-lang/compiler-team/issues/927">Use <code>llvm-bitcode-linker</code> as the default linker for nvptx64-nvidia-cuda</a></li></ul><a class="toclink" href="http://this-week-in-rust.org/atom.xml#leadership-council"></a><a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period">Leadership Council</a><ul><li><a href="https://github.com/rust-lang/leadership-council/issues/232">Delegate GSoC money spending to the t-mentorship team</a></li></ul><p><em>No Items entered Final Comment Period this week for<a href="https://github.com/rust-lang/rfcs/labels/final-comment-period">Rust RFCs</a>,<a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Cargo</a>,<a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc+">Language Team</a>,<a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Language Reference</a> or<a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">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><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"></a><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h6><ul><li><em>No New or Updated RFCs were created this week.</em></li></ul><h4><a class="toclink" href="http://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4><p>Rusty Events between 2025-10-22 - 2025-11-19 🦀</p><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5><ul><li>2025-10-22 | Virtual (Boulder, CO, US) | <a href="https://www.meetup.com/boulder-elixir/events/">Boulder Elixir</a><ul><li><a href="https://www.meetup.com/boulder-elixir/events/310996627/"><strong>Integrating Elixir and Apache DataFusion with Rustler</strong></a></li></ul></li><li>2025-10-22 | Virtual (Buenos Aires, AR) | <a href="https://www.meetup.com/es-ES/net-baires/">[Net-Baires] Comunidad de .NET en Buenos Aires</a><ul><li><a href="https://www.meetup.com/es-ES/net-baires/events/311365783/"><strong>Rust para devs .NET | Community Standup #10</strong></a></li></ul></li><li>2025-10-23 | Hybrid (Seattle/Bellevue, 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/311351020/"><strong>October, 2025 SRUG (Seattle Rust User Group) Meetup</strong></a></li></ul></li><li>2025-10-23 | 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/306046641/"><strong>Rust Hack and Learn</strong></a></li></ul></li><li>2025-10-23 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/zyc3touy"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-10-26 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul><li><a href="https://www.meetup.com/dallasrust/events/311109171/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-10-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/305361444/"><strong>Fourth Tuesday</strong></a></li></ul></li><li>2025-10-30 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/t8yovmmm"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-11-01 | Virtual (Kampala, UG) | <a href="https://www.eventbrite.com/o/rust-circle-kampala-65249289033">Rust Circle Meetup</a><ul><li><a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763868657"><strong>Rust Circle Meetup</strong></a></li></ul></li><li>2025-11-02 | 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/311109173/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-11-05 | Virtual (Buffalo, NY, US) | <a href="https://www.meetup.com/buffalo-rust-meetup">Buffalo Rust Meetup</a><ul><li><a href="https://www.meetup.com/buffalo-rust-meetup/events/305304242/"><strong>Buffalo Rust User Group</strong></a></li></ul></li><li>2025-11-05 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul><li><a href="https://www.meetup.com/indyrs/events/311574520/"><strong>Indy.rs - with Social Distancing</strong></a></li></ul></li><li>2025-11-05 | Virtual | <a href="https://www.eventbrite.com/o/ardan-labs-7092394651">Ardan Labs</a><ul><li><a href="https://www.eventbrite.com/e/mastering-error-handling-in-rust-from-panics-to-thiserror-anyhow-tickets-1849030121869"><strong>Mastering Error Handling in Rust: From Panics to thiserror &amp; anyhow</strong></a></li></ul></li><li>2025-11-06 | 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/305646021/"><strong>Rust Hack and Learn</strong></a></li></ul></li><li>2025-11-06 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/xkd84gfz"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-11-09 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust/events/">Dallas Rust User Meetup</a><ul><li><a href="https://www.meetup.com/dallasrust/events/311109175/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-11-10 || <a href="https://www.bettercode.eu/">BetterCode</a><ul><li>$<a href="https://dev.events/conferences/better-code-rust-i6inve6t"><strong>betterCode() Industrielle Anwendungen mit Rust</strong></a></li></ul></li><li>2025-11-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/305361536/"><strong>Second Tuesday</strong></a></li></ul></li><li>2025-11-11 | 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/311068632/"><strong>👋 Community Catch Up</strong></a></li></ul></li><li>2025-11-13 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/yhe1xrhe"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-11-13 | 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/310849154/"><strong>Rust Nürnberg online</strong></a></li></ul></li><li>2025-11-16 | 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/311109181/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-11-18 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc/events/">Rust DC</a><ul><li><a href="https://www.meetup.com/rustdc/events/310002262/"><strong>Mid-month Rustful</strong></a></li></ul></li><li>2025-11-19 | 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/309926564/"><strong>Rust Study/Hack/Hang-out</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#asia">Asia</a></h5><ul><li>2025-11-15 | Bangalore, IN | <a href="https://hasgeek.com/rustbangalore">Rust Bangalore</a><ul><li><a href="https://hasgeek.com/rustbangalore/november-2025-rustacean-meetup//"><strong>November 2025 Rustacean meetup</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#europe">Europe</a></h5><ul><li>2025-10-23 | Edinburgh, UK | <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/311501254/"><strong>Rust and Friends (evening pub)</strong></a></li></ul></li><li>2025-10-24 | Edinburgh, UK | <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/311501249/"><strong>Rust and Friends (daytime coffee)</strong></a></li></ul></li><li>2025-10-28 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul><li><a href="https://www.meetup.com/rust-manchester/events/307919171/"><strong>Rust Manchester October Code Night</strong></a></li></ul></li><li>2025-10-29 | 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/311251545/"><strong>Rust Dortmund Meetup October 2025</strong></a></li></ul></li><li>2025-10-30 | 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/311405044/"><strong>Rust meetup #62 sponsored by Google!</strong></a></li></ul></li><li>2025-10-30 | Prague, CZ | <a href="https://www.meetup.com/rust-prague">Rust Prague</a><ul><li><a href="https://www.meetup.com/rust-prague/events/310967094/"><strong>Rust Meetup Prague (October 2025)</strong></a></li></ul></li><li>2025-11-01 | Stockholm, SE | <a href="https://www.meetup.com/stockholm-rust/events/">Stockholm Rust</a><ul><li><a href="https://www.meetup.com/stockholm-rust/events/311582259/"><strong>Ferris' Fika Forum #19</strong></a></li></ul></li><li>2025-11-02 - 2025-11-04 | Florence, IT | <a href="https://rustlab.it/">Rustlab 2025</a><ul><li>$<a href="https://rustlab.it/"><strong>Rustlab 2025</strong></a></li></ul></li><li>2025-11-03 | Bern, CH | <a href="https://www.meetup.com/it-IT/guild42ch/">Guild42</a><ul><li><a href="https://www.meetup.com/it-IT/guild42ch/events/307260207/"><strong>Moving out of systems programming into Kubernetes: is it time to adopt Rust ?</strong></a></li></ul></li><li>2025-11-04 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul><li><a href="https://www.meetup.com/rust-manchester/events/310921632/"><strong>Rust Manchester November Talk</strong></a></li></ul></li><li>2025-11-04 | Trondheim, NO | <a href="https://www.meetup.com/rust-trondheim/events/">Rust Trondheim</a><ul><li><a href="https://www.meetup.com/rust-trondheim/events/311595023/"><strong>Optimizing matrix multiplication and building Python packages with Rust</strong></a></li></ul></li><li>2025-11-05 | Girona, ES | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/xl8ob0tn"><strong>Rust Girona Hack &amp; Learn 11 2025</strong></a></li></ul></li><li>2025-11-05 | Oslo, NO | <a href="https://www.meetup.com/rust-oslo">Rust Oslo</a><ul><li><a href="https://www.meetup.com/rust-oslo/events/310601872/"><strong>Rust Hack'n'Learn at Kampen Bistro</strong></a></li></ul></li><li>2025-11-05 | 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/nnrkttyhcpbhb/"><strong>Rust/ACCU meetup.</strong></a></li></ul></li><li>2025-11-06 | Gdansk, PL | <a href="https://www.meetup.com/rust-gdansk/events/">Rust Gdansk</a><ul><li><a href="https://www.meetup.com/rust-gdansk/events/310924266/"><strong>Rust Gdansk Meetup #11</strong></a></li></ul></li><li>2025-11-12 | Reading, UK | <a href="https://www.meetup.com/reading-rust-workshop/events/">Reading Rust Workshop</a><ul><li><a href="https://www.meetup.com/reading-rust-workshop/events/308944050/"><strong>Reading Rust Meetup</strong></a></li></ul></li><li>2025-11-13 | Geneva, CH | <a href="https://www.posttenebraslab.ch/wiki/events/monthly_meeting/rust_meetup">Rust Geneva</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>2025-11-13 | Paris, FR | <a href="https://www.meetup.com/rust-paris/events/">Rust Paris</a><ul><li><a href="https://www.meetup.com/rust-paris/events/311461594/"><strong>Rust meetup #80</strong></a></li></ul></li><li>2025-11-18 | Leipzig, SN, DE | <a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/events/">Rust - Modern Systems Programming in Leipzig</a><ul><li><a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/events/308592257/"><strong>Topic TBD</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#north-america">North America</a></h5><ul><li>2025-10-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/310457307/"><strong>Rust Lunch - Fareground</strong></a></li></ul></li><li>2025-10-23 | Nashville, TN, US | <a href="https://www.meetup.com/music-city-rust-developers">Music City Rust Developers</a><ul><li><a href="https://www.meetup.com/music-city-rust-developers/events/304333267/"><strong>Year In Review</strong></a></li></ul></li><li>2025-10-23 | Hybrid (Seattle/Bellevue, 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/311351020/"><strong>October, 2025 SRUG (Seattle Rust User Group) Meetup</strong></a></li></ul></li><li>2025-10-23 | Spokane, WA, US | <a href="https://www.meetup.com/spokane-rust">Spokane Rust</a><ul><li><a href="https://www.meetup.com/spokane-rust/events/311346444/"><strong>October Rust Meetup: A Special Presentation and Monthly Meetups are Back!</strong></a></li></ul></li><li>2025-10-25 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul><li><a href="https://www.meetup.com/bostonrust/events/310983712/"><strong>Porter Square Rust Lunch, Oct 25</strong></a></li></ul></li><li>2025-10-25 | 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/311562607/"><strong>In-person Meetup with Collin College Software Engineering Club!</strong></a></li></ul></li><li>2025-10-28 | Chicago, IL, US | <a href="https://www.meetup.com/chicago-rust-meetup/events/">Chicago Rust Meetup</a><ul><li><a href="https://www.meetup.com/chicago-rust-meetup/events/311603282/"><strong>Rust Happy Hour</strong></a></li></ul></li><li>2025-10-29 | 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/311541108/"><strong>Rust NYC: Scalable static analysis: confronting the halting problem</strong></a></li></ul></li><li>2025-10-30 | 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/308675988/"><strong>Rust-Atl</strong></a></li></ul></li><li>2025-10-30 | 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/311273832/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li></ul></li><li>2025-11-01 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul><li><a href="https://www.meetup.com/bostonrust/events/311039492/"><strong>Chinatown Rust Lunch, Nov 1</strong></a></li></ul></li><li>2025-11-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/307251982/"><strong>SIUE students on wasm 3D animations</strong></a></li></ul></li><li>2025-11-08 | 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/311039501/"><strong>Winter Hill Rust Lunch, Nov 8</strong></a></li></ul></li><li>2025-11-13 | 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/311613658/"><strong>Ipmap: Building Desktop Apps with Tauri</strong></a></li></ul></li><li>2025-11-18 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group/events/">San Francisco Rust Study Group</a><ul><li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/308865806/"><strong>Rust Hacking in Person</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5><ul><li>2025-10-22 | 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/310847099/"><strong>October Meetup</strong></a></li></ul></li><li>2025-10-28 | 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/311234237/"><strong>October Meetup</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#south-america">South America</a></h5><ul><li>2025-10-22 | Montevideo, UY | <a href="https://www.meetup.com/rust-uruguay/events/">Rust Meetup Uruguay</a><ul><li><a href="https://www.meetup.com/rust-uruguay/events/311475675/"><strong>Rust Uruguay meetup de Octubre</strong></a></li></ul></li><li>2025-10-25 | São Paulo, BR | <a href="https://www.meetup.com/rust-sao-paulo-meetup">Rust São Paulo Meetup</a><ul><li><a href="https://www.meetup.com/rust-sao-paulo-meetup/events/311084440/"><strong>Encontro do Rust-SP na Amazon Web Services</strong></a></li></ul></li><li>2025-10-30 | Florianopolis, BR | <a href="https://luma.com/calendar/cal-iOloL5ZqswCO5Mm">Rust Brasil</a><ul><li><a href="https://luma.com/lky7an18"><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 getit 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="http://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/1nknaii/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p><h3><a class="toclink" href="http://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3><blockquote><p>There used to be recurring questions about mod vs use in the user forum, until I've added a note to the error message [...] and I think it largely solved the problem</p></blockquote><p>– <a href="https://internals.rust-lang.org/t/curly-brace-support-for-mod/23437/51">Kornel on rust-internals</a></p><p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1722">Noratrieb</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><em>This Week in Rust is edited by: <a href="https://github.com/nellshamrell">nellshamrell</a>, <a href="https://github.com/llogiq">llogiq</a>, <a href="https://github.com/cdmistman">cdmistman</a>, <a href="https://github.com/ericseppanen">ericseppanen</a>, <a href="https://github.com/extrawurst">extrawurst</a>, <a href="https://github.com/U007D">U007D</a>, <a href="https://github.com/joelmarcey">joelmarcey</a>, <a href="https://github.com/mariannegoldin">mariannegoldin</a>, <a href="https://github.com/bennyvasquez">bennyvasquez</a>, <a href="https://github.com/bdillo">bdillo</a></em></p><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/1odqrri/this_week_in_rust_622/">Discuss on r/rust</a></small></p></description> <pubDate>Wed, 22 Oct 2025 04:00:00 +0000</pubDate> <dc:creator>TWiR Contributors</dc:creator></item><item> <title>Niko Matsakis: Move, Destruct, Forget, and Rust</title> <guid isPermaLink="false">https://smallcultfollowing.com/babysteps/blog/2025/10/21/move-destruct-leak/</guid> <link>https://smallcultfollowing.com/babysteps/blog/2025/10/21/move-destruct-leak/?utm_source=atom_feed</link> <description><p>This post presents a proposal to extend Rust to support a number of different kinds of destructors. This means we could async drop, but also prevent “forgetting” (leaking) values, enabling async scoped tasks that run in parallel à la rayon/libstd. We’d also be able to have types whose “destructors” require arguments. This proposal – an evolution of <a href="https://smallcultfollowing.com/babysteps/ /blog/2023/03/16/must-move-types.html">“must move”</a> that I’ll call “controlled destruction” – is, I think, needed for Rust to live up to its goal of giving safe versions of critical patterns in systems programming. As such, it is needed to complete the “async dream”, in which async Rust and sync Rust work roughly the same.</p><p>Nothing this good comes for free. The big catch of the proposal is that it introduces more “core splits” into Rust’s types. I believe these splits are well motivated and reasonable – they reflect <em>inherent complexity</em>, in other words, but they are something we’ll want to think carefully about nonetheless.</p><h3>Summary</h3><p>The TL;DR of the proposal is that we should:</p><ul><li>Introduce a new “default trait bound” <code>Forget</code> and an associated trait hierarchy:<ul><li><code>trait Forget: Drop</code>, representing values that can be forgotten</li><li><code>trait Destruct: Move</code>, representing values with a destructor</li><li><code>trait Move: Pointee</code>, representing values that can be moved</li><li><code>trait Pointee</code>, the base trait that represents <em>any value</em></li></ul></li><li>Use the “opt-in to weaker defaults” scheme proposed for sizedness by <a href="https://github.com/rust-lang/rfcs/pull/3729">RFC #3729 (Hierarchy of Sized Traits)</a><ul><li>So <code>fn foo&lt;T&gt;(t: T)</code> defaults to “a <code>T</code> that can be forgotten/destructed/moved”</li><li>And <code>fn foo&lt;T: Destruct&gt;(t: T)</code> means “a <code>T</code> that can be destructed, but not necessarily forgotten”</li><li>And <code>fn foo&lt;T: Move&gt;(t: T)</code> means “a <code>T</code> that can be moved, but not necessarily forgotten”</li><li>…and so forth.</li></ul></li><li>Integrate and enforce the new traits:<ul><li>The bound on <code>std::mem::forget</code> will already require <code>Forget</code>, so that’s good.</li><li>Borrow check can enforce that any dropped value must implement <code>Destruct</code>; in fact, we already do this to enforce <code>const Destruct</code> bounds in <code>const fn</code>.</li><li>Borrow check can be extended to require a <code>Move</code> bound on any moved value.</li></ul></li><li>Adjust the trait bound on closures (luckily this works out fairly nicely)</li></ul><h3>Motivation</h3><p>In a <a href="https://nikomatsakis.github.io/rust-latam-2019/#1">talk I gave some years back at Rust LATAM in Uruguay</a><sup id="fnref:1"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:1">1</a></sup>, I <a href="https://nikomatsakis.github.io/rust-latam-2019/#81">said this</a>:</p><ul><li>It’s easy to <strong>expose</strong> a high-performance API.</li><li>But it’s hard to <strong>help users control it</strong> – and this is what Rust’s type system does.</li></ul><img alt="Person casting a firespell and burning themselves" src="https://smallcultfollowing.com/babysteps/ /assets/2025-movedestructleak/firespell.gif" /><p>Rust currently does a pretty good job with preventing parts of your program from interfering with one another, but we don’t do as good a job when it comes to guaranteeing that cleaup happens<sup id="fnref:2"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:2">2</a></sup>. We have destructors, of course, but they have two critical limitations:</p><ul><li>All destructors must meet the same signature, <code>fn drop(&amp;mut self)</code>, which isn’t always adequate.</li><li>There is no way to guarantee a destructor once you give up ownership of a value.</li></ul><h4>Making it concrete.</h4><p>That motivation was fairly abstract, so let me give some concrete examples of things that tie back to this limitation:</p><ul><li>The ability to have <code>async</code> or <code>const</code> drop, both of which require a distinct drop signature.</li><li>The ability to have a “drop” operation that takes arguments, such as e.g. a message that must be sent, or a result code that must be provided before the program terminates.</li><li>The ability to have async scopes that can access the stack, which requires a way to guarantee that a parallel thread will be joined even in an async context.</li><li>The ability to integrate at maximum efficiency with WebAssembly async tasks, which require guaranteed cleanup.<sup id="fnref:3"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:3">3</a></sup></li></ul><p>The goal of this post is to outline an approach that could solve all of the above problems and which is backwards compatible with Rust today.</p><h4>The “capabilities” of value disposal</h4><p>The core problem is that Rust today assumes that every <code>Sized</code> value can be moved, dropped, and forgotten:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="c1">// Without knowing anything about `T` apart</span></span></span><span class="line"><span class="cl"><span class="c1">// from the fact that it's `Sized`, we can...</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">fn</span> <span class="nf">demonstration</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span>: <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="n">b</span>: <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="n">c</span>: <span class="nc">T</span><span class="p">)</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="c1">// ...drop `a`, running its destructor immediately.</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">std</span>::<span class="n">mem</span>::<span class="nb">drop</span><span class="p">(</span><span class="n">a</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="w"> </span><span class="c1">// ...forget `b`, skipping its destructor</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">std</span>::<span class="n">mem</span>::<span class="n">forget</span><span class="p">(</span><span class="n">b</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="w"> </span><span class="c1">// ...move `c` into `x`</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">c</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 class="c1">// ...and then have `x` get dropped automatically,</span></span></span><span class="line"><span class="cl"><span class="c1">// as exit the block.</span></span></span></code></pre></div><h4>Destructors are like “opt-out methods”</h4><p>The way I see, most methods are “opt-in” – they don’t execute unless you call them. But destructors are different. They are effectively a method that runs by default – unless you opt-out, e.g., by calling <code>forget</code>. But the ability to opt-out means that they don’t fundamentally add any power over regular methods, they just make for a more ergonomic API.</p><p>The implication is that the only way in Rust today to <em>guarantee</em> that a destructor will run is to retain ownership of the value. This can be important to unsafe code – APIs that permit scoped threads, for example, need to <em>guarantee</em> that those parallel threads will be joined before the function returns. The only way they have to do that is to use a closure which gives <code>&amp;</code>-borrowed access to a <code>scope</code>:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="n">scope</span><span class="p">(</span><span class="o">|</span><span class="n">s</span><span class="o">|</span><span class="w"> </span><span class="o">..</span><span class="p">.)</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// - --- ...which ensures that this</span></span></span><span class="line"><span class="cl"><span class="c1">// | fn body cannot "forget" it.</span></span></span><span class="line"><span class="cl"><span class="c1">// | </span></span></span><span class="line"><span class="cl"><span class="c1">// This value has type `&amp;Scope`... </span></span></span></code></pre></div><p>Because the API nevers gives up ownership of the scope, it can ensure that it is never “forgotten” and thus that its destructor runs.</p><p>The scoped thread approach works for sync code, but it doesn’t work for async code. The problem is that async functions return a future, which is a value. Users can therefore decide to “forget” this value, just like any other value, and thus the destructor may never run.</p><h4>Guaranteed cleanup is common in systems programming</h4><p>When you start poking around, you find that <em>guaranteed</em> destructors turn up quite a bit in systems programming. Scoped APIs in futures are one example, but DMA (direct memory access) is another. Many embedded devices have a mode where you begin a DMA transfer that causes memory to be written into memory asynchronously. But you need to ensure that this DMA is terminated <em>before</em> that memory is freed. If that memory is on your stack, that means you need a destructor that will either cancel or block until the DMA finishes.<sup id="fnref:4"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:4">4</a></sup></p><h3>So what can we do about it?</h3><p>This situation is very analogous to the challenge of revisiting the default <code>Sized</code> bound, and I think the same basic approach that I outlined in [this blog post][sized] will work.</p><p>The core of the idea is simple: have a “special” set of traits arranged in a hierarchy:</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">Forget</span>: <span class="nc">Destruct</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// Can be "forgotten"</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">trait</span><span class="w"> </span><span class="n">Destruct</span>: <span class="nc">Move</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// Can be "destructed" (dropped)</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">trait</span><span class="w"> </span><span class="n">Move</span>: <span class="nc">Pointee</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// Can be "moved"</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">trait</span><span class="w"> </span><span class="n">Pointee</span><span class="w"> </span><span class="p">{}</span><span class="w"> </span><span class="c1">// Can be referenced by pointer</span></span></span></code></pre></div><p>By default, generic parameters get a <code>Forget</code> bound, so <code>fn foo&lt;T&gt;()</code> is equivalent to <code>fn foo&lt;T: Forget&gt;()</code>. But if the parameter <em>opts in</em> to a weaker bound, then the default is suppressed, so <code>fn bar&lt;T: Destruct&gt;()</code> means that <code>T</code> is assumed by “destructible” but <em>not</em> forgettable. And <code>fn baz&lt;T: Move&gt;()</code> indicates that <code>T</code> can <em>only</em> be moved.</p><h3>Impact of these bounds</h3><p>Let me explain briefly how these bounds would work.</p><h4>The default can forget, drop, move etc</h4><p>Given a default type <code>T</code>, or one that writes <code>Forget</code> explicitly, the function can do anything that is possible today:</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">just_forget</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">Forget</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span>: <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="n">b</span>: <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="n">c</span>: <span class="nc">T</span><span class="p">)</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="c1">// --------- this bound is the default</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">std</span>::<span class="n">mem</span>::<span class="nb">drop</span><span class="p">(</span><span class="n">a</span><span class="p">);</span><span class="w"> </span><span class="c1">// OK</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">std</span>::<span class="n">mem</span>::<span class="n">forget</span><span class="p">(</span><span class="n">b</span><span class="p">);</span><span class="w"> </span><span class="c1">// OK</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">c</span><span class="p">;</span><span class="w"> </span><span class="c1">// OK</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span><span class="w"></span></span></span></code></pre></div><h4>The forget function requires <code>T: Forget</code></h4><p>The <code>std::mem::forget</code> function would require <code>T: Forget</code> as well:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">forget</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">Forget</span><span class="o">&gt;</span><span class="p">(</span><span class="n">value</span>: <span class="nc">T</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* magic intrinsic */</span><span class="w"> </span><span class="p">}</span><span class="w"></span></span></span></code></pre></div><p>This means that if you have only <code>Destruct</code>, the function can only drop or move, it can’t “forget”:</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">just_destruct</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">Destruct</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span>: <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="n">b</span>: <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="n">c</span>: <span class="nc">T</span><span class="p">)</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="c1">// -----------</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// This function only requests "Destruct" capability.</span></span></span><span class="line"><span class="cl"><span class="c1"></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="nb">drop</span><span class="p">(</span><span class="n">a</span><span class="p">);</span><span class="w"> </span><span class="c1">// OK</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">std</span>::<span class="n">mem</span>::<span class="n">forget</span><span class="p">(</span><span class="n">b</span><span class="p">);</span><span class="w"> </span><span class="c1">// ERROR: `T: Forget` required</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">c</span><span class="p">;</span><span class="w"> </span><span class="c1">// OK</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span><span class="w"></span></span></span></code></pre></div><h4>The borrow checker would require “dropped” values implement <code>Destruct</code></h4><p>We would modify the <code>drop</code> function to require only <code>T: Destruct</code>:</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">drop</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">Destruct</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><span class="p">{}</span><span class="w"></span></span></span></code></pre></div><p>We would also extend the borrow checker so that when it sees a value being dropped (i.e., because it went out of scope), it would require the <code>Destruct</code> bound.</p><p>That means that if you have a value whose type is only <code>Move</code>, you cannot “drop” it:</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">just_move</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">Move</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span>: <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="n">b</span>: <span class="nc">T</span><span class="p">,</span><span class="w"> </span><span class="n">c</span>: <span class="nc">T</span><span class="p">)</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="c1">// -----------</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// This function only requests "Move" capability.</span></span></span><span class="line"><span class="cl"><span class="c1"></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="nb">drop</span><span class="p">(</span><span class="n">a</span><span class="p">);</span><span class="w"> </span><span class="c1">// ERROR: `T: Destruct` required</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">std</span>::<span class="n">mem</span>::<span class="n">forget</span><span class="p">(</span><span class="n">b</span><span class="p">);</span><span class="w"> </span><span class="c1">// ERROR: `T: Forget` required</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">c</span><span class="p">;</span><span class="w"> </span><span class="c1">// OK</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span><span class="w"> </span><span class="c1">// ERROR: `x` is being dropped, but `T: Destruct`</span></span></span></code></pre></div><p>This means that if you have only a <code>Move</code> bound, you <em>must</em> move anything you own if you want to return from the function. For example:</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">return_ok</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">Move</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</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">a</span><span class="w"> </span><span class="c1">// OK</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span><span class="w"></span></span></span></code></pre></div><p>If you have a function that does not move, you’ll get an error:</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">return_err</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">Move</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</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="p">}</span><span class="w"> </span><span class="c1">// ERROR: `a` does not implement `Destruct`</span></span></span></code></pre></div><p>It’s worth pointing out that this will be annoying as all get out in the face of panics:</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">return_err</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">Move</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</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="c1">// ERROR: If a panic occurs, `a` would be dropped, but `T` not implement `Destruct`</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="n">forbid_env_var</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="w"> </span><span class="n">a</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></span><span class="line"><span class="cl"><span class="w"></span><span class="k">fn</span> <span class="nf">forbid_env_var</span><span class="p">()</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">if</span><span class="w"> </span><span class="n">std</span>::<span class="n">env</span>::<span class="n">var</span><span class="p">(</span><span class="s">"BAD"</span><span class="p">).</span><span class="n">is_ok</span><span class="p">()</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="fm">panic!</span><span class="p">(</span><span class="s">"Uh oh: BAD cannot be set"</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></code></pre></div><p>I’m ok with this, but it is going to put pressure on better ways to rule out panics statically.</p><h4>Const (and later async) variants of <code>Destruct</code></h4><p>In fact, we are already doing something much like this destruct check for const functions. Right now if you have a const fn and you try to drop a value, you get an error:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="k">const</span><span class="w"> </span><span class="k">fn</span> <span class="nf">test</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><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 class="c1">// ERROR!</span></span></span></code></pre></div><p>Compiling that gives you the error:</p><pre tabindex="0"><code>error[E0493]: destructor of `T` cannot be evaluated at compile-time --&gt; src/lib.rs:1:18 |1 | const fn test&lt;T&gt;(t: T) { } | ^ - value is dropped here | | | the destructor for this type cannot be evaluated in constant functions</code></pre><p>This check is not presently taking place in borrow check but it could be.</p><h4>The borrow checker would require “moved” values implement <code>Move</code></h4><p>The final part of the check would be requiring that “moved” values implement <code>Move</code>:</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">return_err</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nc">Pointee</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</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">a</span><span class="w"> </span><span class="c1">// ERROR: `a` does not implement `Move`</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span><span class="w"></span></span></span></code></pre></div><p>You might think that having types that are <code>!Move</code> would replace the need for pin, but this is not the case. A <em>pinned</em> value is one that can <em>never move again</em>, whereas a value that is not <code>Move</code> can never be moved in the first place – at least once it is stored into a place.</p><p>I’m not sure if this part of the proposal makes sense, we could start by just having all types be <code>Move</code>, <code>Destruct</code>, or (the default) <code>Forget</code>.</p><h4>Opting out from forget etc</h4><p>The other part of the proposal is that you should be able to explicit “opt out” from being forgettable, e.g. by doing</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">MyType</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">impl</span><span class="w"> </span><span class="n">Destruct</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">MyType</span><span class="w"> </span><span class="p">{}</span><span class="w"></span></span></span></code></pre></div><p>Doing this will limit the generics that can accept your type, of course.</p><h4>Associated type bounds</h4><p>The tough part with these “default bound” proposals is always associated type bounds. For backwards compatibility, we’d have to default to <code>Forget</code> but a lot of associated types that exist in the wild today shouldn’t really <em>require</em> <code>Forget</code>. For example a trait like <code>Add</code> should <em>really</em> just require <code>Move</code> for its return type:</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">Add</span><span class="o">&lt;</span><span class="n">Rhs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">Self</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">type</span> <span class="nc">Output</span><span class="w"> </span><span class="cm">/* : Move */</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></code></pre></div><p>I am basically not too worried about this. It’s possible that we can weaken these bounds over time or through editions. Or, perhaps, add in some kind of edition-specific “alias” like</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">Add2025</span><span class="o">&lt;</span><span class="n">Rhs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">Self</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">type</span> <span class="nc">Output</span>: <span class="nc">Move</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></code></pre></div><p>where <code>Add2025</code> is implemented for everything that implements <code>Add</code>.</p><p>I am not sure exactly how to manage it, but we’ll figure it out – and in the meantime, most of the types that should not be forgettable are really just “guard” types that don’t have to flow through quite so many places.</p><h5>Associated type bounds in closures</h5><p>The one place that I think it is <em>really imporatnt</em> that we weaken the associated type bounds is with closures– and, fortunately, that’s a place we can get away with due to the way our “closure trait bound” syntax works. I feel like I wrote a post on this before, but I can’t find it now, but the short version is that, today, when you write <code>F: Fn()</code>, that means that the closure must return <code>()</code>. If you write <code>F: Fn() -&gt; T</code>, then this type <code>T</code> must have been declared somewhere else, and so <code>T</code> will (independently from the associated type of the <code>Fn</code> trait) get a default <code>Forget</code> bound. So since the <code>Fn</code> associated type is not independently nameable in stable Rust, we can change its bounds, and code like this would continue to work unchanged:</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="p">,</span><span class="w"> </span><span class="n">F</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="k">where</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">F</span>: <span class="nb">Fn</span><span class="p">()</span><span class="w"> </span>-&gt; <span class="nc">T</span><span class="p">,</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// - `T: Forget` still holds by default</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">{}</span><span class="w"></span></span></span></code></pre></div><h3>Frequently asked questions</h3><h4>How does this relate to the recent thread on internals?</h4><p>Recently I was pointed at <a href="https://internals.rust-lang.org/t/pre-rfc-substructural-type-system/23614">this internals thread</a> for a “substructural type system” which likely has very similar capabilities. To be totally honest, though, I haven’t had time to read and digest it yet! I had this blog post like 95% done though so I figured I’d post it first and then go try and compare.</p><h4>What would it mean for a struct to opt out of <code>Move</code> (e.g., by being only <code>Pointee</code>)?</h4><p>So, the system as I described <em>would</em> allow for ‘unmoveable’ types (i.e., a struct that opts out from everything and only permits <code>Pointee</code>), but such a struct would only really be something you could store in a static memory location. You couldn’t put it on the stack because the stack must eventually get popped. And you couldn’t move it from place to place because, well, it’s immobile.</p><p>This seems like something that could be useful – e.g., to model “video RAM” or something that lives in a specific location in memory and cannot live anywhere else – but it’s not a widespread need.</p><h4>How would you handle destructors with arguments?</h4><p>I imagine something like this:</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">Transaction</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">data</span>: <span class="nb">Vec</span><span class="o">&lt;</span><span class="kt">u8</span><span class="o">&gt;</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></span><span class="line"><span class="cl"><span class="w"></span><span class="sd">/// Opt out from destruct</span></span></span><span class="line"><span class="cl"><span class="sd"></span><span class="k">impl</span><span class="w"> </span><span class="n">Move</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">Transaction</span><span class="w"> </span><span class="p">{</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></span><span class="line"><span class="cl"><span class="w"></span><span class="k">impl</span><span class="w"> </span><span class="n">Transaction</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="c1">// This is effectively a "destructor"</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">complete</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">connection</span>: <span class="nc">Connection</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 class="p">{</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">Transaction</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">data</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="o">=</span><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="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></code></pre></div><p>With this setup, any function that owns a <code>Transaction</code> must eventually invoke <code>transaction.complete()</code>. This is because no values of this type can be dropped, so they must be moved.</p><h4>How does this relate to async drop?</h4><p>This setup provides attacks a key problem that has blocked async drop in my mind, which is that types that are “async drop” do not have to implement “sync drop”. This gives the type system the ability to prevent them from being dropped in sync code, then, and it would mean that they can only be dropped in async drop. But there’s still lots of design work to be done there.</p><h4>Why is the trait <code>Destruct</code> and not <code>Drop</code>?</h4><p>This comes from the const generifs work. I don’t love it. But there is a logic to it. Right now, when you drop a struct or other value, that actually does a whole sequence of things, only one of which is running any <code>Drop</code> impl – it also (for example) drops all the fields in the struct recursively, etc. The idea is that “destruct” refers to this whole sequence.</p><h4>How hard would this to be to prototype?</h4><p>I…don’t actually think it would be very hard. I’ve thought somewhat about it and all of the changes seem pretty straightforward. I would be keen to support a <a href="https://lang-team.rust-lang.org/how_to/experiment.html">lang-team experiment</a> on this.</p><h4>Does this mean we should have had leak?</h4><p>The whole topic of destructors and leaks and so forth datesback to approximately Rust 1.0, when we discovered that, in fact, our abstraction for threads was unsound when combined with cyclic ref-counted boxes. Before that we hadn’t fully internalized that destructors are “opt-out methods”. You can read <a href="https://smallcultfollowing.com/babysteps/ /blog/2015/04/29/on-reference-counting-and-leaks/">this blog post I wrote at the time</a>. At the time, the primary idea was to have some kind of <code>?Leak</code> bounds and it was tied to the idea of references (so that all <code>'static</code> data was assumed to be “leakable”, and hence something you could put into an <code>Rc</code>). I… mostly think we made the right call at the time. I think it’s good that most of the ecosystem is interoperable and that <code>Rc</code> doesn’t require <code>static</code> bounds, and certainly I think it’s good that we moved to 1.0 with minimal disruption. In any case, though, I rather prefer this design to the ones that were under discussion at the time, in part because it also addresses the need for different kinds of destructors and for destructors with many arguments and so forth, which wasn’t something we thought about then.</p><h4>Isn’t it confusing to have these “magic” traits that “opt out” from default bounds?</h4><p>I think that specifying the <em>bounds you want</em> is inherently better than today’s <code>?</code> design, both because it’s easier to understand and because it allows us to backwards compatibly add traits in between in ways that are not possible with the <code>?</code> design.</p><p>However, I do see that having <code>T: Move</code> mean that <code>T: Destruct</code> does not hold is subtle. I wonder if we should adopt some kind of sigil or convention on these traits, like <code>T: @Move</code> or something. I don’t know! Something to consider.</p><div class="footnotes"><hr /><ol><li id="fn:1"><p>That was a great conference. Also, interestingly, this is one of my favorite of all my talks, but for some reason, I rarely reuse this material. I should change that. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:1">↩︎</a></p></li><li id="fn:2"><p>Academics distinguish “safety” from “liveness properties”, where safety means “bad things don’t happen” and “liveness” means “good things eventually happen”. Another way of saying this is that Rust’s type system helps with a lot of safety properties but struggles with liveness properties. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:2">↩︎</a></p></li><li id="fn:3"><p>Uh, citation needed. I know this is true but I can’t find the relevant WebAssembly issue where it is discussed. Help, internet! <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:3">↩︎</a></p></li><li id="fn:4"><p>Really the DMA problem is the same as scoped threads. If you think about it, the embedded device writing to memory is basically the same as a parallel thread writing to memory. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:4">↩︎</a></p></li></ol></div></description> <pubDate>Wed, 22 Oct 2025 01:45:02 +0000</pubDate></item><item> <title>Mozilla Addons Blog: Developer Spotlight: Fox Recap</title> <guid isPermaLink="false">https://blog.mozilla.org/addons/?p=9262</guid> <link>https://blog.mozilla.org/addons/2025/10/21/developer-spotlight-fox-recap/</link> <description><div class="wp-caption alignleft" id="attachment_9263" style="width: 590px;"><a href="https://addons.mozilla.org/en-US/firefox/addon/fox-recap/"><img alt="" class="size-medium wp-image-9263" height="435" src="https://blog.mozilla.org/addons/files/2025/10/blog_FoxRecap-580x435.png" width="580" /></a><p class="wp-caption-text" id="caption-attachment-9263">The Fox Recap team (pictured left to right): Taimur Hasan, Mozilla community manager Matt Cool, Kate Sawtell, Diego Valdez (not pictured: Peter Mitchell).</p></div><p>“What if we did a Spotify Wrapped for your browser?” wondered a group of Cal State Monterey Bay computer science students. That was the initial spark of an idea that became <a href="https://addons.mozilla.org/firefox/addon/fox-recap/" rel="noopener" target="_blank">Fox Recap</a> — a Firefox extension that leverages machine learning to give Firefox users fascinating insights into their browsing habits, like peak usage hours, types of websites commonly visited (news, entertainment, shopping, etc.), navigation patterns, and more.</p><p><a href="https://www.linkedin.com/in/taimurhasan1/" rel="noopener" target="_blank">Taimur Hasan</a> was one of four CSMB students who built Fox Recap as part of a Mozilla-supported <a href="https://sites.google.com/csumb.edu/cscapstone-s2025/cs-projects/firefox-ai-platform?authuser=0" rel="noopener" target="_blank">Capstone project</a>. We spoke with Taimur about his experience building an AI-centered extension from scratch.</p><p><b>What makes Fox Recap an “AI” project?</b></p><p>Taimur Hasan: <i>Fox Recap uses Machine Learning behind the scenes to classify sites and generate higher level insights, like top/trending categories and transition patterns. I kept the “AI” messaging light on the listing page to avoid hype and focus on the experience. Ideally the AI features feel seamless and natural rather than front and center.</i></p><p><b>What was your most challenging development hurdle? </b></p><p>TH: <i>For me, the most challenging part of development was creating the inference pipeline, which means the part where you actually use the AI model to do something useful. It took careful optimization to run well on a typical laptop as load times were a priority.</i></p><p><b>What is your perception of young emergent developers like yourself and their regard for privacy on the web?</b></p><p>TH: <i>With data collection on the rise, privacy and security matter more than ever. Among dedicated and enthusiastic young developers, privacy will always be in mind.</i></p><p><b>How do you see AI and browser extensions interrelating in the coming years? Do you have a sense of mutual direction? </b></p><p>TH: <i>I expect wider use of small, task specific models that quietly improve the user experience in most browser extensions. For mutual direction in the browser and add-on space I can see the use of AI in manipulating the DOM being done pretty heavily in the future.</i></p><p><b>Any advice for other extension developers curious about AI integration? </b></p><p>TH: <i>Be clear about the use case and model choice before investing in training or fine tuning. Start simple, validate the value, then add complexity only if it clearly improves the experience.</i></p><p>To learn even more about Fox Recap’s development process, please see <a href="https://blog.mozilla.org/en/firefox/firefox-recap/" rel="noopener" target="_blank">Fox Recap: A student-built tool that analyzes your browsing habits</a>.</p><p>The post <a href="https://blog.mozilla.org/addons/2025/10/21/developer-spotlight-fox-recap/">Developer Spotlight: Fox Recap</a> appeared first on <a href="https://blog.mozilla.org/addons">Mozilla Add-ons Community Blog</a>.</p></description> <pubDate>Tue, 21 Oct 2025 17:36:13 +0000</pubDate> <dc:creator>Scott DeVaney</dc:creator></item><item> <title>Mozilla Open Policy & Advocacy Blog: Behind the Manifesto: Standing up for encryption to keep the internet safe</title> <guid isPermaLink="false">https://blog.mozilla.org/netpolicy/?p=2512</guid> <link>https://blog.mozilla.org/netpolicy/2025/10/21/behind-the-manifesto-standing-up-for-encryption-to-keep-the-internet-safe/</link> <description><p><i>Welcome to the first blog of the series “Behind the Manifesto,” where we unpack core issues that are critical to Mozilla’s mission. The </i><a href="https://www.mozilla.org/en-US/about/manifesto/"><i>Mozilla Manifesto </i></a><i>represents Mozilla’s commitment to advancing an open, global internet. This blog series digs deeper on our vision for the web and the people who use it, and how these goals are advanced in policymaking and technology. </i></p><p>At Mozilla, we’ve <a href="https://blog.mozilla.org/en/mozilla/help-us-spread-the-word-encryption-matters/#:~:text=This%20is%20why%20Mozilla%20has,alone%20will%20not%20be%20enough.">long said</a> the internet is one of the world’s most important public resources, something that only thrives when guided by core principles. One of those principles is that individual security and privacy online are fundamental.</p><p><a href="https://support.mozilla.org/en-US/products/firefox/privacy-and-security/encryption">Encryption</a> is the technology that makes secure and private online interactions possible. It protects our messages, our data, and our privacy, sitting in the center of security and trust on the internet. Given its critical role in online privacy, it can be a focal point for policymakers.</p><table><tbody><tr><td><b>The truth is, encryption is integral to digital trust and safety. Strong encryption keeps us safe while weak encryption puts our personal, financial, and health data at risk. </b></td></tr></tbody></table><p>In recent years, we’ve seen <a href="https://www.globalencryption.org/blog/">governments around the world</a> test ways to undermine encryption to access private conversations and data, often framing it as critical to combating crime. From proposals in the EU that could allow law enforcement to read messages before they are encrypted, to the UK Government’s pushback on Apple’s rollout of iCloud end-to-end encryption, or U.S. legislation that would require platforms to provide access to encrypted data, the pressure to weaken encryption is growing globally.</p><p>Governments and law enforcement agencies face complex and legitimate challenges in protecting the public from serious crime and emerging online threats. Their work is critical to ensuring safety in an increasingly digital world. But weakening encryption is not the solution. Strong encryption is what keeps everyone safe — it protects citizens, officials, and infrastructure alike. It is the foundation that safeguards people from intrusive surveillance and shields their most sensitive data from those who would exploit it for harm. We must work together to find solutions that both uphold public safety and prevent the erosion of the privacy and security that strong encryption provides.</p><p>With encryption increasingly under threat, this year’s Global Encryption Day (October 21) is the perfect moment to reflect on why strong encryption matters for every internet user.</p><p>At Mozilla, we believe encryption isn’t a luxury or privilege. It is a necessity for protecting data against unauthorized access. Our commitment to end-to-end encryption is strong because it is essential to protecting people and ensuring the internet remains open and secure.</p><p>That’s why Mozilla has taken action for years to protect and advance encryption. In 2023, we joined the <a href="https://www.globalencryption.org/2023/04/mozilla-and-internet-freedom-foundation-join-global-encryption-coalition-steering-committee/">Global Encryption Coalition</a> <a href="https://www.globalencryption.org/about/members/">Steering Committee</a>, working with partners around the world to promote encryption and push back on proposals for backdoor access.</p><p>In the U.S., we’ve advanced encryption in our <a href="https://blog.mozilla.org/netpolicy/files/2025/03/US_Vision-25-26-1.pdf">2025 U.S. policy priorities</a>, <a href="https://blog.mozilla.org/netpolicy/2025/02/24/mozilla-joins-amicus-brief-in-support-of-law-that-protects-your-private-messages/">joined amicus briefs</a>, and raised concerns with <a href="https://blog.mozilla.org/netpolicy/2020/03/05/mozilla-statement-on-earn-it-act/">bills like the U.S. EARN IT Act</a>. In the EU, we ran a multi-year <a href="https://securityriskahead.eu/">campaign</a> on the <a href="https://digital-strategy.ec.europa.eu/en/policies/eidas-regulation">eIDAS Regulation</a> working alongside civil society, academics, and industry experts to address concerns that Article 45 threatened to undermine the encryption and authentication technologies used on the web. With such a massive risk to web security, Mozilla, with allies, took action, releasing <a href="https://blog.mozilla.org/netpolicy/files/2021/11/eIDAS-Position-paper-Mozilla-.pdf">detailed position papers and</a> <a href="https://blog.mozilla.org/netpolicy/files/2023/11/eIDAS-Industry-Letter.pdf">joint statements</a>. All of our efforts have been to safeguard encryption, privacy, and digital rights. Why? Because the bottom line is simple: backdoor policies diminish the trust that allows the web to be a safe and reliable public resource.</p><p>Mozilla’s strong commitment to protecting privacy isn’t just a policy priority; it’s the foundation of our products and initiatives. Below, we’d like to share some of the ways in which Mozilla partnered with allies to make encryption a reality and a core function of the open internet ecosystem.</p><ul><li>Mozilla is among the co-founders of <a href="https://letsencrypt.org/">Let’s Encrypt</a>, a nonprofit Certificate Authority run by the Internet Security Research Group (ISRG), alongside partners like the EFF and the University of Michigan. This project made HTTPS certificates free and automatically renewable, transforming HTTPS from a costly, complex setup into a default expectation across the web. As a result, the share of encrypted traffic skyrocketed <a href="https://news.engin.umich.edu/2019/11/how-lets-encrypt-doubled-the-percentage-of-secure-websites-in-four-years/">from less than 40% in 2016 to around 80% by 2019</a>.</li><li>Mozilla closely collaborated with Cloudflare to roll-out <a href="https://blog.mozilla.org/en/firefox/encrypted-hello/">Encrypted Client Hello (ECH) in Firefox</a> in 2023, which encrypts the first “Hello” message of a user’s TLS connection so that even the website name is hidden from network observers.</li><li>Mozilla has most recently set a new standard for certificate revocation on the web, advancing encryption and security. In April 2025, <a class="c-link" href="https://hacks.mozilla.org/2025/08/crlite-fast-private-and-comprehensive-certificate-revocation-checking-in-firefox/" rel="noopener noreferrer" target="_blank">Firefox became the first (and is still the only) browser</a> that has <a class="c-link" href="https://blog.mozilla.org/en/firefox/crlite/" rel="noopener noreferrer" target="_blank">deployed CRLite</a>, the technology invented by a group of researchers that ensures revoked HTTPS certificates are identified quickly and privately without leaking unencrypted browsing activity to third parties.</li><li>In 2024, Firefox became the first browser to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1884140">support DTLS 1.3 </a>providing the most robust end-to-end encryption of real-time audio and video data, including all your web conferencing.</li></ul><p>It’s easy to say we care about encryption, but it only works if the commitment is shared by the policymakers writing our laws and the engineers designing our systems.</p><blockquote><p>As Neha Kochar, Director of Firefox Security and Privacy puts it: “Whether you’re visiting your bank’s website or sending a family photo, Firefox works behind the scenes to keep your browsing secure. With no shareholders to answer to, we serve only you — open-source and transparent by design, with verifiable guarantees that not even Mozilla knows which websites you visit or what you do online.”</p></blockquote><p>That is why Global Encryption Day is such an important moment. If a system is weakened or broken, it opens vulnerabilities that anyone with the right tools can exploit. By standing up for encryption and the policies that protect it, we help ensure the internet remains safe, open, and fair for everyone.</p><p>To dig deeper on encryption, check out these partner resources: <a href="https://www.globalencryption.org/blog/">Global Encryption Coalition</a>, <a href="https://www.internetsociety.org/action-plan/encryption/">Internet Society</a> and <a href="https://www.gp-digital.org/world-map-of-encryption/">Global Partners Digital</a>.</p><p><i>This blog is part of a larger series. Be sure to follow </i><a href="https://www.linkedin.com/authwall?trk=bf&amp;trkInfo=AQG0ar_qcB8EBgAAAZoGzJxA4eFE_J5_aXXVy4XpoJaAGTPKMJZb6_q_yZbXt5vGjo9d80W8v1AWGYVTeF0DYt10NEXEk3U-6LtLf3ygQUMMT818X4ZZca59KKtwzaMNYEIJEzk=&amp;original_referer=&amp;sessionRedirect=https%3A%2F%2Fwww.linkedin.com%2Fin%2Fjennifer-taylor-hodges%2F"><i>Jenn Taylor Hodges</i></a><i> and </i><a href="https://it.linkedin.com/in/sema-karaman-0a9b988a"><i>Sema Karaman</i></a><i> on LinkedIn for further insights into Mozilla’s policy priorities. </i></p><p>The post <a href="https://blog.mozilla.org/netpolicy/2025/10/21/behind-the-manifesto-standing-up-for-encryption-to-keep-the-internet-safe/">Behind the Manifesto: Standing up for encryption to keep the internet safe</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></description> <pubDate>Tue, 21 Oct 2025 16:37:43 +0000</pubDate> <dc:creator>Jenn Taylor Hodges and Sema Karaman</dc:creator></item><item> <title>Mozilla Thunderbird: Thunderbird Monthly Release 144 Recap</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3902</guid> <link>https://blog.thunderbird.net/2025/10/thunderbird-monthly-release-144-recap/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2025/10/blog-banner-desktop-month-release-series1-768x432.jpg" width="640" /></p><p>We’re back with our Monthly Release recap! Thunderbird 144.0 readies the way for Exchange Web Services support, makes reordering your folders easier, and adds a new UI for TLS certificate handling. Additionally, we’ve fixed a dark mode toggle bug for High Contrast Mode users.</p> <p><strong>A quick reminder</strong> – these updates are for users on our <strong>monthly Thunderbird Release channel</strong>. For our users still on the ESR (Extended Standard Release) channel, these updates won’t land until next July 2026. For more information on the differences between the channels and how to make the switch:</p> <ul><li>Visit the Release download portal:<a href="https://updates.thunderbird.net/thunderbird/128.0/monthly/"> Thunderbird Release Page</a>.</li> <li><a href="https://support.mozilla.org/en-US/kb/thunderbird-release">Explore detailed comparisons</a> and migration guides.</li></ul> <p>Now let’s dive into <strong>what’s new in 144.0!</strong></p> <h3>New Features:</h3> <h4>Support for Exchange Web Service (EWS) Email in Account Hub</h4> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/10/ExchangeAccountHub.png"><img alt="" class="wp-image-3958" height="891" src="https://blog.thunderbird.net/files/2025/10/ExchangeAccountHub.png" width="1191" /></a></figure> <p>As part of our preparation for EWS support officially landing next month in Thunderbird 145.0, you’ll notice EWS accounts as an option in the Account Hub. We will have more detailed blog posts and support articles available next month describing what is and isn’t supported. </p> <p>Benefits:</p> <ul><li>This gives us a chance to gradually ready the app and users for our newest protocol</li></ul> <h4>Improve UX of folder reordering</h4> <p><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1957486">Bug 1957486</a></p> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/10/FolderReordering.png"><img alt="" class="wp-image-3952" height="278" src="https://blog.thunderbird.net/files/2025/10/FolderReordering.png" width="399" /></a></figure> <p>We recently introduced drag and drop folder reordering, and in 144, we’re making it better. A new widget shows where your folder is going. We also fixed an issue that prevented the visual from showing. We removed the jitters when positioning between folders, and Improved consistency by using the same indicator used to reorder tabs and attachments.</p> <p>Benefits:</p> <ul><li>More control over drag-and- performance with fewer folders going to the wrong location</li> <li>More visual consistency</li></ul> <h4>New UI for TLS Certificate Handling</h4> <p>While power users might be comfortable handling TLS certificates, average Thunderbird users might not know what to do when Thunderbird doesn’t trust a server’s certificate. This UI makes these issues, when they occur, harder to ignore and easier to diagnose and fix, even for less tech-savvy users. </p> <p>The new UI will mark the server red, with a clickable icon that takes users to an updated server settings. There, users can view certificates and add or remove certificate override exceptions.</p> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/10/image-1.jpeg"><img alt="" class="wp-image-3928" height="253" src="https://blog.thunderbird.net/files/2025/10/image-1.jpeg" width="504" /></a></figure> <hr class="wp-block-separator has-alpha-channel-opacity" /> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/10/Monthly-Release-Update-1442.png"><img alt="" class="wp-image-3964" height="280" src="https://blog.thunderbird.net/files/2025/10/Monthly-Release-Update-1442.png" width="1190" /></a></figure> <hr class="wp-block-separator has-alpha-channel-opacity" /> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/10/Monthly-Release-Update-1441.png"><img alt="" class="wp-image-3970" height="280" src="https://blog.thunderbird.net/files/2025/10/Monthly-Release-Update-1441.png" width="1190" /></a></figure> <hr class="wp-block-separator has-alpha-channel-opacity" /> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/10/Monthly-Release-Update-144.png"><img alt="" class="wp-image-3976" height="280" src="https://blog.thunderbird.net/files/2025/10/Monthly-Release-Update-144.png" width="1190" /></a></figure> <p>Benefits:</p> <ul><li>Increased security for the average Thunderbird user</li> <li>Easier access, via the server settings, to certificate actions</li></ul> <h3>Bug Fixes:</h3> <h4>Dark mode won’t go away for messages in High Contrast Mode</h4> <p><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1976900">Bug 1976900</a></p> <p>Our High Contrast Mode users noticed the new toggle for messages in dark mode wasn’t appearing. Starting in Thunderbird 144, dark message mode will not be activated when in High Contrast mode, respecting the colors and priority of that accessibility setting.</p> <p>Benefits:</p> <ul><li>Consistent use of system colors when in High Contrast Mode</li> <li>More respectful of user settings</li></ul> <p>You can find a complete list of updates and bug fixes that went into Thunderbird 144.0 in our <a href="https://www.thunderbird.net/en-US/thunderbird/144.0/releasenotes/">Release Notes</a>.</p> <p>Thank you for using Thunderbird and for supporting our mission to bring a truly independent, open‑source email experience. Your feedback and enthusiasm drive every improvement we make — and we can’t wait to share more with you in the next release.</p><p>The post <a href="https://blog.thunderbird.net/2025/10/thunderbird-monthly-release-144-recap/">Thunderbird Monthly Release 144 Recap</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Tue, 21 Oct 2025 14:16:13 +0000</pubDate> <dc:creator>Monica Ayhens-Madon</dc:creator></item><item> <title>The Servo Blog: Servo 0.0.1 Release</title> <guid isPermaLink="true">https://servo.org/blog/2025/10/20/servo-0.0.1-release/</guid> <link>https://servo.org/blog/2025/10/20/servo-0.0.1-release/</link> <description><p>Today, the Servo team has released new versions of the <code>servoshell</code> binaries for all our supported platforms, tagged <a href="https://github.com/servo/servo/releases/tag/v0.0.1">v0.0.1</a>. These binaries are essentially the same nightly builds that were already available from the <a href="https://servo.org/download">download page</a> with additional manual testing, now tagging them explicitly as releases for future reference.</p><p>We plan to publish such a tagged release every month. For now, we are adopting a simple release process where we will use a recent nightly build and perform additional manual testing to identify issues and regressions before tagging and publishing the binaries.</p><p>There are currently no plans to publish these releases on <a href="https://crates.io/">crates.io</a> or platform-specific app stores. The goal is just to publish <a href="https://github.com/servo/servo/releases">tagged releases on GitHub</a>.</p></description> <pubDate>Mon, 20 Oct 2025 00:00:00 +0000</pubDate></item><item> <title>Mozilla Thunderbird: Thunderbird Monthly Development Digest: September 2025</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3894</guid> <link>https://blog.thunderbird.net/2025/10/thunderbird-monthly-development-digest-september-2025/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2025/10/blog-banner-developer2-768x432.jpg" width="640" /></p><p>Hello again from the Thunderbird development team! This month’s sprints have been about focus and follow-through, as we’ve tightened up our new Account Hub experience and continued the deep work on Exchange Web Services (EWS) support. While those two areas have taken centre stage, we’ve also been busy adapting to a wave of upstream platform changes that demanded careful attention to keep everything stable and our continuous integration systems happy. Alongside this, our developers have been lending extra support to the Services team to ensure a smooth path for upcoming releases. It’s been a month of steady, detail-oriented progress – the kind that doesn’t always make headlines, but lays the groundwork for the next leaps forward.</p> <h4><strong>Exchange Web Services support announcement for 145</strong></h4> <p>While support for Microsoft Exchange via EWS landed in Thunderbird 144, the new “Account Hub” setup interface had a few outstanding priorities which required our attention. Considering that the announcement of EWS support will likely generate a large spike in secondary account additions, we felt it important enough to delay the announcement in order to polish the setup interface and make the experience better for the users taking advantage of the new features. The team working on the “back end” took the opportunity to deliver more features that had been in our backlog and address some bugs that were reported by users who are already using EWS on Beta and Daily:</p> <ul><li>Offline message policy</li> <li>Soft delete / copy to Trash</li> <li>Empty Trash</li> <li>Notifications with message preview</li> <li>Reply-to multiple recipients bug</li> <li>Mark Folder as read</li> <li>Experimental tenant-specific configuration options (behind a preference) now being tested with early adopters</li></ul> <p>Looking ahead, the team is already focused on our work week where we’ll have chance to put plans in place to tackle some architectural refactoring and the next major milestones in our EWS implementation for Calendar and Address Book.</p> <p>We were also delighted to work with a community contributor who has been hard at work on adding <a href="https://github.com/thunderbird/ews-rs/pull/64"><u>support for the FindItem operation</u></a>. We know some of our workflows are tricky so we very much appreciate the support and patience required!</p> <p><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1847846"><u>Keep track of feature delivery here.</u></a> </p> <h4><strong>Account Hub</strong></h4> <p>We’ve now added the ability to manually edit any configuration from the first screen. This effectively bypasses the simpler detection methods which don’t work for every configuration. Upon detection failure, a user is now able to switch between protocols and choose EWS configuration.</p> <p>Other notable items being rolled into 145 are:</p> <ul><li>Redirect warning and handling to prevent a hang for platforms using autodiscover on a 3rd party server</li> <li>Authentication step added for Exchange discovery requiring credentials</li> <li>Ability to cancel the account configuration detection process</li> <li>Improvements to the experience for users with screen reading technology</li></ul> <p>The creation of address books through the Account Hub is now the experience by default on 145 which is coming to Beta release users this week and monthly Release users before I write next.</p> <p>Follow progress in the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1981786"><u>Meta Bug</u></a></p> <h4><strong>Calendar UI Rebuild</strong></h4> <p>With the front end team mainly focused on Account Hub, the Calendar UI project has moved slowly this past month. We’ve concentrated the continued work in the following areas:</p> <ul><li>Acceptance widget</li> <li>Title and close button</li> <li>Dialog repositioning on resize</li> <li>Migrating calendar strings from legacy .dtd files into modern .ftl files and preserving translations to avoid repeat work for our translation community.</li></ul> <h4><strong>Maintenance, Upstream adaptations, Recent Features and Fixes</strong></h4> <p>With our focused maintenance sprint over, the team kept the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1492751"><u>Fluent Migration</u></a> and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979960"><u>moz-src migration</u></a> projects moving in the background. They also handled another surge of upstream changes requiring triage. In addition to these items, the development community has helped us deliver a variety of improvements over the past month:</p> <ul><li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1831713"><u>Unified toolbar fix to toggle Spam/Not Spam</u></a></li> <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=382977"><u>An 18 year-old bug to enable full path display</u></a></li> <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1851875"><u>Fix a regression to allow remote content in .eml file</u></a></li> <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1988718"><u>Support for DNS over HTTPS</u></a></li> <li>and many more which we list in <a href="https://www.thunderbird.net/en-US/thunderbird/145.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> <h3>—</h3> <p><strong>Toby Pilling</strong></p> <p>Senior Manager, Desktop Engineering</p><p>The post <a href="https://blog.thunderbird.net/2025/10/thunderbird-monthly-development-digest-september-2025/">Thunderbird Monthly Development Digest: September 2025</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Fri, 17 Oct 2025 16:35:31 +0000</pubDate> <dc:creator>Toby Pilling</dc:creator></item><item> <title>Firefox Add-on Reviews: Reddit revolutionized — use a browser extension to enhance your favorite forum</title> <guid isPermaLink="true">https://addons.mozilla.org/blog/reddit-revolutionized-use-a-browser-extension-to-enhance-your-favorite-forum/</guid> <link>https://addons.mozilla.org/blog/reddit-revolutionized-use-a-browser-extension-to-enhance-your-favorite-forum/</link> <description><p>Reddit is awash with great conversation (well, <a href="https://www.reddit.com/r/notinteresting/" rel="noreferrer noopener">not all the time)</a>. There’s a Reddit forum for just about everybody —<a href="https://www.reddit.com/subreddits/leaderboard/sports/" rel="noreferrer noopener"> sports fans</a>, <a href="https://www.reddit.com/subreddits/leaderboard/gaming/" rel="noreferrer noopener">gamers</a>, <a href="https://www.reddit.com/r/FoodHaikus/" rel="noreferrer noopener">poets inspired by food</a>, <a href="https://www.reddit.com/r/birdswitharms/" rel="noreferrer noopener">people who like arms on birds</a> — you get the idea. </p> <p>If you spend time on Reddit, there are ways to augment your experience with a browser extension… </p> <h3 class="wp-block-heading">Reddit Enhancement Suite</h3> <p>Used by millions of Redditors across various browsers, <a href="https://addons.mozilla.org/firefox/addon/reddit-enhancement-suite/" rel="noreferrer noopener">Reddit Enhancement Suite</a> is optimized to work with the beloved “old Reddit”. </p> <div class="addon-card"></div> <p>Key features: </p> <ul class="wp-block-list"><li><strong>Subreddit manager</strong>. Customize the top nav bar with your own subreddit shortcuts. </li> <li><strong>Account switcher</strong>. Easily manage multiple Reddit accounts with a couple quick clicks. </li> <li><strong>Show “parent” comment on hover</strong>. When you mouse over a comment, its “parent” comment displays. </li> <li><strong>Dashboard</strong>. Fully customizable dashboard showcases content from subreddits, your message inbox &amp; more. </li> <li><strong>Tag</strong> specific users and subreddits so their activity appears more prominently</li> <li><strong>Custom filters</strong>. Select words, subreddits, or even certain users you want filtered out of your scrolling experience. </li> <li><strong>New comment count</strong>. See the number of new comments on a thread since your last visit. </li> <li><strong>Neverending Reddit</strong>. Just keep scrolling. Never stop!</li></ul> <h3 class="wp-block-heading">Old Reddit Redirect</h3> <p>Speaking of the former design, <a href="https://addons.mozilla.org/firefox/addon/old-reddit-redirect/" rel="noreferrer noopener">Old Reddit Redirect</a> provides a straightforward function. It simply ensures that every Reddit page you visit will redirect to the <em>old.reddit.com</em> domain. </p> <div class="addon-card"></div> <p>Sure, if you have a Reddit account the site gives you the option of using the old design, but with the browser extension you’ll get the old site regardless of being logged in or not. It’s also great for when you click Reddit links shared from the new domain. </p> <h3 class="wp-block-heading">Sink It for Reddit</h3> <p>Designed to “make Reddit’s web version actually usable,” <a href="https://addons.mozilla.org/firefox/addon/sink-it-for-reddit/">Sink It for Reddit</a> is built for people craving a minimalist discussion platform. </p> <div class="addon-card"></div> <p>Color coded comments are much simpler to navigate, especially with Sink It’s brilliant Adaptive Dark Mode feature. Give this privacy respecting extension a try if you desire a laser focused Reddit experience. </p> <h3 class="wp-block-heading"><strong>Reddit Comment Collapser</strong></h3> <p>No more getting lost in confusing comment threads for users of <strong>old.reddt.com</strong>. <a href="https://addons.mozilla.org/en-US/firefox/addon/reddit_comment_collapser/" rel="noreferrer noopener">Reddit Comment Collapser</a> cleans up your commentary view with a simple mouse click.</p> <div class="addon-card"></div> <p>Compatible with <a href="https://addons.mozilla.org/en-US/firefox/addon/reddit-enhancement-suite/" rel="noreferrer noopener">Reddit Enhancement Suite</a> and <a href="https://addons.mozilla.org/en-US/firefox/addon/old-reddit-redirect/" rel="noreferrer noopener">Old Reddit Redirect</a>, this single-use extension is beloved by many seeking a minimalist view of the classic Reddit.</p> <h3 class="wp-block-heading">Reddit on YouTube</h3> <p>Bring Reddit with you to YouTube. Whenever you’re on a YouTube page, <a href="https://addons.mozilla.org/firefox/addon/reddit-on-youtube/" rel="noreferrer noopener">Reddit on YouTube</a> searches for Reddit posts that link to the video and embeds those comments into the YouTube comment area. </p> <div class="addon-card"></div> <p>You can easily toggle between Reddit and YouTube comments and select either one to be your default preference. </p> <figure class="wp-block-image size-large"><img alt="" class="wp-image-178" height="716" src="https://mozamo.wpengine.com/wp-content/uploads/2021/07/blog_reddit_comment-1-1024x716.png" width="1024" />&lt;figcaption class="wp-element-caption"&gt;If there are multiple Reddit threads about the video you’re watching, the extension will display them in tab form in the YouTube comment section. &lt;/figcaption&gt;</figure> <h3 class="wp-block-heading">Reddit Ad Remover</h3> <p>Sick of seeing so many “Promoted” posts and paid advertisements in the feed and sidebar? <a href="https://addons.mozilla.org/firefox/addon/reddit-ad-remover/" rel="noreferrer noopener">Reddit Ad Remover</a> silences the noise. </p> <div class="addon-card"></div> <p>The extension even blocks auto-play video ads, which is great for people who don’t appreciate sudden bursts of commercial sound. Hey, somebody should <a href="https://www.reddit.com/r/badads/" rel="noreferrer noopener">create a subreddit about this</a>! </p> <p>Happy redditing, folks. Feel free to explore more <a href="https://addons.mozilla.org/firefox/extensions/category/feeds-news-blogging/" rel="noreferrer noopener">news and media extensions</a> on <em>addons.mozilla.org</em>.</p></description> <pubDate>Thu, 16 Oct 2025 21:29:46 +0000</pubDate> <dc:creator>Scott DeVaney</dc:creator></item><item> <title>Firefox Add-on Reviews: Boost your writing skills with a browser extension</title> <guid isPermaLink="true">https://addons.mozilla.org/blog/boost-your-writing-skills-with-a-browser-extension/</guid> <link>https://addons.mozilla.org/blog/boost-your-writing-skills-with-a-browser-extension/</link> <description><p>Whatever kind of writing you do — technical documentation, corporate communications, Harry Potter-vampire crossover fan fiction — it probably happens online. Here are some fabulous browser extensions that will benefit anyone who writes on the web. Get grammar help, productivity tools, and other strong writing aids… </p> <h3 class="wp-block-heading">LanguageTool</h3> <p>It’s like having your own copy editor with you wherever you write on the web. <a href="https://addons.mozilla.org/firefox/addon/languagetool/" rel="noreferrer noopener">Language Tool – Grammar and Spell Checker</a> will make you a better writer in 25+ languages. </p> <div class="addon-card"></div> <p>More than just a spell checker, LanguageTool also…</p> <ul class="wp-block-list"><li>Recognizes common misuses of similar sounding words (e.g. <em>there/their</em> or <em>your/you’re</em>)</li> <li>Works on social media sites and email</li> <li>Offers alternate phrasing and style suggestions for brevity and clarity</li></ul> <h3 class="wp-block-heading">Dictionary Anywhere</h3> <p>Need a quick word definition? With <a href="https://addons.mozilla.org/firefox/addon/dictionary-anyvhere/" rel="noreferrer noopener">Dictionary Anywhere</a> just double-click any word you find on the web and get an instant pop-up definition. </p> <div class="addon-card"></div> <p>You can even save and download words and their definitions for later offline reference. </p> <figure class="wp-block-image size-large"><img alt="" class="wp-image-232" height="724" src="https://mozamo.wpengine.com/wp-content/uploads/2021/08/blog_write_DictAnywhere-1024x724.jpg" width="1024" />&lt;figcaption class="wp-element-caption"&gt;Dictionary Anywhere — no more navigating away from a page just to get a word check.&lt;/figcaption&gt;</figure> <h3 class="wp-block-heading">Yomitan</h3> <p>Think of <a href="https://addons.mozilla.org/firefox/addon/yomitan/">Yomitan</a> as a dictionary extension that doubles as a language learning tool. Decipher and define text in 20+ languages. </p> <div class="addon-card"></div> <p>As you navigate foreign language websites, Yomitan is right there with you to not only help define unfamiliar words and phrases, but also provide audio pronunciation guidance, flashcard creation for future study, offline support and more — all within a privacy protective framework. </p> <h3 class="wp-block-heading">Power Thesaurus</h3> <p>Every writer occasionally struggle to find the perfect word. Bring <a href="https://addons.mozilla.org/firefox/addon/power-thesaurus/">Power Thesaurus</a> with you wherever you write on the web to gain instant access to alternative phrasing. </p> <div class="addon-card"></div> <p>Simply highlight any word and pop up a handy thesaurus (also includes word definitions and antonyms). Power Thesaurus is a priceless tool for writers who labor over every word. </p> <h3 class="wp-block-heading">Dark Background and Light Text</h3> <p>Give your eyes a break. <a href="https://addons.mozilla.org/firefox/addon/dark-background-light-text/" rel="noreferrer noopener">Dark Background and Light Text</a> makes staring at blinking words all day a whole lot easier on your lookers. </p> <div class="addon-card"></div> <p>Really simple to use out of the box. Once installed, the extension’s default settings automatically flip the colors of every web page you visit. But if you’d like more granular control of color settings, just click the extension’s toolbar button to access a pop-up menu that lets you customize color schemes, set page exceptions for sites you don’t want colors inverted, and more simple controls. </p> <figure class="wp-block-image size-large"><img alt="" class="wp-image-233" height="551" src="https://mozamo.wpengine.com/wp-content/uploads/2021/08/blog_write_dblt-1024x551.jpg" width="1024" />&lt;figcaption class="wp-element-caption"&gt;Dark Background and Light Text goes easy on the eyes.&lt;/figcaption&gt;</figure> <h3 class="wp-block-heading">Clippings</h3> <p>If your online writing requires the repeated use of certain phrases (for example, work email templates or customer support responses), <a href="https://addons.mozilla.org/firefox/addon/clippings/" rel="noreferrer noopener">Clippings</a> can be a huge time saver. </p> <div class="addon-card"></div> <p>Key features…</p> <ul class="wp-block-list"><li>Create a practically limitless library of saved phrases</li> <li>Paste your clippings anywhere via context menu</li> <li>Organize batches of clippings with folders and color coded labels</li> <li>Shortcut keys for power users</li> <li>Extension supported in English, Dutch, French, German, and Portuguese (Brazil)</li></ul> <figure class="wp-block-image size-large"><img alt="" class="wp-image-234" height="789" src="https://mozamo.wpengine.com/wp-content/uploads/2021/08/blog_write_clippings-1024x789.jpg" width="1024" />&lt;figcaption class="wp-element-caption"&gt;Clippings handles bulk cutting/pasting. &lt;/figcaption&gt;</figure> <p>We hope these extensions take your prose to the next level. Some writers may also be interested in this collection of <a href="https://addons.mozilla.org/blog/supercharge-your-productivity-with-a-browser-extension/" rel="noreferrer noopener">great productivity extensions</a> to help organize your writing projects. Feel free to explore thousands of other useful extensions on <em>addons.mozilla.org</em>. </p></description> <pubDate>Thu, 16 Oct 2025 19:54:02 +0000</pubDate> <dc:creator>Scott DeVaney</dc:creator></item><item> <title>Firefox Add-on Reviews: Extension starter pack</title> <guid isPermaLink="true">https://addons.mozilla.org/blog/extension-starter-pack/</guid> <link>https://addons.mozilla.org/blog/extension-starter-pack/</link> <description><p>You’ve probably heard about “ad blockers,” “tab managers,” “anti-trackers” or any number of browser customization tools commonly known as <em>extensions.</em> And maybe you’re intrigued to try one, but you’ve never installed an extension before and the whole notion just seems a bit vague. </p> <p>Let’s demystify extensions. </p> <p>An extension is simply an app that runs on a browser like Firefox. From serious productivity and privacy enhancing features to fun stuff like changing the way the web looks and feels, extensions give you the power to completely personalize your browsing experience. </p> <p><a href="https://addons.mozilla.org/firefox/" rel="noreferrer noopener"><em>Addons.mozilla.org</em></a> (AMO) is a discovery site that hosts thousands of independently developed Firefox extensions. It’s a vast and eclectic ecosystem of features, so we’ve hand-picked a small collection of great extensions to get you started…</p> <h3><em>I’ve always wanted an ad blocker!</em></h3> <h4>uBlock Origin</h4> <p>Works beautifully “right out of the box.” Just add it to Firefox and <a href="https://addons.mozilla.org/firefox/addon/ublock-origin/" rel="noreferrer noopener">uBlock Origin</a> will automatically start blocking all types of advertising — display ads, banners, video pre-rolls, pop-ups — you name it. </p> <div class="addon-card"></div> <p>Of course, if you prefer deeper content blocking customization, uBlock Origin allows for fine control as well, like the ability to import your own custom block filters or access a data display that shows how much of a web page was blocked by the extension. More than just an ad blocker, uBlock Origin also effectively thwarts some websites that may be infected with malware. </p> <p>For more insights about this excellent ad blocker, please see <a href="https://addons.mozilla.org/blog/ublock-origin-everything-you-need-to-know-about-the-ad-blocker/" rel="noreferrer noopener">uBlock Origin — everything you need to know about the ad blocker</a>, or to explore even more ad blocker options, check out <a href="https://addons.mozilla.org/blog/whats-the-best-ad-blocker-for-you/" rel="noreferrer noopener">What’s the best ad blocker for you?</a></p> <h3><em>I’m concerned about my privacy and tracking around the web</em></h3> <h4>Privacy Badger</h4> <p>The flagship anti-tracking extension from privacy proponents at the <a href="https://www.eff.org/">Electronic Frontier Foundation</a>, <a href="https://addons.mozilla.org/firefox/addon/privacy-badger17/" rel="noreferrer noopener">Privacy Badger</a> is programmed to look for tracking heuristics (i.e. specific actions that indicate someone is trying to track you). </p> <div class="addon-card"></div> <p>Zero set up required. Just install Privacy Badger and it will automatically search for third-party cookies, HTML5 local storage “supercookies,” canvas fingerprinting, and other sneaky tracking methods. </p> <h4>Consent-O-Matic</h4> <p>Not only will <a href="https://addons.mozilla.org/firefox/addon/consent-o-matic/">Consent-O-Matic</a> automatically handle pop-up data consent forms (per <a href="https://gdpr-info.eu/">GDPR</a> regulations), but it’s brilliantly designed to interpret the often intentionally confusing language of consent pop-ups trying to trick you into agreeing to invasive tracking. </p> <div class="addon-card"></div> <p>Developed by internet privacy researchers at Aarhus University in Denmark who grew sick of seeing so many deceptive consent pop-ups, Consent-O-Matic’s decision-making logic is built upon studying hundreds of pop-ups and identifying duplicitous patterns. So using this extension not only gives you a great ally in the fight against intrusive tracking, but you’re spared the annoyance of constantly clicking consent forms all over the internet. </p> <h3><em>I need an easier way to translate languages</em></h3> <h4>Simple Translate</h4> <p>Do you do a lot of language translations on the web? If so, it’s a hassle always copying text and navigating away from the page you’re on just to translate a word or phrase. <a href="https://addons.mozilla.org/firefox/addon/simple-translate/" rel="noreferrer noopener">Simple Translate</a> solves this problem by giving you the power to perform translations right there on the page. </p> <div class="addon-card"></div> <p>Just highlight the text you want translated and right-click to get instant translations in a handy pop-up display, so you never have to leave the page again. </p> <h3><em>My grammar in speling is bad!</em></h3> <h4><strong>LanguageTool</strong></h4> <p>Anywhere you write on the web, <a href="https://addons.mozilla.org/firefox/addon/languagetool/" rel="noreferrer noopener">LanguageTool</a> will be there to lend a guiding editorial hand. It helps fix typos, grammar problems, and even recognizes common word mix-ups like the there/their/they’re. </p> <div class="addon-card"></div> <p>Available in 25 languages, LanguageTool automatically works on any web-based publishing platform like Gmail, web docs, social media sites, etc. The clever extension will even spot words you’re possibly overusing and suggest alternatives to spruce up your prose. </p> <h3><em>YouTube your way</em></h3> <h4>Improve YouTube!</h4> <p>Boasting 175+ customization features, <a href="https://addons.mozilla.org/firefox/addon/youtube-addon/">Improve YouTube!</a> is simple to grasp while providing a huge variety of ways to radically alter YouTube functionality. </p> <div class="addon-card"></div> <p>Key features include… </p> <ul class="wp-block-list"><li>Customize YouTube’s layout with different color schemes</li> <li>Create shortcuts for common actions like skipping to next video, scrolling back/forward 10 seconds, volume control &amp; more</li> <li>Filter out unwanted elements like Related Videos, Shorts, Comments, etc. </li> <li>Ad blocking (with ability to allow ads from channels you choose to support)</li> <li>Simple screenshot and save features</li> <li>Playlist shuffle</li> <li>Frame by frame scrolling</li> <li>High-def default video quality</li></ul> <h3><em>I’m drowning in browser tabs! Send help! </em></h3> <h4>OneTab</h4> <p>You’ve got an overwhelming number of open tabs. You can’t close them. You need them. But you can’t organize them all right now either. You’re too busy. What to do?! </p> <p>If you have <a href="https://addons.mozilla.org/firefox/addon/onetab/" rel="noreferrer noopener">OneTab</a> on Firefox you just click the toolbar button and suddenly all those open tabs become a clean list of text links listed on a single page. Ahhh serenity.</p> <div class="addon-card"></div> <p>Not only will you create browser breathing room for yourself, but with all those previously open tabs now closed and converted to text links, you’ve also freed up a bunch of CPU and memory, which should improve browser speed and performance. </p> <p>If you’ve never installed a browser extension before, we hope you found something here that piques your interest to try. To continue exploring ways to personalize Firefox through the power of extensions, please see our collection of 100+ <a href="https://addons.mozilla.org/firefox/search/?promoted=recommended&amp;sort=random&amp;type=extension" rel="noreferrer noopener">Recommended Extensions</a>. </p></description> <pubDate>Thu, 16 Oct 2025 19:22:03 +0000</pubDate> <dc:creator>Scott DeVaney</dc:creator></item><item> <title>The Mozilla Blog: Windows 10 updates are ending. Here’s what it means for Firefox users.</title> <guid isPermaLink="false">https://blog.mozilla.org/?p=82297</guid> <link>https://blog.mozilla.org/en/firefox/windows-10-updates-support/</link> <description><figure class="wp-block-image size-large"><img alt="Firefox logo with orange fox wrapped around purple globe." class="wp-image-82299" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/10/Press_Firefox_Brand_1920x1080_2-1024x576.png" width="1024" /></figure> <p>This week Microsoft released the final free monthly update to Windows 10. While this marks the end of support from Microsoft, <strong>Firefox will continue to support Windows 10 for the foreseeable future</strong>. </p> <p>If you remain on Windows 10, you will <a href="https://support.mozilla.org/en-US/kb/firefox-support-windows-10-end-support" rel="noreferrer noopener" target="_blank">continue to get the same updates</a> to Firefox you do today, with all of our latest feature improvements and bug fixes. This includes our commitment to resolve security vulnerabilities as rapidly as we can, <a href="https://blog.mozilla.org/security/2024/04/04/rapidly-leveling-up-firefox-security/">sometimes in less than 24 hours</a>, with special security updates. Windows 10 remains a primary platform for Firefox users. Unlike older versions of Windows like Windows 7 and 8, where Mozilla is only offering security updates to Firefox, Windows 10 will get the latest and greatest features and bug fixes just like users on Windows 11. </p> <h3><strong>Should you upgrade to Windows 11?</strong></h3> <p>While Mozilla will continue to deliver the latest updates to Firefox on Windows 10, security online also requires continued updates from Microsoft to Windows 10 itself, and to the many other software and devices that you use on your Windows 10 computer. That’s why <strong>we recommend upgrading to Windows 11 if your computer supports it</strong>. You can find out if your PC can run Windows 11 and upgrade to it for free from your Windows update settings. With this option, when you start up Windows 11 for the first time you’ll find that Firefox is still installed, and all of your data and settings are just like you left them. </p> <p>If your computer <em>cannot</em> run Windows 11, or you wish to remain on Windows 10 for other reasons, your next best option is to <strong>make sure you’re getting “extended security updates”</strong> from Microsoft. While these updates won’t deliver new Windows features or non-security bug fixes, they will fix security vulnerabilities that are found in Windows 10 in the future. You should see an option to “enroll” in these updates in your Windows update settings, and if you choose the “Windows Backup” option you’ll get the updates for free. Microsoft has more information on <a href="https://www.microsoft.com/windows/extended-security-updates">Windows 10 extended security updates</a> if you have other questions. </p> <h3><strong>Preparing for a device upgrade or new PC</strong></h3> <p>If you get a new Windows 11 PC you might be surprised to see that even if you used Windows Backup, non-Microsoft apps like Firefox haven’t migrated with you. You will typically get a link in your start menu or on your desktop to re-install Firefox, and after it’s installed you’ll find that everything is “fresh” — without your bookmarks, saved passwords, browsing history, or any of your other data and settings. </p> <p>This can be frustrating, but we do have a solution for you if you prepare in advance and <strong>back up your data using </strong><a href="https://support.mozilla.org/en-US/kb/how-do-i-set-sync-my-computer"><strong>Firefox sync</strong></a><strong> through a </strong><a href="https://www.mozilla.org/account/"><strong>Mozilla account</strong></a><strong>.</strong> To get started with sync, just choose “sign in” from the Firefox toolbar or menu, and we’ll walk you through the quick process of creating a Mozilla account and enabling sync. </p> <h3><strong>Firefox sync helps transfer your data securely</strong></h3> <p>Sync isn’t just for people who have Firefox running on more than one computer. It’s also a safe way to back up your data and protect yourself against a lost laptop, a computer that breaks down or is damaged, or your own excited forgetfulness if you get rid of your old PC the moment you get a new one. And what many Firefox users may not realize is that Firefox sync is “end-to-end encrypted,” which is a fancy way of saying that not even Mozilla can read your data. Without your password, which we don’t know, your data is an indecipherable scramble even to us. But it’s safe on our servers nonetheless, which means that if you find yourself with a new PC and a “fresh” Firefox, all you need to do is log in and all your bookmarks, passwords, history and more will quickly load in. </p> <p>Meanwhile, you can also rest assured that if you continue to use Firefox on Windows 10 over the next few years, we’ll let you know through messages in Firefox if there is new information about staying secure and whether our stance regarding our support for Windows 10 needs to change. <br /><br />Thanks for using Firefox, and know that you can always reach us at <a href="https://connect.mozilla.org/">Mozilla Connect</a>. We’re eager for your feedback and questions.</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="" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2021/10/Visual-Guidelines-800x800.png" width="800" /> </div> <div class="ft-c-inline-cta__content"> <h4>Take control of your internet</h4> <span>Download Firefox</span> </div></a><p>The post <a href="https://blog.mozilla.org/en/firefox/windows-10-updates-support/">Windows 10 updates are ending. Here’s what it means for Firefox users.</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></description> <pubDate>Thu, 16 Oct 2025 17:14:25 +0000</pubDate> <dc:creator>David Rubino</dc:creator></item><item> <title>The Rust Programming Language Blog: docs.rs: changed default targets</title> <guid isPermaLink="true">https://blog.rust-lang.org/2025/10/16/docsrs-changed-default-targets/</guid> <link>https://blog.rust-lang.org/2025/10/16/docsrs-changed-default-targets/</link> <description><h3><a class="anchor" href="https://blog.rust-lang.org/2025/10/16/docsrs-changed-default-targets/#changes-to-default-build-targets-on-docs-rs"></a>Changes to default build targets on docs.rs</h3><p>This post announces two changes to the list of default targets used to builddocumentation on docs.rs.</p><p>Crate authors can specify a custom list of targets using<a href="https://docs.rs/about/metadata">docs.rs metadata in <code>Cargo.toml</code></a>. If thismetadata is not provided, docs.rs falls back to a default list. We are updatingthis list to better reflect the current state of the Rust ecosystem.</p><h4><a class="anchor" href="https://blog.rust-lang.org/2025/10/16/docsrs-changed-default-targets/#apple-silicon-arm64-replaces-x86-64"></a>Apple silicon (ARM64) replaces x86_64</h4><p>Reflecting Apple's transition from x86_64 to its own ARM64 silicon, the Rustproject has updated its platform support tiers. The <code>aarch64-apple-darwin</code>target is now Tier 1, while <code>x86_64-apple-darwin</code> has moved to Tier 2. You canread more about this in <a href="https://github.com/rust-lang/rfcs/pull/3671">RFC 3671</a>and <a href="https://github.com/rust-lang/rfcs/pull/3841">RFC 3841</a>.</p><p>To align with this, docs.rs will now use <code>aarch64-apple-darwin</code> as the defaulttarget for Apple platforms instead of <code>x86_64-apple-darwin</code>.</p><h4><a class="anchor" href="https://blog.rust-lang.org/2025/10/16/docsrs-changed-default-targets/#linux-arm64-replaces-32-bit-x86"></a>Linux ARM64 replaces 32-bit x86</h4><p>Support for 32-bit <code>i686</code> architectures is declining, and major Linuxdistributions have begun to phase it out.</p><p>Consequently, we are replacing the <code>i686-unknown-linux-gnu</code> target with<code>aarch64-unknown-linux-gnu</code> in our default set.</p><h4><a class="anchor" href="https://blog.rust-lang.org/2025/10/16/docsrs-changed-default-targets/#new-default-target-list"></a>New default target list</h4><p>The updated list of default targets is:</p><ul><li><code>x86_64-unknown-linux-gnu</code></li><li><code>aarch64-apple-darwin</code> (replaces <code>x86_64-apple-darwin</code>)</li><li><code>x86_64-pc-windows-msvc</code></li><li><code>aarch64-unknown-linux-gnu</code> (replaces <code>i686-unknown-linux-gnu</code>)</li><li><code>i686-pc-windows-msvc</code></li></ul><h4><a class="anchor" href="https://blog.rust-lang.org/2025/10/16/docsrs-changed-default-targets/#opting-out"></a>Opting out</h4><p>If your crate requires the previous default target list, you can explicitlydefine it in your <code>Cargo.toml</code>:</p><pre class="language-toml z-code"><code class="language-toml"><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">package</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">metadata</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">docs</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">rs</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span></span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">targets</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-punctuation z-definition z-array z-begin z-toml">[</span></span><span class="z-source z-toml"> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>x86_64-unknown-linux-gnu<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-separator z-array z-toml">,</span></span><span class="z-source z-toml"> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>x86_64-apple-darwin<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-separator z-array z-toml">,</span></span><span class="z-source z-toml"> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>x86_64-pc-windows-msvc<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-separator z-array z-toml">,</span></span><span class="z-source z-toml"> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>i686-unknown-linux-gnu<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-separator z-array z-toml">,</span></span><span class="z-source z-toml"> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>i686-pc-windows-msvc<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span></span><span class="z-source z-toml"><span class="z-punctuation z-definition z-array z-end z-toml">]</span></span></code></pre><p>Note that docs.rs continues to support any target available in the Rusttoolchain; only the <em>default</em> list has changed.</p></description> <pubDate>Thu, 16 Oct 2025 00:00:00 +0000</pubDate> <dc:creator>Denis Cornehl</dc:creator></item><item> <title>Firefox Add-on Reviews: Translate the web easily with a browser extension</title> <guid isPermaLink="true">https://addons.mozilla.org/blog/translate-the-web-easily-with-a-browser-extension/</guid> <link>https://addons.mozilla.org/blog/translate-the-web-easily-with-a-browser-extension/</link> <description><p>At Mozilla, of course we’re fans of <a href="https://www.firefox.com/features/translate/">Firefox’s built-in, privacy-focused translation feature</a>, but the beauty of browser extensions is the vast array of niche tools and customization features they can provide. Sometimes finding the right extension for your personal needs can profoundly change the way you interact with the web. So if you do a lot of translating on the internet, you might consider using a specialized extension translator. Here are some great options…</p> <h3><em><span class="has-inline-color has-light-green-cyan-color">I just want a simple, efficient way to translate. I don’t need fancy features.</span></em></h3> <h4>Simple Translate</h4> <p>It doesn’t get much simpler than this. Highlight the text you want to translate and click the extension’s toolbar icon to activate a streamlined pop-up. Your highlighted text automatically appears in the pop-up’s translation field and a drop-down menu lets you easily select your target language. <a href="https://addons.mozilla.org/firefox/addon/simple-translate/" rel="noreferrer noopener">Simple Translate</a> also features a handy one-click “Translate this page” button. </p> <div class="addon-card"></div> <h4>Translate Web Pages</h4> <p>Maybe you just need to translate full web pages, like when reading news articles, how-to guides, or job related sites. If so, <a href="https://addons.mozilla.org/firefox/addon/traduzir-paginas-web/" rel="noreferrer noopener">Translate Web Pages</a> might be the ideal solution for you with its sharp focus on full-page utility. </p> <div class="addon-card"></div> <p>The extension includes a handy feature if you commonly translate a few languages — you can select up to three languages to easily access with a single-click popup menu. TWP also gives you the option to designate specific websites you always want translated without prompt. </p> <h4>S3.Translator</h4> <p>Supporting 100+ languages, <a href="https://addons.mozilla.org/firefox/addon/s3_translator/" rel="noreferrer noopener">S3.Translator</a> serves up a full feature set of language tools, like the ability to translate full or select portions of a page, text-to-speech translation, YouTube subtitle translations, and more.</p> <div class="addon-card"></div> <p>There’s even a nifty Learning Language mode, which allows you to turn any text into the language you’re studying. Toggle between languages so you can conveniently learn as you naturally browse the web.</p> <h4>To Google Translate</h4> <p>Very popular, very simple translation extension that exclusively uses Google’s translation services, including text-to-speech. </p> <div class="addon-card"></div> <p>Simply highlight any text on a web page and right-click to pull up a <a href="https://addons.mozilla.org/firefox/addon/to-google-translate/" rel="noreferrer noopener">To Google Translate</a> context menu that allows three actions: 1) translate into your preferred language; 2) listen to audio of the text; 3) Translate the entire page</p> <figure class="wp-block-image"><img alt="" class="wp-image-142" height="619" src="https://mozamo.wpengine.com/wp-content/uploads/2021/06/blogTGT-1024x619.png" width="1024" />&lt;figcaption class="wp-element-caption"&gt;Right-click any highlighted text to activate To Google Translate.&lt;/figcaption&gt;</figure> <h3><em>I do a ton of translating. I need power features to save me time and trouble.</em></h3> <h4>ImTranslator</h4> <p>Striking a balance between out-of-the-box ease and deep customization potential, <a href="https://addons.mozilla.org/firefox/addon/imtranslator/" rel="noreferrer noopener">ImTranslator</a> leverages three top translation engines (Google, Bing, Translator) to cover 100+ languages. </p> <div class="addon-card"></div> <p>Other strong features include text-to-speech, dictionary and spell check in eight languages, hotkey customization, and a huge assortment of ways to customize the look of ImTranslator’s interface — from light and dark themes to font size and more. </p> <h4>Immersive Translate</h4> <p>One of the most feature packed translation extensions you’ll find, <a href="https://addons.mozilla.org/firefox/addon/immersive-translate/">Immersive Translate</a> goes beyond the web to capably handle PDF’s, eBooks and much more. </p> <div class="addon-card"></div> <p>With more features than we have space to list, here are some of the most uniquely compelling capabilities of Immersive Translate.</p> <ul class="wp-block-list"><li>Smartly identifies the main content portions of a web page to provide elegant side-by-side bilingual translations while avoiding page clutter</li> <li>Mouse hover translations</li> <li>Input translation box, so you can enter text to be translated (an ideal tool for real-time bilingual conversations)</li> <li>Video subtitle translations</li> <li>Strong Desktop and mobile support</li></ul> <h4>Mate Translate</h4> <p>A slick, intuitive extension that performs all basic translation functions very well, but it’s <a href="https://addons.mozilla.org/firefox/addon/instant-translate/" rel="noreferrer noopener">Mate Translate</a>’s paid tier that unlocks some unique features, such as Sync (saved translations can appear across devices and browsers, including iPhones and Mac). </p> <div class="addon-card"></div> <p>There’s also a neat Phrasebook feature, which lets you build custom word and phrase lists so you can return to common translations you frequently need. It works offline, too, so it’s ideal for travellers who need quick reference to common foreign phrases. </p> <p>These are some of our favorites, but there are plenty <a href="https://addons.mozilla.org/firefox/search/?q=translate" rel="noreferrer noopener">more translation extensions to explore</a> on <em>addons.mozilla.org</em>.</p></description> <pubDate>Wed, 15 Oct 2025 23:14:16 +0000</pubDate> <dc:creator>Scott DeVaney</dc:creator></item><item> <title>The Mozilla Blog: Fox Recap: A student-built tool that analyzes your browsing habits</title> <guid isPermaLink="false">https://blog.mozilla.org/?p=81518</guid> <link>https://blog.mozilla.org/en/firefox/firefox-recap/</link> <description><p>What would your browser history say about you? Whether you were getting things done this week or just collecting tabs, a new Firefox extension helps you reflect on your digital habits. </p> <p>Designed as a personal productivity tool, <a href="https://addons.mozilla.org/en-US/firefox/addon/fox-recap/" rel="noreferrer noopener" target="_blank">Fox Recap</a> is a <a href="https://sites.google.com/csumb.edu/cscapstone-s2025/cs-projects/firefox-ai-platform?authuser=0" rel="noreferrer noopener" target="_blank">capstone project</a> from a group of college seniors at California State University, Monterey Bay. It categorizes your browsing history, shows how much time you’re spending on different sites, and turns that data into simple visual reports. Everything happens locally on your device, so your information stays private.</p> <p><em><strong>Related story: <a href="https://blog.mozilla.org/addons/2025/10/21/developer-spotlight-fox-recap/" rel="noreferrer noopener" target="_blank">Developer Spotlight: Fox Recap</a></strong></em></p> <p></p> <div class="wp-block-group is-content-justification-space-between is-nowrap is-layout-flex wp-container-1 wp-block-group-is-layout-flex"><figure class="wp-block-image size-large"><img alt="Gradient intro card inviting a dive into today’s browser activity overview" class="wp-image-81539" height="1024" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/08/2-607x1024.png" width="607" /></figure> <figure class="wp-block-image size-large"><img alt="Browser activity stat card showing Technology as most-clicked with 37 visits" class="wp-image-81529" height="1024" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/08/1-607x1024.png" width="607" /></figure></div> <p></p> <h3>How Fox Recap works</h3> <p>Once you <a href="https://addons.mozilla.org/en-US/firefox/addon/fox-recap/" rel="noreferrer noopener" target="_blank">download</a> and open the extension on Firefox for desktop, click on settings and grant permission to run the ML engine. From there, you can choose to view your browsing history for today, this week or this month. </p> <p>Fox Recap then lays out your activity in simple charts and categories like technology, shopping, education and entertainment.</p> <p>“It’s really a tool for you to know how you use your browser,” said one of the student developers, Taimur Hasan. “Maybe you want to lessen the amount of time you spend on entertainment, and see that you use more education sites.”</p> <p>Kate Sawtell wanted to create a tool that helps people see how they spend their time on the internet. “As a busy mom with a bunch of side projects, I love how it shows where my time online actually goes,” Kate said. “Am I researching, streaming shows or slipping into online shopping holes? It’s not super serious or judgmental, just a quick snapshot of my habits. Sometimes it makes me feel productive, other times it’s like, wow okay maybe I should chill on the shopping tab.”</p> <div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img alt="Four people standing in front of a Firefox Recap project display at California State University, Monterey Bay. From left to right: Taimur Hasan, Mozilla community manager Matt Cool, Kate Sawtell, and Diego Valdez." class="wp-image-81594" height="768" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/08/firefox_recap_2025-1024x768.jpg" style="width: 650px;" width="1024" />&lt;figcaption class="wp-element-caption"&gt;Members of the Fox Recap team at California State University, Monterey Bay, presenting their capstone project. Pictured (left to right): Taimur Hasan, Mozilla community manager Matt Cool, Kate Sawtell, and Diego Valdez. Not pictured: Peter Mitchell.&lt;/figcaption&gt;</figure></div> <h3>‘Useful AI and strong privacy can coexist’</h3> <p>Firefox machine learning engineer Tarek Ziadé served as a mentor for the project. He was struck by how quickly Taimur, Kate, Diego and Peter internalized both the technical challenges of building AI features and their privacy implications. </p> <p>“I had assumed younger developers might treat privacy as an afterthought,” Tarek said. “I was wrong. They pushed for privacy by design from the start.”</p> <p>Taimur, who trained the model himself rather than using an existing one, explained: “It’s not an off-the-shelf model that I pulled off the internet. I trained it myself using my gaming computer.”</p> <div class="wp-block-group is-nowrap is-layout-flex wp-container-2 wp-block-group-is-layout-flex"><div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img alt="" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/08/categories-1.gif" style="width: 416px;" /></figure></div> <figure class="wp-block-image size-large is-resized"><img alt="Browser activity stat card showing Technology as most-clicked with 37 visits" class="wp-image-81529" height="1024" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/08/1-607x1024.png" style="width: 416px;" width="607" /></figure></div> <p></p> <p>Tarek believes that what the group built reflects the direction in which privacy-focused technology is headed.</p> <p>“Intelligence should be local by default, data should be minimized, and anything that needs to leave the device should be explicit and consented,” Tarek said. “As AI capabilities become a commodity, the differentiator will be trust.”</p> <p>That’s exactly where Mozilla should be leading, Tarek added: “making high-quality, on-device AI the default, and proving that useful AI and strong privacy can coexist.”</p> <h3>A glimpse of the next generation of web builders</h3> <p>For team member Diego Valdez, the project’s value is personal and practical: “I hope people who use Fox Recap can learn about their browsing activity in an engaging way, in hopes [of helping them] improve their productivity.”</p> <p>Mozilla community manager Matt Cool sees it in a larger frame. “It’s a scary and exciting time to enter the tech industry,” <a href="https://mattcool.tech/posts/csumb-student-capstones-2025" rel="noreferrer noopener" target="_blank">Matt said</a>. “The next generation of open web builders is already stepping up. Right here in Monterey, they’re building real-world projects, contributing to open-source, and tackling some of the toughest problems facing the future of the web.”</p> <p>Fox Recap is one of several student projects showcased at this spring’s Capstone Festival by the School of Computing and Design at Cal State Monterey Bay. Professor Bude Su, who chairs the department, emphasized the value of mentorship as students prepare for what comes next.</p> <p>“Mozilla’s involvement brought an added layer of motivation for our students,” Professor Su said. “The opportunity to work on a real-world project under industry mentorship has been invaluable for our students’ learning and professional growth.”</p> <p>The collaboration shows what can happen when education, mentorship and Mozilla’s values of openness and trust come together. Fox Recap helps make sense of the tabs we collect, but it also points to something bigger: a new wave of developers building tools that respect the people who use them.</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="" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2021/10/Visual-Guidelines-800x800.png" width="800" /> </div> <div class="ft-c-inline-cta__content"> <h4>Take control of your internet</h4> <span>Download Firefox</span> </div></a><p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-recap/">Fox Recap: A student-built tool that analyzes your browsing habits </a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></description> <pubDate>Wed, 15 Oct 2025 17:53:49 +0000</pubDate> <dc:creator>Kristina Bravo</dc:creator></item><item> <title>The Mozilla Blog: The social media director who helps make Merriam-Webster go viral</title> <guid isPermaLink="false">https://blog.mozilla.org/?p=82268</guid> <link>https://blog.mozilla.org/en/internet-culture/interviews/merriam-webster-social/</link> <description><figure class="wp-block-image size-large"><img alt="A bearded man in a denim shirt over a dark T-shirt, against a green background with a layered pixel effect." class="wp-image-82269" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/10/MCOTI_John-Sabine-Merriam-Webster-1024x576.png" width="1024" /></figure> <p><em>Here at Mozilla, we are the first to admit the internet isn’t perfect, but we know the internet is pretty darn magical. The internet opens up doors and opportunities, allows for human connection, and lets everyone find where they belong — their corners of the internet. We all have an internet story worth sharing. In </em><a href="https://blog.mozilla.org/tag/my-corner-of-the-internet/"><em>My Corner Of The Internet</em></a><em>, we talk with people about the online spaces they can’t get enough of, the sites and forums that shaped them, and how they would design their own corner of the web.</em></p> <p><em>We caught up with John Sabine, the social media director of Merriam-Webster and Encyclopedia Britannica. He talks about his favorite subreddit, silly deep dives and why his job makes him hopeful about the internet.</em><br /></p> <h3><strong>What is your favorite corner of the internet?</strong></h3> <p>Honestly, it’s the <a href="https://www.reddit.com/r/AskHistorians/">“AskHistorians” subreddit</a>. It’s one of my few internet habits that I have that has kept up. I can’t recommend it enough. I wish more things were curated with such level of scrutiny and scholarship. If people disagree, they disagree as Ph.D. people disagree. I don’t have a Ph.D., but I imagine it’s respectful. There’s profiles and avatars, but those feel very secondary to the content. You lead with the “what,” and then you can look up the “who” afterwards. I don’t post on Reddit at all; I’m a lurker in general on the internet. So I’m shocked by how many people weigh in on things.</p> <h3><strong>What is an internet deep dive that you can’t wait to jump back into?</strong></h3> <p>I have a bunch of articles that I have bookmarked… and my goal is to read one of the 400 articles I have saved. What I’m looking forward to specifically is just to read an article for joy, that’s not doomscrolling or part of my job. I do feel like when you have this job, you kind of get <em>internet-ed</em> out every day. And also: crosswords. I want to get better at crosswords, if that counts. We have one on <a href="http://merriam-webster.com">merriam-webster.com</a>, and I also do The New York Times, though I rarely finish it.</p> <h3><strong>What’s the last great story that you read?</strong></h3> <p>It was on <a href="http://ringer.com">ringer.com</a>. A writer named <a href="https://www.theringer.com/2025/10/06/nba/best-nba-player-names-ranked-21st-century">Tyler Parker went through NBA names</a>. He just ranked their names, had nothing to do with basketball. I started it before bed, and I was like, “Oh, I’ll skim.” I read every single word. He really thought about the names and how they make people feel. And it’s truly just how they sound like. That’s it. It was written beautifully. That’s a silly one, but I think silly deep dives are probably good for the soul right now.</p> <h3><strong>What is the one tab you always regret closing?</strong></h3> <p>Probably my calendar… And honestly, I always have Merriam-Webster and Britannica up. And I rarely do close them because I always need them for my work.</p> <h3><strong>What can you not stop talking about on the internet right now?</strong></h3> <p>So Merriam-Webster is releasing <a href="https://www.merriam-webster.com/collegiate-dictionary-twelfth-edition">its first print dictionary</a> in over 20 years. And they made it really pretty, and it feels like a really cool book that you would display. I’m very excited because I’m doing deep dives of old ads for an almost 200-year-old company. There’s a lot of stuff to go through. Some of it we have in the archives, some of it is just out there. So just going through the old print stuff, finding old paper dictionaries. So, like, selfishly, I’m excited for the new collegiate 12th edition.</p> <h3><strong>What was the first online community you engaged with?</strong></h3> <p>I’m a lurker, so engagement is a lot for me. The first time I probably posted was on a forum when I moved to Chicago to do improv comedy. There’s a Chicago improv forum and I think I was like, “What show should I see?”</p> <h3><strong>What articles and/or videos are you waiting to read/watch right now?</strong></h3> <p>I’m waiting for the next [recommendation] from my <a href="https://mozillasidebar.substack.com/p/gen-z-algorithm">group chats</a>. There are some people that will just send you anything, and you’re like, “OK, thank you for sending me this. I’ll watch 30% of the things you sent.” But there’s the ones that you’re like, “Oh, yeah, gotta watch that.” So I’ve got a couple friends like that, so I hope they send me stuff because Lord knows, the internet’s huge.</p> <h3><strong>Is there anything about the way people engage with Merriam-Webster online that makes you feel hopeful about the internet?</strong></h3> <p>Oh, 4,000%. Yes, doomscrolling is a reality of being online now. I know a lot of people who just step away and go outside and touch grass.</p> <p>But there’s still good stuff happening. The comment sections on our <a href="https://www.instagram.com/merriamwebster/">Instagram</a> and <a href="https://www.tiktok.com/@merriamwebster">TikTok</a> can actually be really fun. People have genuine, kind, often funny conversations. It’s rarely mean. Seeing that makes me hopeful, because people clearly want wholesome, thoughtful interactions.<br /><br />People have a personal connection to language. Over time, I’ve seen our audience expand to include all kinds of people who care deeply about words, even if they wouldn’t call themselves “word nerds.” Language is personal, and I think our work celebrates that.</p> <p>And honestly, I feel more hopeful doing this job on the internet than I think I would if I weren’t doing this work and was just online as a regular user.</p> <hr class="wp-block-separator has-alpha-channel-opacity" /> <p><em>John Sabine is the social media director for Merriam-Webster and Encyclopedia Britannica. He is originally from Dallas, Texas, and he’s never once spelled “definitely” correctly on the first try.</em></p><p>The post <a href="https://blog.mozilla.org/en/internet-culture/interviews/merriam-webster-social/">The social media director who helps make Merriam-Webster go viral</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></description> <pubDate>Wed, 15 Oct 2025 13:00:00 +0000</pubDate> <dc:creator>Kristina Bravo</dc:creator></item><item> <title>Mozilla Performance Blog: Firefox 144 ships interactionId for INP</title> <guid isPermaLink="false">https://blog.mozilla.org/performance/?p=531</guid> <link>https://blog.mozilla.org/performance/2025/10/15/firefox-144-ships-interactionid-for-inp/</link> <description><hr /><h3>TL;DR</h3><p><b>Firefox 144</b> ships <code>PerformanceEventTiming.interactionId</code>, which lets browsers and tools group events that belong to the same user interaction. This property is used to calculate <b>Interaction to Next Paint (INP)</b>, one of the <a href="https://web.dev/articles/inp">Core Web Vitals</a>.</p><hr /><p><b>Firefox 144</b> ships support for the <code>PerformanceEventTiming.interactionId</code> property. It helps browsers and tools identify which input events belong to a single user interaction, such as a <code>pointerdown</code>, <code>pointerup</code>, and <code>click</code> triggered by the same tap.</p><p>The <b>Interaction to Next Paint (INP)</b> metric, part of the <a href="https://web.dev/articles/inp">Core Web Vitals</a>, relies on this grouping to measure how responsive a page feels during real user interactions. INP represents how long it takes for the next frame to paint after a user input. Instead of looking at a single event, it captures the worst interaction latency during the page’s lifetime, giving a more complete view of responsiveness.</p><h3>Why this matters</h3><p>Before <code>interactionId</code>, each event had to be measured separately, which made it hard to connect related events as part of the same interaction.<br />With this property, performance tools and developers can now:</p><ul><li>Group related input events into a single interaction</li><li>Measure interaction latency more accurately</li><li>Identify and debug slow interactions more easily</li></ul><h3>Using interactionId</h3><p>If you use the<a href="https://developer.mozilla.org/docs/Web/API/PerformanceObserver"> PerformanceObserver API</a> to collect <code>PerformanceEventTiming</code> entries, you’ll start seeing an <code>interactionId</code> field in Firefox 144. Events that share a non-zero <code>interactionId</code> belong to the same interaction group, which can be used to calculate latency or understand where delays occur.</p><pre style="background: #2d2d2d; color: #ccc; padding: 10px; border-radius: 6px; overflow: auto; margin-top: 0; line-height: 1.4;"><code><span style="color: #999;">// The key is the interaction ID.</span><span style="color: #cc99cd;">let</span> <span style="color: #f99157;">eventLatencies</span> = {}; <span style="color: #cc99cd;">const</span> <span style="color: #f99157;">observer</span> = <span style="color: #6699cc;">new</span> <span style="color: #6699cc;">PerformanceObserver</span>((<span style="color: #f99157;">list</span>) =&gt; { list.<span style="color: #f2777a;">getEntries</span>().<span style="color: #f2777a;">forEach</span>((<span style="color: #f99157;">entry</span>) =&gt; { <span style="color: #cc99cd;">if</span> (entry.<span style="color: #f99157;">interactionId</span> &gt; 0) { <span style="color: #cc99cd;">const</span> <span style="color: #f99157;">interactionId</span> = entry.<span style="color: #f99157;">interactionId</span>; <span style="color: #cc99cd;">if</span> (!eventLatencies[interactionId]) { eventLatencies[interactionId] = []; } eventLatencies[interactionId].<span style="color: #f2777a;">push</span>(entry.<span style="color: #f99157;">duration</span>); } });}); observer.<span style="color: #f2777a;">observe</span>({ <span style="color: #f99157;">type</span>: <span style="color: #99cc99;">"event"</span>, <span style="color: #f99157;">buffered</span>: <span style="color: #cc99cd;">true</span> }); <span style="color: #999;">// Log events with maximum event duration for a user interaction</span><span style="color: #6699cc;">Object</span>.<span style="color: #f2777a;">entries</span>(eventLatencies).<span style="color: #f2777a;">forEach</span>(([<span style="color: #f99157;">k</span>, <span style="color: #f99157;">v</span>]) =&gt; { <span style="color: #6699cc;">console</span>.<span style="color: #f2777a;">log</span>(<span style="color: #6699cc;">Math</span>.<span style="color: #f2777a;">max</span>(...v));});</code></pre><p>If you use external tools and libraries like <a href="https://github.com/GoogleChrome/web-vitals">web-vitals</a>, they should already collect the INP value for you.</p></description> <pubDate>Wed, 15 Oct 2025 12:44:26 +0000</pubDate> <dc:creator>Nazim Can Altinova</dc:creator></item><item> <title>This Week In Rust: This Week in Rust 621</title> <guid isPermaLink="false">tag:this-week-in-rust.org,2025-10-15:/blog/2025/10/15/this-week-in-rust-621/</guid> <link>https://this-week-in-rust.org/blog/2025/10/15/this-week-in-rust-621/</link> <description><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/master/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="http://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4> <h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#official">Official</a></h5><ul><li><a href="https://blog.rust-lang.org/inside-rust/2025/10/14/program-management-update-2025-09/">Program management update — September 2025</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#foundation">Foundation</a></h5><ul><li><a href="https://rustfoundation.org/media/introducing-the-rust-foundations-newest-project-directors-october-2025/">Rust Foundation Board Updates</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#newsletters">Newsletters</a></h5><ul><li><a href="https://rust-osdev.com/this-month/2025-09/">This Month in Rust OSDev: September 2025</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5><ul><li><a href="https://lwn.net/SubscriberLink/1040197/0733825193ca1f04/">Gccrs after libcore</a></li><li><a href="https://lwn.net/SubscriberLink/1039374/664ea18bb8a3c1a8/">A new API for interrupt-aware spinlocks</a></li><li><a href="https://www.rustydonkey.dev/blog/2025.10.08_introduction_to_heave/">Announcing Heave 0.1.0: an EAV data model rust library that can persist custom structs onto a SQLite DB with no friction at all!</a></li><li><a href="https://www.willsearch.com.br/?page_id=19">GuardianDB 0.10.15 - Introducing: the embedded iroh node</a></li><li><a href="https://linebender.org/blog/tmil-21/">Linebender in September 2025</a></li><li><a href="https://github.com/emilk/egui/releases/tag/0.33.0">egui 0.33.0 - <code>egui::Plugin</code>, better kerning, kitdiff viewer</a></li><li><a href="https://slint.dev/blog/making-slint-desktop-ready">Making Slint Desktop-Ready</a></li><li><a href="https://joonaa.dev/blog/09/avian-0-4">Avian Physics 0.4</a></li><li><a href="https://blog.antoyo.xyz/rustc_codegen_gcc-progress-report-38">rustc_codegen_gcc: Progress Report #38</a></li><li><a href="https://contextgeneric.dev/blog/v0-5-0-release/">CGP v0.5.0 Release - Auto dispatchers, extensible datatype improvements, monadic computation, RTN emulation, modular serde, and more</a></li><li><a href="https://blog.weiznich.de/blog/diesel-async-0-7/">Diesel-Async 0.7</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5><ul><li><a href="https://smallcultfollowing.com/babysteps/blog/2025/10/13/ergonomic-explicit-handles/">We need (at least) ergonomic, explicit handles</a></li><li><a href="https://www.ncameron.org/blog/to-panic-or-not-to-panic/">To panic or not to panic</a></li><li><a href="https://www.jessestuart.ca/posts/2025-10-10-recursive-type-state-in-rust/">Recursive type state in Rust</a></li><li><a href="https://tweedegolf.nl/en/blog/195/talk-about-memory-safety-at-one-conference">Talk about memory safety at ONE Conference</a></li><li><a href="https://www.thecodedmessage.com/posts/rust-trait-limitation/">A Little Rust Trait Limitation</a></li><li><a href="https://aloso.foo/blog/2025-10-10-effects/">Effects in Rust (and Koka)</a></li><li>[video] <a href="https://www.youtube.com/playlist?list=PLilpJp3WAOvcn5_VDv3VIkQzniMWl_BfO">Oxidize Conference 2025</a></li><li>[video] <a href="https://www.youtube.com/watch?v=nOSxuaDgl3s">Rust 2025: 400K Salaries, AI, Defence &amp; Borrow Checker — Jon Gjengset on Rust &amp; the Future of Coding</a></li><li>[audio] <a href="https://netstack.fm/#episode-9">Netstack.FM Episode 9 – gRPC with Lucio Franco</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5><ul><li><a href="https://kerkour.com/sqlite-extension-rust">Building SQLite extensions in Rust</a></li><li><a href="https://blog.0xshadow.dev/posts/backend-engineering-with-axum/axum-jwt-refresh-token/">Axum Backend Series: JWT with Refresh Token</a></li><li>[series] <a href="https://aibodh.com/posts/bevy-rust-game-development-chapter-1/">The Impatient Programmer's Guide to Bevy and Rust: Chapter 1 - Let There Be a Player</a></li><li>[series] <a href="https://aibodh.com/posts/bevy-rust-game-development-chapter-2/">The Impatient Programmer's Guide to Bevy and Rust: Chapter 2 - Let There Be a World</a></li><li>[video] <a href="https://www.youtube.com/watch?v=F04kQMKwrwQ">Building Embedded TUIs with Rust &amp; Ratatui — Tokyo Rust Meetup 2025</a></li><li>[video] <a href="https://www.youtube.com/watch?v=IkCUhGAyS9U">Build with Naz : Eliminate off by one errors with Rust type system design</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#research">Research</a></h5><ul><li><a href="https://hjaem.info/c-to-rust-papers">Papers on C-to-Rust Translation</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#miscellaneous">Miscellaneous</a></h5><ul><li><a href="https://rustnl.org/fund/">Rust Maintainers Fund - RustNL</a></li><li><a href="https://github.com/MariaLetta/free-ferris-pack">🦀 Pack of 50+ Free (CC0 license) Ferris illustrations with different emotions, poses and situations in PNG and SVG 🦀</a></li></ul><h4><a class="toclink" href="http://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/olson-sean-k/mitsein">mitsein</a>, a library of non-empty collections.</p><p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1481">Nik Revenco</a> for the suggestion!</p><p><a href="https://users.rust-lang.org/t/crate-of-the-week/2704">Please submit your suggestions and votes for next week</a>!</p><h4><a class="toclink" href="http://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 theimplementation 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/orguidance on which aspect(s) of the feature need testing.</p><ul><li><em>No calls for testing were issued this week by <a href="https://github.com/rust-lang/rust/labels/call-for-testing">Rust</a>, <a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing">Rust language RFCs</a>, <a href="https://github.com/rust-lang/cargo/labels/call-for-testing">Cargo</a> or <a href="https://github.com/rust-lang/rustup/labels/call-for-testing">Rustup</a>.</em></li></ul><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="http://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="http://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/diesel-rs/diesel/discussions/4805">Diesel - View Support - Show me your view definitions</a></li><li><a href="https://github.com/diesel-rs/diesel/issues/4760">Diesel - Add <code>#[diagnostic::do_not_recommend]</code> to <code>impl AsExpression for T: Expression</code></a></li><li><a href="https://github.com/diesel-rs/diesel/issues/4764">Diesel - Improve documentation for Postgres loading modes</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://x.com/ThisWeekInRust">X (formerly Twitter)</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#cfp-events">CFP - Events</a></h5><p>Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.</p> <ul><li><a href="https://tokio.rs/blog/2025-09-26-announcing-tokio-conf-cfp"><strong>TokioConf 2026</strong></a> | CFP closes 2025-12-08 | Portland, Oregon, USA | 2026-04-20</li></ul><p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://x.com/ThisWeekInRust">X (formerly Twitter)</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p><h4><a class="toclink" href="http://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4><p>420 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2025-10-07..2025-10-14">merged in the last week</a></p><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/147205">add a new <code>wasm32-wasip3</code> target to Rust</a></li><li><a href="https://github.com/rust-lang/rust/pull/146869">Global Variable Naming: evaluate constants lazily</a></li><li><a href="https://github.com/rust-lang/rust/pull/147423"><code>DepNodeColor</code> tweaks</a></li><li><a href="https://github.com/rust-lang/rust/pull/147483">perform InstSimplify before ReferencePropagation</a></li><li><a href="https://github.com/rust-lang/rust/pull/147477">refactor AddCallGuards in two loops</a></li><li><a href="https://github.com/rust-lang/rust/pull/147502">split <code>overlapping_{inherent,trait}_impls</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/145513">validate <code>CopyForDeref</code> and <code>DerefTemps</code> better and remove them from runtime MIR</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#library">Library</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/147124">move more code to <code>RawVec::finish_grow</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/146568">port the implemention of SIMD intrinsics from Miri to const-eval</a></li><li><a href="https://github.com/rust-lang/rust/pull/147457">specialize <code>slice::fill</code> to use memset when possible</a></li><li><a href="https://github.com/rust-lang/rust/pull/147562">stabilize <code>NonZero&lt;u*&gt;::div_ceil</code></a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6><ul><li><a href="https://github.com/rust-lang/cargo/pull/15947">Reorganize build-dir layout</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16063">add: Report a missing source error for workspace dependencies</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16064">script: Default bin.name to package.name</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16087">script: Store cargo script lockfiles in build-dir</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16081">tree: Switch from <code>--depth public</code> to <code>--edges public</code></a></li><li><a href="https://github.com/rust-lang/cargo/pull/16082">allow to rustfix <code>unused_variables</code> lint</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16075">fix regression that swallowed json diagnostic explanations</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rustdoc">Rustdoc</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/147402">rustdoc: Don't serialize &amp; deserialize data that doesn't go over the wire</a></li><li><a href="https://github.com/rust-lang/rust/pull/147443">rustdoc: a small performance improvement: only allocate new string if there are DOS backlines in highlight.rs</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6><ul><li><a href="https://github.com/rust-lang/rust-clippy/pull/15843"><code>multiple_inherent_impl</code>: Add config option to target specific scope</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15826"><code>zero_repeat_side_effects</code>: don't suggest unnecessary braces around stmts</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15740"><code>clone_on_ref_ptr</code>: only name the generic type if possible</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15608"><code>collapsible_match</code>: exclude binding modes from <code>struct</code> field pattern suggestions</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15815"><code>zero_repeat_side_effects</code>: don't suggest unsuggestable types</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15816"><code>legacy_numeric_constants</code>: add ctxt check for internal macro</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15812"><code>manual_unwrap_or</code>: fix false positive edge case</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15847"><code>get_unwrap</code>: avoid calling <code>is_type_diagnostic_item</code> multiple times</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/14953">add <code>replace_box</code> lint</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/14662">add lint <code>unnecessary_option_map_or_else</code></a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15566">check structs and enums for <code>use_self</code></a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15547">fix <code>needless_continue</code> false positive when match type is not unit or never</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15849">honor <code>allow</code>/<code>expect</code> attributes on ADT and <code>impl Clone</code> nodes</a></li></ul><h6><a class="toclink" href="http://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/19771">add ide-assist: generate blanket trait impl</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20812">add self param completions for trait assoc fn</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20804">build rust-analyzer with <code>--target</code> for install/pgo xtask</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20526">fix .let completion not working for let-chain</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20816">fix closure coerced return type for <code>add_return_type</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20824">fix empty closure completion analysis</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20788">fix not applicable c-str and byte-str for <code>raw_string</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20817">fix not applicable on param in let-stmt for <code>add_explicit_type</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20805">improve parsing error for <code>static</code> and <code>const</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20803">replace <code>--show-output</code> task defaults with <code>--nocapture</code></a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5><p>This week saw small wins across the board from some microoptimizations of the incremental querysystem (<a href="https://github.com/rust-lang/rust/pull/147423">#147423</a>). There have also been a couple ofregressions. <a href="https://github.com/rust-lang/rust/pull/142390">#142390</a> introduced regressions of <code>check</code>builds across the board. The largest regression (18%) is from an incremental opt build of a secondaryartificial stress test, so we deemed it acceptable.</p><p>Triage done by <strong>@kobzol</strong>.</p><p>Revision range: <a href="https://perf.rust-lang.org/?start=1a3cdd34629306fa67624eaa60d73687e7fcf855&amp;end=956f47c32f1bd97b22cd702d7ccf78f0f0d42c34&amp;absolute=false&amp;stat=instructions%3Au">1a3cdd34..956f47c3</a></p><p><strong>Summary</strong>:</p><table><thead><tr><th align="center">(instructions:u)</th><th align="center">mean</th><th align="center">range</th><th align="center">count</th></tr></thead><tbody><tr><td align="center">Regressions ❌ <br /> (primary)</td><td align="center">0.7%</td><td align="center">[0.1%, 2.0%]</td><td align="center">65</td></tr><tr><td align="center">Regressions ❌ <br /> (secondary)</td><td align="center">0.8%</td><td align="center">[0.1%, 18.6%]</td><td align="center">65</td></tr><tr><td align="center">Improvements ✅ <br /> (primary)</td><td align="center">-0.6%</td><td align="center">[-1.6%, -0.1%]</td><td align="center">119</td></tr><tr><td align="center">Improvements ✅ <br /> (secondary)</td><td align="center">-0.4%</td><td align="center">[-1.6%, -0.1%]</td><td align="center">76</td></tr><tr><td align="center">All ❌✅ (primary)</td><td align="center">-0.1%</td><td align="center">[-1.6%, 2.0%]</td><td align="center">184</td></tr></tbody></table><p>2 Regressions, 7 Improvements, 3 Mixed; 3 of them in rollups35 artifact comparisons made in total</p><p><a href="https://github.com/rust-lang/rustc-perf/blob/b4b30e719c7083141669f79edfdf20e685cf918f/triage/2025/2025-10-13.md">Full report here</a>.</p><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#approved-rfcs"></a><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>. Theseare 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="http://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 PRswhich are reaching a decision. Express your opinions now.</p><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust"></a><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Rust</a><ul><li><a href="https://github.com/rust-lang/rust/pull/147258">iter repeat: panic on last</a></li><li><a href="https://github.com/rust-lang/rust/issues/146939">Tracking Issue (take 2) for <code>more_float_constants</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/146098">Temporary lifetime extension for blocks</a></li><li><a href="https://github.com/rust-lang/rust/pull/140463">Document MaybeUninit bit validity</a></li><li><a href="https://github.com/rust-lang/rust/pull/147382">unused_must_use: Don't warn on <code>Result&lt;(), Uninhabited&gt;</code> or <code>ControlFlow&lt;Uninhabited, ()&gt;</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/146961">Allow passing <code>expr</code> metavariable to <code>cfg</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/147022">Remove current code for embedding command-line args in PDB</a></li><li><a href="https://github.com/rust-lang/rust/pull/146725"><code>-Znext-solver</code> instantiate predicate binder without recanonicalizing goal</a></li></ul><a class="toclink" href="http://this-week-in-rust.org/atom.xml#cargo_1"></a><a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Cargo</a><ul><li><a href="https://github.com/rust-lang/cargo/issues/7614">Should build-plans be deleted?</a></li></ul><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust-rfcs"></a><a href="https://github.com/rust-lang/rfcs/labels/final-comment-period">Rust RFCs</a><ul><li><a href="https://github.com/rust-lang/rfcs/pull/3848">Pass pointers to <code>const</code> in assembly</a></li></ul><a class="toclink" href="http://this-week-in-rust.org/atom.xml#leadership-council"></a><a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period">Leadership Council</a><ul><li><a href="https://github.com/rust-lang/leadership-council/issues/232">Delegate GSoC money spending to the t-mentorship team</a></li></ul><p><em>No Items entered Final Comment Period this week for <a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc+">Language Team</a>, <a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Language Reference</a> or <a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">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><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"></a><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h6><ul><li><em>No New or Updated RFCs were created this week.</em></li></ul><h4><a class="toclink" href="http://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4><p>Rusty Events between 2025-10-15 - 2025-11-12 🦀</p><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5><ul><li>2025-10-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/307731034/"><strong>indielinks</strong></a></li></ul></li><li>2025-10-16 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/o8fh3fh7"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-10-16 | 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/306046668/"><strong>Rust Nürnberg online</strong></a></li></ul></li><li>2025-10-18 | Virtual (Gdansk/Kraków/Wroclaw, PL) | <a href="https://www.meetup.com/stacja-it-trojmiasto/">Stacja IT Trójmiasto</a><ul><li><a href="https://www.meetup.com/stacja-it-trojmiasto/events/310935164/"><strong>[BEZPŁATNIE] Programowanie w języku Rust</strong></a> | <a href="https://www.meetup.com/stacja-it-krakow/events/310935157/">Kraków Mirror</a> | <a href="https://www.meetup.com/stacja-it-wroclaw/events/310935159/">Wroclaw Mirror</a></li></ul></li><li>2025-10-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/311109167/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-10-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/311068625/"><strong>👋 Community Catch Up</strong></a></li></ul></li><li>2025-10-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/310002307/"><strong>Mid-month Rustful</strong></a></li></ul></li><li>2025-10-22 | Virtual (Boulder, CO, US) | <a href="https://www.meetup.com/boulder-elixir/events/">Boulder Elixir</a><ul><li><a href="https://www.meetup.com/boulder-elixir/events/310996627/"><strong>Integrating Elixir and Apache DataFusion with Rustler</strong></a></li></ul></li><li>2025-10-22 | Virtual (Buenos Aires, AR) | <a href="https://www.meetup.com/es-ES/net-baires/">[Net-Baires] Comunidad de .NET en Buenos Aires</a><ul><li><a href="https://www.meetup.com/es-ES/net-baires/events/311365783/"><strong>Rust para devs .NET | Community Standup #10</strong></a></li></ul></li><li>2025-10-23 | Hybrid (Seattle/Bellevue, 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/311351020/"><strong>October, 2025 SRUG (Seattle Rust User Group) Meetup</strong></a></li></ul></li><li>2025-10-23 | 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/306046641/"><strong>Rust Hack and Learn</strong></a></li></ul></li><li>2025-10-23 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/zyc3touy"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-10-26 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul><li><a href="https://www.meetup.com/dallasrust/events/311109171/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-10-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/305361444/"><strong>Fourth Tuesday</strong></a></li></ul></li><li>2025-10-30 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/t8yovmmm"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-11-01 | Virtual (Kampala, UG) | <a href="https://www.eventbrite.com/o/rust-circle-kampala-65249289033">Rust Circle Meetup</a><ul><li><a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763868657"><strong>Rust Circle Meetup</strong></a></li></ul></li><li>2025-11-02 | 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/311109173/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-11-05 | Virtual (Buffalo, NY, US) | <a href="https://www.meetup.com/buffalo-rust-meetup">Buffalo Rust Meetup</a><ul><li><a href="https://www.meetup.com/buffalo-rust-meetup/events/305304242/"><strong>Buffalo Rust User Group</strong></a></li></ul></li><li>2025-11-05 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul><li><a href="https://www.meetup.com/indyrs/events/wqzhftyhcpbhb/"><strong>Indy.rs - with Social Distancing</strong></a></li></ul></li><li>2025-11-06 | 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/305646021/"><strong>Rust Hack and Learn</strong></a></li></ul></li><li>2025-11-06 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/xkd84gfz"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-11-09 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust/events/">Dallas Rust User Meetup</a><ul><li><a href="https://www.meetup.com/dallasrust/events/311109175/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-11-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/305361536/"><strong>Second Tuesday</strong></a></li></ul></li><li>2025-11-11 | 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/311068632/"><strong>👋 Community Catch Up</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#asia">Asia</a></h5><ul><li>2025-10-20 | Tel Aviv-yafo, IL | <a href="https://www.meetup.com/rust-tlv">Rust 🦀 TLV</a><ul><li><a href="https://www.meetup.com/rust-tlv/events/310628902/"><strong>In person Rust October 2025 at AWS in Tel Aviv</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#europe">Europe</a></h5><ul><li>2025-10-21 | Aarhus, DK | <a href="https://www.meetup.com/rust-aarhus">Rust Aarhus</a><ul><li><a href="https://www.meetup.com/rust-aarhus/events/311035141/"><strong>Hack Night</strong></a></li></ul></li><li>2025-10-21 | Bergen, NO | <a href="https://www.meetup.com/bergen-rust-new-technology/events/">Rust Bergen</a><ul><li><a href="https://www.meetup.com/bergen-rust-new-technology/events/311153821/"><strong>Rust Meetup #01 @ Zrch</strong></a></li></ul></li><li>2025-10-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/308592252/"><strong>Topic TBD</strong></a></li></ul></li><li>2025-10-21 | 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/310813952/"><strong>Rust in Surgery: Powering the Data Pipelines</strong></a></li></ul></li><li>2025-10-23 | Edinburgh, UK | <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/311501254/"><strong>Rust and Friends (evening pub)</strong></a></li></ul></li><li>2025-10-24 | Edinburgh, UK | <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/311501249/"><strong>Rust and Friends (daytime coffee)</strong></a></li></ul></li><li>2025-10-28 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul><li><a href="https://www.meetup.com/rust-manchester/events/307919171/"><strong>Rust Manchester October Code Night</strong></a></li></ul></li><li>2025-10-29 | 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/311251545/"><strong>Rust Dortmund Meetup October 2025</strong></a></li></ul></li><li>2025-10-30 | 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/311405044/"><strong>Rust meetup #62 sponsored by Google!</strong></a></li></ul></li><li>2025-10-30 | Prague, CZ | <a href="https://www.meetup.com/rust-prague">Rust Prague</a><ul><li><a href="https://www.meetup.com/rust-prague/events/310967094/"><strong>Rust Meetup Prague (October 2025)</strong></a></li></ul></li><li>2025-11-02 - 2025-11-04 | Florence, IT | <a href="https://rustlab.it/">Rustlab 2025</a><ul><li><a href="https://rustlab.it/"><strong>Rustlab 2025</strong></a></li></ul></li><li>2025-11-04 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul><li><a href="https://www.meetup.com/rust-manchester/events/310921632/"><strong>Rust Manchester November Talk</strong></a></li></ul></li><li>2025-11-05 | Girona, ES | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/xl8ob0tn"><strong>Rust Girona Hack &amp; Learn 11 2025</strong></a></li></ul></li><li>2025-11-05 | Oslo, NO | <a href="https://www.meetup.com/rust-oslo">Rust Oslo</a><ul><li><a href="https://www.meetup.com/rust-oslo/events/310601872/"><strong>Rust Hack'n'Learn at Kampen Bistro</strong></a></li></ul></li><li>2025-11-05 | 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/nnrkttyhcpbhb/"><strong>Rust/ACCU meetup.</strong></a></li></ul></li><li>2025-11-06 | Gdansk, PL | <a href="https://www.meetup.com/rust-gdansk/events/">Rust Gdansk</a><ul><li><a href="https://www.meetup.com/rust-gdansk/events/310924266/"><strong>Rust Gdansk Meetup #11</strong></a></li></ul></li><li>2025-11-12 | Reading, UK | <a href="https://www.meetup.com/reading-rust-workshop/events/">Reading Rust Workshop</a><ul><li><a href="https://www.meetup.com/reading-rust-workshop/events/308944050/"><strong>Reading Rust Meetup</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#north-america">North America</a></h5><ul><li>2025-10-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/307731034/"><strong>indielinks</strong></a></li></ul></li><li>2025-10-16 | 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/311012947/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li></ul></li><li>2025-10-16 | San Francisco, CA, US | <a href="https://luma.com/calendar/cal-Cnmn4RR2n4fRUNZ">Svix</a><ul><li><a href="https://luma.com/tp6w7tc9"><strong>San Francisco Rust Meetup</strong></a></li></ul></li><li>2025-10-21 | San Francisco, CA, US | <a href="https://luma.com/events-by-vara-gear">Vara &amp; Gear</a><ul><li><a href="https://luma.com/kbs2os1c"><strong>Rust Workshop by Vara Network</strong></a></li></ul></li><li>2025-10-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/308284343/"><strong>Rust Hacking in Person</strong></a></li></ul></li><li>2025-10-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/310457307/"><strong>Rust Lunch - Fareground</strong></a></li></ul></li><li>2025-10-23 | Hybrid (Seattle/Bellevue, 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/311351020/"><strong>October, 2025 SRUG (Seattle Rust User Group) Meetup</strong></a></li></ul></li><li>2025-10-23 | Nashville, TN, US | <a href="https://www.meetup.com/music-city-rust-developers">Music City Rust Developers</a><ul><li><a href="https://www.meetup.com/music-city-rust-developers/events/304333267/"><strong>Year In Review</strong></a></li></ul></li><li>2025-10-23 | Spokane, WA, US | <a href="https://www.meetup.com/spokane-rust">Spokane Rust</a><ul><li><a href="https://www.meetup.com/spokane-rust/events/311346444/"><strong>October Rust Meetup: A Special Presentation and Monthly Meetups are Back!</strong></a></li></ul></li><li>2025-10-25 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul><li><a href="https://www.meetup.com/bostonrust/events/310983712/"><strong>Porter Square Rust Lunch, Oct 25</strong></a></li></ul></li><li>2025-10-29 | 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/311541108/"><strong>Rust NYC: Scalable static analysis: confronting the halting problem</strong></a></li></ul></li><li>2025-10-30 | 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/308675988/"><strong>Rust-Atl</strong></a></li></ul></li><li>2025-10-30 | 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/311273832/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li></ul></li><li>2025-11-01 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul><li><a href="https://www.meetup.com/bostonrust/events/311039492/"><strong>Chinatown Rust Lunch, Nov 1</strong></a></li></ul></li><li>2025-11-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/307251982/"><strong>SIUE students on wasm 3D animations</strong></a></li></ul></li><li>2025-11-08 | 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/311039501/"><strong>Winter Hill Rust Lunch, Nov 8</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5><ul><li>2025-10-22 | 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/310847099/"><strong>October Meetup</strong></a></li></ul></li><li>2025-10-28 | 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/311234237/"><strong>October Meetup</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#south-america">South America</a></h5><ul><li>2025-10-22 | Montevideo, UY | <a href="https://www.meetup.com/rust-uruguay/events/">Rust Meetup Uruguay</a><ul><li><a href="https://www.meetup.com/rust-uruguay/events/311475675/"><strong>Rust Uruguay meetup de Octubre</strong></a></li></ul></li><li>2025-10-25 | São Paulo, BR | <a href="https://www.meetup.com/rust-sao-paulo-meetup">Rust São Paulo Meetup</a><ul><li><a href="https://www.meetup.com/rust-sao-paulo-meetup/events/311084440/"><strong>Encontro do Rust-SP na Amazon Web Services</strong></a></li></ul></li><li>2025-10-30 | Florianopolis, BR | <a href="https://luma.com/calendar/cal-iOloL5ZqswCO5Mm">Rust Brasil</a><ul><li><a href="https://luma.com/lky7an18"><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 getit 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="http://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/1nknaii/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p><h3><a class="toclink" href="http://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3><blockquote><p>Pointers are quite hard.</p></blockquote><p>– Tim McNamara</p><blockquote><p>And, as the name implies, pointy.</p></blockquote><p>– <a href="https://www.linkedin.com/feed/update/urn:li:activity:7381109081857724416?commentUrn=urn%3Ali%3Acomment%3A%28activity%3A7381109081857724416%2C7381113605926166528%29&amp;dashCommentUrn=urn%3Ali%3Afsd_comment%3A%287381113605926166528%2Curn%3Ali%3Aactivity%3A7381109081857724416%29">llogiq on LinkedIn</a></p><p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1721">llogiq</a> for the self-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><em>This Week in Rust is edited by: <a href="https://github.com/nellshamrell">nellshamrell</a>, <a href="https://github.com/llogiq">llogiq</a>, <a href="https://github.com/cdmistman">cdmistman</a>, <a href="https://github.com/ericseppanen">ericseppanen</a>, <a href="https://github.com/extrawurst">extrawurst</a>, <a href="https://github.com/U007D">U007D</a>, <a href="https://github.com/joelmarcey">joelmarcey</a>, <a href="https://github.com/mariannegoldin">mariannegoldin</a>, <a href="https://github.com/bennyvasquez">bennyvasquez</a>, <a href="https://github.com/bdillo">bdillo</a></em></p><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/1o7upmn/this_week_in_rust_621/">Discuss on r/rust</a></small></p></description> <pubDate>Wed, 15 Oct 2025 04:00:00 +0000</pubDate> <dc:creator>TWiR Contributors</dc:creator></item><item> <title>The Rust Programming Language Blog: Announcing the New Rust Project Directors</title> <guid isPermaLink="true">https://blog.rust-lang.org/2025/10/15/announcing-the-new-rust-project-directors-2025/</guid> <link>https://blog.rust-lang.org/2025/10/15/announcing-the-new-rust-project-directors-2025/</link> <description><p>We are happy to announce that we have completed the annual process to elect new Project Directors.</p><p>The new Project Directors are:</p><ul><li><a href="https://github.com/davidtwco/">David Wood</a></li><li><a href="https://github.com/jackh726/">Jack Huey</a></li><li><a href="https://github.com/nikomatsakis/">Niko Matsakis</a></li></ul><p>They will join <a href="https://github.com/rylev">Ryan Levick</a> and <a href="https://github.com/carols10cents">Carol Nichols</a> to make up the five members of the Rust Foundation Board of Directors who represent the Rust Project.</p><p>We would also like to thank the outgoing going Project Directors for contributions and service:</p><ul><li><a href="https://github.com/JakobDegen">Jakob Degen</a></li><li><a href="https://github.com/spastorino">Santiago Pastorino</a></li><li><a href="https://github.com/scottmcm">Scott McMurray</a></li></ul><p>The board is made up of Project Directors, who come from and represent the Rust Project, and Member Directors, who represent the corporate members of the Rust Foundation. Both of these director groups have equal voting power.</p><p>We look forward to working with and being represented by this new group of project directors.</p><p>We were fortunate to have a number of excellent candidates and this was a difficult decision. We wish to express our gratitude to all of the candidates who were considered for this role! We also extend our thanks to the project as a whole who participated by nominating candidates and providing additional feedback once the nominees were published.</p><p>Finally, we want to share our appreciation for <a href="https://github.com/tomassedovic">Tomas Sedovic</a> for facilitating the election process. An overview of the election process can be found in a previous blog post <a href="https://blog.rust-lang.org/2023/08/30/electing-new-project-directors/">here</a>.</p></description> <pubDate>Wed, 15 Oct 2025 00:00:00 +0000</pubDate> <dc:creator>Leadership Council</dc:creator></item><item> <title>Firefox Developer Experience: Firefox WebDriver Newsletter 144</title> <guid isPermaLink="false">https://fxdx.dev/?p=515</guid> <link>https://fxdx.dev/firefox-webdriver-newsletter-144/</link> <description><p>W<em>ebDriver is a remote control interface that enables introspection and control of user agents.</em> <em>As such it</em> <em>can</em> <em>help developers to verify that their websites are working and performing well with all major browsers. The protocol is standardized by the</em><a href="https://www.w3.org/"><em> W3C</em></a><em> and consists of two separate specifications:</em><a href="https://w3c.github.io/webdriver/"><em> WebDriver classic</em></a><em> (HTTP) and the new</em><a href="https://w3c.github.io/webdriver-bidi/"><em> WebDriver BiDi</em></a><em> (Bi-Directional).</em></p> <p><em>This newsletter gives an overview of the work we’ve done as part of the Firefox 144 release cycle</em>.</p> <h3>Contributions</h3> <p>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>WebDriver code is written in JavaScript, Python, and Rust so any web developer can contribute! Read<a href="https://firefox-source-docs.mozilla.org/devtools/getting-started/README.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>WebDriver BiDi</h3> <ul><li>Implemented the new <a href="https://bugzil.la/1874365"><code>browsingContext.downloadWillBegin</code> event</a>, which is emitted when a new download is initiated, either by clicking a link with the <code>download</code> attribute, or in response to a network request with a <code>Content-Disposition</code> header indicating a file attachment.</li> <li>Implemented the new <a href="https://bugzil.la/1974167"><code>emulation.setScreenOrientationOverride</code> command</a>, which allows clients to emulate different screen orientations. This command is not limited to mobile devices, but also works for desktop applications.</li> <li>Implemented the new <a href="https://bugzil.la/1978027"><code>emulation.setTimezoneOverride</code> command</a>, which allows clients to simulate a specific timezone setting.</li> <li>Enhanced the <a href="https://bugzil.la/1983807"><code>emulation.setLocaleOverride</code> command</a> to also apply the specified settings to sandboxes previously created via WebDriver BiDi.</li> <li>Fixed a bug where <a href="https://bugzil.la/1980211">the locale override set via <code>emulation.setLocaleOverride</code> was sometimes incorrectly shared between different browsing contexts within the same process</a>.</li> <li><a href="https://bugzil.la/1914407">Enhanced the <code>browsingContext.navigate</code> command to avoid <code>NS_BINDING_ABORTED</code> errors</a> caused by redirects or interruptions occurring after the navigation was already committed.</li></ul> <h3>Marionette</h3> <ul><li><a href="https://bugzil.la/1986238">Reverted the <code>Scroll Into View</code> WebDriver algorithm as used by several WebDriver classic commands in Marionette to always use the <code>instant</code> scroll behavior</a>. This undoes the change introduced in Firefox 97, which had switched the behavior to <code>auto</code>. The reversion addresses potential race conditions when scrolling elements that use <code>smooth</code> behavior.</li></ul></description> <pubDate>Tue, 14 Oct 2025 13:25:20 +0000</pubDate> <dc:creator>Henrik Skupin</dc:creator></item><item> <title>The Mozilla Blog: Choose how you search and stay organized with Firefox</title> <guid isPermaLink="false">https://blog.mozilla.org/?p=82237</guid> <link>https://blog.mozilla.org/en/firefox/firefox-144/</link> <description><figure class="wp-block-image size-large is-style-default"><img alt="llustration showing Firefox’s browser interface with a focus on search options. A bar labeled “Use visual search” overlaps an image of a floral painting, while another option labeled “with the Perplexity icon” appears below it. A small browser window shows a cropped view of the same artwork. The Firefox toolbar is visible at the bottom with a highlighted smiley face icon. The background is a gradient of purple and blue with grid lines and sparkles, conveying a playful, tech-inspired design." class="wp-image-82258" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/10/Firefox-ProfileManagement-1920x1080-Static-v1.3-Dark2-1024x576.png" width="1024" /></figure> <p>At Mozilla, we build Firefox around one principle: putting you in control. With today’s release, we’re introducing new features that make browsing smarter and more personal while staying true to the values you care about most: privacy and choice.</p> <h3><strong>A new option for search, still on your terms.</strong></h3> <p>Earlier this year, we gave you more choice in how you search by <a href="https://connect.mozilla.org/t5/discussions/try-out-perplexity-ai-search-in-firefox-139/m-p/98352">testing</a> <a href="https://www.perplexity.ai/">Perplexity</a>, an AI-powered answer engine, as a search option on Firefox. Now, after positive feedback, we’re making it a fixture, rolling it out to more users for desktop. Perplexity provides conversational answers with citations, so you can validate information without digging through pages of results.</p> <p>This addition reflects our shared commitment to choice: You decide when to use an AI answer engine, or if you want to use it at all. Available globally, Perplexity can be found in the unified search button in the address bar. We’ll be bringing Perplexity to mobile in the coming months. And as always, privacy matters – <a href="https://www.perplexity.ai/hub/legal/privacy-policy">Perplexity</a> maintains strict prohibitions against selling or sharing personal data.</p> <h3><strong>Organize your life with profiles</strong></h3> <p class="has-text-align-left">At the beginning of the year, we started <a href="https://connect.mozilla.org/t5/discussions/try-out-firefox-profiles-in-nightly/m-p/84223">testing</a> <a href="https://blog.mozilla.org/en/firefox/profile-management/">profiles</a> — a way to create and switch between different browsing setups. After months of gradual rollout and <a href="https://blog.mozilla.org/en/firefox/shifting-left-for-better-accessibility/">community feedback</a>, profiles are now <a href="https://blog.mozilla.org/en/firefox/profile-management/">available</a> to everyone.</p> <div class="wp-block-image is-style-default"><figure class="aligncenter size-large is-resized"><img alt="Firefox Profiles feature shown with an illustration of three foxes and a setup screen for creating and customizing browser profiles." class="wp-image-82095" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/10/firefox-profiles-1024x576.png" style="width: 675px;" width="1024" />&lt;figcaption class="wp-element-caption"&gt;<em>Create and switch between different browsing setups</em>&lt;/figcaption&gt;</figure></div> <p>Profiles let you keep work tabs distinct from personal browsing, or dedicate a setup to testing extensions or managing a specific project. Each profile runs independently, giving you flexibility and focus. Feedback from students, professionals and contributors helped us refine this feature into the version you see today.</p> <h3><strong>Discover more with visual search</strong></h3> <p>In September, we <a href="https://connect.mozilla.org/t5/discussions/new-in-firefox-desktop-only-visual-search/m-p/106216">announced</a> visual search on <a href="https://connect.mozilla.org/">Mozilla Connect</a> and began rolling it out for testing. Powered by Google Lens, it lets you search what you see with a simple right-click on any image.</p> <div class="wp-block-image"><figure class="aligncenter size-full"><img alt="" class="wp-image-82248" height="396" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/10/image.png" width="464" />&lt;figcaption class="wp-element-caption"&gt;<em>Search what you see with a simple right-click on an image</em>&lt;/figcaption&gt;</figure></div> <p>You can:</p> <ul><li>Find similar products, places or objects </li> <li>Copy, translate or search text from images</li> <li>Get inspiration for learning, travel or research</li></ul> <p>This desktop-only feature makes searching more intuitive and curiosity-driven. For now, it requires Google as your default search engine. Tell us what you think. Your feedback will guide where visual search appears next, from the address bar to mobile.</p> <h3><strong>Evolving to meet your needs</strong></h3> <p>Today’s release brings more ways to browse on your terms — from smarter search with Perplexity, to profiles that let you separate work from play, to visual search.</p> <p>Each of these features reflects what matters most to us: putting you in control of your online experience and building alongside the community that inspires Firefox. With your feedback, we’ll keep shaping a browser that not only keeps pace with the future of the web but also stays true to the open values you trust.</p> <p>We’re excited to see how you use what’s new, and can’t wait to share what’s next.</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="" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2021/10/Visual-Guidelines-800x800.png" width="800" /> </div> <div class="ft-c-inline-cta__content"> <h4>Take control of your internet</h4> <span>Download Firefox</span> </div></a><p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-144/">Choose how you search and stay organized with Firefox</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></description> <pubDate>Tue, 14 Oct 2025 13:00:00 +0000</pubDate> <dc:creator>Jenifer Boscacci</dc:creator></item><item> <title>Niko Matsakis: We need (at least) ergonomic, explicit handles</title> <guid isPermaLink="false">https://smallcultfollowing.com/babysteps/blog/2025/10/13/ergonomic-explicit-handles/</guid> <link>https://smallcultfollowing.com/babysteps/blog/2025/10/13/ergonomic-explicit-handles/?utm_source=atom_feed</link> <description><p>Continuing my discussion on Ergonomic RC, I want to focus on the core question: <strong>should users have to explicitly invoke handle/clone, or not?</strong> This whole “Ergonomic RC” work was originally proposed by <a href="https://dioxuslabs.com/">Dioxus</a> and their answer is simple: <strong>definitely not</strong>. For the kind of high-level GUI applications they are building, having to call <code>cx.handle()</code> to clone a ref-counted value is pure noise. For that matter, for a lot of Rust apps, even cloning a string or a vector is no big deal. On the other hand, for a lot of applications, the answer is <strong>definitely yes</strong> – knowing where handles are created can impact performance, memory usage, and even correctness (don’t worry, I’ll give examples later in the post). So how do we reconcile this?</p><p><strong>This blog argues that we should make it ergonomic to be explicit</strong>. This wasn’t always my position, but after an impactful conversation with Josh Triplett, I’ve come around. I think it aligns with what I once called the <a href="https://smallcultfollowing.com/babysteps//blog/2022/09/18/dyn-async-traits-part-8-the-soul-of-rust/">soul of Rust</a>: we want to be ergonomic, yes, but we want to be <strong>ergonomic while giving control</strong><sup id="fnref:1"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:1">1</a></sup>.</p><p>I like Tyler Mandry’s <a href="https://tmandry.gitlab.io/blog/posts/the-main-thing/"><em>Clarity of purpose</em></a> contruction, <em>“Great code brings only the important characteristics of your application to your attention”</em>. The key point is that <em>there is great code in which cloning and handles are important characteristics</em>, so we need to make that code possible to express nicely. This is particularly true since Rust is one of the very few languages that really targets that kind of low-level, foundational code.</p><p><strong>This does not mean we cannot (later) support automatic clones and handles.</strong> It’s inarguable that this would benefit clarity of purpose for a lot of Rust code. But I think we should focus <em>first</em> on the harder case, the case where explicitness is needed, and <strong>get that as nice as we can</strong>; then we can circle back and decide whether to also support something automatic. One of the questions for me, in fact, is whether we can get “fully explicit” to be <em>nice enough</em> that we don’t really need the automatic version. There are benefits from having “one Rust”, where all code follows roughly the same patterns, where those patterns are perfect some of the time, and don’t suck too bad<sup id="fnref:2"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:2">2</a></sup> when they’re overkill.</p><h3>“Rust should not surprise you.” (hat tip: Josh Triplett)</h3><p>I mentioned this blog post resulted from a long conversation with Josh Triplett<sup id="fnref:3"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:3">3</a></sup>. The key phrase that stuck with me from that conversation was: <em>Rust should not surprise you</em>. The way I think of it is like this. Every programmer knows what its like to have a marathon debugging session – to sit and state at code for days and think, <em>but… how is this even POSSIBLE?</em> Those kind of bug hunts can end in a few different ways. Occasionally you uncover a deeply satisfying, subtle bug in your logic. More often, you find that you wrote <code>if foo</code> and not <code>if !foo</code>. And <em>occasionally</em> you find out that your language was doing something that you didn’t expect. That some simple-looking code concealed a subltle, complex interaction. People often call this kind of a <em>footgun</em>.</p><p>Overall, Rust is <em>remarkably</em> good at avoiding footguns<sup id="fnref:4"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:4">4</a></sup>. And part of how we’ve achieved that is by making sure that things you might need to know are visible – like, explicit in the source. Every time you see a Rust match, you don’t have to ask yourself “what cases might be missing here” – the compiler guarantees you they are all there. And when you see a call to a Rust function, you don’t have to ask yourself if it is fallible – you’ll see a <code>?</code> if it is.<sup id="fnref:5"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:5">5</a></sup></p><h4>Creating a handle can definitely “surprise” you</h4><p>So I guess the question is: <em>would you ever have to know about a ref-count increment</em>? The trick part is that the answer here is application dependent. For some low-level applications, definitely yes: an atomic reference count is a measurable cost. To be honest, I would wager that the set of applications where this is true are vanishingly small. And even in those applications, Rust already improves on the state of the art by giving you the ability to choose between <code>Rc</code> and <code>Arc</code> <em>and then proving that you don’t mess it up</em>.</p><p>But there are other reasons you might want to track reference counts, and those are less easy to dismiss. One of them is memory leaks. Rust, unlike GC’d languages, has <em>deterministic destruction</em>. This is cool, because it means that you can leverage destructors to manage all kinds of resources, as Yehuda wrote about long ago in his classic ode-to-<a href="https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization">RAII</a> entitled <a href="https://blog.skylight.io/rust-means-never-having-to-close-a-socket/">“Rust means never having to close a socket”</a>. But although the points where handles are created and destroyed is deterministic, the nature of reference-counting can make it much harder to predict when the underlying resource will actually get freed. And if those increments are not visible in your code, it is that much harder to track them down.</p><p>Just recently, I was debugging <a href="http://smallcultfollowing.com/babysteps/atom.xml">Symposium</a>, which is written in Swift. Somehow I had two <code>IPCManager</code> instances when I only expected one, and each of them was responding to every IPC message, wreaking havoc. Poking around I found stray references floating around in some surprising places, which was causing the problem. Would this bug have still occurred if I had to write <code>.handle()</code> explicitly to increment the ref count? Definitely, yes. Would it have been easier to find after the fact? Also yes.<sup id="fnref:6"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:6">6</a></sup></p><p>Josh gave me a similar example from <a href="https://docs.rs/bytes/latest/bytes/">the “bytes” crate</a>. A <a href="https://docs.rs/bytes/latest/bytes/struct.Bytes.html"><code>Bytes</code></a> type is a <a href="https://smallcultfollowing.com/babysteps/ /blog/2025/10/07/the-handle-trait/">handle</a> to a slice of some underlying memory buffer. When you clone that handle, it will keep the entire backing buffer around. Sometimes you might prefer to copy your slice out into a separate buffer so that the underlying buffer can be freed. It’s not that hard for me to imagine trying to hunt down an errant handle that is keeping some large buffer alive and being very frustrated that I can’t see explicitly in the where those handles are created.</p><p>A similar case occurs with APIs like like <code>Arc::get_mut</code><sup id="fnref:7"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:7">7</a></sup>. <code>get_mut</code> takes an <code>&amp;mut Arc&lt;T&gt;</code> and, if the ref-count is 1, returns an <code>&amp;mut T</code>. This lets you take a <em>shareable</em> handle that <em>you</em> know is not actually <em>being</em> shared and recover uniqueness. This kind of API is not frequently used – but when you need it, it’s so nice it’s there.</p><h3>“What I love about Rust is its versatility: low to high in one language” (hat tip: Alex Crichton)</h3><p>Entering the conversation with Josh, I was leaning towards a design where you had some form of automated cloning of handles and an allow-by-default lint that would let crates which <em>don’t</em> want that turn it off. But Josh convinced me that there is a significant class of applications that want handle creation to be ergonomic AND visible (i.e., explicit in the source). Low-level network services and even things like Rust For Linux likely fit this description, but any Rust application that uses <code>get_mut</code> or <code>make_mut</code> might also.</p><p>And this reminded me of something Alex Crichton once said to me. Unlike the other quotes here, it wasn’t in the context of ergonomic ref-counting, but rather when I was working on my first attempt at the <a href="https://smallcultfollowing.com/babysteps/blog/2021/09/08/rustacean-principles/">“Rustacean Principles”</a>. Alex was saying that he loved how Rust was great for low-level code but also worked well high-level stuff like CLI tools and simple scripts.</p><p>I feel like you can interpret Alex’s quote in two ways, depending on what you choose to emphasize. You could hear it as, “It’s important that Rust is good for high-level use cases”. That is true, and it is what leads us to ask whether we should even make handles visible at all.</p><p>But you can also read Alex’s quote as, “It’s important that there’s one language that works well enough for <em>both</em>” – and I think that’s true too. The “true Rust gestalt” is when we manage to <em>simultaneously</em> give you the low-level control that grungy code needs but wrapped in a high-level package. This is the promise of zero-cost abstractions, of course, and Rust (in its best moments) delivers.</p><h4>The “soul of Rust”: low-level enough for a kernel, usable enough for a GUI</h4><p>Let’s be honest. High-level GUI programming is not Rust’s bread-and-butter, and it never will be; users will never confuse Rust for TypeScript. But then, TypeScript will never be in the Linux kernel.</p><p>The goal of Rust is to be a single language that can, by and large, be “good enough” for <em>both</em> extremes. <strong>The goal is make enough low-level details visible for kernel hackers but do so in a way that is usable enough for a GUI.</strong> It ain’t easy, but it’s the job.</p><p>This isn’t the first time that Josh has pulled me back to this realization. The last time was in the context of async fn in dyn traits, and it led to a blog post talking about the <a href="https://smallcultfollowing.com/babysteps/blog/2022/09/18/dyn-async-traits-part-8-the-soul-of-rust/">“soul of Rust”</a> and a <a href="https://smallcultfollowing.com/babysteps/blog/2022/09/19/what-i-meant-by-the-soul-of-rust/">followup going into greater detail</a>. I think the catchphrase “low-level enough for a Kernel, usable enough for a GUI” kind of captures it.</p><h4>Conclusion: Explicit handles should be the first step, but it doesn’t have to be the final step</h4><p>There is a slight caveat I want to add. I think another part of Rust’s soul is <em>preferring nuance to artificial simplicity</em> (“as simple as possible, but no simpler”, as they say). And I think the reality is that there’s a huge set of applications that make new handles left-and-right (particularly but not exclusively in async land<sup id="fnref:8"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:8">8</a></sup>) and where explicitly creating new handles is noise, not signal. This is why e.g. Swift<sup id="fnref:9"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:9">9</a></sup> makes ref-count increments invisible – and they get a big lift out of that!<sup id="fnref:10"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:10">10</a></sup> I’d wager most Swift users don’t even realize that Swift is not garbage-collected<sup id="fnref:11"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:11">11</a></sup>.</p><p>But the key thing here is that even if we do add some way to make handle creation automatic, we ALSO want a mode where it is explicit and visible. So we might as well do that one first.</p><p>OK, I think I’ve made this point 3 ways from Sunday now, so I’ll stop. The next few blog posts in the series will dive into (at least) two options for how we might make handle creation and closures more ergonomic while retaining explicitness.</p><div class="footnotes"><hr /><ol><li id="fn:1"><p>I see a potential candidate for a design axiom… <em>rubs hands with an evil-sounding cackle and a look of glee</em> <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:1">↩︎</a></p></li><li id="fn:2"><p><a href="https://youtu.be/JMFS9lrVd64?si=BdaDNm7rIueS0Jlx&amp;t=71">It’s an industry term</a>. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:2">↩︎</a></p></li><li id="fn:3"><p>Actually, by the standards of the conversations Josh and I often have, it was’t really all that long – an hour at most. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:3">↩︎</a></p></li><li id="fn:4"><p>Well, at least <em>sync</em> Rust is. I think async Rust has more than its share, particularly around cancellation, but that’s a topic for another blog post. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:4">↩︎</a></p></li><li id="fn:5"><p>Modulo panics, of course – and no surprise that accounting for panics is a major pain point for some Rust users. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:5">↩︎</a></p></li><li id="fn:6"><p>In this particular case, it was fairly easy for me to find regardless, but this application is very simple. I can definitely imagine ripgrep’ing around a codebase to find all increments being useful, and that would be much harder to do without an explicit signal they are occurring. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:6">↩︎</a></p></li><li id="fn:7"><p>Or <code>Arc::make_mut</code>, which is one of my favorite APIs. It takes an <code>Arc&lt;_&gt;</code> and gives you back mutable (i.e., unique) access to the internals, always! How is that possible, given that the ref count may not be 1? Answer: if the ref-count is not 1, then it clones it. This is perfect for copy-on-write-style code. So beautiful. 😍 <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:7">↩︎</a></p></li><li id="fn:8"><p>My experience is that, due to language limitations we really should fix, many async constructs force you into <code>'static</code> bounds which in turn force you into <code>Rc</code> and <code>Arc</code> where you’d otherwise have been able to use <code>&amp;</code>. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:8">↩︎</a></p></li><li id="fn:9"><p>I’ve been writing more Swift and digging it. I have to say, I love how they are not afraid to “go big”. I admire the ambition I see in designs like SwiftUI and their approach to async. I don’t think they bat 100, but it’s cool they’re swinging for the stands. I want Rust to <a href="https://smallcultfollowing.com/babysteps/ /blog/2022/02/09/dare-to-ask-for-more-rust2024/">dare to ask for more</a>! <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:9">↩︎</a></p></li><li id="fn:10"><p>Well, not <em>only</em> that. They also allow class fields to be assigned when aliased which, to avoid stale references and iterator invalidation, means you have to move everything into ref-counted boxes and adopt persistent collections, which in turn comes at a performance cost and makes Swift a harder sell for lower-level foundational systems (though by no means a non-starter, in my opinion). <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:10">↩︎</a></p></li><li id="fn:11"><p>Though I’d also wager that many eventually find themselves scratching their heads about a ref-count cycle. I’ve not dug into how Swift handles those, but I see references to “weak handles” flying around, so I assume they’ve not (yet?) adopted a cycle collector. To be clear, you can get a ref-count cycle in Rust too! It’s harder to do since we discourage interior mutability, but not that hard. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:11">↩︎</a></p></li></ol></div></description> <pubDate>Mon, 13 Oct 2025 11:39:16 +0000</pubDate></item><item> <title>Mozilla Thunderbird: State of the Thunder 13: How We Make Our Roadmap</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3885</guid> <link>https://blog.thunderbird.net/2025/10/state-of-the-thunder-13-how-we-make-our-roadmap/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2025/10/Blog-banner-State-of-the-Thunder-768x432.png" width="640" /></p><p>Welcome back to our thirteenth episode of State of the Thunder! Nothing unlucky about this latest installment, as Managing Director Ryan Sipes walks us through how Thunderbird creates its roadmap. Unlike other companies where roadmaps are driven solely by business needs, Thunderbird is working with our community governance and feedback from the wider user community to keep us honest even as we move forward. </p> <p>Want to find out how to join future State of the Thunders? Be sure to join our <a href="https://thunderbird.topicbox.com/groups/planning">Thunderbird planning mailing list</a> for all the details. </p> <h3>Open Source, Open Roadmaps</h3> <p>In other companies, product managers tend to draft roadmaps based on business needs. Publishing that roadmap might be an afterthought, or might not happen at all. Thunderbird, however, is open source, so that’s not our process.</p> <p>A quick history lesson provides some needed context. Eight years ago, Thunderbird was solely a community project driven by a community council. We didn’t have a roadmap like we do today. With the earlier loss of funding and support, the project was in triage mode. Since then, thanks to a wonderful user community who has donated their skill, time, and money, we’ve changed our roadmap process.</p> <p>The Supernova release (Thunderbird 115) was where we first really focused on making a roadmap with a coherent product vision: a modernized app in performance and appearance. We developed this roadmap with input from the community, even if there was pushback to a UI change.</p> <h3>The 2026 Roadmap Process</h3> <p>At this point, the project has bylaws for the roadmap process, which unites the Thunderbird Council, MZLA staff, and user feedback. Over the past year we’ve added two new roadmaps: one for the Android app and another for ThunderbirdPro. (Note, iOS doesn’t have a roadmap yet. Our current goal is: let’s be able to receive email!) But even with these changes and additions, the <a href="https://www.mozilla.org/en-US/about/manifesto/">Mozilla Manifesto</a> is still at the heart of everything we do. We firmly believe that making roadmaps with community governance and feedback from the larger community keeps us honest and helps us make products that genuinely improve people’s lives.</p> <p>Want to see how our 2025-2026 Roadmaps are taking shape? Check out the <a href="https://developer.thunderbird.net/planning/roadmap">Desktop Roadmap</a>, as well the mobile roadmaps for <a href="https://developer.thunderbird.net/planning/android-roadmap">Android</a> and <a href="https://developer.thunderbird.net/planning/ios-roadmap">iOS</a>.</p> <h3>Questions</h3> <h4>Integrating Community Contributions</h4> <p>In the past, community contributors have picked up “nice to have” issues and developed them alongside us. Or people want to pursue problems or challenges that affect them the most. Sometimes, either of these scenarios coincide with our roadmap, and we get features like the new drag and drop folders! </p> <p>Needless to say, we love when the community helps us get the product where we hope it will go. Sometimes, we have to pause development because of shifted priorities, and we’re trying to get better at updating contributors when these shifts happen on places like the <a href="https://thunderbird.topicbox.com/groups/planning">tb-planning</a> and <a href="https://thunderbird.topicbox.com/groups/mobile-planning">mobile-planning</a> mailing lists.</p> <p>And these community contributions aren’t just code! Testing is a crucial way to help make Thunderbird shine on desktop and mobile. Community suggestions on Mozilla Connect help us dream big, as we discussed in the last two episodes. Reporting bugs, either on <a href="https://bugzilla.mozilla.net">Bugzilla</a> for the desktop app or <a href="https://github.com/thunderbird/thunderbird-android/issues/">GitHub</a> for the Android app, help us know when things aren’t working. We encourage our community to learn more <a href="https://council.thunderbird.net/">about the Council</a>, and don’t be afraid to get in touch with them at council@thunderbird.net.</p> <h4>Telemetry and the Roadmap</h4> <p>While we know there are passionate debates on telemetry in the open source community, we want to mention how respectful telemetry can make Thunderbird better. Our telemetry helps us see what features are important, and which ones just clutter up the UI. We don’t collect Personally Identifying Information (PII), and our code is open so you can check us on this. Unlike Outlook, who shares their data with 801 partners, we don’t. You can read all about what we use and how we use it <a href="https://www.thunderbird.net/privacy/">here</a>.</p> <p>So if you have telemetry turned off, please, we ask you to turn it on, and if it’s already on, to keep it on! Especially if you’re a Linux user, enabling telemetry helps us have a better gauge of our Linux user base and how to best support you.</p> <h4>Roadmap Categories and Organizing</h4> <p>Should we try to ‘bucket’ similar items on our roadmap and spread development evenly between them, or should we concentrate on the bucket that needs it most? The answer to this question depends on who you ask! Sometimes we’re focused on a particular area of focus, like UI work in Supernova and current UX work in Calendar. Sometimes we’re working to pay down tech debt across our code. That effort in reducing tech debt can pave the way for future work, like the current efforts to modernize our database so we can have a true Conversation View and other features. Sometimes roadmaps reveal obstacles you have to overcome, and Ryan thinks we’re getting faster at this.</p> <h3>Where to see the roadmaps</h3> <p>The current desktop roadmap is <a href="https://developer.thunderbird.net/planning/roadmap">here</a>, while the current Android roadmap is on our <a href="https://github.com/orgs/thunderbird/projects/19">GitHub repo</a>. In the future, we’re hoping to update where these roadmaps live, how they look, and how you can interact with them. (Ryan is particularly partial to <a href="https://obsidian.md/roadmap/">Obsidian’s roadmap.</a>) We ultimately want our roadmaps to be storytelling devices, and to keep them more updated to any recent changes.</p> <h3>Current Calls for Involvement</h3> <p>Join us for the last few days of <a href="https://thunderbird.topicbox.com/groups/planning/T00a28d546ed1b7d1/ews-in-thunderbird-144-0b1-call-for-testing">testing EWS mail support</a>! Also, we had a fantastic time with the Ask a Fox replython, and would love if you helped us <a href="https://blog.thunderbird.net/2024/08/video-how-to-answer-thunderbird-questions-on-mozilla-support/">answer support questions</a> on <a href="https://support.mozilla.org">SUMO</a>.</p> <h3>Watch the Video (also on <a href="https://tilvids.com/w/mvHZHm2JXzbrxwMBvLDorc">PeerTube</a>)</h3> <figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper"> </div></figure> <h3>Listen to the Podcast</h3> <p></p><p>The post <a href="https://blog.thunderbird.net/2025/10/state-of-the-thunder-13-how-we-make-our-roadmap/">State of the Thunder 13: How We Make Our Roadmap</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Fri, 10 Oct 2025 18:37:37 +0000</pubDate> <dc:creator>Monica Ayhens-Madon</dc:creator></item><item> <title>The Mozilla Blog: Shake to Summarize recognized with special mention in TIME’s Best Inventions of 2025</title> <guid isPermaLink="false">https://blog.mozilla.org/?p=82133</guid> <link>https://blog.mozilla.org/en/firefox/shake-to-summarize-time-best-inventions/</link> <description><figure class="wp-block-image size-large"><img alt="Illustration featuring a TIME magazine cover titled “Best Inventions of 2025,” showing a humanoid robot folding clothes, alongside a smartphone displaying the Firefox logo and a screen reading “Summarizing…” with a dessert recipe below it." class="wp-image-82134" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/10/Blog-Header-3-1024x576.png" width="1024" />&lt;figcaption class="wp-element-caption"&gt;Cover credit: Photography by Spencer Lowell for TIME&lt;/figcaption&gt;</figure> <p><em>Shake to Summarize has been recognized with a <a href="https://time.com/collections/best-inventions-special-mentions/7320805/firefox-shake-to-summarize/" rel="noreferrer noopener" target="_blank"><strong>Special Mention</strong></a> in<strong> </strong><a href="https://time.com/collections/best-inventions-2025/" rel="noreferrer noopener" target="_blank"><strong>TIME’s Best Inventions of 2025</strong></a>.</em></p> <p>Each year TIME<strong> </strong>spotlights a range of new industry-defining innovations across consumer electronics, health tech, apps and beyond. This year, <a href="https://blog.mozilla.org/firefox/shake-to-summarize/" rel="noreferrer noopener" target="_blank">Firefox’s Shake to Summarize feature</a> made the list for bringing a smart solution to a modern user problem: information overload. </p> <p>With a single shake or tap, users on iOS devices can get to the heart of an article in seconds. The cool part? Summaries adapt to what you’re reading: recipes pull out the steps for cooking, sports focus on game scores and stats, and news highlights the key takeaways from a story.</p> <p>“We’re thrilled to see Firefox earn a TIME Best Inventions 2025 Special Mention! Our work on Shake to Summarize reflects how Firefox is evolving,” said <a href="https://blog.mozilla.org/en/firefox/promoted/" rel="noreferrer noopener" target="_blank">Anthony Enzor-DeMeo</a>, general manager of Firefox. “We’re reimagining our browser to fit seamlessly into modern life, helping people browse with less clutter and more focus. The feature is also part of our efforts to give mobile users a cleaner UI and smarter tools that make browsing on the go fast, seamless, and even fun.”</p> <figure class="wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper"> </div></figure> <p>Launched in September 2025 and currently available to English-language users in the U.S., Shake to Summarize generates summaries using Apple Intelligence on iPhone 15 Pro or later running iOS 26 or above, and Mozilla-hosted AI for other devices running iOS 16 or above.</p> <p>“This recognition is a testament to the incredible work of our UX, design, product, and engineering teams who brought this innovation to life, showcasing that Firefox continues to lead with purpose, creativity, and a deep commitment to user-centric design. Big thank you!” added Enzor-DeMeo.</p> <p>The Firefox team is working on making the feature available to more users and for those on Android. In the meantime, iOS users can already make the most of Shake to Summarize available in the <a href="https://apps.apple.com/us/app/firefox-private-web-browser/id989804926?ppid=908b3bb9-aa78-4a60-8f7f-2407cd3227bc" rel="noreferrer noopener" target="_blank">Apple app store</a> now.</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="" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2021/10/Visual-Guidelines-800x800.png" width="800" /> </div> <div class="ft-c-inline-cta__content"> <h3>Take control of your internet</h3> <span>Download Firefox</span> </div></a><p>The post <a href="https://blog.mozilla.org/en/firefox/shake-to-summarize-time-best-inventions/">Shake to Summarize recognized with special mention in TIME’s Best Inventions of 2025</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></description> <pubDate>Thu, 09 Oct 2025 14:28:43 +0000</pubDate> <dc:creator>Christina Petrova</dc:creator></item><item> <title>Mozilla Thunderbird: State Of The Bird 2024/25</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3844</guid> <link>https://blog.thunderbird.net/2025/10/state-of-the-bird-2024-25/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2025/10/Annual-Report4-768x432.jpg" width="640" /></p><p>The past twelve months have been another remarkable chapter in Thunderbird’s journey. Together, we started expanding Thunderbird beyond its strong desktop roots, introducing it to smartphones and web browsers to make it more accessible to more people. Thunderbird for Android arrived in the fall and has been steadily improving thanks to our growing mobile team, as well as feedback and contributions from our growing global family. A few months later, in December 2024, we celebrated an extraordinary milestone: 20 years of Thunderbird! We also looked toward a sustainable future with the announcement of Thunderbird Pro, with one of its first services, Appointment, already finding an audience in closed beta. </p> <p>The past year also saw a shift in how Thunderbird evolves. Although we recently released our latest annual ESR update (codenamed Eclipse), the bigger news is that our team built the new Monthly Release channel, which is now the default for most of you. This change means you’ll see more frequent updates that make Thunderbird feel fresher, more responsive, and more in tune with your personalized needs. <br />Before diving into all the details, I want to pause and express our deepest gratitude to the incredible global community that makes all of this possible. To the hundreds of thousands of people who donated financially, the volunteers who contributed their time and expertise, and the beta testers who carefully helped us polish each update: thank you! Thunderbird <em>thrives</em> because of you. Every milestone we celebrate is a shared achievement, and a shining example of the power of community-driven, open source software development.</p> <div class="wp-block-spacer" style="height: 59px;"></div> <h3><strong>Team and Product Updates</strong></h3> <h4><strong>Desktop and release updates</strong></h4> <p>In December 2024, we celebrated Thunderbird’s 20th anniversary. Two decades of proving that email software can be both powerful and principled was not without its ups and downs, but that milestone reaffirmed something we hear so often from our community: Thunderbird continues to matter deeply to people all over the world. </p> <p>One of the biggest changes this year was the introduction of a new monthly release channel, simply called “Thunderbird Release.” Making this shift required an enormous amount of coordination and care across our desktop and release teams. Unlike the long-standing Extended Support Release (ESR), which provides a single major update every July, the new Thunderbird Release delivers monthly updates. This approach means we can bring you useful improvements and new features significantly faster, while keeping the stability and reliability you rely on.</p> <p>Over the past year, our desktop team focused heavily on introducing changes that people have been asking for. Specifically, changes that make Thunderbird feel more efficient, intuitive, and modern. We improved visual consistency across system themes, gave you more ways to control the appearance of your message lists and how they’re organized, modernized notifications with native OS integration and quick actions, and moved closer to full Microsoft Exchange support. </p> <p>Many of you who switched from the ESR to the new Thunderbird Release channel started seeing these updates as early as April. For those who stuck with the ESR, the annual update, codenamed Eclipse, arrived in July. Thanks to the solid foundation established in those smaller monthly updates, Eclipse enjoyed the smoothest rollout of any annual release in Thunderbird’s history. </p> <p><em>In-depth details on Desktop development can be found in our monthly </em><a href="https://blog.thunderbird.net/tag/development-digest/"><em>Developer Digest</em></a><em> updates on our blog. </em></p> <h4><strong>Thunderbird Mobile</strong></h4> <h5>Android</h5> <p>It took longer than we originally anticipated, but Thunderbird has finally arrived as a true smartphone app. The launch of Thunderbird for Android in October 2024 was one of our most exciting steps forward in years. Releasing it took more than two years of active development, beta testing, and invaluable community feedback. </p> <p>This milestone was made possible by transforming the much-loved K-9 Mail app into something we could proudly call Thunderbird. That process included a full redesign of the interface, including bringing it up to modern design standards, and building an easy way for people to bring their existing Thunderbird desktop accounts directly into the Android app.</p> <p>We’ve been encouraged by the enthusiastic response to Thunderbird on Android, but we’re also listening closely to your feedback. Our team, together with community contributors, has one very focused goal: to make Thunderbird the best Android email app available. </p> <h5>iOS</h5> <p>We’ve also seen the overwhelming demand to build a version of Thunderbird for the iOS community. Unlike the Android app, the iOS app is being built from the ground up. </p> <p>Fortunately, Thunderbird for iOS took some major steps forward this year. We published the initial repository (a central location for open-source project files and code) for the Thunderbird mobile team and contributors to work together, and we’re laying the groundwork for public testing. </p> <p>Our goal for the first public alpha will be to support manual account setup and basic inbox viewing to meet Apple’s minimum review standards. These early pre-release versions will be distributed through TestFlight, allowing Thunderbird for iOS to benefit from your real-world feedback. </p> <p>When we started building Thunderbird for iOS, a core decision was made to use a modern foundation (JMAP) designed for mobile devices. This will allow for, among other advantages, faster mail synchronization and more efficient resource usage. The first pieces of that foundation are already in place, with the basic ability to view folders and messages. We’ve also set up internal tools that will make regular updates, language translations, and community testing possible. </p> <p>Thunderbird for iOS is still in the early stages of development, but momentum is strong, our team is growing, and we’re confidently moving toward the first community-accessible release. </p> <p><em>In depth details on mobile development can be found in our monthly </em><a href="https://blog.thunderbird.net/tag/android-progress-report/"><em>Mobile Progress Report</em></a><em> on our blog. </em></p> <h4><strong>Thundermail and Thunderbird Pro services</strong></h4> <p>It’s no secret we’ve been building additional web services under the Thunderbird Pro name, and 2025 marked a pivotal moment in our vision for a complete, open-source Thunderbird ecosystem. </p> <p>This year we announced Thundermail, a dedicated email service by Thunderbird. During the past decade, we’ve seen a large move away from dedicated email clients to products like Gmail, partially because of the robust ecosystem around them. The plan for Thundermail is to eventually offer an alternative webmail solution that protects your privacy, and doesn’t use your messages to train AI or show you ads. </p> <p>Here’s what else we’ve been working on in addition to Thundermail: </p> <p>During its current beta, Thunderbird Appointment saw great improvements in managing your schedule, with many of the changes focused on reliability and visual polish.</p> <p>Thunderbird Send, an app for securely sharing encrypted files, also saw forward momentum. Together, these services are steadily moving toward a wider beta launch this fall, and we’re excited to see how you’ll use them to improve your personal and professional lives. </p> <p>All of the work going into Thundermail and Thunderbird Pro services is guided by a clear goal: providing you with an ethical alternative to the closed-off “walled gardens” that dominate our digital communication. You shouldn’t have to sacrifice your values and give up your personal data to enjoy convenience and powerful features. </p> <p><em>In depth details on Thunderbird Pro development can be found in our </em><a href="https://blog.thunderbird.net/tag/tbpro/"><em>Thunderbird Pro</em></a><em> updates on our blog. </em></p> <div class="wp-block-spacer" style="height: 52px;"></div> <h3><strong>2024 Financial Picture</strong></h3> <p>The generosity of our donors continues to power everything we do, and the importance of these financial contributions cannot be understated. In 2024, the Thunderbird project once again saw continued growth in donations which paved the way for Thundermail and the Thunderbird Pro services you just read about. It also gave us the opportunity to grow our mobile development team, improve our user support outreach, and expand our connections to the community. </p> <p>Here’s a detailed breakdown of our donation revenue in 2024, and why many of these statistics are so meaningful. </p> <h4><strong>Contribution Revenue</strong></h4> <p>In 2024, financial contributions to Thunderbird reached $10.3 million, representing a 19% increase over the previous year. This support came courtesy of more than 539,000 transactions from more than 335,000 individual donors. A healthy 25% of these contributions were given as recurring monthly support.</p> <p>What makes this so meaningful to us isn’t the total revenue, or the scale of the donations. It’s how those donations break down. The average contribution was $18.88, with a median of $16.66. Among our recurring donors, the average monthly gift was only $6.25. In fact, 53% of all donations were $20 or less, and 94% were $35 or less. Only 17 contributions were $1,000 or more. </p> <p>What does this represent when we go beyond the numbers? It means Thunderbird isn’t sustained by a handful of wealthy benefactors or corporate sponsors. Rather, it is sustained by a global community of people who believe in what we’ve built and what we’re still building, and they come together to keep it moving forward.</p> <p>And that global reach continues to inspire us. We received contributions from more than 200 countries. The top ten contributing countries – Germany, the United States, France, the United Kingdom, Switzerland, the Netherlands, Japan, Italy, Austria, and Canada – accounted for 83% of our total revenue.</p> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/10/Annual-Report1.jpg"><img alt="" class="wp-image-3862" height="1041" src="https://blog.thunderbird.net/files/2025/10/Annual-Report1.jpg" width="2000" /></a></figure> <p>But products aren’t just numbers and code. Products are the people that work on them. To support the ambitions of our expanding roadmap, our team grew significantly in 2024. We added 14 new team members throughout the year, closing out 2024 with 43 full-time staff members. Much of this growth strengthened our mobile development, web services, and desktop + release teams. 80% of our staff focuses on technical work – things like product development and infrastructure – but we also added more roles to actively support users, improve community outreach, and smooth out internal operations. </p> <h4><strong>Expenses</strong></h4> <p>When we talk about how we use financial contributions, we’re really talking about <a href="https://www.thunderbird.net/en-US/about/">investments in our shared values</a>. The majority of our spending goes to personnel; the talented individuals who write code, design interfaces, test features, and support our users. Infrastructure is the next largest expense, followed by administrative costs to keep operations running smoothly. </p> <p>Below is a breakdown of our 2024 expenses:</p> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/10/Annual-Report.jpg"><img alt="" class="wp-image-3856" height="1480" src="https://blog.thunderbird.net/files/2025/10/Annual-Report.jpg" width="2000" /></a></figure> <div class="wp-block-spacer" style="height: 58px;"></div> <h3><strong>Community Snapshot</strong></h3> <h4><strong>Contributor &amp; Community Growth</strong></h4> <p>For two decades, Thunderbird has survived and thrived because of its dedicated open-source community. In 2024, we continued using our<a href="https://thunderbird.biterg.io"> Bitergia dashboard</a> to give our community a clear view of the project’s overall activity across the board. (You can read more about how we collaborated on and use this beneficial tool<a href="https://blog.thunderbird.net/2024/12/visualizing-the-thunderbird-community-with-bitergia/"> here</a>.)<br /></p> <p>This dashboard helps us track participation, identify and celebrate successes, and find areas to improve, which is especially important as we expand the Thunderbird ecosystem with new products and services. </p> <p>For this report, we’ve highlighted some of the most notable community metrics and growth milestones from 2024. </p> <p>For reference, <strong>Github</strong> and <strong>Bugzilla</strong> measure developer contributions. <strong>TopicBox</strong> measures activity across our many mailing lists. <strong>Pontoon</strong> measures the activity from volunteers who help us translate and localize Thunderbird. <strong>SUMO</strong> (the Mozilla support website) measures the impact of Thunderbird’s support volunteers who engage with our users and respond to their varied support questions.</p> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/10/Annual-Report2-scaled.jpg"><img alt="" class="wp-image-3849" height="2560" src="https://blog.thunderbird.net/files/2025/10/Annual-Report2-scaled.jpg" width="1502" /></a></figure> <p>We estimate that in 2024, the total number of people who contributed to Thunderbird – by writing code, answering support questions, providing translations, or other meaningful areas – is more than 20,000. </p> <p>It’s especially encouraging to see the number of translation locales increase from 58 to 70, as Thunderbird continues to find new users around the world. </p> <p>But there are areas of opportunity, too. For example, making it less complicated for people who want to start contributing to Thunderbird. We’ve started addressing this by recording two Community Office Hours videos, talking about how to write Knowledge Base articles, and how to effectively answer questions on the Mozilla Support website. </p> <p><strong>Mozilla Connect</strong> is another portal that lets anyone interested in the betterment of Thunderbird suggest ideas, openly discuss them, and vote on them. In 2024, four desktop ideas as well as four of your ideas in our relatively new mobile space were implemented, and we saw more than 500 new thoughtful ideas suggested across mobile and desktop. Our staff and community are watching for your ideas, so <a href="https://connect.mozilla.org">keep them coming! </a></p> <div class="wp-block-spacer" style="height: 57px;"></div> <h3><strong>Thank you</strong></h3> <p>As we close out this year’s <em>State of the Bird</em>, we want to once again shine a light on the incredible global community of Thunderbird supporters. Whether you’ve contributed your valuable time, financial donations, or simply shared Thunderbird with colleagues, friends, and family, your support continues to brighten Thunderbird’s future. </p> <p>After all, products aren’t just numbers on a chart. Products are the people who create them, support them, improve them, and believe in crucial concepts like privacy, digital wellbeing, and open standards. </p> <p>We’re so very grateful to you.</p><p>The post <a href="https://blog.thunderbird.net/2025/10/state-of-the-bird-2024-25/">State Of The Bird 2024/25</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Wed, 08 Oct 2025 10:02:00 +0000</pubDate> <dc:creator>Ryan Sipes</dc:creator></item><item> <title>Niko Matsakis: SymmACP: extending Zed's ACP to support Composable Agents</title> <guid isPermaLink="false">https://smallcultfollowing.com/babysteps/blog/2025/10/08/symmacp/</guid> <link>https://smallcultfollowing.com/babysteps/blog/2025/10/08/symmacp/?utm_source=atom_feed</link> <description><p>This post describes <strong>SymmACP</strong> – a proposed extension to Zed’s <a href="https://agentclientprotocol.com/overview/introduction">Agent Client Protocol</a> that lets you build AI tools like Unix pipes or browser extensions. Want a better TUI? Found some cool slash commands on GitHub? Prefer a different backend? With SymmACP, you can mix and match these pieces and have them all work together without knowing about each other.</p><p>This is pretty different from how AI tools work today, where everything is a monolith – if you want to change one piece, you’re stuck rebuilding the whole thing from scratch. SymmACP allows you to build out new features and modes of interactions in a layered, interoperable way. This post explains how SymmACP would work by walking through a series of examples.</p><p>Right now, SymmACP is just a thought experiment. I’ve sketched these ideas to the Zed folks, and they seemed interested, but we still have to discuss the details in this post. My plan is to start prototyping in <a href="https://symposium-dev.github.io/symposium/">Symposium</a> – if you think the ideas I’m discussing here are exciting, please join the <a href="https://symposium-dev.zulipchat.com/">Symposium Zulip</a> and let’s talk!</p><h3>“Composable agents” let you build features independently and then combine them</h3><p>I’m going to explain the idea of “composable agents” by walking through a series of features. We’ll start with a basic CLI agent<sup id="fnref:1"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:1">1</a></sup> tool – basically a chat loop with access to some MCP servers so that it can read/write files and execute bash commands. Then we’ll show how you could add several features on top:</p><ol><li>Addressing time-blindness by helping the agent know what time it is.</li><li>Injecting context and “personality” to the agent.</li><li>Spawning long-running, asynchronous tasks.</li><li>A copy of Q CLI’s <code>/tangent</code> mode that lets you do a bit of “off the books” work that gets removed from your history later.</li><li>Implementing <a href="https://symposium-dev.github.io/symposium/get-started/walkthroughs.html">Symposium’s interactive walkthroughs</a>, which give the agent a richer vocabulary for communicating with you than just text.</li><li>Smarter tool delegation.</li></ol><p><strong>The magic trick is that each of these features will be developed as separate repositories.</strong> What’s more, they could be applied to any base tool you want, so long as it speaks SymmACP. And you could also combine them with different front-ends, such as a TUI, a web front-end, builtin support from <a href="https://zed.dev/">Zed</a> or <a href="https://zed.dev/blog/jetbrains-on-acp">IntelliJ</a>, etc. Pretty neat.</p><p>My hope is that if we can centralize on SymmACP, or something like it, then we could move from everybody developing their own bespoke tools to an interoperable ecosystem of ideas that can build off of one another.</p><h3>let mut SymmACP = ACP</h3><p>SymmACP begins with ACP, so let’s explain what ACP is. ACP is a wonderfully simple protocol that lets you abstract over CLI agents. Imagine if you were using an agentic CLI tool except that, instead of communication over the terminal, the CLI tool communicates with a front-end over JSON-RPC messages, currently sent via stdin/stdout.</p><pre class="mermaid">flowchart LR Editor &lt;-.-&gt;|JSON-RPC via stdin/stdout| Agent[CLI Agent] </pre><p>When you type something into the GUI, the editor sends a JSON-RPC message to the agent with what you typed. The agent responds with a stream of messages containing text and images. If the agent decides to invoke a tool, it can request permission by sending a JSON-RPC message back to the editor. And when the agent has completed, it responds to the editor with an “end turn” message that says “I’m ready for you to type something else now”.</p><pre class="mermaid">sequenceDiagram participant E as Editor participant A as Agent participant T as Tool (MCP) E-&gt;&gt;A: prompt("Help me debug this code") A-&gt;&gt;E: request_permission("Read file main.rs") E-&gt;&gt;A: permission_granted A-&gt;&gt;T: read_file("main.rs") T-&gt;&gt;A: file_contents A-&gt;&gt;E: text_chunk("I can see the issue...") A-&gt;&gt;E: text_chunk("The problem is on line 42...") A-&gt;&gt;E: end_turn </pre><h3>Telling the agent what time it is</h3><p>OK, let’s tackle our first feature. If you’ve used a CLI agent, you may have noticed that they don’t know what time it is – or even what <em>year</em> it is. This may sound trivial, but it can lead to some real mistakes. For example, they may not realize that some information is outdated. Or when they do web searches for information, they can search for the wrong thing: I’ve seen CLI agents search the web for “API updates in 2024” for example, even though it is 2025.</p><p>To fix this, many CLI agents will inject some extra text along with your prompt, something like <code>&lt;current-date date="2025-10-08" time="HH:MM:SS"/&gt;</code>. This gives the LLM the context it needs.</p><p>So how could use ACP to build that? The idea is to create a <strong>proxy</strong>. This proxy would wrap the original ACP server:</p><pre class="mermaid">flowchart LR Editor[Editor/VSCode] &lt;--&gt;|ACP| Proxy[Datetime Proxy] &lt;--&gt;|ACP| Agent[CLI Agent] </pre><p>This proxy will take every “prompt” message it receives and decorate it with the date and time:</p><pre class="mermaid">sequenceDiagram participant E as Editor participant P as Proxy participant A as Agent E-&gt;&gt;P: prompt("What day is it?") P-&gt;&gt;A: prompt("&lt;current-date .../&gt; What day is it?") A-&gt;&gt;P: text_chunk("It is 2025-10-08.") P-&gt;&gt;E: text_chunk("It is 2025-10-08.") A-&gt;&gt;P: end_turn P-&gt;&gt;E: end_turn </pre><p>Simple, right? And of course this can be used with any editor and any ACP-speaking tool.</p><h3>Next feature: Injecting “personality” to the agent</h3><p>Let’s look at another feature that basically “falls out” from ACP: injecting personality. Most agents give you the ability to configure “context” in various ways – or what Claude Code calls <a href="https://docs.claude.com/en/docs/claude-code/memory">memory</a>. This is useful, but I and others have noticed that if what you want is to change how Claude “behaves” – i.e., to make it more collaborative – it’s not really enough. You really need to kick off the conversation by reinforcing that pattern.</p><p>In Symposium, <a href="https://github.com/symposium-dev/symposium/blob/7f437fdf02ab52cd0bd3070d25feaad387b6d23f/symposium/mcp-server/src/server.rs#L885">the “yiasou” prompt</a> (also available as “hi”, for those of you who don’t speak Greek 😛) is meant to be run as the first thing in the conversation. But there’s nothing an MCP server can do to <em>ensure</em> that the user kicks off the conversation with <code>/symposium:hi</code> or something similar. Of course, if Symposium were implemented as an ACP Server, we absolutely could do that:</p><pre class="mermaid">sequenceDiagram participant E as Editor participant P as Proxy participant A as Agent E-&gt;&gt;P: prompt("I'd like to work on my document") P-&gt;&gt;A: prompt("/symposium:hi") A-&gt;&gt;P: end_turn P-&gt;&gt;A: prompt("I'd like to work on my document") A-&gt;&gt;P: text_chunk("Sure! What document is that?") P-&gt;&gt;E: text_chunk("Sure! What document is that?") A-&gt;&gt;P: end_turn P-&gt;&gt;E: end_turn </pre><h3>Proxies are a better version of hooks</h3><p>Some of you may be saying, “hmm, isn’t that what <a href="https://docs.claude.com/en/docs/claude-code/hooks">hooks</a> are for?” And yes, you could do this with hooks, but there’s two problems with that. First, hooks are non-standard, so you have to do it differently for every agent.</p><p>The second problem with hooks is that they’re <strong>fundamentally limited</strong> to what the hook designer envisioned you might want. You only get hooks at the places in the workflow that the tool gives you, and you can only control what the tool lets you control. The next feature starts to show what I mean: as far as I know, it cannot readily be implemented with hooks the way I would want it to work.</p><h3>Next feature: long-running, asynchronous tasks</h3><p>Let’s move on to our next feature, long-running asynchronous tasks. This feature is going to have to go beyond the current capabilities of ACP into the expanded “SymmACP” feature set.</p><p>Right now, when the server invokes an MCP tool, it executes in a blocking way. But sometimes the task it is performing might be long and complicated. What you would really like is a way to “start” the task and then go back to working. When the task is complete, you (and the agent) could be notified.</p><p>This comes up for me a lot with “deep research”. A big part of my workflow is that, when I get stuck on something I don’t understand, I deploy a research agent to scour the web for information. Usually what I will do is ask the agent I’m collaborating with to prepare a research prompt summarizing the things we tried, what obstacles we hit, and other details that seem relevant. Then I’ll pop over to <a href="https://claude.ai/">claude.ai</a> or <a href="https://gemini.google.com/">Gemini Deep Research</a> and paste in the prompt. This will run for 5-10 minutes and generate a markdown report in response. I’ll download that and give it to my agent. Very often this lets us solve the problem.<sup id="fnref:2"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:2">2</a></sup></p><p>This research flow works well but it is tedious and requires me to copy-and-paste. What I would ideally want is an MCP tool that does the search for me and, when the results are done, hands them off to the agent so it can start processing immediately. But in the meantime, I’d like to be able to continue working with the agent while we wait. Unfortunately, the protocol for tools provides no mechanism for asynchronous notifications like this, from what I can tell.</p><h3>SymmACP += tool invocations + unprompted sends</h3><p>So how would I do it with SymmACP? Well, I would want to extend the ACP protocol as it is today in two ways:</p><ol><li>I’d like the ACP proxy to be able to provide tools that <em>the proxy</em> will execute. Today, the agent is responsible for executing all tools; the ACP protocol only comes into play when requesting <em>permission</em>. But it’d be trivial to have MCP tools where, to execute the tool, the agent sends back a message over ACP instead.</li><li>I’d like to have a way for the <em>agent</em> to initiate responses to the <em>editor</em>. Right now, the editor always initiatives each communication session with a prompt; but, in this case, the agent might want to send messages back unprompted.</li></ol><p>In that case, we could implement our Research Proxy like so:</p><pre class="mermaid">sequenceDiagram participant E as Editor participant P as Proxy participant A as Agent E-&gt;&gt;P: prompt("Why is Rust so great?") P-&gt;&gt;A: prompt("Why is Rust so great?") A-&gt;&gt;P: invoke tool("begin_research") activate P P-&gt;&gt;A: ok A-&gt;&gt;P: "I'm looking into it!" P-&gt;&gt;E: "I'm looking into it!" A-&gt;&gt;P: end_turn P-&gt;&gt;E: end_turn Note over E,A: Time passes (5-10 minutes) and the user keeps working... Note over P: Research completes in background P-&gt;&gt;A: &lt;research-complete/&gt; deactivate P A-&gt;&gt;P: "Research says Rust is fast" P-&gt;&gt;E: "Research says Rust is fast" A-&gt;&gt;P: end_turn P-&gt;&gt;E: end_turn </pre><p>What’s cool about this is that the proxy encapsulates the entire flow: it knows how to do the research, and it manages notifying the various participants when the research completes. (Also, this leans on one detail I left out, which is that )</p><h3>Next feature: tangent mode</h3><p>Let’s explore our next feature, <a href="https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-experimental-features.html">Q CLI’s <code>/tangent</code> mode</a>. This feature is interesting because it’s a simple (but useful!) example of history editing. The way <code>/tangent</code> works is that, when you first type <code>/tangent</code>, Q CLI saves your current state. You can then continue as normal but when you <em>next</em> type <code>/tangent</code>, your state is restored to where you were. This, as the name suggests, lets you explore a side conversation without polluting your main context.</p><p>The basic idea for supporting tangent in SymmACP is that the proxy is going to (a) intercept the tangent prompt and remember where it began; (b) allow the conversation to continue as normal; and then (c) when it’s time to end the tangent, create a new session and replay the history up until the point of the tangent<sup id="fnref:3"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:3">3</a></sup>.</p><h3>SymACP += replay</h3><p>You can <em>almost</em> implement “tangent” in ACP as it is, but not quite. In ACP, the agent always owns the session history. The editor can create a new session or load an older one; when loading an older one, the agent “replays” “replays” the events so that the editor can reconstruct the GUI. But there is no way for the <em>editor</em> to “replay” or construct a session to the <em>agent</em>. Instead, the editor can only send prompts, which will cause the agent to reply. In this case, what we want is to be able to say “create a new chat in which I said this and you responded that” so that we can setup the initial state. This way we could easily create a new session that contains the messages from the old one.</p><p>So how this would work:</p><pre class="mermaid">sequenceDiagram participant E as Editor participant P as Proxy participant A as Agent E-&gt;&gt;P: prompt("Hi there!") P-&gt;&gt;A: prompt("Hi there!") Note over E,A: Conversation proceeds E-&gt;&gt;P: prompt("/tangent") Note over P: Proxy notes conversation state P-&gt;&gt;E: end_turn E-&gt;&gt;P: prompt("btw, ...") P-&gt;&gt;A: prompt("btw, ...") Note over E,A: Conversation proceeds E-&gt;&gt;P: prompt("/tangent") P-&gt;&gt;A: new_session P-&gt;&gt;A: prompt("Hi there!") Note over P,A: ...Proxy replays conversation... </pre><h3>Next feature: interactive walkthroughs</h3><p>One of the nicer features of Symposium is the ability to do <a href="https://symposium-dev.github.io/symposium/get-started/walkthroughs.html">interactive walkthroughs</a>. These consist of an HTML sidebar as well as inline comments in the code:</p><img alt="Walkthrough screenshot" src="https://smallcultfollowing.com/babysteps/ /assets/2025-symmacp/walkthrough.png" width="100%" /><p>Right now, this is implemented by a kind of hacky dance:</p><ul><li>The agent invokes an MCP tool and sends it the walkthrough in markdown. This markdown includes commands meant to be placed on particular lines, identified not by line number (agents are bad at line numbers) but by symbol names or search strings.</li><li>The MCP tool parses the markdown, determines the line numbers for comments, and creates HTML. It sends that HTML over IPC to the VSCode extension.</li><li>The VSCode receives the IPC message, displays the HTML in the sidebar, and creates the comments in the code.</li></ul><p>It works, but it’s a giant Rube Goldberg machine.</p><h3>SymmACP += Enriched conversation history</h3><p>With SymmACP, we would structure the passthrough mechanism as a proxy. Just as today, it would provide an MCP tool to the agent to receive the walkthrough markdown. It would then convert that into the HTML to display on the side along with the various comments to embed in the code. But this is where things are different.</p><p>Instead of sending that content over IPC, what I would want to do is to make it possible for proxies to deliver extra information along with the chat. This is relatively easy to do in ACP as is, since it provides for various capabilities, but I think I’d want to go one step further</p><p>I would have a proxy layer that manages walkthroughs. As we saw before, it would provide a tool. But there’d be one additional thing, which is that, beyond just a chat history, it would be able to convey additional state. I think the basic conversation structure is like:</p><ul><li>Conversation<ul><li>Turn<ul><li>User prompt(s) – could be zero or more</li><li>Response(s) – could be zero or more</li><li>Tool use(s) – could be zero or more</li></ul></li></ul></li></ul><p>but I think it’d be useful to (a) be able to attach metadata to any of those things, e.g., to add extra context <em>about the conversation</em> or <em>about a specific turn</em> (or even a specific <em>prompt</em>), but also additional kinds of events. For example, tool approvals are an <em>event</em>. And presenting a walkthrough and adding annotations are an event too.</p><p>The way I imagine it, one of the core things in SymmACP would be the ability to serialize your state to JSON. You’d be able to ask a SymmACP paricipant to summarize a session. They would in turn ask any delegates to summarize and then add their own metadata along the way. You could also send the request in the <em>other</em> direction – e.g., the agent might present its state to the editor and ask it to augment it.</p><h3>Enriched history would let walkthroughs be extra metadata</h3><p>This would mean a walkthrough proxy could add extra metadata into the chat transcript like “the current walkthrough” and “the current comments that are in place”. Then the <em>editor</em> would either <em>know</em> about that metadata or not. If it doesn’t, you wouldn’t see it in your chat. Oh well – or perhaps we do something HTML like, where there’s a way to “degrade gracefully” (e.g., the walkthrough could be presented as a regular “response” but with some metadata that, if you know to look, tells you to interpret it differently). But if the editor DOES know about the metadata, it interprets it specially, throwing the walkthrough up in a panel and adding the comments into the code.</p><p>With enriched histories, I think we can even say that in SymmACP, the ability to load, save, and persist sessions <em>itself</em> becomes an extension, something that can be implemented by a proxy; the base protocol only needs the ability to conduct and serialize a conversation.</p><h3>Final feature: Smarter tool delegation.</h3><p>Let me sketch out another feature that I’ve been noodling on that I think would be pretty cool. It’s well known that there’s a problem that LLMs get confused when there are too many MCP tools available. They get distracted. And that’s sensible, so would I, if I were given a phonebook-size list of possible things I could do and asked to figure something out. I’d probably just ignore it.</p><p>But how do humans deal with this? Well, we don’t take the whole phonebook – we got a shorter list of <em>categories</em> of options and then we drill down. So I go to the File Menu and <em>then</em> I get a list of options, not a flat list of commands.</p><p>I wanted to try building an MCP tool for IDE capabilities that was similar. There’s a bajillion set of things that a modern IDE can “do”. It can find references. It can find definitions. It can get type hints. It can do renames. It can extract methods. In fact, the list is even open-ended, since extensions can provide their <em>own</em> commands. I don’t know what all those things <em>are</em> but I have a sense for the <em>kinds of things</em> an IDE can do – and I suspect models do too.</p><p>What if you gave them a single tool, “IDE operation”, and they could use plain English to describe what they want? e.g., <code>ide_operation("find definition for the ProxyHandler that referes to HTTP proxies")</code>. Hmm, this is sounding a lot like a delegate, or a sub-agent. Because now you need to use a second LLM to interpret that request – you probably want to do something like, give it a list of sugested IDE capabilities and the ability to find out full details and ask it to come up with a plan (or maybe directly execute the tools) to find the answer.</p><p>As it happens, MCP <em>has</em> a capability to enable tools to do this – it’s called (somewhat oddly, in my opinion) “sampling”. It allows for “callbacks” from the MCP tool to the LLM. But literally <em>nobody</em> implements it, from what I can tell.<sup id="fnref:4"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:4">4</a></sup> But sampling is kind of limited anyway. With SymmACP, I think you could do much more interesting things.</p><h3>SymmACP.contains(simultaneous_sessions)</h3><p>The key is that ACP already permits a single agent to “serve up” many simultaneous sessions. So that means that if I have a proxy, perhaps one supplying an MCP tool definition, I could use it to start <em>fresh</em> sessions – combine that with the “history replay” capability I mentioned above, and the tool can control exactly what context to bring over into that session to start from, as well, which is very cool (that’s a challenge for MCP servers today, they don’t get access to the conversation history).</p><pre class="mermaid">sequenceDiagram participant E as Editor participant P as Proxy participant A as Agent A-&gt;&gt;P: ide_operation("...") activate P P-&gt;&gt;A: new_session activate P activate A P-&gt;&gt;A: prompt("Using these primitive operations, suggest a way to do '...'") A-&gt;&gt;P: ... A-&gt;&gt;P: end_turn deactivate P deactivate A Note over P: performs the plan P-&gt;&gt;A: result from tool deactivate P </pre><h3>Conclusion</h3><p>Ok, this post sketched a variant on <a href="https://agentclientprotocol.com/overview/introduction">ACP</a> that I call SymmACP. SymmACP extends ACP with</p><ul><li>the ability for either side to provide the initial state of a conversation, not just the server</li><li>the ability for an “editor” to provide an MCP tool to the “agent”</li><li>the ability for agents to respond without an initial prompt</li><li>the ability to serialize conversations and attach extra state (already kind of present)</li></ul><p>Most of these are modest extensions to ACP, in my opinion, and easily doable in a backwards fashion just by adding new capabilities. <strong>But together they unlock the ability for anyone to craft extensions to agents and deploy them in a composable way.</strong> I am super excited about this. This is exactly what I wanted Symposium to be all about.</p><p>It’s worth noting the old adage: “with great power, comes great responsibility”. These proxies and ACP layers I’ve been talking about are really like IDE extensions. They can effectively do <em>anything</em> you could do. There are obvious security concerns. Though I think that approaches like Microsoft’s <a href="https://opensource.microsoft.com/blog/2025/08/06/introducing-wassette-webassembly-based-tools-for-ai-agents/">Wassette</a> are key here – it’d be awesome to have a “capability-based” notion of what a “proxy layer” is, where everything compiles to WASM, and where users can tune what a given proxy can actually <em>do</em>.</p><p>I plan to start sketching a plan to drive this work in <a href="https://symposium-dev.github.io/symposium/">Symposium</a> and elsewhere. My goal is to have a completely open and interopable client, one that can be based on any agent (including local ones) and where you can pick and choose which parts you want to use. I expect to build out lots of custom functionality to support Rust development (e.g., explaining and diagnosting trait errors using the new trait solver is high on my list…and macro errors…) but also to have other features like walkthroughs, collaborative interaction style, etc that are all language independent – and I’d love to see language-focused features for other langauges, especially Python and TypeScript (because <a href="https://smallcultfollowing.com/babysteps/blog/2025/07/31/rs-py-ts-trifecta/">“the new trifecta”</a>) and Swift and Kotlin (because mobile). If that vision excites you, come join the <a href="https://symposium-dev.zulipchat.com/">Symposium Zulip</a> and let’s chat!</p><h3>Appendix: A guide to the agent protocols I’m aware of</h3><p>One question I’ve gotten when discussing this is how it compares to the other host of protocols out there. Let me give a brief overview of the related work and how I understand its pros and cons:</p><ul><li><em><a href="https://modelcontextprotocol.io/docs/getting-started/intro">Model context protocol (MCP)</a>:</em> The queen of them all. A protocol that provides a set of tools, prompts, and resources up to the agent. Agents can invoke tools by supplying appropriate parameters, which are JSON. Prompts are shorthands that users can invoke using special commands like <code>/</code> or <code>@</code>, they are essentially macros that expand “as if the user typed it” (but they can also have parameters and be dynamically constructed). <em>Resources</em> are just data that can be requested. MCP servers can either be local or hosted remotely. Remote MCP has only recently become an option and auth in particular is limited.<ul><li>Comparison to SymmACP: MCP provides tools that the agent can invoke. SymmACP builds on it by allowing those tools to be provided by outer layers in the proxy chain. SymmACP is oriented at controlling the whole chat “experience”.</li></ul></li><li><em><a href="https://agentclientprotocol.com/overview/introduction">Zed’s Agent Client Protocol (ACP)</a>:</em> The basis for SymmACP. Allows editors to create and manage sessions. Focused only on local sessions, since your editor runs locally.<ul><li>Comparison to SymmACP: That’s what this post is all about! SymmACP extends ACP with new capabilities that let intermediate layers manipulate history, provide tools, and provide extended data upstream to support richer interaction patterns than jus chat. PS I expect we may want to support more remote capabilities, but it’s kinda orthogonal in my opinion (e.g., I’d like to be able to work with an agent running over in a cloud-hosted workstation, but I’d probably piggyback on ssh for that).</li></ul></li><li><em><a href="https://developers.googleblog.com/en/a2a-a-new-era-of-agent-interoperability/">Google’s Agent-to-Agent Protocol (A2A)</a> and <a href="https://www.ibm.com/think/topics/agent-communication-protocol">IBM’s Agent Communication Protocol (ACP)</a><sup id="fnref:5"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:5">5</a></sup>:</em> From what I can tell, Google’s “agent-to-agent” protocol is <em>kinda</em> like a mix of MCP and OpenAPI. You can ping agents that are running remotely and get them to send you “agent cards”, which describe what operations they can perform, how you authenticate, and other stuff like that. It looks to me quite similar to MCP except that it has richer support for remote execution and in particular supports things like long-running communication, where an agent may need to go off and work for a while and then ping you back on a webhook.<ul><li><em>Comparison to MCP:</em> To me, A2A looks like a variant of MCP that is more geared to remote execution. MCP has a method for tool discovery where you ping the server to get a list of tools; A2A has a similar mechanism with Agent Cards. MCP can run locally, which A2A cannot afaik, but A2A has more options about auth. MCP can only be invoked synchronously, whereas A2A supports long-running operations, progress updates, and callbacks. It seems like the two could be merged to make a single whole.</li><li><em>Comparison to SymmACP:</em> I think A2A is orthogonal from SymmACP. A2A is geared to agents that provide services to one another. SymmACP is geared towards building new development tools for interacting with agents. It’s possible you could build something like SymmACP <em>on</em> A2A but I don’t know what you would really gain by it (and I think it’d be easy to do later).</li></ul></li></ul><div class="footnotes"><hr /><ol><li id="fn:1"><p>Everybody uses agents in various ways. I like Simon Willison’s <a href="https://simonwillison.net/2025/May/22/tools-in-a-loop/">“agents are models using tools in a loop”</a> definition; I feel that an “agentic CLI tool” fits that definition, it’s just that part of the loop is reading input from the user. I think “fully autonomous” agents are a subset of all agents – many agent processes interact with the outside world via tools etc. From a certain POV, you can view the agent “ending the turn” as invoking a tool for “gimme the next prompt”. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:1">↩︎</a></p></li><li id="fn:2"><p>Research reports are a <strong>major</strong> part of how I avoid hallucination. You can see an example of one such report I commissioned on the <a href="https://symposium-dev.github.io/symposium/research/lsp-overview/index.html">details of the Language Server Protocol here</a>; if we were about to embark on something that required detailed knowledge of LSP, I would ask the agent to read that report first. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:2">↩︎</a></p></li><li id="fn:3"><p>Alternatively: clear the session history and rebuild it, but I kind of prefer the functional view of the world, where a given session never changes. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:3">↩︎</a></p></li><li id="fn:4"><p>I started an implementation for Q CLI but got distracted – and, for reasons that should be obvious, I’ve started to lose interest. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:4">↩︎</a></p></li><li id="fn:5"><p>Yes, you read that right. There is another ACP. Just a mite confusing when you google search. =) <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:5">↩︎</a></p></li></ol></div></description> <pubDate>Wed, 08 Oct 2025 08:54:08 +0000</pubDate></item><item> <title>This Week In Rust: This Week in Rust 620</title> <guid isPermaLink="false">tag:this-week-in-rust.org,2025-10-08:/blog/2025/10/08/this-week-in-rust-620/</guid> <link>https://this-week-in-rust.org/blog/2025/10/08/this-week-in-rust-620/</link> <description><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/master/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="http://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4> <h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5><ul><li><a href="https://www.sea-ql.org/blog/2025-10-08-seaography/">Seaography 2.0: A Powerful and Extensible GraphQL Framework</a></li><li><a href="https://github.com/redis-rs/redis-rs/blob/redis-1.0.0-rc.0/version1.md">Announcing redis-rs 1.0.0 release candidate</a></li><li><a href="https://github.com/libbpf/blazesym/discussions/1318">blazesym 0.2 stable release: batteries included address symbolization</a></li><li><a href="https://lwn.net/SubscriberLink/1039784/d2548814efb78046/">Kernel hackers at Cauldron, 2025 edition</a></li><li><a href="https://lwn.net/SubscriberLink/1038757/d613acbb48f20a20/">Progress on defeating lifetime-end pointer zapping</a></li><li><a href="https://lwn.net/SubscriberLink/1039073/abf96f38b178f988/">Upcoming Rust language features for kernel development</a></li><li><a href="https://github.com/VincentVerdynanta/utsuru/releases/tag/v0.2.1">utsuru: "Go Live" on Discord using OBS, FFmpeg, or anything that supports WHIP.</a></li><li><a href="https://aladin.cds.unistra.fr/AladinLite/doc/">Aladin Lite - navigate into TBs of astronomical data coming from various space missions</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5><ul><li><a href="https://smallcultfollowing.com/babysteps/blog/2025/10/07/the-handle-trait/">The Handle trait</a></li><li><a href="https://www.wakunguma.com/blog/variadic-generics">Variadic generics</a></li><li><a href="https://tritium.legal/blog/word">Thoughts on the Word Spec in Rust</a></li><li><a href="https://medium.com/agoda-engineering/why-we-bet-on-rust-to-supercharge-feature-store-at-agoda-ed4a70d2efb7">Why We Bet on Rust to Supercharge Feature Store at Agoda</a></li><li><a href="https://nubskr.com/2025/10/06/walrus.html">walrus: ingesting data at memory speeds</a></li><li><a href="https://blog.inkreas.ing/realtime-concurrency">Realtime concurrency primitives</a></li><li><a href="https://databento.com/blog/why-we-didnt-rewrite-our-feed-handler-in-rust">Why we didn't rewrite our feed handler in Rust</a></li><li>[audio] <a href="https://netstack.fm/#episode-7">Netstack.FM Episode 7 – Rustls with Dirkjan Ochtman</a></li><li>[audio] <a href="https://netstack.fm/#episode-8">Netstack.FM Episode 8 – Fuchsia's Netstack3 with Bruno Dal Bo Silva</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5><ul><li><a href="https://blog.0xshadow.dev/posts/backend-engineering-with-axum/axum-reset-password/">Axum Backend Series: Implementing Password Reset</a></li><li><a href="https://blog.0xshadow.dev/posts/backend-engineering-with-axum/axum-email-verification/">Axum Backend Series: Email Verification After Registration</a></li><li><a href="https://vaktibabat.github.io/posts/hyperloglog/">Fun With HyperLogLog and SIMD</a></li><li><a href="https://pawelurbanek.com/rust-optimize-performance">How to automatically Profile Performance of Rust Applications</a></li><li><a href="https://biriukov.dev/docs/async-rust-tokio-io/1-async-rust-with-tokio-io-streams-backpressure-concurrency-and-ergonomics/">Async Rust with Tokio I/O Streams: Backpressure, Concurrency, and Ergonomics</a></li><li><a href="https://www.svix.com/blog/preventing-db-misuse-at-compile-time/">Preventing Invalid Database Access At Compile Time</a></li><li><a href="https://jorgeortiz.dev/posts/rust_unit_testing_test_doubles_stub/">Rust unit testing: test doubles &amp; stubs</a></li><li><a href="https://sunshowers.io/posts/cancelling-async-rust/">Cancelling async Rust</a></li><li><a href="https://kerkour.com/rust-pingoo-high-performance-allocations-mimalloc-heapless">Behind the Scenes of Pingoo: Slashing allocations with mimalloc and heapless to build the fastest reverse proxy</a></li><li><a href="https://michaelmauderer.com/blog/generic-numeric-computations/">Generic Numeric Computations in Rust </a></li><li><a href="https://hackeryarn.com/post/rust-macros-3/">Let's write a macro in Rust - Part 3</a></li><li><a href="https://tylerjw.dev/posts/20251003-rust-cpp-interop-2025-update/">Rust/C++ Interop Part 5 - Interop in 2025: A Complete Example</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#miscellaneous">Miscellaneous</a></h5><ul><li>[videos] <a href="https://www.youtube.com/playlist?list=PL2b0df3jKKiRFEuVNk76ufXagOgEJ9sBZ">RustConf 2025</a></li><li>[audio] <a href="https://corrode.dev/podcast/s05e01-prime-video/">Prime Video - Alexandru Ene, Principal Engineer</a></li></ul><h4><a class="toclink" href="http://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/tokio-netem">tokio-netem</a>, a toolbox of Tokio AsyncRead /AsyncWrite adapters to emulate latency, throttling, slicing, termination, forced shutdown, data injection and data corruption.</p><p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1478">Viacheslav Biriukov</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="http://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 theimplementation 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/orguidance on which aspect(s) of the feature need testing.</p><ul><li><em>No calls for testing were issued this week by <a href="https://github.com/rust-lang/rust/labels/call-for-testing">Rust</a>, <a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing">Rust language RFCs</a>, <a href="https://github.com/rust-lang/cargo/labels/call-for-testing">Cargo</a> or <a href="https://github.com/rust-lang/rustup/labels/call-for-testing">Rustup</a>.</em></li></ul><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><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rfcs"></a><a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing">RFCs</a></h5><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust"></a><a href="https://github.com/rust-lang/rust/labels/call-for-testing">Rust</a></h5><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rustup"></a><a href="https://github.com/rust-lang/rustup/labels/call-for-testing">Rustup</a></h5><p>If you are a feature implementer and would like your RFC to appear on the above list, add the new <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 featureneed testing.</p><h4><a class="toclink" href="http://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="http://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><em>No Calls for participation were submitted this week.</em></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://x.com/ThisWeekInRust">X (formerly Twitter)</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#cfp-events">CFP - Events</a></h5><p>Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.</p><ul><li><a href="https://tokio.rs/blog/2025-09-26-announcing-tokio-conf-cfp"><strong>TokioConf 2026</strong></a>| CFP closes 2025-12-08 | Portland, Oregon, USA | 2026-04-20</li></ul> <p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://x.com/ThisWeekInRust">X (formerly Twitter)</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p><h4><a class="toclink" href="http://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4><p>398 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2025-09-30..2025-10-07">merged in the last week</a></p><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/146596">add a dummy codegen backend</a></li><li><a href="https://github.com/rust-lang/rust/pull/147299">don't normalize higher-ranked assumptions if they're not used</a></li><li><a href="https://github.com/rust-lang/rust/pull/147231">extending <code>#[rustc_force_inline]</code> to be applicable to inherent methods</a></li><li><a href="https://github.com/rust-lang/rust/pull/147184">fix the bevy implied bounds hack for the next solver</a></li><li><a href="https://github.com/rust-lang/rust/pull/146355">Global Value Numbering: support unions</a></li><li><a href="https://github.com/rust-lang/rust/pull/144477">Global Value Numbering: use a VnIndex in Address projection</a></li><li><a href="https://github.com/rust-lang/miri/pull/4611">miri: add support for temporal mixing of atomic and non-atomic accesses in GenMC mode</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#library">Library</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/145685">add <code>CloneFromCell</code> and <code>Cell::get_cloned</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/142506">add <code>Path::has_trailing_sep</code> and related methods</a></li><li><a href="https://github.com/rust-lang/rust/pull/146479">add <code>mem::conjure_zst</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/143069">add fast-path for accessing the current thread id</a></li><li><a href="https://github.com/rust-lang/rust/pull/147227">implement <code>Box::take</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/147328">implement non-poisoning <code>Mutex::with_mut</code>, <code>RwLock::with</code> and <code>RwLock::with_mut</code></a></li><li><a href="https://github.com/rust-lang/hashbrown/pull/523">hashbrown: recognize and use over sized allocations</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6><ul><li><a href="https://github.com/rust-lang/cargo/pull/16027"><code>fix(run)</code>: Override arg0 for cargo scripts</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16055"><code>fix(timings)</code>: compute codegen start time to draw dep lines</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16026"><code>fix(toml)</code>: Prevent non-script fields in Cargo scripts</a></li><li><a href="https://github.com/rust-lang/cargo/pull/15891">accessing each build script's <code>OUT_DIR</code></a></li><li><a href="https://github.com/rust-lang/cargo/pull/16041">add panic=immediate-abort support to Cargo</a></li><li><a href="https://github.com/rust-lang/cargo/pull/15966">consider public dependencies when choosing a version in cargo add (#1…</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16035">convert a multi-part diagnostic to a report</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16046">feat (publish): deprecate <code>--token</code> option</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16036">fix FileLock path tracking after rename in package operation</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16058">fix <code>unsafe_op_in_unsafe_fn</code> for Windows</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16025">fix: remove FIXME comment that's no longer a problem</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16039">lockfile schemas error cleanup</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16002">public in private manifest errors</a></li><li><a href="https://github.com/rust-lang/cargo/pull/15806">recommend <code>package.rust-version</code> in the Rust version section of <code>reference/semver.md</code></a></li><li><a href="https://github.com/rust-lang/cargo/pull/16052">test: null-terminated path for reserved windows name detection</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rustdoc">Rustdoc</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/147189">replace <code>rustc_span::Span</code> with a stripped down version for librustdoc's highlighter</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6><ul><li><a href="https://github.com/rust-lang/rust-clippy/pull/15774"><code>assertions_on_constants</code>: Suggest using a const block when using a named constant</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15814"><code>zero_repeat_side_effects</code>: better identify exprs with side effects</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15773">const eval changes</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15746">do not suggest using a <code>if let</code> chain if it is not supported</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15729">do not trigger <code>inefficient_to_string</code> after Rust 1.82</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15701">extend <code>while_let_loop</code> to <code>loop { let else }</code></a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15783">fix <code>if_then_some_else_none</code> false positive when return exists in block expr</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15791">fix <code>let_unit_value</code> suggests wrongly for field init shorthand</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15786">fix <code>mem_replace_with_default</code> wrongly unmangled macros</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15686">implement <code>volatile_composites</code> lint</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust-analyzer">Rust-Analyzer</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/141839">make rust-analyzer use a dedicated build directory</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20794">deduplicate sort+dedup calls</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20806">log flycheck stdout and stderr to files</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20793">fix missing parentheses for <code>missing_unsafe</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20777">fix panic when using analysis-stats</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20787">fix erroneous diagnostic <code>incorrect_generics_len</code> when there are generics on <code>enum</code> variant used through type alias</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20770">ignore impl trait safety errors when the trait is unresolved</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5><p>Largely a positive week. Big win coming from avoiding unnecessary work for debug log in <a href="https://github.com/rust-lang/rust/pull/147293">#147293</a>, and another one for rustdoc from optimized span representation for highlighter <a href="https://github.com/rust-lang/rust/pull/147189">#147189</a>. Lots of noisy results otherwise.</p><p>Triage done by <strong>@panstromek</strong>.Revision range: <a href="https://perf.rust-lang.org/?start=8d72d3e1e96f58ca10059a6bb6e8aecba4a0e9cd&amp;end=1a3cdd34629306fa67624eaa60d73687e7fcf855&amp;absolute=false&amp;stat=instructions%3Au">8d72d3e1..1a3cdd34</a></p><p><strong>Summary</strong>:</p><table><thead><tr><th align="center">(instructions:u)</th><th align="center">mean</th><th align="center">range</th><th align="center">count</th></tr></thead><tbody><tr><td align="center">Regressions ❌ <br /> (primary)</td><td align="center">0.5%</td><td align="center">[0.2%, 2.0%]</td><td align="center">10</td></tr><tr><td align="center">Regressions ❌ <br /> (secondary)</td><td align="center">0.4%</td><td align="center">[0.0%, 0.8%]</td><td align="center">50</td></tr><tr><td align="center">Improvements ✅ <br /> (primary)</td><td align="center">-1.3%</td><td align="center">[-5.3%, -0.2%]</td><td align="center">147</td></tr><tr><td align="center">Improvements ✅ <br /> (secondary)</td><td align="center">-1.3%</td><td align="center">[-12.7%, -0.1%]</td><td align="center">111</td></tr><tr><td align="center">All ❌✅ (primary)</td><td align="center">-1.2%</td><td align="center">[-5.3%, 2.0%]</td><td align="center">157</td></tr></tbody></table><p>6 Regressions, 3 Improvements, 6 Mixed; 8 of them in rollups40 artifact comparisons made in total</p><p><a href="https://github.com/rust-lang/rustc-perf/blob/33d1d2f6103c22772c45562aa159d1e1257c228e/triage/2025/2025-10-06.md">Full report here</a></p><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#approved-rfcs"></a><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>. Theseare 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="http://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 PRswhich are reaching a decision. Express your opinions now.</p><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust_1"></a><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Rust</a><ul><li><a href="https://github.com/rust-lang/rust/pull/145924">Uplifts and extends <code>clippy::needless-maybe-sized</code> into rustc</a></li><li><a href="https://github.com/rust-lang/rust/pull/144064">prefer alias candidates for sizedness + auto trait goals</a></li><li><a href="https://github.com/rust-lang/rust/pull/145722">implement Extend&lt;{Group, Literal, Punct, Ident}&gt; for TokenStream</a></li></ul><a class="toclink" href="http://this-week-in-rust.org/atom.xml#cargo_1"></a><a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Cargo</a><ul><li><a href="https://github.com/rust-lang/cargo/issues/13051">Add <code>target="host"</code> meaning the current host</a></li></ul><p><em>No Items entered Final Comment Period this week for <a href="https://github.com/rust-lang/rfcs/labels/final-comment-period">Rust RFCs</a>, <a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc+">Language Team</a>, <a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Language Reference</a>, <a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period">Leadership Council</a> or <a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">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><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"></a><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h6><ul><li><a href="https://github.com/rust-lang/rfcs/pull/3869">RFC: Allow <code>#[ignore(Trait)]</code> on field to ignore it when deriving <code>Trait</code></a></li></ul><h4><a class="toclink" href="http://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4><p>Rusty Events between 2025-10-08 - 2025-11-05 🦀</p><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5><ul><li>2025-10-08 | Virtual (Boulder, CO, US) | <a href="https://www.meetup.com/boulder-elixir/events/">Boulder Elixir</a><ul><li><a href="https://www.meetup.com/boulder-elixir/events/310996627/"><strong>Integrating Elixir and Apache DataFusion with Rustler</strong></a></li></ul></li><li>2025-10-09 - 2025-10-10 | Hybrid (Paris, FR) | <a href="https://eurorust.eu/">EuroRust</a><ul><li><a href="https://eurorust.eu/schedule/"><strong>EuroRust 2025</strong></a></li></ul></li><li>2025-10-09 | 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/306046639/"><strong>Rust Hack and Learn</strong></a></li></ul></li><li>2025-10-09 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/jotnli2g"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-10-09 | Virtual (San Diego, CA, US) | <a href="https://www.meetup.com/san-diego-rust">San Diego Rust</a><ul><li><a href="https://www.meetup.com/san-diego-rust/events/311359525/"><strong>San Diego Rust October 2025 Online Meetup</strong></a></li></ul></li><li>2025-10-12 | 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/311109160/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-10-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/305361534/"><strong>Second Tuesday</strong></a></li></ul></li><li>2025-10-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/307731034/"><strong>indielinks</strong></a></li></ul></li><li>2025-10-16 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/o8fh3fh7"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-10-16 | 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/306046668/"><strong>Rust Nürnberg online</strong></a></li></ul></li><li>2025-10-18 | Virtual (Gdansk, PL) | <a href="https://www.meetup.com/stacja-it-trojmiasto/">Stacja IT Trójmiasto</a><ul><li><a href="https://www.meetup.com/stacja-it-trojmiasto/events/310935164/"><strong>[BEZPŁATNIE] Programowanie w języku Rust</strong></a></li></ul></li><li>2025-10-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/311109167/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-10-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/311068625/"><strong>👋 Community Catch Up</strong></a></li></ul></li><li>2025-10-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/310002307/"><strong>Mid-month Rustful</strong></a></li></ul></li><li>2025-10-23 | 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/311351020/"><strong>October, 2025 SRUG (Seattle Rust User Group) Meetup</strong></a></li></ul></li><li>2025-10-23 | 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/306046641/"><strong>Rust Hack and Learn</strong></a></li></ul></li><li>2025-10-23 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/zyc3touy"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-10-26 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul><li><a href="https://www.meetup.com/dallasrust/events/311109171/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-10-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/305361444/"><strong>Fourth Tuesday</strong></a></li></ul></li><li>2025-10-30 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/t8yovmmm"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-11-01 | Virtual (Kampala, UG) | <a href="https://www.eventbrite.com/o/rust-circle-kampala-65249289033">Rust Circle Meetup</a><ul><li><a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763868657"><strong>Rust Circle Meetup</strong></a></li></ul></li><li>2025-11-02 | 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/311109173/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-11-05 | Virtual (Buffalo, NY, US) | <a href="https://www.meetup.com/buffalo-rust-meetup">Buffalo Rust Meetup</a><ul><li><a href="https://www.meetup.com/buffalo-rust-meetup/events/305304242/"><strong>Buffalo Rust User Group</strong></a></li></ul></li><li>2025-11-05 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul><li><a href="https://www.meetup.com/indyrs/events/wqzhftyhcpbhb/"><strong>Indy.rs - with Social Distancing</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#asia">Asia</a></h5><ul><li>2025-10-08 | Kuala Lumpur, MY | <a href="https://t.me/rustlangmalaysia">Rust Malaysia</a><ul><li><a href="https://docs.google.com/forms/d/e/1FAIpQLScESY4eHc5lzZznAHZmFxI85CYaOKCYTQASRwXxC2y0KpI6zw/viewform"><strong>Malaysia Rust Meetup</strong></a></li></ul></li><li>2025-10-09 | Tokyo, JP | <a href="https://www.meetup.com/tokyo-rust-meetup">Tokyo Rust Meetup</a><ul><li><a href="https://www.meetup.com/tokyo-rust-meetup/events/310899137/"><strong>Building Pocket-Sized Terminal UIs with Rust</strong></a></li></ul></li><li>2025-10-20 | Tel Aviv-yafo, IL | <a href="https://www.meetup.com/rust-tlv">Rust 🦀 TLV</a><ul><li><a href="https://www.meetup.com/rust-tlv/events/310628902/"><strong>In person Rust October 2025 at AWS in Tel Aviv</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#europe">Europe</a></h5><ul><li>2025-10-08 | Girona, ES | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul><li><a href="https://luma.com/8u55jo0h"><strong>Rust Girona Hack &amp; Learn 10 2025</strong></a></li></ul></li><li>2025-10-08 | Paris, FR | <a href="https://www.meetup.com/rust-paris">Rust Paris</a><ul><li><a href="https://www.meetup.com/rust-paris/events/310424476/"><strong>Rust meetup #79</strong></a></li></ul></li><li>2025-10-08 | Reading, UK | <a href="https://www.meetup.com/reading-rust-workshop">Reading Rust Workshop</a><ul><li><a href="https://www.meetup.com/reading-rust-workshop/events/308944041/"><strong>Reading Rust Meetup</strong></a></li></ul></li><li>2025-10-09 - 2025-10-10 | Hybrid (Paris, FR) | <a href="https://eurorust.eu/">EuroRust</a><ul><li><a href="https://eurorust.eu/schedule/"><strong>EuroRust 2025</strong></a></li></ul></li><li>2025-10-14 | Basel, CH | <a href="https://www.meetup.com/rust-basel">Rust Basel</a><ul><li><a href="https://www.meetup.com/rust-basel/events/310827834/"><strong>Rust Meetup #13 @ letsboot</strong></a></li></ul></li><li>2025-10-21 | Aarhus, DK | <a href="https://www.meetup.com/rust-aarhus">Rust Aarhus</a><ul><li><a href="https://www.meetup.com/rust-aarhus/events/311035141/"><strong>Hack Night</strong></a></li></ul></li><li>2025-10-21 | Bergen, No | <a href="https://www.meetup.com/bergen-rust-new-technology/events/">Rust Bergen</a><ul><li><a href="https://www.meetup.com/bergen-rust-new-technology/events/311153821/"><strong>Rust Meetup #01 @ Zrch</strong></a></li></ul></li><li>2025-10-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/308592252/"><strong>Topic TBD</strong></a></li></ul></li><li>2025-10-21 | 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/310813952/"><strong>Rust in Surgery: Powering the Data Pipelines</strong></a></li></ul></li><li>2025-10-28 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul><li><a href="https://www.meetup.com/rust-manchester/events/307919171/"><strong>Rust Manchester October Code Night</strong></a></li></ul></li><li>2025-10-30 | 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/311405044/"><strong>Rust meetup #62 sponsored by Google!</strong></a></li></ul></li><li>2025-10-30 | Prague, CZ | <a href="https://www.meetup.com/rust-prague">Rust Prague</a><ul><li><a href="https://www.meetup.com/rust-prague/events/310967094/"><strong>Rust Meetup Prague (October 2025)</strong></a></li></ul></li><li>2025-11-02 - 2025-11-04 | Florence, IT | <a href="https://rustlab.it/">Rustlab 2025</a><ul><li><a href="https://rustlab.it/"><strong>Rustlab 2025</strong></a></li></ul></li><li>2025-11-04 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul><li><a href="https://www.meetup.com/rust-manchester/events/310921632/"><strong>Rust Manchester November Talk</strong></a></li></ul></li><li>2025-11-05 | Oslo, NO | <a href="https://www.meetup.com/rust-oslo">Rust Oslo</a><ul><li><a href="https://www.meetup.com/rust-oslo/events/310601872/"><strong>Rust Hack'n'Learn at Kampen Bistro</strong></a></li></ul></li><li>2025-11-05 | 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/nnrkttyhcpbhb/"><strong>Rust/ACCU meetup.</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#north-america">North America</a></h5><ul><li>2025-10-08 | Phoenix, AZ, US | <a href="https://www.meetup.com/desert-rustaceans">Desert Rust</a><ul><li><a href="https://www.meetup.com/desert-rustaceans/events/311365791/"><strong>Rust &lt;&gt; C++</strong></a></li></ul></li><li>2025-10-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/311145663/"><strong>Aya the Beholder: Writing an eBPF Firewall with the Aya Crate</strong></a></li></ul></li><li>2025-10-14 | 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/311328171/"><strong>Rust NYC: Rust in Robotics &amp; Isograph</strong></a></li></ul></li><li>2025-10-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/307731034/"><strong>indielinks</strong></a></li></ul></li><li>2025-10-16 | 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/311012947/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li></ul></li><li>2025-10-16 | San Francisco, CA, US | <a href="https://luma.com/calendar/cal-Cnmn4RR2n4fRUNZ">Svix</a><ul><li><a href="https://luma.com/tp6w7tc9"><strong>San Francisco Rust Meetup</strong></a></li></ul></li><li>2025-10-21 | San Francisco, CA, US | <a href="https://luma.com/events-by-vara-gear">Vara &amp; Gear</a><ul><li><a href="https://luma.com/kbs2os1c"><strong>Rust Workshop by Vara Network</strong></a></li></ul></li><li>2025-10-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/308284343/"><strong>Rust Hacking in Person</strong></a></li></ul></li><li>2025-10-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/310457307/"><strong>Rust Lunch - Fareground</strong></a></li></ul></li><li>2025-10-23 | 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/311351020/"><strong>October, 2025 SRUG (Seattle Rust User Group) Meetup</strong></a></li></ul></li><li>2025-10-23 | Nashville, TN, US | <a href="https://www.meetup.com/music-city-rust-developers">Music City Rust Developers</a><ul><li><a href="https://www.meetup.com/music-city-rust-developers/events/304333267/"><strong>Year In Review</strong></a></li></ul></li><li>2025-10-23 | Spokane, WA, US | <a href="https://www.meetup.com/spokane-rust">Spokane Rust</a><ul><li><a href="https://www.meetup.com/spokane-rust/events/311346444/"><strong>October Rust Meetup: A Special Presentation and Monthly Meetups are Back!</strong></a></li></ul></li><li>2025-10-25 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul><li><a href="https://www.meetup.com/bostonrust/events/310983712/"><strong>Porter Square Rust Lunch, Oct 25</strong></a></li></ul></li><li>2025-10-30 | 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/308675988/"><strong>Rust-Atl</strong></a></li></ul></li><li>2025-11-01 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul><li><a href="https://www.meetup.com/bostonrust/events/311039492/"><strong>Chinatown Rust Lunch, Nov 1</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5><ul><li>2025-10-22 | 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/310847099/"><strong>October Meetup</strong></a></li></ul></li><li>2025-10-28 | 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/311234237/"><strong>October Meetup</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#south-america">South America</a></h5><ul><li>2025-10-08 | Buenos Aires, AR | <a href="https://www.meetup.com/rust-argentina">Rust en Español</a><ul><li><a href="https://www.meetup.com/rust-argentina/events/311276950/"><strong>Octubre Async - Escribimos un Runtime desde Cero!</strong></a></li></ul></li><li>2025-10-25 | São Paulo, BR | <a href="https://www.meetup.com/rust-sao-paulo-meetup">Rust São Paulo Meetup</a><ul><li><a href="https://www.meetup.com/rust-sao-paulo-meetup/events/311084440/"><strong>Encontro do Rust-SP na Amazon Web Services</strong></a></li></ul></li><li>2025-10-30 | Florianopolis, BR | <a href="https://luma.com/calendar/cal-iOloL5ZqswCO5Mm">Rust Brasil</a><ul><li><a href="https://luma.com/lky7an18"><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 getit 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="http://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/1nknaii/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p><h3><a class="toclink" href="http://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3><blockquote><p>For me personally, the best thing about becoming successful at anything is you gain the ability to lift others up.</p></blockquote><p>– <a href="https://youtu.be/nEHLIUWO78I?t=1175">Nell Shamrell-Harrington at RustConf</a> (youtube video link, the rest of the talk is great, too!)</p><p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1720">llogiq</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><em>This Week in Rust is edited by: <a href="https://github.com/nellshamrell">nellshamrell</a>, <a href="https://github.com/llogiq">llogiq</a>, <a href="https://github.com/cdmistman">cdmistman</a>, <a href="https://github.com/ericseppanen">ericseppanen</a>, <a href="https://github.com/extrawurst">extrawurst</a>, <a href="https://github.com/U007D">U007D</a>, <a href="https://github.com/joelmarcey">joelmarcey</a>, <a href="https://github.com/mariannegoldin">mariannegoldin</a>, <a href="https://github.com/bennyvasquez">bennyvasquez</a>, <a href="https://github.com/bdillo">bdillo</a></em></p><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/1o1uqur/this_week_in_rust_620/">Discuss on r/rust</a></small></p></description> <pubDate>Wed, 08 Oct 2025 04:00:00 +0000</pubDate> <dc:creator>TWiR Contributors</dc:creator></item><item> <title>The Mozilla Blog: Firefox profiles: Private, focused spaces for all the ways you browse</title> <guid isPermaLink="false">https://blog.mozilla.org/?p=82094</guid> <link>https://blog.mozilla.org/en/firefox/profile-management/</link> <description><p>Every part of your life has its own rhythm: work, school, family, personal projects. Beginning Oct. 14, we’re rolling out a new <a href="https://support.mozilla.org/kb/profile-management#w_is-this-feature-available-on-android-or-ios">profile management feature in Firefox</a> so you can keep them separate and create distinct spaces — each with its own bookmarks, logins, history, extensions and themes. It’s an easy way to stay organized, focused and private.</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/2025/10/firefox-profiles.png" rel="noreferrer noopener" target="_blank"><img alt="Firefox Profiles feature shown with an illustration of three foxes and a setup screen for creating and customizing browser profiles." class="wp-image-82095" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/10/firefox-profiles-1024x576.png" style="width: 675px;" width="1024" /></a></figure></div> <h3><strong>Spaces that lighten your load</strong></h3> <p>Profiles don’t just keep you organized; they also reduce data mixing and <a href="https://blog.mozilla.org/firefox/multitasking/">ease cognitive load</a>. By keeping your different roles online neatly separate, you spend less mental energy juggling contexts and avoid awkward surprises (like your weekend plans popping up in a work presentation). And, like everything in Firefox, profiles are built on our <a href="https://blog.mozilla.org/privacy-security/mozilla-anti-tracking-milestones-timeline/">strong privacy foundation</a>.</p> <p>We also <a href="https://blog.mozilla.org/firefox/shifting-left-for-better-accessibility/">worked with disabled people</a> to make profiles not only compliant, but genuinely delightful to use for everyone. That collaboration shaped everything from the visual design (avatars, colors, naming) to the way profiles keep sensitive data (like medical information) private. It’s an example of how designing for accessibility boundaries benefits all of us.</p> <h3><strong>What makes profiles in Firefox different</strong></h3> <p>Other browsers offer profiles mainly for convenience. Firefox goes further by making them part of our mission to put you in control of your online life.</p> <ul><li><strong>Privacy first:</strong> Firefox is built with privacy as a default. We don’t know your age, gender, precise location, name of your profile, or other information Big Tech collects and profits from. Each profile keeps its own browsing data separate. No mixing, no surprise leaks.<br /></li> <li><strong>Custom spaces:</strong> Pick colors and themes to make each profile easy to spot at a glance. You can even upload your own avatar. Your work profile can feel buttoned-up, while your personal profile reflects your style.</li></ul> <div class="wp-block-image"><figure class="aligncenter size-large is-resized"><a href="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/10/profiles-1.png" rel="noreferrer noopener" target="_blank"><img alt="Firefox Profile Manager showing Work and Personal profiles, with an option to create a new one, on a desktop with a forest background." class="wp-image-82118" height="533" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/10/profiles-1-1024x533.png" style="width: 675px;" width="1024" /></a></figure></div> <p>Profiles in Firefox aren’t just a way to clean up your tabs. They’re a way to set boundaries, protect your information and make the internet a little calmer. Because when your browser respects your focus and your privacy, it frees you up to do what actually matters — work, connect, create, explore — on your own terms.</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="" class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2021/10/Visual-Guidelines-800x800.png" width="800" /> </div> <div class="ft-c-inline-cta__content"> <h4>Take control of your internet</h4> <span>Download Firefox</span> </div></a><p>The post <a href="https://blog.mozilla.org/en/firefox/profile-management/">Firefox profiles: Private, focused spaces for all the ways you browse</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></description> <pubDate>Tue, 07 Oct 2025 14:11:44 +0000</pubDate> <dc:creator>Susmitha Burra</dc:creator></item><item> <title>Niko Matsakis: The Handle trait</title> <guid isPermaLink="false">https://smallcultfollowing.com/babysteps/blog/2025/10/07/the-handle-trait/</guid> <link>https://smallcultfollowing.com/babysteps/blog/2025/10/07/the-handle-trait/?utm_source=atom_feed</link> <description><p>There’s been a lot of discussion lately around ergonomic ref-counting. We had a lang-team design meeting and then a quite impactful discussion at the RustConf Unconf. I’ve been working for weeks on a follow-up post but today I realized what should’ve been obvious from the start – that if I’m taking that long to write a post, it means the post is too damned long. So I’m going to work through a series of smaller posts focused on individual takeaways and thoughts. And for the first one, I want to (a) bring back some of the context and (b) talk about an interesting question, <strong>what should we call the trait</strong>. My proposal, as the title suggests, is <code>Handle</code> – but I get ahead of myself.</p><h3>The story thus far</h3><p>For those of you who haven’t been following, there’s been an ongoing discussion about how best to have ergonomic ref counting:</p><ul><li>It began with the first Rust Project Goals program in 2024H2, where Jonathan Kelley from Dioxus wrote a <a href="https://dioxus.notion.site/Dioxus-Labs-High-level-Rust-5fe1f1c9c8334815ad488410d948f05e">thoughtful blog post about a path to high-level Rust</a> that eventually became a 2024H2 <a href="https://rust-lang.github.io/rust-project-goals/2024h2/ergonomic-rc.html">project goal towards ergonomic ref-counting</a>.</li><li>I wrote a <a href="https://smallcultfollowing.com/babysteps/series/claim/">series of blog posts about a trait I called <code>Claim</code></a>.</li><li>Josh and I talked and Josh opened <a href="https://github.com/rust-lang/rfcs/pull/3680">RFC #3680</a>, which proposed a <code>use</code> keyword and <code>use ||</code> closures. Reception, I would say, was mixed; yes, this is tackling a real problem, but there were lots of concerns on the approach. <a href="https://github.com/rust-lang/rfcs/pull/3680#issuecomment-2625526944">I summarized the key points here</a>.</li><li>Santiago implemented experimental support for (a variant of) <a href="https://github.com/rust-lang/rfcs/pull/3680">RFC #3680</a> as part of the <a href="https://rust-lang.github.io/rust-project-goals/2025h1/ergonomic-rc.html">2025H1 project goal</a>.</li><li>I authored a <a href="https://rust-lang.github.io/rust-project-goals/2025h2/ergonomic-rc.html">2025H2 project goal proposing that we create an alternative RFC focused on higher-level use-cases</a> which prompted Josh and I have to have a long and fruitful conversation in which he convinced me that this was not the right approach.</li><li>We had a lang-team design meeting on 2025-08-27 in which I presented this <a href="https://hackmd.io/@rust-lang-team/B12TpGhKle">survey and summary of the work done thus far</a>.</li><li>And then at the <a href="https://2025.rustweek.org/unconf/">RustConf 2025 Unconf</a> we had a big group discussion on the topic that I found very fruitful, as well as various follow-up conversations with smaller groups.</li></ul><h3>This blog post is about “the trait”</h3><p>The focus of this blog post is on one particular question: what should we call “The Trait”. In virtually every design, there has been <em>some kind</em> of trait that is meant to identify <em>something</em>. But it’s been hard to get a handle<sup id="fnref:1"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:1">1</a></sup> on what precisely that <em>something</em> is. What is this trait for and what types should implement it? Some things are clear: whatever The Trait is, <code>Rc&lt;T&gt;</code> and <code>Arc&lt;T&gt;</code> should implement it, for example, but that’s about it.</p><p>My original proposal was for a trait named <a href="https://smallcultfollowing.com/babysteps/blog/2024/06/21/claim-auto-and-otherwise/"><code>Claim</code></a> that was meant to convey a “lightweight clone” – but really the trait was <a href="https://smallcultfollowing.com/babysteps/blog/2024/06/26/claim-followup-1/#what-i-really-proposed">meant to replace <code>Copy</code> as the definition of which clones ought to be explicit</a><sup id="fnref:2"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:2">2</a></sup>. Jonathan Kelley had a similar proposal but called it <code>Capture</code>. In <a href="https://github.com/rust-lang/rfcs/pull/3680">RFC #3680</a> the proposal was to call the trait <code>Use</code>.</p><p>The details and intent varied, but all of these attempts had one thing in common: they were very <em>operational</em>. That is, the trait was always being defined in terms of <em>what</em> it does (or doesn’t do) but not <em>why</em> it does it. And that I think will always be a weak grounding for a trait like this, prone to confusion and different interpretations. For example, what is a “lightweight” clone? Is it O(1)? But what about things that are O(1) with very high probability? And of course, O(1) doesn’t mean <em>cheap</em> – it might copy 22GB of data every call. That’s O(1).</p><p>What you want is a trait where it’s fairly clear when it should and should not be implemented and not based on taste or subjective criteria. And <code>Claim</code> and friends did not meet the bar: in the Unconf, several new Rust users spoke up and said they found it very hard, based on my explanations, to judge whether their types ought to implement The Trait (whatever we call it). That has also been a persitent theme from the RFC and elsewhere.</p><h3>“Shouldn’t we call it <em>share</em>?” (hat tip: Jack Huey)</h3><p>But really there <em>is</em> a semantic underpinning here, and it was Jack Huey who first suggested it. Consider this question. What are the differences between cloning a <code>Mutex&lt;Vec&lt;u32&gt;&gt;</code> and a <code>Arc&lt;Mutex&lt;Vec&lt;u32&gt;&gt;&gt;</code>?</p><p>One difference, of course, is cost. Cloning the <code>Mutex&lt;Vec&lt;u32&gt;&gt;</code> will deep-clone the vector, cloning the <code>Arc</code> will just increment a referece count.</p><p>But the more important difference is what I call <em>“entanglement”</em>. When you clone the <code>Arc</code>, you don’t get a new value – you get back a <em>second handle to the same value</em>.<sup id="fnref:3"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:3">3</a></sup></p><h3>Entanglement changes the meaning of the program</h3><p>Knowing which values are “entangled” is key to understanding what your program does. A big part of how the borrow checker<sup id="fnref:4"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:4">4</a></sup> achieves reliability is by reducing “entaglement”, since it becomes a relative pain to work with in Rust.</p><p>Consider the following code. What will be the value of <code>l_before</code> and <code>l_after</code>?</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">l_before</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">v1</span><span class="p">.</span><span class="n">len</span><span class="p">();</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="n">v2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">v1</span><span class="p">.</span><span class="n">clone</span><span class="p">();</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">v2</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">new_value</span><span class="p">);</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="n">l_after</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">v1</span><span class="p">.</span><span class="n">len</span><span class="p">();</span><span class="w"></span></span></span></code></pre></div><p>The answer, of course, is “depends on the type of <code>v1</code>”. If <code>v1</code> is a <code>Vec</code>, then <code>l_after == l_before</code>. But if <code>v1</code> is, say, a struct like this one:</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">SharedVec</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="n">data</span>: <span class="nc">Arc</span><span class="o">&lt;</span><span class="n">Mutex</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;&gt;</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></span><span class="line"><span class="cl"><span class="w"></span><span class="k">impl</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">SharedVec</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">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">push</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">value</span>: <span class="nc">T</span><span class="p">)</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="bp">self</span><span class="p">.</span><span class="n">data</span><span class="p">.</span><span class="n">lock</span><span class="p">().</span><span class="n">unwrap</span><span class="p">().</span><span class="n">push</span><span class="p">(</span><span class="n">value</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">len</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="kt">usize</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="n">data</span><span class="p">.</span><span class="n">lock</span><span class="p">().</span><span class="n">unwrap</span><span class="p">().</span><span class="n">len</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></code></pre></div><p>then <code>l_after == l_before + 1</code>.</p><p>There are many types that act like a <code>SharedVec</code>: it’s true for <code>Rc</code> and <code>Arc</code>, of course, but also for things like <a href="https://docs.rs/bytes/latest/bytes/struct.Bytes.html"><code>Bytes</code></a> and channel endpoints like <a href="https://doc.rust-lang.org/std/sync/mpsc/struct.Sender.html"><code>Sender</code></a>. All of these are examples of “handles” to underlying values and, when you clone them, you get back a second handle that is indistinguishable from the first one.</p><h3>We have a name for this concept already: handles</h3><p>Jack’s insight was that we should focus on the <em>semantic concept</em> (sharing) and not on the operational details (how it’s implemented). This makes it clear when the trait ought to be implemented. I liked this idea a lot, although I eventually decided I didn’t like the name <code>Share</code>. The word isn’t specific enough, I felt, and users might not realize it referred to a specific concept: “shareable types” doesn’t really sound right. But in fact there <em>is</em> a name already in common use for this concept: handles (see e.g. <a href="https://docs.rs/tokio/latest/tokio/runtime/struct.Handle.html"><code>tokio::runtime::Handle</code></a>).</p><p>This is how I arrived at my proposed name and definition for The Trait, which is <code>Handle</code>:<sup id="fnref:5"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:5">5</a></sup></p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="sd">/// Indicates that this type is a *handle* to some</span></span></span><span class="line"><span class="cl"><span class="sd">/// underlying resource. The `handle` method is</span></span></span><span class="line"><span class="cl"><span class="sd">/// used to get a fresh handle.</span></span></span><span class="line"><span class="cl"><span class="sd"></span><span class="k">trait</span><span class="w"> </span><span class="n">Handle</span>: <span class="nb">Clone</span> <span class="p">{</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">final</span><span class="w"> </span><span class="k">fn</span> <span class="nf">handle</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nc">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">Clone</span>::<span class="n">clone</span><span class="p">(</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="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></code></pre></div><h3>We would lint and advice people to call <code>handle</code></h3><p>The <code>Handle</code> trait includes a method <code>handle</code> which is <em>always</em> equivalent to <code>clone</code>. The purpose of this method is to signal to the reader that the result is a second handle to the same underlying value.</p><p>Once the <code>Handle</code> trait exists, we should lint on calls to <code>clone</code> when the receiver is known to implement <code>Handle</code> and encourage folks to call <code>handle</code> instead:</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="w"> </span><span class="n">DataStore</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">store_map</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">map</span>: <span class="kp">&amp;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="n">HashMap</span><span class="o">&lt;..</span><span class="p">.</span><span class="o">&gt;&gt;</span><span class="p">)</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="bp">self</span><span class="p">.</span><span class="n">stored_map</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">map</span><span class="p">.</span><span class="n">clone</span><span class="p">();</span><span class="w"></span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// -----</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">//</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// Lint: convert `clone` to `handle` for</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="c1">// greater clarity.</span></span></span><span class="line"><span class="cl"><span class="c1"></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="p">}</span><span class="w"></span></span></span></code></pre></div><p>Compare the above to the version that the lint suggests, using <code>handle</code>, and I think you will get an idea for how <code>handle</code> increases clarity of what is happening:</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="w"> </span><span class="n">DataStore</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">store_map</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">map</span>: <span class="kp">&amp;</span><span class="nc">Arc</span><span class="o">&lt;</span><span class="n">HashMap</span><span class="o">&lt;..</span><span class="p">.</span><span class="o">&gt;&gt;</span><span class="p">)</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="bp">self</span><span class="p">.</span><span class="n">stored_map</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">map</span><span class="p">.</span><span class="n">handle</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></code></pre></div><h3>What it means to be a <em>handle</em></h3><p>The defining characteristic of a <em>handle</em> is that it, when cloned, results in a second value that accesses the same underlying value. This means that the two handles are “entangled”, with interior mutation that affects one handle showing up in the other. Reflecting this, most handles have APIs that consist exclusively or almost exclusively of <code>&amp;self</code> methods, since having unique access to the <em>handle</em> does not necessarily give you unique access to the <em>value</em>.</p><p>Handles are generally only significant, semantically, when interior mutability is involved. There’s nothing <em>wrong</em> with having two handles to an immutable value, but it’s not generally distinguishable from two copies of the same value. This makes persistent collections an interesting grey area: I would probably implement <code>Handle</code> for something like <code>im::Vec&lt;T&gt;</code>, particularly since something like a <code>im::Vec&lt;Cell&lt;u32&gt;&gt;</code> <em>would</em> make entaglement visible, but I think there’s an argument against it.</p><h3>Handles in the stdlib</h3><p>In the stdlib, handle would be implemented for exactly one <code>Copy</code> type (the others are values):</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="c1">// Shared references, when cloned (or copied),</span></span></span><span class="line"><span class="cl"><span class="c1">// create a second reference:</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">impl</span><span class="o">&lt;</span><span class="n">T</span>: <span class="o">?</span><span class="nb">Sized</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Handle</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="o">&amp;</span><span class="n">T</span><span class="w"> </span><span class="p">{}</span><span class="w"></span></span></span></code></pre></div><p>It would be implemented for ref-counted pointers (but not <code>Box</code>):</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="c1">// Ref-counted pointers, when cloned,</span></span></span><span class="line"><span class="cl"><span class="c1">// create a second reference:</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">impl</span><span class="o">&lt;</span><span class="n">T</span>: <span class="o">?</span><span class="nb">Sized</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Handle</span><span class="w"> </span><span class="k">for</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><span class="line"><span class="cl"><span class="w"></span><span class="k">impl</span><span class="o">&lt;</span><span class="n">T</span>: <span class="o">?</span><span class="nb">Sized</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Handle</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">Arc</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>And it would be implemented for types like channel endpoints, that are implemented with a ref-counted value under the hood:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-rust"><span class="line"><span class="cl"><span class="c1">// mpsc "senders", when cloned, create a</span></span></span><span class="line"><span class="cl"><span class="c1">// second sender to the same underlying channel:</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">impl</span><span class="o">&lt;</span><span class="n">T</span>: <span class="o">?</span><span class="nb">Sized</span><span class="o">&gt;</span><span class="w"> </span><span class="n">Handle</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">mpsc</span>::<span class="n">Sender</span><span class="w"> </span><span class="p">{}</span><span class="w"></span></span></span></code></pre></div><h3>Conclusion: a design axiom emerges</h3><p>OK, I’m going to stop there with this “byte-sized” blog post. More to come! But before I go, let me layout what I believe to be a useful “design axiom” that we should adopt for this design:</p><blockquote><p><strong>Expose entanglement.</strong> Understanding the difference between a <em>handle</em> to an underlying value and the value itself is necessary to understand how Rust works.</p></blockquote><p>The phrasing feels a bit awkward, but I think it is the key bit anyway.</p><div class="footnotes"><hr /><ol><li id="fn:1"><p>That. my friends, is <em>foreshadowing</em>. Damn I’m good. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:1">↩︎</a></p></li><li id="fn:2"><p>I described <code>Claim</code> as a kind of “lightweight clone” but in the Unconf someone pointed out that “heavyweight copy” was probably a better description of what I was going for. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:2">↩︎</a></p></li><li id="fn:3"><p>And, not coincidentally, the types where cloning leads to entanglement tend to also be the types where cloning is cheap. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:3">↩︎</a></p></li><li id="fn:4"><p>and functional programming… <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:4">↩︎</a></p></li><li id="fn:5"><p>The “final” keyword was proposed by Josh Triplett in RFC 3678. It means that impls cannot change the definition of <code>Handle::handle</code>. There’s been some back-and-forth on whether it ought to be renamed or made more general or what have you; all I know is, I find it an incredibly useful concept for cases like this, where you want users to be able to opt-in to a method being <em>available</em> but <em>not</em> be able to change what it does. You can do this in other ways, they’re just weirder. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:5">↩︎</a></p></li></ol></div></description> <pubDate>Tue, 07 Oct 2025 14:04:55 +0000</pubDate></item><item> <title>Firefox Nightly: Smarter Search, Smoother Tools – These Weeks in Firefox: Issue 190</title> <guid isPermaLink="false">https://blog.nightly.mozilla.org/?p=1908</guid> <link>https://blog.nightly.mozilla.org/2025/10/06/smarter-search-smoother-tools-these-weeks-in-firefox-issue-190/</link> <description><h3>Highlights</h3><ul><li>Google Lens support has been <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1990369">turned on by default</a> in the latest nightly builds.<ul><li>When Google is your default search engine, and you right click an image you’ll see a new context menu entry:</li></ul></li></ul><p><img alt="Context menu entry: Search Image with Google Lens" class="alignnone size-large wp-image-1907" height="328" src="https://blog.nightly.mozilla.org/files/2025/10/headlines190_3-600x328.png" width="600" /></p><ul><li>Semantic history search has now also been <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1988990">enabled</a> in the latest nightly and beta builds.<ul><li>This uses a local machine learning model to suggest entries from history that are related to your searches based on natural language understanding in the address bar.</li></ul></li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=283262">Alexandre Poirot [:ochameau]</a> improved the editor by displaying an editor widget where you can navigate between the different calls to a given function (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1908889">#1908889</a>)</li></ul><p><img alt="DevTools is displaying an editor widget" class="alignnone size-large wp-image-1906" height="493" src="https://blog.nightly.mozilla.org/files/2025/10/headlines190_2-600x493.png" width="600" /></p><ul><li>The WebExtension cookies.set API method rejection on invalid cookies is riding the Firefox 145 release train (after it has been kept as a nightly only behavior for 3 nightly cycles) – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1976509">Bug 1976509</a></li></ul><p> </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=1892101%2C1969417%2C1979919%2C1689380%2C1982968%2C1984296%2C1982767%2C1981384%2C1984788%2C1813675%2C1583902%2C1956493%2C1984661%2C1679997%2C1787457%2C1984872">Resolved bugs (excluding employees)</a></h4><h4>Volunteers that fixed more than one bug</h4><ul><li>Isaac Briandt</li></ul><h4>New contributors (🌟 = first patch)</h4><ul><li>David [:david-loe] <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986237">improved accessibility of timepicker</a></li><li>Isaac Briandt updated<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1981244"> build-bergamot.py and upload-bergamot.py to utilize zstd compression</a> and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982594">updated Translations RemoteSettings schemas</a></li><li>🌟 Vlad L <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1881524">updated ipv6 representation algorithm</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 finalizing the Add-ons telemetry migration from legacy telemetry to Glean, the EnvironmentAddonBuilder (responsible for collecting the activeAddons/Theme/GMPlugins metrics in Glean and mirror it in the legacy telemetry environment) has been refactored out of the TelemetryEnvironment ES module – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1981496">Bug 1981496</a></li></ul><h4>DevTools</h4><ul><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=446518">Sebastian Zartner [:sebo]</a> added inactive CSS icon when overflow* properties are used in non-block, non-flex, non-grid containers (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1583898">#1583898</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=750915">Artem Manushenkov</a> fixed a memory leak in the Inspector (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986144">#1986144</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=763731">Holger Benl [:hbenl]</a> fixed an issue where screenshots taken in Responsive Design Mode could have unexpected dimensions (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979518">#1979518</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> made the Accessibility panel color simulation persist on page reload (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1770707">#1770707</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=283262">Alexandre Poirot [:ochameau]</a> fixed a Debugger crash that could happen when clicking on stacktrace frames from the console (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985446">#1985446</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=656417">Hubert Boma Manilla (:bomsy)</a> fixed Debugger pretty printing of sources containing characters represented by more than one code unit (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985689">#1985689</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=656417">Hubert Boma Manilla (:bomsy)</a> updated the version of Babel which we’re using to handle top level await detection, which fixed a few issues (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1900314">#1900314</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=283262">Alexandre Poirot [:ochameau]</a> fixed an issue in the Network pane (reported by Jake), where the search would never complete (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983792">#1983792</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=559949">Julian Descottes [:jdescottes]</a> fixed a Network Monitor crash that was occurring when setting network override on requests requiring CORS preflight (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986615">#1986615</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> fixed an issue that was affecting the Changes panel on pages with multiple documents (that includes the Browser Toolbox) (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1798774">#1798774</a>)</li></ul><h4>WebDriver BiDi</h4><ul><li>Henrik <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1988250">disabled the BackupService component by default for the Remote Protocol</a> (Marionette / WebDriver BiDi), as it isn’t required for web automation tasks.</li><li>Julian <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1970293">implemented the `browsingContext.downloadEnd` event</a>, which is emitted either when a download is completed or canceled.</li><li>Sasha implemented the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1987935">“emulation.setUserAgentOverride” command</a> for WebDriver BiDi, allowing clients to override the user agent string per browsing context, user context, or globally in Firefox + also fixed <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1705326">Bug 1705326 – navigator.userAgent still returns custom UA after clearing browsingContext.customUserAgent if a reload happened while the custom UA was set</a></li><li>Bug fixes<ul><li>Julian <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986938">updated the browsingContext.downloadWillBegin event to emit the correct `navigation` id</a>, either the same one as the corresponding `browsingContext.navigationStarted` event, or null if the download was started by a link with a `download` attribute.</li><li>Julian fixed a <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986615">crash occurring when `network.provideResponse` was used</a> to override a response requiring a CORS preflight.</li><li>Julian fixed a <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1989919">bug with network events incorrectly flagged as blocked</a> (`isBlocked=true`), even if they were not blocked for technical reasons – eg. coming from memory cache or using `data` scheme.</li><li>Julian updated the `network.beforeRequestSent` events to have <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985552">`destination` set to “document” for top-level loads</a>.</li><li>Julian fixed an encoding issue with `network.getData` which will now <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986022">always use utf-8 when serializing as text</a>.</li><li>Julian also updated `network.getData` to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986025">no longer throw if the response body is empty</a>.</li></ul></li></ul><h4>Lint, Docs and Workflow</h4><ul><li><a href="https://blog.nightly.mozilla.org/2025/09/19/add-ons-fixes-and-devtools-snacks-these-weeks-in-firefox-issue-188/#:~:text=We%E2%80%99re,reviewbot,-%2E">First mentioned a month ago</a>, the tier-3 TypeScript linter has <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1990475">now been fixed</a> so that it runs when the components it watches are touched. Previously it would only be run when the type information was changed.</li><li>ESLint<ul><li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1991124">We discovered</a> the <a href="https://searchfox.org/firefox-main/source/tools/lint/eslint/eslint-plugin-mozilla/lib/configs/require-jsdoc.mjs">require-jsdoc rules</a> were not being applied due to a mistake when upgrading to flat config or ESLint v9. These have now been re-enabled, with follow-ups being landed to fix the new issues raised since the mistake was introduced.</li><li>The <a href="https://firefox-source-docs.mozilla.org/code-quality/lint/linters/eslint-plugin-mozilla/rules/no-browser-refs-in-toolkit.html">no-browser-refs-in-toolkit rule</a> has now <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1990309">been promoted to an error</a>, except for cases where it currently fails (stays as a warning). Please avoid introducing new cases.</li><li>The <a href="https://github.com/eslint/config-inspector">ESLint configuration inspector</a> should <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1990241">now be working</a> when run against firefox-main. This is a very useful tool for inspecting the configuration and determining which globals and rules are applied to which files.</li><li>Gijs <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1971088">updated</a> our documentation for <a href="https://firefox-source-docs.mozilla.org/code-quality/lint/linters/eslint.html#i-have-valid-code-that-is-failing-the-no-undef-rule-or-can-t-be-parsed">ESLint environments</a>, which no longer work in the same way with v9.<ul><li>/** eslint-env foo */ no longer works.</li><li>The files either need the correct extensions, or adding to eslint-file-globals.config.mjs. See <a href="https://searchfox.org/firefox-main/rev/9140dac1eab834541a75792a78a5ed2fbee39142/eslint-file-globals.config.mjs#5-21">the comments at the top of the file</a> for more information.</li></ul></li></ul></li></ul><h4>Information Management/Sidebar</h4><ul><li>There’s been a few fixes for the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1970666">drag-to-pin work</a> that’s in 143; these will be in the dot release.<ul><li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1988996">Add a check for promo card to ensure we don’t show it prematurely</a></li><li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1989344">1989344 – Adjust interaction cue timing for drag to pin</a></li></ul></li><li>Nikki has improved tab animation for vertical and horizontal tabs with <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983124">tab stacking</a></li><li>Split View work is still early days but the meta bug is <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1980370">here</a>.</li><li>We’re aiming to get sidebar.revamp turned on by default in Nightly only in 145 so we’re greening up a few tests then work on some old sidebar parity bugs before enabling this in release.</li></ul><h4>Profile Management</h4><ul><li>Jared fixed bug 1941854, [Windows] Additional window (skeleton UI) opens with Profile Selector on Firefox startup</li><li>Maile fixed bug 1955173, The favicons of the Profiles about: pages are not displayed properly in the List all tabs menu</li><li>Niklas fixed bug 1965598, The Usage Profile Group ID should be shared by all profiles in a group</li><li>Jaws fixed bug 1987317, Firefox won’t launch a profile if the library of that profile is open</li><li>Jaws fixed bug 1988882, SelectableProfileService uses the wrong value for the rgb color property</li><li>Jaws fixed bug 1990020, Small fixes in SelectableProfileService</li></ul><h4>Search and Navigation</h4><ul><li>Work continues on modularising and re-using the address bar code to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1974218">replace the existing search bar</a>.<ul><li>This will allow us to simplify the existing code, remove dependence on the toolkit autocomplete widget, and bring more features to the separate search bar.</li></ul></li><li></li><li>Search Engines identifiers and telemetry.<ul><li>We’ve now <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1877721">removed</a> nsISearchEngine.identifier, and deprecated nsISearchEngine.telemetryId. nsISearchEngine.id still exists.<ul><li>These are fields that would contain a mixture of information about a search engine (an identifier, partner code and sometimes more). This would analysis via telemetry more difficult.</li></ul></li><li>If you’re reporting search engine information either via telemetry or to other systems, please use the separate id / partnerCode fields on nsISearchEngine or check with the search team for your case.</li></ul></li></ul><h4>Storybook/Reusable Components/Acorn Design System</h4><ul><li>moz-button supports type=”split”(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1858811">Bug 1858811</a>). Setting menuId on the split button links its “More options” button to a panel-list with the same id. (<a href="https://firefoxux.github.io/firefox-desktop-components/?path=/story/ui-widgets-button--split-button">Storybook</a>)</li></ul><p><img alt="Split button component" class="alignnone size-large wp-image-1905" height="308" src="https://blog.nightly.mozilla.org/files/2025/10/headlines190_1-600x308.png" width="600" /></p><ul><li>Support for the support-page attribute was added to the moz-box-item (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1990839">Bug 1990839</a>)</li><li>New –font-size-xxlarge (2.2rem – 33px) token was added. (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1961988">Bug 1961988</a>)</li><li>Usage of border-radius was updated to use design tokens values (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983938">Bug 1983938</a>)</li></ul></description> <pubDate>Mon, 06 Oct 2025 20:11:37 +0000</pubDate> <dc:creator>Anna Kulyk</dc:creator></item><item> <title>Mozilla Thunderbird: VIDEO: Conversation View</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3830</guid> <link>https://blog.thunderbird.net/2025/10/video-conversation-view/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2025/10/blog-banner-community-hours2-768x432.jpg" width="640" /></p><p>Welcome back to another edition of the Community Office Hours! This month, we’re showing you our first steps towards a long awaited feature: a genuine Conversation View! Our guests are Alessandro Castellani, Director of Desktop and Mobile Apps and Geoff Lankow, Sr. Staff Software Engineer on the Desktop team. They recently attended a work week in Vancouver that brought together developers and designers to create our initial vision and plan to bring Conversation View from dream to reality. Before Geoff flew home, he joined Alessandro and us to discuss his backend database work that will make Conversation View possible. We also had a peek at the workweek itself, other features possible with our new database, and our tentative delivery timeline.</p> <p>We’ll be back next month with an Office Hours all about Exchange Support for email, which is landing soon in our monthly Release channel. </p> <h3>September Office Hours: Conversation View</h3> <p>Some of you might be asking, “what IS Conversation View?” Basically, it’s a Gmail-like visualization of a message thread when reading emails. So, in contrast to the current threaded view, you have all the messages in a thread. This both includes your replies and any other messages that may have been moved to a different folder.</p> <p>So, why hasn’t Thunderbird been able to do this already? The short answer is that our code is old. Netscape Navigator old. Our current ‘database,’ Mork, makes a mail folder summary (an .msf file) per folder. These files are text-based unicode and are NOT human readable. In Thunderbird 3, we introduced Gloda, our Global Search and Indexer, to try and work around Mork’s limitations. It indexes what’s in the .msf file and stores the data in a SQLite file. But as you might already know, Gloda itself is clunky and slow.</p> <h3>Modern Solutions for Modern Problems</h3> <p>If we want Conversation View (and other features users now expect), we need to bring Thunderbird further into the 21st century. Hence, our work on a new database, which we’re calling Panorama. It’s a single SQLite database with all your messages. Panorama indexes emails as soon as they’re received, and since it’s SQLite, it’s not only fast, but it can be read by so many tools.</p> <p>Since all of your messages will be in a single SQLite database, we can do more than enable a true Conversation view. Panorama will improve global search, enable improved filters, and more. Needless to say, we’re excited about all the possibilities!</p> <h3>Conversation View Workweek</h3> <p>To get these possibilities started, we decided to bring developers and designers together for a Conversation View Workweek in Vancouver in early September. This brought people out of Zoom calls, emails, and Matrix messages, and across the Pacific Ocean in Geoff’s case, into one place to discuss technical and design challenges. </p> <p>We’ve spoken previously about our design system and how we’ve collaborated between <a href="https://blog.thunderbird.net/2025/03/video-the-thunderbird-design-system/">design and development</a> on features like <a href="https://blog.thunderbird.net/2025/04/video-the-new-account-hub/">Account Hub</a>. In-person collaboration, especially for something as complicated as a new database and message view, was invaluable. By the end of the week, developers and designers alike had plenty to show for their efforts.</p> <h3>Next Steps</h3> <p>Before you get too excited, the new database and Conversation view won’t land until after next year’s ESR release. There’s a lot of work to do, including testing Panorama in a standalone space until we’re ready to run Mork and Panorama alongside each other, along with the old and new code referencing each database. We need the migration to be seamless and easily reversible, and so we want to take the time to get this absolutely right.</p> <p>Want to stay up to date on our progress? We recommend subscribing to our Planning and <a href="https://thunderbird.topicbox.com/groups/ux">UX</a> mailing lists, State of the Thunder <a href="https://www.youtube.com/playlist?list=PLMY3ZzVsXXyqSVZHS10hold60Uqb97xzD">videos</a> and <a href="https://blog.thunderbird.net/tag/state-of-the-thunder/">blog posts</a>, and the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1920833">meta bug on Bugzilla</a>.</p> <h4>VIDEO (Also <a href="https://tilvids.com/w/h1KPSVsB7BfL5LxtEU4PB6">on Peertube</a>):</h4> <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>Slides:</h3> <div class="wp-block-file"><a href="https://blog.thunderbird.net/files/2025/10/Conversation-View-Community-Office-Hours-Presentation.pdf" id="wp-block-file--media-2d726133-12fc-4117-a5e6-734962ae66d2">Conversation-View-Community-Office-Hours-Presentation</a><a class="wp-block-file__button wp-element-button" href="https://blog.thunderbird.net/files/2025/10/Conversation-View-Community-Office-Hours-Presentation.pdf">Download</a></div> <h3>Resources:</h3><p>The post <a href="https://blog.thunderbird.net/2025/10/video-conversation-view/">VIDEO: Conversation View</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Mon, 06 Oct 2025 18:08:18 +0000</pubDate> <dc:creator>Monica Ayhens-Madon</dc:creator></item><item> <title>The Mozilla Blog: Building a fairer future for digital advertising: Mozilla partners with Index Exchange</title> <guid isPermaLink="false">https://blog.mozilla.org/?p=82082</guid> <link>https://blog.mozilla.org/en/advertising/index-exchange-partnership/</link> <description><figure class="wp-block-image size-large is-resized"><img alt="Black background featuring two white logos: ‘Mozilla Ads’ on the left and ‘Index Exchange’ on the right, separated by a thin vertical line." class="wp-image-82083" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/10/MozillaAds_AWNYFireside_10_03.006-1024x576.jpeg" style="width: 840px; height: auto;" width="1024" /></figure> <p>Advertising can and should work better — for people, for publishers, and for brands. That belief is what drives Mozilla’s growing investment in rebuilding digital advertising around trust, transparency and fairness.</p> <p>For too long, the web’s primary funding model has relied on hidden data collection and opaque ad systems that work around users instead of with them. Mozilla’s approach is different: We’re building an alternative that aligns commercial success with user respect, giving advertisers new ways to show up responsibly in environments people actually trust.<br /><br />“Advertising funds the open internet, but it needs a new foundation,” said Suba Vasudevan, COO of Mozilla.org and SVP at Mozilla Corp. “Advertisers have always cared about brand safety. The missing piece has been trust in the platforms where ads run. That’s the gap Mozilla is closing; making the advertising environment itself something that both brands and users can trust. And we do this all while protecting the privacy of our users’ data.”<br /><br />This week at Advertising Week New York 2025, Mozilla announced a key step in that journey — a partnership with Index Exchange, one of the world’s largest independent ad exchanges. Together, we’re proving that trusted environments can also deliver trusted performance.<br /><br />“Our partnership with Mozilla demonstrates how programmatic can evolve to create stronger outcomes for brands and better experiences for consumers,” said Lori Goode, CMO of Index Exchange. “By uniting Mozilla’s trusted environment with Index’s infrastructure, we’re building a model of programmatic rooted in quality, accountability, and long-term value.”</p> <h3>Creating a new model for responsible advertising</h3> <p>The collaboration between Mozilla and Index Exchange is part of a larger effort to evolve how advertising supports the open web. It’s about expanding options for marketers who want to reach audiences in ways that are both effective and ethical — replacing tracking-heavy systems with transparent, trust-centered design.</p> <p>• <strong>Scale where it matters.</strong> For marketers committed to building on trusted platforms, curated PMP deals with Mozilla and Index Exchange offer a way to connect with engaged audiences in respectful, brand-safe environments — aligning performance goals with user trust in the fastest-growing programmatic channel (~88% of global spend).</p> <p>• <strong>No personal identifiers. </strong>Mozilla and Index Exchange ensure that no personal identifiers or cross-site tracking are ever used — reflecting our shared commitment to respect users and create ad experiences people can trust.</p> <p>• <strong>Future-ready monetization. </strong>Firefox research shows that even privacy-minded users welcome thoughtful personalization when it improves their experience — but only when delivered responsibly and with clear user control.<br /><br />• <strong>A unique audience opportunity. </strong>Firefox reaches hundreds of millions of people worldwide, offering marketers the chance to build connections in a trusted, brand-safe environment with engaged audiences often underrepresented on other platforms.</p> <h3>On stage at Advertising Week New York</h3> <p>Mozilla and Index Exchange will debut the partnership during a keynote conversation, “Adding Trust to Your Ad Buy: The Smartest Spend in Marketing Today,” on the Advertising Week Innovation Stage, Monday, Oct. 6. The session will explore how advertisers can drive performance by investing in trust — not just in creative or campaigns, but in the platforms that power them.<br /><br />At Mozilla, we’ve always believed that advertising, done responsibly, can help sustain the open web. This partnership is proof of that belief — a tangible example of how innovation and trust can go hand in hand, delivering value for advertisers and for the internet itself. For more about Mozilla Ads, visit: <a href="https://www.mozilla.org/en-US/advertising/">https://www.mozilla.org/en-US/advertising/</a>.</p><p>The post <a href="https://blog.mozilla.org/en/advertising/index-exchange-partnership/">Building a fairer future for digital advertising: Mozilla partners with Index Exchange</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></description> <pubDate>Mon, 06 Oct 2025 16:53:52 +0000</pubDate> <dc:creator>Jennifer Guerra</dc:creator></item><item> <title>The Mozilla Blog: Anonym and Snap partner to unlock increased performance for advertisers</title> <guid isPermaLink="false">https://blog.mozilla.org/?p=82070</guid> <link>https://blog.mozilla.org/en/advertising/anonym/anonym-snap-partnership/</link> <description><figure class="wp-block-image size-large"><img alt="The Anonym wordmark and the Snap, Inc. logo are shown side by side." class="wp-image-82071" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/10/Distilled_SnapAnonym@2x-1024x576.png" width="1024" /></figure> <p><em><strong>An ads milestone in marketing reach without data risk.</strong></em></p> <p>The ad industry is shifting, and with it comes a clear need for advertisers to use data responsibly while still proving impact. Advertisers face a false choice between protecting privacy and proving performance. Anonym exists to prove they can have both — and this week marks a major milestone in that mission.</p> <p>Today we announced a new partnership with Snap Inc., giving advertisers a way to use more of their first-party data safely and effectively. This collaboration shows what’s possible when privacy and performance go hand in hand: Marketers can unlock real insights into how campaigns drive results, without giving up data control.</p> <h3>Unleashing first-party data that’s often untapped</h3> <p>Unlocking value while maintaining privacy of advertisers’ sensitive first-party (1P) data has long been a challenge for advertisers concerned with exposure or technical friction. We set out to change this equation, enabling brands to safely activate data sets to measure conversion lift and attribution.</p> <p>With Snapchat campaigns, advertisers can now bring first-party data that’s typically been inaccessible into play and understand how ads on the platform drive real-world actions — from product discovery to purchase. Instead of relying only on proxy signals or limited datasets, brands can generate more complete, incrementality-based insights on their Snapchat performance, gaining a clearer picture of the channel’s true contribution to business outcomes.</p> <p>“Marketers possess deep reserves of first-party data that too often sits idle because it’s seen as difficult or risky to use,” said Graham Mudd, Senior Vice President, Product, Mozilla and Anonym co-founder. “Our partnership with Snap gives advertisers the power to prove outcomes with confidence, and do it in a way that is both tightly controlled and insight-rich.”</p> <h3>Snapchat audience scale: Reach meets relevance</h3> <p>With a reach of over 930 million monthly active users globally (MAUs), including 469 million daily active users — Snap’s rapidly growing audience makes it a uniquely powerful marketing channel. This breadth of reach is especially appealing to advertisers who previously avoided activating sensitive data—knowing they can now connect securely with high-value Snapchatters at scale.</p> <p>Our solution is designed for ease of use, requiring minimal technical resources and enabling advertisers to go from kickoff to measurement reporting within weeks. Our collaboration with Snap furthers the mission of lowering barriers to entry in advertising, and enables brands of all sizes to confidently activate their competitive insights on Snapchat.</p> <p>“Snapchat is where people make real choices, and advertisers need simple, clear insights into how their campaigns perform,” said Elena Bond, Head of Marketing Science, Snap Inc. “By working with Anonym, we’re making advanced measurement accessible to more brands — helping them broaden their reach, uncover deeper insights, and prove results, all while maintaining strict control of their data.”</p> <h3>How Anonym works: Simple, secure, scalable</h3> <p>Using end-to-end encryption, trusted execution environments (TEE), and differential privacy to guarantee protection and streamline compliance, Anonym helps advertisers connect with new, high-value customers and analyze campaign effectiveness without giving up data control. Strategic reach and actionable measurement are achieved with:</p> <ul><li>Advertiser-controlled: First-party data is never transferred to the ad platform.</li> <li>Minimal technical lift: From campaign start to measurement, reporting can be completed in weeks—no heavy engineering or data science overhead.</li> <li>Performance-focused: The outcome is clear insights into campaign lift and attribution, powering better investment decisions.</li> <li>Regulation-ready: Provides advertisers with tools to help meet evolving privacy requirements, supporting responsible data use as rules change.</li></ul> <p>Anonym and Snap’s collaboration coincides with <a href="https://advertisingweek.com/event/awnewyork-2025">Advertising Week New York 2025</a>, where measurement and data innovation will be in sharp focus. </p> <a class="ft-c-inline-cta" href="https://www.anonymco.com/"> <div class="ft-c-inline-cta__media"> <img alt="A teal lock icon next to the bold text &quot;Anonym&quot; on a black background." class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2024/10/Blog_Anonym_Thumbnail-800x800.png" width="800" /> </div> <div class="ft-c-inline-cta__content"> <h4>Performance, powered by privacy</h4> <span>Learn more about Anonym</span> </div></a><p>The post <a href="https://blog.mozilla.org/en/advertising/anonym/anonym-snap-partnership/">Anonym and Snap partner to unlock increased performance for advertisers</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></description> <pubDate>Thu, 02 Oct 2025 23:12:10 +0000</pubDate> <dc:creator>Jennifer Guerra</dc:creator></item><item> <title>Support.Mozilla.Org: Ask a Fox: A full week celebration of community power</title> <guid isPermaLink="false">https://blog.mozilla.org/sumo/?p=4185</guid> <link>https://blog.mozilla.org/sumo/2025/10/02/ask-a-fox/</link> <description><p>From September 22–28, the Mozilla Support team ran our first-ever <a href="http://community.mozilla.org/campaigns/ask-a-fox/"><b>Mozilla – Ask a Fox</b></a> virtual hackathon. In collaboration with the Thunderbird team, we invited contributors, community members, and staff to jump into the Mozilla Community Forums, lend a hand to Firefox and Thunderbird users, and experience the power of Mozillians coming together.</p><h3>Rallying the Community</h3><p>The idea was simple: we want to bring not only our long time community members, but newcomers and Mozilla staff together for one-week of focused engagement. The result was extraordinary.</p><ul><li>The event generated strong momentum for both new and returning community members. This was reflected in the <b>significant growth in total contributors, which rose by 41.6 %</b>.</li><li>For the past year, our Community Forum had been struggling to maintain a strong reply rate as inbound questions grew. During the event, however, we achieved our <b>highest weekly reply rate of the year</b>, which was more than 50% above our daily average from the first half of 2025.</li><li><b>Time to first response (TTFR) also improved by 44.6%</b>, which signal significant improvement in community responsiveness. The event also highlighted the importance of time to first response (TTFR) not just for users, but for the community as a whole. We saw a clear correlation: <i>the faster users received their first reply, the more likely they were to return and continue the conversation.</i></li></ul><p>Together, we showed just how responsive and effective our community can be when we rally around a common goal.</p><h3>More Than Answering Forum Questions</h3><p>Ask a Fox wasn’t only about answering questions—it was about connection. Throughout the week, we hosted special AMAs with the <a href="https://www.youtube.com/watch?v=GFF5NBSN-8I&amp;t=2980s"><b>WebCompat</b></a>, <a href="https://www.youtube.com/watch?v=apYYhHJINFY&amp;t=3249s"><b>Web Performance</b></a>, and <a href="https://www.youtube.com/watch?v=ldnv11tF6iY&amp;t=245s"><b>Thunderbird</b></a> teams, giving contributors the chance to engage directly with product experts. We also ran two Community Get Together calls to gather, share stories, and celebrate the spirit of collaboration.</p><p>For some added fun, we also launched a and ⚡ emoji hunt accross our Knowledge Base articles.</p><h3>Recognizing contributors</h3><p>We’re grateful for the incredible participation during the event and want to recognize the contributors who went above and beyond. Those who participated in our challenges should receive exclusive <a href="https://support.mozilla.org/badges/">SUMO badges</a> in their profile by now. And the following top five contributors for each product will soon receive a $25 swag voucher from us to shop our limited-edition Ask a Fox swag collection, available in the <a href="https://mozilla-na.myspreadshop.com/ask+a+fox?collection=NfnWgqXmlH">NA</a>/<a href="https://mozilla-europe.myspreadshop.ie/ask+a+fox?collection=MHMWMgYnoP">EU</a> swag store.</p><p><b>Firefox desktop (including Enterprise)</b></p><p>Congrats to <a href="https://support.mozilla.org/user/plwt/">Paul</a><b>, </b><a href="https://support.mozilla.org/user/denyshon/">Denyshon</a>, <a href="https://support.mozilla.org/user/jonzn4SUSE/">Jonz4SUSE</a>, <a href="https://support.mozilla.org/user/@next/">@next</a>, and <a href="https://support.mozilla.org/user/jscher2000/">jscher2000</a>.</p><p><b>Firefox for Android</b></p><p>Congrats to <a href="https://support.mozilla.org/user/plwt/">Paul</a>, <a href="https://support.mozilla.org/en-US/user/TyDraniu/">TyDraniu</a>, <a href="https://support.mozilla.org/user/pcp04/">GerardoPcp04</a>, <a href="https://support.mozilla.org/user/Mad_Maks/">Mad_Maks</a>, and <a href="https://support.mozilla.org/user/sjohnn/">sjohnn</a>.</p><p><b>Firefox for iOS </b></p><p>Congratulations to <a href="https://support.mozilla.org/user/plwt/">Paul</a>, <a href="https://support.mozilla.org/user/simon.c.lord/">Simon.c.lord</a>, <a href="https://support.mozilla.org/en-US/user/TyDraniu/">TyDraniu</a>, <a href="https://support.mozilla.org/user/Mad_Maks/">Mad_Maks</a>, and <a href="https://support.mozilla.org/user/Mozilla-assistent/">Mozilla-assistent</a>.</p><p><b>Thunderbird (including Thunderbird for Android)</b></p><p>Congratulations to <a href="https://support.mozilla.org/user/davidsk/">Davidsk</a>, <a href="https://support.mozilla.org/user/sfhowes/">Sfhowes</a>, <a href="https://support.mozilla.org/user/mozilla98/">Mozilla98</a>, <a href="https://support.mozilla.org/user/MattAuSupport/">MattAuSupport</a>, and <a href="https://support.mozilla.org/user/christ1/">Christ1</a>.</p><p> </p><p>We also want to extend a warm welcome to newcomers who made impressive impact during the event: <a href="https://support.mozilla.org/user/mozilla98/">mozilla98</a>, <a href="https://support.mozilla.org/user/starretreat/">starretreat</a>, <a href="https://support.mozilla.org/user/sjohnn/">sjohnn</a>, <a href="https://support.mozilla.org/user/Vexi/">Vexi</a>, <a href="https://support.mozilla.org/user/Mark/">Mark</a>, <a href="https://support.mozilla.org/user/Mapenzi/">Mapenzi</a>, <a href="https://support.mozilla.org/user/cartdaniel437/">cartdaniel437</a>, <a href="https://support.mozilla.org/user/hariiee1277/">hariiee1277</a>, and <a href="https://support.mozilla.org/user/thisisharsh7/">thisisharsh7</a>.</p><p>And finally, congratulations to <a href="https://support.mozilla.org/user/Vinnl/">Vincent</a>, winner of the staff award for the highest number of replies during the week.</p><hr /><p>Ask a Fox was more than a campaign—it was a celebration of what makes Mozilla unique: a global community of people who care deeply about helping others and shaping a better web. Whether you answered one question or one hundred, your contribution mattered.</p><p>This event reminded us that when Mozillians come together, we can amplify our impact in powerful ways. And this is just the beginning—we’re excited to carry this momentum forward, continue improving the Community Forums, and build an even stronger, more responsive Mozilla community for everyone.</p></description> <pubDate>Thu, 02 Oct 2025 09:57:47 +0000</pubDate> <dc:creator>Rizki Kelimutu</dc:creator></item><item> <title>The Mozilla Blog: Celebrate the power of browser choice with Firefox. Join us live.</title> <guid isPermaLink="false">https://blog.mozilla.org/?p=81994</guid> <link>https://blog.mozilla.org/en/firefox/firefox-celebrates-browser-choice-house-blend-events/</link> <description><p>Firefox is celebrating 21 years of Firefox by hosting four global events celebrating the power of browser choice this fall. </p> <p>We are inviting people to join us in Berlin, Chicago, Los Angeles and Munich as part of Open What You Want, Firefox’s campaign to celebrate choice and the freedom to show up exactly as you are — whether that’s in your coffee order, the music you dance to, or the browser you use. These events are an opportunity to highlight why browser choice matters and why Firefox stands apart as the last major independent option.</p> <p>Firefox is built differently with a <a href="https://blog.mozilla.org/en/firefox/firefox-wants-you-join-daily-defiance/">history of defiance</a>. It is built in a way to best push back against the defaults of Big Tech. Firefox is the only major browser not backed by a billionaire or built on Chromium’s browser engine. Instead, Firefox is backed by a non-profit, and maintains and runs on Gecko, a flexible, independent, open-source browser engine.</p> <p>So, it makes sense that we are celebrating differently too. We are inviting people to join us at four community-driven “House Blend” coffee rave events. What is a coffee rave? A caffeine-fueled day rave celebrating choice, freedom, and doing things your own way – online and off. These events are open to everyone and in partnership with local coffee shops.</p> <p>Each event will have free coffee, exclusive merch, sets by two great, local DJs, a lot of dancing, and an emphasis on how individuals should <a href="https://www.mozilla.org/en-US/about/manifesto/details/">get to shape their online experience and feel control online</a> — and you can’t feel in control without choice.</p> <p>We are kicking off the celebrations this Saturday, Oct. 4 in both Chicago and Berlin, will move to Munich the following Saturday, Oct. 11 and will end in Los Angeles Saturday, Nov. 8, for Firefox’s actual birthday weekend.</p> <p><strong>Berlin</strong> <strong>(RSVP </strong><a href="https://docs.google.com/forms/d/e/1FAIpQLSfbBkfWTNH-xyVASvi4rK_B6z1H2G2wTH7aKk7v-2-gjzWyEA/viewform"><strong>here</strong></a><strong>)</strong><br /><strong>When:</strong> Saturday, Oct. 4, 2025 | 13:00 – 16:00 CEST<br /><strong>Where:</strong> Café Bravo, Auguststraße 69, 10117 Berlin-Mitte<br /><br /><strong>Chicago (RSVP </strong><a href="https://partiful.com/e/TCXRsuTjct4cHHhrdCUN"><strong>here</strong></a><strong>)</strong><br /><strong>When:</strong> Saturday, Oct. 4, 2025 | 10:00AM – 2:00PM CT<br /><strong>Where:</strong> Drip Collective, 172 N Racine Ave, Chicago Illinois </p> <p><strong>Munich (RSVP </strong><a href="https://docs.google.com/forms/d/e/1FAIpQLSeEV81Hq9j1apb60kjZ3qoMQQ0fgKrt9w-aicfxL7fIZKgFzQ/viewform"><strong>here</strong></a><strong>)</strong><br /><strong>When:</strong> Saturday, Oct. 11, 2025 | 13:00 – 16:00 CEST<br /><strong>Where:</strong> ORNO Café, Fraunhoferstraße 11, 80469 München</p> <p><strong>Los Angeles </strong><br /><strong>When:</strong> Saturday, Nov. 8, 2025 <br />More information to come</p> <p>We hope you will join our celebration this year, in person at a coffee rave, or at one of our digital-first activations <a href="https://blog.mozilla.org/en/firefox/billionaire-blas-off/">celebrating internet independence</a>. As Firefox reflects on another year, it’s a good reminder that the most important choice you can make online is your browser. And browser choice is something that we should all celebrate and not take for granted<em>.</em></p> <p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-celebrates-browser-choice-house-blend-events/">Celebrate the power of browser choice with Firefox. Join us live.</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></description> <pubDate>Wed, 01 Oct 2025 17:02:44 +0000</pubDate> <dc:creator>Rebecca Smith</dc:creator></item><item> <title>The Mozilla Blog: Blast off! Firefox turns data power plays into a game</title> <guid isPermaLink="false">https://blog.mozilla.org/?p=81851</guid> <link>https://blog.mozilla.org/en/firefox/billionaire-blast-off/</link> <description><p>We’re celebrating Firefox’s 21st anniversary this November, marking more than two decades of building a web that reflects creativity, independence and trust. While other major browsers are backed by billionaires, Firefox exists to ensure that the internet works for you — not for those cashing in on your data.</p> <p>That’s the idea behind <a href="http://billionaireblastoff.firefox.com/?utm_medium=mozilla-websites&amp;utm_source=blog.mozilla.org&amp;utm_campaign=fx-owyw" rel="noreferrer noopener" target="_blank">Billionaire Blast Off (BBO)</a>, an interactive experience where you design a fictional, over-the-top billionaire and launch them on a one-way trip to space. It’s a playful way to flip Big Tech’s power dynamics and remind people that choice belongs in our hands.</p> <p>BBO lives online at <a href="http://billionaireblastoff.firefox.com/?utm_medium=mozilla-websites&amp;utm_source=blog.mozilla.org&amp;utm_campaign=fx-owyw" rel="noreferrer noopener" target="_blank">billionaireblastoff.firefox.com</a>, where you can build avatars, share memes and join in the joke. Offline, we’re bringing the fun to <a href="https://blog.twitch.tv/en/2025/09/24/the-ultimate-guide-to-10-years-of-twitchcon/" rel="noreferrer noopener" target="_blank">TwitchCon</a>, with life-size games and our card game <em>Data War</em>, where data is currency and space is the prize.</p> <a class="ft-c-inline-cta" href="http://billionaireblastoff.firefox.com/?utm_medium=mozilla-websites&amp;utm_source=blog.mozilla.org&amp;utm_campaign=fx-owyw"> <div class="ft-c-inline-cta__media"> <img alt="Cartoon man riding rocket through space holding Earth with colorful galaxy background." class="attachment-1x1 size-1x1" height="800" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/09/Chaz-Cropped1-800x800.png" width="800" /> </div> <div class="ft-c-inline-cta__content"> <h3>Create your own billionaire avatar</h3> <span>Play Billionaire Blast Off</span> </div></a> <h3 class="wp-block-heading"><strong>The billionaire playbook for your data, served with satire </strong></h3> <p>The goal of Billionaire Blast Off isn’t finger-wagging — it’s satire you can play. It makes the hidden business of your data tangible, and instead of just reading about the problem, you get to laugh at it, remix it and send it into space.</p> <p>The game is a safe, silly and shareable way to talk about something serious: who really holds the power over your data.</p> <p>Two ways to join the fun online:</p> <ul><li><strong>Build a billionaire:</strong> Create your own billionaire to send off-planet for good. Customize your avatar with an origin story, core drive and legacy plan.</li> <li><strong>Blast off:</strong> We’re not just making little billionaires. We’re launching them into space on a real rocket. Share your creation on social media for a chance to secure a seat for your avatar on the official launch.</li></ul> <div class="wp-block-image is-style-default"><figure class="aligncenter size-large is-resized"><img alt="" class="wp-image-81912" height="522" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/09/Origin-Story-1024x522.png" style="width: 675px;" width="1024" />&lt;figcaption class="wp-element-caption"&gt;<em> Customize your billionaire avatar at <a href="http://billionaireblastoff.firefox.com/?utm_medium=mozilla-websites&amp;utm_source=blog.mozilla.org&amp;utm_campaign=fx-owyw" rel="noreferrer noopener" target="_blank">billionaireblastoff.firefox.com.</a></em>&lt;/figcaption&gt;</figure></div> <h3 class="wp-block-heading"><strong>Next stop: TwitchCon</strong></h3> <p>At <a href="https://billionaireblastoff.firefox.com/twitchcon">TwitchCon</a>, you’ll find us sending billionaires into space (for real), playing <em>Data War </em>and putting the spotlight on the power of choice. </p> <p>Visit the Firefox booth #2805 (near Exhibit Hall F) to play <em>Data War</em>, a fast-paced card game where players compete to send egomaniacal, tantrum-prone little billionaires on a one-way ticket to space. </p> <p>Step into an AR holobox to channel your billionaire villain era, create a life-size avatar and make it perform for your amusement in 3D.</p> <div class="wp-block-image is-style-default"><figure class="aligncenter size-large is-resized"><img alt="" class="wp-image-81942" height="576" src="https://blog.mozilla.org/wp-content/blogs.dir/278/files/2025/09/Booth-16_9-1-1024x576.png" style="width: 675px;" width="1024" />&lt;figcaption class="wp-element-caption"&gt;<em>Try out your billionaire in our AR holobox at TwitchCon booth #2805</em>&lt;/figcaption&gt;</figure></div> <p>On Saturday, Oct. 18, swing by the Firefox Lounge at the block party to snag some swag. Then stick around at 8:30 p.m. PT to cheer as we send billionaire avatars into space on a rocket built by <a href="https://www.sentintospace.com/">Sent Into Space</a>. </p> <p>Online, the fun continues anytime at <a href="http://billionaireblastoff.firefox.com">billionaireblastoff.firefox.com</a>. Because when the billionaires leave, the web opens up for you.</p><p>The post <a href="https://blog.mozilla.org/en/firefox/billionaire-blast-off/">Blast off! Firefox turns data power plays into a game</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p></description> <pubDate>Wed, 01 Oct 2025 15:40:59 +0000</pubDate> <dc:creator>Jenifer Boscacci</dc:creator></item><item> <title>This Week In Rust: This Week in Rust 619</title> <guid isPermaLink="false">tag:this-week-in-rust.org,2025-10-01:/blog/2025/10/01/this-week-in-rust-619/</guid> <link>https://this-week-in-rust.org/blog/2025/10/01/this-week-in-rust-619/</link> <description><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/master/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="http://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4> <h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#official">Official</a></h5><ul><li><a href="https://blog.rust-lang.org/inside-rust/2025/09/30/all-hands-2026/">The next Rust All Hands</a></li><li><a href="https://blog.rust-lang.org/inside-rust/2025/10/01/this-development-cycle-in-cargo-1.90/">This Development-cycle in Cargo: 1.90</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#newsletters">Newsletters</a></h5><ul><li><a href="https://www.theembeddedrustacean.com/p/the-embedded-rustacean-issue-55">The Embedded Rustacean Issue #55</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5><ul><li><a href="https://bevy.org/news/bevy-0-17/">Bevy 0.17</a></li><li><a href="https://lwn.net/SubscriberLink/1038750/6aa9769e0b875235/">Linting Rust code in the kernel</a></li><li><a href="https://max-inden.de/post/fast-udp-io-in-firefox/">Fast UDP I/O for Firefox in Rust</a></li><li><a href="https://github.com/feldroop/genedex">genedex: A Small and Fast FM-Index for Rust</a></li><li><a href="https://github.com/bahdotsh/blogr/releases/tag/v0.3.0">blogr v0.3.0 - Fast, lightweight static site generator with built in newsletter manager</a></li><li><a href="https://github.com/bahdotsh/feedr/releases/tag/v0.2.0">Feedr v0.2.0 - A feature-rich terminal-based RSS feed reader with a clean and intuitive TUI</a></li><li><a href="https://github.com/gluesql/glues/releases/tag/v0.8.1">Glues v0.8.1 adds a browser TUI, proxy support, and redb storage</a></li><li><a href="https://www.sea-ql.org/blog/2025-09-30-sea-orm-rbac/">Role Based Access Control in SeaORM 2.0</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5><ul><li><a href="https://endler.dev/2025/choosing-rust/">On Choosing Rust</a></li><li><a href="https://purplesyringa.moe/blog/the-expression-problem-and-rust/">The expression problem and Rust</a></li><li><a href="https://kerkour.com/proton-apps-rust">Case Study: How Proton uses Rust to build cross-platform applications for millions of people</a></li><li><a href="https://blog.vermeilsoft.com/2025-09-rust-game-engine">The Game Engine that would not have been made without Rust</a></li><li><a href="https://filtra.io/rust/interviews/volvo-sep-25">Introducing Rust To The Automotive Stack: A Conversation With Julius Gustavsson Of Volvo Cars</a></li><li><a href="https://www.youtube.com/playlist?list=PLiOc9_WF8i8vVy5Qn6I9TxkBjsofzLcaH">Rust in Paris 2025 – Full Talks Playlist</a></li><li>[video] <a href="https://www.youtube.com/watch?v=ec-ucXJ4x-0">How to Optimize Rust for Slowness: Inspired by New Turing Machine Results</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5><ul><li><a href="https://marma.dev/articles/2025/under-the-hood-vec-t">Under the hood: Vec\&lt;T&gt;</a></li><li><a href="https://blog.0xshadow.dev/posts/backend-engineering-with-axum/axum-jwt-access-token/">Axum Backend Series: Implement JWT Access Token</a></li><li><a href="https://blog.cuongle.dev/p/level-up-your-rust-pattern-matching">Level Up your Rust pattern matching</a></li><li>[video] <a href="https://www.youtube.com/watch?v=kESBAiTYMoQ">Sguaba: Type-safe spatial math in Rust</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#miscellaneous">Miscellaneous</a></h5><ul><li><a href="https://blog.cloudflare.com/20-percent-internet-upgrade/">Cloudflare just got faster and more secure, powered by Rust</a></li><li><a href="https://ferrous-systems.com/blog/rust-who-what-why/">Rust: Who, What and Why for ESA SW PA Workshop</a></li></ul><h4><a class="toclink" href="http://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/bahdotsh/blogr">blogr</a>, a fast, lightweight static site generator.</p><p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1472">Gokul</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="http://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 theimplementation 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/orguidance on which aspect(s) of the feature need testing.</p><p><a href="https://github.com/rust-lang/rust/labels/call-for-testing">Rust</a></p><ul><li><a href="https://github.com/rust-lang/rust/issues/142859">FR: Add a --fail-fast option to libtest</a></li><li><a href="https://github.com/rust-lang/rust/issues/142859#issuecomment-3339090064">Testing instructions</a></li></ul><p><em>No calls for testing were issued this week by <a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing">Rust language RFCs</a>, <a href="https://github.com/rust-lang/cargo/labels/call-for-testing">Cargo</a> or <a href="https://github.com/rust-lang/rustup/labels/call-for-testing">Rustup</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="http://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="http://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/diesel-rs/diesel/discussions/4786">Diesel - Feedback on an All About Select guide</a></li><li><a href="https://github.com/diesel-rs/diesel/issues/4764">Diesel - Incomplete explanation for PgConnection loading modes</a></li><li><a href="https://github.com/diesel-rs/diesel/issues/4787">Diesel - FromSqlRow derive macro fails when in scope where Ok is not the one from the standard library</a></li><li><a href="https://github.com/diesel-rs/diesel/issues/4780">Diesel - fk_related_tables not working correctly with two foreign keys to same table</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://x.com/ThisWeekInRust">X (formerly Twitter)</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#cfp-events">CFP - Events</a></h5><p>Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.</p> <ul><li><a href="https://tokio.rs/blog/2025-09-26-announcing-tokio-conf-cfp"><strong>TokioConf 2026</strong></a>| 2025-12-08 | Portland, Oregon, USA | 2026-04-20</li></ul><p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://x.com/ThisWeekInRust">X (formerly Twitter)</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p><h4><a class="toclink" href="http://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4><p>473 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2025-09-23..2025-09-30">merged in the last week</a></p><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/146667">add an attribute to check the number of lanes in a SIMD vector after monomorphization</a></li><li><a href="https://github.com/rust-lang/rust/pull/146317">add panic=immediate-abort</a></li><li><a href="https://github.com/rust-lang/rust/pull/147090">skip stack overflow handler for panic=immediate-abort</a></li><li><a href="https://github.com/rust-lang/rust/pull/141469">allow <code>&amp;raw [mut | const]</code> for union field in safe code</a></li><li><a href="https://github.com/rust-lang/rust/pull/146376">debuginfo: add an unstable flag to write split DWARF to an explicit directory</a></li><li><a href="https://github.com/rust-lang/rust/pull/133477">detect tuple structs that are unconstructable due to re-export</a></li><li><a href="https://github.com/rust-lang/rust/pull/147092">do not compute optimized MIR if code does not type-check</a></li><li><a href="https://github.com/rust-lang/rust/pull/145277">do not materialise X in <code>[X; 0]</code> when X is unsizing a const</a></li><li><a href="https://github.com/rust-lang/rust/pull/146653">improve diagnostics for empty attributes</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#library">Library</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/146859">BTreeMap: don't leak allocators when initializing nodes</a></li><li><a href="https://github.com/rust-lang/rust/pull/146904">constify {<code>Mutex</code>, <code>RwLock</code>, <code>ReentrantLock</code>}<code>::data_ptr</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/146979">constify Default on Nanoseconds</a></li><li><a href="https://github.com/rust-lang/rust/pull/146818">constify <code>{float}::total_cmp()</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/146735">unstably constify float <code>mul_add</code> methods</a></li><li><a href="https://github.com/rust-lang/rust/pull/146293">non-panicking <code>Vec::try_remove</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/146958">fix infinite recursion in <code>Path::eq</code> with String</a></li><li><a href="https://github.com/rust-lang/rust/pull/146937">implement <code>hostname</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/147042">remove most <code>#[track_caller]</code> from allocating Vec methods</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6><ul><li><a href="https://github.com/rust-lang/cargo/pull/16004">config: combine key error context into one</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16019">shell: Use a distinct style for transient status</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16016">add retry for <code>git fetch</code> failures in <code>CARGO_NET_GIT_FETCH_WITH_CLI</code> path</a></li><li><a href="https://github.com/rust-lang/cargo/pull/16021">better error message for rust version incompatibility</a></li><li><a href="https://github.com/rust-lang/cargo/pull/15990">sparse URLs in <code>TomlLockfileSourceId</code></a></li><li><a href="https://github.com/rust-lang/cargo/pull/16003">use <code>host-tuple</code> for host target subsitution</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rustdoc">Rustdoc</a></h6><ul><li><a href="https://github.com/rust-lang/rust/pull/135771">Add support for associated items in "jump to def" feature</a></li><li><a href="https://github.com/rust-lang/rust/pull/138907">add rustdoc <code>doc_cfg</code> features</a> (RFC <a href="https://rust-lang.github.io/rfcs/3631-rustdoc-cfgs-handling.html">#3631</a>)</li><li><a href="https://github.com/rust-lang/rust/pull/147045">search: use the same ID for entry and path to same item</a></li><li><a href="https://github.com/rust-lang/rust/pull/116882">hide <code>#[repr]</code> if it isn't part of the public ABI</a></li><li><a href="https://github.com/rust-lang/rust/pull/147047">put the toolbar on the all item index</a></li></ul><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6><ul><li><a href="https://github.com/rust-lang/rust-clippy/pull/15420"><code>double_parens</code>: add structured suggestions, fix bug</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15748"><code>filter_next</code>: check for <code>filter().next_back()</code></a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15647"><code>collapsible</code>(<code>_else</code>)<code>_if</code>: respect <code>#[expect]</code> on inner <code>if</code></a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15788"><code>let_unit_value</code>: create the suggestion "differentially"</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15720"><code>new_without_default</code>: if <code>new</code> has <code>#[cfg]</code>, copy that onto <code>impl Default</code></a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15756"><code>or_fun_call</code>: respect MSRV for <code>Result::unwrap_or_default</code> suggestion</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15776"><code>should_implement_trait</code>: only suggest traits that are in the prelude</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15731"><code>unnecessary_mut_passed</code>: retain parens around the arguments</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15628">check for proc macros from within <code>explicit_deref_methods</code> and do not lint on proc macro expansions</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15782">fix <code>new_without_default</code> false positive on private type with trait impl</a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15417">overhaul <code>mut_mut</code></a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/15469">refactor <code>module_style</code></a></li><li><a href="https://github.com/rust-lang/rust-clippy/pull/13800">rename <code>unchecked_duration_subtraction</code> to <code>unchecked_time_subtraction</code> and check for <code>Duration - Duration</code></a></li></ul><h6><a class="toclink" href="http://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/20760">add <code>all</code>, <code>any</code> and <code>not</code> completions in <code>#[cfg]</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20604">add <code>cfg_attr</code> predicate completion</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20599">add applicable on bang <code>!</code> for <code>apply_demorgan</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20729">add const parameter keyword completion</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20598">add let-chain support for <code>convert_to_guarded_return</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/19867">allow <code>&amp;raw</code> {<code>mut</code>, <code>const</code>} for union field</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20543">fix "Replace match with if let" not to trigger when invalid transformations occur</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20735">fix SCIP panicking due to salsa not attaching</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20736">fix applicable on if-let-chain for <code>invert_if</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20731">fix expand rest pattern in tuple and slice pattern</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20611">fix precedence parenthesis for <code>replace_arith_op</code></a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20742">don't turn unused variables into raw identifier</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20721">implement fallback properly</a></li><li><a href="https://github.com/rust-lang/rust-analyzer/pull/20745">support negative integer literals in const generics in declarative macros</a></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5><p>A relatively quiet week. Most of the improvements are to doc builds, driven bycontinued packing of the search index in rustdoc-search: stringdex update withmore packing <a href="https://github.com/rust-lang/rust/pull/147002">#147002</a> andsimplifications to doc(cfg) in Implement RFC 3631: add rustdoc doc_cfg features<a href="https://github.com/rust-lang/rust/pull/138907">#138907</a>.</p><p>Triage done by <strong>@simulacrum</strong>.Revision range: <a href="https://perf.rust-lang.org/?start=ce4beebecb77821734079cff47d8af08f9f27f11&amp;end=8d72d3e1e96f58ca10059a6bb6e8aecba4a0e9cd&amp;absolute=false&amp;stat=instructions%3Au">ce4beebe..8d72d3e1</a></p><p>1 Regressions, 6 Improvements, 4 Mixed; 2 of them in rollups29 artifact comparisons made in total</p><p><a href="https://github.com/rust-lang/rustc-perf/blob/master/triage/2025/2025-09-28.md">Full report here</a></p><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#approved-rfcs"></a><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>. Theseare 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="http://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 PRswhich are reaching a decision. Express your opinions now.</p><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#rust"></a><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Rust</a><ul><li><a href="https://github.com/rust-lang/rust/issues/143812">Tracking Issue for <code>const_slice_rotate</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/145722">implement Extend&lt;{Group, Literal, Punct, Ident}&gt; for TokenStream</a></li><li><a href="https://github.com/rust-lang/rust/pull/145610">Stabilize <code>char_max_len</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/146013">Add <code>From</code> impls for wrapper types</a></li><li><a href="https://github.com/rust-lang/rust/pull/144064">prefer alias candidates for sizedness + auto trait goals</a></li><li><a href="https://github.com/rust-lang/rust/issues/132968">Tracking Issue for <code>NonZero&lt;u*&gt;::div_ceil</code></a></li><li><a href="https://github.com/rust-lang/rust/issues/146660">Tracking issue for release notes of #146410: Iterator repeat: no infinite loop for <code>last</code> and <code>count</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/143191">Stabilize <code>rwlock_downgrade</code> library feature</a></li><li><a href="https://github.com/rust-lang/rust/pull/145608">Prevent downstream <code>impl DerefMut for Pin&lt;LocalType&gt;</code></a></li><li><a href="https://github.com/rust-lang/rust/pull/136776">Forbid freely casting lifetime bounds of dyn-types</a></li><li><a href="https://github.com/rust-lang/rust/pull/140283">Fix accidental type inference in array coercion</a></li><li><a href="https://github.com/rust-lang/rust/pull/145617">docs(style): Specify the frontmatter style</a></li><li><a href="https://github.com/rust-lang/rust/pull/138799">core: simplify <code>Extend</code> for tuples</a></li></ul><p><em>No Items entered Final Comment Period this week for <a href="https://github.com/rust-lang/rfcs/labels/final-comment-period">Rust RFCs</a>, <a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Cargo</a>, <a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc+">Language Team</a>, <a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">Language Reference</a>, <a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period">Leadership Council</a> or <a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen+label%3Afinal-comment-period+sort%3Aupdated-desc">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><h6><a class="toclink" href="http://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"></a><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h6><ul><li><em>No New or Updated RFCs were created this week.</em></li></ul><h4><a class="toclink" href="http://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4><p>Rusty Events between 2025-10-01 - 2025-10-29 🦀</p><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5><ul><li>2025-10-01 | 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/wqzhftyhcnbcb"><strong>Indy.rs - with Social Distancing</strong></a></li></ul></li><li>2025-10-02 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/ekgdex6j"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-10-04 | Virtual (Kampala, UG) | <a href="https://www.eventbrite.com/o/rust-circle-kampala-65249289033">Rust Circle Meetup</a><ul><li><a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763858627"><strong>Rust Circle Meetup</strong></a></li></ul></li><li>2025-10-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/311062530/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-10-07 | Virtual (Beijing, CN) | <a href="https://www.meetup.com/wasm-rust-meetup/events/">WebAssembly and Rust Meetup (Wasm Empowering AI)</a><ul><li><a href="https://www.meetup.com/wasm-rust-meetup/events/310831771/"><strong>Monthly WasmEdge Community Meeting, the runtime for LLM/AGI</strong></a></li></ul></li><li>2025-10-09 - 2025-10-10 | Hybrid (Paris, FR) | <a href="https://eurorust.eu/">EuroRust</a><ul><li><a href="https://eurorust.eu/schedule/"><strong>EuroRust 2025</strong></a></li></ul></li><li>2025-10-09 | 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/306046639/"><strong>Rust Hack and Learn</strong></a></li></ul></li><li>2025-10-09 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/jotnli2g"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-10-12 | 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/311109160/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-10-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/305361534/"><strong>Second Tuesday</strong></a></li></ul></li><li>2025-10-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/307731034/"><strong>Rust Study/Hack/Hang-out</strong></a></li></ul></li><li>2025-10-16 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/o8fh3fh7"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-10-16 | 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/306046668/"><strong>Rust Nürnberg online</strong></a></li></ul></li><li>2025-10-18 | Virtual (Gdansk, PL) | <a href="https://www.meetup.com/stacja-it-trojmiasto/">Stacja IT Trójmiasto</a><ul><li><a href="https://www.meetup.com/stacja-it-trojmiasto/events/310935164/"><strong>[BEZPŁATNIE] Programowanie w języku Rust</strong></a></li></ul></li><li>2025-10-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/311109167/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-10-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/311068625/"><strong>👋 Community Catch Up</strong></a></li></ul></li><li>2025-10-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/310002307/"><strong>Mid-month Rustful</strong></a></li></ul></li><li>2025-10-23 | 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/306046641/"><strong>Rust Hack and Learn</strong></a></li></ul></li><li>2025-10-23 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a> | <a href="https://silicongirona.club">Silicon Girona</a><ul><li><a href="https://luma.com/zyc3touy"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li></ul></li><li>2025-10-26 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul><li><a href="https://www.meetup.com/dallasrust/events/311109171/"><strong>Rust Readers Discord Discussion: Macros</strong></a></li></ul></li><li>2025-10-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/305361444/"><strong>Fourth Tuesday</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#asia">Asia</a></h5><ul><li>2025-10-02 | Seoul, KR | <a href="https://www.meetup.com/rust-seoul-meetup">Seoul Rust (Programming Language) Meetup</a><ul><li><a href="https://www.meetup.com/rust-seoul-meetup/events/310824483/"><strong>Seoul Rust Meetup</strong></a></li></ul></li><li>2025-10-04 | Bangalore, IN | <a href="https://hasgeek.com/rustbangalore">Rust Bangalore</a><ul><li><a href="https://hasgeek.com/rustbangalore/october-2025-rustacean-meetup/"><strong>October 2025 Rustacean meetup</strong></a></li></ul></li><li>2025-10-08 | Kuala Lumpur, MY | <a href="https://t.me/rustlangmalaysia">Rust Malaysia</a><ul><li><a href="https://docs.google.com/forms/d/e/1FAIpQLScESY4eHc5lzZznAHZmFxI85CYaOKCYTQASRwXxC2y0KpI6zw/viewform"><strong>Malaysia Rust Meetup</strong></a></li></ul></li><li>2025-10-09 | Tokyo, JP | <a href="https://www.meetup.com/tokyo-rust-meetup">Tokyo Rust Meetup</a><ul><li><a href="https://www.meetup.com/tokyo-rust-meetup/events/310899137/"><strong>Building Pocket-Sized Terminal UIs with Rust</strong></a></li></ul></li><li>2025-10-20 | Tel Aviv-Yafo, IL | <a href="https://www.meetup.com/rust-tlv">Rust 🦀 TLV</a><ul><li><a href="https://www.meetup.com/rust-tlv/events/310628902/"><strong>In person Rust October 2025 at AWS in Tel Aviv</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#europe">Europe</a></h5><ul><li>2025-10-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/311209846/"><strong>Rust in October: Undefined Rust</strong></a></li></ul></li><li>2025-10-01 | Olomouc, CZ | <a href="https://www.meetup.com/rust-moravia">Rust Moravia</a><ul><li><a href="https://www.meetup.com/rust-moravia/events/310743282/"><strong>4. Rust Moravia Meetup (In the capital!)</strong></a></li></ul></li><li>2025-10-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/311170808/"><strong>Building AI chatbots with Webassembly, Rust, and Leptos</strong></a></li></ul></li><li>2025-10-01 | Paris, FR | <a href="https://www.eventbrite.fr/e/rust-meetup-in-paris-tickets-1686673127729">Paris Rustaceans</a><ul><li><a href="https://www.eventbrite.fr/e/rust-meetup-in-paris-tickets-1686673127729"><strong>Rust Meetup in Paris</strong></a></li></ul></li><li>2025-10-02 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul><li><a href="https://www.meetup.com/rust-berlin/events/311202886/"><strong>Rust Berlin on location 🏳️🌈 - Edition 007</strong></a></li></ul></li><li>2025-10-02 | Oslo, NO | <a href="https://www.meetup.com/rust-oslo">Rust Oslo</a><ul><li><a href="https://www.meetup.com/rust-oslo/events/310062134/"><strong>Rust Hack'n'Learn at Kampen Bistro</strong></a></li></ul></li><li>2025-10-08 | Girona, ES | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul><li><a href="https://luma.com/8u55jo0h"><strong>Rust Girona Hack &amp; Learn 10 2025</strong></a></li></ul></li><li>2025-10-08 | Paris, FR | <a href="https://www.meetup.com/rust-paris">Rust Paris</a><ul><li><a href="https://www.meetup.com/rust-paris/events/310424476/"><strong>Rust meetup #79</strong></a></li></ul></li><li>2025-10-08 | Reading, UK | <a href="https://www.meetup.com/reading-rust-workshop">Reading Rust Workshop</a><ul><li><a href="https://www.meetup.com/reading-rust-workshop/events/308944041/"><strong>Reading Rust Meetup</strong></a></li></ul></li><li>2025-10-09 - 2025-10-10 | Hybrid (Paris, FR) | <a href="https://eurorust.eu/">EuroRust</a><ul><li><a href="https://eurorust.eu/schedule/"><strong>EuroRust 2025</strong></a></li></ul></li><li>2025-10-14 | Basel, CH | <a href="https://www.meetup.com/rust-basel">Rust Basel</a><ul><li><a href="https://www.meetup.com/rust-basel/events/310827834/"><strong>Rust Meetup #13 @ letsboot</strong></a></li></ul></li><li>2025-10-21 | Aarhus, DK | <a href="https://www.meetup.com/rust-aarhus">Rust Aarhus</a><ul><li><a href="https://www.meetup.com/rust-aarhus/events/311035141/"><strong>Hack Night</strong></a></li></ul></li><li>2025-10-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/308592252/"><strong>Topic TBD</strong></a></li></ul></li><li>2025-10-21 | 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/310813952/"><strong>Rust in Surgery: Powering the Data Pipelines</strong></a></li></ul></li><li>2025-10-21 | Bergen, No | <a href="https://www.meetup.com/bergen-rust-new-technology/events/">Rust Bergen</a><ul><li><a href="https://www.meetup.com/bergen-rust-new-technology/events/311153821/"><strong>Rust Meetup #01 @ Zrch</strong></a></li></ul></li><li>2025-10-28 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul><li><a href="https://www.meetup.com/rust-manchester/events/307919171/"><strong>Rust Manchester October Code Night</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#north-america">North America</a></h5><ul><li>2025-10-01 | 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/311243690/"><strong>Web3 Developer Meetup</strong></a></li></ul></li><li>2025-10-02 | Montréal, QC, CA | <a href="https://www.meetup.com/rust-montreal">Rust Montréal</a><ul><li><a href="https://www.meetup.com/rust-montreal/events/311242811/"><strong>October Monthly Social</strong></a></li></ul></li><li>2025-10-02 | 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/311004898"><strong>RUST MEETUP at HACKER DOJO</strong></a></li></ul></li><li>2025-10-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/310279407/"><strong>🚁 Rust in Flight: Lessons from Designing a 3D‑Printed Quadcopter with Embedded</strong></a></li></ul></li><li>2025-10-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/310983705/"><strong>North End Rust Lunch, Oct 4</strong></a></li></ul></li><li>2025-10-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/311145663/"><strong>Aya the Beholder: Writing an eBPF Firewall with the Aya Crate</strong></a></li></ul></li><li>2025-10-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/307731034/"><strong>Rust Study/Hack/Hang-out</strong></a></li></ul></li><li>2025-10-16 | 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/311012947/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li></ul></li><li>2025-10-21 | San Francisco, CA, US | <a href="https://luma.com/events-by-vara-gear">Vara &amp; Gear</a><ul><li><a href="https://luma.com/kbs2os1c"><strong>Rust Workshop by Vara Network</strong></a></li></ul></li><li>2025-10-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/308284343/"><strong>Rust Hacking in Person</strong></a></li></ul></li><li>2025-10-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/310457307/"><strong>Rust Lunch - Fareground</strong></a></li></ul></li><li>2025-10-23 | Nashville, TN, US | <a href="https://www.meetup.com/music-city-rust-developers">Music City Rust Developers</a><ul><li><a href="https://www.meetup.com/music-city-rust-developers/events/304333267/"><strong>Year In Review</strong></a></li></ul></li><li>2025-10-25 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul><li><a href="https://www.meetup.com/bostonrust/events/310983712/"><strong>Porter Square Rust Lunch, Oct 25</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5><ul><li>2025-10-22 | 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/310847099/"><strong>October Meetup</strong></a></li></ul></li><li>2025-10-28 | 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/311234237/"><strong>October Meetup</strong></a></li></ul></li></ul><h5><a class="toclink" href="http://this-week-in-rust.org/atom.xml#south-america">South America</a></h5><ul><li>2025-10-08 | Buenos Aires, AR | <a href="https://www.meetup.com/rust-argentina">Rust en Español</a><ul><li><a href="https://www.meetup.com/rust-argentina/events/311276950/"><strong>Octubre Async - Escribimos un Runtime desde Cero!</strong></a></li></ul></li><li>2025-10-25 | São Paulo, BR | <a href="https://www.meetup.com/rust-sao-paulo-meetup">Rust São Paulo Meetup</a><ul><li><a href="https://www.meetup.com/rust-sao-paulo-meetup/events/311084440/"><strong>Encontro do Rust-SP na Amazon Web Services</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 getit 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="http://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/1nknaii/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p><h3><a class="toclink" href="http://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3><blockquote><p>I must personally extend my condolences to those who forgot they chose in the past to annoy their future self.</p></blockquote><p>– <a href="https://github.com/rust-lang/rust/issues/145936#issuecomment-3322104583">@workingjubilee on github</a></p><p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1719">Riking</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><em>This Week in Rust is edited by: <a href="https://github.com/nellshamrell">nellshamrell</a>, <a href="https://github.com/llogiq">llogiq</a>, <a href="https://github.com/cdmistman">cdmistman</a>, <a href="https://github.com/ericseppanen">ericseppanen</a>, <a href="https://github.com/extrawurst">extrawurst</a>, <a href="https://github.com/U007D">U007D</a>, <a href="https://github.com/joelmarcey">joelmarcey</a>, <a href="https://github.com/mariannegoldin">mariannegoldin</a>, <a href="https://github.com/bennyvasquez">bennyvasquez</a>, <a href="https://github.com/bdillo">bdillo</a></em></p><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/1nvpd2x/this_week_in_rust_619/">Discuss on r/rust</a></small></p></description> <pubDate>Wed, 01 Oct 2025 04:00:00 +0000</pubDate> <dc:creator>TWiR Contributors</dc:creator></item><item> <title>Mozilla Localization (L10N): Localizer Spotlight: Selim</title> <guid isPermaLink="false">https://blog.mozilla.org/l10n/?p=1784</guid> <link>https://blog.mozilla.org/l10n/2025/09/30/localizer-spotlight-selim/</link> <description><p style="text-align: left;"><b>About You</b></p><p>My name is <a href="https://pontoon.mozilla.org/contributors/Qkxrfae9uxCIC_PmnqAsJREVw8U/">Selim</a> and I’m the Turkish localization manager. I’m from İstanbul, Türkiye. I’ve been contributing to Mozilla since 2010.</p><p><b>Your Contributions</b></p><div class="wp-caption alignright" id="attachment_1785" style="width: 444px;"><a href="https://blog.mozilla.org/l10n/files/2025/09/selim-brussels.jpg"><img alt="Selim (first left) with fellow Turkish Mozillians Onur, Didem and Serkan (Mozilla Summit Brussels)" class="wp-image-1785" height="287" src="https://blog.mozilla.org/l10n/files/2025/09/selim-brussels-e1759172589317-600x397.jpg" width="434" /></a><p class="wp-caption-text" id="caption-attachment-1785">Selim (first left) with fellow Turkish Mozillians Onur, Didem and Serkan (Mozilla Summit Brussels)</p></div><p><em><strong>Q:</strong> Over the years, do you remember how many projects you’ve been involved in (including ones that may no longer exist)?</em></p><p><strong>A:</strong> It’s been so many! I began with Firefox 15 years ago, but I think I’ve been involved in around 30 projects over the years. We currently have 23 projects active in Pontoon, and I’ve been involved in every single one of them to some degree.</p><p><em><strong>Q:</strong> Roughly how many Mozilla events have you joined — whether localization meetups, company-wide gatherings, MozFest, or others?</em></p><p><strong>A: </strong>I’ve attended six of them. My first one was the Mozilla Balkans Meetup 2011 in Sofia. Then I had the chance to meet fellow Mozillians in Zagreb, Brussels, Berlin, Paris, and my hometown İstanbul. They were all great experiences, both enlightening and rewarding.</p><p><em><strong>Q:</strong> Looking back, are there any contributions or milestones you feel especially proud of?</em></p><p><strong>A:</strong> When I first began contributing, my intention was to complete a few missing translations I had noticed in Firefox. However, I quickly realized that the project was huge and there was much more to it than met the eye. Its Turkish localization was around 85% complete at that time, but the community lacked the resources to push it forward. I took it as my duty to reach 100% first, and then spellcheck and fix all existing translations. It took me a few months to get there, but Firefox has clearly had the best Turkish localization among all browsers ever since.</p><p><b>Your Background</b></p><p><em><strong>Q:</strong> Does your professional background support or connect with your work in localization?</em></p><p><strong>A:</strong> I currently work as a freelance editor and translator, translating and editing print magazines (mostly tech, popular science, and general knowledge titles), and localizing software and websites.</p><p>And the event that kickstarted my career in publishing and professional translation was volunteering for localization. (No, not Firefox. It didn’t even exist yet!) Back in high school, I began localizing an open-source CMS called PHP-Nuke to be used on my school’s website. PHP-Nuke became very popular in a short amount of time, and a computer magazine editor approached me to build the magazine’s website using open-source tools, including PHP-Nuke. I’ve been an avid reader of those magazines since my childhood but never imagined that one day I’d be working for Türkiye’s best-selling computer magazine!</p><p>In time, I began translating and writing articles for the magazine as a freelancer and joined the editorial staff after graduating from university.</p><p>I’ve written hundreds of software and website reviews and kept noticing that some of them were high-quality products that needed better localization. Now, with a better understanding of how things work and with some technical background, I began contributing to more and more open-source projects in my free time, and Firefox was one of them.</p><p>I was lucky that the previous Turkish contributors did a great job “localizing” Firefox, not just translating it. I learned a great deal from them, and it had a huge impact on my later professional work.</p><p>I was also approached and/or approved by several clients who had seen my volunteer localization work.</p><p>So, in a way, my professional background does support my work in localization — and vice versa.</p><p><em><strong>Q:</strong> In what ways has being part of Mozilla’s localization community influenced you — whether in problem-solving, leadership, or collaborating across cultures?</em></p><p><strong>A:</strong> Once I started contributing, I quickly realized that Mozilla had something none of the other projects I had contributed to previously had: a community that I felt part of. These people <i>loved </i>the internet, and they were having fun localizing stuff, just like me.</p><p>The localization community helped me improve myself both professionally and personally in a lot of ways: I learned how to collaborate better with a team of volunteers from different backgrounds, how to use different translation tools, how to properly report bugs, how to deal with different time zones, and how to get out of my comfort zone and talk to people from abroad both in virtual and face-to-face events.</p><p><b>Your Community</b></p><p><em><strong>Q:</strong> As a long-time contributor, what motivates you to continue after all these years?</em></p><p><strong>A:</strong> First and foremost, I believe in Mozilla’s mission wholeheartedly. But there’s a practical motivation too: Turkish is spoken by tens of millions of people, so the potential impact of localization is huge. Ensuring my fellow nationals have access to high-quality, localized open-source software is a driving force. And I’m still having fun doing it!</p><p><em><strong>Q:</strong> Many communities struggle with onboarding or retaining contributors, especially after COVID limited in-person events. What are the challenges you face as a manager and how do you address them? And how do you engage with active contributors today? Do you have a process or approach for welcoming newcomers?</em></p><p><strong>A:</strong> The Turkish community had its fair share of struggles with onboarding and retaining contributors, but it never became a huge challenge because of an advantage we had: The first iteration of the community started very early. Firefox 1.0 was already available in Turkish, and they maintained a good localization percentage for most Mozilla products, even if not 100%. So when I joined, there were things to do but not a single project that needed to be started from scratch. They were maintainable by one or two enthusiastic localizers. And when I took on the manager role, I always tried to keep it that way. I did approve a number of new projects, but not before ensuring that we had the resources to always keep them at least 90% complete.</p><p>But that creates a dilemma: New Turkish contributors usually face strings that are harder to grasp without context or are more difficult to translate, because the easier and more visible strings have already been translated. I guess that makes newcomers frustrated and they leave after translating a few strings. In fact, over the past 10 years, we’ve had only one contributor (<a href="https://pontoon.mozilla.org/contributors/VB0eftwM_mnLHjP8UDNrurc_mzk/">Grk</a>) who has translated more than 10,000 strings (apart from myself), and two contributors (<a href="https://pontoon.mozilla.org/contributors/tQetFmUNDeSWuQYsEjhTDVQdyNw/">Ali</a> and <a href="https://pontoon.mozilla.org/contributors/rLfANGZKSoM1QVtAYg9lpSI6qro/">Osman</a>) with more than 1,000 strings. I’d like to thank them once again for their awesome contributions.</p><p>The Turkish community has always been very small: just a few people contributing at a time, and that has worked for us. So I’m not anxiously trying to onboard or retain contributors, but if I see an enthusiastic newcomer, I try to guide them by commenting on their translations or sending a welcome email to let them know how things work.</p><p><b>Something Fun</b><br /><em><strong>Q:</strong> Could you share a few fun or unexpected facts about yourself that people might not know?</em></p><p><strong>A: </strong>Certainly:</p><ul><li>I’m a metalhead, and the first thing I ever translated as a hobby was the lyrics of a Sentenced song. I’ve been translating song lyrics ever since, and <a href="https://www.sozbuyucusu.com/">I have a blog</a> where I publish them.</li><li>My favorite documentary is <a href="https://en.wikipedia.org/wiki/Helvetica_(film)"><i>Helvetica</i></a>.</li><li>I built my first website when I was 13, by manually typing HTML in Windows Notepad. That’s when I discovered the internet’s endless possibilities and fell in love with it.</li></ul></description> <pubDate>Tue, 30 Sep 2025 00:03:10 +0000</pubDate> <dc:creator>Peiying Mo</dc:creator></item><item> <title>Matthew Gaudet: Summer of Sharpening</title> <guid isPermaLink="false">52c2f0cde4b0537e2cba526e:57f70c5c440243051b0c3ce8:68dab97df724e53f95683011</guid> <link>https://www.mgaudet.ca/technical/2025/9/29/summer-of-sharpening</link> <description><p>As we head into fall, I wanted to write up a bit of an experience report on a project I ran this summer with a few other people on the SpiderMonkey team. </p><p>A few of us on the team chose to block off some time during the summer to do intentional professional development. Exploring topics that we hadn’t looked into, often due to a feeling of time starvation.</p><p>Myself, I blocked off 2 hours every Friday through the summer. </p><p>In order to turn this into a <strong>team</strong> exercise, rather than just a personal development period, I create a shared document where I encouraged people to write up their experiments, so that we could read about their exploits. </p><h3>How did it go?</h3><p>Well, I don’t think -anyone- did 2 hours every week But I think most people did a little bit of exploration. </p><p>I’ve blogged already a bit about some of the topics I worked on for sharpening time: <a href="https://www.mgaudet.ca/technical/2025/5/28/exploring-a-language-runtime-with-bpftrace">Both my</a> blog posts <a href="https://www.mgaudet.ca/technical/2025/5/28/finding-hot-allocation-sites-with-bpftrace">about eBPF</a> were a result of this practice. Other things I looked into that I didn’t get a chance to blog about include: </p><ul><li>Learning about Instruments, and in particular Processor Trace (so painfully slow)</li><li>Exploring <a href="https://github.com/plasma-umass/coz">Coz</a>, the causal profiler (really focused on multihreaded workloads in a way that didn’t produce value for me)</li><li>Playing with Zed (clangd so slow for some reason)</li><li>‘vibe coding’ (AI can do some things, but man, local minima are a pain).</li><li>Exploring different options for Android emulation</li><li>Watching WWDC videos on performance optimization (nice overview, mostly stuff I knew).</li></ul><p>I was very happy overall with the results, and have already created another document for next year to capture some ideas that we could look into next year. </p></description> <pubDate>Mon, 29 Sep 2025 16:54:00 +0000</pubDate> <dc:creator>Matthew Gaudet</dc:creator></item><item> <title>The Servo Blog: This month in Servo: variable fonts, network tools, SVG, and more!</title> <guid isPermaLink="true">https://servo.org/blog/2025/09/25/this-month-in-servo/</guid> <link>https://servo.org/blog/2025/09/25/this-month-in-servo/</link> <description><p>Another month, another record number of pull requests merged!August flew by, and with it came <strong>447 pull requests</strong> from Servo contributors.It was also the final month of our <a href="https://www.outreachy.org/">Outreachy</a> cohort; you can read <a href="https://www.jerensl.com/blog/en-final-project-progress-outreachy/">Jerens’</a> and <a href="https://uthmaniv.github.io/">Uthman’s</a> blogs to learn about how it went!</p><h3>Highlights <a class="header-anchor" href="https://servo.org/blog/2025/09/25/this-month-in-servo/#highlights"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>Our big new feature this month is rendering <strong>inline SVG elements</strong> (<a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/38188">#38188</a>, <a href="https://github.com/servo/servo/pull/38603">#38603</a>).This improves the appearance of many popular websites.</p><figure> <a href="https://servo.org/img/blog/2025-09-svg.png"><img alt="Screenshot of servoshell with the Google homepage loaded" src="https://servo.org/img/blog/2025-09-svg.png" /></a> &lt;figcaption&gt;Did you know that the Google logo is an SVG element?&lt;/figcaption&gt;</figure><p>We have implemented <strong>named grid line lines and areas</strong> (<a href="https://github.com/nicoburns">@nicoburns</a>, <a href="https://github.com/loirooriol">@loirooriol</a>, <a href="https://github.com/servo/servo/pull/38306">#38306</a>, <a href="https://github.com/servo/servo/pull/38574">#38574</a>, <a href="https://github.com/servo/servo/pull/38493">#38493</a>), still gated behind the <code>layout_grid_enabled</code> preference (<a href="https://github.com/servo/servo/pull/38306">#38306</a>, <a href="https://github.com/servo/servo/pull/38574">#38574</a>).</p><figure> <a href="https://servo.org/img/blog/2025-09-grid.jpg"><img alt="Screenshot of servoshell loading a page demoing a complex grid layout" src="https://servo.org/img/blog/2025-09-grid.jpg" /></a> &lt;figcaption&gt;CSS grids are all around us.&lt;/figcaption&gt;</figure><p>Servo now supports CSS <strong>‘font-variation-settings’</strong> on all main desktop platforms (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/38642">#38642</a>, <a href="https://github.com/servo/servo/pull/38760">#38760</a>, <a href="https://github.com/servo/servo/pull/38831">#38831</a>).This feature is currently gated behind the <code>layout_variable_fonts_enabled</code> preference.We also respect <code>format(*-variations)</code> inside <code>@font-face</code> rules (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/38832">#38832</a>).Additionally, Servo now reads data from <strong>OpenType Collection (.ttc)</strong> system font files on macOS (<a href="https://github.com/nicoburns">@nicoburns</a>, <a href="https://github.com/servo/servo/pull/38753">#38753</a>), and uses <code>Helvetica</code> for the <strong>‘system-ui’</strong> font (<a href="https://github.com/dpogue">@dpogue</a>, <a href="https://github.com/servo/servo/pull/39001">#39001</a>).</p><figure> <details> <img alt="servoshell nightly showcasing variable fonts, with variable weight (`wght`) values smoothly increasing and decreasing (click to pause)" src="https://servo.org/img/blog/2025-09-variations.webp" style="margin: 0;" /> <img src="https://servo.org/img/blog/2025-09-variations-preview.png" style="margin: 0;" /><div alt="servoshell nightly showcasing variable fonts, with variable weight (`wght`) values smoothly increasing and decreasing (click to play)">▶</div> </details> &lt;figcaption&gt;This font can be customized!&lt;/figcaption&gt;</figure><p>Our <a href="https://book.servo.org/hacking/using-devtools.html">developer tools</a> continue to make progress!We now have a functional <strong>network monitor</strong> panel (<a href="https://github.com/uthmaniv">@uthmaniv</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/38216">#38216</a>, <a href="https://github.com/servo/servo/pull/38601">#38601</a>, <a href="https://github.com/servo/servo/pull/38625">#38625</a>),and our JS debugger can show potential breakpoints (<a href="https://github.com/delan">@delan</a>, <a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/pull/38331">#38331</a>, <a href="https://github.com/servo/servo/pull/38363">#38363</a>, <a href="https://github.com/servo/servo/pull/38333">#38333</a>, <a href="https://github.com/servo/servo/pull/38551">#38551</a>, <a href="https://github.com/servo/servo/pull/38550">#38550</a>, <a href="https://github.com/servo/servo/pull/38334">#38334</a>, <a href="https://github.com/servo/servo/pull/38624">#38624</a>, <a href="https://github.com/servo/servo/pull/38826">#38826</a>, <a href="https://github.com/servo/servo/pull/38797">#38797</a>).Additionally, the layout inspector now <strong>dims nodes that are not displayed</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/38575">#38575</a>).</p><figure><a href="https://servo.org/img/blog/2025-09-mastodon.png"><img alt="servoshell showing the Servo Mastodon account homepage" src="https://servo.org/img/blog/2025-09-mastodon.png" /></a><a href="https://servo.org/img/blog/2025-09-netmonitor.png"><img alt="The Firefox network monitor, showing a list of network connections for the Servo Mastodon account homepage" src="https://servo.org/img/blog/2025-09-netmonitor.png" /></a> &lt;figcaption&gt;That's a lot of network requests.&lt;/figcaption&gt;</figure><p>We’ve fixed a significant source of crashes in the engine: hit testing using outdated display lists (<a href="https://github.com/servo/servo/issues/37932">issue #37932</a>).<strong>Hit testing</strong> in a web rendering engine is the process that determines which element(s) the user’s mouse is hovering over.</p><p>Previously, this process ran inside of <a href="https://github.com/servo/webrender">WebRender</a>, which receives a display list representing what should be rendered for a particular page.WebRender runs on a separate thread or process from the actual page content, so display lists are updated asynchronously.By the time we do a hit test, the elements reported may not exist anymore, so we could trigger crashes by (for example) moving the mouse quickly over parts of the page that were rapidly changing.</p><p>This was fixed by making the hit test operation synchronous and moving it into the same thread as the actual content being tested against, eliminating the possibility of outdated results (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/kongbai1996">@kongbai1996</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/38480">#38480,</a> <a href="https://github.com/servo/servo/pull/38464">#38464,</a> <a href="https://github.com/servo/servo/pull/38463">#38463,</a> <a href="https://github.com/servo/servo/pull/38884">#38884,</a> <a href="https://github.com/servo/servo/pull/38518">#38518)</a>.</p><h3>Web platform support <a class="header-anchor" href="https://servo.org/blog/2025/09/25/this-month-in-servo/#web-platform-support"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><h4>DOM &amp; JS <a class="header-anchor" href="https://servo.org/blog/2025/09/25/this-month-in-servo/#dom-%26-js"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h4><p>We’ve upgraded to <strong>SpiderMonkey v140</strong> (<a href="https://gitlab.gnome.org/GNOME/gjs/-/blob/master/NEWS#L39-137">changelog</a>) (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/37077">#37077</a>, <a href="https://github.com/servo/servo/pull/38563">#38563</a>).</p><p>Numerous pieces of the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Trusted_Types_API"><strong>Trusted Types API</strong></a> are now present in Servo(<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/38595">#38595</a>, <a href="https://github.com/servo/servo/pull/37834">#37834</a>, <a href="https://github.com/servo/servo/pull/38700">#38700</a>, <a href="https://github.com/servo/servo/pull/38736">#38736</a>, <a href="https://github.com/servo/servo/pull/38718">#38718</a>, <a href="https://github.com/servo/servo/pull/38784">#38784</a>, <a href="https://github.com/servo/servo/pull/38871">#38871</a>, <a href="https://github.com/servo/servo/pull/8623">#8623</a>, <a href="https://github.com/servo/servo/pull/38874">#38874</a>, <a href="https://github.com/servo/servo/pull/38872">#38872</a>, <a href="https://github.com/servo/servo/pull/38886">#38886</a>), all gated behind the <code>dom_trusted_types_enabled</code> preference.</p><p>The <a href="https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API"><strong>IndexedDB</strong></a> implementation (gated behind <code>dom_indexeddb_enabled</code>) is progressing quickly (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/rodion">@rodion</a>, <a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/28744">#28744</a>, <a href="https://github.com/servo/servo/pull/38737">#38737</a>, <a href="https://github.com/servo/servo/pull/38836">#38836</a>, <a href="https://github.com/servo/servo/pull/38813">#38813</a>, <a href="https://github.com/servo/servo/pull/38819">#38819</a>, <a href="https://github.com/servo/servo/pull/38115">#38115</a>, <a href="https://github.com/servo/servo/pull/38944">#38944</a>, <a href="https://github.com/servo/servo/pull/38740">#38740</a>, <a href="https://github.com/servo/servo/pull/38891">#38891</a>, <a href="https://github.com/servo/servo/pull/38723">#38723</a>, <a href="https://github.com/servo/servo/pull/38850">#38850</a>, <a href="https://github.com/servo/servo/pull/38735">#38735</a>), now reporting errors via <code>IDBRequest</code> interface and supporting autoincrement keys.</p><p>A prototype implementation of the <a href="https://developer.mozilla.org/en-US/docs/Web/API/CookieStore"><strong>CookieStore</strong> API</a> is now implemented and gated by the <code>dom_cookiestore_enabled</code> preference (<a href="https://github.com/sebsebmc">@sebsebmc</a>, <a href="https://github.com/servo/servo/pull/37968">#37968</a>, <a href="https://github.com/servo/servo/pull/38876">#38876</a>).</p><p>Servo now passes over <strong>99.6% of the <a href="https://drafts.fxtf.org/geometry/">CSS geometry</a> test suite</strong>, thanks to an implementation of <strong>matrixTransform() on DOMPointReadOnly</strong>, making all geometry interfaces serializable, and adding the <strong>SVGMatrix and SVGPoint aliases</strong> (<a href="https://github.com/lumiscosity">@lumiscosity</a>, <a href="https://github.com/servo/servo/pull/38801">#38801</a>, <a href="https://github.com/servo/servo/pull/38828">#38828</a>, <a href="https://github.com/servo/servo/pull/38810">#38810</a>).</p><p>You can now use the <a href="https://developer.mozilla.org/en-US/docs/Web/API/TextEncoderStream"><strong>TextEncoderStream</strong> API</a> (<a href="https://github.com/minghuaw">@minghuaw</a>, <a href="https://github.com/servo/servo/pull/38466">#38466</a>).Streams that are piped now correctly pass through <code>undefined</code> values, too (<a href="https://github.com/gterzian">@gterzian</a>, <a href="https://github.com/servo/servo/pull/38470">#38470</a>).We also fixed a crash in the result of <strong>pipeTo() on ReadableStream</strong> (<a href="https://github.com/gterzian">@gterzian</a>, <a href="https://github.com/servo/servo/pull/38385">#38385</a>).</p><p>We’ve implemented <strong>getModifierState() on MouseEvent</strong> (<a href="https://github.com/PotatoCP">@PotatoCP</a>, <a href="https://github.com/servo/servo/pull/38535">#38535</a>), and made a number of changes involving DOM events: <strong>‘mouseleave’ events</strong> are fired when the pointer leaves an &lt;iframe&gt; (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/38539">#38539</a>), pasting from the clipboard into a text input triggers an <strong>‘input’ event</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/37100">#37100</a>), <strong>focus now occurs after ‘mousedown’</strong> instead of ‘click’ (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/38589">#38589</a>), we ignore ‘mousedown’ and ‘mouseup’ events for elements that are disabled (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/38671">#38671</a>), and removing an event handler attribute like ‘onclick’ clears all relevant event listeners (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/kotx">@kotx</a>, <a href="https://github.com/servo/servo/pull/38734">#38734</a>, <a href="https://github.com/servo/servo/pull/39011">#39011</a>).</p><p>Servo now supports <strong>scrollIntoView()</strong> (<a href="https://github.com/abdelrahman1234567">@abdelrahman1234567</a>, <a href="https://github.com/servo/servo/pull/38230">#38230</a>), and fires a <strong>‘scroll’ event</strong> whenever a page is scrolled (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/servo/servo/pull/38321">#38321</a>).You can now focus an element without scrolling, by passing the <code>{preventScroll: true}</code> option to focus() (<a href="https://github.com/abdelrahman1234567">@abdelrahman1234567</a>, <a href="https://github.com/servo/servo/pull/38495">#38495</a>).</p><p><strong>navigator.sendBeacon()</strong> is now implemented, gated behind the <code>dom_navigator_sendbeacon_enabled</code> preference (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/38301">#38301</a>).Similarly, the <strong>AbortSignal.abort()</strong> static method is hidden behind <code>dom_abort_controller_enabled</code> (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/38746">#38746</a>).</p><p>The <strong>HTMLDocument</strong> interface now exists as a property on the <code>Window</code> object (<a href="https://github.com/leo030303">@leo030303</a>, <a href="https://github.com/servo/servo/pull/38433">#38433</a>).Meanwhile, the <strong>CSS</strong> window property is now a <a href="https://webidl.spec.whatwg.org/#idl-namespaces">WebIDL namespace</a> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/38579">#38579</a>).We also implemented the new <strong>QuotaExceededError</strong> interface (<a href="https://github.com/rmeno12">@rmeno12</a>, <a href="https://github.com/servo/servo/pull/38507">#38507</a>, <a href="https://github.com/servo/servo/pull/38720">#38720</a>), which replaces previous usages of DOMException with the <code>QUOTA_EXCEEDED_ERR</code> name.</p><p>Our 2D canvas implementation now supports <strong>addPath() on Path2D</strong> (<a href="https://github.com/arthmis">@arthmis</a>, <a href="https://github.com/servo/servo/pull/37838">#37838</a>) and the <strong>restore()</strong> methods on <strong>CanvasRenderingContext2D</strong> and <strong>OffscreenCanvas</strong> now pop all applied clipping paths (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/38496">#38496</a>).Additionally, we now support <strong>using web fonts in the 2D canvas</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/38979">#38979</a>).Meanwhile, the performance continues to improve in the new <a href="https://github.com/linebender/vello?tab=readme-ov-file#vello">Vello</a>-based backends (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/38406">#38406</a>, <a href="https://github.com/servo/servo/pull/38356">#38356</a>, <a href="https://github.com/servo/servo/pull/38440">#38440</a>, <a href="https://github.com/servo/servo/pull/38437">#38437</a>), with asynchronous uploading also showing improvements (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/37776">#37776</a>).</p><p>Muting media elements with the <strong>‘mute’</strong> HTML attribute now works during the initial resource load (<a href="https://github.com/rayguo17">@rayguo17</a>, <a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/38462">#38462</a>).</p><p>Modifying stylesheets now integrates better with incremental layout, in both light trees and shadow trees (<a href="https://github.com/coding-joedow">@coding-joedow</a>, <a href="https://github.com/servo/servo/pull/38530">#38530</a>, <a href="https://github.com/servo/servo/pull/38529">#38529</a>).Note that calling setProperty() on a readonly CSSStyleDeclaration correctly throws an exception (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/38677">#38677</a>).</p><h4>CSS <a class="header-anchor" href="https://servo.org/blog/2025/09/25/this-month-in-servo/#css"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h4><p>We’ve upgraded to the upstream <strong>Stylo</strong> revision as of August 1, 2025.</p><p>We now support custom CSS properties with the <strong>CSS.registerProperty()</strong> method (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/38682">#38682</a>), as well as custom element states with the <strong>‘states’ property on ElementInternals</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/38564">#38564</a>).</p><p>Flexbox cross sizes can no longer end up negative through stretching (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/38521">#38521</a>), while ‘stretch’ on flex items now stretches to the line if possible (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/38526">#38526</a>).</p><p><strong>Overflow calculations are more accurate</strong>, now that we ignore ‘position: fixed’ children of the root element (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/servo/servo/pull/38618">#38618</a>), compute overflow for &lt;body&gt; separate from the viewport (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/38825">#38825</a>), check for ‘overflow: visible’ in parents and children (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/38443">#38443</a>), and propagate ‘overflow’ to the viewport correctly (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/38598">#38598</a>).</p><p>‘color’ and ‘text-decoration’ properties no longer inherit into the contents of &lt;select&gt; elements (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/38570">#38570</a>).</p><p>Negative outline offsets work correctly (<a href="https://github.com/lumiscosity">@lumiscosity</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/38418">#38418</a>).</p><p>Video elements no longer fall back to a preferred aspect ratio of 2 (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/38705">#38705</a>).</p><p>‘position: sticky’ elements are handled correctly inside CSS transforms (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/38391">#38391</a>).</p><h3>Performance &amp; Stability <a class="header-anchor" href="https://servo.org/blog/2025/09/25/this-month-in-servo/#performance-%26-stability"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>We fixed several panics this month, involving IntersectionObserver and missing stacking contexts (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/38473">#38473</a>), unpaintable canvases and text (<a href="https://github.com/gterzian">@gterzian</a>, <a href="https://github.com/servo/servo/pull/38664">#38664</a>), serializing ‘location’ properties on Window objects (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/38709">#38709</a>), and navigations canceled before HTTP headers are received (<a href="https://github.com/gterzian">@gterzian</a>, <a href="https://github.com/servo/servo/pull/38739">#38739</a>).</p><p>We also fixed a number of performance pitfalls.The document rendering loop is now <strong>throttled to 60 FPS</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/38431">#38431</a>), while <strong>animated images do less work</strong> when advancing the current frame (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/38857">#38857</a>).In addition, elements with <strong>CSS images will not trigger page reflow</strong> until their image data is fully available (<a href="https://github.com/coding-joedow">@coding-joedow</a>, <a href="https://github.com/servo/servo/pull/38916">#38916</a>).</p><p>Finally, we made improvements to memory usage and binary size.Inline stylesheets are now deduplicated, which can have a significant impact on pages with <strong>lots of form inputs</strong> or <strong>custom elements</strong> with common styles (<a href="https://github.com/coding-joedow">@coding-joedow</a>, <a href="https://github.com/servo/servo/pull/38540">#38540</a>).We also removed many unused pieces of the ICU library, <strong>saving 16MB</strong> from the final binary.</p><h3>Embedding <a class="header-anchor" href="https://servo.org/blog/2025/09/25/this-month-in-servo/#embedding"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>Servo has declared a <strong>Minimum Supported Rust Version</strong> (1.85.0), and this is verified with every new pull request (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/37152">#37152</a>).</p><p>Evaluating JS from the embedding layer now <strong>reports an error</strong> if the evaluation failed for any reason (<a href="https://github.com/rodio">@rodio</a>, <a href="https://github.com/servo/servo/pull/38602">#38602</a>).</p><p>Our <strong>WebDriver</strong> implementation now passes 80% of the implementation conformance tests.This is the result of lots of work on handling user prompts (<a href="https://github.com/PotatoCP">@PotatoCP</a>, <a href="https://github.com/servo/servo/pull/38591">#38591</a>), computing obscured/disabled elements while clicking (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/38497">#38497</a>, <a href="https://github.com/servo/servo/pull/38841">#38841</a>, <a href="https://github.com/servo/servo/pull/38436">#38436</a>, <a href="https://github.com/servo/servo/pull/38490">#38490</a>, <a href="https://github.com/servo/servo/pull/38383">#38383</a>), and improving window focus behaviours (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/38889">#38889</a>, <a href="https://github.com/servo/servo/pull/38909">#38909</a>).We also implemented the <strong>Get Window Handles</strong> command (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/38622">#38622</a>, <a href="https://github.com/servo/servo/pull/38745">#38745</a>), added support for getting element boolean attributes (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/38401">#38401</a>), and added more accurate errors for a number of commands (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/servo/servo/pull/38620">#38620</a>, <a href="https://github.com/servo/servo/pull/38357">#38357</a>).The <strong>Element Clear</strong> command now clears <code>&lt;input type="file"&gt;</code> elements correctly (<a href="https://github.com/PotatoCP">@PotatoCP</a>, <a href="https://github.com/servo/servo/pull/38536">#38536</a>), and <strong>Element Send Keys</strong> now appends to file inputs with the ‘multiple’ attribute.</p><h3>servoshell <a class="header-anchor" href="https://servo.org/blog/2025/09/25/this-month-in-servo/#servoshell"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>We now <strong>display favicons</strong> of each top-level page in the tab bar (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/36680">#36680</a>).</p><figure><a href="https://servo.org/img/blog/2025-09-favicon.png"><img alt="servoshell showing a diffie favicon in the tab bar" src="https://servo.org/img/blog/2025-09-favicon.png" /></a></figure><p>Resizing the browser window to a very small dimension no longer crashes the browser (<a href="https://github.com/leo030303">@leo030303</a>, <a href="https://github.com/servo/servo/pull/38461">#38461</a>).Element hit testing in full screen mode now works as expected (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/38328">#38328</a>).</p><p>Various popup dialogs, such as the &lt;select&gt; option chooser dialog, can now be closed without choosing a value (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/38373">#38373</a>, <a href="https://github.com/servo/servo/pull/38949">#38949</a>).Additionally, the browser now responds to a popup closing without any other inputs (<a href="https://github.com/lumiscosity">@lumiscosity</a>, <a href="https://github.com/servo/servo/pull/39038">#39038</a>).</p><h3>Donations <a class="header-anchor" href="https://servo.org/blog/2025/09/25/this-month-in-servo/#donations"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>Thanks again for your generous support!We are now receiving <strong>5552 USD/month</strong> (+18.3% over July) in recurring donations.</p><p>Historically this has helped cover the cost of our <a href="https://ci0.servo.org/">speedy</a> <a href="https://ci1.servo.org/">CI</a> <a href="https://ci2.servo.org/">servers</a> and <a href="https://www.outreachy.org/alums/2025-06/#:~:text=Servo">Outreachy interns</a>.Thanks to your support, we’re now setting up <strong><a href="https://ci3.servo.org/">two</a> <a href="https://ci4.servo.org/">new</a> CI servers for benchmarking</strong>, and <strong><a href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/">funding the work of our long-time maintainer</a> Josh Matthews</strong> (@jdm), with a particular focus on helping more people contribute to Servo.</p><p>Keep an eye out for <a href="https://github.com/servo/servo/issues/38141">further CI improvements</a> in the coming months, including <a href="https://github.com/servo/ci-runners/issues/21"><strong>ten-minute WPT builds</strong></a>, <strong>macOS arm64 builds</strong>, and <strong>faster pull request checks</strong>.</p><p>Servo is also on <a href="https://thanks.dev/">thanks.dev</a>, and already <strong>15 GitHub users</strong> (−7 from July) 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><figure class="_fig" style="width: 100%; margin: 1em 0;"><div class="_flex"> <div style="text-align: right;"> <div><strong>5552</strong> USD/month</div> <div></div> <div></div> <div style="padding-right: 1em;"><strong>10000</strong></div> </div> <progress max="10000" value="5552"></progress></div></figure><p>As always, use of these funds will be decided transparently in the Technical Steering Committee.For more details, head to our <a href="https://servo.org/sponsorship/">Sponsorship page</a>.</p></description> <pubDate>Thu, 25 Sep 2025 00:00:00 +0000</pubDate></item><item> <title>Niko Matsakis: Symposium: exploring new AI workflows</title> <guid isPermaLink="false">https://smallcultfollowing.com/babysteps/blog/2025/09/24/symposium/</guid> <link>https://smallcultfollowing.com/babysteps/blog/2025/09/24/symposium/?utm_source=atom_feed</link> <description><div style="overflow: auto;"><img alt="Screenshot of the Symposium app" src="https://smallcultfollowing.com/babysteps/ /assets/2025-09-24-symposium/logo-alcove.png" style="float: left; margin-right: 15px; margin-bottom: 10px;" width="25%" /><p>This blog post gives you a tour of <a href="https://github.com/symposium-dev/symposium">Symposium</a>, a wild-and-crazy project that I’ve been obsessed with over the last month or so. Symposium combines an MCP server, a VSCode extension, an OS X Desktop App, and some <a href="https://github.com/symposium-dev/symposium/blob/main/symposium/mcp-server/src/guidance/main.md">mindful prompts</a> to forge new ways of working with agentic CLI tools.</p></div><p>Symposium is currently focused on my setup, which means it works best with VSCode, Claude, Mac OS X, and Rust. But it’s meant to be unopinionated, which means it should be easy to extend to other environments (and in particular it already works great with other programming languages). The goal is not to compete with or replace those tools but to combine them together into something new and better.</p><p>In addition to giving you a tour of Symposium, this blog post is an invitation: <a href="https://github.com/symposium-dev/symposium">Symposium is an open-source project</a>, and I’m looking for people to explore with me! If you are excited about the idea of inventing new styles of AI collaboration, join the <a href="https://symposium-dev.zulipchat.com">symposium-dev Zulip</a>. Let’s talk!</p><h3>Demo video</h3><p>I’m not normally one to watch videos online. But in this particular case, I do think a movie is going to be worth 1,000,000 words. Therefore, I’m embedding a short video (6min) demonstrating how Symposium works below. Check it out! But don’t worry, if videos aren’t your thing, you can just read the rest of the post instead.</p><div style="padding-bottom: 56.25%; height: 0; overflow: hidden;"> </div> <p>Alternatively, if you <em>really</em> love videos, you can watch the <a href="https://youtu.be/HQcIp-IBj0Q">first version I made, which went into more depth</a>. That version came in at 20 minutes, which I decided was…a bit much. 😁</p><h3>Taskspaces let you juggle concurrent agents</h3><p>The Symposium story begins with <code>Symposium.app</code>, an OS X desktop application for managing <em>taskspaces</em>. A taskspace is a clone of your project<sup id="fnref:1"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:1">1</a></sup> paired with an agentic CLI tool that is assigned to complete some task.</p><p>My observation has been that most people doing AI development spend a lot of time waiting while the agent does its thing. Taskspaces let you switch quickly back and forth.</p><p>Before I was using taskspaces, I was doing this by jumping between different projects. I found that was really hurting my brain from context switching. But jumping between <em>tasks</em> in a project is much easier. I find it works best to pair a complex topic with some simple refactorings.</p><p>Here is what it looks like to use Symposium:</p><img alt="Screenshot of the Symposium app" src="https://smallcultfollowing.com/babysteps/ /assets/2025-09-24-symposium/taskspaces.png" width="100%" /><p>Each of those boxes is a taskspace. It has both its own isolated directory on the disk and an associated VSCode window. When you click on the taskspace, the app brings that window to the front. It can also hide other windows by positioning them exactly behind the first one in a stack<sup id="fnref:2"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:2">2</a></sup>. So it’s kind of like a mini window manager.</p><p>Within each VSCode window, there is a terminal running an agentic CLI tool that has the Symposium <a href="https://modelcontextprotocol.io/docs/getting-started/intro">MCP server</a>. If you’re not familiar with MCP, it’s a way for an LLM to invoke custom tools; it basically just gives the agent a list of available tools and a JSON scheme for what arguments they expect.</p><p>The Symposium MCP server does a bunch of things–we’ll talk about more of them later–but one of them is that it lets the agent interact with taskspaces. The agent can use the MCP server to post logs and signal progress (you can see the logs in that screenshot); it can also spawn new taskspaces. I find that last part very handy.</p><p>It often happens to me that while working on one idea, I find opportunities for cleanups or refactorings. Nowadays I just spawn out a taskspace with a quick description of the work to be done. Next time I’m bored, I can switch over and pick that up.</p><h3>An aside: the Symposium app is written in Swift, a language I did not know 3 weeks ago</h3><p>It’s probably worth mentioning that the Symposium app is written in Swift. I did not know Swift three weeks ago. But I’ve now written about 6K lines and counting. I feel like I’ve got a pretty good handle on how it works.<sup id="fnref:3"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:3">3</a></sup></p><p>Well, it’d be more accurate to say that I have <em>reviewed</em> about 6K lines, since most of the time Claude generates the code. I mostly read it and offer suggestions for improvement<sup id="fnref:4"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:4">4</a></sup>. When I do dive in and edit the code myself, it’s interesting because I find I don’t have the muscle memory for the syntax. I think this is pretty good evidence for the fact that agentic tools help you get started in a new programming language.</p><h3>Walkthroughs let AIs explain code to you</h3><p>So, while taskspaces let you jump between tasks, the rest of Symposium is dedicated to helping you complete an individual task. A big part of that is trying to go beyond the limits of the CLI interface by connecting the agent up to the IDE. For example, the Symposium MCP server has a tool called <code>present_walkthrough</code> which lets the agent present you with a markdown document that explains how some code works. These walkthroughs show up in a side panel in VSCode:</p><img alt="Walkthrough screenshot" src="https://smallcultfollowing.com/babysteps/ /assets/2025-09-24-symposium/walkthrough.png" width="100%" /><p>As you can see, the walkthroughs can embed mermaid, which is pretty cool. It’s sometimes so clarifying to see a flowchart or a sequence diagram.</p><p>Walkthroughs can also embed <em>comments</em>, which are anchored to particular parts of the code. You can see one of those in the screenshot too, on the right.</p><p>Each comment has a Reply button that lets you respond to the comment with further questions or suggest changes; you can also select random bits of text and use the “code action” called “Discuss in Symposium”. Both of these take you back to the terminal where your agent is running. They embed a little bit of XML (<code>&lt;symposium-ref id="..."/&gt;</code>) and then you can just type as normal. The agent can then use another MCP tool to expand that reference to figure out what you are referring to or what you are replying to.</p><p>To some extent, this “reference the thing I’ve selected” functionality is “table stakes”, since Claude Code already does it. But Symposium’s version works anywhere (Q CLI doesn’t have that functionality, for example) and, more importantly, it lets you embed multiple refrences at once. I’ve found that to be really useful. Sometimes I’ll wind up with a message that is replying to one comment while referencing two or three other things, and the <code>&lt;symposium-ref/&gt;</code> system lets me do that no problem.</p><h3>Integrating with IDE knowledge</h3><p>Symposium also includes an <code>ide-operations</code> tool that lets the agent connect to the IDE to do things like “find definitions” or “find references”. To be honest I haven’t noticed this being that important (Claude is surprisingly handy with awk/sed) but I also haven’t done much tinkering with it. I know there are other MCP servers out there too, like <a href="https://github.com/oraios/serena">Serena</a>, so maybe the right answer is just to import one of those, but I think there’s a lot of interesting stuff we <em>could</em> do here by integrating deeper knowledge of the code, so I have been trying to keep it “in house” for now.</p><h3>Leveraging Rust conventions</h3><p>Continuing our journey down the stack, let’s look at one more bit of functionality, which are MCP tools aimed at making agents better at working with Rust code. By far the most effective of these so far is one I call <a href="https://symposium-dev.github.io/symposium/design/mcp-tools/rust-development.html#get_rust_crate_source"><code>get_rust_crate_source</code></a>. It is very simple: given the name of a crate, it just checks out the code into a temporary directory for the agent to use. Well, actually, it does a <em>bit</em> more than that. If the agent supplies a search string, it also searches for that string so as to give the agent a “head start” in finding the relevant code, and it makes a point to highlight code in the examples directory in particular.</p><h3>We could do a lot more with Rust…</h3><p>My experience has been that this tool makes all the difference. Without it, Claude just geneates plausible-looking APIs that don’t really exist. With it, Claude generally figures out exactly what to do. But really it’s just scratching the surface of what we can do. I am excited to go deeper here now that the basic structure of Symposium is in place – for example, I’d love to develop Rust-specific code reviewers that can critique the agent’s code or offer it architectural advice<sup id="fnref:5"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:5">5</a></sup>, or a tool like <a href="https://github.com/plasma-umass/CWhy">CWhy</a> to help people resolve Rust trait errors or macro problems.</p><h3>…and can we decentralize it?</h3><p>But honestly what I’m <em>most</em> excited about is the idea of <strong>decentralizing</strong>. I want Rust library authors to have a standard way to attach custom guidance and instructions that will help agents use their library. I want an AI-enhanced variant of <code>cargo upgrade</code> that automatically bridges over major versions, making use of crate-supplied metadata about what changed and what rewrites are needed. Heck, I want libraries to be able to ship with MCP servers implemented in WASM (<a href="https://opensource.microsoft.com/blog/2025/08/06/introducing-wassette-webassembly-based-tools-for-ai-agents/">Wassette</a>, anyone?) so that Rust developers using that library can get custom commands and tools for working with it. I don’t 100% know what this looks like but I’m keen to explore it. If there’s one thing I’ve learned from Rust, it’s always bet on the ecosystem.</p><h3>Looking further afield, can we use agents to help humans collaborate better?</h3><p>One of the things I am very curious to explore is how we can use agents to help humans collaborate better. It’s oft observed that coding with agents can be a bit lonely<sup id="fnref:6"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:6">6</a></sup>. But I’ve also noticed that structuring a project for AI consumption requires relatively decent documentation. For example, one of the things I did recently for Symposium was to create a Request for Dialogue (RFD) process – a simplified version of Rust’s RFC process. My motivation was partly in anticipation of trying to grow a community of contributors, but it was also because most every major refactoring or feature work I do begins with iterating on docs. The doc becomes a central tracking record so that I can clear the context and rest assured that I can pick up where I left off. But a nice side-effect is that the project has more docs than you might expect, considering, and I hope that will make it easier to dive in and get acquainted.</p><p>And what about other things? Like, I think that taskspaces should really be associated with github issues. If we did that, could we do a better job at helping new contributors pick up an issue? Or at providing mentoring instructions to get started?</p><p>What about memory? I really want to add in some kind of automated memory system that accumulates knowledge about the system more automatically. But could we then share that knowledge (or a subset of it) across users, so that when I go to hack on a project, I am able to “bootstrap” with the accumulated observations of other people who’ve been working on it?</p><p>Can agents help in guiding and shepherding design conversations? At work, when I’m circulating a document, I will typically download a copy of that document with people’s comments embedded in it. Then I’ll use pandoc to convert that into Markdown with HTML comments and then ask Claude to read it over and help me work through the comments systematically. Could we do similar things to manage unwieldy RFC threads?</p><p>This is part of what gets me excited about AI. I mean, don’t get me wrong. I’m scared too. There’s no question that the spread of AI will change a lot of things in our society, and definitely not always for the better. But it’s also a huge opportunity. AI is empowering! Suddenly, learning new things is just <em>vastly</em> easier. And when you think about the potential for integrating AI into community processes, I think that it could easily be used to bring us closer together and maybe even to make progress on previously intractable problems in open-source<sup id="fnref:7"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:7">7</a></sup>.</p><h3>Conclusion: Want to build something cool?</h3><p>As I said in the beginning, this post is two things. Firstly, it’s an advertisement for Symposium. If you think the stuff I described sounds cool, give Symposium a try! You can find <a href="https://symposium-dev.github.io/symposium/install.html">installation instructions</a> here. I gotta warn you, as of this writing, I think I’m the only user, so I would not at all be surprised to find out that there’s bugs in setup scripts etc. But hey, try it out, find bugs and tell me about them! Or better yet, fix them!</p><p>But secondly, and more importantly, this blog post is an invitation to come out and play<sup id="fnref:8"><a class="footnote-ref" href="http://smallcultfollowing.com/babysteps/atom.xml#fn:8">8</a></sup>. I’m keen to have more people come and hack on Symposium. There’s so much we could do! I’ve identified a number of <a href="http://smallcultfollowing.com/babysteps/atom.xml">“good first issue” bugs</a>. Or, if you’re keen to take on a larger project, I’ve got a set of invited “Request for Dialogue” projects you could pick up and make your own. And if none of that suits your fancy, feel free to pitch you own project – just join the <a href="https://symposium-dev.zulipchat.com">Zulip</a> and open a topic!</p><div class="footnotes"><hr /><ol><li id="fn:1"><p>Technically, a git worktree. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:1">↩︎</a></p></li><li id="fn:2"><p>That’s what the “Stacked” box does; if you uncheck it, the windows can be positioned however you like. I’m also working on a tiled layout mode. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:2">↩︎</a></p></li><li id="fn:3"><p>Well, mostly. I still have some warnings about something or other not being threadsafe that I’ve been ignoring. Claude assures me they are not a big deal (Claude can be so lazy omg). <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:3">↩︎</a></p></li><li id="fn:4"><p>Mostly: “Claude will you please for the love of God stop copying every function ten times.” <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:4">↩︎</a></p></li><li id="fn:5"><p>E.g., don’t use a tokio mutex you fool, <a href="https://ryhl.io/blog/actors-with-tokio/">use an actor</a>. That is one particular bit of advice I’ve given more than once. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:5">↩︎</a></p></li><li id="fn:6"><p>I’m kind of embarassed to admit that Claude’s dad jokes have managed to get a laugh out of me on occassion, though. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:6">↩︎</a></p></li><li id="fn:7"><p>Narrator voice: <em>burnout. he means maintainer burnout.</em> <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:7">↩︎</a></p></li><li id="fn:8"><p>Tell me you went to high school in the 90s without telling me you went to high school in the 90s. <a class="footnote-backref" href="http://smallcultfollowing.com/babysteps/atom.xml#fnref:8">↩︎</a></p></li></ol></div></description> <pubDate>Wed, 24 Sep 2025 20:39:46 +0000</pubDate></item><item> <title>Mozilla Thunderbird: Thunderbird Monthly Development Digest: August 2025</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3822</guid> <link>https://blog.thunderbird.net/2025/09/thunderbird-monthly-development-digest-august-2025/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2025/09/blog-banner-developer1-768x432.jpg" width="640" /></p><p>Hello again from the Thunderbird development team! As autumn settles in, we’re balancing the steady pace of ongoing projects with some forward-looking planning for 2026. Alongside coding and testing, some of our recent attention has gone into budgets, roadmaps, and setting priorities for the year ahead. It’s not the most glamorous work, but it’s essential for keeping our momentum strong and ensuring that the big features we’re building today continue to deliver value well into the future. In the meantime, plenty of exciting progress has landed across the application, and here are some of the highlights.</p> <h3 class="wp-block-heading"><strong>Exchange support for email is here</strong></h3> <p>Exchange support has officially landed in Thunderbird 144, which will roll out as our October monthly release. A big final push from the team saw a number of important features make it in before the merge:</p> <ul><li>Undo/Redo operations for move/copy/delete</li> <li>Notifications</li> <li>Basic Search</li> <li>Folder Repair</li> <li>Remote message content display &amp; blocking</li> <li>Status Bar feedback messaging</li> <li>Account Settings screen changes</li> <li>Autosync manager for message downloads</li> <li>Attachment delete &amp; detach</li> <li>First set of advanced server settings</li> <li>Experimental tenant-specific configuration options (behind a preference) now being tested with early adopters</li></ul> <p>The QA team is continuing to work through their test plans with support from a small beta test group, and their findings will guide the documentation and support we share more broadly with users on monthly release 144, as well as the priorities to tackle before we head into the next chapter.</p> <p>Looking ahead, the team is already focused on:</p> <ul><li>Expanding advanced server settings for more complex environments</li> <li>Improving search functionality</li> <li>Folder Quotas &amp; Subscriptions</li> <li>Refining the user experience as more real-world feedback comes in</li> <li>A planning session to scope work to support calendar and address book via EWS</li></ul> <p><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1847846"><u>Keep track of feature delivery here.</u></a></p> <h3 class="wp-block-heading"><strong>Conversation View Work Week</strong></h3> <p>One of the biggest milestones this month was our dedicated Conversation View Work Week which recently wrapped up, where designers and engineers gathered in person to tackle one of Thunderbird’s most anticipated UX features. </p> <p>The team aligned early on goals and scope, rapidly iterated on wireframes and high-fidelity mockups, and built out initial front-end components powered by the new Panorama database. </p> <p>By the end of the week, we had working prototypes that collapsed threads into a Gmail-style conversation view, demonstrated the new LiveView architecture, and produced detailed design documentation. It was an intense but rewarding sprint that laid the foundation for a more modern and intuitive Thunderbird experience.</p> <h3 class="wp-block-heading"><strong>Account Hub</strong></h3> <p>We’ve now added the ability to manually edit an EWS configuration, as well as allow for users to create an advanced EWS configuration through the manual configuration step</p> <p>The ability to cancel any loading operation in account hub for email has been completed and will be added to daily shortly</p> <ul><li>This also had the side effect of users who click “Stop” in the account old setup with an OAuth window open now closing the OAuth window automatically</li> <li>We will be uplifting this change to beta and then ESR</li></ul> <p>Progress is being made with adding a step for 3rd party hosting credentials confirmation, with the UI complete and the logic being worked on</p> <ul><li>This progress will have to take into account changes from the cancel loading patch, as there are conflicting changes</li> <li>Once this feature is complete, it will be uplifted to beta, and then ESR</li></ul> <p>Work will soon be starting to enable the creation of address books through account hub by default.</p> <p>Follow progress in the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1981786"><u>Meta Bug</u></a></p> <h3 class="wp-block-heading"><strong>Calendar UI Rebuild</strong></h3> <p>After a long pause, work on the Calendar re-write has resumed! We’ve picked things back up by continuing focus on the event read dialog. A number of improvements have already landed, including proper handling of description data and several small bug fixes.</p> <p>We have seven patches under review that cover key areas such as:</p> <ul><li>Accessibility improvements, including proper announcements of event and calendar titles.</li> <li>Adding the footer for acceptance.</li> <li>Updating displays and transitioning current work to use the mod-src protocol.</li> <li>Handling resizing</li></ul> <p>Development is also underway to add attendee support, after which we’ll move on to polishing the remaining pieces of the read dialog UI.</p> <h3 class="wp-block-heading"><strong>Maintenance, Recent Features and Fixes</strong></h3> <p>August was set aside as a focus for maintenance, with a good number of our team dedicated to handling upstream liabilities such as our continued l10n migration to Fluent and module loading changes. In addition to these items, we’ve had help from the development community to deliver a variety of improvements over the past month:</p> <ul><li>Tree restyling following upstream changes – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978947"><u>solved</u></a></li> <li>An 18 year old bug to enable event duplication via drag &amp; drop – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=411069"><u>solved</u></a></li> <li>A 15 year old bug to sort by unread in threads correctly – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=617855"><u>solved</u></a></li> <li>Implementation of standard colours throughout the application. [<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979362"><u>meta bug</u></a>]</li> <li>Modernization of module inclusion. [<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979960"><u>meta bug</u></a>]</li> <li>and many more which are listed in <a href="https://www.thunderbird.net/en-US/thunderbird/144.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 squash 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>Senior Manager, Desktop Engineering</p><p>The post <a href="https://blog.thunderbird.net/2025/09/thunderbird-monthly-development-digest-august-2025/">Thunderbird Monthly Development Digest: August 2025</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Wed, 24 Sep 2025 14:22:05 +0000</pubDate> <dc:creator>Toby Pilling</dc:creator></item><item> <title>The Rust Programming Language Blog: crates.io: Malicious crates faster_log and async_println</title> <guid isPermaLink="true">https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/</guid> <link>https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/</link> <description><p><strong>Updated September 24th, 2025 17:34:38 UTC</strong> - Socket has also published their own <a href="https://socket.dev/blog/two-malicious-rust-crates-impersonate-popular-logger-to-steal-wallet-keys">accompanying blog post</a> about the attack.</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#summary"></a>Summary</h3><p>On September 24th, the crates.io team was notified by Kirill Boychenko from the <a href="https://www.socket.dev/">Socket Threat Research Team</a> of two malicious crates which were actively searching file contents for Etherum private keys, Solana private keys, and arbitrary byte arrays for exfiltration.</p><p>These crates were:</p><ul><li><code>faster_log</code> - Published on May 25th, 2025, downloaded 7181 times</li><li><code>async_println</code> - Published on May 25th, 2025, downloaded 1243 times</li></ul><p>The malicious code was executed at runtime, when running or testing a project depending on them. Notably, they did not execute any malicious code at build time. Except for their malicious payload, these crates copied the source code, features, and documentation of legitimate crates, using a similar name to them (a case of typosquatting<sup class="footnote-reference" id="fr-typosquatting-1"><a href="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fn-typosquatting">1</a></sup>).</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#actions-taken"></a>Actions taken</h3><p>The users in question were immediately disabled, and the crates in question were deleted<sup class="footnote-reference" id="fr-deletion-1"><a href="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fn-deletion">2</a></sup> from crates.io shortly after. We have retained copies of all logs associated with the users and the malicious crate files for further analysis.</p><p>The deletion was performed at 15:34 UTC on September 24, 2025.</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#analysis"></a>Analysis</h3><p>Both crates were copies of a crate which provided logging functionality, and the logging implementation remained functional in the malicious crates. The original crate had a feature which performed log file packing, which iterated over an associated directories files.</p><p>The attacker inserted code to perform the malicious action during a log packing operation, which searched the log files being processed from that directory for:</p><ul><li>Quoted Ethereum private keys (0x + 64 hex)</li><li>Solana-style Base58 secrets</li><li>Bracketed byte arrays</li></ul><p>The crates then proceeded to exfiltrate the results of this search to <code>https://mainnet[.]solana-rpc-pool[.]workers[.]dev/</code>.</p><p>These crates had no dependent downstream crates on crates.io.</p><p>The malicious users associated with these crates had no other crates or publishes, and the team is actively investigating associative actions in our retained<sup class="footnote-reference" id="fr-retention-1"><a href="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fn-retention">3</a></sup> logs.</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#thanks"></a>Thanks</h3><p>Our thanks to Kirill Boychenko from the <a href="https://www.socket.dev/">Socket Threat Research Team</a> for reporting the crates. We also want to thank Carol Nichols from the crates.io team, Pietro Albini from the Rust Security Response WG and Walter Pearce from the <a href="https://foundation.rust-lang.org/">Rust Foundation</a> for aiding in the response.</p><section class="footnotes"><ol class="footnotes-list"><li id="fn-typosquatting"><p>typosquatting is a technique used by bad actors to initiate dependency confusion attacks where a legitimate user might be tricked into using a malicious dependency instead of their intended dependency — for example, a bad actor might try to publish a crate at <code>proc-macro3</code> to catch users of the legitimate <code>proc-macro2</code> crate. <a href="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fr-typosquatting-1">↩</a></p></li><li id="fn-deletion"><p>The crates were preserved for future analysis should there be other attacks, and to inform scanning efforts in the future. <a href="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fr-deletion-1">↩</a></p></li><li id="fn-retention"><p>One year of logs are retained on crates.io, but only 30 days are immediately available on our log platform. We chose not to go further back in our analysis, since IP address based analysis is limited by the use of dynamic IP addresses in the wild, and the relevant IP address being part of an allocation to a residential ISP. <a href="https://blog.rust-lang.org/2025/09/24/crates.io-malicious-crates-fasterlog-and-asyncprintln/#fr-retention-1">↩</a></p></li></ol></section></description> <pubDate>Wed, 24 Sep 2025 00:00:00 +0000</pubDate> <dc:creator>Walter Pearce</dc:creator></item><item> <title>Mozilla Thunderbird: State of the Thunder 12: Community, Android, and Mozilla Connect</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3814</guid> <link>https://blog.thunderbird.net/2025/09/state-of-the-thunder-12-community-android-and-mozilla-connect/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2025/09/Blog-banner-State-of-the-Thunder12-768x432.jpg" width="640" /></p><p>We’re back with our twelfth episode of the State of the Thunder! In this episode, we’re talking about community initiatives, filling you in on Android development, and finishing our updates on popular Mozilla Connect requests. </p> <p>Want to find out how to join future State of the Thunders? Be sure to join our <a href="https://thunderbird.topicbox.com/groups/planning">Thunderbird planning mailing list</a> for all the details. </p> <h3>Austin RiverHacks and Ask-A Fox</h3> <p>Thunderbird is a Silver sponsor for <a href="https://austin-ai.org/event/riverhacks-nasa-space-apps-challenge-2025/">Austin RiverHacks NASA Space Apps Challenge 2025</a>! If you’re in or around Austin, Texas from October 4th-5th, and want to join an in-person event where curious minds delve into NASA data to tackle real-life problems, we’d love to see you. </p> <p>This week (as in right now! Check it out and get involved!), we’re joining forces with Firefox for the <a href="https://community.mozilla.org/en/campaigns/ask-a-fox/">Ask-A-Fox event on Mozilla Support</a>! Earn swag, join an incredible community, and help fellow Thunderbird users on desktop and Android! Want a great overview of how to contribute to SUMO? Watch our <a href="https://blog.thunderbird.net/2024/08/video-how-to-answer-thunderbird-questions-on-mozilla-support/">Community Office Hours</a> with advice on getting started.</p> <h3>Android Plans for Q4 2025</h3> <p>It’s hard to believe we’re almost into the last three months of the year! We’ve just released our joint <a href="https://blog.thunderbird.net/2025/09/mobile-progress-report-july-august-2025/">July/August Mobile Progress</a> report. We also want to give you all an update on our overall progress on the <a href="https://github.com/orgs/thunderbird/projects/19">roadmap</a> we created at the beginning of the year. </p> <p>The new Account Drawer, currently in Beta, isn’t finished yet. We’re still working on real, proper unified folders! We’ll have mockups of the account drawer progress before the end of the month and more info in the next beta’s release notes. We’ll also have updates soon on message list status notifications (similar to the desktop). In the single message view, we have improvements coming! This includes making attachments quicker to see and open. </p> <p>The battle for proper IMAP fetch continues. Different server setups complicate this struggle, but we want to get this right, nonetheless. This will bring the Android app more on par with other emails apps.</p> <p>Unfortunately, work on things like message sync, notifications, and Android 15 might delay features like HTML signatures.</p> <h3>Mozilla Connect Updates, Continued</h3> <p>We’re tackling more of the most frequently requested changes and features on Mozilla Connect, and we’re answering questions about native operating system integration, conversation view, and Thunderbird Pro related features!</p> <h4>Native Operating System Integration</h4> <p>When your operating system is capable of something Thunderbird isn’t, we share your frustration. We want things like OS-native progress bars that show you how downloads are going. We’ve started work on OS-native notification actions, like <a href="https://connect.mozilla.org/t5/ideas/delete-a-mail-directly-from-notification/idi-p/15884">deleting messages</a>. We love how helpful and time-saving this is, and want to expand it to things like calendar reminders.</p> <p>There’s possibility and limitation in this, thanks to both Firefox and the OS itself. Firefox enables us more than it restricts us. For example, our work on the progress bar comes straight from Firefox code. Though there are some limits, and Thunderbird’s different needs as a mail client sometimes mean we need to improve an aspect of Firefox to enable further development. But the beauty of open source means we can contribute our improvements upstream! The OS often constrains us more. For example, we’d love snoozeable native OS calendar notifications, but they just aren’t possible yet.</p> <h4>Conversation View</h4> <p>We just finished an entire in-person work week focused on this in Vancouver! <a href="https://connect.mozilla.org/t5/ideas/true-threaded-conversations-in-thunderbird/idi-p/29558">Conversation view</a>, if you’re not familiar with it, includes ALL messages in a conversation, including your replies and messages moved to different folders. This feature, along with others, depends on having a single database for all messages in Thunderbird. Our current database doesn’t do this; instead, each folder is its own database.</p> <p>The new SQLite database, which we’re calling Panorama, will enable a true Conversation View. During the work week, we thought about (and visualized) what the UI will look like. Having developers and designers in the same room was incredibly helpful for a complicated change. (Having a gassy Boston Terrier in said room, less so.) The existing code expects the current database, so we’ll have to rebuild a lot and carefully consider our decisions. The switch to the new database will probably occur next year after the Extended Support Release, behind a preference.</p> <p>This change will help Thunderbird behave like a modern email client! Moving to Panorama will not only move us into the future, but into the present.</p> <h3>Thunderbird Pro Related-Requests</h3> <p>Three Mozilla Connect requests (<a href="https://connect.mozilla.org/t5/ideas/expand-relay-to-create-full-mozmail-e-mail/idi-p/7985">Expanding Firefox Relay</a>, a <a href="https://connect.mozilla.org/t5/ideas/proposal-for-mozilla-email-domain/idi-p/48656">paid Mozilla email domain</a>, and a <a href="https://connect.mozilla.org/t5/ideas/thunderbird-web-i-d-pay-a-sub-fee-for-it/idi-p/17607">Thunderbird webmail</a>) were all out of our control once. But now, with the upcoming Thunderbird Pro offerings, these all will be possible! We’re even experimenting with a webmail experience for Thundermail, in addition to using Thunderbird (or even another email client if you want.) We’ll have an upcoming State of the Thunder dedicated to Thunderbird Pro with more info and updates!</p> <h3>Watch the Video (also on <a href="https://tilvids.com/w/pmPUW6bjXecEyw6uoq7R1t">PeerTube</a>)</h3> <figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper"> </div></figure> <h3>Listen to the Podcast</h3> <p></p><p>The post <a href="https://blog.thunderbird.net/2025/09/state-of-the-thunder-12-community-android-and-mozilla-connect/">State of the Thunder 12: Community, Android, and Mozilla Connect</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Tue, 23 Sep 2025 15:10:45 +0000</pubDate> <dc:creator>Monica Ayhens-Madon</dc:creator></item><item> <title>Firefox Nightly: Firefox 144 Highlights: Faster Add-ons, Smarter DevTools, and Tab Group Boosts – These Weeks in Firefox, Issue 189</title> <guid isPermaLink="false">https://blog.nightly.mozilla.org/?p=1888</guid> <link>https://blog.nightly.mozilla.org/2025/09/22/firefox-144-highlights-faster-add-ons-smarter-devtools-and-tab-group-boosts-these-weeks-in-firefox-issue-189/</link> <description><h3>Highlights</h3><ul><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=772178">Leo Liu [:leoliu]</a> added a panel for AntiTracking debugging (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1972771">#1972771</a>) behind devtools.anti-tracking.enabled</li></ul><p><img alt="A panel in DevTools for AntiTracking debugging" class="alignnone size-large wp-image-1890" height="152" src="https://blog.nightly.mozilla.org/files/2025/09/headlines189_2-600x152.png" width="600" /></p><ul><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=283262">Alexandre Poirot [:ochameau]</a> added a “User-defined” badge in the markup view event tooltip to differentiate them from “native” events (and possibly spotting event not supported in Firefox) (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1977628">#1977628</a>)</li></ul><p><img alt="&quot;User-defined&quot; badge in the DevTools markup view event tooltip" class="alignnone size-large wp-image-1891" height="182" src="https://blog.nightly.mozilla.org/files/2025/09/headlines189_3-600x182.png" width="600" /></p><ul><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> added a “Jump to definition” icon for CSS variables in the Inspector Rules view (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1278517">#1278517</a>)</li></ul><p><img alt="A &quot;Jump to definition&quot; icon for CSS variables in the Inspector Rules view" class="alignnone size-large wp-image-1889" height="74" src="https://blog.nightly.mozilla.org/files/2025/09/headlines189_1-600x74.png" width="600" /></p><h3>Friends of the Firefox team</h3><h4>Introductions/Shout-Outs</h4><ul><li>New contributor <a href="https://bugzilla.mozilla.org/user_profile?user_id=409790">Merci chao</a> has filed a whole bunch of valid and useful tab group bugs</li></ul><h4><a href="https://bugzilla.mozilla.org/buglist.cgi?title=Resolved%20bugs%20(excluding%20employees)&amp;quicksearch=1892101%2C1969417%2C1979919%2C1689380%2C1982968%2C1984296%2C1982767%2C1981384%2C1984788%2C1813675%2C1583902%2C1956493%2C1984661%2C1679997%2C1787457%2C1984872">Resolved bugs (excluding employees)</a></h4><h4>Volunteers that fixed more than one bug</h4><ul><li>Alexander Kuleshov</li></ul><h4>New contributors (🌟 = first patch)</h4><ul><li>Josh Berry added <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984553">groupId to browser.tabs.onUpdated event</a></li><li>Jacqueline Amherst [:jqln] <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1981376">moved gPrivateBrowsingUI to its own file</a> and avoid loading it unless/until we encounter our first private window</li></ul><h3>Project Updates</h3><h4>Add-ons / Web Extensions</h4><h5>Addon Manager &amp; about:addons</h5><ul><li>InstallTrigger API implementation has been fully removed in Firefox 144 🥳 – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1776426">Bug 1776426</a> / <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979227">Bug 1979227</a><ul><li>Thanks to Gregory Pappas for the immense help on this one!</li></ul></li><li>Fixed issue with add-on updates automatically cancelled due to new extension metadata property missing from previously installed add-ons – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984724">Bug 1984724</a></li><li>Improved spacing between about:addons add-on card message bars and add-ons card header – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984872">Bug 1984872</a><ul><li>Thanks to Sujal Singh for contributing this improvement to the about:addons cards!</li></ul></li></ul><h5>WebExtensions Framework</h5><ul><li>Fixed Customize mode and keyboard shortcuts issue hit when a user may have clicked to the “extension settings” link from the add-on post-install dialog – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983869">Bug 1983869</a></li><li>Fixed regression preventing SVG icons associated with extension context menu items to be loaded successfully – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986618">Bug 1986618</a> (fixed in the Firefox 143, same Firefox version where the regression was initially introduced through <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979338">Bug 1979338</a>).</li></ul><h5>WebExtension APIs</h5><ul><li>In Firefox 144 browser.storage.local and browser.storage.managed WebExtensions API are now also providing a getBytesInUse API method – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1385832">Bug 1385832</a><ul><li>Thanks to Nathan Gross for contributing this enhancement to the WebExtensions storage APIs!</li></ul></li><li>Added missing groupId property to the browser.tabs.onUpdated API method – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984553">Bug 1984553</a>.<ul><li>Thanks to Josh Berry for reporting and fixing this gap in our WebExtensions API JSONSchema definitions</li><li>NOTE<b>:</b> this change mainly matters for TypeScript type definitions being generated based on our JSONSchema definitions. The groupId property was set in the browser.tabs.onUpdated API event details even without this fix to the JSONSchema.</li></ul></li></ul><h4>DevTools</h4><ul><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=750915">Artem Manushenkov</a><ul><li>documented <a href="https://firefox-source-docs.mozilla.org/devtools-user/web_console/split_console/index.html#:~:text=you%20also%20can%20disable%20the%20split%20console%20altogether">“Enable Split Console” setting</a> and added missing alt attributes for images and updated the screenshot (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984296">#1984296</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1981384">#1981384</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984788">#1984788</a>)</li><li>removed unused npm scripts from the debugger folder (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984661">#1984661</a>)</li><li>added keyboard shortcuts for clearing the console in the clear button title (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984993">#1984993</a>)</li></ul></li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=446518">Sebastian Zartner [:sebo]</a> added a inactive CSS warning for usage of overflow on non-block containers (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1583902">#1583902</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=764501">Riz</a> removed Chrome frames from Netmonitor stack traces (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1280266">#1280266</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=218550">Robert Longson [:longsonr]</a> fixed an issue where we would show an invalid message to users when devtools.netmonitor.requestBodyLimit=0 (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986196">#1986196</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=703422">David Shin[:dshin]</a> fixed a Chrome-Only method to make the selector highlighter work for @scope rules (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1980210">#1980210</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=34283">Masayuki Nakano [:masayuki]</a> fixed the “Break on node removal” feature when a node is removed because a parent node’s innerHTML is updated (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984312">#1984312</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=763731">Holger Benl [:hbenl]</a> fixed an issue with screenshots in Responsive Design Mode (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979518">#1979518</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=283262">Alexandre Poirot [:ochameau]</a> made React avoid updates for devtools in inactive/background tab (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1897765">#1897765</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=283262">Alexandre Poirot [:ochameau]</a> fixed fetching iframe source content in the Debugger (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1977100">#1977100</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=283262">Alexandre Poirot [:ochameau]</a> fixed opening some webpack-internal:///./ source from console stack traces (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982271">#1982271</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=656417">Hubert Boma Manilla (:bomsy)</a> made it possible to see server sent events in the Netmonitor event if the connection is still open (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1830230">#1830230</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=559949">Julian Descottes [:jdescottes]</a> fixed an issue that would crash DevTools (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979448">#1979448</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=559949">Julian Descottes [:jdescottes]</a> improved performance of a regexp we use to check if a given network request is local (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983755">#1983755</a>)</li></ul><h4>WebDriver BiDi</h4><ul><li>Sasha updated <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983807">“emulation.setLocaleOverride” and “emulation.setTimezoneOverride” commands to also apply overrides to the existing sandboxes created with WebDriver BiDi</a>.</li><li>Sasha implemented the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1974167">“emulation.setScreenOrientationOverride” command</a>, which allows clients to override screen orientation per browsing or user contexts.</li><li>Henrik <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986238">reverted the scrollIntoView algorithm for elements in Marionette</a> to always use the instant scroll behavior. This undoes the change introduced in Firefox 97, which had switched the behavior to auto. The reversion addresses potential race conditions when scrolling elements that use smooth behavior.</li><li>Julian updated the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1914407">”browsingContext.navigate” to succeed and stop throwing errors if the navigation was interrupted</a> by another navigation. Typically this could happen with a script updating “window.location”.</li></ul><h4>Lint, Docs and Workflow</h4><ul><li>mlucks <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982463">turned on</a> the ESLint Lit rule, <a href="https://github.com/43081j/eslint-plugin-lit/blob/master/docs/rules/no-value-attribute.md">no-value-attribute</a>.</li><li>Standard8 <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985946">fixed</a> verbose logging for mach lint.</li></ul><h4>Profile Management</h4><ul><li>We have been <a href="https://docs.google.com/spreadsheets/d/1WONCxwmd17l3iF2ZCxkDSnaAaIZf-rl8CGoIHBYkDSo/edit?gid=600962034#gid=600962034">incrementally rolling out</a>, currently at 5.5%, and profiles <a href="https://sql.telemetry.mozilla.org/dashboard/firefox-profiles-overview">telemetry data</a> looks good.</li><li>OMC and Nimbus completed migration to the multi-profile datastore, their integration testing and telemetry data also looks healthy.</li><li>We are planning for a full rollout in 144 (excluding win 10 users until we have backup support for multiple profiles)</li><li>Closed bugs:<ul><li>Contributor fix! 🎉 Alexander Kuleshov fixed bug 1987225, Remove unused gRestartMode variable.</li></ul></li><li>Other bugs closed out:<ul><li>1950741 When a non-system theme is selected in about:newprofile, overscrolling the page displays a different page background in the overscrolled area <a href="mailto:mlucks@mozilla.com">mlucks@mozilla.com</a></li><li>1950743 Tabbing to the “Explore more themes” link in about:newprofile makes the link’s focus ring span the entire container instead of just the link <a href="mailto:squiles@mozilla.com">squiles@mozilla.com</a></li><li>1966284 hide new profile manager pages (new, edit, delete) from about:about <a href="mailto:mlucks@mozilla.com">mlucks@mozilla.com</a></li><li>1979898 Remove some of the extraneous directories added when using MOZ_APP_DATA <a href="mailto:dtownsend@mozilla.com">dtownsend@mozilla.com</a></li><li>1984193 Add hover tooltips to avatar picker <a href="mailto:mlucks@mozilla.com">mlucks@mozilla.com</a></li><li>1985340 Update Profiles avatars’ alt text to match tooltip text <a href="mailto:mlucks@mozilla.com">mlucks@mozilla.com</a></li><li>1986080 Update Profiles avatars’ aria label text to match tooltip text <a href="mailto:mlucks@mozilla.com">mlucks@mozilla.com</a></li></ul></li></ul><h4>Search and Navigation</h4><ul><li>adw is continuing to work on Google Lens which is a feature that allows users to search images by using the context menu (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1987045">1987045</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986301">1986301</a>)</li><li>Standard8 has been working on an experiment to send Search Suggestions over Oblivious HTTP for privacy (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984624">1984624</a>)</li><li>Standard8 converted the urlbar code to use <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1966464">moz-src URIs</a>.</li><li>Mandy has been working on adding localized trending URL results for Perplexity which is still hidden behind an experiment. (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985515">1985515</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984201">1984201</a>)</li><li>Dao is working on making the address bar more modular for other features to use. For example, there’s been work done to prepare the search bar. (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985734">1985734</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985833">1985833</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986128">1986128</a>,<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986129">1986129</a>)</li><li>Mortiz and adw continue to work on displaying relevant dates for suggest (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986685">1986685</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986786">1986786</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1981490">1981490</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986680">1986680</a>,</li><li>Daisuke is working on yelp online suggestions (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986224">1986224</a>)</li><li>Dale is working on the unified trust panel which will inform users if the site is secure. This is a new design that combines the privacy shield and page information icons and dialogs. (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1976108">1976108</a>)</li></ul><h4>Storybook/Reusable Components/Acorn Design System</h4><ul><li>Some new docs related to Figma Code Connect on <a href="https://firefoxux.github.io/firefox-desktop-components/?path=/docs/docs-figma-code-connect--docs#how-to-find-the-code-connect-snippet">Storybook</a><ul><li>Mostly about adding new Code Connects but that section goes over the usage in Figma Dev Mode</li></ul></li><li>More border-radius tokens filled out and are in the tokens table on <a href="https://firefoxux.github.io/firefox-desktop-components/?path=/story/docs-tokens-table--default">Storybook</a></li><li>Moz-promo now avoids wrapping actions until necessary (prefers being one line) <a href="https://firefoxux.github.io/firefox-desktop-components/?path=/story/ui-widgets-promo--slotted-action">Storybook</a> (<a href="https://firefoxux.github.io/firefox-desktop-components/?path=/story/ui-widgets-promo--slotted-action&amp;args=width:300">narrow example</a>)</li><li>MozLitElements that use the automatic fluent data-l10n-attrs population (setting fluent: true in the property definition) can now have additional per-instance data-l10n-attrs (this attribute is now added to, rather than being replaced) <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1987682">Bug 1987682</a><ul><li>This could be useful especially for moz-button accesskey which is not currently a fluent attribute due to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1945032">Bug 1945032</a> (if you have a hidden HTML element with an accesskey it will still fire, gonna stop doing that in chrome documents since that’s how XUL worked)</li></ul></li></ul><h4>Tab Groups</h4><ul><li>dwalker polished the “active tab in a collapsed group” feature (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979067">1979067</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1971388">1971388</a>)</li><li>jswinarton polishing the collapsed tab group hover preview panel (1981197, 1971235, 1981201, 1983054)<ul><li>Now in Nightly, likely release in Firefox 145</li></ul></li><li>Enormous shout-out to contributor Merci chao for 17 tab group bugs filed in the last month! All of them are written well, actionable, and sometimes even include fixes</li></ul></description> <pubDate>Mon, 22 Sep 2025 10:18:52 +0000</pubDate> <dc:creator>Anna Kulyk</dc:creator></item><item> <title>Mozilla Addons Blog: Now you can roll back to a previous version of your extension</title> <guid isPermaLink="false">https://blog.mozilla.org/addons/?p=9260</guid> <link>https://blog.mozilla.org/addons/2025/09/19/now-you-can-roll-back-to-a-previous-version-of-your-extension/</link> <description><p><img alt="Firefox logo" class="alignleft size-medium wp-image-8750" height="252" src="https://blog.mozilla.org/addons/files/2019/10/Fx-Browser-icon-fullColor-252x252.png" width="252" />In response to feedback we’ve heard from the community, AMO (<a href="http://addons.mozilla.org" rel="noopener" target="_blank">addons.mozilla.org</a>) just introduced a new feature allowing developers the ability to quickly roll back to a previously approved extension version. The most common need for roll-back ability are occasions when developers may release a new version they later discover has critical bugs. Now in such cases, instead of needing to make fast fixes and quickly submit an even newer version, which could be further delayed during a review process, developers are free to revert back to a previously approved version.</p><p>For users who may have already installed the buggy version that’s later pulled, the extension will update to the roll-back version when Firefox checks for the next update (which occurs every 24 hours by default, save for users who’ve turned off automatic updates from the Add-ons Manager).</p><p>To learn more about the new roll-back feature, please visit <a href="https://extensionworkshop.allizom.org/documentation/publish/version-rollback/" rel="noopener" target="_blank">Extension Workshop</a>.</p><p>The post <a href="https://blog.mozilla.org/addons/2025/09/19/now-you-can-roll-back-to-a-previous-version-of-your-extension/">Now you can roll back to a previous version of your extension</a> appeared first on <a href="https://blog.mozilla.org/addons">Mozilla Add-ons Community Blog</a>.</p></description> <pubDate>Fri, 19 Sep 2025 17:18:36 +0000</pubDate> <dc:creator>Scott DeVaney</dc:creator></item><item> <title>Firefox Nightly: Add-ons, Fixes, and DevTools Snacks – These Weeks in Firefox: Issue 188</title> <guid isPermaLink="false">https://blog.nightly.mozilla.org/?p=1885</guid> <link>https://blog.nightly.mozilla.org/2025/09/19/add-ons-fixes-and-devtools-snacks-these-weeks-in-firefox-issue-188/</link> <description><h3>Highlights</h3><ul><li>The Timer and TODO List widget are now available to be enabled in Firefox Labs on Nightly and Beta:</li></ul><p><img alt="Lists and timer on Firefox Home checkbox in Settings" class="alignnone size-large wp-image-1887" height="129" src="https://blog.nightly.mozilla.org/files/2025/09/headlines188_2-600x129.png" width="600" /></p><ul><li>Firefox Desktop about:addons add-on card view has been updated to list API, host and data collection permissions as separate permission lists – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1956493">Bug 1956493</a></li><li>Firefox Suggest:<ul><li>Moritz has been working on the important dates feature, which highlights country-specific holidays. This is now enabled by default in Firefox 143beta (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985394">1985394</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982011">1982011</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983077">1983077</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=1892101%2C1969417%2C1979919%2C1689380%2C1982968%2C1984296%2C1982767%2C1981384%2C1984788%2C1813675%2C1583902%2C1956493%2C1984661%2C1679997%2C1787457%2C1984872">Resolved bugs (excluding employees)</a></h4><h4>Volunteers that fixed more than one bug</h4><ul><li>Artem Manushenkov</li><li>Christina</li></ul><h4>New contributors (🌟 = first patch)</h4><ul><li>Christina <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1679997">added support</a> for specifying the cssOrigin (author, user) when injecting CSS via the WebExtension browser.contentScripts.register method</li><li>Christina <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1956493">also updated about:addons</a> to include “permissions and data” for each addon</li><li>🌟Sujal Singh[:sujaldev] <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984872">fixed a visual glitch when showing the “unsigned extension” warning</a> in about:addons</li><li>chase.philpot <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1689380">fixed a glitch where AddonManager logging</a> would claim that a download had completed when it had actually failed</li></ul><h3>Project Updates</h3><h4>Add-ons / Web Extensions</h4><h5>Addon Manager &amp; about:addons</h5><ul><li>Fixed missing margin between add-on card warning messagebar and expanded add-on card header – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984872">Bug 1984872</a><ul><li>Thanks to sujaldev contributing this fix to the add-on card messagebars 🎉</li></ul></li></ul><h5>WebExtension APIs</h5><ul><li>Added support for cssOrigin option to the scripting API and content_scripts manifest.json property – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1679997">Bug 1679997</a></li></ul><h4>DevTools</h4><ul><li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1278517">Bug 1278517 – Jump to CSS variable definition in the CSS rule-view</a></li><li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1972771">Bug 1972771 – Adding a new panel for AntiTracking debugger behind a pref</a></li><li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1897765">Bug 1897765 – Network requests in background tabs where devtools is open jank the parent process main thread</a></li></ul><h4>WebDriver BiDi</h4><ul><li>Henrik <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1965465">cleaned up the test expectations for multiple-status outcomes in all existing WebDriver tests</a> under web-platform-tests. These statuses, typically added by wpt-sync when tests fail in CI, led to inaccurate reporting. Over the past six months, 106 test files on macOS, 39 on Linux, and 51 on Android stopped producing meaningful results due to entries like [OK, TIMEOUT].</li></ul><p>Similar cleanups should be performed for other components to avoid losing test coverage. Alternatively, <a href="https://github.com/mozilla/wpt-sync/blob/master/sync_prod.ini#L102-L103">enable syncbot notifications</a> for your component (opt-in) to automatically get bugs filed, which helps to keep accurate metadata under control.</p><ul><li>Julian fixed a <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983414">bug with the network.addDataCollector command which could lead to errors</a> when receiving certain requests (for instance data: URIs or cached stylesheets)</li><li>Julian <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1874365">implemented a new event browsingContext.downloadWillBegin</a>, which is emitted when a download starts. The event is currently only supported on Firefox desktop, support for Android will be added later.</li><li>Sasha added <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1976493">a platform API to set timezone override</a> and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978027">“emulation.setTimezoneOverride” WebDriver BiDi command</a>, which utilizes this API.</li><li>Sasha fixed the bug when <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1980211">locale override was sometimes shared between browsing contexts</a>. That was happening because the override was shared inside the process. With this fix, the locale override is attached to the realm, so it stays isolated in a browsing context.</li></ul><h4>Lint, Docs and Workflow</h4><ul><li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1944290">Updated ESLint to the latest v9.x version</a> (from 9.6.0).<ul><li>You may need to run ./mach eslint –setup and restart your editor if you haven’t already triggered the updates (e.g. <a href="https://firefox-source-docs.mozilla.org/code-quality/lint/usage.html#vcs-integrations">via the hooks</a>).</li><li>Standard8 also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1395426">fixed a long standing issue</a> which was blocking the upgrade, where using /* import-globals-from … */ in a cyclic dependency way could cause problems for correctly detecting the globals.</li><li>Also <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985519">updated</a> the other ESLint related modules to their latest versions.</li><li>Import attributes</li></ul></li><li>Stylelint is now covered under the <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983638">node-licenses checker</a>.</li><li>Jon has started rolling out a new Stylelint rule to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979115">enforce using border-radius tokens</a>.</li><li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1945456">TypeScript</a><ul><li>As part of the work for getting TypeScript ready for production, the TypeScript node_modules install has now been <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1975509">moved to the top-level of firefox-main</a>.</li><li>We’re experimenting with adding a <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986283">tier-3 linter for TypeScript</a>.<ul><li>The main aim here is to start getting feedback on how regressions in TypeScript appear on the reviewbot, and to reduce the likelihood of new issues being introduced on some of the components that we’ve already enabled TypeScript on and which have no outstanding issues currently.</li><li>This is intentionally scope limited to avoid impacting developers whilst we’re still in the set-up phase. Hence, this will report new issues against only a few components:<ul><li>{browser,toolkit}/components/search</li><li>browser/components/urlbar</li></ul></li><li>As this is Tier 3, it won’t show on CI by default, however, failures will show on reviewbot.</li></ul></li><li>There’s still a lot of work to do to get type generation set-up, documentation, and other issues fixed.</li></ul></li></ul><h4>New Tab Page</h4><ul><li>The new Sections UI was enabled by default for users in the US last week! We’ll be rolling it out to more regions in the coming weeks and months.</li></ul><p><img alt="The new Sections UI of the New Tab" class="alignnone size-large wp-image-1886" height="291" src="https://blog.nightly.mozilla.org/files/2025/09/headlines188_1-600x291.png" width="600" /></p><ul><li>Our release channel train-hop experiment has concluded, and we passed our checks! We’re now cleared to start doing these train-hops! (presuming a green light from Release Management and QA, of course)<ul><li>Special thanks to everybody who helped with this! <a href="mailto:pdahiya@mozilla.com"><span>Punam Dahiya</span></a>, <a href="mailto:lgreco@mozilla.com"><span>Luca Greco</span></a>, <a href="mailto:wdurand@mozilla.com"><span>William Durand</span></a>, <a href="mailto:amarchesini@mozilla.com"><span>Andrea Marchesini</span></a>, <a href="mailto:dmeehan@mozilla.com"><span>Donal Meehan</span></a>, <a href="mailto:ahalberstadt@mozilla.com"><span>Andrew Halberstadt</span></a>, <a href="mailto:joelm@mozilla.com"><span>Joel Maher</span></a>, <a href="mailto:beth@mozilla.com"><span>Beth Rennie</span></a>, and anybody who reviewed any of our patches or helped us out in the past few months on this project.</li></ul></li></ul><h4>Search and Navigation</h4><ul><li>Search<ul><li>Drew fixed a bug where Google Lens searches were returning invalid results when searching from an already-searched image (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985563">1985563</a>)</li></ul></li></ul><ul><li></li></ul><ul><li>Urlbar<ul><li>Dao continued his work on the new searchbar implementation, including fixing some layout issues (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1975010">1975010</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1975011">1975011</a>)</li><li>Moritz landed a series of patches to improve provider concurrency in the urlbar (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1628016">1628016</a>)</li></ul></li></ul><ul><li></li></ul><ul><li></li><li>Firefox Suggest<ul><li><ul><li>Drew and Daisuke landed many improvements and bug fixes for the new market-related suggestions (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985916">1985916</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985293">1985293</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984501">1984501</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982026">1982026</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985260">1985260</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1985287">1985287</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982024">1982024</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982034">1982034</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982375">1982375</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982535">1982535</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1981770">1981770</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982319">1982319</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982030">1982030</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982565">1982565</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982836">1982836</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983377">1983377</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983027">1983027</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982603">1982603</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982031">1982031</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984262">1984262</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984214">1984214</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1983984">1983984</a>)</li></ul></li></ul></li></ul><ul><li>Places Database<ul><li>Marco landed a patch that replaces fixed frecency algorithm thresholds with a function that calculates those thresholds dynamically instead (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1982059">1982059</a>)</li><li>Marco also fixed two bugs stemming from crashes related to the Favicons service (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1980992">1980992</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1984088">1984088</a>)</li></ul></li></ul><ul><li></li></ul><ul><li></li></ul><ul><li><ul><li></li></ul></li></ul></description> <pubDate>Fri, 19 Sep 2025 16:56:58 +0000</pubDate> <dc:creator>Anna Kulyk</dc:creator></item><item> <title>The Rust Programming Language Blog: Announcing Rust 1.90.0</title> <guid isPermaLink="true">https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/</guid> <link>https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/</link> <description><p>The Rust team is happy to announce a new version of Rust, 1.90.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.90.0 with:</p><pre class="language-console z-code"><code class="language-console"><span class="z-text z-plain">$ rustup update stable</span></code></pre><p>If you don't have it already, you can <a href="https://www.rust-lang.org/install.html">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-1900-2025-09-18">detailed release notes for 1.90.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">report</a> any bugs you might come across!</p><h4><a class="anchor" href="https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/#what-s-in-1-90-0-stable"></a>What's in 1.90.0 stable</h4><h3><a class="anchor" href="https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/#lld-is-now-the-default-linker-on-x86-64-unknown-linux-gnu"></a>LLD is now the default linker on <code>x86_64-unknown-linux-gnu</code></h3><p>The <code>x86_64-unknown-linux-gnu</code> target will now use the LLD linker for linking Rust crates by default. This should result in improved linking performance vs the default Linux linker (BFD), particularly for large binaries, binaries with a lot of debug information, and for incremental rebuilds.</p><p>In the vast majority of cases, LLD should be backwards compatible with BFD, and you should not see any difference other than reduced compilation time. However, if you do run into any new linker issues, you can always opt out using the <code>-C linker-features=-lld</code> compiler flag. Either by adding it to the usual <code>RUSTFLAGS</code> environment variable, or to a project's <a href="https://doc.rust-lang.org/cargo/reference/config.html"><code>.cargo/config.toml</code></a> configuration file,like so:</p><pre class="language-toml z-code"><code class="language-toml"><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">target</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">x86_64-unknown-linux-gnu</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span></span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">rustflags</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-punctuation z-definition z-array z-begin z-toml">[</span><span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>-Clinker-features=-lld<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-definition z-array z-end z-toml">]</span></span></code></pre><p>If you encounter any issues with the LLD linker, please <a href="https://github.com/rust-lang/rust/issues/new/choose">let us know</a>. You can read more about the switch to LLD, some benchmark numbers and the opt out mechanism <a href="https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable/">here</a>.</p><h5><a class="anchor" href="https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/#cargo-adds-native-support-for-workspace-publishing"></a>Cargo adds native support for workspace publishing</h5><p><code>cargo publish --workspace</code> is now supported, automatically publishing all ofthe crates in a workspace in the right order (following any dependenciesbetween them).</p><p>This has long been possible with external tooling or manual ordering ofindividual publishes, but this brings the functionality into Cargo itself.</p><p>Native integration allows Cargo's publish verification to run a build acrossthe full set of to-be-published crates <em>as if</em> they were published, includingduring dry-runs. Note that publishes are still not atomic -- network errors orserver-side failures can still lead to a partially published workspace.</p><h5><a class="anchor" href="https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/#demoting-x86-64-apple-darwin-to-tier-2-with-host-tools"></a>Demoting <code>x86_64-apple-darwin</code> to Tier 2 with host tools</h5><p>GitHub will soon <a href="https://github.blog/changelog/2025-07-11-upcoming-changes-to-macos-hosted-runners-macos-latest-migration-and-xcode-support-policy-updates/#macos-13-is-closing-down">discontinue</a> providing free macOS x86_64 runners for public repositories. Apple has also announced their <a href="https://en.wikipedia.org/wiki/Mac_transition_to_Apple_silicon#Timeline">plans</a> for discontinuing support for the x86_64 architecture.</p><p>In accordance with these changes, as of Rust 1.90, we have <a href="https://github.com/rust-lang/rfcs/pull/3841">demoted the <code>x86_64-apple-darwin</code> target</a> from <a href="https://doc.rust-lang.org/stable/rustc/platform-support.html#tier-1-with-host-tools">Tier 1 with host tools</a> to <a href="https://doc.rust-lang.org/stable/rustc/platform-support.html#tier-2-with-host-tools">Tier 2 with host tools</a>. This means that the target, including tools like <code>rustc</code> and <code>cargo</code>, will be guaranteed to build but is not guaranteed to pass our automated test suite.</p><p>For users, this change will not immediately cause impact. Builds of both the standard library and the compiler will still be distributed by the Rust Project for use via <code>rustup</code> or alternative installation methods while the target remains at Tier 2. Over time, it's likely that reduced test coverage for this target will cause things to break or fall out of compatibility with no further announcements.</p><h5><a class="anchor" href="https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/#stabilized-apis"></a>Stabilized APIs</h5><ul><li><a href="https://doc.rust-lang.org/stable/std/primitive.usize.html#method.checked_sub_signed"><code>u{n}::checked_sub_signed</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.usize.html#method.overflowing_sub_signed"><code>u{n}::overflowing_sub_signed</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.usize.html#method.saturating_sub_signed"><code>u{n}::saturating_sub_signed</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.usize.html#method.wrapping_sub_signed"><code>u{n}::wrapping_sub_signed</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/num/enum.IntErrorKind.html#impl-Copy-for-IntErrorKind"><code>impl Copy for IntErrorKind</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/num/enum.IntErrorKind.html#impl-Hash-for-IntErrorKind"><code>impl Hash for IntErrorKind</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/ffi/struct.CStr.html#impl-PartialEq%3C%26CStr%3E-for-CStr"><code>impl PartialEq&lt;&amp;CStr&gt; for CStr</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/ffi/struct.CStr.html#impl-PartialEq%3CCString%3E-for-CStr"><code>impl PartialEq&lt;CString&gt; for CStr</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/ffi/struct.CStr.html#impl-PartialEq%3CCow%3C'_,+CStr%3E%3E-for-CStr"><code>impl PartialEq&lt;Cow&lt;CStr&gt;&gt; for CStr</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/ffi/struct.CString.html#impl-PartialEq%3C%26CStr%3E-for-CString"><code>impl PartialEq&lt;&amp;CStr&gt; for CString</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/ffi/struct.CString.html#impl-PartialEq%3CCStr%3E-for-CString"><code>impl PartialEq&lt;CStr&gt; for CString</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/ffi/struct.CString.html#impl-PartialEq%3CCow%3C'_,+CStr%3E%3E-for-CString"><code>impl PartialEq&lt;Cow&lt;CStr&gt;&gt; for CString</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/borrow/enum.Cow.html#impl-PartialEq%3C%26CStr%3E-for-Cow%3C'_,+CStr%3E"><code>impl PartialEq&lt;&amp;CStr&gt; for Cow&lt;CStr&gt;</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/borrow/enum.Cow.html#impl-PartialEq%3CCStr%3E-for-Cow%3C'_,+CStr%3E"><code>impl PartialEq&lt;CStr&gt; for Cow&lt;CStr&gt;</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/borrow/enum.Cow.html#impl-PartialEq%3CCString%3E-for-Cow%3C'_,+CStr%3E"><code>impl PartialEq&lt;CString&gt; for Cow&lt;CStr&gt;</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.slice.html#method.reverse"><code>&lt;[T]&gt;::reverse</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f32.html#method.floor"><code>f32::floor</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f32.html#method.ceil"><code>f32::ceil</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f32.html#method.trunc"><code>f32::trunc</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f32.html#method.fract"><code>f32::fract</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f32.html#method.round"><code>f32::round</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f32.html#method.round_ties_even"><code>f32::round_ties_even</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f64.html#method.floor"><code>f64::floor</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f64.html#method.ceil"><code>f64::ceil</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f64.html#method.trunc"><code>f64::trunc</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f64.html#method.fract"><code>f64::fract</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f64.html#method.round"><code>f64::round</code></a></li><li><a href="https://doc.rust-lang.org/stable/std/primitive.f64.html#method.round_ties_even"><code>f64::round_ties_even</code></a></li></ul><h5><a class="anchor" href="https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/#platform-support"></a>Platform Support</h5><ul><li><code>x86_64-apple-darwin</code> is now a tier 2 target</li></ul><p>Refer to Rust’s <a href="https://doc.rust-lang.org/rustc/platform-support.html">platform support page</a> for more information on Rust’s tiered platform support.</p><h5><a class="anchor" href="https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/#other-changes"></a>Other changes</h5><p>Check out everything that changed in <a href="https://github.com/rust-lang/rust/releases/tag/1.90.0">Rust</a>, <a href="https://doc.rust-lang.org/nightly/cargo/CHANGELOG.html#cargo-190-2025-09-18">Cargo</a>, and <a href="https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-190">Clippy</a>.</p><h4><a class="anchor" href="https://blog.rust-lang.org/2025/09/18/Rust-1.90.0/#contributors-to-1-90-0"></a>Contributors to 1.90.0</h4><p>Many people came together to create Rust 1.90.0. We couldn't have done it without all of you. <a href="https://thanks.rust-lang.org/rust/1.90.0/">Thanks!</a></p></description> <pubDate>Thu, 18 Sep 2025 00:00:00 +0000</pubDate> <dc:creator>The Rust Release Team</dc:creator></item><item> <title>The Servo Blog: Your Donations at Work: Funding Josh Matthews' Contributions to Servo</title> <guid isPermaLink="true">https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/</guid> <link>https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/</link> <description><p>The Servo project is excited to share that long-time maintainer <a href="https://github.com/jdm">Josh Matthews (@jdm)</a> is now working part-time on improving the Servo contributor experience.</p><p>This is a direct result of the monthly donations to the project through <a href="https://opencollective.com/servo">OpenCollective</a> and <a href="https://github.com/sponsors/servo">GitHub</a>. The generosity of our supporters has allowed us to operate dedicated computing resources for CI purposes, as well as participate in the <a href="https://www.outreachy.org/">Outreachy program</a> as a mentoring organization. We’re excited that we can now financially support developers and allow them to dedicate more time to the Servo project over longer periods.</p><p>Josh will use this funded time to make it easier for others to contribute to the project. You will see him improving documentation, reviewing pull requests, breaking down large projects into smaller actionable tasks, and generally helping others get unstuck quicker.</p><p>Here’s Josh in his own words:</p><h3>Tell us about yourself! <a class="header-anchor" href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/#tell-us-about-yourself!"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>I’ve been working on web browsers since 2009, with a brief diversion into distributed systems and finance for a few years. I’ve been a stay at home dad for several years, though, and Servo is a great way for me to keep that intellectual curiosity. I love helping people accomplish things they haven’t tried before; it’s a very satisfying experience to watch them flourish and grow.</p><h3>Why did you start contributing to Servo? <a class="header-anchor" href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/#why-did-you-start-contributing-to-servo%3F"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>The team I had lined up at Mozilla in 2012 abruptly was cancelled shortly before I started full time. I knew of the existence of the very beginnings of the Servo project, and I was in the unique position of having several years of experience in both working on Firefox and the early Rust compiler. When I suggested that I should help get Servo off the ground, everyone thought that was a good idea.</p><h3>What was challenging about your first contribution? <a class="header-anchor" href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/#what-was-challenging-about-your-first-contribution%3F"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>Brian Anderson (@brson) handed me a program that could parse simple HTML and a tiny bit of CSS and draw solid rectangles into a png. He said “Can you make it run JavaScript?” The amount of details I needed to learn about how a web page’s DOM gets hooked up to a JS engine were intimidating, and the relevant web standards were still quite underdeveloped in 2012. There was a lot of guessing and then going and talking to the experts from the Firefox side of the org.</p><h3>What do you like about contributing to the project? What do you get out of it? <a class="header-anchor" href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/#what-do-you-like-about-contributing-to-the-project%3F-what-do-you-get-out-of-it%3F"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>I love seeing familiar websites becoming more usable. I am fascinated by all the different technologies that make up rendering engines today, and all the ways we discover that websites use them. And I love working in Rust in a large project, especially one that I’m so familiar with. There are a lot of kind, talented, and clever people that contribute to the project that make it a really enjoyable experience for me.</p><h3>What is currently being worked on in Servo that you’re excited about? <a class="header-anchor" href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/#what-is-currently-being-worked-on-in-servo-that-you%E2%80%99re-excited-about%3F"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>The work to get the JavaScript debugger up and running will be a game changer for investigating site compatibility problems. I’m also really pleased to see work happening in the JS bindings layer—ways to reduce the number of string conversions required when going from JS-&gt;Rust-&gt;JS, or make interactions with typed arrays safer and more ergonomic. I love when we make it easier for non-experts to implement missing web APIs.</p><h3>What would you like to see the Servo community do more of? <a class="header-anchor" href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/#what-would-you-like-to-see-the-servo-community-do-more-of%3F"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>I would love to see more experiments with embedding Servo in other projects. The ones I know about, like the verso browser and the cuervo text-mode browser, have been enormously helpful in pointing out use cases that we had missed, or areas of the engine that could be made more modular and configurable. I’d love to get to a place where almost any major component of Servo could be replaced without forking the engine.</p><h3>Do you have any advice for new developers who are thinking of contributing to the project? <a class="header-anchor" href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/#do-you-have-any-advice-for-new-developers-who-are-thinking-of-contributing-to-the-project%3F"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>Choose your favourite web feature and look for it in the engine. Either it’s already implemented and you can use it to understand how some pieces fit together, or you could probably get a skeleton implementation going! Either way, we would love to help you find your way around the codebase. I take pride in the number of PRs we’ve received from people who have never written Rust code before, but their implementation is totally mergeable. I think Servo is the most approachable web rendering engine for new contributors, and I want to keep it that way.</p><h3>What do you hope to see evolve in Servo over the next 1-2 years? <a class="header-anchor" href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/#what-do-you-hope-to-see-evolve-in-servo-over-the-next-1-2-years%3F"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>I would love to see a larger set of maintainers who review code changes, which will be good for maintainers and contributors alike. Similarly, I’d love to see more experienced contributors writing down the details for solving complex issues that only live in their heads right now. That’s how we grow a long-term project contributor base that skills up over time, by modelling that kind of behaviour.</p><h3>Any final thoughts you’d like to share? <a class="header-anchor" href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/#any-final-thoughts-you%E2%80%99d-like-to-share%3F"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>I’m humbled by how many people contribute to Servo, whether financially, through code, or just Zulip discussions. I think Servo is in a really lucky position, and I hope to continue shepherding it towards a bright future.</p></description> <pubDate>Wed, 17 Sep 2025 00:00:00 +0000</pubDate></item><item> <title>Firefox Developer Experience: Firefox WebDriver Newsletter 143</title> <guid isPermaLink="false">https://fxdx.dev/?p=510</guid> <link>https://fxdx.dev/firefox-webdriver-newsletter-143/</link> <description><p><em>WebDriver is a remote control interface that enables introspection and control of user agents.</em> <em>As such it</em> <em>can</em> <em>help developers to verify that their websites are working and performing well with all major browsers. The protocol is standardized by the</em><a href="https://www.w3.org/"><em> </em><em>W3C</em></a><em> and consists of two separate specifications:</em><a href="https://w3c.github.io/webdriver/"><em> </em><em>WebDriver classic</em></a><em> (HTTP) and the new</em><a href="https://w3c.github.io/webdriver-bidi/"><em> </em><em>WebDriver BiDi</em></a><em> </em><em>(Bi-Directional).</em></p> <p><em>This newsletter gives an overview of the work we’ve done as part of the Firefox 143 release cycle</em>.</p> <h3>Contributions</h3> <p>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>In Firefox 143, two contributors managed to land fixes and improvements in our codebase:</p> <ul><li>Liam (ldebeasi) implemented the logic to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1754273">emit events for existing contexts</a> when subscribing to the <code>browsingContext.contextCreated</code> event.</li> <li>Sabina (sabina.zaripova) <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1972865">added an internal helper</a> to make it easier to check our session data.</li></ul> <p>WebDriver code is written in JavaScript, Python, and Rust so any web developer can contribute! Read<a href="https://firefox-source-docs.mozilla.org/devtools/getting-started/README.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!<br /></p> <h3>WebDriver BiDi</h3> <h4>Updated: <code>browsingContext.contextCreated</code> for existing contexts</h4> <p>Updated the <code>browsingContext.contextCreated</code> event to be <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1754273">emitted for all open contexts</a> when subscribing to the event.</p> <h4>New: several commands to record network data</h4> <p>We implemented several new commands for the network module to enable recording network data.</p> <p><strong><code>network.addDataCollector</code></strong> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1971778">adds a network data collector</a> to <code>contexts</code>, <code>userContexts</code> or globally. The collector will record network data corresponding to the provided <code>dataTypes</code>. At the moment, only the <code>"response"</code> data type is supported. A <code>maxEncodedDataSize</code> must also be provided, network data exceeding this size will not be recorded.</p> <p><strong><code>network.removeDataCollector</code></strong> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1971781">removes a previously added network data collector</a>.</p> <p><strong><code>network.getData</code></strong> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1971780">retrieves the data collected</a> for a provided <code>request</code> id, <code>dataType</code> and optionally <code>collector</code> id. When providing a <code>collector</code> id, clients may also pass the <code>disown</code> flag to release the network data from the collector. Note that data is deleted when it is no longer owned by any collector.</p> <p><strong><code>network.disownData</code></strong> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1971779">releases the data</a> for a given <code>request</code> id and <code>dataType</code> from the provided <code>collector</code> id.</p> <h4>Bug fixes:</h4> <ul><li>Fixed a bug where <code>emulation.setLocaleOverride</code> <a href="https://bugzil.la/1980137">did not apply the override to newly created cross-origin iframes</a>.</li> <li>Fixed a bug where several commands such as <code>session.subscribe</code> would <a href="https://bugzil.la/1949037">fail if any tab was unloaded</a>.</li> <li>Fixed the <code>browsingContext.navigationCommitted</code> event so that the <code>url</code> property <a href="https://bugzil.la/1980137">now includes basic auth credentials</a>.</li></ul></description> <pubDate>Tue, 16 Sep 2025 19:00:00 +0000</pubDate> <dc:creator>Julian Descottes</dc:creator></item><item> <title>Mozilla Future Releases Blog: Raising the Minimum Android Version for Firefox</title> <guid isPermaLink="false">https://blog.mozilla.org/futurereleases/?p=2729</guid> <link>https://blog.mozilla.org/futurereleases/2025/09/15/raising-the-minimum-android-version-for-firefox/</link> <description><p>Mozilla has always aimed to make Firefox available to as many people as possible, including those on older Android devices. For years, we’ve supported versions of Android going all the way back to 5 (Lollipop), which first launched in 2014. That broad support has helped extend the life of many devices. However, the Android ecosystem is constantly evolving and it has become increasingly difficult for us to find ways to maintain and develop apps on these long-unsupported platforms while also allowing Firefox to take advantage of more modern devices and Android operating systems.</p><p>Beginning with Firefox 144, <strong>the minimum supported Android version will increase to 8.0 (Oreo)</strong>, which was released in 2017. At the same time, we will end support for 32-bit x86 Android devices. Usage of these older platforms has become increasingly rare, and continuing to support them has made it harder for us to deliver the best performance and reliability to the vast majority of our users.</p><p>If your device runs Android 7 or earlier, or if you rely on Firefox for a 32-bit x86 device, Firefox 143 will be the final version available to you. You will still be able to use that version, but it will no longer receive updates once Firefox 144 is released. Please note that 32-bit ARM devices will continue to be supported.</p><p>These changes apply not only to Firefox for Android but also to Firefox Focus &amp; Klar, our privacy-first browsers. By narrowing our supported platforms, we can take better advantage of modern Android APIs, improve stability and security, and focus our engineering resources where they will have the greatest impact.</p><p>We know some users will be affected by this transition, and we don’t take that lightly. Our goal remains to balance broad accessibility with the ability to deliver the best possible Firefox experience on modern hardware and operating systems.</p><p>The post <a href="https://blog.mozilla.org/futurereleases/2025/09/15/raising-the-minimum-android-version-for-firefox/">Raising the Minimum Android Version for Firefox</a> appeared first on <a href="https://blog.mozilla.org/futurereleases">Future Releases</a>.</p></description> <pubDate>Mon, 15 Sep 2025 17:00:36 +0000</pubDate> <dc:creator>Ryan VanderMeulen</dc:creator></item><item> <title>Mozilla Thunderbird: Mobile Progress Report – July/August 2025</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3793</guid> <link>https://blog.thunderbird.net/2025/09/mobile-progress-report-july-august-2025/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2025/09/blog-banner-mobile-1-768x432.jpg" width="640" /></p><p>Hello wonderful community, it has been a while since the <a href="https://blog.thunderbird.net/2025/07/mobile-progress-report-june-2025/">last Mobile update</a>.</p> <p>A lot has happened in the past 2 months, so let’s jump right into a quick overview of current work in progress and primary efforts.</p> <h4>Account Drawer in progress</h4> <p>If you’re rocking the Beta version of Thunderbird for Android, you might have noticed that all your unified folders have disappeared! Don’t panic, that’s just temporary.</p> <p>We’re still churning through the technical debt and the database inconsistencies in order to create through virtual unified folders for all your accounts.</p> <p>The final goal is the same as the one we shared in a previous update, which you can see the final mock-ups here:</p> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/09/Mobile-Update-July_August.png"><img alt="" class="wp-image-3794" height="647" src="https://blog.thunderbird.net/files/2025/09/Mobile-Update-July_August.png" width="1600" /></a></figure> <p>Expect more updates in the coming releases.</p> <h3>iOS account setup</h3> <p>The work on the iOS version is moving at full speed!</p> <p>We found ourselves in a bit of a tight spot due to the recent announcements of Apple with their new iOS 26 version, and a somewhat complete redesign of all the SwiftUI and general Human Interface Guidelines.</p> <p>When will iOS 26 be widely available and adopted?</p> <p>Will we have our iOS version of Thunderbird ready before that?</p> <p>If we build it on current iOS 18 design guidelines, how would that look on the new version?</p> <p>Will we need to update everything right after releasing the first version?</p> <p>Due to these uncertainties, we decided to focus only on the new iOS 26 user interface and be compatible with the new version right off the bat.</p> <p>We will need to test and explore carefully how that behaves on iOS 18 and prior, hoping for some available translation layers in order to guarantee compatibility.</p> <p>For now, here’s a sneak peek of the Account Setup flow for iOS!</p> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/09/Mobile-Update-July_August1.png"><img alt="" class="wp-image-3800" height="1600" src="https://blog.thunderbird.net/files/2025/09/Mobile-Update-July_August1.png" width="1312" /></a></figure> <h3>Read/Unread status improvements in Android</h3> <p>As we move through an old codebase and we work hard to modernize components and layouts, it is unfortunately inevitable that we accidentally break old features or setups that are familiar to users.</p> <p>We apologize for the inconvenience, especially in this latest highlighted issue which created some discomfort when it comes to the visual distinction between read and unread messages.</p> <p>The old UI offered an option to customize the background color of those states. Even if this solution sounds like a good approach, it created multiple problems related to following system themes, light/dark mode variations, and the overall outdated implementation that needed to be removed.</p> <p>Some users were dissatisfied, and rightly so, due to the less than optimal visual distinction between those states that solely relied on background colors.</p> <p>We already improved the overall visual consistency and distinction in that area, but we’re working towards implementing a much clearer visual representation for each state that doesn’t just rely on background colors.</p> <p>We’re implementing a combination of background and foreground colors, font weight variation, and a visual indicator that specifically represents unread and new messages.</p> <p>This approach will remove any confusion and hopefully completely fix this problem.</p> <p>Thank you all those involved for your feedback and concerns, and for using the Beta version to provide early feedback and test the new updates.</p> <h3>A new release cadence</h3> <p>Starting from September, we’re switching to a faster and more consistent release cadence.</p> <p>The first week of every month we will release a new beta version, for example v13b1, followed by a new incremental beta version with improvements and fixes directly from the main branch, being released every week during that month (eg: v13b2, v13b3, etc).</p> <p>At the end of that month, the current beta, after being deemed reliable and having passed our QA steps, will be promoted as a stable version and at the same time a new beta branch will be released.</p> <p>In summary, starting from September you can expect a new stable version and a new beta cycle every month.</p> <p>Changing our cadence will allow us to expose new and work in progress features more quickly to our beta audience, and shorten the waiting time for users on the stable branch, with smaller and consistent incremental improvements.</p> <p>Cheers,</p> <p>—</p> <p><strong>Alessandro Castellani</strong>(he, him)<br /><strong>Director, Desktop and Mobile Apps</strong> | Mozilla Thunderbird</p><p>The post <a href="https://blog.thunderbird.net/2025/09/mobile-progress-report-july-august-2025/">Mobile Progress Report – July/August 2025</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Mon, 15 Sep 2025 15:09:31 +0000</pubDate> <dc:creator>Alessandro Castellani</dc:creator></item><item> <title>Firefox Nightly: Webcam previews and more! – These Weeks in Firefox: Issue 187</title> <guid isPermaLink="false">https://blog.nightly.mozilla.org/?p=1893</guid> <link>https://blog.nightly.mozilla.org/2025/09/12/webcam-previews-and-more-these-weeks-in-firefox-issue-187/</link> <description><h3>Highlights</h3><ul><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe</a> added presentational hints in the Inspector’s rule-view (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1212289">#1212289</a>)</li></ul><p><img alt="Presentational hints in the Inspector's rule-view" class="alignnone size-large wp-image-1898" height="183" src="https://blog.nightly.mozilla.org/files/2025/09/headlines187_2-600x183.png" width="600" /></p><ul><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=774869">Nate Gross</a> added a new getKeys API method available across all browser.storage APIs (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1910669">Bug 1910669</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=636491">Emma Zühlcke (:emz)</a> added a fix so that the users can preview their webcam(s) before giving sites access to it. (To make sure users look their best, or just to figure out which of their many webcams is the correct one). (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=799415">Bug 799415</a>)</li></ul><p><img alt="Webcam preview" class="alignnone size-full wp-image-1897" height="530" src="https://blog.nightly.mozilla.org/files/2025/09/headlines187_1.png" width="562" /></p><ul><li>The New Tab team is testing out productivity widgets like a focus timer for healthy screen-time breaks and a list widget to manage your tasks.</li></ul><p><img alt="New Tab productivity widgets" class="alignnone size-large wp-image-1899" height="307" src="https://blog.nightly.mozilla.org/files/2025/09/headlines187_3-600x307.png" width="600" /></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=1975093%2C1976968%2C1977124%2C1910669%2C1977066%2C1943057%2C1884618%2C1936018%2C1975872%2C1979623%2C1979294%2C1957214%2C1974983%2C1980170%2C1959618%2C1980854%2C1754273%2C1497064%2C1981039">Resolved bugs (excluding employees)</a></h4><h4>Volunteers that fixed more than one bug</h4><ul><li>Gregory Pappas [:gregp]</li><li>Mauro V [:cheff]</li></ul><h4>New contributors (🌟 = first patch)</h4><ul><li>Jacqueline Amherst <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1959618">helped reorganize some of the code that we use for performing navigations from the front-end code</a></li><li>Mason Abbruzzese <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1957214">cleaned up an old and outdated comment in our code</a></li><li>Nate Gross <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1910669">added a new getKeys API method available across all browser.storage APIs</a></li><li>chase.philpot <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1884618">cleaned up some old extensions utility code written from the era before DOM Promises</a></li><li>Richard LoRicco <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1975872">got rid of some unnecessary awaits in some of our preferences tests</a></li><li>Jim Gong made it so that <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1497064">we fail more gracefully when WebExtensions attempt to set cookies with invalid URLs</a></li></ul><h3>Project Updates</h3><h4>Add-ons / Web Extensions</h4><h5>WebExtension APIs</h5><ul><li>Thanks to Jim Gong contributing changes needed to improve the errors reported by browser.cookies.set API method on invalid domains (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1497064">Bug 1497064</a>)</li></ul><h5>WebExtensions Framework</h5><ul><li>WebExtensions framework and AddonManager internals cleanups:<ul><li>Thanks to Chase Philpot for contributing to WebExtensions internals cleanups by removing the now unnecessary filterStack helper function from the WebExtensions internals (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1884618">Bug 1884618</a>)</li><li>Thanks to Mauro V. [:cheff] for removing old rollout prefs for the userScripts APIs (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1943057">Bug 1943057</a>)</li><li>Migrating tests away from deprecated InstallTrigger API (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979294">Bug 1979294</a> / <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979648">Bug 1979648</a> / <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979657">Bug 1979657</a> / <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979690">Bug 1979690</a> / <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979712">Bug 1979712</a> / <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1980604">Bug 1980604</a>), in preparation for fully removing the InstallTrigger API implementation (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1776426">Bug 1776426</a>)<ul><li>Huge shout out goes to Gregory Pappas 🎉 for his contributions to the work for removing the deprecated InstallTrigger API, as well as for fixing an issue (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979281">Bug 1979281</a>) preventing use of Mochia test helpers in mochitest-browser tests and then refactoring browser_doorhanger_installs.js test cases to use the Mochia describe/it test helpers (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979294">Bug 1979294</a>) 😍</li></ul></li></ul></li><li>Investigated issue introduced in recently released 1password WebExtension versions, which was triggering the extension process to hang, reported to 1password developers which have released a fixed version of their add-on (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1980009">Bug 1980009</a>)<ul><li>We have also investigated why ProcessHangMonitor isn’t currently detecting and showing to the user a notification box on slow scripts that are making the extension process hanging and filed <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1980452">Bug 1980452</a> to capture the findings and tracking fixing that as a followup for the 1password incident.</li></ul></li><li>Investigated and fixed AsyncShutdown failures hit due to a race between application shutdown and active add-ons background pages starting up (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1959339">Bug 1959339</a>)</li><li>As part of introducing support for WPT WebExtensions API tests (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1949012">Bug 1949012</a>), new browser.test.onTestStarted and browser.test.onTestFinished API events are now supported from inside tests running WPT mode (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1971013">Bug 1971013</a>)</li><li>Replaced mouseenter/mouseleave with mouseove/mouseout in browser-addons.js logic handled the extensions button auto-hiding mode (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1976773">Bug 1976773</a>)</li><li>Fixed bug which was generating WebExtensions uuids for extensions not yet installed and increasing the size of extensions.webextensions.uuids pref value unnecessarily (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1974419">Bug 1974419</a>)</li></ul><h5>Addon Manager &amp; about:addons</h5><ul><li>Added new localized string to improve error message shown on add-on install flows failing due to errors hit on accessing the XPI file being installed (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1976490">Bug 1976490</a>)</li></ul><h4>DevTools</h4><ul><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=473060">Kagami Rosylight</a> migrated the DevTools color picker widget to Fluent for devtools color picker widget (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978294">#1978294</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=283262">Alexandre Poirot</a> improved performance of the Debugger sources tree on pages with a lot of sources (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1976570">#1976570</a>)<ul><li>For example, on a page with 90K sources, on Alex’s machine, we went from 3800ms to 190ms</li></ul></li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=283262">Alexandre Poirot</a> was able to make the Debugger reuse the same tab when pretty printing a source (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1971817">#1971817</a>)<ul><li>It used to create a new Tab with the pretty content, which could be confusing</li></ul></li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe</a> removed usage of the <a href="https://www.npmjs.com/package/whatwg-url">whatwg-url</a> package in our source map code, which <a href="https://treeherder.mozilla.org/perfherder/alerts?id=46058">significantly improved performance</a> (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1829610">#1829610</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=559949">Julian Descottes</a> made the “tab toolbox” (e.g. about:debugging) to be focused when the tab was in background and a breakpoint is hit (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978100">#1978100</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe</a> fixed 2 regressions in the markup view:<ul><li>First, the tree would no longer gets focused when opening the inspector via the “Inspect” context menu (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979591">#1979591</a>)</li><li>Second, the search wouldn’t find css selector with tagname + class with hyphens (e.g. div.narrow-item) (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1980892">#1980892</a>)</li></ul></li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=559949">Julian Descottes</a> fixed the splitter in Memory panel for the Retaining Paths view (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978538">#1978538</a>)</li><li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe</a> made “Group Similar Messages” setting also impact the “repeat bubble”: when the feature is disabled, successive similar messages will all be displayed in the console (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1615206">#1615206</a>)</li></ul><h4>WebDriver BiDi</h4><ul><li>Sabina added a <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1972865">new helper to check if there is existing session data matching specific criteria</a>, and at the same time cleaned up the SessionData class to use proper private fields and methods where possible.</li><li>Mauro <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1938638">removed the deprecated “–enable-crash-reporter” argument from geckodriver</a>.</li><li>Sasha fixed a bug when <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978533">locale override, set with “emulation.setLocaleOverride” command, was not inherited to newly created cross-origin iframes</a>.</li></ul><h4>New Tab Page</h4><ul><li>We are experimenting adding productivity widgets to new tab in 143<ul><li>To enable:<ul><li>Browser.newtabpage.activity-stream.widgets.system.enabled (allow all widgets)</li><li>Timer<ul><li>browser.newtabpage.activity-stream.widgets.system.focusTimer.enabled</li><li>browser.newtabpage.activity-stream.widgets.focusTimer.enabled</li><li>browser.newtabpage.activity-stream.widgets.focusTimer.showSystemNotifications</li></ul></li><li>Lists<ul><li>browser.newtabpage.activity-stream.widgets.system.lists.enabled</li><li>browser.newtabpage.activity-stream.widgets.lists.enabled</li></ul></li></ul></li></ul></li><li>We’re aiming to do our first train-hop pilot to Beta either later this week or early next!</li></ul><h4>Search and Navigation</h4><ul><li>Drew has added a “Search Image” context menu for visual search – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1977965">1977965</a></li><li>Moritz has enabled urlbar deduplication by default – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979658">1979658</a></li><li>Dao is working on several refactors to enable reuse of the urlbar – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1980372">1980372</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1980913">1980913</a></li><li>Daisuke has started working on stock suggestions – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1969990">1969990</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979232">1979232</a></li><li>Mark fixed several bug with Rakuten – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1979030">1979030</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1924693">1924693</a></li><li>Marco fixed bug with results flashing – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978283">1978283</a></li><li>Emilio polished the padding of the library toolbar – <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978699">1978699</a></li></ul></description> <pubDate>Fri, 12 Sep 2025 19:59:17 +0000</pubDate> <dc:creator>Anna Kulyk</dc:creator></item><item> <title>The Rust Programming Language Blog: crates.io phishing campaign</title> <guid isPermaLink="true">https://blog.rust-lang.org/2025/09/12/crates-io-phishing-campaign/</guid> <link>https://blog.rust-lang.org/2025/09/12/crates-io-phishing-campaign/</link> <description><p>We received multiple reports of a phishing campaign targeting crates.io users(from the <code>rustfoundation.dev</code> domain name), mentioning a compromise of ourinfrastructure and asking users to authenticate to limit damage to their crates.</p><p>These emails are malicious and come from a domain name not controlled by theRust Foundation (nor the Rust Project), seemingly with the purpose of stealingyour GitHub credentials. We have no evidence of a compromise of the crates.ioinfrastructure.</p><p>We are taking steps to get the domain name taken down and to monitor forsuspicious activity on crates.io. Do not follow any links in these emails if youreceive them, and mark them as phishing with your email provider.</p><p>If you have any further questions please reach out to <a href="mailto:security@rust-lang.org">security@rust-lang.org</a>and <a href="mailto:help@crates.io">help@crates.io</a>.</p></description> <pubDate>Fri, 12 Sep 2025 00:00:00 +0000</pubDate> <dc:creator>Rust Security Response WG, crates.io team</dc:creator></item><item> <title>Mozilla Thunderbird: State of the Thunder: Mozilla Connect Updates</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3783</guid> <link>https://blog.thunderbird.net/2025/09/state-of-the-thunder-mozilla-connect-updates/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2025/09/Blog-banner-State-of-the-Thunder6-768x432.jpg" width="640" /></p><p>Welcome back to the latest season of State of the Thunder! After a short break, we’re back and ready to go. Michael Ellis, our Manager of Community Programs, is helping Alessandro with hosting duties. Along with members of the Thunderbird team and community, they’re answering your questions and keeping everyone updated on our roadmap progress for our projects.</p> <p>In this episode, we’re talking about our initiatives for regular community feedback, tackling a variety of questions, and providing status updates on the top 20-ish Mozilla Connect Thunderbird suggestions. </p> <h3>Community Questions</h3> <h4>Accidental Message Order Sorting</h4> <p><strong>Question:</strong> Clearly the number one issue with Thunderbird that breaks for many of my clients is that if they accidentally click on a column header the sorting of the message is changed. “My messages are gone” is what I then hear all the time from my clients. It would be wonderful if the sorting of the message could be locked and not changed through such an easy operation, which often is invoked accidentally.</p> <p>Answer: This is a great usability question and a complicated one. Alessandro recommends switching to CardsView, as it’s harder to accidentally change. This one one of the reasons we implemented it! However, we can definitely explore options to lock the message order in through enterprise policies. We would want to be mindful of users who wanted to change the order. </p> <p>Michael discusses the option of a pop-up warning that could inform the user they’re about the change the message sorting order. Increased friction through a pop-up, though, as Alessandro and Jesse Miksic from the design team both point out, can cause its own issues. But this is certainly something we’ll look into more! </p> <h4>Move Focus Keyboard Shortcut</h4> <p><strong>Question:</strong> Could there be consideration to add a keystroke to immediately move the focus to the list of messages in the currently open mailbox? Even better if keystrokes that would automatically do this for the inbox folder or the default account.</p> <p><strong>Answer:</strong> Alessandro notes Thunderbird already has this ability, but it’s not super noticeable. The F6 key allows you to switch focuses between the main areas of the application. So we’re approaching this problem from two directions: implementing tabular keyboard navigation and customizable shortcuts. We don’t have an expected delivery date on the latter, but we plan to have a searchable keyboard shortcut hub. We know our interface can be a little daunting, and we’re tackling it from multiple angles.</p> <h4>Option for Simplified Thunderbird?</h4> <p><strong>Question: </strong>I work for a company which develops a Raspberry Pi-based computer made specific… specifically for blind consumers. Thunderbird is installed on this device by default. Many of our users are not tech-savvy. and just want a simple email client. I would love to have an easy method for removing some of the clutters with the goal of having a UI with fewer controls. Currently, users often have to press the tab key many times just to move to the list of messages in their inbox. For some users, all they really want is the message list and the list of folders, with the menu bar open, and that’s it. A bit like we once had with Outlook Express.</p> <p><strong>Answer:</strong> Alessandro and Ryan Sipes, our director, have talked about the need for a lighter version of Thunderbird a lot. This would help users who don’t need all the power of Thunderbird, and just want to focus on their messages (not even their folders). However, Ryan doesn’t want a separate version of Thunderbird we’d need to maintain, but to build a better usability curve into Thunderbird. Answering this question means having a Thunderbird that is simple by default, but more powerful and customizable if needed, without upsetting our current users.</p> <p>Heather Ellsworth from the community team also supports the idea of a user preference for a lighter Thunderbird. At conferences and co-working spaces, she constantly hears the requests for a slightly simpler version of Thunderbird.</p> <h4>Thunderbird PPA</h4> <p><strong>Question: </strong>I’m using Linux, one of the Ubuntu-derived flavors. And I have Thunderbird 128.14 ESR installed through the <a href="https://launchpad.net/~mozillateam/+archive/ubuntu/ppa">Mozilla Team PPA</a>. I would love to know when the ESR version of 140 will be available in this PPA.</p> <p><strong>Answer:</strong> Heather, who works a lot with Linux packaging, takes this question. This PPA isn’t an official distribution channel for Thunderbird, which leads to some confusion. Our official Linux packages are the Snap and flatpak, and the tarball available on our website. A community member named Rico, whose handle is ricotz, maintains this PPA. In the PPA, you can click on his name to learn how to contact him for question like this.</p> <h3>Top 20-ish Mozilla Connect Posts</h3> <p>If you’ve ever posted an idea to make Thunderbird better in a blog comment, social media post, or a SUMO (<a href="https://support.mozilla.org">Mozilla Support</a>) thread, you’ve probably been prompted to share your suggestion on <a href="https://connect.mozilla.org/">Mozilla Connect.</a> This helps us keep our community feedback in one place, which helps our team prioritize features the community wants!</p> <p>Where we’re falling short, however, is keeping the community updated on the progress of their suggestions. With a dedicated community team, this is something we can do better! Right now, we’d like to provide a quick status update on the top 20-ish Mozilla Connect posts related to Thunderbird.</p> <h4><a href="https://connect.mozilla.org/t5/ideas/firefox-sync-for-thunderbird/idi-p/28971">Sync</a></h4> <p>We implemented this in the Daily build of the desktop app last year, using a staging environment for Firefox Sync. But Firefox Sync is called Firefox Sync because it’s built for Firefox. Thunderbird profiles, in comparison, have a lot more data points. This meant we had to build something completely different. </p> <p>As we started to spin up Thunderbird Pro, we decided it made more sense to have a Thunderbird account that would manage everything, including Sync. Unfortunately, this meant a lot of delays. So Sync is still on our radar, and we hope to have it next year, barring further complications.</p> <h4><a href="https://connect.mozilla.org/t5/ideas/better-gnome-desktop-integration/idi-p/14612">GNOME Desktop Integration</a></h4> <p>Yes, we’re working on this, starting with native desktop notifications. Ideally, we want to be integrated with more Linux desktop environments through expanded native APIs.</p> <h4><a href="https://connect.mozilla.org/t5/ideas/color-for-thunderbird-accounts/idi-p/14758">Color for Thunderbird Accounts</a></h4> <p>We already have it! You can access your account settings and customize the colors of each account.</p> <h4><a href="https://connect.mozilla.org/t5/ideas/show-full-email-address-when-mouse-over-sender/idi-p/29010">Show full email address on mouse-over</a></h4> <p>Already have this too. If this doesn’t happen, it’s a bug, and we’d definitely appreciate a report at <a href="https://bugzilla.mozilla.org">Bugzilla</a>.</p> <h4><a href="https://connect.mozilla.org/t5/ideas/don-t-save-passwords-as-plain-text-but-rather-integrate-with-os/idi-p/29377">Don’t save passwords as plain text, but rather integrate with the OS storage system</a></h4> <p>We’re exploring this as both part of our increased native OS integrations and strengthening and security integrations with Thunderbird.</p> <h4><a href="https://connect.mozilla.org/t5/ideas/thunderbird-should-by-default-have-all-telemetry-as-an-opt-in/idi-p/24953">Thunderbird should, by default, have all telemetry as an opt-in option, or have zero telemetry</a></h4> <p>We’re already adopting opt-in telemetry for an upcoming release of Thunderbird for Android, and we want to make this the default for desktop in the future. While desktop is currently opt-out, Alessandro stresses we only have a few limited telemetry probes for desktop Thunderbird. And those probes can show how the majority of users are using the app and help us avoid bad UX choices. </p> <h4><a href="https://connect.mozilla.org/t5/ideas/thunderbird-for-iphone-and-ipad/idi-p/21628">Thunderbird for iPhone and iPad</a></h4> <p>In progress! </p> <h4><a href="https://connect.mozilla.org/t5/ideas/jmap-support-or-similar-for-thunderbird/idi-p/28974">JMAP Support</a></h4> <p>Currently in the works for the upcoming iOS release, with plans for support on desktop and Android. Thundermail will also come with JMAP.</p> <h4><a href="https://connect.mozilla.org/t5/ideas/firefox-translations-in-thunderbird/idi-p/24890">Firefox Translate</a></h4> <p>Exploring this is low on our list right now. This is both because of performance concerns and we want to be very cautious with anything concerning machine learning, which includes translation. </p> <h3>Watch the Video (Also on <a href="https://tilvids.com/w/8DL2nGZjfv3h62ormxB6cW">Peertube</a>)</h3> <figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper"> </div></figure> <h3>Listen on the Thundercast!</h3> <pre></pre> <h3>Our Next State of the Thunder</h3> <p>Anxious to know the rest of the top 20 Mozilla Connect posts? Join us on Tuesday, September 16 at 3 PM Pacific (22:00 UTC)! Find out how to join on the <a href="https://thunderbird.topicbox.com/groups/planning/">TB Planning mailing list</a>. We think this will be a great season and who knows, by the end of it, we may even have a jingle. See you next time!</p><p>The post <a href="https://blog.thunderbird.net/2025/09/state-of-the-thunder-mozilla-connect-updates/">State of the Thunder: Mozilla Connect Updates</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Thu, 11 Sep 2025 19:20:10 +0000</pubDate> <dc:creator>Monica Ayhens-Madon</dc:creator></item><item> <title>The Rust Programming Language Blog: Rust compiler performance survey 2025 results</title> <guid isPermaLink="true">https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/</guid> <link>https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/</link> <description><p>Two months ago, we launched the first <a href="https://blog.rust-lang.org/2025/06/16/rust-compiler-performance-survey-2025">Rust Compiler Performance Survey</a>, with the goal of helping us understand the biggest pain points of Rust developers related to build performance. It is clear that this topic is very important for the Rust community, as the survey received over 3 700 responses! We would like to thank everyone who participated in the survey, and especially those who described their workflows and challenges with an open answer. We plan to run this survey annually, so that we can observe long-term trends in Rust build performance and its perception.</p><p>In this post, we'll show some interesting results and insights that we got from the survey and promote work that we have already done recently or that we plan to do to improve the build performance of Rust code. If you would like to examine the complete results of the survey, you can find them <a href="https://raw.githubusercontent.com/rust-lang/surveys/main/surveys/2025/compiler-performance-survey/report/compiler-performance-2025-report.pdf">here</a>.</p><p>And now strap in, as there is a lot of data to explore! As this post is relatively long, here is an index of topics that it covers:</p><ul><li><a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#overall-satisfaction">Overall satisfaction</a></li><li><a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#important-workflows">Important workflows</a></li><li><a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#incremental-rebuilds">Incremental rebuilds</a></li><li><a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#type-checking-and-ide-performance">Type checking and IDE performance</a></li><li><a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#clean-and-ci-builds">Clean and CI builds</a></li><li><a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#debug-information">Debug information</a></li><li><a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#workarounds-for-improving-build-performance">Workarounds for improving build performance</a></li><li><a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#understanding-why-builds-are-slow">Understanding why builds are slow</a></li></ul><h3><a class="anchor" href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#overall-satisfaction"></a>Overall satisfaction</h3><p>To understand the overall sentiment, we asked our respondents to rate their satisfaction with their build performance, on a scale from 0 (worst) to 10 (best). The average rating was 6, with most people rating their experience with 7 out of 10:</p> <div> <div class="bar-chart" id="satisfaction">&lt;noscript&gt;&lt;img alt="satisfaction" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/satisfaction.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/satisfaction.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/satisfaction.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>To help us understand the overall build experience in more detail, we also analyzed all open answers (over a thousand of them) written by our respondents, to help us identify several recurring themes, which we will discuss in this post.</p><p>One thing that is clear from both the satisfaction rating and the open answers is that the build experience differs wildly across users and workflows, and it is not as clear-cut as "Rust builds are slow". We actually received many positive comments about users being happy with Rust build performance, and appreciation for it being improved vastly over the past several years to the point where it stopped being a problem.</p><p>People also liked to compare their experience with other competing technologies. For example, many people wrote that the build performance of Rust is not worse, or is even better, than what they saw with C++. On the other hand, others noted that the build performance of languages such as Go or Zig is much better than that of Rust.</p><p>While it is great to see some developers being happy with the state we have today, it is clear that many people are not so lucky, and Rust's build performance limits their productivity. Around 45% respondents who answered that they are no longer using Rust said that at least one of the reasons why they stopped were long compile times.</p><p>In our survey we received a lot of feedback pointing out real issues and challenges in several areas of build performance, which is what we will focus on in this post.</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#important-workflows"></a>Important workflows</h3><p>The challenges that Rust developers experience with build performance are not always as simple as the compiler itself being slow. There are many diverse workflows with competing trade-offs, and optimizing build performance for them might require completely different solutions. Some approaches for improving build performance can also be quite unintuitive. For example, stabilizing certain language features could help remove the need for certain build scripts or proc macros, and thus speed up compilation across the Rust ecosystem. You can watch <a href="https://www.youtube.com/watch?v=-jy4HaNEJCo">this talk</a> from RustWeek about build performance to learn more.</p><p>It is difficult to enumerate all possible build workflows, but we at least tried to ask about workflows that we assumed are common and could limit the productivity of Rust developers the most:</p> <div> <div class="matrix-chart" id="limiting-workflows">&lt;noscript&gt;&lt;img alt="limiting-workflows" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/limiting-workflows.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/limiting-workflows.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/limiting-workflows.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>We can see that all the workflows that we asked about cause significant problems to at least a fraction of the respondents, but some of them more so than others. To gain more information about the specific problems that developers face, we also asked a more detailed, follow-up question:</p> <div> <div class="matrix-chart" id="problems">&lt;noscript&gt;&lt;img alt="problems" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/problems.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/problems.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/problems.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>Based on the answers to these two questions and other experiences shared in the open answers, we identified three groups of workflows that we will discuss next:</p><ul><li>Incremental rebuilds after making a small change</li><li>Type checking using <code>cargo check</code> or with a code editor</li><li>Clean, from-scratch builds, including CI builds</li></ul><h4><a class="anchor" href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#incremental-rebuilds"></a>Incremental rebuilds</h4><p>Waiting too long for an incremental rebuild after making a small source code change was by far the most common complaint in the open answers that we received, and it was also the most common problem that respondents said they struggle with. Based on our respondents' answers, this comes down to three main bottlenecks:</p><ul><li><strong>Changes in workspaces trigger unnecessary rebuilds.</strong> If you modify a crate in a workspace that has several dependent crates and perform a rebuild, all those dependent crates will currently have to be recompiled. This can cause a lot of unnecessary work and dramatically increase the latency of rebuilds in large (or deep) workspaces. We have some ideas about how to improve this workflow, such as the <a href="https://rust-lang.github.io/rust-project-goals/2025h2/relink-dont-rebuild.html">"Relink, don't rebuild"</a> proposal, but these are currently in a very experimental stage.</li><li><strong>The linking phase is too slow.</strong> This was a very common complaint, and it is indeed a real issue, because unlike the rest of the compilation process, linking is always performed "from scratch". The Rust compiler usually delegates linking to an external/system linker, so its performance is not completely within our hands. However, we are attempting to switch to faster linkers by default. For example, the most popular target (<code>x86_64-unknown-linux-gnu</code>) will very soon switch to the <a href="https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable">LLD linker</a>, which provides significant performance wins. Long-term, it is possible that some linkers (e.g. <a href="https://github.com/davidlattimore/wild">wild</a>) will allow us to perform even linking incrementally.</li><li><strong>Incremental rebuild of a single crate is too slow.</strong> The performance of this workflow depends on the cleverness of the incremental engine of the Rust compiler. While it is already very sophisticated, there are some parts of the compilation process that are not incremental yet or that are not cached in an optimal way. For example, expansion of derive proc macros is not currently cached, although work is underway to <a href="https://github.com/rust-lang/rust/pull/145354">change that</a>.</li></ul><p>Several users have mentioned that they would like to see Rust perform hot-patching (such as the <code>subsecond</code> system used by the Dioxus UI framework or similar approaches used e.g. by the Bevy game engine). While these hot-patching systems are very exciting and can produce truly near-instant rebuild times for specialized use-cases, it should be noted that they also come with many limitations and edge-cases, and it does not seem that a solution that would allow hot-patching to work in a robust way has been found yet.</p><p>To gauge how long is the typical rebuild latency, we asked our respondents to pick a single Rust project that they work on and which causes them to struggle with build times the most, and tell us how long they have to wait for it to be rebuilt after making a code change.</p> <div> <div class="bar-chart" id="rebuild-wait-time">&lt;noscript&gt;&lt;img alt="rebuild-wait-time" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/rebuild-wait-time.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/rebuild-wait-time.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/rebuild-wait-time.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>Even though many developers do not actually experience this latency after each code change, as they consume results of type checking or inline annotations in their code editor, the fact that 55% of respondents have to wait more than ten seconds for a rebuild is far from ideal.</p><p>If we partition these results based on answers to other questions, it is clear that the rebuild times depend a lot on the size of the project:</p> <div> <div class="class" id="rebuild-wait-time-code-size">&lt;noscript&gt;&lt;img alt="rebuild-wait-time-code-size" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/rebuild-wait-time-code-size.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/rebuild-wait-time-code-size.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/rebuild-wait-time-code-size.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>And to a lesser factor also on the number of used dependencies:</p> <div> <div class="class" id="rebuild-wait-time-dep-count">&lt;noscript&gt;&lt;img alt="rebuild-wait-time-dep-count" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/rebuild-wait-time-dep-count.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/rebuild-wait-time-dep-count.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/rebuild-wait-time-dep-count.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>We would love to get to a point where the time needed to rebuild a Rust project is dependent primarily on the amount of performed code changes, rather than on the size of the codebase, but clearly we are not there yet.</p><h4><a class="anchor" href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#type-checking-and-ide-performance"></a>Type checking and IDE performance</h4><p>Approximately 60% of respondents say that they use <code>cargo</code> terminal commands to type check, build or test their code, with <code>cargo check</code> being the most commonly used command performed after each code change:</p> <div> <div class="matrix-chart" id="cargo-commands">&lt;noscript&gt;&lt;img alt="cargo-commands" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/cargo-commands.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/cargo-commands.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/cargo-commands.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>While the performance of <code>cargo check</code> does not seem to be as big of a blocker as e.g. incremental rebuilds, it also causes some pain points. One of the most common ones present in the survey responses is the fact that <code>cargo check</code> does not share the build cache with <code>cargo build</code>. This causes additional compilation to happen when you run e.g. <code>cargo check</code> several times to find all type errors, and when it succeeds, you follow up with <code>cargo build</code> to actually produce a built artifact. This workflow is an example of competing trade-offs, because sharing the build cache between these two commands by unifying them more would likely make <code>cargo check</code> itself slightly slower, which might be undesirable to some users. It is possible that we might be able to find some middle ground to improve the status quo though. You can follow updates to this work in <a href="https://github.com/rust-lang/cargo/issues/3501">this issue</a>.</p><p>A related aspect is the latency of type checking in code editors and IDEs. Around 87% of respondents say that they use inline annotations in their editor as the primary mechanism of inspecting compiler errors, and around 33% of them consider waiting for these annotations to be a big blocker. In the open answers, we also received many reports of Rust Analyzer's performance and memory usage being a limiting factor.</p><p>The maintainers of Rust Analyzer are working hard on improving its performance. Its caching system is <a href="https://www.youtube.com/watch?v=tn6qwhMNBJo">being improved</a> to reduce analysis latency, the distributed builds of the editor are now <a href="https://github.com/rust-lang/rust-analyzer/pull/19582">optimized with PGO</a>, which provided 15-20% performance wins, and work is underway to integrate the compiler's <a href="https://github.com/rust-lang/rust-analyzer/pull/20329">new trait solver</a> into Rust Analyzer, which could eventually also result in increased performance.</p><p>More than 35% users said that they consider the IDE and Cargo <a href="https://github.com/rust-lang/cargo/issues/4282">blocking one another</a> to be a big problem. There is an existing workaround for this, where you can configure Rust Analyzer to use a different target directory than Cargo, at the cost of increased disk space usage. We realized that this workaround has not been documented in a very visible way, so we added it to the <a href="https://rust-analyzer.github.io/book/faq.html#rust-analyzer-and-cargo-compete-over-the-build-lock">FAQ section</a> of the Rust Analyzer book.</p><h4><a class="anchor" href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#clean-and-ci-builds"></a>Clean and CI builds</h4><p>Around 20% of participants responded that clean builds are a significant blocker for them. In order to improve their performance, you can try a recently introduced experimental Cargo and compiler option called <a href="https://blog.rust-lang.org/inside-rust/2025/07/15/call-for-testing-hint-mostly-unused"><code>hint-mostly-unused</code></a>, which can in certain situations help improve the performance of clean builds, particularly if your dependencies contain a lot of code that might not actually be used by your crate(s).</p><p>One area where clean builds might happen often is Continuous Integration (CI). 1495 respondents said that they use CI to build Rust code, and around 25% of them consider its performance to be a big blocker for them. However, almost 36% of respondents who consider CI build performance to be a big issue said that they do not use any caching in CI, which we found surprising. One explanation might be that the generated artifacts (the <code>target</code> directory) is too large for effective caching, and runs into usage limits of CI providers, which is something that we saw mentioned repeatedly in the open answers section. We have recently introduced an experimental Cargo and compiler option called <a href="https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#no-embed-metadata"><code>-Zembed-metadata</code></a> that is designed to reduce the size of the <code>target</code> directories, and work is also underway to regularly <a href="https://github.com/rust-lang/cargo/issues/13136">garbage collect</a> them. This might help with the disk space usage issue somewhat in the future.</p><p>One additional way to significantly reduce disk usage is to reduce the amount of generated debug information, which brings us to the next section.</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#debug-information"></a>Debug information</h3><p>The default Cargo <code>dev</code> profile generates full debug information (debuginfo) both for workspace crates and also all dependencies. This enables stepping through code with a debugger, but it also increases disk usage of the <code>target</code> directory, and crucially it makes compilation and linking slower. This effect can be quite large, as our benchmarks show a possible improvement of <a href="https://perf.rust-lang.org/compare.html?start=0d0f4eac8b98133e5da6d3604d86a8f3b5a67844&amp;end=71ea9a0cacc3473c7b6852c17453259f74635c62&amp;stat=cycles%3Au&amp;doc=false&amp;check=false&amp;opt=false">2-30% in cycle counts</a> if we reduce the debuginfo level to <code>line-tables-only</code> (which only generates enough debuginfo for backtraces to work), and the improvements are <a href="https://perf.rust-lang.org/compare.html?start=bea625f3275e3c897dc965ed97a1d19ef7831f01&amp;end=87c3e1ecd699573f7cb4c9074b8727956bd37a74&amp;stat=cycles%3Au&amp;check=false&amp;opt=false&amp;doc=false">even larger</a> if we disable debuginfo generation completely<sup class="footnote-reference" id="fr-lld-1"><a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#fn-lld">1</a></sup>.</p><p>However, if Rust developers debug their code after most builds, then this cost might be justified. We thus asked them how often they use a debugger to debug their Rust code:</p> <div> <div class="bar-chart" id="debugger">&lt;noscript&gt;&lt;img alt="debugger" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/debugger.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/debugger.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/debugger.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>Based on these results, it seems that the respondents of our survey do not actually use a debugger all that much<sup class="footnote-reference" id="fr-why-not-debug-1"><a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#fn-why-not-debug">2</a></sup>.</p><p>However, when we asked people if they require debuginfo to be generated by default, the responses were much less clear-cut:</p> <div> <div class="bar-chart" id="required-debuginfo">&lt;noscript&gt;&lt;img alt="required-debuginfo" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/required-debuginfo.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/required-debuginfo.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/required-debuginfo.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>This is the problem with changing defaults: it is challenging to improve the workflows of one user without regressing the workflow of another. For completeness, here are the answers to the previous question partitioned on the answer to the "How often do you use a debugger" question:</p> <div> <div class="class" id="required-debuginfo-debugger">&lt;noscript&gt;&lt;img alt="required-debuginfo-debugger" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/required-debuginfo-debugger.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/required-debuginfo-debugger.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/required-debuginfo-debugger.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>It was surprising for us to see that around a quarter of respondents who (almost) never use a debugger still want to have full debuginfo generated by default.</p><p>Of course, you can always disable debuginfo manually to improve your build performance, but not everyone knows about that option, and defaults matter a lot. The Cargo team is <a href="https://github.com/rust-lang/cargo/issues/15931">considering</a> ways of changing the status quo, for example by reducing the level of generated debug information in the <code>dev</code> profile, and introducing a new built-in profile designed for debugging.</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#workarounds-for-improving-build-performance"></a>Workarounds for improving build performance</h3><p>Build performance of Rust is affected by many different aspects, including the configuration of the build system (usually Cargo) and the Rust compiler, but also the organization of Rust crates and used source code patterns. There are thus several approaches that can be used to improve build performance by either using different configuration options or restructuring source code. We asked our respondents if they are even aware of such possibilities, whether they have tried them and how effective they were:</p> <div> <div class="matrix-chart" id="compile-time-improvement-mechanisms">&lt;noscript&gt;&lt;img alt="compile-time-improvement-mechanisms" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/compile-time-improvement-mechanisms.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/compile-time-improvement-mechanisms.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/compile-time-improvement-mechanisms.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>It seems that the most popular (and effective) mechanisms for improving build performance are reducing the number of dependencies and their activated features, and splitting larger crates into smaller crates. The most common way of improving build performance without making source code changes seems to be the usage of an alternative linker. It seems that especially the mold and LLD linkers are very popular:</p> <div> <div class="bar-chart" id="alternative-linker">&lt;noscript&gt;&lt;img alt="alternative-linker" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/alternative-linker.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/alternative-linker.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/alternative-linker.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/alternative-linker-wordcloud.png" target="_href_" title="Download open answers as wordcloud PNG">Wordcloud of open answers</a>]</span> </div></div> <p>We have good news here! The most popular <code>x86_64-unknown-linux-gnu</code> Linux target will start using the LLD linker in the next Rust stable release, resulting in faster link times <em>by default</em>. Over time, we will be able to evaluate how disruptive is this change to the overall Rust ecosystem, and whether we could e.g. switch to a different (even faster) linker.</p><h4><a class="anchor" href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#build-performance-guide"></a>Build performance guide</h4><p>We were surprised by the relatively large number of users who were unaware of some approaches for improving compilation times, in particular those that are very easy to try and typically do not require source code changes (such as reducing debuginfo or using a different linker or a codegen backend). Furthermore, almost 42% of respondents have not tried to use <em>any</em> mechanism for improving build performance whatsoever. While this is not totally unexpected, as some of these mechanisms require using the nightly toolchain or making non-trivial changes to source code, we think that one the reasons is also simply that Rust developers might not know about these mechanisms being available. In the open answers, several people also noted that they would appreciate if there was some sort of official guidance from the Rust Project about such mechanisms for improving compile times.</p><p>It should be noted that the mechanisms that we asked about are in fact workarounds that present various trade-offs, and these should always be carefully considered. Several people have expressed dissatisfaction with some of these workarounds in the open answers, as they find it unacceptable to modify their code (which could sometimes result e.g. in increased maintenance costs or worse runtime performance) just to achieve reasonable compile times. Nevertheless, these workarounds can still be incredibly useful in some cases.</p><p>The feedback that we received shows that it might be beneficial to spread awareness of these mechanisms in the Rust community more, as some of them can make a really large difference in build performance, but also to candidly explain the trade-offs that they introduce. Even though several great resources that cover this topic already exist online, we decided to create an <a href="https://github.com/rust-lang/cargo/pull/15924">official guide</a> for optimizing build performance (currently work-in-progress), which will likely be hosted in the <a href="https://doc.rust-lang.org/cargo">Cargo book</a>. The aim of this guide is to increase the awareness of various mechanisms for improving build performance, and also provide a framework for evaluating their trade-offs.</p><p>Our long-standing goal is to make compilation so fast that similar workarounds will not be necessary anymore for the vast majority of use-cases. However, there is no free lunch, and the combination of Rust's strong type system guarantees, its compilation model and also heavy focus on runtime performance often go against very fast (re)build performance, and might require usage of at least some workarounds. We hope that this guide will help Rust developers learn about them and evaluate them for their specific use-case.</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#understanding-why-builds-are-slow"></a>Understanding why builds are slow</h3><p>When Rust developers experience slow builds, it can be challenging to identify where exactly is the compilation process spending time, and what could be the bottleneck. It seems that only very few Rust developers leverage tools for profiling their builds:</p> <div> <div class="matrix-chart" id="profiling-tools">&lt;noscript&gt;&lt;img alt="profiling-tools" src="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/profiling-tools.png" /&gt;&lt;/noscript&gt;</div> <div style="display: flex; margin-bottom: 10px;"> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/profiling-tools.png" target="_href_" title="Download chart as PNG">PNG</a>]</span> <span>[<a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/profiling-tools.svg" target="_href_" title="Download chart as SVG">SVG</a>]</span> </div></div> <p>This hardly comes as a surprise. There are currently not that many ways of intuitively understanding the performance characteristics of Cargo and <code>rustc</code>. Some tools offer only a limited amount of information (e.g. <code>cargo build --timings</code>), and the output of others (e.g. <code>-Zself-profile</code>) is very hard to interpret without knowledge of the compiler internals.</p><p>To slightly improve this situation, we have recently added support for displaying <a href="https://github.com/rust-lang/cargo/pull/15923">link times</a> to the <code>cargo build --timings</code> output, to provide more information about the possible bottleneck in crate compilation (note this feature has not been stabilized yet).</p><p>Long-term, it would be great to have tooling that could help Rust developers diagnose compilation bottlenecks in their crates without them having to understand how the compiler works. For example, it could help answer questions such as "Which code had to be recompiled after a given source change" or "Which (proc) macros take the longest time to expand or produce the largest output", and ideally even offer some actionable suggestions. We plan to work on such tooling, but it will take time to manifest.</p><p>One approach that could help Rust compiler contributors understand why are Rust (re)builds slow "in the wild" is the opt-in <a href="https://rust-lang.github.io/rust-project-goals/2025h1/metrics-initiative.html">compilation metrics collection initiative</a>.</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#what-s-next"></a>What's next</h3><p>There are more interesting things in the survey results, for example how do answers to selected questions differ based on the used operating system. You can examine the full results in the <a href="https://raw.githubusercontent.com/rust-lang/surveys/main/surveys/2025/compiler-performance-survey/report/compiler-performance-2025-report.pdf">full report PDF</a>.</p><p>We would like to thank once more everyone who has participated in our survey. It helped us understand which workflows are the most painful for Rust developers, and especially the open answers provided several great suggestions that we tried to act upon.</p><p>Even though the Rust compiler is getting increasingly faster every year, we understand that many Rust developers require truly significant improvements to improve their productivity, rather than "just" incremental performance wins. Our goal for the future is to finally stabilize long-standing initiatives that could improve build performance a lot, such as the <a href="https://rust-lang.github.io/rust-project-goals/2025h2/production-ready-cranelift.html">Cranelift codegen backend</a> or the <a href="https://rust-lang.github.io/rust-project-goals/2025h2/parallel-front-end.html">parallel compiler frontend</a>. One such initiative (using a <a href="https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable">faster linker by default</a>) will finally land soon, but the fact that it took many years shows how difficult it is to make such large cutting changes to the compilation process.</p><p>There are other ambitious ideas for reducing (re)build times, such as <a href="https://rust-lang.github.io/rust-project-goals/2025h2/relink-dont-rebuild.html">avoiding unnecessary workspace rebuilds</a> or e.g. using some form of <a href="https://github.com/davidlattimore/wild">incremental linking</a>, but these will require a lot of work and design discussions.</p><p>We know that some people are wondering why it takes so much time to achieve progress in improving the build performance of Rust. The answer is relatively simple. These changes require a lot of work, domain knowledge (that takes a relatively long time to acquire) and many discussions and code reviews, and the pool of people that have time and motivation to work on them or review these changes is very limited. Current compiler maintainers and contributors (many of whom work on the compiler as volunteers, without any funding) work very hard to keep up with maintaining the compiler and keeping it working with the high-quality bar that Rust developers expect, across many targets, platforms and operating systems. Introducing large structural changes, which are likely needed to reach massive performance improvements, would require a lot of concentrated effort and funding.</p> <section class="footnotes"><ol class="footnotes-list"><li id="fn-lld"><p>This benchmark was already performed using the fast LLD linker. If a slower linker was used, the build time wins would likely be even larger. <a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#fr-lld-1">↩</a></p></li><li id="fn-why-not-debug"><p>Potentially because of the strong invariants upheld by the Rust type system, and partly also because the Rust debugging experience might not be optimal for many users, which is a feedback that we received in the <a href="https://blog.rust-lang.org/2025/02/13/2024-State-Of-Rust-Survey-results/#challenges">State of Rust 2024 survey</a>. <a href="https://blog.rust-lang.org/2025/09/10/rust-compiler-performance-survey-2025-results/#fr-why-not-debug-1">↩</a></p></li></ol></section></description> <pubDate>Wed, 10 Sep 2025 00:00:00 +0000</pubDate> <dc:creator>Jakub Beránek</dc:creator></item><item> <title>Mozilla Open Policy & Advocacy Blog: Mozilla Meetup: “The Future of Competition: How to Save the Open Web”</title> <guid isPermaLink="false">https://blog.mozilla.org/netpolicy/?p=2501</guid> <link>https://blog.mozilla.org/netpolicy/2025/09/09/mozilla-meetup-the-future-of-competition-how-to-save-the-open-web/</link> <description><p>The promise of an open and competitive internet hangs in the balance. From the future of AI agents to the underappreciated role of browsers and browser engines, the technological landscape continues to evolve. Getting the regulatory and enforcement backdrop right is critical: from competition bills in Congress to the EU’s DMA, the stakes for innovation, privacy and consumer choice have never been higher.</p><p><br /><br /><br /></p><p>The post <a href="https://blog.mozilla.org/netpolicy/2025/09/09/mozilla-meetup-the-future-of-competition-how-to-save-the-open-web/">Mozilla Meetup: “The Future of Competition: How to Save the Open Web”</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p></description> <pubDate>Tue, 09 Sep 2025 14:10:03 +0000</pubDate> <dc:creator>Jenn Taylor Hodges</dc:creator></item><item> <title>Wladimir Palant: A look at a P2P camera (LookCam app)</title> <guid isPermaLink="true">https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/</guid> <link>https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/</link> <description><p>I’ve got my hands on an internet-connected camera and decided to take a closer look, having already read about security issues with similar cameras. What I found far exceeded my expectations: fake access controls, bogus protocol encryption, completely unprotected cloud uploads and firmware riddled with security flaws. One could even say that these cameras are Murphy’s Law turned solid: everything that could be done wrong has been done wrong here. While there is considerable prior research on these and similar cameras that outlines some of the flaws, I felt that the combination of severe flaws is reason enough to publish an article of my own.</p><p>My findings should apply to any camera that can be managed via the LookCam app. This includes cameras meant to be used with less popular apps of the same developer: tcam, CloudWayCam, VDP, AIBoxcam, IP System. Note that the LookCamPro app, while visually very similar, is technically quite different. It also uses the PPPP protocol for low-level communication but otherwise doesn’t seem to be related, and the corresponding devices are unlikely to suffer from the same flaws.</p><figure><img alt="A graphic with the LookCam logo in the middle. Around it are arranged five devices with the respective camera locations marked: a radio clock, a power outlet, a light switch, a USB charger, a bulb socket." class="article-image" height="423" src="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/devices.jpg" width="600" /></figure> <p>There seems to be little chance that things will improve with these cameras. I have no way of contacting either the hardware vendors or the developers behind the LookCam app. In fact, it looks like masking their identity was done on purpose here. But even if I could contact them, the cameras lack an update mechanism for their firmware. So fixing the devices already sold is impossible.</p><p>I have no way of knowing how many of these cameras exist. The LookCam app is currently listed with almost 1.5 million downloads on Google Play however. An iPhone and a Windows version of the app are also available but no public statistics exist here.</p><div id="tocBox"> <h5>Contents</h5> <nav id="TableOfContents"> <ul> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#the-highlights">The highlights</a></li> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#the-hardware">The hardware</a></li> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#the-lookcam-app">The LookCam app</a></li> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#the-pppp-protocol">The PPPP protocol</a> <ul> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#the-basics">The basics</a></li> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#the-encryption">The “encryption”</a></li> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#the-threat-model">The threat model</a></li> </ul> </li> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#the-firmware">The firmware</a></li> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#the-cloud">The cloud</a></li> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#how-safe-are-device-ids">How safe are device IDs?</a></li> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#recommendations">Recommendations</a></li> <li><a href="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/#further-reading">Further reading</a></li> </ul></nav></div> <h3>The highlights</h3><p>The camera cannot be easily isolated from unauthorized access. It can either function as a WiFi access point, but setting a WiFi password isn’t possible. Or it can connect to an existing network, and then it will insist on being connected to the internet. If internet access is removed the camera will go into a reboot loop. So you have the choice of letting anybody in the vicinity access this camera or allowing it to be accessed from the internet.</p><p>The communication of this camera is largely unencrypted. The underlying PPPP protocol supports “encryption” which is better described as obfuscation, but the LookCam app almost never makes use of it. Not that it would be of much help, the proprietary encryption algorithms being developed without any understanding of cryptography. These rely on static encryption keys which are trivially extracted from the app but should be easy enough to deduce even from merely observing some traffic.</p><p>The camera firmware is riddled with buffer overflow issues which should be trivial to turn into arbitrary code execution. Protection mechanisms like DEP or ASLR might have been a hurdle but these are disabled. And while the app allows you to set an access password, the firmware doesn’t really enforce it. So access without knowing the password can be accomplished simply by modifying the app to skip the password checks.</p><p>The only thing preventing complete compromise of any camera is the “secret” device ID which has to be known in order to establish a connection. And by “secret” I mean that device IDs can generally be enumerated but they are “secured” with a five letter verification code. Unlike with some similar cameras, the algorithm used to generate the verification code isn’t public knowledge yet. So somebody wishing to compromise as many cameras as possible would need to either guess the algorithm or guess the verification codes by trying out all possible combinations. I suspect that both approaches are viable.</p><p>And while the devices themselves have access passwords which a future firmware version could in theory start verifying, the corresponding cloud service has no authentication beyond knowledge of the device ID. So any recordings uploaded to the cloud are accessible even if the device itself isn’t. Even if the camera owner hasn’t paid for the cloud service, anyone could book it for them if they know the device ID. The cloud configuration is managed by the server, so making the camera upload its recordings doesn’t require device access.</p><h3>The hardware</h3><p>Most cameras connecting to the LookCam app are being marketed as “spy cam” or “nanny cam.” These are made to look like radio clocks, USB chargers, bulb sockets, smoke detectors, even wall outlets. Most of the time their pretended functionality really works. In addition they have an almost invisible pinhole camera that can create remarkably good recordings. I’ve seen prices ranging from US$40 to hundreds of dollars.</p><p>The marketing spin says that these cameras are meant to detect when your house is being robbed. Or maybe they allow you to observe your baby while it is in the next room. Of course, in reality people are far more inventive in their use of tiny cameras. Students <a href="https://theconversation.com/students-are-using-smart-spy-technology-to-cheat-in-exams-59241">discovered them for cheating in exams</a>. Gamblers use them to <a href="https://www.wired.com/story/miniature-camera-poker-cheating/">get an advantage at card games</a>. And then there is of course the matter of non-consentual video recordings. So next time you stay somewhere where you don’t quite trust the host you might want to search for “LookCam” on YouTube, just to get an idea of how to recognize such devices.</p><p>The camera I had was based on the <a href="http://anyka.net/en/productInfo.aspx?id=123">Anyka AK39Ev330 hardware platform</a>, essentially an ARM CPU with an attached pinhole camera. Presumably, other cameras connecting to the LookCam app are similar, even though there are some provisions for hardware differences in the firmware. The device looked very convincing, its main giveaway being unexpected heat development.</p><p>All LookCam cameras I’ve seen were strictly noname devices, it is unclear who builds them. Given the variety of competing form factors I suspect that a number of hardware vendors are involved. Maybe there is one vendor producing the raw camera kit and several others who package it within the respective casings.</p><h3>The LookCam app</h3><p>The LookCam app can manage a number of cameras. Some people demonstrating the app on YouTube had around 50 of them, though I suspect that these are camera sellers and not regular users.</p><figure><img alt="App screenshot, a screen titled “My Device.” It lists a number of cameras with stills on the left side. The cameras are titled something like G000001NRLXW. At the bottom of the screen are the options Video (selected), Photo, Files and More." class="article-image" height="480" src="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/screenshot.png" width="240" />&lt;figcaption&gt;LookCam app as seen in the example screenshot&lt;/figcaption&gt;</figure> <p>While each camera can be given a custom name, its unique ID is always visible as well. For example, the first camera listed in the screenshot above has the ID GHBB-000001-NRLXW which the apps shortens into G000001NRLXW. Here GHBB is the device prefix: LookCam supports a number of these but only BHCC, FHBB and GHBB seem to exist in reality (abbreviated as B, F and G respectively). 000001 is the device number, each prefix can theoretically support a million devices. The final part is a five-letter verification code: NRLXW. This one has to be known for the device connection to succeed, it makes enumerating device IDs more difficult.</p><p>Out of the box, the device is in access point mode: it provides a WiFi access point with the device ID used as wireless network name. You can connect to that access point, and LookCam will be able to find the camera via a network broadcast, allowing you to configure it. You might be inclined to leave the camera in access point mode but it is impossible to set a WiFi password. This means that anybody in the vicinity can connect to this WiFi network and access the camera through it. So there is no way around configuring the camera to connect to your network.</p><p>Once the camera is connected to your network the P2P “magic” happens. LookCam app can still find the camera via a network broadcast. But it can also establish a connection when you are not on the same network. In other words: the camera can be accessed from the internet, assuming that someone knows its device ID.</p><p>Exposing the camera to internet-based attacks might not be something that you want, with it being in principle perfectly capable of writing its recordings to an SD card. But if you deny it access to the internet (e.g. via a firewall rule) the camera will try to contact its server, fail, panic and reboot. It will keep rebooting until it receives a response from the server.</p><p>One thing to note is also: the device ID is displayed in pretty much every screen of this app. So when users share screenshots or videos of the app (which they do often) they will inevitably expose the ID of their camera, allowing anyone in the world to connect to it. I’ve seen very few cases of people censoring the device ID, clearly most of them aren’t aware that it is sensitive information. The LookCam app definitely isn’t communicating that it is.</p><h3>The PPPP protocol</h3><h4>The basics</h4><p>How can LookCam establish a connection to the camera having only its device ID? The app uses the PPPP protocol developed by the Chinese company CS2 Network. Supposedly, in 2019 CS2 Network had 300 customers with 20 million devices in total. This company supplies its customers with a code library and the corresponding server code which the customers can run as a black box. The idea of the protocol is providing an equivalent of the TCP protocol which implicitly locates a device by its ID and connects to it.</p><figure><img alt="Screenshot of a presentation slide divided in two with TCP on the left and P2P on the right. Left side shows the calls to establish a TCP connection and write data, right side equivalent function calls with PPC_ prefix" class="article-image" height="267" src="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/slide_tcp_p2p.png" width="475" />&lt;figcaption&gt;Slide from a CS2 Network sales pitch&lt;/figcaption&gt;</figure> <p><em>Side note</em>: Whoever designed this protocol didn’t really understand TCP. For example, they tried to replicate the fault tolerance of TCP. But instead of making retransmissions an underlying protocol feature there are dozens of different (not duplicated but really different) retransmission loops throughout the library. Where TCP tries to detect network congestions and back off the PPPP protocol will send even more retransmitted messages, rendering suboptimal connections completely unusable.</p><p>Despite being marketed as Peer-to-Peer (P2P) this protocol relies on centralized servers. Each device prefix is associated with a set of three servers, this being the protocol designers’ idea of high-availability infrastructure. Devices regularly send messages to all three servers, making sure that these are aware of the device’s IP address. When the LookCam app (client) wants to connect to a device, it also contacts all three servers to get the device’s IP address.</p><figure><img alt="Screenshot of a presentation slide titled “High Availability Architecture.” The text says: Redundant P2P Servers, Flexible and Expandable Relay Servers" class="article-image" height="209" src="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/slide_high_availability.png" width="362" />&lt;figcaption&gt;Slide from a CS2 Network sales pitch&lt;/figcaption&gt;</figure> <p>The P2P part is the fact that device and client try to establish a direct connection instead of relaying all communication via a central server. The complicating factor here are firewalls which usually disallow direct connections. The developers didn’t like established approaches like <a href="https://en.wikipedia.org/wiki/Universal_Plug_and_Play">Universal Plug and Play (UPnP)</a>, probably because these are often disabled for security reasons. So they used a trick called <a href="https://en.wikipedia.org/wiki/UDP_hole_punching">UDP hole punching</a>. This involves guessing which port the firewall assigned to outgoing UDP traffic and then communicating with that port, so that the firewall considers incoming packets a response to previously sent UDP packets and allows them through.</p><p>Does that always work? That’s doubtful. So the PPPP protocol allows for relay servers to be used as fallback, forwarding traffic from and to the device. But this direct communication presumably succeeds often enough to keep the traffic on PPPP servers low, saving costs.</p><p>The FHBB and GHBB device prefixes are handled by the same set of servers, named the “mykj” network in the LookCam app internally. Same string appears in the name of the main class as well, indicating that it likely refers to the company developing the app. This seems to be a short form of “Meiyuan Keji,” a company name that translates as “Dollar Technology.” I couldn’t find any further information on this company however.</p><p>The BHCC device prefix is handled by a different set of servers that the app calls the “hekai” network. The corresponding devices appear to be marketed in China only.</p><h4>The “encryption”</h4><p>With potentially very sensitive data being transmitted one would hope that the data is safely encrypted in transit. The TCP protocol outsources this task to additional layers like TLS. The PPPP protocol on the other hand has built-in “encryption,” in fact even two different encryption mechanisms.</p><p>First there is the blanket encryption of all transmitted messages. The corresponding function is aptly named <code>P2P_Proprietary_Encrypt</code> and it is in fact a very proprietary encryption algorithm. To my untrained eye there are a few issues with it:</p><ul><li>It is optional, with many networks choosing not to use it (like all networks supported by LookCam).</li><li>When present, the encryption key is part of the “init string” which is hardcoded in the app. It is trivial to extract from the application, even a file viewer will do if you know what to look for.</li><li>Even if the encryption key weren’t easily extracted, it is mashed into four bytes which become the effective key. So there are merely four billion possible keys.</li><li>Even if it weren’t possible to just go through all possible encryption keys, the algorithm can be trivially attacked via a <a href="https://en.wikipedia.org/wiki/Known-plaintext_attack">known-plaintext attack</a>. It’s sometimes even possible to deduce the effective key by passively observing a single four bytes <code>MSG_HELLO</code> message (it is known that the first four bytes message sent to port 32100 has the plaintext <code>F1 00 00 00</code>).</li></ul><p>In addition to that, some messages get special treatment. For example, the <code>MSG_REPORT_SESSION_READY</code> message is generally encrypted via <code>P2P_Proprietary_Encrypt</code> function with a key that is hardcoded in the CS2 library and has the same value in every app I checked.</p><p>Some messages employ a different encryption method. In case of the networks supported by LookCam it is only the <code>MSG_DEV_LGN_CRC</code> message (device registering with the server) that is used instead of the plaintext <code>MSG_DEV_LGN</code> message. As this message is sent by the device, the corresponding encryption key is only present in the device firmware, not in the application. I didn’t bother checking whether the server would still accept the unencrypted <code>MSG_DEV_LGN</code> message.</p><p>The encryption function responsible here is <code>PPPP_CRCEnc</code>. No, this isn’t a cyclic redundancy check (CRC). It’s rather an encryption function that will extend the plaintext by a four bytes padding. The decryptor will validate the padding, presumably that’s the reason for the name.</p><p>Of course, this still doesn’t make it an authenticated encryption scheme, yet the <a href="https://en.wikipedia.org/wiki/Padding_oracle_attack">padding oracle attack</a> is really the least of its worries. While there is a complicated selection approach, it effectively results in a sequence of bytes that the plaintext is XOR’ed with. <em>Same</em> sequence for every single message being encrypted in this way. Wikipedia has the following to say on the <a href="https://en.wikipedia.org/wiki/XOR_cipher#Use_and_security">security of XOR ciphers</a>:</p><blockquote><p>By itself, using a constant repeating key, a simple XOR cipher can trivially be broken using frequency analysis. If the content of any message can be guessed or otherwise known then the key can be revealed.</p></blockquote><p>Well, yes. That’s what we have here.</p><p>It’s doubtful that any of these encryption algorithms can deter even a barely determined attacker. But a blanket encryption with <code>P2P_Proprietary_Encrypt</code> (which LookCam doesn’t enable) would have three effects:</p><ol><li>Network traffic is obfuscated, making the contents of transmitted messages not immediately obvious.</li><li>Vulnerable devices cannot be discovered on the local network using the <a href="https://github.com/pmarrapese/iot/tree/master/p2p/lansearch">script developed by Paul Marrapese</a>. This script relies on devices responding to an unencrypted search request.</li><li>P2P servers can no longer be discovered easily and won’t show up on Shodan for example. This discovery method relies on servers responding to an unencrypted <code>MSG_HELLO</code> message.</li></ol><h4>The threat model</h4><p>It is obvious that the designers of the PPPP protocol don’t understand cryptography, yet for some reason they don’t want to use established solutions either. It cannot even be about performance because AES is supported in hardware on these devices. But why for example this strange choice of encrypting a particular message while keeping the encryption of highly private data optional? Turns out, this is due to the threat model used by the PPPP protocol designers.</p><figure><img alt="Screenshot of a presentation slide containing yellow text: Malicious hacker can make thousands of Fake Device by writing a software program (As you know, the cost may be less than 1 USD), however. It then continues with red text: It may cause thousands pcs of your product to malfunction, thus cost hundred thousands." class="article-image" height="221" src="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/slide_fake_devices.png" width="380" />&lt;figcaption&gt;Slide from a CS2 Network sales pitch&lt;/figcaption&gt;</figure> <p>As a CS2 Network presentation deck shows, their threat model isn’t concerned about data leaks. The concern is rather denial-of-service attacks caused by registering fake devices. And that’s why this one message enjoys additional encryption. Not that I really understand the concern here, since the supposed hacker would still have to generate valid device IDs somehow. And if they can do that – well, them bringing the server down should really be the least concern.</p><p>But wait, there is another security layer here!</p><figure><img alt="Screenshot of a presentation slide titled “Encrypted P2P Server IP String.” The text says: The encrypted string is given to platform owner only. Without correct string, Fake Device can’t use P2P API to reach P2P Server. The API require encrypt P2P Server IP String, but not raw IP String." class="article-image" height="281" src="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/slide_init_string.png" width="383" />&lt;figcaption&gt;Slide from a CS2 Network sales pitch&lt;/figcaption&gt;</figure> <p>This is about the “init string” already mentioned in the context of encryption keys above. It also contains the IP addresses of the servers, mildly obfuscated. While these were “given to platform owner only,” these are necessarily contained in the LookCam app:</p><figure><img alt="Screenshot of a source code listing with four fields g_hekai_init_string, g_mykj_init_string, g_ppcs_init_string, g_rtos_init_string. All four values are strings consisting of upper-case letters." class="article-image" height="132" src="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/initstrings.png" width="607" /></figure> <p>Some other apps contain dozens of such init strings, allowing them to deal with many different networks. So the threat model of the PPPP protocol cannot imagine someone extracting the “encrypted P2P server IP string” from the app. It cannot imagine someone reverse engineering the (trivial) obfuscation used here. And it definitely cannot imagine someone reverse engineering the protocol, so that they can communicate with the servers via “raw IP string” instead of their obfuscated one. <em>Note</em>: The latter has happened on several documented occasions already, e.g. <a href="https://www.elastic.co/security-labs/storm-on-the-horizon#building-a-p2p-client">here</a>.</p><p>These underlying assumptions become even more obvious on this slide:</p><figure><img alt="Screenshot of a presentation slide titled “Worry about security?” The text says: Super Device can not spy any data it Relayed (No API for this)" class="article-image" height="188" src="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/slide_spying.png" width="412" />&lt;figcaption&gt;Slide from a CS2 Network sales pitch&lt;/figcaption&gt;</figure> <p>Yes, the only imaginable way to read out network data is via the API of their library. With a threat model like this, it isn’t surprising that the protocol makes all the wrong choices security-wise.</p><h3>The firmware</h3><p>Once a connection is etablished the LookCam app and the camera will exchange JSON-encoded messages like the following:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-json"><span class="line"><span class="cl"><span class="p">{</span></span></span><span class="line"><span class="cl"> <span class="nt">"cmd"</span><span class="p">:</span> <span class="s2">"LoginDev"</span><span class="p">,</span></span></span><span class="line"><span class="cl"> <span class="nt">"pwd"</span><span class="p">:</span> <span class="s2">"123456"</span></span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>A <a href="https://www.dcs.warwick.ac.uk/~fenghao/files/hidden_camera.pdf">paper from the Warwick University</a> already took a closer look at the firmware and discovered something surprising. The LookCam app will send a <code>LoginDev</code> command like above to check whether the correct access password is being used for the device. But sending this command is entirely optional, and the firmware will happily accept other commands without a “login”!</p><p>The LookCam app will also send the access password along with every other command yet this password isn’t checked by the firmware either. I tried adding a trivial modification to the LookCam app which made it ignore the result of the <code>LoginDev</code> command. And this in fact bypassed the authentication completely, allowing me to access my camera despite a wrong password.</p><p>I could also confirm their finding that the <code>DownloadFile</code> command will read arbitrary files, allowing me to extract the firmware of my camera with the approach described in the paper. They even describe a trivial Remote Code Execution vulnerability which I also found in my firmware: that firmware often relies on running shell commands for tasks that could be easily done in its C language code.</p><p>This clearly isn’t the only Remote Code Execution vulnerability however. Here is some fairly typical code for this firmware:</p><div class="highlight"><pre class="chroma" tabindex="0"><code class="language-c"><span class="line"><span class="cl"><span class="kt">char</span><span class="p">[</span><span class="mi">256</span><span class="p">]</span> <span class="n">buf</span><span class="p">;</span></span></span><span class="line"><span class="cl"><span class="kt">char</span> <span class="o">*</span><span class="n">cmd</span> <span class="o">=</span> <span class="nf">cJSON_GetObjectItem</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="s">"cmd"</span><span class="p">)</span><span class="o">-&gt;</span><span class="n">valuestring</span><span class="p">;</span></span></span><span class="line"><span class="cl"><span class="nf">memset</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">buf</span><span class="p">));</span></span></span><span class="line"><span class="cl"><span class="nf">memcpy</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">cmd</span><span class="p">));</span></span></span></code></pre></div><p>This code copies a string (pointlessly but this isn’t the issue here). It completely fails to consider the size of the target buffer, going by the size of the incoming data instead. So any command larger than 255 bytes will cause a <a href="https://en.wikipedia.org/wiki/Buffer_overflow">buffer overflow</a>. And there is no stack canary here, Data Execution Prevention (DEP) and Address Space Layout Randomization (ASLR) are disabled, so nothing prevents this buffer overflow from being turned into Remote Code Execution.</p><p>Finally, I’ve discovered that the <code>searchWiFiList</code> command will produce the list of WiFi networks visible to the camera. These by itself often already allow a good guess as to where the camera is located. In combination with a <a href="https://developers.google.com/maps/documentation/geolocation/overview">geolocation service</a> these will typically narrow down the camera’s position to a radius of only a few dozen meters.</p><p>The only complication here: most geolocation services require not the network names but the MAC addresses of the access points. The MAC addresses aren’t part of the response data however. But: <code>searchWiFiList</code> works by running <code>iwlist</code> shell command and storing the complete output in <code>/tmp/wifi_scan.txt</code> file. It reads this file but does not remove it. This means that the file can subsequently be downloaded via <code>DownloadFile</code> command (allows reading arbitrary files as mentioned above) and that one contains full data including MAC addresses of all access points. So somebody who happened to learn the device ID can not only access the video stream but also find out where exactly this footage is being recorded.</p><p>The camera I’ve been looking at is running firmware version 2023-11-22. Is there a newer version, maybe one that fixes the password checks or the already published Remote Code Execution vulnerability? I have no idea. If the firmware for these cameras is available somewhere online then I cannot find it. I’ve also been looking for some kind of update functionality in these devices. But there is only a generic script from the Anyka SDK which isn’t usable for anyone other than maybe the hardware vendor.</p><h3>The cloud</h3><p>When looking at the firmware I noticed some code uploading 5 MiB data chunks to <code>api.l040z.com</code> (or <code>apicn.l040z.com</code> if you happen to own a <code>BHCC</code> device). Now uploading <em>exactly</em> 5 MiB is weird (this size is hardcoded) but inspecting the LookCam app confirmed it: this is cloud functionality, and the firmware regularly uploads videos in this way. At least it does that when cloud functionality is enabled.</p><p>First thing worth noting: while the cloud server uses regular HTTP rather than some exotic protocol, all connections to it are generally unencrypted. The firmware simply lacks a TLS library it could use, and so the server doesn’t bother with supporting TLS. Meaning for example: if you happen to use their cloud functionality your ISP better be very trustworthy because it can see all the data your camera sends to the LookCam cloud. In fact, your ISP could even run its own “cloud server” and the camera will happily send your recorded videos to it.</p><p>Anyone dare a guess what the app developers mean by “financial-grade encryption scheme” here? Is it worse or better than military-grade encryption?</p><figure><img alt="Screenshot containing two text sections. The section above it titled “Safe storage” and reads: The video data is stored in the cloud, even if the device is offline or lost. Can also view previous recordings. The section below is titled “Privacy double encryption” and reads: Using financial-grade encryption scheme, data is transmitted from data to Transfer data from transfer data from transfer." class="article-image" height="452" src="https://palant.info/2025/09/08/a-look-at-a-p2p-camera-lookcam-app/cloud.png" width="385" />&lt;figcaption&gt;Screenshot from the LookCam app&lt;/figcaption&gt;</figure> <p>Second interesting finding: the cloud server has no authentication whatsoever. The camera only needs to know its device ID when uploading to the cloud. And the LookCam app – well, any cloud-related requests here also require device ID only. If somebody happens to learn your device ID they will gain full access to your cloud storage.</p><p>Now you might think that you can simply skip paying for the cloud service which, depending on the package you book, can come for as much as $40 per month. But this doesn’t mean that you are on the safe side because you aren’t the one controlling the cloud functionality on your device, the cloud server is. Every time the device boots up it sends a request to <code>http://api.l040z.com/camera/signurl</code> and the response tells it whether cloud functionality needs to be enabled.</p><p>So if LookCam developers decide that they want to see what your camera is doing (or if Chinese authorities become interested in that), they can always adjust that server response and the camera will start uploading video snapshots. You won’t even notice anything because the LookCam app checks cloud configuration by requesting <code>http://api.l040z.com/app/cloudConfig</code> which can remain unchanged.</p><p>And they aren’t the only ones who can enable the cloud functionality of your device. Anybody who happens to know your device ID can buy a cloud package for it. This way they can get access to your video recordings without ever accessing your device directly. And you will only notice the cloud functionality being active if you happen to go to the corresponding tab in the LookCam app.</p><h3>How safe are device IDs?</h3><p>Now that you are aware of device IDs being highly sensitive data, you certainly won’t upload screenshots containing them to social media. Does that mean that your camera is safe because nobody other than you knows its ID?</p><p>The short answer is: you don’t know that. First of all, you simply don’t know who already has your device ID. Did the shop that sold you the camera write the ID down? Did they maybe record a sales pitch featuring your camera before they sold it to you? Did somebody notice your camera’s device ID show up in the list of WiFi networks when it was running in access point mode? Did anybody coming to your home run a <a href="https://github.com/pmarrapese/iot/tree/master/p2p/lansearch">script to discover PPPP devices on the network</a>? Yes, all of that might seem unlikely, yet it should be reason enough to wonder whether your camera’s recordings are really as private as they should be.</p><p>Then there is the issue of unencrypted data transfers. Whenever you connect to your camera from outside your home network the LookCam app will send all data unencrypted – including the device ID. Do you do that when connected to public WiFi? At work? In a vacation home? You don’t know who else is listening.</p><p>And finally there is the matter of verification codes which are the only mechanism preventing somebody from enumerating all device IDs. How difficult would it be to guess a verification code? Verification codes seem to use 22 letters (all Latin uppercase letters but A, I, O, Q). With five letters this means around 5 million possible combinations. According to Paul Marrapese <a href="https://media.defcon.org/DEF%20CON%2028/DEF%20CON%20Safe%20Mode%20presentations/DEF%20CON%20Safe%20Mode%20-%20Paul%20Marrapese%20-%20Abusing%20P2P%20to%20Hack%203%20Million%20Cameras%20Ain%27t%20Nobody%20Got%20Time%20for%20NAT.pdf">PPPP servers don’t implement rate limiting</a> (page 33), making trying out all these combinations perfectly realistic – maybe not for all possible device IDs but definitely for some.</p><p>But that resource-intensive approach is only necessary as long as the algorithm used to generate verification codes is a secret. Yet we have to assume that at least CS2 Network’s 300 customers have access to that algorithm, given that their server software somehow validates device IDs. Are they all trustworthy? How much would it cost to become a “customer” simply in order to learn that algorithm?</p><p>And even if we are willing to assume that CS2 Network runs proper background checks to ensure that their algorithm remains a secret: how difficult would it be to guess that algorithm? I found a number of device IDs online, and my primitive analysis of their verification codes indicates that these aren’t distributed equally. There is a noticeable affinity for certain prime numbers, so the algorithm behind them is likely a similar hack job as the other CS2 Network algorithms, throwing in mathematical operations and table lookups semi-randomly to make things look complicated. How long would this approach hold if somebody with actual cryptanalysis knowledge decided to figure this out?</p><h3>Recommendations</h3><p>So if you happen to own one of these cameras, what does all this mean to you? Even if you never disclosed the camera’s device ID yourself, you cannot rely on it staying a secret. And this means that whatever your camera is recording is no longer private.</p><p>Are you using it as a security camera? Your security camera might now inform potential thieves of the stuff that you have standing around and the times when you leave home. It will also let them know where exactly you live.</p><p>Are you using it to keep an eye on your child? Just… don’t. Even if you think that you yourself have a right to violate your child’s privacy, you really don’t want anybody else to watch.</p><p>And even if you “have nothing to hide”: somebody could compromise the camera in order to hack other devices on your network or to simply make it part of a botnet. Such things <a href="https://www.bleepingcomputer.com/news/security/hackers-target-critical-zero-day-vulnerability-in-ptz-cameras/">happened before</a>, many times actually.</p><p>So the best solution is to dispose of this camera ASAP. Don’t sell it please because this only moves the problem to the next person. The main question is: how do you know that the camera you get instead will do better? I can only think of one indicator: if you want to access the camera from outside your network it should involve explicit setup steps, likely changing router configuration. The camera shouldn’t just expose itself to the internet automatically.</p><p>But if you actually paid hundreds of dollars for that camera and dumping it isn’t an option: running it in a safe manner is complicated. As I mentioned already, simply blocking internet access for the camera won’t work. This can be worked around but it’s complex enough to be not worth doing. You should be better off by installing a <a href="https://github.com/Nemobi/Anyka/">custom firmware</a>. I haven’t tried it but at least this one looks like somebody actually thought about security.</p><h3>Further reading</h3><p>As far as I am aware, the first research on the PPPP protocol was <a href="https://hacked.camera/">published by Paul Marrapese in 2019</a>. He found a number of vulnerabilities, including one brand of cameras shipping their algorithm to generate verification codes with their client application. Knowing this algorithm, device IDs could be enumerated easily. Paul used this flaw to display the locations of millions of affected devices. His DEF CON talk is linked from the website and well worth watching.</p><p><strong>Edit</strong> (2025-09-15): I was wrong, there is at the very least <a href="https://www.slideshare.net/slideshow/iot-security-is-a-nightmare-but-what-is-the-real-risk/65213457">this early analysis of the protocol by Zoltán Balázs (2016)</a> (starting at page 29) and <a href="https://pierrekim.github.io/blog/2017-03-08-camera-goahead-0day.html">some research into a particular brand of PPPP-based cameras by Pierre Kim (2017)</a>.</p><p>A <a href="https://www.dcs.warwick.ac.uk/~fenghao/files/hidden_camera.pdf">paper from the Warwick University (2023)</a> researched LookCam app specifically. In additions to some vulnerabilities I mentioned here it contains a number of details on how these cameras operate.</p><p>This <a href="https://www.elastic.co/security-labs/storm-on-the-horizon">Elastic Labs article (2024)</a> took a close look at some other PPPP-based cameras, finding a number of issues.</p><p>The <a href="https://prezi.com/5cztk-98izyc/cs2-network-p2p/">CS2 Network sales presentation (2016)</a> offers a fascinating look into the thinking of PPPP protocol designers and into how their system was meant to work.</p></description> <pubDate>Mon, 08 Sep 2025 13:00:50 +0000</pubDate></item><item> <title>Mozilla Thunderbird: VIDEO: Thunderbird Accessibility Study</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3769</guid> <link>https://blog.thunderbird.net/2025/09/video-thunderbird-accessibility-study/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2025/09/blog-banner-community-hours1-768x432.jpg" width="640" /></p><p>Welcome back to another edition of the Community Office Hours! This month, we’re taking a closer look at accessibility in the Thunderbird desktop and mobile apps. We’re chatting with Rebecca Taylor and Solange Valverde, members of our designer, about a recent accessibility (often shortened as a11y) study. We wanted to find out where Thunderbird was doing well, and where we could improve. Rebecca and Solange walk us through the study and answer our questions!</p> <p>We’ll be back next month with the latest Community Office Hours! If you have a suggestion for a topic or team you’d love us to cover, please let us know in the comments!</p> <h3>August Office Hours: Thunderbird Accessibility Study</h3> <p>The Thunderbird Team wants to make desktop and mobile apps that maximizes everyone’s productivity and freedom. This means making Thunderbird accessible for all of our users, and the first step is finding where we can do better. Thanks to our relationship with Mozilla, our design team commissioned a study with <a href="https://makeitfable.com/">Fable</a>, who connects companies building inclusive products to experienced testers with disabilities. We asked participants to evaluate the Thunderbird desktop app using assistive tech, including screen readers, alternative navigation, and magnification. And we also asked a user on the cognitive spectrum to evaluate how our language, layouts, and reminders helped or hindered their use of the app.</p> <p>Members of the design team then conducted 60 minute moderated interviews with study participants. In these talks, participants pointed out where they struggled with accessibility roadblocks, and what strategies they used to try and work through them. </p> <h3>Screen Reader Users</h3> <p>Screen readers convert on-screen text to either speech or Braille, and help blind or low-vision users navigate and access digital content. Our study participants, many of whom switch between multiple screen readers, let us know where Thunderbird falls short.</p> <p>Some issues were common to all screen readers. Keyboard shortcuts didn’t follow common norms, and workflows in search and filter results made for a confusing experience. Thunderbird could benefit from a table view with <a href="https://www.a11yproject.com/posts/getting-started-aria/">ARIA</a>, a W3C specification created to improve accessibility. </p> <p>Other issues were specific to the individual screen reader programs. In Narrator, for example, expected confirmation for actions like moving messages was missing, and the screen reader didn’t recognize menu stage changes in submenus. In JAWS, meanwhile, message bodies were unreadable in email and compose windows with Braille display, and filter menus opened silently, not announcing the content or state to the user. Finally, with NVDA, users noted confusing structures and organization that lacked the structure and context they expected, as well as poor content prioritization.</p> <h3>Cognitive Usability</h3> <p>In a previous office hours, we talked about how we wanted to make Thunderbird more cognitively accessible with our work on the <a href="https://blog.thunderbird.net/2024/01/january-2024-thunderbird-community-office-hours-how-to-join-us/">Message Context Menu</a>. Cognition relates to how we think, learn, understand, remember, and pay attention, and clear language, regular layouts, and meaningful reminders all improve cognitive accessibility. Our cognitive accessibility tester expressed concerns about a lack of a quick, non-technical setup, imbalances in our whitespace, and unpredictable layout controls, among other issues.</p> <h3>Alternative Navigation and Magnification</h3> <p>Our alternative navigation users tested how well they could use Thunderbird with voice controls and eye tracking software. Our voice control testers found room for improvement with menu action labels, better autofocus shift when scrolling through emails, and a larger font size for more comfortable voice-driven use. Likewise, our eye tracking software tester found issues with font sizes. They also noted concerns with composition workflow and focus, too-small controls, and a drag-and-drop bug.</p> <p>Our magnification tester found where we could improve visual contrast and pane layouts. They also found off-screen elements could steal focus from new messages, and that folder paths and hierarchies could use more clarification. </p> <h3>Conclusions and Next Steps</h3> <p>We’re incredibly grateful for the insights we learned from this study on the many aspects of accessibility we want to improve in all of our apps. We want to thank Mozilla for their helping us take the next step in accessibility research, and Fable for providing a fantastic platform for accessibility testing. We’re also so grateful to our study participants for all their time and sharing their perspectives, concerns, and insights.</p> <p>This is far from the end of our accessibility journey. We’re looking forward to working what we learned in this study into deeper research and ultimately our desktop roadmap. We can’t wait to start accessibility research on our mobile apps. And we hope this study can help other open source projects start their own accessibility research to improve their projects.</p> <p>One way you can get involved is to report accessibility bugs on the desktop app. Go to the <a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Thunderbird">Thunderbird section on Bugzilla</a>, and under ‘Component’ select ‘Disability Access.’ Additionally, click ‘Show Advanced Fields’ and enter ‘access’ into the ‘Details &gt; Keywords’ section. Add screenshots when possible. Be sure to describe the bug so others can try and reproduce the it for better troubleshooting. </p> <p>If you want to learn more about our accessibility efforts, please join our User Experience mailing list! If you think you’re ready to get involved, please join our dedicated Matrix channel. We hope you help us make Thunderbird available, and accessible, everywhere!</p> <h4>VIDEO (Also <a href="https://tilvids.com/w/3ymZQj1ikB9hdtpMmaP836">on Peertube</a>):</h4> <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>Slides:</h3> <div class="wp-block-file"><a href="https://blog.thunderbird.net/files/2025/09/ThunderbirdCommunityHoursAccessibilityReport-compressed.pdf" id="wp-block-file--media-2d726133-12fc-4117-a5e6-734962ae66d2">ThunderbirdCommunityHoursAccessibilityReport-compressed</a><a class="wp-block-file__button wp-element-button" href="https://blog.thunderbird.net/files/2025/09/ThunderbirdCommunityHoursAccessibilityReport-compressed.pdf">Download</a></div> <h3>Resources:</h3> <ul><li>Bugzilla Disability Access bugs and enhancement requests: https://mzl.la/41jrnuv</li> <li>Fable: https://makeitfable.com/</li> <li>Thunderbird A11y Matrix channel: https://matrix.to/#/%23tb-a11y:mozilla.org</li> <li>Thunderbird User Experience Mailing List: https://thunderbird.topicbox.com/groups/ux</li> <li>Thunderbird suggested tools and resources for Accessibility: https://bolt.thunderbird.net/8b179dbfd/p/33ddcb-accessibility</li> <li>Config 2024: Pitching accessible design like a pro: https://www.youtube.com/watch?v=NoHIDWF0d6I</li></ul><p>The post <a href="https://blog.thunderbird.net/2025/09/video-thunderbird-accessibility-study/">VIDEO: Thunderbird Accessibility Study</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Fri, 05 Sep 2025 15:14:54 +0000</pubDate> <dc:creator>Monica Ayhens-Madon</dc:creator></item><item> <title>Mozilla Future Releases Blog: Firefox 32-bit Linux Support to End in 2026</title> <guid isPermaLink="false">https://blog.mozilla.org/futurereleases/?p=2722</guid> <link>https://blog.mozilla.org/futurereleases/2025/09/05/firefox-32-bit-linux-support-to-end-in-2026/</link> <description><p>For many years, Mozilla has continued to provide Firefox for 32-bit Linux systems long after most other browsers and operating systems ended support. We made this choice because we care deeply about keeping Firefox available to as many people as possible, helping our users extend the life of their hardware and reduce unnecessary obsolescence.</p><p>Today, however, 32-bit Linux (on x86) is no longer widely supported by the vast majority of Linux distributions, and maintaining Firefox on this platform has become increasingly difficult and unreliable. To focus our efforts on delivering the best and most modern Firefox, we are <b>ending support for 32-bit x86 Linux</b> with the release of Firefox 144 (or to rephrase, Firefox 145 will not have 32-bit Linux support).</p><p>If you are currently using Firefox on a 32-bit x86 Linux system, we strongly encourage you to move to a 64-bit operating system and install the 64-bit version of Firefox, which will continue to be supported and updated.</p><p>For users who cannot transition immediately, Firefox ESR 140 will remain available — including 32-bit builds — and will continue to receive security updates until at least <b>September 2026</b>.</p><p>[Updated on 2025-09-09 to clarify the affected builds are 32-bit x86]</p><p>The post <a href="https://blog.mozilla.org/futurereleases/2025/09/05/firefox-32-bit-linux-support-to-end-in-2026/">Firefox 32-bit Linux Support to End in 2026</a> appeared first on <a href="https://blog.mozilla.org/futurereleases">Future Releases</a>.</p></description> <pubDate>Fri, 05 Sep 2025 09:18:30 +0000</pubDate> <dc:creator>Julien Cristau and Sylvestre Ledru</dc:creator></item><item> <title>Karl Dubost: Did you open a bug?</title> <guid isPermaLink="false">tag:www.otsukare.info,2025-09-05:/2025/09/05/open-bug-webdev</guid> <link>https://www.otsukare.info/2025/09/05/open-bug-webdev</link> <description><p><img alt="Wall with broken tiles." src="https://www.otsukare.info/images/20250905-bugs-reports.jpg" /></p><p>If you are a webdev…</p><p>and you had an issue on the website you were working on, because of a web browser…</p><p>Why didn't you file a bug on a browser bug tracker? What are the frictions?</p><p>(not asking those who did, because they already do the right thing ❤️)</p><ul><li><a href="https://issues.chromium.org/issues?q=status:open">Blink bug tracker</a></li><li><a href="https://bugzilla.mozilla.org">Gecko bug tracker</a></li><li><a href="https://bugs.webkit.org/">WebKit bug tracker</a></li></ul><p>Or <a href="https://webcompat.com/">Webcompat.com</a>. A cross-browsers bug tracker.</p><p>PS: do not hesitate to ask around you, your colleagues, mates, etc.</p><p>This was <a href="https://mastodon.cloud/@karlcow/115150006126574667">initially posted on mastodon</a>, you can contact me there. Also on <a href="https://github.com/karlcow">GitHub</a>.</p><p>Otsukare!</p></description> <pubDate>Fri, 05 Sep 2025 08:50:00 +0000</pubDate> <dc:creator>Karl Dubost</dc:creator></item><item> <title>Mozilla Future Releases Blog: Extended Firefox ESR 115 Support for Windows 7, 8, and 8.1 and macOS 10.12-10.14</title> <guid isPermaLink="false">https://blog.mozilla.org/futurereleases/?p=2723</guid> <link>https://blog.mozilla.org/futurereleases/2025/09/04/firefox-esr-115-support-for-windows-7-8-and-8-1-and-old-mac-os-versions-extended-until-march-2026/</link> <description><p>Mozilla has continued to support Firefox on Windows 7, Windows 8, and Windows 8.1 long after these operating systems reached end of life, helping users extend the life of their devices and reduce unnecessary obsolescence. We originally announced that security updates for <a href="https://www.firefox.com/download/all/desktop-esr/">Firefox ESR</a> 115 would end in September 2024, later extending that into 2025.</p><p>Today, we are extending support once again: <b>Firefox ESR 115 will continue to receive security updates on Windows 7, 8, and 8.1 until March 2026</b>. This extension gives users more time to transition while ensuring critical security protections remain available. We still strongly encourage upgrading to a supported operating system to access the latest Firefox features and maintain long-term stability.</p><p>Note that this extension is also applicable for macOS 10.12-10.14 users running Firefox ESR 115.</p><p>The post <a href="https://blog.mozilla.org/futurereleases/2025/09/04/firefox-esr-115-support-for-windows-7-8-and-8-1-and-old-mac-os-versions-extended-until-march-2026/">Extended Firefox ESR 115 Support for Windows 7, 8, and 8.1 and macOS 10.12-10.14</a> appeared first on <a href="https://blog.mozilla.org/futurereleases">Future Releases</a>.</p></description> <pubDate>Thu, 04 Sep 2025 14:50:41 +0000</pubDate> <dc:creator>Ryan VanderMeulen</dc:creator></item><item> <title>The Rust Programming Language Blog: Welcoming the Rust Innovation Lab</title> <guid isPermaLink="true">https://blog.rust-lang.org/2025/09/03/welcoming-the-rust-innovation-lab/</guid> <link>https://blog.rust-lang.org/2025/09/03/welcoming-the-rust-innovation-lab/</link> <description><p>TL;DR: <a href="https://github.com/rustls/rustls">Rustls</a> is the inaugural project of the <a href="https://rustfoundation.org/rust-innovation-lab">Rust Innovation Lab</a>, which is a new home for Rust projects under the Rust Foundation.</p><p>At the Rust Foundation's August meeting, the Project Directors and the rest of the Rust Foundation board voted to approve <a href="https://github.com/rustls/rustls">Rustls</a> as the first project housed under the newly formed Rust Innovation Lab. Prior to the vote, the Project Directors consulted with the Leadership Council who confirmed the Project's support for this initiative.</p><p>The Rust Innovation Lab (RIL) is designed to provide support for funded Rust-based open source projects from the Rust Foundation in the form of governance, legal, networking, marketing, and administration, while keeping the technical direction solely in the hands of the current maintainers. As with the other work of the Rust Foundation (e.g. its many existing <a href="https://rustfoundation.org/initiatives/">initiatives</a>), the purpose of the RIL is to strengthen the Rust ecosystem generally.</p><p>The Foundation has been working behind the scenes to establish the Rust Innovation Lab, which includes setting up infrastructure under the Foundation to ensure smooth transition for Rustls into RIL. More details are available in <a href="https://rustfoundation.org/media/rust-foundation-launches-rust-innovation-lab-with-rustls-as-inaugural-project/">the Foundation's announcement</a> and on <a href="https://rustfoundation.org/rust-innovation-lab">the Rust Innovation Lab's page</a>.</p><p>We are all excited by the formation of the Rust Innovation Lab. The support this initiative will provide to Rustls (and, eventually, other important projects that are using Rust) will improve software security for the entire industry. The Rust Project is grateful for the support of the Rust Foundation corporate members who are making this initiative possible for the benefit of everyone.</p><p>More information on the criteria for projects wishing to become part of the RIL and the process for applying will be coming soon. The Project Directors and Leadership Council have been and will continue working with the Foundation to communicate information, questions, and feedback with the Rust community about the RIL as the details are worked out.</p></description> <pubDate>Wed, 03 Sep 2025 00:00:00 +0000</pubDate> <dc:creator>Carol Nichols</dc:creator></item><item> <title>The Rust Programming Language Blog: Faster linking times with 1.90.0 stable on Linux using the LLD linker</title> <guid isPermaLink="true">https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable/</guid> <link>https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable/</link> <description><p>TL;DR: rustc will start using the LLD linker by default on the <code>x86_64-unknown-linux-gnu</code> target starting with the next stable release (1.90.0, scheduled for 2025-09-18), which should significantly reduce linking times. Test it out on beta now, and please report any encountered issues.</p><h4 id="some-context"><a class="anchor" href="https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable/#some-context"></a>Some context</h4><p>Linking time is often a big part of compilation time. When rustc needs to build a binary or a shared library, it will usually call the default linker installed on the system to do that (this can be changed on the command-line or by the target for which the code is compiled).</p><p>The linkers do an important job, with concerns about stability, backwards-compatibility and so on. For these and other reasons, on the most popular operating systems they usually are older programs, designed when computers only had a single core. So, they usually tend to be slow on a modern machine. For example, when building ripgrep 13 in debug mode on Linux, roughly half of the time is actually spent in the linker.</p><p>There are different linkers, however, and the usual advice to improve linking times is to use one of these newer and faster linkers, like LLVM's <a href="https://lld.llvm.org/"><code>lld</code></a> or Rui Ueyama's <a href="https://github.com/rui314/mold"><code>mold</code></a>.</p><p>Some of Rust's wasm and aarch64 targets already use <code>lld</code> by default. When using rustup, rustc ships with a version of <code>lld</code> for this purpose. When CI builds LLVM to use in the compiler, it also builds the linker and packages it. It's referred to as <code>rust-lld</code> to avoid colliding with any <code>lld</code> already installed on the user's machine.</p><p>Since improvements to linking times are substantial, it would be a good default to use in the most popular targets. This has been discussed for a long time, for example in issues <a href="https://github.com/rust-lang/rust/issues/39915">#39915</a> and <a href="https://github.com/rust-lang/rust/issues/71515">#71515</a>.</p><p>To expand our testing, we have enabled rustc to use <code>rust-lld</code> by default on nightly, <a href="https://blog.rust-lang.org/2024/05/17/enabling-rust-lld-on-linux.html">in May 2024</a>. No major issues have been reported since then.</p><p>We believe we've done all the internal testing that we could, on CI, crater, on our benchmarking infrastructure and on nightly, and plan to enable <code>rust-lld</code> to be the linker used by default on <code>x86_64-unknown-linux-gnu</code> for stable builds in 1.90.0.</p><h4 id="benefits"><a class="anchor" href="https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable/#benefits"></a>Benefits</h4><p>While this also enables the compiler to use more linker features in the future, the most immediate benefit is much improved linking times.</p><p>Here are more details from the ripgrep example mentioned above: for an incremental rebuild, linking is reduced 7x, resulting in a 40% reduction in end-to-end compilation times. For a from-scratch debug build, it is a 20% improvement.</p><p><img alt="Before/after comparison of a ripgrep incremental debug build" src="https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable/ripgrep-comparison.png" /></p><p>Most binaries should see some improvements here, but it's especially significant with e.g. bigger binaries, or for incremental rebuilds, or when involving debuginfo. These usually see bottlenecks in the linker.</p><p>Here's <a href="https://perf.rust-lang.org/compare.html?start=b3e117044c7f707293edc040edb93e7ec5f7040a&amp;end=baed03c51a68376c1789cc373581eea0daf89967&amp;stat=instructions%3Au&amp;tab=compile">a link</a> to the complete results from our benchmarks.</p><h4 id="possible-drawbacks"><a class="anchor" href="https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable/#possible-drawbacks"></a>Possible drawbacks</h4><p>From our prior testing, we don't really expect issues to happen in practice. It is a drop-in replacement for the vast majority of cases, but <code>lld</code> is not <em>bug-for-bug</em> compatible with GNU ld.</p><p>In any case, using <code>rust-lld</code> can be disabled if any problem occurs: use the <code>-C linker-features=-lld</code> flag to revert to using the system's default linker.</p><p>Some crates somehow relying on these differences could need additional link args, though we also expect this to be quite rare. Let us know if you encounter problems, by <a href="https://github.com/rust-lang/rust/issues/new/choose">opening an issue</a> on GitHub.</p><p>Some of the big gains in performance come from parallelism, which could be undesirable in resource-constrained environments, or for heavy projects that are already reaching hardware limits.</p><h4 id="summary-and-call-for-testing"><a class="anchor" href="https://blog.rust-lang.org/2025/09/01/rust-lld-on-1.90.0-stable/#summary-and-call-for-testing"></a>Summary, and call for testing</h4><p>rustc will use <code>rust-lld</code> on <code>x86_64-unknown-linux-gnu</code>, starting with the 1.90.0 stable release, for much improved linking times. Rust 1.90.0 will be released next month, on the 18th of September 2025.</p><p>This linker change is already available on the current beta (<code>1.90.0-beta.6</code>). To help everyone prepare for this landing on stable, please test your projects on beta and let us know if you encounter problems, by <a href="https://github.com/rust-lang/rust/issues/new/choose">opening an issue</a> on GitHub.</p><p>If that happens, you can revert to the default linker with the <code>-C linker-features=-lld</code> flag. Either by adding it to the usual <code>RUSTFLAGS</code> environment variable, or to a project's <a href="https://doc.rust-lang.org/cargo/reference/config.html"><code>.cargo/config.toml</code></a> configuration file,like so:</p><pre class="language-toml z-code"><code class="language-toml"><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">target</span><span class="z-punctuation z-separator z-table z-toml">.</span><span class="z-entity z-name z-table z-toml">x86_64-unknown-linux-gnu</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span></span><span class="z-source z-toml"><span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">rustflags</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-punctuation z-definition z-array z-begin z-toml">[</span><span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">"</span>-Clinker-features=-lld<span class="z-punctuation z-definition z-string z-end z-toml">"</span></span><span class="z-punctuation z-definition z-array z-end z-toml">]</span></span></code></pre></description> <pubDate>Mon, 01 Sep 2025 00:00:00 +0000</pubDate> <dc:creator>Rémy Rakic</dc:creator></item><item> <title>Mozilla Thunderbird: Thunderbird Monthly Release 142 Recap</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3743</guid> <link>https://blog.thunderbird.net/2025/08/thunderbird-monthly-release-142-recap/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="360" src="https://blog.thunderbird.net/files/2025/08/blog-banner-desktop-month-release-series-768x432.jpg" width="640" /></p><p>We’re back with another exciting Monthly Release recap! Thunderbird 142.0 brings a host of user-requested features and important bug fixes that make your email experience smoother and more reliable. From better folder management to smarter PDF handling, this release focuses on the details that matter most to your daily workflow.</p> <p><strong>A quick reminder</strong> – these updates are for users on our <strong>monthly Thunderbird Release channel</strong>. For our users still on the ESR (Extended Standard Release) channel, these updates won’t land until next July 2026. For more information on the differences between the channels and how to make the switch:</p> <ul><li>Visit the Release download portal:<a href="https://updates.thunderbird.net/thunderbird/128.0/monthly/"> Thunderbird Release Page</a>.</li> <li><a href="https://support.mozilla.org/en-US/kb/thunderbird-release">Explore detailed comparisons</a> and migration guides.</li></ul> <p>Now let’s dive into <strong>what’s new in 142.0!</strong></p> <h3><strong>New Features:</strong></h3> <h4><strong>Reset Manual Folder Sorting</strong> </h4> <p class="has-small-font-size"><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1972710">Bug 1972710</a></p> <p>Ever tweaked your folder order and wished you could start fresh? We hear you! Thunderbird 142 introduces a simple way to reset your folder sorting back to defaults. </p> <p><strong>Benefits:</strong></p> <ul><li>The new Reset Folder Order option lets users right‑click an account in the Folder Pane to instantly clear any custom sorting. </li> <li>Provides a quick clean slate and avoids manually dragging folders back to default positions.</li></ul> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/08/reset-folder-sort.png"><img alt="" class="wp-image-3751" height="555" src="https://blog.thunderbird.net/files/2025/08/reset-folder-sort.png" width="416" /></a></figure> <p><em>Note: This feature resets sorting order but doesn’t restore folders that were moved inside different parent folders.</em></p> <div class="wp-block-spacer" style="height: 25px;"></div> <h4><strong>PDF Signatures and Attachment Handling</strong></h4> <p class="has-small-font-size"><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1970796">Bug 1970796</a></p> <p>Thunderbird now lets you <strong>add visual signatures to PDF attachments</strong> opened inside the app. This update brings Thunderbird in line with modern PDF functionality, making it easier to handle contracts, forms, and other documents without leaving your inbox.</p> <p><strong>Benefits:</strong></p> <ul><li>Add a handwritten-style visual signature directly in Thunderbird.</li> <li>No need for external tools to sign simple PDF documents.</li> <li>Keeps everyday document handling faster and more convenient.</li></ul> <figure class="wp-block-image size-full"><a href="https://blog.thunderbird.net/files/2025/08/PDF-Signature.png"><img alt="" class="wp-image-3758" height="345" src="https://blog.thunderbird.net/files/2025/08/PDF-Signature.png" width="1867" /></a></figure> <ul><div class="wp-block-spacer" style="height: 25px;"></div></ul> <h4><strong>Custom OAuth Support for Add-on developers</strong></h4> <p class="has-small-font-size"><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1967370">Bug 1967370</a></p> <p>New add-on API support for OAuth client registration now allows developers and organizations to add custom OAuth providers at runtime. Instead of requiring changes in Thunderbird’s core code, an add-on can handle the setup. </p> <p><strong>Benefits:</strong></p> <ul><li>Supports custom OAuth providers through add-ons.</li> <li>Works with enterprise policies for organizational deployments.</li> <li>Simplifies integration with unique authentication systems.</li></ul> <ul><div class="wp-block-spacer" style="height: 30px;"></div></ul> <h3><strong>Bug Fixes</strong></h3> <h4><strong>Respect for “Do Not Disturb”</strong></h4> <p class="has-small-font-size"><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1876310">Bug 1876310</a></p> <p>Your focus time is sacred, and Thunderbird now honors that across all operating systems.</p> <p><strong>Benefits:</strong></p> <ul><li>Native OS notifications now respect the “Do Not Disturb” setting of every operating system, including blocking calendar reminders and chat notification sounds.</li> <li>Delivers protected focus time and consistent behavior with other applications.</li></ul> <ul><div class="wp-block-spacer" style="height: 25px;"></div></ul> <h4><strong>Improved Dark Reader Mode Toggle</strong></h4> <p class="has-small-font-size"><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1962931">Bug 1962931</a></p> <p>Reading flow is now smoother when switching between <strong>light and dark message modes</strong>. An issue was reported where toggling the setting in the message header would reset your scroll position and pull focus away from the message body. </p> <p><strong>Benefits:</strong></p> <ul><li>Keep your scroll position in the message when switching between light and dark mode so you can continue reading without interruption.</li> <li>Retain focus on the message body for easier keyboard navigation.</li> <li>Reduce extra clicks and scrolling, making reading more seamless.</li></ul> <ul><div class="wp-block-spacer" style="height: 25px;"></div></ul> <h4><strong>Message List Scrolling Fix</strong></h4> <p class="has-small-font-size"><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1968967">Bug 1968967</a></p> <p><strong>Unwanted scrolling of the message list</strong> that happened when returning to the Mail tab after opening a message is now a thing of the past. Instead of jumping to the top and slowly scrolling back down, the list now stays put.</p> <p><strong>Benefits:</strong></p> <ul><li>Keep your place in the message list when switching tabs.</li></ul> <ul><div class="wp-block-spacer" style="height: 25px;"></div></ul> <h4><strong>PDF Attachments Reload Correctly on Startup</strong></h4> <p class="has-small-font-size"><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1970615">Bug 1970615</a></p> <p>Thunderbird now correctly <strong>reloads PDF attachments</strong> that were left open in tabs when you restart the app. Previously, these tabs would fail to open and display an error, forcing you to reload them manually.</p> <p><strong>Benefits:</strong></p> <ul><li>Open PDF attachments are restored automatically on startup.</li> <li>No more error messages when resuming work.</li></ul><p>The post <a href="https://blog.thunderbird.net/2025/08/thunderbird-monthly-release-142-recap/">Thunderbird Monthly Release 142 Recap</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Thu, 28 Aug 2025 13:43:54 +0000</pubDate> <dc:creator>David Hathaway</dc:creator></item><item> <title>The Servo Blog: This month in Servo: new image formats, canvas backends, automation, and more!</title> <guid isPermaLink="true">https://servo.org/blog/2025/08/22/this-month-in-servo/</guid> <link>https://servo.org/blog/2025/08/22/this-month-in-servo/</link> <description><p>Servo has smashed its record again in July, with <strong>367 pull requests</strong> landing in our nightly builds!This includes several new web platform features:</p><ul><li><strong>APNG</strong> and <strong>WebP animated images</strong>, in addition to GIF (<a href="https://github.com/rayguo17">@rayguo17</a>, <a href="https://github.com/servo/servo/pull/37637">#37637</a>)</li><li><strong>&lt;source width&gt;</strong> and <strong>&lt;source height&gt;</strong> (<a href="https://github.com/leo030303">@leo030303</a>, <a href="https://github.com/xiaochengh">@xiaochengh</a>, <a href="https://github.com/servo/servo/pull/38152">#38152</a>)</li><li><strong>TextDecoderStream</strong> (<a href="https://github.com/minghuaw">@minghuaw</a>, <a href="https://github.com/servo/servo/pull/38112">#38112</a>)</li><li><strong>replace() method</strong> on <strong>CSSStyleSheet</strong> (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/servo/servo/pull/38244">#38244</a>)</li><li><strong>texImage3D() method</strong> on <strong>WebGL2RenderingContext</strong> (<a href="https://github.com/wusyong">@wusyong</a>, <a href="https://github.com/servo/servo/pull/37718">#37718</a>)</li><li><strong>convertToBlob()</strong> and <strong>transferToImageBitmap() methods</strong> on <strong>OffscreenCanvas</strong> (<a href="https://github.com/tharkum">@tharkum</a>, <a href="https://github.com/servo/servo/pull/37786">#37786</a>, <a href="https://github.com/servo/servo/pull/37880">#37880</a>)</li><li><strong>adoptedStyleSheets property</strong> on <strong>Document</strong> and <strong>ShadowRoot</strong>, with <code>--pref dom_adoptedstylesheet_enabled</code> (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/servo/servo/pull/38163">#38163</a>)</li><li><strong>ImageBitmap</strong> no longer requires <code>--enable-experimental-web-platform-features</code> (<a href="https://github.com/tharkum">@tharkum</a>, <a href="https://github.com/servo/servo/pull/38050">#38050</a>)</li></ul><p>Notable changes for Servo library consumers:</p><ul><li><p><strong>Stylo 0.6.0</strong> was released, <strong>fixing build errors</strong> caused by an undeclared dependency on <code>markupsafe</code> (<a href="https://github.com/nicoburns">@nicoburns</a>, <a href="https://github.com/delan">@delan</a>, <a href="https://github.com/servo/stylo/pull/215">stylo#215</a>, <a href="https://github.com/servo/stylo/issues/218">stylo#218</a>).To work around this in Stylo 0.5.0, install the dependency: <code>pip install markupsafe</code></p></li><li><p><a href="https://doc.servo.org/servo/struct.WebView.html#method.notify_scroll_event"><strong>notify_scroll_event()</strong> on WebView</a> now <strong>scrolls down as the <code>y</code> value increases</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/37752">#37752</a>), consistent with the web platform.This is a <strong>breaking change to the Servo API</strong>.</p></li></ul><figure> <details> <img alt="servoshell nightly showing the same things, but animated" src="https://servo.org/img/blog/2025-08-diffies.webp" style="margin: 0;" /> <img src="https://servo.org/img/blog/2025-08-diffies.jpg" style="margin: 0;" /><div alt="servoshell nightly showing APNG and WebP animated images, ‘image-rendering’ applying to a ‘border-image’, a WebGL 2 example using texImage3D(), ‘text-decoration’ applying to a link with spaces, and an example of adoptedStyleSheets being controlled by a color input">▶</div> </details> &lt;figcaption&gt;texImage3D() example reproduced from <a href="https://webglsamples.org/WebGL2Samples/#texture_2d_array">texture_2d_array</a> in the <a href="https://github.com/WebGLSamples/WebGL2Samples"><i>WebGL 2.0 Samples</i></a> by Trung Le, Shuai Shao (Shrek), et al (<a href="https://github.com/WebGLSamples/WebGL2Samples/blob/7aef7dd1ef2615e657e0110df10a0fd6270cd50e/LICENSE.md">license</a>).&lt;/figcaption&gt;</figure><h3>Engine changes <a class="header-anchor" href="https://servo.org/blog/2025/08/22/this-month-in-servo/#engine-changes"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>Like many browsers, Servo has two kinds of zoom: <strong>page zoom</strong> affects the size of the viewport, while <strong>pinch zoom</strong> does not (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/38194">#38194</a>).<strong>Page zoom</strong> now correctly triggers reflow (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/38166">#38166</a>), and <strong>pinch zoom</strong> is now reset to the viewport meta config when navigating (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/37315">#37315</a>).</p><p><strong>‘image-rendering’ property</strong> now affects <strong>‘border-image’</strong> (<a href="https://github.com/lumiscosity">@lumiscosity</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/38346">#38346</a>), <strong>‘text-decoration[-line]’</strong> is now <strong>drawn under whitespace</strong> (<a href="https://github.com/leo030303">@leo030303</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/38007">#38007</a>), and we’ve also fixed several layout bugs around <strong>grid item contents</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/37981">#37981</a>), <strong>table cell contents</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/38290">#38290</a>), <strong>quirks mode</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/37814">#37814</a>, <a href="https://github.com/servo/servo/pull/37831">#37831</a>, <a href="https://github.com/servo/servo/pull/37820">#37820</a>, <a href="https://github.com/servo/servo/pull/37837">#37837</a>), <strong>clientWidth</strong> and <strong>clientHeight</strong> queries of grid layouts (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/37917">#37917</a>), and <strong>‘min-height’</strong> and <strong>‘max-height’</strong> of replaced elements (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/37758">#37758</a>).</p><p>As part of our <strong>incremental layout</strong> project, we now <strong>cache the layout results</strong> of replaced boxes (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/37971">#37971</a>, <a href="https://github.com/servo/servo/pull/37897">#37897</a>, <a href="https://github.com/servo/servo/pull/37962">#37962</a>, <a href="https://github.com/servo/servo/pull/37943">#37943</a>, <a href="https://github.com/servo/servo/pull/37985">#37985</a>, <a href="https://github.com/servo/servo/pull/38349">#38349</a>), <strong>avoid unnecessary reflows</strong> after animations (<a href="https://github.com/coding-joedow">@coding-joedow</a>, <a href="https://github.com/servo/servo/pull/37954">#37954</a>), <strong>invalidate layouts more precisely</strong> (<a href="https://github.com/coding-joedow">@coding-joedow</a>, <a href="https://github.com/servo/servo/pull/38199">#38199</a>, <a href="https://github.com/servo/servo/pull/38057">#38057</a>, <a href="https://github.com/servo/servo/pull/38198">#38198</a>, <a href="https://github.com/servo/servo/pull/38059">#38059</a>), and we’ve added <strong>incremental box tree construction</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/coding-joedow">@coding-joedow</a>, <a href="https://github.com/servo/servo/pull/37751">#37751</a>, <a href="https://github.com/servo/servo/pull/37957">#37957</a>) for flex and grid items (<a href="https://github.com/coding-joedow">@coding-joedow</a>, <a href="https://github.com/servo/servo/pull/37854">#37854</a>), table columns, cells, and captions (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/37851">#37851</a>, <a href="https://github.com/servo/servo/pull/37850">#37850</a>, <a href="https://github.com/servo/servo/pull/37849">#37849</a>), and a variety of inline elements (<a href="https://github.com/coding-joedow">@coding-joedow</a>, <a href="https://github.com/servo/servo/pull/38084">#38084</a>, <a href="https://github.com/servo/servo/pull/37866">#37866</a>, <a href="https://github.com/servo/servo/pull/37868">#37868</a>, <a href="https://github.com/servo/servo/pull/37892">#37892</a>).</p><p>Work on <strong>IndexedDB</strong> continues, notably including support for <strong>key ranges</strong> (<a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/38268">#38268</a>, <a href="https://github.com/servo/servo/pull/37684">#37684</a>, <a href="https://github.com/servo/servo/pull/38278">#38278</a>).</p><p><strong>sessionStorage</strong> is now isolated between webviews, and copied to new webviews with the same <code>opener</code> (<a href="https://github.com/janvarga">@janvarga</a>, <a href="https://github.com/servo/servo/pull/37803">#37803</a>).</p><h3>Browser changes <a class="header-anchor" href="https://servo.org/blog/2025/08/22/this-month-in-servo/#browser-changes"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p><strong>servoshell</strong> now has a <strong>.desktop file</strong> and <strong>window name</strong>, so you can now <strong>pin it to your taskbar</strong> on Linux (<a href="https://github.com/MichaelMcDonnell">@MichaelMcDonnell</a>, <a href="https://github.com/servo/servo/pull/38038">#38038</a>).We’ve made it more ergonomic too, fixing both the sluggish <strong>mouse wheel</strong> and <strong>pixel-perfect trackpad scrolling</strong> and the too fast <strong>arrow key scrolling</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/37982">#37982</a>).</p><p>You can now <strong>focus the location bar with Alt+D</strong> in addition to Ctrl+L on non-macOS platforms (<a href="https://github.com/MichaelMcDonnell">@MichaelMcDonnell</a>, <a href="https://github.com/servo/servo/pull/37794">#37794</a>), and <strong>clicking the location bar</strong> now selects the contents (<a href="https://github.com/MichaelMcDonnell">@MichaelMcDonnell</a>, <a href="https://github.com/servo/servo/pull/37839">#37839</a>).</p><p>When debugging Servo <a href="https://book.servo.org/hacking/using-devtools.html">with the <strong>Firefox devtools</strong></a>, you can now view requests in the <strong>Network tab</strong> both <strong>after navigating</strong> (<a href="https://github.com/uthmaniv">@uthmaniv</a>, <a href="https://github.com/servo/servo/pull/37778">#37778</a>) and when <strong>responses are served from cache</strong> (<a href="https://github.com/uthmaniv">@uthmaniv</a>, <a href="https://github.com/servo/servo/pull/37906">#37906</a>).We’re also implementing the <strong>Debugger tab</strong> (<a href="https://github.com/delan">@delan</a>, <a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/issues/36027">#36027</a>), including several changes to our script system (<a href="https://github.com/delan">@delan</a>, <a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/pull/38236">#38236</a>, <a href="https://github.com/servo/servo/pull/38232">#38232</a>, <a href="https://github.com/servo/servo/pull/38265">#38265</a>) and fixing a whole class of bugs where devtools ends up broken (<a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/delan">@delan</a>, <a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/the6p4c">@the6p4c</a>, <a href="https://github.com/servo/servo/pull/37686">#37686</a>).</p><h3>WebDriver changes <a class="header-anchor" href="https://servo.org/blog/2025/08/22/this-month-in-servo/#webdriver-changes"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p><strong>WebDriver automation</strong> support now <strong>goes through servoshell</strong>, rather than through libservo internally, ensuring that WebDriver commands are consistently executed in the correct order (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/PotatoCP">@PotatoCP</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/37669">#37669</a>, <a href="https://github.com/servo/servo/pull/37908">#37908</a>, <a href="https://github.com/servo/servo/pull/37663">#37663</a>, <a href="https://github.com/servo/servo/pull/37911">#37911</a>, <a href="https://github.com/servo/servo/pull/38212">#38212</a>, <a href="https://github.com/servo/servo/pull/38314">#38314</a>).We’ve also fixed race conditions in the <strong>Back</strong>, <strong>Forward</strong> (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/37950">#37950</a>), <strong>Element Click</strong> (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/servo/servo/pull/37935">#37935</a>), <strong>Switch To Window</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/38160">#38160</a>), and other commands (<a href="https://github.com/PotatoCP">@PotatoCP</a>, <a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/servo/servo/pull/38079">#38079</a>, <a href="https://github.com/servo/servo/pull/38234">#38234</a>).</p><p>We’ve added support for the <strong>Dismiss Alert</strong>, <strong>Accept Alert</strong>, <strong>Get Alert Text</strong> (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/servo/servo/pull/37913">#37913</a>), and <strong>Send Alert Text</strong> commands for <a href="https://html.spec.whatwg.org/multipage/#simple-dialogs"><strong>simple dialogs</strong></a> (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/servo/servo/pull/38140">#38140</a>, <a href="https://github.com/servo/servo/pull/38035">#38035</a>, <a href="https://github.com/servo/servo/pull/38142">#38142</a>), as well as the <strong>Maximize Window</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/38271">#38271</a>) and <strong>Element Clear</strong> commands (<a href="https://github.com/PotatoCP">@PotatoCP</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/38208">#38208</a>).<a href="https://w3c.github.io/webdriver/#element-retrieval"><strong>Find Element</strong> family of commands</a> can now use the <strong><code>"xpath"</code> location strategy</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/37783">#37783</a>).<strong>Get Element Shadow Root</strong> commands can now interact with <strong>closed shadow roots</strong> (<a href="https://github.com/PotatoCP">@PotatoCP</a>, <a href="https://github.com/servo/servo/pull/37826">#37826</a>).</p><p>You can now <strong>run the WebDriver test suite</strong> in CI with <code>mach try wd</code> or <code>mach try webdriver</code> (<a href="https://github.com/PotatoCP">@PotatoCP</a>, <a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/37498">#37498</a>, <a href="https://github.com/servo/servo/pull/37873">#37873</a>, <a href="https://github.com/servo/servo/pull/37712">#37712</a>).</p><h3>2D graphics <a class="header-anchor" href="https://servo.org/blog/2025/08/22/this-month-in-servo/#2d-graphics"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p><strong>&lt;canvas&gt;</strong> is key to programmable graphics on the web, with Servo supporting WebGPU, WebGL, and 2D canvas contexts.But the <strong>general-purpose 2D graphics</strong> routines that power Servo’s 2D canvases are potentially useful for a lot more than &lt;canvas&gt;: <strong>font rendering</strong> is bread and butter for Servo, but <strong>SVG rendering</strong> is only minimally supported right now, and <strong>PDF output</strong> is not yet implemented at all.</p><p>Those features have one thing in common: they require things that WebRender can’t yet do.<strong>WebRender</strong> does one thing and does it well: rasterise the layouts of the web, really fast, by <a href="https://hacks.mozilla.org/2017/10/the-whole-web-at-maximum-fps-how-webrender-gets-rid-of-jank/">using the GPU as much as possible</a>.Font rendering and SVG rendering both involve rasterising arbitrary paths, which currently has to be done outside WebRender, and PDF output is out of scope entirely.</p><p>The more code we can share between these tasks, the better we can make that code, and the smaller we can make Servo’s binary sizes (<a href="https://github.com/servo/servo/issues/38022">#38022</a>).We’ve started by moving 2D-&lt;canvas&gt;-specific state out of the <code>canvas</code> crate (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/38098">#38098</a>, <a href="https://github.com/servo/servo/pull/38114">#38114</a>, <a href="https://github.com/servo/servo/pull/38164">#38164</a>, <a href="https://github.com/servo/servo/pull/38214">#38214</a>), which has in turn allowed us to modernise it with <strong>new backends based on <a href="https://github.com/linebender/vello">Vello</a></strong> (<a href="https://github.com/EnnuiL">@EnnuiL</a>, <a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/issues/30636">#30636</a>, <a href="https://github.com/servo/servo/issues/38345">#38345</a>):</p><ul><li><p>a Vello GPU-based backend (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/36821">#36821</a>), currently slower than the default backend; to use it, build Servo with <code>--features vello</code> and enable it with <code>--pref dom_canvas_vello_enabled</code></p></li><li><p>a Vello CPU-based backend (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/38282">#38282</a>), <strong>already faster than the default backend</strong>; to use it, build Servo with <code>--features vello_cpu</code> and enable it with <code>--pref dom_canvas_vello_cpu_enabled</code></p></li></ul><h3>What is a pixel? <a class="header-anchor" href="https://servo.org/blog/2025/08/22/this-month-in-servo/#what-is-a-pixel%3F"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>Many recent Servo bugs have been related to our handling of <strong>viewport</strong>, <strong>window</strong>, and <strong>screen coordinate spaces</strong> (<a href="https://github.com/servo/servo/issues/36817">#36817</a>, <a href="https://github.com/servo/servo/issues/37804">#37804</a>, <a href="https://github.com/servo/servo/issues/37824">#37824</a>, <a href="https://github.com/servo/servo/issues/37878">#37878</a>, <a href="https://github.com/servo/servo/issues/37978">#37978</a>, <a href="https://github.com/servo/servo/issues/38089">#38089</a>, <a href="https://github.com/servo/servo/issues/38090">#38090</a>, <a href="https://github.com/servo/servo/issues/38093">#38093</a>, <a href="https://github.com/servo/servo/issues/38255">#38255</a>).Symptoms of these bugs include <strong>bad hit testing</strong> (e.g. links that can’t be clicked), <strong>inability to scroll</strong> to the end of the page, or <strong>graphical glitches</strong> like disappearing browser UI or black bars.</p><p>Windows rarely take up the whole screen, viewports rarely take up the whole window due to window decorations, and when different units come into play, like CSS <code>px</code> vs device pixels, a more systematic approach is needed.We built <a href="https://docs.rs/euclid/0.22.11/euclid/"><strong>euclid</strong></a> to solve these problems in a strongly typed way within Servo, but beyond the viewport, we need to convert between euclid types and the geometry types provided by the embedder, the toolkit, the platform, or WebDriver, which creates opportunities for errors.</p><p>Embedders are now the single source of truth for <strong>window rects</strong> and <strong>screen sizes</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/37960">#37960</a>, <a href="https://github.com/servo/servo/pull/38020">#38020</a>), and we’ve fixed incorrect coordinate handling in <a href="https://w3c.github.io/webdriver/#get-window-rect"><strong>Get Window Rect</strong></a>, <a href="https://w3c.github.io/webdriver/#set-window-rect"><strong>Set Window Rect</strong></a> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/37812">#37812</a>, <a href="https://github.com/servo/servo/pull/37893">#37893</a>, <a href="https://github.com/servo/servo/pull/38209">#38209</a>, <a href="https://github.com/servo/servo/pull/38258">#38258</a>, <a href="https://github.com/servo/servo/pull/38249">#38249</a>), <strong>resizeTo()</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/37848">#37848</a>), <strong>screenX</strong>, <strong>screenY</strong>, <strong>screenLeft</strong>, <strong>screenTop</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/37934">#37934</a>), and in <strong>servoshell</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/37961">#37961</a>, <a href="https://github.com/servo/servo/pull/38174">#38174</a>, <a href="https://github.com/servo/servo/pull/38307">#38307</a>, <a href="https://github.com/servo/servo/pull/38082">#38082</a>).We’ve also improved the Web Platform Tests (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/37856">#37856</a>) and clarified our docs (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/37879">#37879</a>, <a href="https://github.com/servo/servo/pull/38110">#38110</a>) in these areas.</p><h3>Donations <a class="header-anchor" href="https://servo.org/blog/2025/08/22/this-month-in-servo/#donations"> <span class="icon hashlink"><i class="fas fa-link"></i></span> </a></h3><p>Thanks again for your generous support!We are now receiving <strong>4691 USD/month</strong> (+5.0% over June) in recurring donations.This helps cover the cost of our <a href="https://ci0.servo.org/">self-hosted</a> <a href="https://ci1.servo.org/">CI</a> <a href="https://ci2.servo.org/">runners</a> and one of our <a href="https://www.outreachy.org/alums/2025-06/#:~:text=Servo">latest Outreachy interns</a>!</p><p>Keep an eye out for <a href="https://github.com/servo/servo/issues/38141">further improvements to our CI system</a> in the coming months, including <a href="https://github.com/servo/ci-runners/issues/21"><strong>ten-minute WPT builds</strong></a> and our new proposal for <a href="https://github.com/servo/project/issues/160"><strong>dedicated benchmarking runners</strong></a>, all thanks to your support.</p><p>Servo is also on <a href="https://thanks.dev/">thanks.dev</a>, and already <strong>22 GitHub users</strong> (−3 from June) 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><figure class="_fig" style="width: 100%; margin: 1em 0;"><div class="_flex"> <div style="text-align: right;"> <div><strong>4691</strong> USD/month</div> <div></div> <div></div> <div style="padding-right: 1em;"><strong>10000</strong></div> </div> <progress max="10000" value="4691"></progress></div></figure><p>As always, use of these funds will be decided transparently in the Technical Steering Committee.For more details, head to our <a href="https://servo.org/sponsorship/">Sponsorship page</a>.</p></description> <pubDate>Fri, 22 Aug 2025 00:00:00 +0000</pubDate></item><item> <title>Mozilla Thunderbird: Thunderbird Pro August 2025 Update</title> <guid isPermaLink="false">https://blog.thunderbird.net/?p=3734</guid> <link>https://blog.thunderbird.net/2025/08/tbpro-august-2025-update/</link> <description><p><img alt="" class="attachment-640x360 size-640x360 wp-post-image" height="320" src="https://blog.thunderbird.net/files/2025/08/tb-pro-blog.jpg" width="640" /></p><p>In April of this year <a href="https://blog.thunderbird.net/2025/04/thundermail-and-thunderbird-pro-services/">we announced Thunderbird Pro</a>, additional subscription services from Thunderbird meant to help you get more done with the app you already use and love. These services include a first ever email service from Thunderbird, called Thundermail. They also include Appointment, for scheduling meetings and appointments and Send, an end-to-end encrypted filesharing tool. <strong>Each of these services are open source, repositories are linked down below.</strong></p> <p>Thunderbird Pro services are being built as part of the broader Thunderbird product ecosystem. These services are enhancements to the current Thunderbird application experience. They are optional, designed to enhance productivity for users who need features like scheduling, file sharing and email hosting, without relying on the alternate platforms. For users who opt in, the goal is for these services to be smoothly integrated into the Thunderbird app, providing a natural extension of the familiar experience they already enjoy, enhanced with additional capabilities they may be looking for. For updates on Thunderbird Pro development and beta access availability, <a href="https://thundermail.com/">sign </a>up for the mailing list at <a href="http://thundermail.com">thundermail.com</a>. </p> <h3><strong>Progress So Far</strong></h3> <h4>Thundermail</h4> <p>Development has been moving steadily forward and community interest in Thundermail has been strong. The upcoming email hosting service from Thunderbird will support IMAP, SMTP and JMAP out of the box, making it compatible with the Thunderbird app and many other email clients. If you have your own domain, you’ll be able to bring it in and host it with us. Alternatively, grab an email address provided by Thunderbird with your choice of @thundermail.com or @tb.pro as the domains. The servers hosting Thundermail will initially be located in Germany with more countries to follow in the future. Thunderbird’s investment in offering an email service reflects our broader goal of strengthening support for open standards and giving users the option to keep their entire email experience within Thunderbird. </p> <h4>Thunderbird Appointment <a href="https://github.com/thunderbird/appointment">(Repo)</a></h4> <p>We originally developed the scheduling tool as a standalone web app. On the current roadmap, however, we’re tightly integrating Appointment into the Thunderbird app through the compose window, allowing users to insert scheduling links without leaving the email workflow. It will be easy for organizations and individuals to self-host, fork and adapt the tool to their own needs. The future is for Appointment to support multiple meeting types, like Zoom calls, phone meetings, or in-person coffee chats. Each of these will have its own settings and scheduling rules. </p> <p>One of the most requested future features is group scheduling, which would allow multiple team members to offer shared availability via a single link. The current calendar protocols don’t fully support this flow, however Thunderbird is participating in discussions around open standards like VPOLL to help move things forward. Usability studies are helping refine the MVP and community feedback is shaping the roadmap.</p> <h4>Thunderbird Send <a href="https://github.com/thunderbird/tbpro-add-on">(Repo)</a></h4> <p>A secure, end-to-end encrypted file sharing tool, built on Thunderbird app’s existing Filelink feature. It supports large file transfers directly from the email client. This allows users to bypass platforms like Google Drive or OneDrive. Pro users will receive 500 GB of storage to start, with no individual file size limit, only constrained by their total quota. We’re planning support for chunked uploads and encryption to ensure reliability and data protection. We’ll deliver Send as a system add-on which lets the team push updates faster. This also avoids locking new capabilities behind major Thunderbird release cycles.</p> <p>All Thunderbird Pro tools are open source and self-hostable. For users who prefer to run their own infrastructure or work in regulated environments, both Send and Appointment can be deployed independently. Thunderbird will continue to support these users with documentation and open APIs.</p> <h3><strong>A Look Ahead</strong></h3> <p>Thunderbird is exploring additional Pro features beyond the current lineup. While we’ve made no commitments yet, there is strong interest in adding markdown based Notes functionality, especially as lightweight personal knowledge management becomes more popular. Heavier lifts like collaborative docs or spreadsheets may follow, depending on adoption and sustainability.</p> <p>Another worthy mention: a fourth, previously announced service called Assist, which will eventually enable users to take advantage of AI features in their day-to-day email tasks, is still in the research and development phase. It will not be part of the initial lineup of services. This initiative is a bigger undertaking as we ensure we get it right for user privacy and make sure the features included are actually things our users want. More to come on this as the project progresses.</p> <p>To improve transparency and invite community collaboration, Thunderbird is also preparing a public roadmap covering desktop, mobile and Pro services. We’re developing the roadmap in collaboration with the Thunderbird Council. Our goal is to encourage participation from contributors and users alike.</p> <h4>Free vs Paid</h4> <p>Adding these additional subscription services will never compromise the features, stability or functionality our users are accustomed to in the free Thunderbird desktop and mobile applications. These services come with real costs, especially storage and bandwidth. Charging for them helps ensure that users who benefit from these tools help cover their cost, instead of donors footing the bill. </p> <p>Thunderbird Pro is a completely optional suite of (open source) services designed to provide additional productivity capabilities to the Thunderbird app and never to replace them. The current Thunderbird desktop and mobile applications are, and always will be, free. They will still heavily rely on ongoing donations for both development and independence.</p> <p>If you haven’t already, j<a href="https://thundermail.com/">oin our waiting list</a> to be one of the early beta testers for Thunderbird Pro. While we don’t have a specific timeline just yet, we will be sharing ongoing updates as development progresses.</p> <p>—</p> <p>Ryan Sipes<br />Managing Director, Product<br />Mozilla Thunderbird</p><p>The post <a href="https://blog.thunderbird.net/2025/08/tbpro-august-2025-update/">Thunderbird Pro August 2025 Update</a> appeared first on <a href="https://blog.thunderbird.net">The Thunderbird Blog</a>.</p></description> <pubDate>Tue, 19 Aug 2025 18:54:37 +0000</pubDate> <dc:creator>Ryan Sipes</dc:creator></item><item> <title>Hacks.Mozilla.Org: CRLite: Fast, private, and comprehensive certificate revocation checking in Firefox</title> <guid isPermaLink="false">https://hacks.mozilla.org/?p=48231</guid> <link>https://hacks.mozilla.org/2025/08/crlite-fast-private-and-comprehensive-certificate-revocation-checking-in-firefox/</link> <description><p>Firefox is now the first and the only browser to deploy fast and comprehensive certificate revocation checking that does not reveal your browsing activity to anyone (not even to Mozilla).</p><p>Tens of millions of TLS server certificates are issued each day to secure communications between browsers and websites. These certificates are the cornerstones of <a href="https://www.mozilla.org/en-US/about/webvision/full/#ubiquitousencryption">ubiquitous encryption</a> and a key part of our vision for the web. While a certificate can be valid for up to 398 days, it can also be revoked at any point in its lifetime. A revoked certificate poses a serious security risk and should not be trusted to authenticate a server.</p><p>Identifying a revoked certificate is difficult because information needs to flow from the <a href="https://en.wikipedia.org/wiki/Certificate_authority">certificate’s issuer</a> out to each browser. There are basically two ways to handle this. The browser either needs to ask an authority in real time about each certificate that it encounters, or it needs to maintain a frequently-updated list of revoked certificates. Firefox’s new mechanism, CRLite, has made the latter strategy feasible for the first time.</p><p>With CRLite, Firefox periodically downloads a compact encoding of the set of all revoked certificates that appear in <a href="https://developer.mozilla.org/en-US/docs/Web/Security/Certificate_Transparency">Certificate Transparency logs</a>. Firefox stores this encoding locally, updates it every 12 hours, and queries it privately every time a new TLS connection is created.</p><p>You may have heard that <a href="https://scotthelme.co.uk/revocation-is-broken/">revocation is broken</a> or that <a href="https://www.imperialviolet.org/2011/03/18/revocation.html">revocation doesn’t work</a>. For a long time, the web was stuck with bad tradeoffs between security, privacy, and reliability in this space. That’s no longer the case. We enabled CRLite for all Firefox desktop (Windows, Linux, MacOS) users starting in Firefox 137, and we have seen that it makes revocation checking functional, reliable, and performant. We are hopeful that we can replicate our success in other, more constrained, environments as well.</p><h3>Better privacy and performance</h3><p>Prior to version 137, Firefox used the <a href="https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol">Online Certificate Status Protocol (OCSP)</a> to ask authorities about revocation statuses in real time. Certificate authorities are <a href="https://cabforum.org/2023/07/14/ballot-sc063v4-make-ocsp-optional-require-crls-and-incentivize-automation/">no longer required</a> to support OCSP, and some major certificate authorities have already <a href="https://letsencrypt.org/2024/07/23/replacing-ocsp-with-crls/">announced</a> their intention to wind down their OCSP services. There are several reasons for this, but the foremost is that OCSP is a privacy leak. When a user asks an OCSP server about a certificate, they reveal to the server that they intend to visit a certain domain. Since OCSP requests are typically made over unencrypted HTTP, this information is also leaked to all on-path observers.</p><p>Having gained confidence in the robustness, accuracy and performance of our CRLite implementation, we will be disabling OCSP for <a href="https://en.wikipedia.org/wiki/Domain-validated_certificate">domain validated certificates</a> in Firefox 142. Sealing the OCSP privacy leak complements our ongoing efforts to encrypt everything on the internet by rolling out <a href="https://support.mozilla.org/en-US/kb/https-first">HTTPS-First</a>, <a href="https://support.mozilla.org/en-US/kb/firefox-dns-over-https">DNS over HTTPS</a>, and <a href="https://blog.mozilla.org/en/firefox/encrypted-hello/">Encrypted Client Hello</a>.</p><p>Disabling OCSP also has performance benefits: we have found that OCSP requests block the TLS handshake for 100 ms at the median. As we rolled out CRLite, we saw notable improvements in TLS handshake times.</p><p><a href="https://hacks.mozilla.org/wp-content/uploads/2025/07/chart.svg"><img alt="A graph showing &quot;Median TLS Handshake Time (ms)&quot; and &quot;Revocation mechanism usage&quot; over time. As the percentage of revocation checks performed with CRLite increases from 0% to 80%, the median TLS handshake time decreases from 56.4 ms to 39.9 ms." class=" wp-image-48232 aligncenter" height="294" src="https://hacks.mozilla.org/wp-content/uploads/2025/07/chart.svg" width="475" /></a></p><h3>Bandwidth requirements of CRLite</h3><p>Users with CRLite download an average of 300 kB of revocation data per day: a 4 MB snapshot every 45 days and a sequence of “delta updates” in-between. (The exact sizes of snapshots and delta updates fluctuate day by day. You can explore the real data on our <a href="https://yardstick.mozilla.org/dashboard/snapshot/c1WZrxGkNxdm9oZp7xVvGUEFJCELfApN">dashboard</a>.)</p><p>To get a sense for how compact CRLite artifacts are, let’s compare them with <a href="https://en.wikipedia.org/wiki/Certificate_revocation_list">Certificate Revocation Lists (CRLs)</a>. A CRL is a list of serial numbers that each identify a revoked certificate from a single issuer. Certificate authorities in Mozilla’s root store have disclosed approximately three thousand active CRLs to the <a href="https://www.ccadb.org/">Common CA Database</a>. In total, these three thousand CRLs are 300 MB in size, and the only way to keep a copy of them up-to-date is to redownload them regularly. CRLite encodes the same dynamic set of revoked certificates in 300 kB per day. In other words, CRLite is <b>one</b> <b>thousand times more bandwidth-efficient</b> than daily CRL downloads.</p><p>Of course, no browser is performing daily downloads of all CRLs. For a more meaningful comparison, we can consider Chrome’s CRLSets. These are hand-picked sets of revocations that are delivered to Chrome users daily. Recent CRLSets weigh in at 600 kB and include about 1% of all revocations (thirty-five thousand of the four million total). Firefox’s CRLite implementation uses half the bandwidth, updates twice as frequently, and includes <b>all</b> revocations.</p><p>Including all revocations is essential for security as there is no reliable way today to distinguish security-critical revocations from administrative revocations. Roughly half of all revocations are made without a specified reason code, and some of these revocations are likely due to security concerns that the certificate’s owner did not wish to highlight. When reason codes <i>are</i> used, they are often used in an ambiguous way that does not clearly map to security risk. In this environment, the only secure approach is to check all revocations, which is now possible with CRLite.</p><h3>State-of-the-art blocklist technology</h3><p>You may recall a <a href="https://blog.mozilla.org/security/2020/01/09/crlite-part-1-all-web-pki-revocations-compressed/">series</a> <a href="https://blog.mozilla.org/security/2020/01/09/crlite-part-2-end-to-end-design/">of</a> <a href="https://blog.mozilla.org/security/2020/01/21/crlite-part-3-speeding-up-secure-browsing/">blog</a> <a href="https://blog.mozilla.org/security/2020/12/01/crlite-part-4-infrastructure-design/">posts</a> on our experiments with CRLite back in 2020. We followed these experiments with successful deployments to Nightly, Beta, and 1% of Release users. But the bandwidth requirements for this early CRLite design turned out to be prohibitive.</p><p>We solved our bandwidth issue by developing a novel data structure—the “Clubcard” set membership test. Where the <a href="https://ieeexplore.ieee.org/document/7958597">original</a> CRLite design used a “multi-level cascades of Bloom filters”, Clubcard-based CRLite uses a “partitioned two-level cascade of <a href="https://engineering.fb.com/2021/07/09/core-infra/ribbon-filter/">Ribbon filters</a>”. The “two-level cascade” idea was presented by Mike Hamburg at <a href="https://youtu.be/Htms5rNy7B8?list=PLeeS-3Ml-rpovBDh6do693We_CP3KTnHU&amp;t=2359">RWC 2022</a>, and “partitioning” is an innovation of our own that we presented in a paper at <a href="https://research.mozilla.org/files/2025/04/clubcards_for_the_webpki.pdf">IEEE S&amp;P 2025</a> and a talk at <a href="https://www.youtube.com/watch?v=gnB76DQI1GE&amp;t=19510s">RWC 2025</a>.</p><h3>Future improvements</h3><p>We are working on making CRLite even more bandwidth efficient. We are developing new Clubcard partitioning strategies that will compress mass revocation events more efficiently. We are also integrating support for the HTTP <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Compression_dictionary_transport">compression dictionary transport</a>, which will further compress delta updates. And we have successfully advocated for shorter <a href="https://github.com/cabforum/servercert/pull/553">certificate validity periods</a>, which will reduce the number of CRLite artifacts that need to encode any given revocation. With these enhancements, we expect the bandwidth requirements of CRLite to trend down over the coming years, even as the TLS ecosystem itself continues to grow.</p><p>Our <a href="https://github.com/mozilla/clubcard">Clubcard</a> blocklist library, our instantiation of <a href="https://github.com/mozilla/clubcard-crlite">Clubcards for CRLite</a>, and our <a href="http://github.com/mozilla/crlite">CRLite</a> backend are freely available for anyone to use. We hope that our success in building fast, private, and comprehensive revocation checking for Firefox will encourage other software vendors to adopt this technology.</p><p>The post <a href="https://hacks.mozilla.org/2025/08/crlite-fast-private-and-comprehensive-certificate-revocation-checking-in-firefox/">CRLite: Fast, private, and comprehensive certificate revocation checking in Firefox</a> appeared first on <a href="https://hacks.mozilla.org">Mozilla Hacks - the Web developer blog</a>.</p></description> <pubDate>Tue, 19 Aug 2025 16:03:19 +0000</pubDate> <dc:creator>John Schanck</dc:creator></item><item> <title>Firefox Developer Experience: Firefox WebDriver Newsletter 142</title> <guid isPermaLink="false">https://fxdx.dev/?p=507</guid> <link>https://fxdx.dev/firefox-webdriver-newsletter-142/</link> <description><p></p><p><em>WebDriver is a remote control interface that enables introspection and control of user agents.</em> <em>As such it</em> <em>can</em> <em>help developers to verify that their websites are working and performing well with all major browsers. The protocol is standardized by the</em><a href="https://www.w3.org/"><em> W3C</em></a><em> and consists of two separate specifications:</em><a href="https://w3c.github.io/webdriver/"><em> WebDriver classic</em></a><em> (HTTP) and the new</em><a href="https://w3c.github.io/webdriver-bidi/"><em> WebDriver BiDi</em></a><em> (Bi-Directional).This newsletter gives an overview of the work we’ve done as part of the Firefox 142 release cycle</em>.</p><h3>Contributions</h3><p>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></p> <p>In Firefox 142, Sabina (sabina.zaripova) <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1969898">renamed <code>Proxy</code> capability class to <code>ProxyConfiguration</code></a> to avoid confusion with JavaScript Proxy.</p> <p>Also, biyul.dev <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1931528">reverted a workaround for <code>asyncOpenTime=0</code></a> in WebDriver BiDi and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1976504">removed support for <code>localize_entity</code> from the localization module</a>.</p> <p></p><p>WebDriver code is written in JavaScript, Python, and Rust so any web developer can contribute! Read<a href="https://firefox-source-docs.mozilla.org/devtools/getting-started/README.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><p></p> <h3>General</h3> <h4>Removed: FTP proxy support from WebDriver capabilities</h4> <p>Support for <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1972670">setting FTP proxy with WebDriver capabilities</a> was completely removed. </p> <h4>Updated: the expiry value of the cookies set via WebDriver BiDi and WebDriver classic (Marionette)</h4> <p>The expiry value of all the cookies set via WebDriver BiDi and WebDriver classic (Marionette) is <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1974394">limited now to 400 days</a>.</p> <h3>WebDriver BiDi</h3> <h4>New: <code>emulation.setLocaleOverride</code> command</h4> <p>Implemented <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1968952">the new <code>emulation.setLocaleOverride</code> command</a> which allows clients to override a locale in JavaScript APIs. As all the other emulation commands, the locale override can be applied to the list of browsing contexts or user contexts IDs.</p> <h4>Updated: the <code>session.end</code> command to resume the blocked requests</h4> <p>The <code>session.end</code> command was updated to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1974426">resume all requests which were blocked by network interceptions</a>.</p> <h4>Improved: support for setting proxy with <code>browser.createUserContext</code> command</h4> <p>Added support for <a href="http://bugzil.la/1977180">host patterns like <code>.mozilla.org</code> in <code>noProxy</code> property</a> and fixed a bug when setting <a href="https://bugzil.la/1977168">a HTTP proxy wouldn’t allow navigating to HTTPS URLs</a>.</p> <h4>Bug fixes</h4> <ul><li><code>browsingContext.create</code> command will not <a href="https://bugzil.la/1841125">fail anymore after a <code>browsingContext.print</code> command was interrupted by closing a tab with the <code>browsingContext.close</code> command</a>.</li></ul> <h3>Marionette</h3> <h4>Updated: the <code>WebDriver:AddCookie</code> command to throw an error for <code>sameSite=none</code> and <code>secure=false</code> attributes</h4> <p>From now on, <a href="https://bugzil.la/1977205">the <code>WebDriver:AddCookie</code> command will throw an error when a target cookie has <code>sameSite=none</code> and <code>secure=false</code> attributes</a>.</p> <h4>Removed: the dialog text value from the <code>unexpected alert open</code> error message</h4> <p><a href="http://bugzil.la/1948236">The <code>unexpected alert open</code> error message will not contain anymore the dialog text value</a>, since it is available via the <code>data</code> field.</p></description> <pubDate>Tue, 19 Aug 2025 14:58:36 +0000</pubDate> <dc:creator>Alexandra Borovova</dc:creator></item><item> <title>The Rust Programming Language Blog: Demoting x86_64-apple-darwin to Tier 2 with host tools</title> <guid isPermaLink="true">https://blog.rust-lang.org/2025/08/19/demoting-x86-64-apple-darwin-to-tier-2-with-host-tools/</guid> <link>https://blog.rust-lang.org/2025/08/19/demoting-x86-64-apple-darwin-to-tier-2-with-host-tools/</link> <description><p>In Rust 1.90.0, the target <code>x86_64-apple-darwin</code> will be demoted to Tier 2 with host tools.The standard library and the compiler will continue to be built and distributed,but automated tests of these components are no longer guaranteed to be run.</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/08/19/demoting-x86-64-apple-darwin-to-tier-2-with-host-tools/#background"></a>Background</h3><p>Rust has supported macOS for a long time,with some amount of support dating back to Rust 0.1 and likely before that.During that time period,Apple has changed CPU architectures from x86 to x86_64 and now to Apple silicon,ultimately announcing the <a href="https://en.wikipedia.org/wiki/Mac_transition_to_Apple_silicon#Timeline">end of support</a> for the x86_64 architecture.</p><p>Similarly,<a href="https://github.blog/changelog/2025-07-11-upcoming-changes-to-macos-hosted-runners-macos-latest-migration-and-xcode-support-policy-updates/#macos-13-is-closing-down">GitHub has announced</a> that they will no longer provide free macOS x86_64 runners for public repositories.The Rust Project uses these runners to execute automated tests for the <code>x86_64-apple-darwin</code> target.Since the <a href="https://doc.rust-lang.org/stable/rustc/target-tier-policy.html">target tier policy</a> requires that Tier 1 platforms must run tests in CI,the <code>x86_64-apple-darwin</code> target must be demoted to Tier 2.</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/08/19/demoting-x86-64-apple-darwin-to-tier-2-with-host-tools/#what-changes"></a>What changes?</h3><p>Starting with Rust 1.90.0, <code>x86_64-apple-darwin</code> will be Tier 2 with host tools.For users,nothing will change immediately;builds of both the standard library and the compiler will still be distributed by the Rust Project for use via <code>rustup</code> or alternative installation methods.</p><p>Over time,this target will likely accumulate bugs faster due to reduced testing.</p><h3><a class="anchor" href="https://blog.rust-lang.org/2025/08/19/demoting-x86-64-apple-darwin-to-tier-2-with-host-tools/#future"></a>Future</h3><p>If the <code>x86_64-apple-darwin</code> target causes concrete problems,it may be demoted further.No plans for further demotion have been made yet.</p><p>For more details on the motivation of the demotion, see <a href="https://rust-lang.github.io/rfcs/3841-demote-x86_64-apple-darwin.html">RFC 3841</a>.</p></description> <pubDate>Tue, 19 Aug 2025 00:00:00 +0000</pubDate> <dc:creator>Jake Goulding</dc:creator></item> </channel></rss> If you would like to create a banner that links to this page (i.e. this validation result), do the following:
Download the "valid RSS" banner.
Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)
Add this HTML to your page (change the image src attribute if necessary):
If you would like to create a text link instead, here is the URL you can use:
http://www.feedvalidator.org/check.cgi?url=http%3A//planet.mozilla.org/rss20.xml