<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <generator uri="https://blog.rust-lang.org/" version="0.1.0">Rust Blog</generator>
    <link href="https://blog.rust-lang.org/feed.xml" rel="self" type="application/atom+xml" />
    <link href="https://blog.rust-lang.org/" rel="alternate" type="text/html" />
    <id>https://blog.rust-lang.org/</id>
    <title>Rust Blog</title>
    <subtitle>Empowering everyone to build reliable and efficient software.</subtitle>
    <author>
        <name>Maintained by the Rust Teams.</name>
        <uri>https://github.com/rust-lang/blog.rust-lang.org/</uri>
    </author>
    <updated>2026-08-10T10:37:21+00:00</updated>

    
    <entry>
        <title>Enabling the next iteration of the borrow checker on nightly</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2026/08/04/enabling-polonius-alpha-on-nightly/" type="text/html" title="Enabling the next iteration of the borrow checker on nightly" />
        <published>2026-08-04T00:00:00+00:00</published>
        <updated>2026-08-04T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2026/08/04/enabling-polonius-alpha-on-nightly/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2026/08/04/enabling-polonius-alpha-on-nightly/">&lt;p&gt;TL;DR We are enabling the next iteration of the borrow checker (coined Polonius Alpha)
on nightly in preparation for stabilization in the next few months.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;whaaaaaat&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#whaaaaaat&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Whaaaaaat?&lt;/h2&gt;
&lt;p&gt;Yes! You heard it right! The next iteration of the Rust borrow checker is coming! Rust&#x27;s first borrow checker (&quot;AST borrowck&quot;) was very limited and was phased out &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://blog.rust-lang.org/2019/11/01/nll-hard-errors/&quot;&gt;in 2019&lt;/a&gt; in favor of &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rust-lang.github.io/rfcs/2094-nll.html&quot;&gt;NLL&lt;/a&gt;, other than a &quot;migrate mode&quot; that was used to provide nice error messages. That migrate mode was finally removed &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://blog.rust-lang.org/2022/08/05/nll-by-default&quot;&gt;in 2022&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/polonius&quot;&gt;Polonius borrow checker&lt;/a&gt; spun out of the NLL effort in 2018. The &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://smallcultfollowing.com/babysteps/blog/2018/04/27/an-alias-based-formulation-of-the-borrow-checker/&quot;&gt;initial formulation&lt;/a&gt; passed the NLL test suite and accepted (sound) code that NLL did not. However, performance was a critically-limiting factor; generally borrow check was slower than NLL, but certain programs were considerably slower than NLL to the extent that using that implementation/formulation of Polonius was a non-starter. &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/nikomatsakis/polonius.next&quot;&gt;Attempts were made&lt;/a&gt; over the years to implement the Polonius formulation in a performant manner, without much luck in addressing the core issues.&lt;/p&gt;
&lt;p&gt;In 2023, &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://smallcultfollowing.com/babysteps/series/polonius-revisited/&quot;&gt;a new formulation&lt;/a&gt; of a Polonius-style borrow checker was imagined that required minimal rearchitecture of the existing NLL implementation and could be extended to allow more code to compile. We &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://blog.rust-lang.org/inside-rust/2023/10/06/polonius-update/&quot;&gt;had hoped&lt;/a&gt;, to try to stabilize this new formulation in 2024; but, various things popped up that delayed this.&lt;/p&gt;
&lt;p&gt;But! We&#x27;re nearly there now! At this point, there are no known remaining issues with the subset coined Polonius Alpha that we intend to stabilize. And, performance is generally acceptable for stabilization (will discuss that a bit below).&lt;/p&gt;
&lt;p&gt;So, &lt;strong&gt;we are enabling the Polonius Alpha borrow checker on nightly&lt;/strong&gt; for testing until we stabilize fully later in the year. We&#x27;re doing this in order to help find:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any serious performance regressions we&#x27;re unaware of&lt;/li&gt;
&lt;li&gt;Unsoundness in the formulation that we haven&#x27;t thought about&lt;/li&gt;
&lt;li&gt;Any weird diagnostic issues that we need to improve
&lt;ul&gt;
&lt;li&gt;Note: we have not &lt;em&gt;yet&lt;/em&gt; seen any diagnostic changes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can report any issues &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/rust/issues/160456&quot;&gt;on Github&lt;/a&gt; or &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rust-lang.zulipchat.com/#narrow/channel/186049-t-types.2Fpolonius/topic/Polonius.20Alpha.20enabled.20on.20nightly/near/614373312&quot;&gt;on Zulip&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;okay-what-s-new&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#okay-what-s-new&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Okay, what&#x27;s new?&lt;/h2&gt;
&lt;p&gt;The key thing that Polonius Alpha enables that NLL does not is &lt;em&gt;flow-sensitive&lt;/em&gt; borrow checking of lifetime outlives relationships.&lt;/p&gt;
&lt;p&gt;Perhaps the smallest example demonstrating what will pass with Polonius Alpha but not the current NLL is:&lt;/p&gt;
&lt;pre class&#x3D;&quot;giallo z-code&quot;&gt;&lt;code data-lang&#x3D;&quot;rust&quot;&gt;&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-keyword&quot;&gt;fn&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-function&quot;&gt; reborrow&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;a&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class&#x3D;&quot;z-storage z-storage z-modifier&quot;&gt;mut&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; u8&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class&#x3D;&quot;z-storage z-storage z-modifier&quot;&gt;mut&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; u8&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-storage z-type&quot;&gt;    let&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; b&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator z-assignment z-keyword z-operator&quot;&gt; &#x3D;&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class&#x3D;&quot;z-storage z-storage z-modifier&quot;&gt;mut&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; *&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;a&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-keyword z-control&quot;&gt;    if&lt;/span&gt;&lt;span class&#x3D;&quot;z-constant z-language&quot;&gt; true&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; b&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-control&quot;&gt; else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; a&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;However, the example you will see more often is:&lt;/p&gt;
&lt;pre class&#x3D;&quot;giallo z-code&quot;&gt;&lt;code data-lang&#x3D;&quot;rust&quot;&gt;&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-keyword&quot;&gt;fn&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-function&quot;&gt; get_mut_or_default&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt;r&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; K&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; Hash&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; +&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; Eq&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; +&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; Copy&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; V&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; Default&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;    map&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt;r&lt;/span&gt;&lt;span class&#x3D;&quot;z-storage z-storage z-modifier&quot;&gt; mut&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; HashMap&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt;K&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; V&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;    key&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; K&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt;r&lt;/span&gt;&lt;span class&#x3D;&quot;z-storage z-storage z-modifier&quot;&gt; mut&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; V&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-keyword z-control&quot;&gt;    match&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; map&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;.&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-function&quot;&gt;get_mut&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;key&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt;        Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;value&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; &#x3D;&amp;gt;&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; value&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt;        None&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; &#x3D;&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;            map&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;.&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-function&quot;&gt;insert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;key&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-namespace&quot;&gt; V&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;::&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-function&quot;&gt;default&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;            map&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;.&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-function&quot;&gt;get_mut&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;key&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;.&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-function&quot;&gt;unwrap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The issue is that the &lt;code&gt;Some(value) &#x3D;&amp;gt; value&lt;/code&gt; branch causes the borrow checker to think that the borrow returned by &lt;code&gt;map.get_mut(&amp;amp;key)&lt;/code&gt; lives for the entire function (because of the &lt;code&gt;&amp;amp;&#x27;r mut V&lt;/code&gt; return type), even though that borrow isn&#x27;t live in the &lt;code&gt;None&lt;/code&gt; branch. NLL&#x27;s analysis is &lt;em&gt;flow-insensitive&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Polonius Alpha passes this because its analysis is &lt;em&gt;flow-sensitive&lt;/em&gt;, and it knows that the borrow isn&#x27;t live in the &lt;code&gt;None&lt;/code&gt; branch.&lt;/p&gt;
&lt;p&gt;Now, Polonius Alpha is not &lt;em&gt;perfect&lt;/em&gt;; some programs that would compile under legacy Polonius (the slow original implementation) don&#x27;t compile with Polonius Alpha. (This is of course why we call it &quot;Polonius Alpha&quot;). For example:&lt;/p&gt;
&lt;pre class&#x3D;&quot;giallo z-code&quot;&gt;&lt;code data-lang&#x3D;&quot;rust&quot;&gt;&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-storage z-type&quot;&gt;struct&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; X&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; next&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; Option&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt;Box&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt;X&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-keyword&quot;&gt;fn&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-function&quot;&gt; conditional&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-storage z-type&quot;&gt;    let&lt;/span&gt;&lt;span class&#x3D;&quot;z-storage z-storage z-modifier&quot;&gt; mut&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; b&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator z-assignment z-keyword z-operator&quot;&gt; &#x3D;&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt;Box&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;::&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-function&quot;&gt;new&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt;X&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; next&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;:&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; None&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-storage z-type&quot;&gt;    let&lt;/span&gt;&lt;span class&#x3D;&quot;z-storage z-storage z-modifier&quot;&gt; mut&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; p&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator z-assignment z-keyword z-operator&quot;&gt; &#x3D;&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class&#x3D;&quot;z-storage z-storage z-modifier&quot;&gt;mut&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; b&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-keyword z-control&quot;&gt;    while&lt;/span&gt;&lt;span class&#x3D;&quot;z-storage z-type&quot;&gt; let&lt;/span&gt;&lt;span class&#x3D;&quot;z-entity z-name z-type&quot;&gt; Some&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;now&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator z-assignment z-keyword z-operator&quot;&gt; &#x3D;&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; p&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-keyword z-control&quot;&gt;        if&lt;/span&gt;&lt;span class&#x3D;&quot;z-constant z-language&quot;&gt; true&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;            p&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator z-assignment z-keyword z-operator&quot;&gt; &#x3D;&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class&#x3D;&quot;z-storage z-storage z-modifier&quot;&gt;mut&lt;/span&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt; now&lt;/span&gt;&lt;span class&#x3D;&quot;z-keyword z-operator&quot;&gt;.&lt;/span&gt;&lt;span&gt;next&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(As a slight note: we have also found programs that compile with Polonius Alpha but not legacy Polonius, so it&#x27;s not really a full subset.)&lt;/p&gt;
&lt;h2 id&#x3D;&quot;so-what-about-performance&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#so-what-about-performance&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
So, what about performance?&lt;/h2&gt;
&lt;p&gt;Polonius Alpha currently does strictly equal or more work compared to NLL, so we have been paying particular attention to potential performance regressions.&lt;/p&gt;
&lt;p&gt;From the top ten thousand crates by downloads on crates.io, we have seen relatively few &quot;significant&quot; regressions, and even crates that have a &quot;significant&quot; regression are typically &lt;em&gt;relatively&lt;/em&gt; minimal:&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://blog.rust-lang.org/2026/08/04/enabling-polonius-alpha-on-nightly/polonius_top10k_leaf.png&quot; alt&#x3D;&quot;top10k_leaf_graph&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Each point represents a crate within the 10,000 most-downloaded crates. The black line is an arbitrary threshold of significance, set to a 1% regression and quadratically scaled below 30 seconds. Red points are crates that pass this arbitrary regression threshold. X-axis is compile time (for the leaf crate only without dependencies) under NLL; Y-axis is the ratio of compile time under Polonius Time compared to NLL.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you look at the top five crates, they are:&lt;/p&gt;
&lt;p&gt;&lt;img src&#x3D;&quot;https://blog.rust-lang.org/2026/08/04/enabling-polonius-alpha-on-nightly/polonius_top10k_leaf_table.png&quot; alt&#x3D;&quot;top10k_leaf_table&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Outside the top ten thousand crates, we have focused mainly on crates with many borrows. The worst case we&#x27;ve seen is a 2-3x regression.&lt;/p&gt;
&lt;p&gt;We have done some initial triage of the causes of these regressions and are thinking about the best way to fix them. Though, overall we think these regressions are fairly reasonable even if we &lt;em&gt;can&#x27;t&lt;/em&gt; fix them, given how rare and relatively minimal they are compared to the additional power Polonius Alpha brings over NLL.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;i-really-don-t-want-this-how-do-i-opt-out&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#i-really-don-t-want-this-how-do-i-opt-out&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
I really don&#x27;t want this. How do I opt-out?&lt;/h2&gt;
&lt;p&gt;To reiterate: this is only being enabled on nightly. But if you want to disable Polonius Alpha, and only use the stable NLL, you can pass &lt;code&gt;-Zpolonius&#x3D;off&lt;/code&gt; to &lt;code&gt;rustc&lt;/code&gt;, use &lt;code&gt;RUSTFLAGS&#x3D;-Zpolonius&#x3D;off&lt;/code&gt;, or with a project&#x27;s &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://doc.rust-lang.org/cargo/reference/config.html&quot;&gt;&lt;code&gt;.cargo/config.toml&lt;/code&gt;&lt;/a&gt; configuration file:&lt;/p&gt;
&lt;pre class&#x3D;&quot;giallo z-code&quot;&gt;&lt;code data-lang&#x3D;&quot;toml&quot;&gt;&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;x86_64-unknown-linux-gnu&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span class&#x3D;&quot;z-variable&quot;&gt;rustflags&lt;/span&gt;&lt;span&gt; &#x3D;&lt;/span&gt;&lt;span class&#x3D;&quot;z-punctuation z-definition z-array&quot;&gt; [&lt;/span&gt;&lt;span class&#x3D;&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class&#x3D;&quot;z-string z-quoted z-string&quot;&gt;-Zpolonius&#x3D;off&lt;/span&gt;&lt;span class&#x3D;&quot;z-punctuation z-definition z-string z-string&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class&#x3D;&quot;z-punctuation z-definition z-array&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you have to do this, for some reason, please do tell us why &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/rust/issues/160456&quot;&gt;on Github&lt;/a&gt; or &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://rust-lang.zulipchat.com/#narrow/channel/186049-t-types.2Fpolonius/topic/Polonius.20Alpha.20enabled.20on.20nightly/near/614373312&quot;&gt;on Zulip&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;what-s-next&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#what-s-next&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
What&#x27;s next?&lt;/h2&gt;
&lt;p&gt;Over the next few months, we will be monitoring Github and Zulip for any reported issues about Polonius Alpha. We will also be working to address known performance regressions. Finally, we will be working on internal documentation about the implementation. All prior to stabilization. Then, we are aiming to stabilize prior to the end of the year!&lt;/p&gt;
&lt;p&gt;Although some programs that we &lt;em&gt;want&lt;/em&gt; to compile don&#x27;t work with Polonius Alpha (nor NLL today), we don&#x27;t currently have any concrete plans to continue active feature work on the Polonius implementation after the stabilization of Polonius Alpha. We expect to continue to optimize the implementation and address any performance regressions for a little while. We will likely come back to Polonius feature-work &lt;em&gt;at some point&lt;/em&gt;, but given that Polonius Alpha solves the most-encountered borrow-check issues, we are shifting our time to other high-priority work for the near future.&lt;/p&gt;
</content>

        <author>
            <name>Jack Huey</name>
        </author>
    </entry>
    <entry>
        <title>Announcing Rust 1.97.1</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2026/07/16/Rust-1.97.1/" type="text/html" title="Announcing Rust 1.97.1" />
        <published>2026-07-16T00:00:00+00:00</published>
        <updated>2026-07-16T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2026/07/16/Rust-1.97.1/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2026/07/16/Rust-1.97.1/">&lt;p&gt;The Rust team has published a new point release of Rust, 1.97.1. Rust is a programming language that is empowering everyone to build reliable and efficient software.&lt;/p&gt;
&lt;p&gt;If you have a previous version of Rust installed via rustup, getting Rust 1.97.1 is as easy as:&lt;/p&gt;
&lt;pre class&#x3D;&quot;giallo z-code&quot;&gt;&lt;code data-lang&#x3D;&quot;plain&quot;&gt;&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;rustup update stable&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you don&#x27;t have it already, you can &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.rust-lang.org/install.html&quot;&gt;get &lt;code&gt;rustup&lt;/code&gt;&lt;/a&gt; from the appropriate page on our website.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;what-s-in-1-97-1&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#what-s-in-1-97-1&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
What&#x27;s in 1.97.1&lt;/h2&gt;
&lt;p&gt;Rust 1.97.1 fixes a &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/rust/issues/159035&quot;&gt;miscompilation in an LLVM optimization&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We have backported both an LLVM fix and a disable of the underlying change in Rust 1.97.0 of
Rust&#x27;s generated IR that increased the likelihood of this happening. However,
note that the underlying miscompilation has been present since at least Rust
1.87.&lt;/p&gt;
&lt;p&gt;If you&#x27;d like to help us out by testing future releases, you might consider
running your code&#x27;s CI or locally using the beta channel (&lt;code&gt;rustup default beta&lt;/code&gt;) or the nightly
channel (&lt;code&gt;rustup default nightly&lt;/code&gt;). Please
&lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/rust/issues/new/choose&quot;&gt;report&lt;/a&gt; any bugs you
might come across!&lt;/p&gt;
&lt;h3 id&#x3D;&quot;contributors-to-1-97-1&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#contributors-to-1-97-1&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Contributors to 1.97.1&lt;/h3&gt;
&lt;p&gt;Many people came together to create Rust 1.97.1. We couldn&#x27;t have done it without all of you. &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://thanks.rust-lang.org/rust/1.97.1/&quot;&gt;Thanks!&lt;/a&gt;&lt;/p&gt;
</content>

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

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

        <author>
            <name>The Rust Release Team</name>
        </author>
    </entry>
    <entry>
        <title>Announcing Rust 1.96.1</title>
        <link rel="alternate" href="https://blog.rust-lang.org/2026/06/30/Rust-1.96.1/" type="text/html" title="Announcing Rust 1.96.1" />
        <published>2026-06-30T00:00:00+00:00</published>
        <updated>2026-06-30T00:00:00+00:00</updated>
        <id>https://blog.rust-lang.org/2026/06/30/Rust-1.96.1/</id>
        <content type="html" xml:base="https://blog.rust-lang.org/2026/06/30/Rust-1.96.1/">&lt;p&gt;The Rust team has published a new point release of Rust, 1.96.1. Rust is a programming language that is empowering everyone to build reliable and efficient software.&lt;/p&gt;
&lt;p&gt;If you have a previous version of Rust installed via rustup, getting Rust 1.96.1 is as easy as:&lt;/p&gt;
&lt;pre class&#x3D;&quot;giallo z-code&quot;&gt;&lt;code data-lang&#x3D;&quot;plain&quot;&gt;&lt;span class&#x3D;&quot;giallo-l&quot;&gt;&lt;span&gt;rustup update stable&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you don&#x27;t have it already, you can &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.rust-lang.org/install.html&quot;&gt;get &lt;code&gt;rustup&lt;/code&gt;&lt;/a&gt; from the appropriate page on our website.&lt;/p&gt;
&lt;h2 id&#x3D;&quot;what-s-in-1-96-1&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#what-s-in-1-96-1&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
What&#x27;s in 1.96.1&lt;/h2&gt;
&lt;p&gt;Rust 1.96.1 fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/cargo/pull/17131&quot;&gt;Missing retries / timeouts in Cargo&#x27;s HTTP client&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/rust/pull/158214&quot;&gt;Miscompilation in a MIR optimization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://github.com/rust-lang/cargo/pull/17140&quot;&gt;fixes&lt;/a&gt; three CVEs
affecting libssh2 (which is compiled into Cargo):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.cve.org/CVERecord?id&#x3D;CVE-2025-15661&quot;&gt;CVE-2025-15661&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.cve.org/CVERecord?id&#x3D;CVE-2026-55199&quot;&gt;CVE-2026-55199&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://www.cve.org/CVERecord?id&#x3D;CVE-2026-55200&quot;&gt;CVE-2026-55200&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id&#x3D;&quot;contributors-to-1-96-1&quot;&gt;&lt;a class&#x3D;&quot;anchor&quot; href&#x3D;&quot;#contributors-to-1-96-1&quot; aria-hidden&#x3D;&quot;true&quot;&gt;&lt;/a&gt;
Contributors to 1.96.1&lt;/h3&gt;
&lt;p&gt;Many people came together to create Rust 1.96.1. We couldn&#x27;t have done it without all of you. &lt;a rel&#x3D;&quot;external&quot; href&#x3D;&quot;https://thanks.rust-lang.org/rust/1.96.1/&quot;&gt;Thanks!&lt;/a&gt;&lt;/p&gt;
</content>

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

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

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

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

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

        <author>
            <name>Rust Security Response Team</name>
        </author>
    </entry>
</feed>
