<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="/rss-style.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title><![CDATA[🛡️ 💾  Tools – Cyber Threat Intelligence | TSECURITY.DE]]></title>
<link><![CDATA[https://tsecurity.de/export/rss/tools.xml]]></link>
<description><![CDATA[Entwickler- & Administrator-Tools. Werkzeuge für Code-Analyse, System-Diagnosen, Daten-Verschlüsselung und Automatisierung.]]></description>
<language>de-DE</language>
<lastBuildDate>Sun, 26 Jul 2026 17:37:33 +0200</lastBuildDate>
<pubDate>Sun, 26 Jul 2026 17:37:33 +0200</pubDate>
<ttl>15</ttl>
<copyright>2026 TSECURITY.DE Cyber Intelligence Team IT Security</copyright>
<managingEditor>editor@tsecurity.de (TSEcurity Redaktion)</managingEditor>
<webMaster>support@tsecurity.de (TSEcurity Intelligence Network)</webMaster>
<category>💾  Tools</category>
<generator>TSECURITY.DE Cyber Threat Intelligence Feed Generator v3.0</generator>
<image>
<url>https://tsecurity.de/favicon.ico</url>
<title><![CDATA[🛡️ 💾  Tools – Cyber Threat Intelligence | TSECURITY.DE]]></title>
<link><![CDATA[https://tsecurity.de/export/rss/tools.xml]]></link>
</image>
<atom:link href="https://tsecurity.de/export/rss/tools.xml" rel="self" type="application/rss+xml" />
<item>
<title><![CDATA[1,500 curl authors]]></title>
<description><![CDATA[It takes a village to make curl. A rather big village. I have not been a solo maintainer of curl for a long time and I don’t even do half of the commits anymore Since today, the curl git repository holds the accumulated efforts from 1,500 separate and named individuals. Only 4.5 years since we … ...]]></description>
<link>https://tsecurity.de/weiterlesen/3665897/3694038/1500-curl-authors/</link>
<pubDate>Sat, 25 Jul 2026 16:32:52 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[It takes a village to make curl. A rather big village. I have not been a solo maintainer of curl for a long time and I don’t even do half of the commits anymore Since today, the curl git repository holds the accumulated efforts from 1,500 separate and named individuals. Only 4.5 years since we … <a href="https://daniel.haxx.se/blog/2026/07/25/1500-curl-authors/" class="more-link">Continue reading <span class="screen-reader-text">1,500 curl authors</span> <span class="meta-nav">→</span></a>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Rust Programming Language Blog: Announcing Rust 1.96.0]]></title>
<description><![CDATA[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.
If you have a previous version of Rust installed via rustup, you can get 1.96.0 with:
$ rustup update stable
If you don't have it already,...]]></description>
<link>https://tsecurity.de/weiterlesen/3665155/3693296/the-rust-programming-language-blog-announcing-rust-1960/</link>
<pubDate>Sat, 25 Jul 2026 08:37:36 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>The Rust team is happy to announce a new version of Rust, 1.96.0. Rust is a programming language empowering everyone to build reliable and efficient software.</p>
<p>If you have a previous version of Rust installed via <code>rustup</code>, you can get 1.96.0 with:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>$</span><span> rustup update stable</span></span></code></pre>
<p>If you don't have it already, you can <a href="https://www.rust-lang.org/install.html" rel="external">get <code>rustup</code></a> from the appropriate page on our website, and check out the <a href="https://doc.rust-lang.org/stable/releases.html#version-1960-2026-05-28" rel="external">detailed release notes for 1.96.0</a>.</p>
<p>If you'd like to help us out by testing future releases, you might consider updating locally to use the beta channel (<code>rustup default beta</code>) or the nightly channel (<code>rustup default nightly</code>). Please <a href="https://github.com/rust-lang/rust/issues/new/choose" rel="external">report</a> any bugs you might come across!</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#what-s-in-1-96-0-stable"></a>
What's in 1.96.0 stable</h3>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#new-range-types"></a>
New <code>Range*</code> types</h4>
<p>Many users expect <code>Range</code> and related <code>core::ops</code> types to be <code>Copy</code>, but this is not the case: they implement <code>Iterator</code> directly, and <a href="https://rust-lang.github.io/rust-clippy/rust-1.95.0/index.html#copy_iterator" rel="external">it is a footgun to implement both <code>Iterator</code> and <code>Copy</code> on the same type</a> so this has been avoided. <a href="https://rust-lang.github.io/rfcs/3550-new-range.html" rel="external">RFC3550</a> proposed a set of replacement range types that implement <code>IntoIterator</code> rather than <code>Iterator</code>, meaning they can also be <code>Copy</code>. The standard library portion of that RFC is now stable, introducing:</p>
<ul>
<li><code>core::range::Range</code></li>
<li><code>core::range::RangeFrom</code></li>
<li><code>core::range::RangeInclusive</code></li>
<li>Associated iterators</li>
</ul>
<p>A Rust version in the near future will also add <code>core::range::RangeFull</code> and <code>core::range::RangeTo</code> as re-exports from <code>core::ops</code> (these do not implement <code>Iterator</code> and already implement <code>Copy</code>), and <code>core::range::legacy::*</code> as the new home for the current ranges. Range syntax like <code>0..1</code> still produces the legacy types for now, but will be updated to <code>core::range</code> types in a future edition.</p>
<p>With these stabilizations, it is now possible to store slice accessors in <code>Copy</code> types without splitting <code>start</code> and <code>end</code>:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span class="z-keyword">use</span><span class="z-entity z-name z-namespace"> core</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-namespace">range</span><span class="z-keyword z-operator">::</span><span class="z-entity z-name z-type">Range</span><span>;</span></span>
<span class="giallo-l"></span>
<span class="giallo-l"><span>#</span><span>[</span><span>derive</span><span>(</span><span class="z-entity z-name z-type">Clone</span><span>,</span><span class="z-entity z-name z-type"> Copy</span><span>)</span><span>]</span></span>
<span class="giallo-l"><span class="z-keyword">pub</span><span class="z-storage z-type"> struct</span><span class="z-entity z-name z-type"> Span</span><span>(</span><span class="z-entity z-name z-type">Range</span><span>&lt;</span><span class="z-entity z-name z-type">usize</span><span>&gt;</span><span>)</span><span>;</span></span>
<span class="giallo-l"></span>
<span class="giallo-l"><span class="z-keyword">impl</span><span class="z-entity z-name z-type"> Span</span><span> {</span></span>
<span class="giallo-l"><span class="z-keyword">    pub</span><span class="z-keyword"> fn</span><span class="z-entity z-name z-function"> of</span><span>(</span><span class="z-variable z-language">self</span><span>,</span><span class="z-variable"> s</span><span class="z-keyword z-operator">:</span><span class="z-keyword z-operator"> &amp;</span><span class="z-entity z-name z-type">str</span><span>)</span><span class="z-keyword z-operator"> -&gt;</span><span class="z-keyword z-operator"> &amp;</span><span class="z-entity z-name z-type">str</span><span> {</span></span>
<span class="giallo-l"><span class="z-keyword z-operator">        &amp;</span><span class="z-variable">s</span><span>[</span><span class="z-variable z-language">self</span><span class="z-keyword z-operator">.</span><span class="z-constant z-numeric">0</span><span>]</span></span>
<span class="giallo-l"><span>    }</span></span>
<span class="giallo-l"><span>}</span></span></code></pre>
<p>The new <code>RangeInclusive</code> also makes its fields public, unlike the legacy version which avoided exposing the exhausted iterator state. This isn't a concern with the new type since it must be converted to begin iteration.</p>
<p>Library authors should consider making use of <code>impl RangeBounds</code> in public API, which accepts both legacy and new range types. If a concrete type is needed, prefer using new ranges as this will eventually become the default.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#assert-matching-patterns"></a>
Assert matching patterns</h4>
<p>The new macros <code>assert_matches!</code> and <code>debug_assert_matches!</code> check that a value matches a given pattern, panicking with a <code>Debug</code> representation of the value otherwise. These are essentially the same as <code>assert!(matches!(..))</code> and <code>debug_assert!(matches!(..))</code>, but the printed value improves the possibility of diagnosing the failure.</p>
<p>These new macros have not been added to the standard prelude, because they would collide with popular third-party crates that provide macros with the same name. Instead, they should be manually imported from <code>core</code> or <code>std</code> before use.</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span class="z-keyword">use</span><span class="z-entity z-name z-namespace"> core</span><span class="z-keyword z-operator">::</span><span>assert_matches</span><span>;</span></span>
<span class="giallo-l"></span>
<span class="giallo-l"><span class="z-punctuation z-definition z-comment z-comment">///</span><span class="z-comment"> [Random Number](https://xkcd.com/221/)</span></span>
<span class="giallo-l"><span class="z-keyword">fn</span><span class="z-entity z-name z-function"> get_random_number</span><span>(</span><span>)</span><span class="z-keyword z-operator"> -&gt;</span><span class="z-entity z-name z-type"> u32</span><span> {</span></span>
<span class="giallo-l"><span class="z-punctuation z-definition z-comment z-comment">    //</span><span class="z-comment z-line z-double-slash z-comment"> chosen by a fair dice roll.</span></span>
<span class="giallo-l"><span class="z-punctuation z-definition z-comment z-comment">    //</span><span class="z-comment z-line z-double-slash z-comment"> guaranteed to be random.</span></span>
<span class="giallo-l"><span class="z-constant z-numeric">    4</span></span>
<span class="giallo-l"><span>}</span></span>
<span class="giallo-l"></span>
<span class="giallo-l"><span class="z-keyword">fn</span><span class="z-entity z-name z-function"> main</span><span>(</span><span>)</span><span> {</span></span>
<span class="giallo-l"><span class="z-entity z-name z-function">    assert_matches!</span><span>(</span><span class="z-entity z-name z-function">get_random_number</span><span>(</span><span>)</span><span>,</span><span class="z-constant z-numeric"> 1</span><span class="z-keyword z-operator">..=</span><span class="z-constant z-numeric">6</span><span>)</span><span>;</span></span>
<span class="giallo-l"><span>}</span></span></code></pre><h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#changes-to-webassembly-targets"></a>
Changes to WebAssembly targets</h4>
<p>WebAssembly targets no longer pass <code>--allow-undefined</code> to the linker which means that undefined symbols when linking are now a linker error instead of being converted to WebAssembly imports from the <code>"env"</code> module. This change prevents modules from linking unless all linking-related symbols are defined to catch bugs earlier and prevent accidental issues with symbol naming or similar.</p>
<p>Undefined linking-related symbols are often indicative of build-time related bugs or misconfiguration. If, however, the old behavior is intended then it can be re-enabled with <code>RUSTFLAGS=-Clink-arg=--allow-undefined</code> or by editing the source code and using <code>#[link(wasm_import_module = "env")]</code> on the block defining the symbol.</p>
<p>This change was <a href="https://blog.rust-lang.org/2026/04/04/changes-to-webassembly-targets-and-handling-undefined-symbols/" rel="external">previously announced</a> on this blog, and now takes effect in Rust 1.96.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#stabilized-apis"></a>
Stabilized APIs</h4>
<ul>
<li><a href="https://doc.rust-lang.org/stable/std/macro.assert_matches.html" rel="external"><code>assert_matches!</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/macro.debug_assert_matches.html" rel="external"><code>debug_assert_matches!</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/panic/struct.AssertUnwindSafe.html#impl-From%3CT%3E-for-AssertUnwindSafe%3CT%3E" rel="external"><code>From&lt;T&gt; for AssertUnwindSafe&lt;T&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/cell/struct.LazyCell.html#impl-From%3CT%3E-for-LazyCell%3CT,+F%3E" rel="external"><code>From&lt;T&gt; for LazyCell&lt;T, F&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/sync/struct.LazyLock.html#impl-From%3CT%3E-for-LazyLock%3CT,+F%3E" rel="external"><code>From&lt;T&gt; for LazyLock&lt;T, F&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeToInclusive.html" rel="external"><code>core::range::RangeToInclusive</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeFrom.html" rel="external"><code>core::range::RangeFrom</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeFromIter.html" rel="external"><code>core::range::RangeFromIter</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.Range.html" rel="external"><code>core::range::Range</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeIter.html" rel="external"><code>core::range::RangeIter</code></a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#two-cargo-advisories"></a>
Two Cargo advisories</h4>
<p>Rust 1.96 contains fixes for two vulnerabilities for users of third-party registries.</p>
<ul>
<li>
<p><a href="https://blog.rust-lang.org/2026/05/25/cve-2026-5223/" rel="external">CVE-2026-5223</a> is a <strong>medium</strong> severity vulnerability regarding extraction of crate tarballs with symlinks.</p>
</li>
<li>
<p><a href="https://blog.rust-lang.org/2026/05/25/cve-2026-5222/" rel="external">CVE-2026-5222</a> is a <strong>low</strong> severity vulnerability regarding authentication with normalized URLs.</p>
</li>
</ul>
<p>Users of crates.io are <strong>not affected</strong> by either vulnerability.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#other-changes"></a>
Other changes</h4>
<p>Check out everything that changed in <a href="https://github.com/rust-lang/rust/releases/tag/1.96.0" rel="external">Rust</a>, <a href="https://doc.rust-lang.org/nightly/cargo/CHANGELOG.html#cargo-196-2026-05-28" rel="external">Cargo</a>, and <a href="https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-196" rel="external">Clippy</a>.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/#contributors-to-1-96-0"></a>
Contributors to 1.96.0</h3>
<p>Many people came together to create Rust 1.96.0. We couldn't have done it without all of you. <a href="https://thanks.rust-lang.org/rust/1.96.0/" rel="external">Thanks!</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Nightly: Backup for a Rainy Day – These Weeks in Firefox: Issue 202]]></title>
<description><![CDATA[Highlights

The profile backup mechanism has been enabled by default for all desktop platforms in Nightly, as well as Beta! The current plan is to have this ride out to Firefox 151 for Windows, macOS and Linux on May 18th!

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

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

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

Dao added a new Eyedropper quick action! Check it out by typing “color” or “eyedropper” in the URL bar (Bug 1803575) on Nightly.



Henrik Skupin released geckodriver 0.37.0, which includes support for several new APIs and various bug fixes. See the release page for details.
Starting ...]]></description>
<link>https://tsecurity.de/weiterlesen/3665151/3693292/firefox-nightly-eyedropper-quick-action-geckodriver-037-and-tighter-file-permissions-these-weeks-in-firefox-issue-205/</link>
<pubDate>Sat, 25 Jul 2026 08:37:28 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h3>Highlights</h3>
<ul>
<li>Dao added a new Eyedropper quick action! Check it out by typing “color” or “eyedropper” in the URL bar (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1803575">Bug 1803575</a>) on Nightly.</li>
</ul>
<p><img alt='Firefox URL bar dropdown with "col" typed in, showing an eyedropper button labeled "Pick a color" below search suggestions.' class="aligncenter size-full wp-image-2084" height="358" src="https://blog.nightly.mozilla.org/files/2026/06/image1-3.png" width="724"></p>
<ul>
<li>Henrik Skupin <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1938333">released geckodriver 0.37.0</a>, which includes support for several new APIs and various bug fixes. See the <a href="https://github.com/mozilla/geckodriver/releases/tag/v0.37.0">release page for details</a>.</li>
<li>Starting from Firefox 153, access to local file: URLs is being restricted by default.
<ul>
<li>Extensions now require an explicit “Access local files on your computer” permission, separate from broad host permissions, that users must grant.</li>
<li>Extensions can call the extension.isAllowedFileSchemeAccess() API to determine whether they have been granted access to file: URLs (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2034168">Bug 2034168</a>).</li>
</ul>
</li>
</ul>
<h3>Friends of the Firefox team</h3>
<h4><a href="https://bugzilla.mozilla.org/buglist.cgi?title=Resolved%20bugs%20(excluding%20employees)&amp;quicksearch=1941404%2C2039281%2C2024187%2C1674047%2C1986161%2C2043187%2C2019260%2C2027580%2C2027582%2C2041640%2C2039294%2C2042309%2C1830551%2C2031735%2C2043952%2C1972065%2C2043958%2C2042419%2C2042820%2C2022661%2C1994826%2C2041802%2C1315558%2C1930776%2C2042921%2C2043938">Resolved bugs (excluding employees)</a></h4>
<p><a href="https://github.com/niklasbaumgardner/NewContributorScraper">Script to find new contributors from bug list</a></p>
<h4>Volunteers that fixed more than one bug</h4>
<ul>
<li>:Vincent</li>
<li>Chris Vander Linden</li>
<li>DrSeed</li>
<li>Khalid AlHaddad</li>
<li>Sam Johnson</li>
</ul>
<h4>New contributors (🌟 = first patch)</h4>
<ul>
<li>Francis :mckenfra: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1315558">tld service for webextensions</a></li>
<li>any1here: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042309">about:preferences#privacy is broken with MOZ_DATA_REPORTING false</a></li>
<li>pullmana8: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031735">Fix protocol/Actor.js to throw an Error instead of an Actor</a></li>
<li>RAN1: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1830551">Firefox Crashes on Quit When Running Two Browsers With Separate Profiles</a></li>
</ul>
<h3>Project Updates</h3>
<h4>Accessibility</h4>
<ul>
<li>Morgan added a new accessibility-specific, front-end review skill to mozilla central! 🎉 You can read about it, and learn how to use it <a href="https://firefox-source-docs.mozilla.org/bug-mgmt/processes/accessibility-review.html#automated-accessibility-review-skill">in the accessibility review source docs</a>.</li>
</ul>
<h4>Add-ons / Web Extensions</h4>
<h5>Addon Manager &amp; about:addons</h5>
<ul>
<li>Migrated addon-page-header and addon-card action buttons to the reusable moz-button web component as part of the ongoing Nova restyling of about:addons –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042200"> Bug 2042200</a> /<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042204"> Bug 2042204</a></li>
<li>Extended moz-page-nav-button with a forwarded title property to fix an accessibility issue where the component lacked a label in collapsed state; Landed in Firefox 153, and uplifted to Firefox 152 for about:settings which was already riding the 152 release train –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2040971"> Bug 2040971</a></li>
<li>Fixed a shutdown-timing bug where a pending GMP update-check timer could fire after XPCOMShutdownThreads started, causing a pref write assertion; Fixed in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2043803"> Bug 2043803</a></li>
</ul>
<h5>WebExtensions Framework</h5>
<ul>
<li>Fixed MV2 content scripts incorrectly injecting into guarded hosts because MozDocumentMatcher::MatchesURI was not consulting CheckGuarded when mCheckPermissions was false; Fixed in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2041393"> Bug 2041393</a></li>
<li>Added support for accessing ObservableArray attributes (such as adoptedStyleSheets) from XrayWrappers and extension content scripts, unblocking extensions that rely on this Web API; Fixed in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1751346"> Bug 1751346</a></li>
<li>Wired runtime_blocked_hosts and runtime_allowed_hosts enterprise policy settings through ExtensionSettings to allow administrators to restrict extension host permissions on managed devices, starting in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1805205"> Bug 1805205</a>
<ul>
<li>Thanks to Mike Kaply for implementing this enterprise policy enhancement.</li>
</ul>
</li>
</ul>
<h5>WebExtension APIs</h5>
<ul>
<li>Fixed promiseTabWhenReady blocking indefinitely on discarded tabs, preventing cleanup of associated resources and potentially causing memory leaks; Fixed in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1653876"> Bug 1653876</a></li>
<li>Fixed webNavigation.onCommitted being dispatched twice for cross-origin iframes loaded under Fission, caused by a redundant OnStateChange trigger firing in addition to OnLocationChange; Fixed in Firefox 153 –<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1750196"> Bug 1750196</a></li>
</ul>
<h4>DevTools</h4>
<ul>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=766005">Chris Vander Linden</a> made the Search input component shared as we plan to use it in the Netmonitor as well (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019260">#2019260</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027580">#2027580</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2027582">#2027582</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=631103">pullmana8</a> improved error management in the DevTools protocol (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031735">#2031735</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=553004">Chris H-C :chutten</a> removed Legacy Telemetry devtools instrumentation (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2039650">#2039650</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=13647">:glob ✱</a> fixed an issue in the Inspector where the swatch color for variable in @starting-style rule could have the wrong color (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2016778">#2016778</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> exposed heading level more clearly in the accessibility tree (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1588784">#1588784</a>) and in the accessibility highlighter (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2044904">#2044904</a>)</li>
</ul>
<p><img alt='Accessibility panel in Firefox DevTools showing a selected "heading (level 3)" node named "Backwards compatibility."' class="aligncenter size-full wp-image-2083" height="375" src="https://blog.nightly.mozilla.org/files/2026/06/image2-3.png" width="727"></p>
<ul>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=559949">Julian Descottes [:jdescottes]</a> migrated the markup view to HTML (from XHTML) to fix an issue when editing the markup (CodeMirror 6 does not support XHTML) (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2028058">#2028058</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=557153">Nicolas Chevobbe [:nchevobbe]</a> fixed an issue in Netmonitor search where it could appear the the search stalled (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042405">#2042405</a>)</li>
<li><a href="https://bugzilla.mozilla.org/user_profile?user_id=656417">Hubert Boma Manilla (:bomsy)</a> added more connection information (ECH, Delegated Credentials, OCSP, Private DNS, …) in Netmonitor Security tab (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2036404">#2036404</a>)</li>
</ul>
<h4>WebDriver</h4>
<ul>
<li>Khalid AlHaddad improved the window manipulation commands in Marionette and WebDriver BiDi to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1941404">allow individual window geometry properties, such as x, y, width, and height, to be adjusted independently</a>.</li>
<li>Khalid AlHaddad updated our codebase to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1972065">use constants instead of hardcoded strings</a> for all our session data types.</li>
<li>Alexandra Borovova updated <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2015655">the “emulation.setLocaleOverride” command to also apply a locale emulation in dedicated and shared workers</a>.</li>
<li>Alexandra Borovova fixed <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042385">a regression when there would be no “script.realmCreated” events after the cross-origin navigation</a>.</li>
</ul>
<h4>Search and Urlbar</h4>
<ul>
<li>Dharma updated context search actions to trigger search instead of entering search mode @ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1945080">1945080</a></li>
<li>Daisuke and Drew worked on a lot of Nova updates, including ensuring Nova is tested @ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2041255">2041255</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2030183">2030183</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2019168">2019168</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2044849">2044849</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2033583">2033583</a></li>
<li>Moritz has worked on several refactorings to allow the urlbar to be used in content @ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2039828">2039828</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2039298">2039298</a>, <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2041280">2041280</a></li>
<li>Middle click paste replaces content was fixed by Moritz @ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2042893">2042893</a></li>
<li>Michel added feature to show registrable domain on desktop after its implementation on mobile @ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1986161">1986161</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Hacks.Mozilla.Org: PACT: Anonymous Credentials for the Web]]></title>
<description><![CDATA[This is the technical companion to our update on Distilled, “Keeping the web open and private in the bot era.” Here we take a deeper look at the problem space, the design we’re proposing, and the problems still left to solve. 
Bots (and privacy-preserving browsers) not welcome 
Browse a news site...]]></description>
<link>https://tsecurity.de/weiterlesen/3665150/3693291/hacksmozillaorg-pact-anonymous-credentials-for-the-web/</link>
<pubDate>Sat, 25 Jul 2026 08:37:27 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p class="c43"><em><span class="c11 c1">This is the technical companion to our update on Distilled, </span><span class="c11 c1 c17"><a class="c5" href="https://blog.mozilla.org/en/privacy-security/keeping-the-web-open-and-private-in-the-bot-era/">“Keeping the web open and private in the bot era.”</a></span><span class="c11 c1"> Here we take a deeper look at the problem space, the design we’re proposing, and the problems still left to </span><span class="c1 c11">solve</span></em><span class="c13 c11 c1"><em>.</em> </span></p>
<h3 class="c24"><span class="c2 c1">Bots (and privacy-preserving browsers) not welcome </span></h3>
<p class="c40"><span class="c0">Browse a news site in a private window. Shop at a major retailer with a VPN. Visit a video streaming platform with anti-fingerprinting defenses tuned up. You’ll see the same responses: registration walls, block pages, and endless CAPTCHAs. The message is clear: </span><span class="c13 c11 c1">if we think you might be a bot, you’re not welcome</span><span class="c0">. </span></p>
<p class="c53"><span class="c0">Websites have valid reasons for wanting to block bots. Bots enable volumetric abuse</span><span class="c1">, abuse that wouldn’t otherwise be feasible if they had to be carried out by humans</span><span class="c0">. </span><span class="c0"> For example</span><span class="c1">: SEO comment spam, credential stuffing and DDoSing</span><span class="c0">.</span><span class="c0"> Consequently many sites employ dedicated anti-abuse tooling which aims to keep the bots out whilst minimizing friction for human visitors. </span></p>
<p class="c21"><span class="c0">Unfortunately, that tooling is increasingly failing at both tasks. Browser privacy protections are </span><span class="c3 c1"><a class="c5" href="https://blog.mozilla.org/en/firefox/fingerprinting-protections/">dismantling</a></span><span class="c0"> the passive signals that anti-abuse systems depended on to identify and distinguish </span><span class="c0">visitors</span><span class="c0">. Meanwhile advances in generative AI have rendered CAPTCHAs ineffective: bots now solve them </span><span class="c3 c1"><a class="c5" href="https://www.usenix.org/system/files/usenixsecurity23-searles.pdf">faster and more reliably</a></span><span class="c0"> than </span><span class="c0">humans</span><span class="c0">. </span></p>
<p class="c33"><span class="c0">Many sites are switching to more invasive mechanisms and now ask visitors to disclose </span><span class="c1">identifying information</span><span class="c0">,</span><span class="c0"> e.g. an email address, a federated login or </span><span class="c1">disabling their VPN</span><span class="c0">. This means greater friction for users, since providing these details on a first visit takes time. It also compromises their privacy, since these details enable the same kinds of cross-site tracking that browser privacy protections were intended to mitigate. </span></p>
<p class="c38"><span class="c0">This </span><span class="c1">leaves</span><span class="c0"> users </span><span class="c1">with a</span><span class="c0"> dilemma. The more effectively they protect their privacy, the harder it is for websites to distinguish them from bots and the worse the treatment they receive. Website operators are also suffering. The additional friction they inflict upon well-behaved visitors harms their site, but many are willing to pay the costs if it mitigates volumetric abuse. </span></p>
<p class="c44"><span class="c1">Browser-based AI agents make this tension more acute. Sites may want to allow agents which are acting on behalf of individual users while blocking agents engaged in volumetric abuse. However, with no effective mechanisms to distinguish the two, websites are opting to block </span><span class="c17 c1"><a class="c5" href="https://dl.acm.org/doi/epdf/10.1145/3730567.3732913">both</a></span><span class="c0">. That hurts users, who should be free to choose the user agent they use to access the web; it hurts new browsers and agents, which struggle to interoperate; and it hurts sites, which lose legitimate visitors.</span></p>
<p class="c30"><span class="c0">The consequence is that the web gets worse for everyone. Users get more friction or less privacy or both. Website operators see more volumetric abuse and the friction they add drives away users </span><span class="c1">who</span><span class="c0"> would otherwise want to consume their content or services. New user</span><span class="c1"> </span><span class="c0">agents struggle to access the same content as conventional browsers. </span></p>
<h3 class="c12"><span class="c20 c1">The</span><span class="c20 c1"> Costs of </span><span class="c2 c1">Convenient</span><span class="c2 c1"> Solutions</span></h3>
<p class="c9"><span class="c0">Some large ecosystem players have put forward solutions that leverage their control of the dominant operating systems and their deep integration with consumer hardware. These rely on device attestation: identifiers and privileged code baked into devices at the hardware level, which let manufacturers prove what software is running on a user’s device. Exposing this functionality to the web means attesting to sites that the user is running approved software with trusted hardware and therefore isn’t a bot. There have been two substantive proposals.</span></p>
<p class="c9"><span class="c0">Google’s Web Environment Integrity, <a href="https://www.theregister.com/software/2023/11/02/google-abandons-web-environment-integrity-api-proposal/335969">abandoned in 2023</a>, was the blunt version. It attested to the user agent itself, as well as the operating system and device in use. Users would have lost control in two ways: once to the attester, which would decide which operating systems and devices could be blessed, and again to the website, which would decide which software to accept. If sites had adopted allow-lists of approved user agents, building a new browser would have become virtually impossible, and sites could have withdrawn access from any user agent they chose.</span></p>
<p class="c9"><span class="c0">Apple’s Private Access Tokens, <a href="https://developer.apple.com/news/?id=huqjyh7k">deployed</a> across their ecosystem in 2022, have more subtle issues. Built on the Privacy Pass protocol standardized at the IETF, they get a lot right: a user receives a renewed, limited batch of one-time tokens that can be presented to websites without linking their visits together. This provides privacy for users and has shown rate limits to be an effective tool for sites – both points we’ll return to later in this post.</span></p>
<p class="c9"><span class="c1">However, Private Access Tokens rely on device attestation, requiring that the hardware manufacturer be in overall control of the user’s device. Presenting a PAT tells a website you are locked into Apple’s rules for what counts as acceptable software. </span><span class="c1">Due to PAT’s technical design</span><sup class="c1"><a href="https://hacks.mozilla.org/?p=48374#:~:text=PAT%20requires">[1]</a></sup><span class="c1">, there’s no way to open the system to other sources of scarcity without compromising the system’s privacy properties, meaning that if more widely deployed, access to the web would</span><span class="c1"> become tied to having bought expensive hardware from a small, hard to change set of vendors</span><span class="c1">. </span></p>
<p class="c9"><span class="c1">Both approaches are ultimately hostile to users and to the openness of the web. Both are premised on parts of a user’s device that sit within the manufacturer’s control and beyond the user’s own. Were they widely deployed, the web would become just another walled garden with centralized gatekeepers controlling acceptable hardware, operating systems and software. As convenient as these solutions are for the players who already dominate the ecosystem, we think there’s a better path.</span></p>
<h3 class="c24"><span class="c2 c1">A Better Path Forward </span></h3>
<p class="c24"><span class="c1">Bots’ harms arise from their ability to operate beyond human scale. For sites to prevent volumetric abuse they</span><span class="c0"> don’t actually need to know </span><span class="c1">the user’s</span><span class="c0"> identity or </span><span class="c1">receive cryptographic</span><span class="c0"> proof that they’re running approved softwar</span><span class="c1">e. If sites knew their visitors were restricted to a rate </span><span class="c1">limit</span><span class="c1"> set by a site, that would be enough.  </span></p>
<p class="c34"><span class="c1">Rate limits</span><span class="c0"> only make sense if </span><span class="c1">they’re</span><span class="c0"> </span><span class="c1">tied to</span><span class="c0"> something scarce; something an attacker can’t cheaply replicate to evade the limit. </span><span class="c0">Without anchoring to a scarce resource, like the trusted hardware used in Private Access Tokens, attackers can generate as many fresh identities as they need to bypass the rate limit. </span></p>
<p class="c56"><span class="c1">However, </span><span class="c0">hardware is just one option for </span><span class="c1">scarcity</span><span class="c0">. Anything a user already has that an attacker can’t trivially spin up at scale will work</span><span class="c1">: e</span><span class="c0">mail addresses and phone numbers are naturally scarce</span><span class="c1">. A paid subscription costs an attacker the same as a real user.  </span><span class="c0">Even maintaining an account on a free service requires </span><span class="c1">some</span><span class="c0"> non-trivial work. </span></p>
<p class="c39"><span class="c0">What if we could use these scarce signals across the web? We</span><span class="c1"> could build </span><span class="c0">an open ecosystem with many parties offering scarcity signals, each site choosing which to accept. By </span><span class="c0">opening up who can provide a signal, and letting sites choose which to accept, we can avoid transferring control to device manufacturers and the resulting harms. </span></p>
<p class="c39"><span class="c1">As a concrete example of who might be well positioned to provide such a signal, we can consider VPN providers acting as a subscription service. Sites routinely block VPN users indiscriminately, whether through a deliberate policy choice or through an indirect consequence of rate limiting visitors per IP address. But a VPN subscription is a perfect source of scarcity. If the VPN provider could vouch for its users so that sites could rate limit each user individually – then users would be able to browse the web with less friction and without giving up their VPN usage. </span></p>
<p class="c35"><span class="c0">The catch is that building </span><span class="c1">a system that can enable this</span><span class="c0"> on the open web whilst </span><span class="c1">maintaining user’s privacy</span><span class="c0"> is genuinely difficult. </span><span class="c1">It requires that we take information from one site — that this user holds some scarce thing — and expose it to other sites so that they can use that as the basis for their rate limiting. </span><span class="c0">Letting one site verify a signal from another is </span><span class="c1">the sort of </span><span class="c0">information flow</span><span class="c1"> </span><span class="c0">that privacy-pr</span><span class="c1">eserving </span><span class="c0">browsers have spent the last decade locking down to </span><span class="c1">prevent cross-site tracking</span><span class="c0">. </span></p>
<p class="c35"><span class="c1">Our goal would be that no more than the minimum information gets through: a single bit communicating whether the user is below the rate limit set by the site. Leaking anything more – like the source of the scarcity that the rate limit is anchored to – would be unacceptable. Enabling a new cross-site information flow might feel like compromising privacy to gain better access, but reality is more nuanced. If a new system moves sites away from demanding that visitors be identifiable (whether through fingerprinting or login forms), </span><span class="c1">it can be a win for both privacy and access.</span></p>
<h3 class="c24"><span class="c2 c1">The Foundations </span></h3>
<p class="c50"><span class="c0">The good news is that the cryptographic foundations for a privacy preserving approach already exist. The </span><span class="c1 c3"><a class="c5" href="https://privacypass.github.io/">Privacy Pass protocol</a></span><span class="c3 c1"><a class="c5" href="https://www.google.com/url?q=https://privacypass.github.io/&amp;sa=D&amp;source=editors&amp;ust=1782228494401139&amp;usg=AOvVaw3uoXdqARBZKjQF5H8uwYKY">,</a></span><span class="c0"> </span><span class="c3 c1"><a class="c5" href="https://www.petsymposium.org/2018/files/papers/issue3/popets-2018-0026.pdf">originally developed in 2018</a></span><span class="c0"> to reduce the friction of Cloudflare CAPTCHAs for Tor users, introduced the core primitive: a token that is </span><span class="c13 c11 c1">unlinkable </span><span class="c0">between issuance and redemption. You prove something to an issuer (e.g. by </span><span class="c1">solving a CAPTCHA</span><span class="c0">), receive some tokens, and later present a token to a website. The website can verify the token is legitimate, but can’t link it to the user it was issued to. </span></p>
<p><img alt="A diagram showing the protocol flow for Privacy Pass." class="aligncenter size-full wp-image-48375" height="1639" src="https://hacks.mozilla.org/wp-content/uploads/2026/06/pact-drawings-1.excalidraw1-scaled.png" width="2560"></p>
<p class="c27"><img alt="" title=""><span class="c20 c1 c57"><strong>Figure 1</strong>: </span><span class="c0"><em>In Privacy Pass, a CAPTCHA provider can issue tokens to a client which can then be used to bypass challenges for future site visits. Even if the CAPTCHA provider and sites collude, they can’t use the tokens to identify the user or their browsing history.</em> </span></p>
<p class="c52"><span class="c0">Privacy Pass has gone on to be successfully deployed in systems where the issuer and verifier have a prior trust relationship: </span><span class="c0">Apple</span><span class="c0"> uses it to authenticate users of </span><span class="c3 c1"><a class="c5" href="https://hacks.mozilla.org/feed/">Private Cloud Compute</a></span><span class="c0"> </span><span class="c1">and</span><span class="c0"> </span><span class="c3 c1"><a class="c5" href="https://www.apple.com/privacy/docs/iCloud_Private_Relay_Overview_Dec2021.PDF">Private Rel</a></span><span class="c17 c1"><a class="c5" href="https://www.google.com/url?q=https://www.apple.com/privacy/docs/iCloud_Private_Relay_Overview_Dec2021.PDF&amp;sa=D&amp;source=editors&amp;ust=1782228494402463&amp;usg=AOvVaw0KGoiSPg-8NLvNvIiSSbPt">ay</a></span><span class="c1"> </span><span class="c0">without linking their activity to their identity, </span><span class="c0">Chrome</span><span class="c0"> uses it for </span><span class="c3 c1"><a class="c5" href="https://github.com/GoogleChrome/ip-protection">two-hop IP protection</a></span><span class="c0">, and </span><span class="c0">Kagi</span><span class="c0"> uses it to provide </span><span class="c17 c1"><a class="c5" href="https://help.kagi.com/kagi/privacy/privacy-pass.html">private search</a></span><span class="c0">. </span><span class="c0">These deployments work in part because a small number of parties have agreed in advance on who issues tokens and who accepts them. </span></p>
<p class="c18"><span class="c0">Applying this approach to an open system where any site can act as</span><span class="c0"> an issuer</span><span class="c0"> </span><span class="c3 c1"><a class="c5" href="https://docs.google.com/document/d/1k3QJG2D_Sq4zJiJRn9DfY80hEHuz9UWrJdTt8LbRsMM/edit?tab=t.0#heading=h.r8jxzjcoeumo">brings real challenges</a></span><span class="c0">.</span><span class="c0"> Firstly, even though tokens are unlinkable, knowing a user has access to a specific issuer is a privacy leak on its own, because you can infer that the user meets the relevant issuance criteria. </span><span class="c1">If one site can learn that you have a token from another site, that reveals that you have been to that site, which can be a major privacy problem. </span><span class="c0">This compounds if </span><span class="c1">sites </span><span class="c0">can learn the set of issuers </span><span class="c1">you have visited</span><span class="c0">, since it becomes a fingerprint which can be used to identify </span><span class="c1">you</span><span class="c0">. </span></p>
<p class="c8"><span class="c3 c1"><a class="c5" href="https://blog.cryptographyengineering.com/2014/11/27/zero-knowledge-proofs-illustrated-primer/">Generic techniques</a></span><span class="c0"> exist for proving a statement in zero knowledge: we can prove that </span><span class="c1">a client</span><span class="c0"> ha</span><span class="c1">s</span><span class="c0"> a token from a set of acceptable issuers without revealing which specific issuer it is. We’ll call this issuer blinding. </span><span class="c0">The generic approach is often slow, but </span><span class="c3 c1"><a class="c5" href="https://www.ietf.org/archive/id/draft-orru-zkproof-sigma-protocols-01.html">bespoke approaches</a></span><span class="c0"> tailored to the underlying cryptography can improve this considerably. </span></p>
<p class="c54"><span class="c0">Another challenge is how sites using rate limits decide who to trust to issue tokens. If an issuer misbehaves then the site’s rate limits become ineffective, enabling volumetric abuse. However, if we need to prevent the site from learning which issuers a user has access to, the site is only going to know that one of its trusted issuers was used, not which one. This makes mistakes or misbehaviour by an issuer difficult to detect, and makes it hard for sites to evaluate new issuers. Solving this challenge is essential for openness. Without adequate information, </span><span class="c0">sites are likely to lean towards conservative issuer selection. </span><span class="c1">That could lead to less choice between Anchors, which in turn could lead to a new form of gatekeeper being created.</span><span class="c0"> </span></p>
<p class="c32"><span class="c0">To solve this, sites at least need a way to calculate an aggregate score for each issuer they use. This should roughly correspond to how much of the traffic it considers abusive to have come from users using that particular issuer. Mozilla has long invested in systems like </span><span class="c3 c1"><a class="c5" href="https://blog.mozilla.org/en/firefox/partnership-ohttp-prio/">Prio</a></span><span class="c0"> which use multiparty computation (MPC) to protect user privacy whilst enabling aggregate measurements of system behaviour. </span></p>
<p class="c59"><span class="c0">Privacy Pass also struggles to handle dynamic adjustments to rate limits. Once tokens have been issued, they’re difficult to invalidate without either revoking all active tokens or risking attacks which can compromise the privacy of users. It’s also beneficial if sites can adjust rate limits on a per </span><span class="c1">client</span><span class="c0"> basis, for example by increasing rate limits where they become more confident the </span><span class="c1">client</span><span class="c0"> is benign and withdrawing access </span><span class="c1">when abuse is detected</span><span class="c0">. </span></p>
<p class="c47"><span class="c3 c1"><a class="c5" href="https://www.ietf.org/archive/id/draft-schlesinger-cfrg-act-00.html">Anonymous Credit Tokens</a></span><span class="c0"> </span><span class="c0">offer a useful building block to solve this problem. Conventional Privacy Pass schemes rely on issuing a bucket of tokens but ACT works differently by enabling the use of a credential with state. For example, an ACT credential can hold an internal counter. When the credential is presented, the site can check the counter is over some threshold and mutate it, increasing or decreasing </span><span class="c1">the counter whenever</span><span class="c0"> the site’s perception of the holder has improved or worsened. Critically, the exact value is never leaked to the site, preventing the site from tracking the holder and ensuring successive presentations of the same credential can’t be linked. </span></p>
<h3 class="c24"><span class="c2 c1">Putting it together </span></h3>
<p class="c19"><span class="c1">So how can we combine these techniques to build a system which can enable privacy-preserving rate limiting on the open web? In May 2026, we participated in a </span><a href="https://pactworkshop.com/"><span class="c17 c1">W3C CG Meeting</span></a><span class="c0"> in collaboration with Cloudflare, Chrome and other web stakeholders in which we started sketching out a design we’re calling PACT – Private Access Control Tokens. </span></p>
<p class="c19"><span class="c0">Rate limits need a starting point, a source of scarcity to anchor on. We’ll call an entity that provides such a source an </span><span class="c2 c1">Anchor</span><span class="c0">. To a user who meets the Anchor’s criteria, like having a subscription,</span><span class="c0"> an account in good standing</span><span class="c0">, or a verified phone number, an Anchor issues a batch of </span><span class="c2 c1">Endorsement </span><span class="c0">tokens, following the Privacy Pass model. In practice, Anchors could be any website which has access to this kind of signal. An Endorsement conveys</span><span class="c1"> </span><span class="c0">scarcity to other sites. </span></p>
<p class="c51"><span class="c0">That’s enough for a simple system where access is </span><span class="c1">either granted or denied</span><span class="c0">. But as we discussed earlier, we also want the ability to increase access where a visitor behaves benignly and decrease it where they don’t. </span><span class="c1">The state needed to enforce a rate limit</span><span class="c0"> can’t live in the Endorsement, because Endorsements cross trust boundaries between unrelated sites. We need a second object that can hold that state, scoped to the party that maintains it. </span></p>
<p class="c48"><span class="c0">We’ll call that the party that handles rate limiting for a site a </span><span class="c2 c1">Moderator </span><span class="c0">and the stateful object a </span><span class="c2 c1">Credential</span><span class="c0">. </span><span class="c1">A Credential is specific to a Moderator and, unlike endorsements, we limit each site to nominating a single Moderator. In the common case the site itself plays the Moderator role, so there’s no new entity or trust boundary. </span><span class="c1">A Moderator can also be a third-party service shared across many sites, allowing those sites to cooperatively share a rate limit.</span><span class="c0"> </span></p>
<p class="c48"><span class="c0">In the terminology of the previous section, the Anchor is the issuer of Endorsements, and the Moderator both verifies Endorsements and issues Credentials. A Moderator manages rate-limit policy: it decides which Anchors it trusts, accepts their Endorsements, and issues a Credential in return.</span></p>
<p class="c14"><img alt="" title=""><img alt="A diagram showing an overview of the PACT system" class="aligncenter size-full wp-image-48381" height="1655" src="https://hacks.mozilla.org/wp-content/uploads/2026/06/pact-drawings-5.excalidraw21-scaled.png" width="2560"></p>
<p class="c14"><strong><span class="c1 c20">Figure 2: </span></strong><span class="c1"><em>(1) Clients acquire Endorsements from Anchors in the course of normal browsing to sites they have relationships with. (2) Clients can exchange Endorsements for a stateful Credential from a Moderator. (3) Credentials can be used to access sites which use that Moderator. Credentials can be updated over time.</em> </span></p>
<p class="c41"><span class="c0">Directly revealing which Anchor backed an Endorsement would leak a lot of information about the user. The issuer blinding techniques from the previous section solve this: when an Endorsement is redeemed, the Moderator only learns that it came from one of </span><span class="c1">the </span><span class="c0">Anchors it trusts, but not which one. </span></p>
<p class="c28"><span class="c0">When a Moderator covers more than one site, we let Credentials be presented across all of them but partition cookies and storage as</span><span class="c1"> we would for any other third party site</span><span class="c0">. The unlinkability of </span><span class="c1">Credential</span><span class="c0"> presentations keeps this from creating a new cross-site identifier. The benefit is that good behaviour on one site improves access on every site the Moderator covers, and bad behaviour cuts it everywhere. Websites can already build the same capability with a shared account system, so this doesn’t create a new way to lock users out, but it </span><span class="c1">does provide a</span><span class="c0"> new way to grant access without requiring users to give up their privacy. </span></p>
<p class="c28"><span class="c0">Enabling Moderators that cover many sites carries a centralisation risk, simila</span><span class="c1">r </span><span class="c0">to the concentration we see today in anti-abuse providers. The mitigation is that the choice of Moderator stays with each site, and the choice of trusted Anchors stays with each Moderator. Th</span><span class="c1">is</span><span class="c0"> </span><span class="c1">can’t</span><span class="c0"> reverse the centralisation pressure the web already faces, but it </span><span class="c1">ensures this system won’t lead to additional lock-in</span><span class="c0">: a new Anchor or a new Moderator can be adopted without coordinating with a dominant vendor. </span></p>
<p class="c46"><span class="c0">The </span><span class="c1">system then has three flows</span><span class="c0">.</span><span class="c0"> First, the user </span><span class="c1">receives</span><span class="c0"> Endorsements from an Anchor in the course of normal interaction</span><span class="c1">, based on the Anchor’s positive view of the user</span><span class="c0">. This is </span><span class="c0">a relatively rare operation for any given user and Anchor. After all, as our source of scarcity, Endorsements should not be too easy to accumulate.</span></p>
<p class="c10"><img alt="" title=""><img alt="A diagram showing the PACT Anchor Flow" class="aligncenter size-full wp-image-48377" height="1789" src="https://hacks.mozilla.org/wp-content/uploads/2026/06/pact-drawings-3.excalidraw1-scaled.png" width="2560"></p>
<p class="c10"><strong><span class="c20 c1">Figure 3</span></strong><span class="c1">: <em>In the course of normal browsing, clients browse to websites they have a relationship with. These sites can act as Anchors by issuing Endorsements to clients.</em></span></p>
<p class="c26"><span class="c0">Second, when the user arrives at a site that works with a Moderator, the browser spends an Endorsement from an Anchor the Moderator trusts and receives a Credential in return. The presentation hides </span><span class="c13 c11 c1">which </span><span class="c0">Anchor was used, and </span><span class="c1">neither the Anchor nor the Moderator can trace the Endorsement back to where it was issued</span><span class="c0">. The Moderator decides what initial balance the Credential starts with. If the user has no Endorsements from suitable Anchors at all, existing mechanisms (CAPTCHAs, account creation, federated login) </span><span class="c1">could be used to</span><span class="c0"> bootstrap a Credential the same way, so the system degrades to today’s experience rather than locking the user out.</span></p>
<p class="c7"><img alt="" title=""><img alt="A diagram showing the protocol flow between Anchors and Moderators" class="aligncenter size-full wp-image-48378" height="1789" src="https://hacks.mozilla.org/wp-content/uploads/2026/06/pact-drawings-4.excalidraw1-scaled.png" width="2560"></p>
<p class="c7"><span class="c20 c1"><strong>Figure 4</strong></span><span class="c1"><strong>:</strong><em> When the client browses to a site, it can prompt the client for a Credential from the Moderator it uses. If the Client doesn’t have a suitable Credential, but does have a suitable Endorsement, it can exchange it for a Credential with the Moderator. In practice, the Moderator and the Site might be the same server. </em></span><em><span class="c0"> </span></em></p>
<p class="c25"><span class="c0">Third, as the user browses, the browser presents the Credential and the Moderator updates </span><span class="c1">the internal state of the Credential</span><span class="c0">. The </span><span class="c1">Moderator can reward </span><span class="c0">behaviour that looks benign and </span><span class="c1">penalize suspicious activity</span><span class="c0">, </span><span class="c1">but can’t track the use of the Credential or identify it if it’s used on other sites the Moderator covers</span><span class="c0">. </span><span class="c0">Revocation falls out of the same mechanism: a Moderator </span><span class="c1">can refuse to return an updated Credential</span><span class="c0">.</span><span class="c0"> </span></p>
<p class="c7"><img alt="" title=""><img alt="A diagram showing the PACT Moderator Flow" class="aligncenter size-full wp-image-48379" height="1618" src="https://hacks.mozilla.org/wp-content/uploads/2026/06/pact-drawings-5.excalidraw1-scaled.png" width="2560"></p>
<p class="c7"><strong><span class="c20 c1">Figure 5</span></strong><span class="c0"><strong>:</strong> <em>The Client can present the Credential on sites which use the matching Moderator. Sites can check if the Credential is in good standing. The sites can then adjust the access the Credential has in response to behaviour. E.g. increasing it when they gain confidence in the client or reducing it in response to malicious behaviour.</em></span></p>
<p class="c23"><span class="c0">In practice, all of this would happen transparently to the user through a WebAPI that sites acting as Anchors or Moderators would call from JavaScript. In an ideal ecosystem, users would accumulate Endorsements through normal browsing, just by virtue of the sites they already visit, and the rest of the flow would happen in the background as they move around the web, leaving </span><span class="c1">users</span><span class="c0"> with meaningfully less friction. </span></p>
<p class="c16"><span class="c0">AI agents acting on behalf of a user slot into the same flow. An agent can carry its user’s Credentials, in which case the user remains accountable for how the agent </span><span class="c1">behaves.</span><span class="c0"> </span><span class="c1">S</span><span class="c0">ites would not need to grant any more access than they would to the user themselves. Alternatively, the operator of an agent can run its own Anchor and vouch for its agents the way other Anchors vouch for human users. </span><span class="c0">Sites retain control over which Anchors they accept, so they can choose how to treat agent traffic without needing a separate detection mechanism. </span></p>
<p class="c6"><span class="c0">Several mechanisms combine to keep the information about a user that flows out close to a single bit. Cryptographic unlinkability ensures successive Credential presentations cannot be tied to each other or to the original issuance, so a user’s visits cannot be </span><span class="c1">joined</span><span class="c0"> into a history. Each site is bound to a single Moderator, so the set of Moderators a user has Credentials with never becomes a cross-site fingerprint. The Anchor-to-Credential exchange happens in an isolated browsing context, so during ordinary browsing the only thing the site or its Moderator ever observes is a Credential presentation: </span><span class="c1">the site only learns if </span><span class="c0">the user has a valid Credential below the rate limit, or </span><span class="c1">nothing</span><span class="c0">. </span><span class="c1">W</span><span class="c0">hen the Moderator updates a </span><span class="c1">Credential</span><span class="c0">, it</span><span class="c0"> adjusts the credentials state without learning what it is.</span></p>
<p class="c6"><span class="c1">The additional privacy given to users from </span><span class="c0">Issuer blinding</span><span class="c1"> makes participating in the system more challenging for Moderators</span><span class="c0">. Because the Moderator can’t see which Anchor backed a Credential at issuance, it can’t give a Credential from a strong Anchor </span><span class="c1">more access</span><span class="c0"> than one from a weak Anchor: doing so would itself leak which Anchor was used. The initial </span><span class="c1">access</span><span class="c0"> has to be uniform across the Moderator’s whole pool of Anchors, which in practice means setting it at the strength of the weakest. </span><span class="c1">However, this is only relevant for that initial access, the Moderator can update credentials according to the holder’s behavior, enabling Credential’s to accrue access over time.</span></p>
<p class="c42"><span class="c0">Building an open ecosystem also requires that sites can make effective decisions about the Anchors they choose to trust</span><span class="c1">. M</span><span class="c0">ultiparty computation systems like </span><span class="c0">Prio</span><span class="c0"> enable aggregate scoring without compromising pr</span><span class="c1">ivacy</span><span class="c0">. When users present Credentials, they can provide an encrypted share which identifies the anchor they use</span><span class="c1">d and can be privately aggregated to compute the quality of an issuer.</span></p>
<h3 class="c24"><span class="c2 c1">Next Steps </span></h3>
<p class="c49"><span class="c1">We think the</span><span class="c0"> architecture we</span><span class="c1">’ve </span><span class="c0">sketched </span><span class="c1">for PACT </span><span class="c0">has the right shape, but many of the details still need to be worked out</span><span class="c1"> and the entire system needs rigorous privacy and security analysis.</span></p>
<p class="c45"><span class="c0">We want to do that work in the open. The IETF is the natural venue for the cryptographic protocols underneath, and the W3C for the WebAPI surface that sits on top. </span><span class="c0">We’ll be </span><span class="c1">bringing</span><span class="c0"> </span><span class="c3 c1"><a class="c5" href="https://github.com/Moderation-of-unLinkable-Endorsements">draft specifications</a></span><span class="c1"> to these bodies as soon as they’re ready</span><span class="c0">, and we welcome collaborators from across the ecosystem: browser vendors, site operators, anti-abuse providers, and the cryptography community. </span></p>
<p class="c29"><span class="c0">If successful, we think we can provide a system which will keep the web open and </span><span class="c1">private</span><span class="c0">, while still giving sites the rate-limiting signal they need. </span></p>
<h3 class="c29"><span class="c2 c1">Acknowledgements</span></h3>
<p class="c4"><em><span class="c11 c1">The ideas described here are the result of collaboration and conversations with many people, including: Watson Ladd, Thibault Meunier, Michele Orrù, Trevor Perrin, Eric Rescorla, Samuel Schlesinger, Martin Thomson, Eric Trouton, Benjamin Vandersloot &amp; Cathie Yun.</span></em><span class="c11 c1"><em> </em> </span></p>
<hr class="c58">
<div>
<p class="c31"><a href="https://hacks.mozilla.org/?p=48374#:~:text=%5B1%5D">[1]</a><span class="c0"> PAT requires that the source of scarcity and an independent issuer be trusted not to collude. If they do, they can track users as they interact with the system. This is not suitable in the context of an open system where any party could play those two roles.</span></p>
</div>
<p>The post <a href="https://hacks.mozilla.org/2026/06/pact-anonymous-credentials-for-the-web/">PACT: Anonymous Credentials for the Web</a> appeared first on <a href="https://hacks.mozilla.org/">Mozilla Hacks - the Web developer blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v8.16.0]]></title>
<description><![CDATA[We fixed a bug in the sticker creator that displayed the interface in the wrong language. Even though stickers are pictures (and therefore worth a thousand words) it's still important to get the words right too.]]></description>
<link>https://tsecurity.de/weiterlesen/3665149/3693290/v8160/</link>
<pubDate>Sat, 25 Jul 2026 08:37:25 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<ul>
<li>We fixed a bug in the sticker creator that displayed the interface in the wrong language. Even though stickers are pictures (and therefore worth a thousand words) it's still important to get the words right too.</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Rust Programming Language Blog: The many journeys of learning Rust]]></title>
<description><![CDATA[This is another post in our series covering what we learned through the Vision Doc process. We previously described the overall approach and what we learned about doing user research, we explored what people love about Rust, dug into what it takes to ship safety-crticial Rust, and described some ...]]></description>
<link>https://tsecurity.de/weiterlesen/3665148/3693289/the-rust-programming-language-blog-the-many-journeys-of-learning-rust/</link>
<pubDate>Sat, 25 Jul 2026 08:37:24 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p><em>This is another post in our series covering what we learned through the Vision Doc process. We previously <a href="https://blog.rust-lang.org/2025/12/03/lessons-learned-from-the-rust-vision-doc-process/" rel="external">described the overall approach and what we learned about doing user research</a>, we <a href="https://blog.rust-lang.org/2025/12/19/what-do-people-love-about-rust/" rel="external">explored what people love about Rust</a>, <a href="https://blog.rust-lang.org/2026/01/14/what-does-it-take-to-ship-rust-in-safety-critical/" rel="external">dug into what it takes to ship safety-crticial Rust</a>, and <a href="https://blog.rust-lang.org/2026/03/20/rust-challenges/" rel="external">described some of the major challenges that people face when using Rust</a>.</em></p>
<p>In this post we walk through what folks have found on their journey to learn the Rust programming language with ups and downs covered.</p>
<p>As a disclaimer, LLMs (Large Language Models) come up in this post because our interviewees brought them up. We're scoping discussion to their use as a learning tool, covering research and example generation, not broader questions about AI (Artificial Intelligence) in software development.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#many-paths-to-needing-rust"></a>
Many paths to needing Rust</h3>
<p>The interviews surfaced several different paths into Rust: curiosity, embedded work, job-market pressure, organizational adoption, and reassignment after a team or company chose Rust. That last path matters because many learners are not evaluating Rust from a blank slate; they are trying to become productive after Rust has already arrived in their work.</p>
<blockquote>
<p>"Funny enough, I've advocated for more niche languages than Rust in the past. Rust has pretty much stopped being as much of a niche language as it was, but it's not Java." -- Fractional CTO</p>
</blockquote>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#rust-learning-resources"></a>
Rust learning resources</h3>
<p>Likely as expected, the folks that we talked to reach for a range of resources to learn Rust. Some reach for official documentation, such as <a href="https://doc.rust-lang.org/book/" rel="external">The Rust Programming Language Book</a> and find that sufficient to build on what the compiler was already showing them.</p>
<blockquote>
<p>"I started with the official Rust documentation because there are a lot of great examples of how features like the borrow checker work." -- Software engineer at an Automotive supplier</p>
</blockquote>
<p>Others needed more passes and more formats, sometimes reaching for resources the community maintains, such as <a href="https://rustlings.rust-lang.org/" rel="external">Rustlings</a>, <a href="https://danielkeep.github.io/tlborm/book/index.html" rel="external">The Little Book of Rust Macros</a>, and <a href="https://rust-unofficial.github.io/too-many-lists/" rel="external">Learn Rust With Entirely Too Many Linked Lists</a>.</p>
<blockquote>
<p>"The first time I went through the chapter in [The Rust Programming Language] on borrow checking, I was like, what is this? I read it again, then I watched a YouTube video of someone explaining the chapter." -- Rust freelance consultant</p>
</blockquote>
<blockquote>
<p>"Rust book, Rustlings, Zero to Production in Rust, Jon Gjengset tutorials. A bunch of books. It's not a one-pass reading. Can't say how many times I've gone through it." -- Software engineer working on video streaming and storage</p>
</blockquote>
<p>These resources have brought up an entire generation of Rust programmers. But, to some, there is a perception that these resources have trouble keeping pace with the language.</p>
<blockquote>
<p>"We'd like to use [The Rust Programming Language/'the book'], but we've found that it's out of date, unfortunately. We've looked at the GitHub repo and found it's got a lot of unresolved issues and unmerged PRs" -- Principal Software Engineering work on Rust adoption in a regulated industry</p>
</blockquote>
<p>Whether or not this is factually true, Rust's growth has nonetheless put more scrutiny on these materials. Companies evaluating adoption and engineers getting reassigned to Rust teams are looking at them with fresh eyes and finding the gaps that affect their own evaluation.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#beginner-stumblings-and-unlearning-habits"></a>
Beginner stumblings and unlearning habits</h3>
<p>It's pretty typical for Rust to be the 2nd, 3rd or Nth programming language that someone picks up. They'd end up writing their most familiar language in Rust, whether C++ patterns, Java patterns, or whatever they knew, for months or even years. Eventually they got comfortable enough to start writing idiomatic Rust.</p>
<blockquote>
<p>"There's a bit of a drop in productivity compared to C if you're already familiar with it just because you're learning new rules, new syntax."  -- Principal Firmware Engineer (mobile robotics)</p>
</blockquote>
<blockquote>
<p>"In the beginning it was more poking around the code and adding and removing some ampersands and asterisks to try to make sense of <code>mut</code> and not <code>mut</code> and whatever." -- Senior engineer with 20 years of Java experience in cloud and IoT</p>
</blockquote>
<p>We also spoke with someone who found that not having much of a programming background seemed to benefit people picking up Rust. Not having worn-in grooves from other languages may play a role here, and it's worth investigating further.</p>
<blockquote>
<p>"I had someone who had never programmed much before start working on the internals of [our Rust project]. She was just fine with getting into Rust. It's more of the senior people that struggle as they need to unlearn practices which may work in other languages, but it's not the 'Rust' way." -- Researcher, Automotive OEM R&amp;D Lab</p>
</blockquote>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#learning-to-work-with-the-borrow-checker"></a>
Learning to work with the borrow checker</h3>
<p>We heard a lot about learning to work with the borrow checker instead of against it. People get there through different paths, but a few patterns came up repeatedly.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#the-compiler-as-teacher"></a>
The compiler as teacher</h4>
<p>Rust's diagnostics did the teaching on their own, especially around lifetimes.</p>
<blockquote>
<p>"If you mess up the lifetimes in a piece of code that you've written by hand, I usually find that Rust's diagnostics are very helpful" -- Researcher working on static analysis of Rust programs</p>
</blockquote>
<blockquote>
<p>"Whatever's missing, the compiler usually fills in: it tells me 'you need to declare the lifetime of this reference', so I know and can figure it out. That all generally works pretty well." -- Senior Software Engineer</p>
</blockquote>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#learning-by-doing"></a>
Learning by doing</h4>
<p>Others felt like they only really internalized the borrow checker after writing a lot of Rust. It took projects, coding challenges, prototyping and so on until at some point it clicked.</p>
<blockquote>
<p>"I actually did not understand the borrow checker until I spent a lot of time writing Rust" -- Founder of a startup built on Rust</p>
</blockquote>
<blockquote>
<p>"Besides the prototyping work, I also did coding-challenge-type stuff to get familiar with Rust for Advent of Code. [..] It eventually clicked to the point where I wasn't fighting with Rust, it was working for me. I had that experience other people describe: when I managed to get my program to fit with Rust, it worked. I didn't spend time debugging." -- Principal Software Engineer, large SaaS provider</p>
</blockquote>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#letting-go-of-clone-guilt"></a>
Letting go of "clone guilt"</h4>
<p>Some learners arrive with the assumption that good Rust means zero clones, zero copies, lifetimes threaded through everything. They set the bar at optimal before they've learned how to write idiomatic Rust, and it makes the borrow checker feel harder than it needs to be at the outset.</p>
<blockquote>
<p>"On one of my first projects, I was like, 'I don't ever want to copy or clone anything,' so I carefully wove through all the lifetimes and got myself into a bit of a bind. Then I saw someone else just cloning the struct I was working with, and it was super cheap. Sometimes you can just clone and it's going to be okay." -- Researcher at a university</p>
</blockquote>
<p>The experienced Rust developers we spoke with consistently said the same thing: clone freely while you're learning, then optimize when you understand the problem. Rust's reputation for performance and correctness feeds this. Newcomers assume anything less than optimal is wrong before they've written a first working program, and clone guilt is how that shows up.</p>
<p>We think it could be an interesting area of future study to check into the patterns Rust programmers employ at different levels of experience and under which circumstances. One member of the Rust Vision doc team that's very experienced with Rust noted that there's kind of an "expected shape" they understand as passing the compiler. This knowledge influences how they approach writing code which wouldn't take that shape and they naturally find themselves understanding when to use so-called workarounds, such as passing around indices into arrays or <code>Vec</code>s.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#multi-paradigm-but-not-the-oop-some-are-used-to"></a>
Multi-paradigm, but not the OOP some are used to</h3>
<p>The Rust programming language is multi-paradigm, and how that lands depends on what you're coming from. We heard some that came from a functional background were delighted with digging into learning how much Rust inherits from that lineage. Some others noted that they and others on their teams struggled to unlearn the object-oriented style they'd come to use heavily in other languages like C++ and Java.</p>
<blockquote>
<p>"Developers coming from C++ tend to think object-oriented. I think that's a difference between C++ and Rust." -- Architect at Automotive OEM</p>
</blockquote>
<blockquote>
<p>"I had exactly that thing, where I would apply all my years of Java and JS thinking, where I could just create some object, not care about it, return it, have it sloshing around between various functions. Found myself reaching for these patterns and then being told 'no, you cannot do that'." -- Principal Engineer at a SaaS company</p>
</blockquote>
<p>Developers coming from functional programming had less to unlearn: strong typing, pattern matching, and an expression-oriented style were already familiar.</p>
<blockquote>
<p>"My background has been more functional programming, strong typing. That originated for me as a Lisper: once a Lisper, always a Lisper." -- Principal Software Engineer working on Rust tooling for safety-regulated industries</p>
</blockquote>
<blockquote>
<p>"The languages I primarily used before Rust were things like OCaml. Way back, I came from C and C++, the classic languages, and then I spent quite a long time doing primarily pure functional stuff. These days I've ended up back in what I like to think of as a pragmatic center ground [with Rust]." -- Fractional CTO</p>
</blockquote>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#teaching-rust-in-academia"></a>
Teaching Rust in academia</h3>
<p>We spoke with a university professor that's been teaching Rust generally. In the academic environment, they were able to use proxies for some things such as "traits are like interfaces in Java" because the students had already gone through a set of courses in their first and second years that taught them Java. They introduced concepts slowly throughout the course, choosing to deal with some more complex topics like generics later. The outcome generally was that students had no problem picking up Rust in this setting.</p>
<blockquote>
<p>"I couldn't see any big difference on the embedded side. We also teach an embedded class, and we did an experiment. Half of the students' feedback was worse on the Rust class, mostly because they needed to build the project themselves. The C students just got one from [an LLM], absolutely no problem." -- University Professor, on teaching Rust</p>
</blockquote>
<p>The C cohort leaned on LLMs for the project in ways the Rust cohort couldn't. We don't yet have a clear answer for why.</p>
<p>What did come through clearly was the Rust cohort's experience with the community. Some students needed to figure out which drivers to use for the embedded project and how to use them. Their professor encouraged them to open issues and ask questions directly on GitHub, and the maintainers responded. Students who had never contributed to open source before were getting answers from the people who wrote the code.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#learning-using-llms"></a>
Learning using LLMs</h3>
<p>Some experienced folks shared that they saw LLMs as a tool that can help someone come up to speed quickly, either as a research tool or for generating example Rust code to understand concepts.</p>
<blockquote>
<p>"I'm optimistic that there's a way to work [LLMs] in that will cut down that learning curve. One of the big things these tools bring is reducing the learning curve in general; these are very good tools to help you navigate a space that you don't know yet." -- Maintainer of large open source Rust crate</p>
</blockquote>
<blockquote>
<p>"I try [LLMs] out once a month, usually for generating an example or something like this. Just like with Stack Overflow: when you read an example, you should read it carefully and try to understand it. Not copy and paste it, but type it in your own words in code and then check it, because that's where the teeny tiny little mistakes are." -- Founder of startup built on Rust</p>
</blockquote>
<p>For some learners, an LLM is just another way to find answers, no different than a search engine.</p>
<blockquote>
<p>"So for the most part, picking up Rust - how do I learn? I'll [use web search for] things, I'll ask [an LLM], I'll just poke around and read the code." -- Senior Software Engineer working in a regulated space</p>
</blockquote>
<p>One founder went further and claimed that LLMs change who can become a Rust developer. One consulting company founder described hiring high school graduates with no systems programming background and training them as Rust developers, with LLMs filling in the learning gaps that would previously have required years of experience.</p>
<blockquote>
<p>"At the beginning, I was worried, but now that we have [LLMs] supporting development, the difficulty of the language doesn't matter. I'm seeing a huge opportunity behind strong runtime languages like Rust. [..] In [Developing Country] we hire 20-25 high school graduates, train them to be Rust programmers, then they enhance our workforce worldwide." -- Founder of a consulting company</p>
</blockquote>
<p>We heard this from one organization. This is a claim that the combination of Rust's compiler and LLM tooling can dramatically shorten the path from beginner to working developer. Whether it generalizes depends on questions we can't answer from a single interview: how long these developers stay, what kind of code they can maintain independently, and whether this training/learning model works outside this company's particular structure. If it holds up, the pool of people who can become Rust developers is much larger than the usual hiring profile suggests.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#organizational-considerations-for-rust-learners"></a>
Organizational considerations for Rust learners</h3>
<p>We spoke with a number of folks on teams that are using Rust in larger organizations. Teams wanted to know that everyone would end up at roughly the same level of competence, which led a good number to invest in training courses to get there. Some leaders found that staff was able to ramp well enough by reading The Rust Programming Language, going through Rustlings, and then picking up lower risk and priority tickets to work on. Having a sense of community was also important within companies; it helps people know they are not alone when they are asked to work on Rust after, say, a reorganization happens.</p>
<blockquote>
<p>"[..] the idea with the class as opposed to 'just read the Rust book on your own' was that this gives everyone kind of the same baseline going in."  -- Principal Firmware Engineer (mobile robotics)</p>
</blockquote>
<blockquote>
<p>"So typically we're going to have people work through Rustlings, work through The Rust Programming Language. We have them then start to pick up lower risk tickets to work on." -- Principal Engineer at a large SaaS provider</p>
</blockquote>
<blockquote>
<p>"We've got an internal Slack channel for Rust learning where people can drop questions and others will come in and answer them. That helps build up understanding and community." -- Software Engineer at a large corporation</p>
</blockquote>
<p>Some organizations found that while the person they'd hire would need to learn Rust, it was still preferable to the alternative of hiring someone for a critical piece of software written in another language.</p>
<blockquote>
<p>"They needed to grow and maintain this C++ codebase. They had a C++ wizard, and they tried for about two years to find someone with the same level of expertise. They ended up hiring people that didn't know Rust and ramping them up, creating FFI bindings from the C++ side so they could work in Rust. And you can feel it: the borrow checker is teaching these people the right way to handle their systems." -- Principal Engineer at an Automotive OEM</p>
</blockquote>
<p>The community and helping each other aspect seems to grow bonds as organizations mature.</p>
<blockquote>
<p>"Our team is [all about] mentorship. I've mentored people coming up to speed on Rust, and people help each other hugely." -- Principal Software Engineer at a large SaaS company</p>
</blockquote>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#silent-attrition"></a>
Silent attrition</h3>
<p>We identified some cases where people have approached Rust and bounced off of it, for one reason or another. In the below case, someone with a background in a language with fewer guardrails found themselves frustrated enough with Rust to walk away.</p>
<blockquote>
<p>"All of that means that that embedded ecosystem is very frustrating to somebody who comes from C and is like, why can't I just get a pointer to this peripheral and then write into the registers. What are you doing to me? [..] My friend never got over that. He looked at it and said, I'm not going to deal with this and walked away." -– A second University Professor</p>
</blockquote>
<p>There may be language features that for a particular domain are not seen as comfortable or usable yet, such as async Rust usage in a safety domain. We'd like to map which language features feel off-limits in which domains; async in safety-critical work probably isn't the only case.</p>
<blockquote>
<p>"We're not fully sure how async [Rust] will work out in the long run in our domain. [..] People don't feel comfortable yet since C++14 doesn't provide such concepts. [..] It's the chicken-and-egg problem again: we probably need to gain some experience to see whether we can actually benefit from these new concepts in the automotive and safety domains." -- Team Lead at Automotive Supplier (ASIL D target)</p>
</blockquote>
<p>We heard in at least one case, that while the language was challenging and there was a near bounce, the tooling helped keep them coming back and trying.</p>
<blockquote>
<p>"Well, I think my early impressions of Rust - one is I find C++ so intimidating, and I think a big part of why I was able to succeed at [..] learning Rust is the tooling. I mean, all this makes sense [..] but it's like, for me, getting started with Rust, the language was challenging, but the tooling was incredibly easy." -- Founder of another startup built on Rust</p>
</blockquote>
<p>While it might be considered more of a community concern, if there are interactions online and in spaces that point to learners having
so-called "skill issues" this feeds into the narrative that Rust must be hard to learn. We may be unintentionally turning away Rust Project contributors and maintainers due to the vibes being put out when new learners show up in certain spaces.</p>
<blockquote>
<p>"People are very helpful, but generally the attitude is: if your program is very complicated, it's mostly a skill issue. There's not that much empathy when people get stuck learning, and a lot of people are just pushed away by it. There's probably a huge number of people who silently stop wanting to write Rust, because at some point it gets complicated and the feedback they get is 'you just need to be a better programmer, obviously'." -- Software Engineer at a SaaS Provider</p>
</blockquote>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#feedback-on-near-bounces-from-survey"></a>
Feedback on near-bounces from survey</h4>
<p>We found a few interesting perspectives collected in the Rust Vision doc survey which we administered with examples of bouncing and coming back:</p>
<blockquote>
<p>"I started before 1.0, got stuck very soon when trying to translate patterns from C++ to Rust (due to borrow checking). I tried again after 1.0 and it stuck. [..]" -- Survey Respondent A</p>
</blockquote>
<p>Survey Respondent A went on to share in a more detailed response about a perceived weakness in Rust learning materials related to lifetimes and the borrow checker are explained. There was an observation that it's fairly easy to run into more complex situations with lifetimes and the borrow checker. They felt that the current state of this sort of material and tutorials is fairly superficial and can leave learners stuck when they run into those more complex situations.</p>
<p>One respondent that bounced once and came back shared challenges around usage of async. In concert with Rust's memory-safety and the borrow checker, they found some of the nitty-gritty details of async were difficult to learn. While we're aware of the Rust Project's continuous efforts to improve Rust's async story, this is another data point of a user that faced challenges.</p>
<p>Another survey respondent shared how they had multiple times bounced in trying to learn Rust. They returned after a year or so and found Rustlings to be highly motivating. We note that having multiple pathways for folks to learn Rust opens up more possibilities for those that nearly bounced, just like this person.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#need-more-focused-work-on-silent-attritrion"></a>
Need more focused work on silent attritrion</h4>
<p>The thing that stood out most to us was the lack of real, first-hand knowledge of having bounced when learning Rust. While this is an obvious effect of soliciting answers to our survey and opportunities to interview through Rust channels and our networks, this cohort is good future candidate where interviews could start.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#conclusions"></a>
Conclusions</h3>
<p>Across these conversations, the experience of learning Rust depended heavily on context. Why someone was learning and what support they had mattered as much as the borrow checker. The same kinds of examples kept coming up: a training course that got a team to a shared baseline, a maintainer answering a student's first GitHub issue, and a colleague whose code showed that cloning was okay.</p>
<p>That context is largely something the community has a hand in. With that in mind, here is what we take away from what we heard, and what we still don't know.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#what-seems-worth-trying"></a>
What seems worth trying</h4>
<p><strong>Learning materials aimed at unlearning.</strong> Syntax barely came up when people described their struggles. People struggled with unlearning habits from previous languages, whether OOP structuring from C++ and Java or the instinct to grab a raw pointer to a peripheral. Most of our learning materials teach Rust from first principles, and that works. What we didn't come across is much written for, say, the engineer with ten years of Java who lands on a Rust team after a reorg: material that names the patterns they'll reach for that won't transfer, and shows what to do instead. The professor we spoke with did a version of this in the classroom, leaning on "traits are like interfaces in Java" and saving generics for later in the course, and the students did fine. Something similar could work outside the classroom too.</p>
<p><strong>Put the "clone freely while you're learning" advice somewhere official.</strong> Every experienced developer we spoke with gave the same advice, but learners seem to mostly pick it up by accident, like the researcher who happened to see someone else cloning the struct they had been carefully threading lifetimes through. Saying it early in official materials would take some of the steepness out of the curve. The broader version belongs there too: idiomatic Rust doesn't have to mean optimal Rust, especially on a first project.</p>
<p><strong>Diagnostics are already a primary learning resource: several people told us the compiler taught them lifetimes before any documentation did.</strong> Diagnostics reach learners right at the moment they're stuck. When writing new ones, it seems worth keeping the confused newcomer in mind alongside the expert, because for a lot of people this is where the learning happens.</p>
<p><strong>Is "the book" actually out of date?</strong> Whether or not The Rust Programming Language or other materials are actually behind, a team evaluating Rust looked at its repository, saw unresolved issues and unmerged PRs, and moved on. As more companies evaluate adoption, more people will look at these materials with the same fresh eyes. Visible issue triage and some communication about what's current and what's planned would address the perception, separately from whatever content work may or may not be needed.</p>
<p><strong>How stuck learners get treated is shaping who stays.</strong> We heard about students getting answers on GitHub from the maintainers who wrote the code, and we heard about learners being told their struggles were a skill issue. The first group came away with a lasting good impression of Rust. Some of the second group walked away entirely, and because they leave quietly, it's easy to underestimate how many of them there are. The welcoming side of the community came up unprompted as a reason people stayed, so we know it makes a difference when we get this right.</p>
<p><strong>Every organization we spoke with described essentially the same ramp-up for bringing a team to Rust.</strong> Teams that brought groups of developers to Rust described roughly the same approach: get everyone to a shared baseline with a training course or with The Rust Programming Language and Rustlings, start people on lower-risk tickets, and give them somewhere internal to ask questions. Several organizations also found that hiring developers without Rust experience and ramping them up worked out better than continuing to search for rare expertise in another language. None of this is complicated, and teams weighing adoption don't need to invent a training program from scratch.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/#what-we-still-don-t-know"></a>
What we still don't know</h4>
<p>The biggest gap is the people we didn't reach. Nearly everyone we spoke with stuck with Rust long enough to be reachable through Rust channels, so the stories of bouncing off came to us second-hand: a friend who walked away from embedded Rust, colleagues who quietly stopped after the responses they got. As we wrote in <a href="https://blog.rust-lang.org/2025/12/03/lessons-learned-from-the-rust-vision-doc-process/" rel="external">our first post</a>, finding people who decided against Rust takes targeted outreach. If the proposed User Research team comes together, talking with learners who bounced would make a good early project, and learning is probably the area where that research would teach us the most.</p>
<p>We also don't know what to make of LLMs as a learning tool yet. They came up as a search engine, as an example generator, and in one organization's case as something that makes training high school graduates into working Rust developers possible. We saw a classroom where the C cohort leaned on LLMs in ways the Rust cohort couldn't, and we don't have an explanation for it. All of this comes from a handful of conversations, so we treat it as a set of leads to follow up on. Given how quickly the tools are changing, it seems better to study this deliberately than to wait and see what folklore develops.</p>
<p>The folks we spoke with showed that people do get there: with enough passes through the materials and enough code written, it eventually clicks. The opportunities above are mostly about making it work for the people who didn't pick Rust on purpose, and for the ones who would have stuck around if their early experience had gone a little differently.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Mozilla Security Blog: Improving Transparency and Assurance in the Web PKI: Mozilla Root Store Policy v3.1]]></title>
<description><![CDATA[Mozilla remains committed to maintaining a secure, trustworthy, and transparent Web PKI. Today we are announcing the publication of Mozilla Root Store Policy (MRSP) version 3.1, effective July 1, 2026.
While previous policy updates focused heavily on certificate revocation, automation, and operat...]]></description>
<link>https://tsecurity.de/weiterlesen/3665147/3693288/mozilla-security-blog-improving-transparency-and-assurance-in-the-web-pki-mozilla-root-store-policy-v31/</link>
<pubDate>Sat, 25 Jul 2026 08:37:23 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Mozilla remains committed to maintaining a secure, trustworthy, and transparent Web PKI. Today we are announcing the publication of <a href="https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/policy/">Mozilla Root Store Policy</a> (MRSP) version 3.1, effective July 1, 2026.</p>
<p>While previous policy updates focused heavily on certificate revocation, automation, and operational resilience, MRSP v3.1 focuses on a different challenge: ensuring that Certification Authority (CA) operations are sufficiently transparent, understandable, and auditable.</p>
<p>Trust in the Web PKI depends not only on technical requirements, but also on the ability of Mozilla, auditors, and the broader community to understand how CA systems are designed, operated, and assessed. MRSP v3.1 introduces new requirements intended to improve the quality of CA documentation and strengthen independent assurance of the design and effectiveness of controls that protect CA systems.</p>
<h3><b>Improving CP/CPS Documentation</b></h3>
<p>Certification Practice Statements (CPSes) and combined Certificate Policy / Certification Practice Statement documents (CP/CPSes) are among the most important public documents published by a CA. They describe how a CA conducts its operations and meets industry requirements.</p>
<p>Over the years, we have seen significant variation in the quality, structure, and level of detail provided in CP/CPS documentation. Some documents provide extensive implementation detail, while others rely heavily on incorporation by reference or provide only high-level descriptions of CA practices.</p>
<p>The revised policy will continue to require conformance with RFC 3647, as modified by applicable CA/Browser Forum requirements. Improvements to section 3.3 in the MRSP will establish clearer expectations regarding the content and quality of CP/CPS documentation. The new requirements emphasize that documentation must be explicit, bounded, auditable, and sufficiently detailed to describe the CA operator’s certificate issuance and management activities, while also establishing requirements for version control, accessibility, and ongoing maintenance. The objective is to ensure that a technically competent reviewer will be better-able to determine what commitments the CA has made, how those commitments are implemented, and whether the documented practices support technical, operational, and performance oversight.</p>
<p>Mozilla believes that these new CP/CPS requirements will improve transparency, reduce misunderstandings, support more effective audits, and help reduce the risk of certificate misissuance by ensuring that operational practices are documented accurately, consistently, and in sufficient detail to permit meaningful review.</p>
<h3><b>Introducing Detailed Controls Reports</b></h3>
<p>A second major enhancement in MRSP v3.1 is the introduction of Detailed Controls Reports (DCRs). Traditional WebTrust and ETSI audit reports provide valuable independent assurance regarding compliance with established criteria. However, they generally provide only limited visibility into the specific controls, testing procedures, and operational environments that support those conclusions.</p>
<p>Beginning with audit periods starting on or after July 1, 2027, CA operators with root certificates enabled for TLS website authentication will be required to obtain a DCR. The purpose of the DCR is to provide CA management, auditors, and Mozilla with greater visibility into the controls, testing, and operating effectiveness of CA systems that support compliance with the CA/Browser Forum’s TLS Baseline Requirements and Network and Certificate System Security Requirements. Mozilla generally expects to review DCRs only on an as-needed basis, such as during compliance reviews, incident investigations, root inclusion evaluations, or other oversight activities.</p>
<p>A DCR must include:</p>
<ul>
<li>The scope and boundaries of the audited CA systems;</li>
<li>Applicable audit criteria;</li>
<li>Controls implemented by the CA;</li>
<li>The auditor’s testing procedures;</li>
<li>Results of control testing; and</li>
<li>Information regarding control exceptions or deficiencies.</li>
</ul>
<p>Mozilla expects that DCRs will complement existing audit reports and strengthen transparency and assurance by providing additional detail regarding system boundaries, control implementation, testing procedures, and control effectiveness that is not typically available in traditional audit reports. Effective compliance requires more than documented policies and successful audits; it also requires management understanding, oversight, and engagement. By providing greater visibility into CA systems, controls, testing activities, and operational risks, DCRs can help reinforce a strong tone at the top regarding compliance expectations, support informed decision-making and resource allocation, enable earlier identification of weaknesses, and promote a culture of continuous improvement. The intent is not to replace existing audit reports, but to provide additional information that supports effective governance, oversight, and informed trust decisions.</p>
<h3><b>Additional Clarifications and Improvements</b></h3>
<p>MRSP v3.1 also includes several targeted clarifications and refinements:</p>
<ul>
<li>aligns Mozilla’s mass revocation planning requirements with the corresponding CA/Browser Forum Baseline Requirements, helping ensure consistency across compliance frameworks;</li>
<li>clarifies audit expectations for root inclusion requests, including requirements relating to audit continuity and root key generation ceremonies;</li>
<li>requires root CA key pairs submitted for inclusion to have been generated within the previous five years, helping ensure that newly included roots are based on contemporary cryptographic practices and controls; and</li>
<li>clarifies expectations when ownership or operational control of a CA changes, helping ensure that Mozilla receives timely notice and can evaluate the impact of acquisitions or organizational changes on continued compliance.</li>
</ul>
<h3><b>Looking Forward</b></h3>
<p>Mozilla recognizes that these changes will require preparation by CA operators, auditors, and other ecosystem participants. To support implementation, Mozilla is publishing accompanying wiki guidance regarding both <a href="https://wiki.mozilla.org/CA/CP-CPS_Guidance">CP/CPS Documentation</a> and <a href="https://wiki.mozilla.org/CA/DCRs">Detailed Controls Reports</a>.</p>
<p>As with previous policy updates, these changes were informed by discussions with CA operators, auditors, and members of the Web PKI community. We appreciate the feedback received during the review process and look forward to continued collaboration as the ecosystem evolves.</p>
<p>Mozilla has a longstanding focus on building confidence in the Web PKI through transparency, accountability, and continuous improvement. By requiring higher-quality CP/CPS documentation and strengthening independent assurance, MRSP v3.1 advances Mozilla’s commitment to protecting its users and maintaining their trust in the systems that help secure the web.</p>
<p>The post <a href="https://blog.mozilla.org/security/2026/06/29/improving-transparency-and-assurance-in-the-web-pki-mozilla-root-store-policy-v3-1/">Improving Transparency and Assurance in the Web PKI: Mozilla Root Store Policy v3.1</a> appeared first on <a href="https://blog.mozilla.org/security">Mozilla Security Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Rust Programming Language Blog: Announcing Rust 1.96.1]]></title>
<description><![CDATA[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.
If you have a previous version of Rust installed via rustup, getting Rust 1.96.1 is as easy as:
rustup update stable
If you don't h...]]></description>
<link>https://tsecurity.de/weiterlesen/3665146/3693287/the-rust-programming-language-blog-announcing-rust-1961/</link>
<pubDate>Sat, 25 Jul 2026 08:37:22 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>The Rust team has published a new point release of Rust, 1.96.1. Rust is a programming language that is empowering everyone to build reliable and efficient software.</p>
<p>If you have a previous version of Rust installed via rustup, getting Rust 1.96.1 is as easy as:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>rustup update stable</span></span></code></pre>
<p>If you don't have it already, you can <a href="https://www.rust-lang.org/install.html" rel="external">get <code>rustup</code></a> from the appropriate page on our website.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/06/30/Rust-1.96.1/#what-s-in-1-96-1"></a>
What's in 1.96.1</h3>
<p>Rust 1.96.1 fixes:</p>
<ul>
<li><a href="https://github.com/rust-lang/cargo/pull/17131" rel="external">Missing retries / timeouts in Cargo's HTTP client</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158214" rel="external">Miscompilation in a MIR optimization</a></li>
</ul>
<p>It also <a href="https://github.com/rust-lang/cargo/pull/17140" rel="external">fixes</a> three CVEs
affecting libssh2 (which is compiled into Cargo):</p>
<ul>
<li><a href="https://www.cve.org/CVERecord?id=CVE-2025-15661" rel="external">CVE-2025-15661</a></li>
<li><a href="https://www.cve.org/CVERecord?id=CVE-2026-55199" rel="external">CVE-2026-55199</a></li>
<li><a href="https://www.cve.org/CVERecord?id=CVE-2026-55200" rel="external">CVE-2026-55200</a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/06/30/Rust-1.96.1/#contributors-to-1-96-1"></a>
Contributors to 1.96.1</h4>
<p>Many people came together to create Rust 1.96.1. We couldn't have done it without all of you. <a href="https://thanks.rust-lang.org/rust/1.96.1/" rel="external">Thanks!</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Rust Programming Language Blog: Announcing Rust 1.97.0]]></title>
<description><![CDATA[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.
If you have a previous version of Rust installed via rustup, you can get 1.97.0 with:
$ rustup update stable
If you don't have it already,...]]></description>
<link>https://tsecurity.de/weiterlesen/3665145/3693286/the-rust-programming-language-blog-announcing-rust-1970/</link>
<pubDate>Sat, 25 Jul 2026 08:37:20 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>The Rust team is happy to announce a new version of Rust, 1.97.0. Rust is a programming language empowering everyone to build reliable and efficient software.</p>
<p>If you have a previous version of Rust installed via <code>rustup</code>, you can get 1.97.0 with:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>$</span><span> rustup update stable</span></span></code></pre>
<p>If you don't have it already, you can get <a href="https://www.rust-lang.org/install.html" rel="external"><code>rustup</code></a> from the appropriate page on our website, and check out the <a href="https://doc.rust-lang.org/stable/releases.html#version-1970-2026-07-09" rel="external">detailed release notes for 1.97.0</a>.</p>
<p>If you'd like to help us out by testing future releases, you might consider updating locally to use the beta channel (<code>rustup default beta</code>) or the nightly channel (<code>rustup default nightly</code>). Please <a href="https://github.com/rust-lang/rust/issues/new/choose" rel="external">report</a> any bugs you might come across!</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#what-s-in-1-97-0-stable"></a>
What's in 1.97.0 stable</h3>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#symbol-mangling-v0-enabled-by-default"></a>
Symbol mangling v0 enabled by default</h4>
<p>When Rust is compiled into object files and binaries, each item (functions,
statics, etc) must have a globally unique "symbol" identifying it. To avoid
conflicts when linking together different Rust programs, Rust mangles the
original name of items to include additional context such as the module path,
defining crate, generics, and more. Historically, this mangling was based on
the <a href="https://refspecs.linuxbase.org/cxxabi-1.86.html#mangling" rel="external">Itanium ABI</a>,
also (sometimes) used by C++.</p>
<p>The new mangling scheme resolves a number of drawbacks from the previous one:</p>
<ul>
<li>Generic parameter instantiations preserve their values, rather than being tracked solely behind a hash</li>
<li>Inconsistencies: not all parts used the Itanium ABI, meaning that custom demangling was still necessary</li>
</ul>
<p>Since Rust 1.59, the compiler has supported opting into a Rust-specific
mangling scheme via <code>-Csymbol-mangling-version=v0</code>. Since November 2025, this
scheme has been enabled by default on nightly, and 1.97 is now enabling it on
stable Rust. The legacy mangling scheme can only be enabled on nightly, and the
current plan is to fully remove it.</p>
<p>See the previous <a href="https://blog.rust-lang.org/2025/11/20/switching-to-v0-mangling-on-nightly/" rel="external">blog post</a> for more details.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#cargo-support-for-denying-warnings"></a>
Cargo support for denying warnings</h4>
<p>It's common practice to deny warnings in CI. Historically, doing so is
typically done through <code>RUSTFLAGS=-Dwarnings</code>. With Rust 1.97, Cargo controls
how warnings interact with build success: either silencing them (via <code>allow</code>
level), rendering without failing (default, <code>warn</code>), or denying them (via <code>deny</code>).</p>
<p>As a  result of Cargo configuration determining the behavior, using this
feature doesn't invalidate the underlying build cache, meaning that it's easy
to temporarily opt-in. For example, if warnings are adding unwanted noise while
working through fixing errors after a refactor, you can run
<code>CARGO_BUILD_WARNINGS=allow cargo check</code>, temporarily silencing them.</p>
<p>In CI, jobs can instead set <code>CARGO_BUILD_WARNINGS=deny</code> to deny warnings. This
can be combined with <code>--keep-going</code> to collect all errors and warnings rather
than stopping on the first failing package.</p>
<p>See the <a href="https://doc.rust-lang.org/cargo/reference/config.html#buildwarnings" rel="external">documentation</a> for more details.</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#linker-output-no-longer-hidden-by-default"></a>
Linker output no longer hidden by default</h4>
<p>rustc invokes a linker on behalf of users. Historically, rustc has silenced
linker output by default if the link completes successfully. This can mask real
problems, though, so in Rust 1.97 we are enabling linker messages by default.
These are emitted as a warning lint, for example:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>warning: linker stderr: ignoring deprecated linker optimization setting '1'</span></span>
<span class="giallo-l"><span>  |</span></span>
<span class="giallo-l"><span>  = note: `#[warn(linker_messages)]` on by default</span></span></code></pre>
<p>Common linker messages that have been diagnosed as false positives or intentional behavior
are filtered out by rustc. Several defects have already been fixed as a result
of no longer hiding this output on nightly.</p>
<p>Note that currently, <code>linker_messages</code> is a special lint that is <em>not</em> affected
by the <code>warnings</code> lint group. This is intentional as rustc generally doesn't
control linker output as precisely, and it's not uncommon for output to only
appear on some platforms. If you are seeing what you think is a false positive
output from the linker, please <a href="https://github.com/rust-lang/rust/issues/new/choose" rel="external">file an issue</a>.</p>
<p>To silence the warning in the mean time, you can configure the lint level to
allow. This can be done through <code>Cargo.toml</code> by adding a <a href="https://doc.rust-lang.org/nightly/cargo/reference/manifest.html#the-lints-section" rel="external">lints section</a> like this:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>[</span><span>lints</span><span>.</span><span>rust</span><span>]</span></span>
<span class="giallo-l"><span class="z-variable">linker_messages</span><span> =</span><span class="z-punctuation z-definition z-string z-string"> "</span><span class="z-string z-quoted z-string">allow</span><span class="z-punctuation z-definition z-string z-string">"</span></span></code></pre><h4><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#stabilized-apis"></a>
Stabilized APIs</h4>
<ul>
<li><a href="https://doc.rust-lang.org/stable/std/iter/struct.RepeatN.html#impl-Default-for-RepeatN%3CA%3E" rel="external"><code>Default for RepeatN</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/ffi/struct.FromBytesUntilNulError.html#impl-Copy-for-FromBytesUntilNulError" rel="external"><code>Copy for ffi::FromBytesUntilNulError</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/154003" rel="external"><code>Send for std::fs::File</code> on UEFI</a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_highest_one" rel="external"><code>&lt;{integer}&gt;::isolate_highest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_lowest_one" rel="external"><code>&lt;{integer}&gt;::isolate_lowest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.u32.html#method.highest_one" rel="external"><code>&lt;{integer}&gt;::highest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.u32.html#method.lowest_one" rel="external"><code>&lt;{integer}&gt;::lowest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.u32.html#method.bit_width" rel="external"><code>&lt;{uN}&gt;::bit_width</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_highest_one" rel="external"><code>NonZero&lt;{integer}&gt;::isolate_highest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_lowest_one" rel="external"><code>NonZero&lt;{integer}&gt;::isolate_lowest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.highest_one" rel="external"><code>NonZero&lt;{integer}&gt;::highest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.lowest_one" rel="external"><code>NonZero&lt;{integer}&gt;::lowest_one</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.bit_width" rel="external"><code>NonZero&lt;{uN}&gt;::bit_width</code></a></li>
</ul>
<p>These previously stable APIs are now stable in const contexts:</p>
<ul>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.char.html#method.is_control" rel="external"><code>char::is_control</code></a></li>
</ul>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#other-changes"></a>
Other changes</h4>
<p>Check out everything that changed in <a href="https://github.com/rust-lang/rust/releases/tag/1.97.0" rel="external">Rust</a>, <a href="https://doc.rust-lang.org/nightly/cargo/CHANGELOG.html#cargo-197-2026-07-09" rel="external">Cargo</a>, and <a href="https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-197" rel="external">Clippy</a>.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/#contributors-to-1-97-0"></a>
Contributors to 1.97.0</h3>
<p>Many people came together to create Rust 1.97.0. We couldn't have done it without all of you. <a href="https://thanks.rust-lang.org/rust/1.97.0/" rel="external">Thanks!</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Rust Programming Language Blog: crates.io: development update]]></title>
<description><![CDATA[Another six months have passed since our last development update, and the crates.io team has been busy. Here's a summary of the most notable changes and improvements made to crates.io since then.

Source Code Viewer
Crate pages now have a "Code" tab that lets you browse the contents of published ...]]></description>
<link>https://tsecurity.de/weiterlesen/3665144/3693285/the-rust-programming-language-blog-cratesio-development-update/</link>
<pubDate>Sat, 25 Jul 2026 08:37:18 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Another six months have passed since our <a href="https://blog.rust-lang.org/2026/01/21/crates-io-development-update/" rel="external">last development update</a>, and the crates.io team has been busy. Here's a summary of the most notable changes and improvements made to <a href="https://crates.io/" rel="external">crates.io</a> since then.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#source-code-viewer"></a>
Source Code Viewer</h3>
<p>Crate pages now have a "Code" tab that lets you browse the contents of published crate versions directly on crates.io. This shows you the exact files that <code>cargo</code> downloads when you add a crate as a dependency, which might differ from the linked repository. This makes it much easier to audit your dependencies, including files that never appear in the repository, like the normalized <code>Cargo.toml</code> files that <code>cargo</code> generates.</p>
<p><img alt='Source code viewer showing the "Code" tab of the serde crate' src="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/code-tab.png"></p>
<p>The viewer comes with a file tree sidebar with search functionality, syntax highlighting, and GitHub-style line selection, where clicking or dragging line numbers produces shareable <code>#L10-L20</code> URLs.</p>
<p>Under the hood, the server now builds a zip file for every published version. Since the <code>.crate</code> files that <code>cargo</code> consumes are gzipped tarballs without random access support, a background job re-packs each of them into a seekable zip archive plus a JSON manifest describing the contained files. Both are served from our static CDN. The frontend then fetches only the manifest and loads each file on demand with an HTTP range request. Because of this architecture, browsing crate sources essentially adds no load on the crates.io API servers. Existing crate versions have been backfilled, so this works for old releases too.</p>
<p>The rendering library behind the code viewer is a diff renderer at heart, and that's no accident: a version-to-version diff viewer built on the same infrastructure is currently in the works. This will allow you to review exactly what changed between two published versions, right on crates.io. Stay tuned!</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#untangling-crates-io-accounts-from-github"></a>
Untangling crates.io Accounts from GitHub</h3>
<p>At the end of May, the crates.io team accepted <a href="https://github.com/rust-lang/rfcs/pull/3946" rel="external">RFC #3946</a>. Crates.io accounts always have been tightly coupled to GitHub: signing in means "Log in with GitHub", and your crates.io identity is your GitHub username. The RFC changes that. It introduces usernames that are native to crates.io and independent of linked GitHub accounts, as a prerequisite for eventually supporting login via other identity providers.</p>
<p>The implementation of crates.io usernames has started, but there is still a lot left to do, most visibly the ability to change your crates.io username. After that is complete, there will be future RFCs and implementation for signing in with identity providers other than GitHub. Since all of this touches authentication and account security, we are deliberately taking it slow and rolling these changes out in small, carefully reviewed steps.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#advisories-and-suggestions"></a>
Advisories and Suggestions</h3>
<p>In our <a href="https://blog.rust-lang.org/2026/01/21/crates-io-development-update/" rel="external">January update</a> we introduced the "Security" tab, which shows security advisories from the <a href="https://rustsec.org/" rel="external">RustSec</a> database. We have since taken this integration one step further: crates that RustSec has flagged as unmaintained now show a warning banner directly on their crate pages, linking to the corresponding advisory for details and possible alternatives. Thanks to <a href="https://github.com/djc" rel="external">Dirkjan Ochtman</a> for implementing this feature!</p>
<p><img alt="Unmaintained warning banner on the ansi_term crate page" src="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/unmaintained-banner.png"></p>
<p>Related to this, some popular crates have been largely absorbed into the Rust standard library over the years, like <code>lazy_static</code>, which has been superseded by <code>std::sync::LazyLock</code> since Rust 1.80. Crate pages of such crates now show a friendly "You might not need this dependency" banner describing the standard library replacement, and superseded crates in dependency lists get a small light bulb icon with a similar hint.</p>
<p><img alt='"You might not need this dependency" banner on the lazy_static crate page' src="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/std-replacement-banner.png"></p>
<p>The dataset behind this feature lives in the new <a href="https://github.com/rust-lang/std-replacement-data" rel="external">rust-lang/std-replacement-data</a> repository, together with a documented inclusion policy: standard library replacements only, every entry must cite the stable <code>std</code>, <code>core</code>, or <code>alloc</code> API and Rust version, and crate maintainers get a notice-and-comment window before an entry is added. New entries can be proposed upstream and can benefit other tools too.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#ferris"></a>
Ferris</h3>
<p>The most delightful change of this cycle: the Ferris on our error pages now follows your mouse cursor with its eyes:</p>
<p><img alt="Ferris' eyes following the mouse cursor on the error page" src="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/ferris.gif"></p>
<p>Getting a 404 error on crates.io is now slightly less sad.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#svelte-frontend-migration-completed"></a>
Svelte Frontend Migration Completed</h3>
<p>In our <a href="https://blog.rust-lang.org/2026/01/21/crates-io-development-update/" rel="external">January update</a>, we announced that we were experimenting with porting the crates.io frontend from Ember.js to <a href="https://svelte.dev/" rel="external">Svelte</a>. This experiment has concluded successfully: the new frontend reached feature parity, went through a <a href="https://blog.rust-lang.org/inside-rust/2026/04/17/crates-io-svelte-public-testing/" rel="external">public testing phase</a> in April, became the default at the beginning of May, and the Ember.js app has been removed from our repository.</p>
<p>We designed this change to be invisible for our users, since the new frontend is a 1:1 port of the previous design and functionality. For the team and our contributors, however, it is a big deal: the frontend is now built on a more modern framework, which should make it easier for new contributors to get started. It also allows us to iterate faster, as the source code viewer above demonstrates.</p>
<p>We want to thank the <a href="https://emberjs.com/teams/" rel="external">Ember.js team</a> for a framework that served crates.io well for many years, and the Svelte team for making the transition so enjoyable.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#miscellaneous"></a>
Miscellaneous</h3>
<p>These were some of the more visible changes to crates.io over the past six months, but a lot has happened "under the hood" as well:</p>
<ul>
<li>
<p><strong>Search performance</strong>: Relevance-sorted search queries previously ranked every crate matching the query, which could take 1-2 seconds for short or common search terms. Ranking is now bounded to the 1,000 matching crates with the highest recent download counts.</p>
</li>
<li>
<p><strong>Reverse dependencies performance</strong>: The reverse dependencies endpoint no longer recomputes the full dependent set on every request. It is now served from a precomputed table kept in sync by database triggers, turning an expensive join into a bounded index scan and greatly reducing the chance of getting a timeout error.</p>
</li>
<li>
<p><strong>New ARCHITECTURE.md</strong>: If you've ever wondered how crates.io actually works, our <a href="https://github.com/rust-lang/crates.io/blob/main/docs/ARCHITECTURE.md" rel="external"><code>ARCHITECTURE.md</code></a> document got a complete rewrite. It is now organized around the high-level systems that make up crates.io and how they fit together, and includes walkthroughs of what happens when you run <code>cargo publish</code>, why a typical crate download never touches our API servers, and how download counts are derived from CDN access logs.</p>
</li>
<li>
<p><strong>Definition lists</strong>: READMEs now render Markdown <a href="https://github.com/rust-lang/crates.io/pull/13950" rel="external">definition lists</a>, a widely used Markdown extension. Our markdown renderer <a href="https://crates.io/crates/comrak" rel="external">comrak</a> already supported them, the extension just wasn't enabled yet. Thanks to <a href="https://github.com/mistaste" rel="external">@mistaste</a> for this contribution!</p>
</li>
<li>
<p><strong>CDN cache tags</strong>: Files uploaded to our static CDN now carry cache-tag metadata, allowing us to invalidate all cached files of a crate or a specific release in a single operation, instead of issuing one invalidation per file URL.</p>
</li>
<li>
<p><strong>Caching improvements</strong>: We removed a global <code>Vary: Cookie</code> response header that was preventing our CDNs from caching public API responses and frontend assets effectively. Per-user responses now use <code>Cache-Control: no-store</code> instead, resulting in better cache hit rates at the CDN edge.</p>
</li>
<li>
<p><strong>Accessibility</strong>: We have made crates.io friendlier to screen readers: decorative icons are now hidden from the accessibility tree, heading hierarchies have been fixed, and lists are marked up as proper lists. ARIA snapshot tests now ensure that regressions can't slip in unnoticed. We plan to continue to improve crates.io accessibility over the coming months.</p>
</li>
<li>
<p><strong>Git index performance</strong>: The background worker's local clone of the git index is now a bare and shallow repository, eliminating roughly 250,000 checked-out files and the full commit history from its disk, improving its performance as we see increased rates of crate publication. The periodic index squashing now goes through the GitHub API instead of generating large git packs locally, which had previously caused out-of-memory failures on the production worker.</p>
</li>
</ul>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/#feedback"></a>
Feedback</h3>
<p>We hope you enjoyed this update on the development of crates.io. If you have any feedback or questions, please let us know on <a href="https://rust-lang.zulipchat.com/#narrow/stream/318791-t-crates-io" rel="external">Zulip</a> or <a href="https://github.com/rust-lang/crates.io/discussions" rel="external">GitHub</a>. We are always happy to hear from you and are looking forward to your feedback!</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Rust Programming Language Blog: Announcing Rust 1.97.1]]></title>
<description><![CDATA[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.
If you have a previous version of Rust installed via rustup, getting Rust 1.97.1 is as easy as:
rustup update stable
If you don't h...]]></description>
<link>https://tsecurity.de/weiterlesen/3665143/3693284/the-rust-programming-language-blog-announcing-rust-1971/</link>
<pubDate>Sat, 25 Jul 2026 08:37:17 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>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.</p>
<p>If you have a previous version of Rust installed via rustup, getting Rust 1.97.1 is as easy as:</p>
<pre class="giallo z-code"><code><span class="giallo-l"><span>rustup update stable</span></span></code></pre>
<p>If you don't have it already, you can <a href="https://www.rust-lang.org/install.html" rel="external">get <code>rustup</code></a> from the appropriate page on our website.</p>
<h3><a class="anchor" href="https://blog.rust-lang.org/2026/07/16/Rust-1.97.1/#what-s-in-1-97-1"></a>
What's in 1.97.1</h3>
<p>Rust 1.97.1 fixes a <a href="https://github.com/rust-lang/rust/issues/159035" rel="external">miscompilation in an LLVM optimization</a>.</p>
<p>We have backported both an LLVM fix and a disable of the underlying change in Rust 1.97.0 of
Rust'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.</p>
<p>If you'd like to help us out by testing future releases, you might consider
running your code's CI or locally using the beta channel (<code>rustup default beta</code>) or the nightly
channel (<code>rustup default nightly</code>). Please
<a href="https://github.com/rust-lang/rust/issues/new/choose" rel="external">report</a> any bugs you
might come across!</p>
<h4><a class="anchor" href="https://blog.rust-lang.org/2026/07/16/Rust-1.97.1/#contributors-to-1-97-1"></a>
Contributors to 1.97.1</h4>
<p>Many people came together to create Rust 1.97.1. We couldn't have done it without all of you. <a href="https://thanks.rust-lang.org/rust/1.97.1/" rel="external">Thanks!</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v8.20.0-beta.1]]></title>
<description><![CDATA[Introducing disappearing call events: Missed, outgoing, and received calls that occur after you install this update will now automatically disappear in any chat where disappearing messages are enabled.
Now you can reorder installed sticker packs so your new favorites don’t get stuck in the back o...]]></description>
<link>https://tsecurity.de/weiterlesen/3665142/3693283/v8200-beta1/</link>
<pubDate>Sat, 25 Jul 2026 08:37:16 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<ul>
<li>Introducing disappearing call events: Missed, outgoing, and received calls that occur after you install this update will now automatically disappear in any chat where disappearing messages are enabled.</li>
<li>Now you can reorder installed sticker packs so your new favorites don’t get stuck in the back of the line.</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[v8.20.0]]></title>
<description><![CDATA[Introducing disappearing call events: Missed, outgoing, and received calls that occur after you install this update will now automatically disappear in any chat where disappearing messages are enabled.
Now you can reorder installed sticker packs so your new favorites don’t get stuck in the back o...]]></description>
<link>https://tsecurity.de/weiterlesen/3665141/3693282/v8200/</link>
<pubDate>Sat, 25 Jul 2026 08:37:15 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<ul>
<li>Introducing disappearing call events: Missed, outgoing, and received calls that occur after you install this update will now automatically disappear in any chat where disappearing messages are enabled.</li>
<li>Now you can reorder installed sticker packs so your new favorites don’t get stuck in the back of the line.</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.1.3]]></title>
<description><![CDATA[chore: bump version to 17.1.3]]></description>
<link>https://tsecurity.de/weiterlesen/3664605/3692746/v1713/</link>
<pubDate>Sat, 25 Jul 2026 01:38:42 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 17.1.3</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.1.2: chore: bump version to 17.1.2]]></title>
<description><![CDATA[fixed rustfmt drift and clippy errors in pi-shell moreutils builtins (combine, errno, ifne, isutf8, sponge, ts) that blocked the release check gate]]></description>
<link>https://tsecurity.de/weiterlesen/3663704/3691845/v1712-chore-bump-version-to-1712/</link>
<pubDate>Fri, 24 Jul 2026 16:55:04 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<ul>
<li>fixed rustfmt drift and clippy errors in pi-shell moreutils builtins (combine, errno, ifne, isutf8, sponge, ts) that blocked the release check gate</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.1.1: fix(ci): repaired native builds broken by native audio stack deps]]></title>
<description><![CDATA[Added ensure-cmake action installing pinned cmake/ninja on omp-kata pods; audiopus_sys builds bundled libopus via CMake (Ninja for MSVC cross).
Set CMAKE_POLICY_VERSION_MINIMUM=3.5 globally and in build-native.ts: the bundled opus tree declares cmake_minimum_required below 3.5, which CMake 4.x re...]]></description>
<link>https://tsecurity.de/weiterlesen/3662788/3690929/v1711-fixci-repaired-native-builds-broken-by-native-audio-stack-deps/</link>
<pubDate>Fri, 24 Jul 2026 09:40:00 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<ul>
<li>Added ensure-cmake action installing pinned cmake/ninja on omp-kata pods; audiopus_sys builds bundled libopus via CMake (Ninja for MSVC cross).</li>
<li>Set CMAKE_POLICY_VERSION_MINIMUM=3.5 globally and in build-native.ts: the bundled opus tree declares cmake_minimum_required below 3.5, which CMake 4.x refuses.</li>
<li>Dropped the -C target-cpu=native fallback for non-x64 native builds: it baked build-host CPU features into shipped darwin arm64 addons and trips ring 0.17's aarch64-apple const assertion.</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.1.0]]></title>
<description><![CDATA[test(coding-agent): aligned transcript compaction test with supersede…]]></description>
<link>https://tsecurity.de/weiterlesen/3662370/3690511/v1710/</link>
<pubDate>Fri, 24 Jul 2026 03:09:44 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>test(coding-agent): aligned transcript compaction test with supersede…</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Tooling Announcements: Happy BMO Push Day! (20260723.{1,2})]]></title>
<description><![CDATA[The following changes have been pushed to bugzilla.mozilla.org:
Github Link

Bug 2055236 - The column headers in Github PR are barely visible in dark mode
Bug 2054574 - Do not auto-assigning Hackbot when submitting a Phabricator revision

Github Link
The following changes have been pushed to bugz...]]></description>
<link>https://tsecurity.de/weiterlesen/3662277/3690418/firefox-tooling-announcements-happy-bmo-push-day-2026072312/</link>
<pubDate>Fri, 24 Jul 2026 01:03:20 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>The following changes have been pushed to <a href="https://bugzilla.mozilla.org/">bugzilla.mozilla.org</a>:</p>
<p><a href="https://github.com/mozilla-bteam/bmo/tree/release-20260723.1" rel="noopener nofollow ugc">Github Link</a></p>
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2055236">Bug 2055236</a> - The column headers in Github PR are barely visible in dark mode</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2054574">Bug 2054574</a> - Do not auto-assigning Hackbot when submitting a Phabricator revision</li>
</ul>
<p><a href="https://github.com/mozilla-bteam/bmo/tree/release-20260723.2" rel="noopener nofollow ugc">Github Link</a></p>
<p>The following changes have been pushed to <a href="https://bugzilla.mozilla.org/">bugzilla.mozilla.org</a>:</p>
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2055285">Bug 2055285</a> - Remove the “Show closed/merged PR” checkbox in the GH PR view</li>
</ul>
<p>Discuss these changes in the <a href="https://matrix.to/#/%23bmo:mozilla.org" rel="noopener nofollow ugc">BMO Matrix Room</a></p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/happy-bmo-push-day-20260723-1-2/149025">Read full topic</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Mozilla Addons Blog: Firefox 153 WebExtensions API updates]]></title>
<description><![CDATA[We had a bumper release of WebExtensions API updates in Firefox 153. To start, there is a permissions change that affects how your extensions access local files. We then have two contributions from the community members: userScripts.execute() and the new publicSuffix API. We’re covering those con...]]></description>
<link>https://tsecurity.de/weiterlesen/3661133/3689274/mozilla-addons-blog-firefox-153-webextensions-api-updates/</link>
<pubDate>Thu, 23 Jul 2026 16:06:24 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>We had a bumper release of <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/153#changes_for_add-on_developers">WebExtensions API updates in Firefox 153</a>. To start, there is a permissions change that affects how your extensions access local files. We then have two contributions from the community members: <span>userScripts.execute()</span> and the new <span>publicSuffix</span> API. We’re covering those contributions in more depth, including the people behind them, in a separate post. And there is more, read on…</p>
<h3><b>File access now requires a dedicated permission</b></h3>
<p>Extensions that need to read <span>file://</span> URLs used to get that access as part of the “Access your data for all websites” host permission. Starting in Firefox 153, file access is a separate, explicit permission, “Access local files on your computer”, shown in the extension’s permissions settings. It’s off by default for every extension, including ones already installed.</p>
<p>This change has a few concrete effects on code:</p>
<ul>
<li><b>Before:</b> an extension with <span>&lt;all_urls&gt;</span> or a matching host permission could read <span>file://</span> pages without any additional grant, and <span>extension.isAllowedFileSchemeAccess()</span> always returned <span>false</span> regardless of the permission setting.</li>
<li><b>After:</b> the extension must have the new file-access permission granted, and <span>extension.isAllowedFileSchemeAccess()</span> correctly reflects whether the user has granted it.</li>
</ul>
<pre>async function checkFileSchemeAccess() {
  const isAllowed = await browser.extension.isAllowedFileSchemeAccess();

  if (!isAllowed) {
    await browser.notifications.create("file-scheme-access-needed", {
      type: "basic",
      iconUrl: browser.runtime.getURL("icons/icon-48.png"),
      title: "Local file access required",
      message:
        'This extension needs "Allow access to file URLs" enabled to work ' +
        "with local files. Go to about:addons → select this extension → " +
        "turn on that setting, then reload the page.",
    });
    return false;
  }

  return true;
}</pre>
<p><span>devtools.inspectedWindow.eval()</span> calls targeting <span>file://</span> URLs are affected the same way; they now require this permission to succeed.</p>
<p>If your extension depends on <span>file://</span> access, expect existing users to see that access stops after upgrading (until they enable the permission), and consider adding a prompt or fallback path, for example by specifying an embedded options page (<span>options_ui</span>) and calling <span>browser.runtime.openOptionsPage()</span> to open <span>about:addons</span> and including instructions to toggle the setting in the “Permissions and data” tab.</p>
<h3><b>userScripts.execute() and publicSuffix: covered in our next post</b></h3>
<p>Firefox 153 adds two community-contributed APIs:</p>
<ul>
<li><span>userScripts.execute()</span>, which provides for one-off injection of one or more user script sources into a tab or frame, in a defined order, as a complement to the persistent, URL-pattern-based <span>userScripts.register()</span>.</li>
<li><span>publicSuffix</span>, which enables synchronous lookups against the browser’s built-in <a href="https://publicsuffix.org/">Public Suffix List</a> using <span>publicSuffix.isKnownSuffix()</span>, <span>publicSuffix.getKnownSuffix()</span>, and <span>publicSuffix.getDomain()</span>. This API means that extensions no longer need to bundle or maintain a suffix list to determine a hostname’s registrable domain (eTLD+1).</li>
</ul>
<p>Both APIs were built by contributors motivated by real needs in their extensions. We take an in-depth look at these contributions, their developers, impact, and history in a forthcoming post.</p>
<h3><b>documentId support across more APIs</b></h3>
<p>Firefox 153 introduces <span>documentId</span>, a stable identifier for a document instance, including a new <span>runtime.getDocumentId()</span> method, several <span>webNavigation</span> events and methods, <span>webRequest</span> events, scripting injection targets, and the extension messaging APIs.</p>
<p>Many WebExtension APIs use <span>tabId</span> and <span>frameId</span> to identify where to perform an operation. However, because <span>frameId</span> identifies the frame rather than its content, the loaded document can change and the extension’s subsequent operation ends up targeting the new (intended) document. <span>documentId</span> addresses this problem by providing a unique ID for the document. Now, if an extension uses the ID and the frame’s document has changed, the operation fails rather than silently targeting the wrong document.</p>
<p>See <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Work_with_documentId">Work with documentId</a> for the full list of supported events and methods, along with guidance on using it.</p>
<h3><b>Content scripts can read and modify adopted stylesheets</b></h3>
<p>Content scripts can now access <span>document.adoptedStyleSheets</span> and <span>ShadowRoot.adoptedStyleSheets</span> directly.</p>
<pre>const sheet = new CSSStyleSheet();
sheet.replaceSync("* { background: pink; }");
document.adoptedStyleSheets = [sheet];</pre>
<p>This enables extensions to inspect or modify constructed stylesheets from a content script, without using <span>.wrappedJSObject</span>, a workaround that risks interference from the web page.</p>
<h3><b>Theme manifest key: gradients in additional backgrounds</b></h3>
<p>The <span>theme</span> manifest key’s <span>images.additional_backgrounds</span> property now accepts CSS gradients alongside image URLs. A new <span>properties.additional_backgrounds_size</span> property controls the size of each additional background item.</p>
<h3><b>Contextual identities (containers)</b></h3>
<p>If your extension supports contextual identities, you now have access to two new methods: <span>contextualIdentities.getSupportedColors()</span> and <span>contextualIdentities.getSupportedIcons()</span>. These methods return the supported colors and icons, so your extension doesn’t need to hardcode either list.</p>
<p>Also, the colors have been updated to align with the new UI theme: <span>“turquoise”</span> is now <span>“cyan”</span>, <span>“toolbar”</span> is now <span>“gray”</span>, and <span>“violet”</span> has been added. The old names still work for backward compatibility, but your extension should switch to using <span>getSupportedColors()</span> rather than hardcoding either the old or new names.</p>
<h3><b>Add a build-for-amo script</b></h3>
<p>While this isn’t about new APIs, I wanted to mention a change that’s part of our work to make source code review faster and more reliable. When you submit an extension version, AMO now attempts to build your extensions from the submitted source code and compares the result to the package you uploaded. When the two match, reviewers don’t have to verify the build manually. This means submission can move through its review faster.</p>
<p>For now, this applies only if you submit source code that includes a <span>package.json</span> file to build your extension. If your extension has no build step, or you use a different build system, nothing changes. The AMO builder keeps its zero-config approach.</p>
<p>So, if your extension’s source code uses a <span>package.json</span> file, add an <a href="https://docs.npmjs.com/cli/v11/using-npm/scripts">npm script</a> named <span>build-for-amo</span> that runs the commands needed to build your extension for Firefox:</p>
<pre>{
  "scripts": {
    "fx-build": "some commands to build your add-on for Firefox",
    "build-for-amo": "npm run fx-build"
  }
}</pre>
<p>If you’ve a Firefox-specific build command, just point <span>build-for-amo</span> at it. When present, the builder invokes this script instead of guessing how to build your extension. And while you are at it, make sure all your dev dependencies are listed in the <span>package.json</span> file.</p>
<hr>
<p>For more information, including documentation and Bugzilla links, see the <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/153#changes_for_add-on_developers">Changes for add-on developers</a> section of the Firefox 153 for developers release notes on MDN.</p>
<p>As always, file extension-related issues on <a href="https://bugzilla.mozilla.org/">Bugzilla</a> under the WebExtensions product, cross-browser API proposals are discussed in the <a href="https://github.com/w3c/webextensions">W3C WebExtensions Community Group</a>, and questions are welcome on the <a href="https://discourse.mozilla.org/c/add-ons/35">Add-ons Discourse</a>.</p>
<p> </p>
<p>The post <a href="https://blog.mozilla.org/addons/2026/07/23/firefox-153-webextensions-api-updates/">Firefox 153 WebExtensions API updates</a> appeared first on <a href="https://blog.mozilla.org/addons">Mozilla Add-ons Community Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.0.9]]></title>
<description><![CDATA[chore: bump version to 17.0.9]]></description>
<link>https://tsecurity.de/weiterlesen/3660935/3689076/v1709/</link>
<pubDate>Thu, 23 Jul 2026 14:43:42 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 17.0.9</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[This Week In Rust: This Week in Rust 661]]></title>
<description><![CDATA[Hello and welcome to another issue of This Week in Rust!
Rust is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
@thisweekinrust.bsky.social on Bluesky or
@ThisWeekinRu...]]></description>
<link>https://tsecurity.de/weiterlesen/3659918/3688059/this-week-in-rust-this-week-in-rust-661/</link>
<pubDate>Thu, 23 Jul 2026 07:18:12 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social, or
<a href="https://github.com/rust-lang/this-week-in-rust">send us a pull request</a>.
Want to get involved? <a href="https://github.com/rust-lang/rust/blob/main/CONTRIBUTING.md">We love contributions</a>.</p>
<p><em>This Week in Rust</em> is openly developed <a href="https://github.com/rust-lang/this-week-in-rust">on GitHub</a> and archives can be viewed at <a href="https://this-week-in-rust.org/">this-week-in-rust.org</a>.
If you find any errors in this week's issue, <a href="https://github.com/rust-lang/this-week-in-rust/pulls">please submit a PR</a>.</p>
<p>Want TWIR in your inbox? <a href="https://this-week-in-rust.us11.list-manage.com/subscribe?u=fd84c1c757e02889a9b08d289&amp;id=0ed8b72485">Subscribe here</a>.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4>


<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#official">Official</a></h5>
<ul>
<li><a href="https://blog.rust-lang.org/2026/07/16/Rust-1.97.1/">Announcing Rust 1.97.1</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#newsletters">Newsletters</a></h5>
<ul>
<li><a href="https://www.theembeddedrustacean.com/p/the-embedded-rustacean-issue-76">The Embedded Rustacean Issue #76</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://tokio.rs/blog/2026-07-22-announcing-topcoat">Announcing Topcoat: a framework for building full-stack reactive web apps with Rust</a></li>
<li><a href="https://github.com/dtolnay/syn/releases/tag/3.0.0">Syn 3.0.0</a></li>
<li><a href="https://blog.jetbrains.com/rust/2026/07/22/whats-new-in-rustrover-2026-2/">What’s New in RustRover 2026.2</a></li>
<li><a href="https://github.com/kunobi-ninja/kobe/releases/tag/v0.35.0">kobe 0.35.0: readiness gates and cert recycling</a></li>
<li><a href="https://github.com/Eoin-McMahon/comhad/releases/tag/v0.1.0">Comhad v0.1.0: a ranger-style tui cyberduck replacement for browsing S3</a></li>
<li><a href="https://github.com/bigduu/Nova/releases/tag/v0.2.1">Nova v0.2.1: computer-use MCP server</a></li>
<li><a href="https://github.com/rust-windowing/winit/pull/4571">winit now has comprehensive cross-platform drag-and-drop support, exposing most of the power of the underlying OS APIs</a></li>
<li><a href="https://github.com/singhpratech/crimson-crab/releases/tag/v0.1.0">crimson-crab v0.1.0 - a production-grade Rust SDK for the Claude API (streaming, tool use, prompt caching, batches)</a></li>
<li><a href="https://singhpratech.github.io/ferrovec/">ferrovec: dependency-light HNSW vector search in Rust, compiled to WebAssembly for private in-browser semantic search</a></li>
<li><a href="https://github.com/ordokr/ordofp/releases/tag/v0.1.0">OrdoFP 0.1.0 released — a functional-programming toolbelt for Rust (HList, GAT type classes, optics, effects, monad transformers)</a></li>
<li><a href="https://freyaui.dev/posts/0.4">Freya 0.4</a></li>
<li><a href="https://dev.to/nabsei/buildline-merging-cargo-and-ninjas-build-profiling-into-one-timeline-2373">buildline: merging cargo and ninja's build profiling into one timeline</a></li>
<li><a href="https://richer-richard.github.io/cochlea/determinism.html#030-additions-2026-07-22">cochlea 0.3.0: melody read-back, MFCC timbre, a master limiter, and MIDI import for the deterministic agent-audio engine</a></li>
<li><a href="https://flodl.dev/blog/then-the-cpu-died">flodl 0.6.0: multi-host heterogeneous DDP - mismatched GPUs across hosts beat the fastest card alone</a></li>
<li><a href="https://hongnoul.github.io/hwatu/">hwatu: a daemon-based WebKitGTK browser for tiling WMs with ~13ms window spawn</a></li>
<li><a href="https://github.com/kunobi-ninja/kache/releases/tag/v0.11.0">kache 0.11.0: broader compiler coverage and libc-aware keys</a></li>
<li><a href="https://mladedav.github.io/blog/blog/tracing-reload/"><code>tracing-reload</code> - reload layer without panics</a></li>
<li><a href="https://www.opentypeless.com/en/blog/introducing-talkmore">Introducing OpenTypeless: Voice Input That Actually Works</a></li>
<li><a href="https://dev.to/booyaka101/reading-a-rust-crates-capabilities-out-of-its-compiled-symbols-58pb">Reading a Rust crate's capabilities out of its compiled symbols</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5>
<ul>
<li><a href="https://smallcultfollowing.com/babysteps/blog/2026/07/15/battery-packs/">Battery packs: Let's talk about crates, baby</a></li>
<li><a href="https://blog.yoshuawuyts.com/capture-clauses-as-effects">Capture Clauses as Effects</a></li>
<li><a href="https://corrode.dev/blog/hardening-rust/">Hardening Rust Code For Production</a></li>
<li><a href="https://pranitha.dev/posts/tokio-gives-progress-not-ordering/">Tokio Gives Progress, Not Ordering: Scheduling 1M Tasks</a></li>
<li><a href="https://kerkour.com/rust-service-hardening-and-production-checklist">Rust service hardening and production checklist</a></li>
<li>[audio] <a href="https://corrode.dev/podcast/s06e08-rust-foundation/">The Rust Foundation with Rebecca Rumbul, Lori Lorusso, and David Wood, Rust Foundation leadership and board</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=bAINppA0BSU">Jon Gjengset: Open Source Maintenance 2026-07-18</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=lUoQ3uGSQA0">Rust Release Changelog - 1.97.0</a></li>
<li>[video] <a href="https://www.youtube.com/live/Doqwh1b4QyA">Livestream: Rust in Ubuntu</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5>
<ul>
<li><a href="https://kriyanative.com/blog/13-chain-breaks/">I hash-chained my agent's audit log. Then I found 13 breaks in it — all mine, all benign.</a></li>
<li><a href="https://dev.to/scripthpp/two-bugs-i-only-found-by-running-my-rust-sync-daemon-against-real-infrastructure-4278">Two tricky bugs in a Rust daemon</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=u91eX3J6lPU">Backend Concepts in Rust: Securely Managing App Secrets</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=tIrSvJFRxAg">Build with Naz - Ep 21: High Performance Flat 2D Arrays in Rust (SIMD, L1 cache)</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#crate-of-the-week">Crate of the Week</a></h4>
<p>This week's crate is <a href="https://github.com/medialab/xan">xan</a>, a TUI toolkit to work with CSV files.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1630">Simeon H.K. Fitch</a> for the suggestion!</p>
<p><a href="https://users.rust-lang.org/t/crate-of-the-week/2704">Please submit your suggestions and votes for next week</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#calls-for-testing">Calls for Testing</a></h4>
<p>An important step for RFC implementation is for people to experiment with the
implementation and give feedback, especially before stabilization.</p>
<p>If you are a feature implementer and would like your RFC to appear in this list, add a
<code>call-for-testing</code> label to your RFC along with a comment providing testing instructions and/or
guidance on which aspect(s) of the feature need testing.</p>
<p><em>No calls for testing were issued this week by
<a href="https://github.com/rust-lang/rust/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rust</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/rustup/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rustup</a> or
<a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing%20state%3Aopen">Rust language RFCs</a>.</em></p>
<p><a href="https://github.com/rust-lang/this-week-in-rust/issues">Let us know</a> if you would like your feature to be tracked as a part of this list.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#call-for-participation-projects-and-speakers">Call for Participation; projects and speakers</a></h4>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-projects">CFP - Projects</a></h5>
<p>Always wanted to contribute to open-source projects but did not know where to start?
Every week we highlight some tasks from the Rust community for you to pick and get started!</p>
<p>Some of these tasks may also have mentors available, visit the task page for more information.</p>



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


<ul>
<li><em>No Calls for papers or presentations were submitted this week.</em></li>
</ul>
<p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4>
<p>576 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-07-14..2026-07-21">merged in the last week</a></p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/159256">account for async closures when pointing at lifetime in return type</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157824">comptime inherent impls</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159115"><code>dep_graph</code>: deduplicate task reads with an epoch-filtered index recorder</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158976">eagerly check for ambiguity in macro parsing</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158608">implement <code>#[diagnostic::opaque]</code> attribute to hide backtraces of macros</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158720">shrink <code>ast::Expr64</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#library">Library</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/159467">add explicit <code>Iterator::count</code> impl for <code>str::EncodeUtf16</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159296">implement <code>bool::toggle</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159528">implement <code>const_binary_search</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159302">implement <code>Debug</code> helpers via <code>Cell</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156220">implement <code>VecDeque::truncate_to_range</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158061">make <code>pin!()</code> more foolproof</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158546">move <code>std::io::BufRead</code> to <code>alloc::io</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158544">move <code>std::io::Read</code> to <code>alloc::io</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158545">move <code>std::io::read_to_string</code> to <code>alloc::io</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/159149">use PGO for Cargo</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17238"><code>timings</code>: only report units the job queue actually ran</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17236">do not include proc-macro deps in rustc search path args</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17216">include SBOM outputs in fingerprints</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17226">lazily initialize git2 fetch transports</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rustdoc">Rustdoc</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/159194">fix auto trait normalization env</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159091">use PGO for rustdoc</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16855">add <code>block_scrutinee</code> lint</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17415">avoid invalid <code>ref_as_ptr</code> suggestions in const/static initializers</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16800">detect <code>== 0</code> on unsigned types as a <code>manual_clamp</code> lower bound</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17405">fix <code>if_not_else</code> linting on macro expanded conditions</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17383">fix <code>needless_collect</code> suggests a suggestion that cannot be typed</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17385"><code>non_zero_suggestions</code>: don't lint signed integer div/rem as NonZero</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17377"><code>manual_filter</code>: don't eat comments in the <code>and_then</code> suggestion</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17369">require the use of <code>as _</code> for indirectly used traits in clippy sources</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17362">rewrite <code>min_ident_chars</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16633">use <code>#[must_use]</code> determination from the compiler</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-analyzer">Rust-Analyzer</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22634">avoid index panic when flycheck list is empty</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22811">add capture hints to coroutines</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22813">add handler for E0572</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22483">do not assume array destructuring assignments with rest pattern are constant-sized</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22852">eagerly normalize <code>.await</code>'s <code>IntoFuture::Output</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22791">enable auto trait inference</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22792">extract variable preserving whitespace from macro input</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22832">fix coroutines not recording binding owners correctly</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22759">fix crashes in assists due to <code>.unwrap()</code> calls in SyntaxFactory</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22810">fix <code>hir</code> crate leaking bound variables from skipped binders</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22855">fix <code>InferenceContext:identity_args</code> using the wrong DefId</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22849">fix syntax bridge panic when spilting float</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22857">handle <code>enum</code> variants in next-solver <code>generics</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22818">implement lowering of HRTB</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22789">invalid <code>pattern_matching_variant</code> lowering due to recovery</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22867">merge <code>WherePredicate::ForLifetimes</code> into <code>WherePredicate::TypeBound</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22804">only write anon const ty in parent's inference result if it doesn't have its own inference</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22822">panic with a function item and a proc macro item having a duplicate name</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22827">parser to error on macro type bound</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22865">spawn proc-macro servers on requests clearing the client cache</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22782">use quote! inside <code>ast::make::expr_call()</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22793">use <code>Result</code> for the lsp-server <code>Response</code> payload type</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22861">record expressions in types in <code>ExprScope</code></a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5>
<p>The two most notable changes this week were <a href="https://github.com/rust-lang/rust/pull/159115">#159115</a>,
which resulted in pretty nice instruction count wins for full incremental builds on several benchmarks,
and <a href="https://github.com/rust-lang/rust/pull/159091">#159091</a>, which enabled PGO for rustdoc, which
makes it ~3-4% faster across the board.</p>
<p>There were two large rollups with tiny performance regressions, which made it difficult to find
the offending PRs.</p>
<p>Triage done by <strong>@Kobzol</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=5503df87342a73d0c29126a7e08dc9c1255c46ad&amp;end=d527bc9bfa297ca7fd7f5ae93781eeec42073170&amp;absolute=false&amp;stat=instructions%3Au">5503df87..d527bc9b</a></p>
<p><strong>Summary</strong>:</p>
<table>
<thead>
<tr>
<th>(instructions:u)</th>
<th>mean</th>
<th>range</th>
<th>count</th>
</tr>
</thead>
<tbody>
<tr>
<td>Regressions ❌ <br> (primary)</td>
<td>0.4%</td>
<td>[0.2%, 1.0%]</td>
<td>40</td>
</tr>
<tr>
<td>Regressions ❌ <br> (secondary)</td>
<td>0.7%</td>
<td>[0.2%, 4.6%]</td>
<td>69</td>
</tr>
<tr>
<td>Improvements ✅ <br> (primary)</td>
<td>-2.0%</td>
<td>[-6.2%, -0.2%]</td>
<td>136</td>
</tr>
<tr>
<td>Improvements ✅ <br> (secondary)</td>
<td>-2.6%</td>
<td>[-8.4%, -0.2%]</td>
<td>119</td>
</tr>
<tr>
<td>All ❌✅ (primary)</td>
<td>-1.4%</td>
<td>[-6.2%, 1.0%]</td>
<td>176</td>
</tr>
</tbody>
</table>
<p>2 Regressions, 3 Improvements, 6 Mixed; 4 of them in rollups
34 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/189822607d8d09acd85c234b2c245e817591ca67/triage/2026/2026-07-21.md">Full report here</a>.</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#approved-rfcs"></a><a href="https://github.com/rust-lang/rfcs/commits/master">Approved RFCs</a></h5>
<p>Changes to Rust follow the Rust <a href="https://github.com/rust-lang/rfcs#rust-rfcs">RFC (request for comments) process</a>. These
are the RFCs that were approved for implementation this week:</p>
<ul>
<li><em>No RFCs were approved this week.</em></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#final-comment-period">Final Comment Period</a></h5>
<p>Every week, <a href="https://www.rust-lang.org/team.html">the team</a> announces the 'final comment period' for RFCs and key PRs
which are reaching a decision. Express your opinions now.</p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust"></a><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Rust</a>
<ul>
<li><a href="https://github.com/rust-lang/rust/issues/159298">Tracking Issue for <code>bool::toggle</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/146954">Tracking Issue for vec_try_remove</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157562">Avoid computing layout of enums with non-int discriminants</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/71835">Tracking Issue for const_btree_len</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/138230">Add <code>raw_borrows_via_references</code> lint</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157572">stabilize size_of_val_raw, align_of_val_raw, Layout::for_value_raw</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158835">rustc_passes: lint unused <code>#[path]</code> attributes on inline modules</a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler-team-mcps-only"></a><a href="https://github.com/rust-lang/compiler-team/issues?q=label%3Amajor-change%20label%3Afinal-comment-period%20state%3Aopen">Compiler Team</a> <a href="https://forge.rust-lang.org/compiler/mcp.html">(MCPs only)</a>
<ul>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1019">Emit <code>note</code> when calling <code>rustc</code> without specifying an edition</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1011">Let the OS handle stack growth</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1010">Add <code>target_feature_available_at_call_site</code></a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#leadership-council"></a><a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a>
<ul>
<li><a href="https://github.com/rust-lang/leadership-council/pull/314">Deallocate post-2026 funds from PM and compiler-ops</a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#unsafe-code-guidelines"></a><a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Unsafe Code Guidelines</a>
<ul>
<li><a href="https://github.com/rust-lang/unsafe-code-guidelines/issues/558">Do the bytes of a pointer have to stay in the same order?</a></li>
</ul>
<p><em>No Items entered Final Comment Period this week for
  <a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Cargo</a>,
  <a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a>,
  <a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Team</a> or
  <a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</a>.</em></p>
<p>Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"></a><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h5>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3984">RFC: Refactor the libs team</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4>
<p>Rusty Events between 2026-07-22 - 2026-08-19 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-07-24 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/hd8mlw56"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-28 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254777/"><strong>Fourth Tuesday</strong></a></li>
</ul>
</li>
<li>2026-07-28 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/315279653/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/312045928/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-31 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/uo5ek1f4"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-08-01 | Virtual (Kampala, UG) | <a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763176587">Rust Circle Meetup</a><ul>
<li><a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763176587"><strong>Rust Circle Meetup</strong></a></li>
</ul>
</li>
<li>2026-08-02 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314095294/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-08-04 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/315213885/"><strong>👋 Community Catch Up</strong></a></li>
</ul>
</li>
<li>2026-08-05 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/315210367/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
</li>
<li>2026-08-07 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/ii2jrwva"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-08-11 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254776/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-08-13 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/313345333/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-08-13 | Virtual (Nürnberg, DE) | <a href="https://www.meetup.com/rust-noris">Rust Nuremberg</a><ul>
<li><a href="https://www.meetup.com/rust-noris/events/315619609/"><strong>Rust Nürnberg online</strong></a></li>
</ul>
</li>
<li>2026-08-14 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/f2hnzrug"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-08-18 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/315604176/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
<li>2026-08-19 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314105333/"><strong>Dealing with Dependencies</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#africa">Africa</a></h5>
<ul>
<li>2026-08-11 | Johannesburg, ZA | <a href="https://www.meetup.com/johannesburg-rust-meetup">Johannesburg Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/johannesburg-rust-meetup/events/315750593/"><strong>Rust's extended standard library</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#asia">Asia</a></h5>
<ul>
<li>2026-07-25 | Mumbai, IN | <a href="https://luma.com/mumbai">Rust Mumbai</a><ul>
<li><a href="https://luma.com/7ksabwbm/"><strong>​Rust Mumbai — July Meetup 🦀</strong></a></li>
</ul>
</li>
<li>2026-07-26 | Pune, IN | <a href="https://www.meetup.com/rust-pune">Rust Pune</a><ul>
<li><a href="https://www.meetup.com/rust-pune/events/315651505/"><strong>Rust Pune: July 2026</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#europe">Europe</a></h5>
<ul>
<li>2026-07-23 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/315484101/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
<li>2026-07-23 | London, UK | <a href="https://www.meetup.com/rust-london-user-group">Rust London User Group</a><ul>
<li><a href="https://www.meetup.com/rust-london-user-group/events/315612916/"><strong>LDN Talks: July 2026 Antithesis Takeover</strong></a></li>
</ul>
</li>
<li>2026-07-23 | London, UK | <a href="https://www.meetup.com/london-rust-project-group">London Rust Project Group</a><ul>
<li><a href="https://www.meetup.com/london-rust-project-group/events/315366453/"><strong>Rama modular service framework for Rust</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Paris, FR | <a href="https://www.meetup.com/rust-paris">Rust Paris</a><ul>
<li><a href="https://www.meetup.com/rust-paris/events/315309633/"><strong>Rust meetup #87</strong></a></li>
</ul>
</li>
<li>2026-07-25 | Stockholm, SE | <a href="https://www.meetup.com/stockholm-rust">Stockholm Rust</a><ul>
<li><a href="https://www.meetup.com/stockholm-rust/events/315749994/"><strong>Ferris' Fika Forum #28</strong></a></li>
</ul>
</li>
<li>2026-07-27 | Augsburg, DE | <a href="https://rust-augsburg.github.io/meetup">Rust Meetup Augsburg</a><ul>
<li><a href="https://rust-augsburg.github.io/meetup/Meetup_20.html"><strong>Rust Meetup #20: Julian Dickert - Supply chain security in Rust: Evaluating crates for production</strong></a></li>
</ul>
</li>
<li>2026-07-29 | Poland, PL | <a href="https://www.meetup.com/rust-poland-meetup">Rust Poland</a><ul>
<li><a href="https://www.meetup.com/rust-poland-meetup/events/315582674/"><strong>Rust Poland x Kraków #10</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Copenhagen, DK | <a href="https://www.meetup.com/copenhagen-rust-community">Copenhagen Rust Community</a><ul>
<li><a href="https://www.meetup.com/copenhagen-rust-community/events/315767999/"><strong>Rust meetup #70</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul>
<li><a href="https://www.meetup.com/rust-manchester/events/315037685/"><strong>Rust Manchester July Code Night</strong></a></li>
</ul>
</li>
<li>2026-08-18 | Aarhus, DK | <a href="https://www.meetup.com/rust-aarhus">Rust Aarhus</a><ul>
<li><a href="https://www.meetup.com/rust-aarhus/events/315683629/"><strong>Hack Night: Trust but verify the LLM</strong></a></li>
</ul>
</li>
<li>2026-08-18 | Leipzig, DE | <a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig">Rust - Modern Systems Programming in Leipzig</a><ul>
<li><a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/events/313816474/"><strong>Topic TBD</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<li>2026-07-22 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/xvkdgtyjckbdc/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-07-22 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a><ul>
<li><a href="https://www.meetup.com/rust-los-angeles/events/315376271/"><strong>Rust LA: Rust in Distributed Systems with Flight Science!</strong></a></li>
</ul>
</li>
<li>2026-07-22 | New York, NY, US | <a href="https://www.meetup.com/rust-nyc/events/">Rust NYC</a><ul>
<li><a href="https://www.meetup.com/rust-nyc/events/315636854/"><strong>Rust NYC: Write A Custom Coding Agent and wasm_zero</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Mountain View, CA, US | <a href="https://www.meetup.com/hackerdojo/events/">Hacker Dojo</a><ul>
<li><a href="https://www.meetup.com/hackerdojo/events/315418155/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
</ul>
</li>
<li>2026-07-25 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315582650/"><strong>Porter Square Rust Lunch, July 25</strong></a></li>
</ul>
</li>
<li>2026-07-25 | Brooklyn, NY, US | <a href="https://flowercomputer.com/">Flower</a><ul>
<li><a href="https://partiful.com/e/Vq9fyDNCMSO7ia4ulK5b"><strong>BOG-A-THON 2</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Atlanta, GA, US | <a href="https://www.meetup.com/rust-atl">Rust Atlanta</a><ul>
<li><a href="https://www.meetup.com/rust-atl/events/313539329/"><strong>Rust-Atl</strong></a></li>
</ul>
</li>
<li>2026-08-01 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315582653/"><strong>Chinatown Rust Lunch, Aug 1</strong></a></li>
</ul>
</li>
<li>2026-08-04 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/314660176/"><strong>Evening Boston Rust Meetup at Red Hat, Aug 4</strong></a></li>
</ul>
</li>
<li>2026-08-06 | Saint Louis, MO, US | <a href="https://www.meetup.com/stl-rust">STL Rust</a><ul>
<li><a href="https://www.meetup.com/stl-rust/events/314701905/"><strong>Shipping Temporal: How a Global Rust Ecosystem Built Chrome’s Newest Web API</strong></a></li>
</ul>
</li>
<li>2026-08-13 | Lehi, UT, US | <a href="https://www.meetup.com/utah-rust">Utah Rust</a><ul>
<li><a href="https://www.meetup.com/utah-rust/events/314696652/"><strong>Utah Rust August Meetup</strong></a></li>
</ul>
</li>
<li>2026-08-13 | San Diego, CA, US | <a href="https://www.meetup.com/san-diego-rust">San Diego Rust</a><ul>
<li><a href="https://www.meetup.com/san-diego-rust/events/315601099/"><strong>San Diego Rust August Meetup - Back in person!</strong></a></li>
</ul>
</li>
<li>2026-08-15 | San Francisco, CA, US | <a href="https://flowercomputer.com/">Flower</a><ul>
<li><a href="https://partiful.com/e/juWAwRs3XMWP7s9wLNWK"><strong>BOG-A-THON 3</strong></a></li>
</ul>
</li>
<li>2026-08-18 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group">San Francisco Rust Study Group</a><ul>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/314997215/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-08-19 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314105333/"><strong>Dealing with Dependencies</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5>
<ul>
<li>2026-07-23 | Perth, AU | <a href="https://www.meetup.com/perth-rust-meetup-group">Rust Perth Meetup Group</a><ul>
<li><a href="https://www.meetup.com/perth-rust-meetup-group/events/315451138/"><strong>Rust Perth: July Meetup!</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Melbourne, AU | <a href="https://www.meetup.com/rust-melbourne">Rust Melbourne</a><ul>
<li><a href="https://www.meetup.com/rust-melbourne/events/315039480/"><strong>Rust Melbourne July 2026</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#south-america">South America</a></h5>
<ul>
<li>2026-08-08 | São Paulo, SP | <a href="https://luma.com/calendar/cal-bif2oHITU1aVvsr">Rust-SP</a><ul>
<li><a href="https://luma.com/41oiyhtk"><strong>Rust SP - Aug/2026</strong></a></li>
</ul>
</li>
</ul>
<p>If you are running a Rust event please add it to the <a href="https://www.google.com/calendar/embed?src=apd9vmbc22egenmtu5l6c5jbfc%40group.calendar.google.com">calendar</a> to get
it mentioned here. Please remember to add a link to the event too.
Email the <a href="mailto:community-team@rust-lang.org">Rust Community Team</a> for access.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#jobs">Jobs</a></h4>
<p>Please see the latest <a href="https://www.reddit.com/r/rust/comments/1ttbtf5/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p>
<h3><a class="toclink" href="https://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3>
<blockquote>
<p>We were planning on publishing a blog post announcing this at the same time as making the repo public, but ran out of private repo CI usage 😭.</p>
</blockquote>
<p>– <a href="https://www.reddit.com/r/rust/comments/1uzknzl/tokiorstopcoat_a_batteriesincluded_framework_for/oy8k2nn/">Carl Lerche on r/rust</a> about the launch of topcoat</p>
<p>Despite a lamentable lack of suggestions, llogiq is glad to have found this quote.</p>
<p><a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328">Please submit quotes and vote for next week!</a></p>
<p>This Week in Rust is edited by:</p>
<ul>
<li><a href="https://github.com/nellshamrell">nellshamrell</a></li>
<li><a href="https://github.com/llogiq">llogiq</a></li>
<li><a href="https://github.com/ericseppanen">ericseppanen</a></li>
<li><a href="https://github.com/extrawurst">extrawurst</a></li>
<li><a href="https://github.com/U007D">U007D</a></li>
<li><a href="https://github.com/mariannegoldin">mariannegoldin</a></li>
<li><a href="https://github.com/bdillo">bdillo</a></li>
<li><a href="https://github.com/opeolluwa">opeolluwa</a></li>
<li><a href="https://github.com/bnchi">bnchi</a></li>
<li><a href="https://github.com/KannanPalani57">KannanPalani57</a></li>
<li><a href="https://github.com/tzilist">tzilist</a></li>
</ul>
<p><em>Email list hosting is sponsored by <a href="https://foundation.rust-lang.org/">The Rust Foundation</a></em></p>
<p><small><a href="https://www.reddit.com/r/rust/comments/1v41dgv/this_week_in_rust_661/">Discuss on r/rust</a></small></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v8.21.0-beta.1]]></title>
<description><![CDATA[Additional small tweaks, bug fixes, and performance enhancements. Thanks for using Signal!]]></description>
<link>https://tsecurity.de/weiterlesen/3659590/3687731/v8210-beta1/</link>
<pubDate>Thu, 23 Jul 2026 00:55:44 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<ul>
<li>Additional small tweaks, bug fixes, and performance enhancements. Thanks for using Signal!</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.0.8: fix(iso): used libc::Ioctl for FICLONE request type on musl targets]]></title>
<description><![CDATA[musl defines ioctl's request parameter as c_int while glibc uses
c_ulong; the hardcoded libc::c_ulong constant broke linux musl
x64/arm64 native builds.]]></description>
<link>https://tsecurity.de/weiterlesen/3659589/3687730/v1708-fixiso-used-libcioctl-for-ficlone-request-type-on-musl-targets/</link>
<pubDate>Thu, 23 Jul 2026 00:55:43 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<ul>
<li>musl defines ioctl's request parameter as c_int while glibc uses<br>
c_ulong; the hardcoded libc::c_ulong constant broke linux musl<br>
x64/arm64 native builds.</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Thunderbird 153 “Meadow” is out now!]]></title>
<description><![CDATA[As we head into the summer months, a new Extended Support Release (ESR) is in full bloom. Thunderbird 153 “Meadow” is out now, and from all of us at MZLA, the Thunderbird Council, and our global community of contributors, we can’t wait for you to try it out. “Meadow” builds on Thunderbird 140 “Ec...]]></description>
<link>https://tsecurity.de/weiterlesen/3659540/3687681/thunderbird-153-meadow-is-out-now/</link>
<pubDate>Wed, 22 Jul 2026 23:59:58 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>As we head into the summer months, a new Extended Support Release (ESR) is in full bloom. Thunderbird 153 “Meadow” is out now, and from all of us at MZLA, the Thunderbird Council, and our global community of contributors, we can’t wait for you to try it out. “Meadow” builds on Thunderbird 140 “Eclipse,” along […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/07/thunderbird-153-meadow-is-out-now/">Thunderbird 153 “Meadow” is out now!</a> appeared first on <a href="https://blog.thunderbird.net/">The Thunderbird Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Tooling Announcements: July 22nd Deploy]]></title>
<description><![CDATA[The latest version of PerfCompare is now live!
Check out the change-log below to see the updates:
[kala-moz]


Add KdeModesPanel to expanded view (#1052)


Dark Mode Bugs Fix (#1063)


Bug 2037556: simplify wording of tooltip text for CD and CLES; fix dark mode links in tooltips (#1067)


[moijes...]]></description>
<link>https://tsecurity.de/weiterlesen/3659338/3687479/firefox-tooling-announcements-july-22nd-deploy/</link>
<pubDate>Wed, 22 Jul 2026 21:57:25 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>The latest version of<a href="https://perf.compare/" rel="noopener nofollow ugc"> PerfCompare</a> is now live!</p>
<p>Check out the change-log below to see the updates:</p>
<p>[kala-moz]</p>
<ul>
<li>
<h4><a class="anchor" href="https://discourse.mozilla.org/#p-295837-add-kdemodespanel-to-expanded-view-httpsgithubcommozillaperfcomparecommit76d5aa423322c62c7345270307c026cc65e03e081052httpsgithubcommozillaperfcomparepull1052httpsgithubcommozillaperfcomparecommit76d5aa423322c62c7345270307c026cc65e03e08-1" name="p-295837-add-kdemodespanel-to-expanded-view-httpsgithubcommozillaperfcomparecommit76d5aa423322c62c7345270307c026cc65e03e081052httpsgithubcommozillaperfcomparepull1052httpsgithubcommozillaperfcomparecommit76d5aa423322c62c7345270307c026cc65e03e08-1"></a><strong><a href="https://github.com/mozilla/perfcompare/commit/76d5aa423322c62c7345270307c026cc65e03e08" rel="noopener nofollow ugc">Add KdeModesPanel to expanded view (</a><a href="https://github.com/mozilla/perfcompare/pull/1052" rel="noopener nofollow ugc">#1052</a><a href="https://github.com/mozilla/perfcompare/commit/76d5aa423322c62c7345270307c026cc65e03e08" rel="noopener nofollow ugc">)</a></strong></h4>
</li>
<li>
<h4><a class="anchor" href="https://discourse.mozilla.org/#p-295837-dark-mode-bugs-fix-httpsgithubcommozillaperfcomparecommite06a7a17685f3803b7889ad4307ecdf187655d801063httpsgithubcommozillaperfcomparepull1063httpsgithubcommozillaperfcomparecommite06a7a17685f3803b7889ad4307ecdf187655d80-2" name="p-295837-dark-mode-bugs-fix-httpsgithubcommozillaperfcomparecommite06a7a17685f3803b7889ad4307ecdf187655d801063httpsgithubcommozillaperfcomparepull1063httpsgithubcommozillaperfcomparecommite06a7a17685f3803b7889ad4307ecdf187655d80-2"></a><strong><a href="https://github.com/mozilla/perfcompare/commit/e06a7a17685f3803b7889ad4307ecdf187655d80" rel="noopener nofollow ugc">Dark Mode Bugs Fix (</a><a href="https://github.com/mozilla/perfcompare/pull/1063" rel="noopener nofollow ugc">#1063</a><a href="https://github.com/mozilla/perfcompare/commit/e06a7a17685f3803b7889ad4307ecdf187655d80" rel="noopener nofollow ugc">)</a></strong></h4>
</li>
<li>
<h4><a class="anchor" href="https://discourse.mozilla.org/#p-295837-bug-2037556-simplify-wording-of-tooltip-text-for-cd-and-cles-fix-dark-mode-links-in-tooltips-httpsgithubcommozillaperfcomparecommit1aaa46f08e2c620abd3e79c58e83bbc65c08234e1067httpsgithubcommozillaperfcomparepull1067httpsgithubcommozillaperfcomparecommit1aaa46f08e2c620abd3e79c58e83bbc65c08234e-3" name="p-295837-bug-2037556-simplify-wording-of-tooltip-text-for-cd-and-cles-fix-dark-mode-links-in-tooltips-httpsgithubcommozillaperfcomparecommit1aaa46f08e2c620abd3e79c58e83bbc65c08234e1067httpsgithubcommozillaperfcomparepull1067httpsgithubcommozillaperfcomparecommit1aaa46f08e2c620abd3e79c58e83bbc65c08234e-3"></a><strong><a href="https://github.com/mozilla/perfcompare/commit/1aaa46f08e2c620abd3e79c58e83bbc65c08234e" rel="noopener nofollow ugc">Bug 2037556: simplify wording of tooltip text for CD and CLES; fix dark mode links in tooltips (</a><a href="https://github.com/mozilla/perfcompare/pull/1067" rel="noopener nofollow ugc">#1067</a><a href="https://github.com/mozilla/perfcompare/commit/1aaa46f08e2c620abd3e79c58e83bbc65c08234e" rel="noopener nofollow ugc">)</a></strong></h4>
</li>
</ul>
<p>[moijes]</p>
<ul>
<li>
<h4><a class="anchor" href="https://discourse.mozilla.org/#p-295837-bug-1986319-auto-select-for-partial-or-full-hash-matches-httpsgithubcommozillaperfcomparecommit89f09ac283790f351014f6d7dd9053305792aac11066httpsgithubcommozillaperfcomparepull1066httpsgithubcommozillaperfcomparecommit89f09ac283790f351014f6d7dd9053305792aac1-4" name="p-295837-bug-1986319-auto-select-for-partial-or-full-hash-matches-httpsgithubcommozillaperfcomparecommit89f09ac283790f351014f6d7dd9053305792aac11066httpsgithubcommozillaperfcomparepull1066httpsgithubcommozillaperfcomparecommit89f09ac283790f351014f6d7dd9053305792aac1-4"></a><strong><a href="https://github.com/mozilla/perfcompare/commit/89f09ac283790f351014f6d7dd9053305792aac1" rel="noopener nofollow ugc">Bug 1986319: Auto-select for partial or full hash matches (</a><a href="https://github.com/mozilla/perfcompare/pull/1066" rel="noopener nofollow ugc">#1066</a><a href="https://github.com/mozilla/perfcompare/commit/89f09ac283790f351014f6d7dd9053305792aac1" rel="noopener nofollow ugc">)</a></strong></h4>
</li>
</ul>
<p>[sumairq]</p>
<ul>
<li>
<h4><a class="anchor" href="https://discourse.mozilla.org/#p-295837-bug-1855186httpsbugzillamozillaorgshow_bugcgiid1855186-show-whether-lower-or-higher-is-better-for-each-metric-httpsgithubcommozillaperfcomparecommita6b5a71be28f10f74dde860675d747054c4041121051httpsgithubcommozillaperfcomparepull1051httpsgithubcommozillaperfcomparecommita6b5a71be28f10f74dde860675d747054c404112-5" name="p-295837-bug-1855186httpsbugzillamozillaorgshow_bugcgiid1855186-show-whether-lower-or-higher-is-better-for-each-metric-httpsgithubcommozillaperfcomparecommita6b5a71be28f10f74dde860675d747054c4041121051httpsgithubcommozillaperfcomparepull1051httpsgithubcommozillaperfcomparecommita6b5a71be28f10f74dde860675d747054c404112-5"></a><strong><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1855186">Bug-1855186</a><a href="https://github.com/mozilla/perfcompare/commit/a6b5a71be28f10f74dde860675d747054c404112" rel="noopener nofollow ugc">: Show whether lower or higher is “better” for each metric (</a><a href="https://github.com/mozilla/perfcompare/pull/1051" rel="noopener nofollow ugc">#1051</a><a href="https://github.com/mozilla/perfcompare/commit/a6b5a71be28f10f74dde860675d747054c404112" rel="noopener nofollow ugc">)</a></strong></h4>
</li>
</ul>
<p>Thank you for the contributions!</p>
<p>Bugs or feature requests can be<a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Testing&amp;component=PerfCompare&amp;status_whiteboard=%5Bpcf%5D"> filed on Bugzilla</a>. The team can also be found on<a href="https://matrix.to/#/%23perfcompare:mozilla.org" rel="noopener nofollow ugc"> the #perfcompare channel on Element</a>. Come and chat!</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/july-22nd-deploy/149012">Read full topic</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Developer Experience: Firefox WebDriver Newsletter 153]]></title>
<description><![CDATA[WebDriver is a remote control interface that enables introspection and control of user agents. As such, it can help developers to verify that their websites are working and performing well with all major browsers. The protocol is standardized by the W3C and consists of two separate specifications...]]></description>
<link>https://tsecurity.de/weiterlesen/3656837/3684978/firefox-developer-experience-firefox-webdriver-newsletter-153/</link>
<pubDate>Wed, 22 Jul 2026 01:04:45 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p><em>WebDriver is a remote control interface that enables introspection and control of user agents. As such, it can help developers to verify that their websites are working and performing well with all major browsers. The protocol is standardized by the<a href="https://www.w3.org/"> W3C</a> and consists of two separate specifications:<a href="https://w3c.github.io/webdriver/"> WebDriver classic</a> (HTTP) and the new<a href="https://w3c.github.io/webdriver-bidi/"> WebDriver BiDi</a> (Bi-Directional).</em></p>



<p><em>This newsletter gives an overview of the work we’ve done as part of the Firefox 153 release cycle</em>.</p>



<h3>Contributions</h3>



<p>Firefox is an open source project, and we are always happy to receive external code contributions to our WebDriver implementation. We want to give special thanks to everyone who filed issues, bugs and submitted patches.</p>



<p> Firefox 153, multiple WebDriver bugs were fixed by contributors:</p>



<ul>
<li>Khalid AlHaddad updated our codebase to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1972065">use constants instead of hard-coded strings</a> for all our session data types.</li>



<li>Khalid AlHaddad improved the window manipulation commands in Marionette and WebDriver BiDi to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1941404">allow individual window geometry properties, such as x, y, width, and height, to be adjusted independently</a>.</li>



<li>Sameem updated the “Take Element Screenshot” command from WebDriver Classic to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2013176">crop screenshots of elements which exceed the viewport</a>. This aligns with the specification and avoids errors when attempting to capture huge elements.</li>
</ul>



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



<h3>All Changes</h3>



<p>A complete list of developer-facing changes included in this Firefox release is available in the <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/153#webdriver_conformance_webdriver_bidi_marionette">MDN Firefox 153 Release Notes</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Martin Thompson: Why in Building Protocols, Like Code, Starting Over Is Dumb]]></title>
<description><![CDATA[Today, the IETF held the CURRENT BoF,
where the goal was to develop a new protocol.
That protocol would be substantially like TLS,
reusing its record layer and basic structure,
but it would drop in MLS for key exchange.
This is somewhere between a pretty bad idea
and a horrible idea.
The wholesal...]]></description>
<link>https://tsecurity.de/weiterlesen/3656666/3684807/martin-thompson-why-in-building-protocols-like-code-starting-over-is-dumb/</link>
<pubDate>Tue, 21 Jul 2026 22:58:58 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Today, the IETF held the CURRENT BoF,
where the goal was to develop a new protocol.
That protocol would be substantially like TLS,
reusing its record layer and basic structure,
but it would drop in MLS for key exchange.</p>
<p>This is somewhere between a pretty bad idea
and a horrible idea.</p>
<p>The wholesale replacement of a huge chunk of protocol architectures
is a hallmark of a lot of the AI-generated protocol proposals
that have flooded the IETF.
A small blemish is identified,
then the fix is a whole new protocol,
or a major piece of surgery.
No regard for the wisdom of Chesterton’s Fence
or the accumulated knowledge and usefulness embodied in what exists.</p>
<p>Experienced engineers know that rewriting a code module
is not something you do lightly.
There’s lots of literature out there about why this is a bad idea generally,
and some emerging discussion about how AI might just change that.</p>
<p>The reasons not to rewrite a software component still largely apply
to a protocol component.
The reasons that AI might make it easier to do that safely, less so.
Protocols are different.</p>
<h3>Wholesale Change Will Miss Use Cases</h3>
<p>Just like with a code change,
a protocol component that changes will miss use cases
that people really care about.</p>
<p>The usual concerns with code apply:</p>
<ul>
<li>The existing features you know about and can test for
can be handled.</li>
<li>The existing problems you know and care about can be fixed.</li>
<li>You inevitably introduce brand-new problems.</li>
<li>The existing features you don’t know about
get lost.</li>
</ul>
<p>Unlike code changes, you probably don’t have a test case
for existing features that you didn’t know about.
We found that with HTTP/2,
where a number of use cases got lost in the process
of “upgrading” HTTP.</p>
<p>In HTTP/1.1,
performing client authentication
in the middle of request was possible.
Losing that capability in HTTP/2
affected few enough people
that it was not badly damaging for the ecosystem.
It still sucked.</p>
<p>A lot of work was done to try to find these issues,
but we did not learn about these problems until fairly late in the process.</p>
<p>Proposing a protocol change means asking a whole lot of other people,
many of whom are not invested in your goals,
to do that work.</p>
<p>Changing a protocol by replacing a chunk of it,
no matter how much care is taken,
either asks the entire ecosystem to change with you.</p>
<p>That means asking everyone to move with you.
If they don’t, you are not changing the protocol,
you are forking it.</p>
<h3>Forking A Protocol Destroys Interoperability</h3>
<p>The real value of having a protocol like TLS
is that a great many things can all talk to each other.</p>
<p>Forking a protocol –
and sometimes profiling a protocol, a subject for another post –
destroys that.
You now have two ways to achieve the same goal,
and a choice to join one of two clubs.
You can join both, but that means constantly translating back and forth,
something that can only get harder over time
as protocol semantics diverge.</p>
<p>And yes, in case you were asking,
this applies to the entirety of the IETF IoT sphere,
which has parallel HTTP, TLS, and other analogues.
Ostensibly, these address the needs of highly constrained hardware,
but the cost is an ecosystem cut off from the mainstream.</p>
<h3>But Fixing Protocols Is Hard</h3>
<p>Yes, existing protocols come with baggage
or technical debt.
Maybe they aren’t perfectly optimized for your use.</p>
<p>The value that an existing protocol carries
is that you are sharing the burden of its maintenance
with a great many more people.
Fixing it, maybe by adding extensions to support your needs,
comes with opportunities to improve the protocol
even beyond that immediate need.
Every change is a chance to work off some of the accumulated cruft.</p>
<p>Major refreshes, like the TLS 1.3 reworking,
cleared out a ton of cruft in the process.
You get to benefit from the work that others do to improve that protocol too.</p>
<h3>Do the Work</h3>
<p>It is hard to be a responsible steward for the fabric of the Internet.
We do it because it is worthwhile.
Ignoring the lessons of the past is not helpful.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.0.7]]></title>
<description><![CDATA[@oh-my-pi/pi-coding-agent
Fixed

Fixed Portkey/gateway custom models whose ids start with @ (e.g. @modal/GLM-5-2-FP8) being rewritten to unrelated bundled wire ids (e.g. glm-5-2), which caused 400 responses requiring x-portkey-config or x-portkey-provider.

Full Changelog: v17.0.6...v17.0.7]]></description>
<link>https://tsecurity.de/weiterlesen/3656665/3684806/v1707/</link>
<pubDate>Tue, 21 Jul 2026 22:58:53 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed Portkey/gateway custom models whose ids start with <code>@</code> (e.g. <code>@modal/GLM-5-2-FP8</code>) being rewritten to unrelated bundled wire ids (e.g. <code>glm-5-2</code>), which caused <code>400</code> responses requiring <code>x-portkey-config</code> or <code>x-portkey-provider</code>.</li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v17.0.6...v17.0.7"><tt>v17.0.6...v17.0.7</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Quick Answers: For the questions in between]]></title>
<description><![CDATA[You’re planning a trip. Reading an article. Following a recipe. Then a question pops into your head. Sometimes it leads down a rabbit hole – with more searches, more tabs and plenty to explore. Other times, you just need a little context so you can get back to what you were doing. That’s why we’r...]]></description>
<link>https://tsecurity.de/weiterlesen/3656178/3684319/quick-answers-for-the-questions-in-between/</link>
<pubDate>Tue, 21 Jul 2026 18:12:11 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>You’re planning a trip. Reading an article. Following a recipe. Then a question pops into your head. Sometimes it leads down a rabbit hole – with more searches, more tabs and plenty to explore. Other times, you just need a little context so you can get back to what you were doing. That’s why we’re […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-features/quick-answers-ios/">Quick Answers: For the questions in between</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Your Android tabs just got a lot more organized with Firefox]]></title>
<description><![CDATA[Tabs pile up fast on mobile. Imagine you’re planning a summer barbecue, and you start by searching for the best rib recipe. Twenty minutes later, you’re 17 tabs deep: comparing marinades, debating side dishes, checking the weather, making a grocery list and adding songs to a playlist. None of tho...]]></description>
<link>https://tsecurity.de/weiterlesen/3656177/3684318/your-android-tabs-just-got-a-lot-more-organized-with-firefox/</link>
<pubDate>Tue, 21 Jul 2026 18:12:07 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Tabs pile up fast on mobile. Imagine you’re planning a summer barbecue, and you start by searching for the best rib recipe. Twenty minutes later, you’re 17 tabs deep: comparing marinades, debating side dishes, checking the weather, making a grocery list and adding songs to a playlist. None of those tabs are organized. They’re mixed […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/tab-groups-android/">Your Android tabs just got a lot more organized with Firefox</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Experience Better Browsing: Introducing Native Containers in Firefox 153]]></title>
<description><![CDATA[Today, we’re excited to announce the Preview of Containers in Firefox version 153, which lets you keep separate parts of your online life (work, shopping, personal, banking) logged into different accounts in the same browser window, but keeps your cookies and ad tracking isolated inside each cont...]]></description>
<link>https://tsecurity.de/weiterlesen/3656176/3684317/experience-better-browsing-introducing-native-containers-in-firefox-153/</link>
<pubDate>Tue, 21 Jul 2026 18:12:00 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Today, we’re excited to announce the Preview of Containers in Firefox version 153, which lets you keep separate parts of your online life (work, shopping, personal, banking) logged into different accounts in the same browser window, but keeps your cookies and ad tracking isolated inside each container. This means that stuff you do in one […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-containers-preview/">Experience Better Browsing: Introducing Native Containers in Firefox 153</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Tooling Announcements: Firefox Profiler Deployment (July 21, 2026)]]></title>
<description><![CDATA[The latest version of the Firefox Profiler is now live! Check out the full changelog below to see what’s changed:
Highlights:

[fatadel] Show counter values over time in profiler-cli (#6136)
[Markus Stange] More typed arrays: sample + counter times, some frametable columns (#6139)
[Nazım Can Altı...]]></description>
<link>https://tsecurity.de/weiterlesen/3655831/3683972/firefox-tooling-announcements-firefox-profiler-deployment-july-21-2026/</link>
<pubDate>Tue, 21 Jul 2026 16:11:42 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>The latest version of the <a href="https://profiler.firefox.com/" rel="noopener nofollow ugc">Firefox Profiler</a> is now live! Check out the full changelog below to see what’s changed:</p>
<p><strong>Highlights:</strong></p>
<ul>
<li>[fatadel] Show counter values over time in profiler-cli (<a href="https://github.com/firefox-devtools/profiler/pull/6136" rel="noopener nofollow ugc">#6136</a>)</li>
<li>[Markus Stange] More typed arrays: sample + counter times, some frametable columns (<a href="https://github.com/firefox-devtools/profiler/pull/6139" rel="noopener nofollow ugc">#6139</a>)</li>
<li>[Nazım Can Altınova] Add marker handles to <code>profiler-cli thread network</code> (<a href="https://github.com/firefox-devtools/profiler/pull/6172" rel="noopener nofollow ugc">#6172</a>)</li>
<li>[Nazım Can Altınova] Surface network activity across profiler-cli (<a href="https://github.com/firefox-devtools/profiler/pull/6175" rel="noopener nofollow ugc">#6175</a>)</li>
<li>[Nazım Can Altınova] Add <code>profile meta</code> command to profiler-cli (<a href="https://github.com/firefox-devtools/profiler/pull/6177" rel="noopener nofollow ugc">#6177</a>)</li>
<li>[Markus Stange] Allow raw marker table’s <code>startTime</code> and <code>endTime</code> columns to be Float64Array (<a href="https://github.com/firefox-devtools/profiler/pull/6169" rel="noopener nofollow ugc">#6169</a>)</li>
</ul>
<p><strong>Other Changes:</strong></p>
<ul>
<li>[Sky Ning] Skip preview links for non-main PRs (<a href="https://github.com/firefox-devtools/profiler/pull/6161" rel="noopener nofollow ugc">#6161</a>)</li>
<li>[spokodev] fix(gecko-upgrade): don’t crash on a counter with empty sample_groups (<a href="https://github.com/firefox-devtools/profiler/pull/6160" rel="noopener nofollow ugc">#6160</a>)</li>
<li>[Markus Stange] Make profile-conversion snapshots more compact and meaningful (<a href="https://github.com/firefox-devtools/profiler/pull/6152" rel="noopener nofollow ugc">#6152</a>)</li>
<li>[Nazım Can Altınova] Only render a marker url field as a link when the whole value is a URL (<a href="https://github.com/firefox-devtools/profiler/pull/6163" rel="noopener nofollow ugc">#6163</a>)</li>
<li>[fatadel] Show each counter’s owning process in profiler-cli (<a href="https://github.com/firefox-devtools/profiler/pull/6164" rel="noopener nofollow ugc">#6164</a>)</li>
<li>[Nazım Can Altınova] Document the pre-existing thread info and network JSON schemas in the cli (<a href="https://github.com/firefox-devtools/profiler/pull/6171" rel="noopener nofollow ugc">#6171</a>)</li>
<li>[Markus Stange] Copy column contents in getRawSamplesTableBuilderFromExisting for consistency (<a href="https://github.com/firefox-devtools/profiler/pull/6168" rel="noopener nofollow ugc">#6168</a>)</li>
<li>[Markus Stange] Convert eligible columns to typed arrays when outputting from profiler-edit (<a href="https://github.com/firefox-devtools/profiler/pull/6167" rel="noopener nofollow ugc">#6167</a>)</li>
<li>[Markus Stange] Remove unused samples.thread column (<a href="https://github.com/firefox-devtools/profiler/pull/6151" rel="noopener nofollow ugc">#6151</a>)</li>
<li>[Markus Stange] Fixed botched merge which broke ‘yarn ts’ (<a href="https://github.com/firefox-devtools/profiler/pull/6174" rel="noopener nofollow ugc">#6174</a>)</li>
<li>[Markus Stange] Update json-slabs 0.3.0 → 0.4.0 (major) (<a href="https://github.com/firefox-devtools/profiler/pull/6176" rel="noopener nofollow ugc">#6176</a>)</li>
<li>[nightcityblade] Fix light theme text selection colors (<a href="https://github.com/firefox-devtools/profiler/pull/6186" rel="noopener nofollow ugc">#6186</a>)</li>
<li>[Nazım Can Altınova] Import source map URLs from Chrome DevTools traces (<a href="https://github.com/firefox-devtools/profiler/pull/6190" rel="noopener nofollow ugc">#6190</a>)</li>
<li>[Nazım Can Altınova] Rename yarn <code>build-profiler-cli</code> script to <code>build-cli</code> (<a href="https://github.com/firefox-devtools/profiler/pull/6191" rel="noopener nofollow ugc">#6191</a>)</li>
<li>[Nazım Can Altınova] Migrate husky to version 9 (<a href="https://github.com/firefox-devtools/profiler/pull/6201" rel="noopener nofollow ugc">#6201</a>)</li>
<li>[Nazım Can Altınova] Fix horizontal overflow when the transform navigator is long (<a href="https://github.com/firefox-devtools/profiler/pull/6199" rel="noopener nofollow ugc">#6199</a>)</li>
<li>[fatadel] Add a ‘hexadecimal’ marker schema field format (<a href="https://github.com/firefox-devtools/profiler/pull/6197" rel="noopener nofollow ugc">#6197</a>)</li>
<li>[Nazım Can Altınova] Bump source-map to 0.8.0 and remove the old type workaround (<a href="https://github.com/firefox-devtools/profiler/pull/6202" rel="noopener nofollow ugc">#6202</a>)</li>
<li>[Nazım Can Altınova] <img alt=":clockwise_vertical_arrows:" class="emoji" height="20" src="https://emoji.discourse-cdn.com/twitter/clockwise_vertical_arrows.png?v=15" title=":clockwise_vertical_arrows:" width="20"> Sync: l10n → main (July 21, 2026) (<a href="https://github.com/firefox-devtools/profiler/pull/6209" rel="noopener nofollow ugc">#6209</a>)</li>
</ul>
<p>Big thanks to our amazing localizers for making this release possible:</p>
<ul>
<li>fr: parmegiani.thomas</li>
<li>fr: Théo Chevalier</li>
<li>sr: Марко Костић (Marko Kostić)</li>
<li>sv-SE: Luna Jernberg</li>
<li>tr: Grk</li>
<li>zh-CN: Ariel</li>
<li>zh-CN: Olvcpr423</li>
</ul>
<p>Find out more about the Firefox Profiler on <a href="https://profiler.firefox.com/" rel="noopener nofollow ugc">profiler.firefox.com</a>! If you have any questions, join the discussion on our <a href="https://chat.mozilla.org/#/room/%23profiler:mozilla.org" rel="noopener nofollow ugc">Matrix channel</a>!</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/firefox-profiler-deployment-july-21-2026/149006">Read full topic</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.0.6]]></title>
<description><![CDATA[chore: bump version to 17.0.6]]></description>
<link>https://tsecurity.de/weiterlesen/3654111/3682252/v1706/</link>
<pubDate>Mon, 20 Jul 2026 23:54:54 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 17.0.6</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.0.5]]></title>
<description><![CDATA[chore: bump version to 17.0.5]]></description>
<link>https://tsecurity.de/weiterlesen/3650405/3678546/v1705/</link>
<pubDate>Sat, 18 Jul 2026 23:52:38 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 17.0.5</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.0.4]]></title>
<description><![CDATA[@oh-my-pi/pi-ai
Fixed

Fixed Kimi Code usage reports dropping the 5h window reset time (omp usage showed no "resets in …" for the 5h limit): the API returns resetTime on the limit detail, not on window, so the parsed row-level reset is now carried onto the window when the window itself has none.
...]]></description>
<link>https://tsecurity.de/weiterlesen/3649331/3677472/v1704/</link>
<pubDate>Sat, 18 Jul 2026 07:22:41 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-ai</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed Kimi Code usage reports dropping the 5h window reset time (<code>omp usage</code> showed no "resets in …" for the 5h limit): the API returns <code>resetTime</code> on the limit <code>detail</code>, not on <code>window</code>, so the parsed row-level reset is now carried onto the window when the window itself has none.</li>
<li>Made Kimi device-id persistence best-effort: a missing or unwritable <code>~/.omp/agent</code> directory no longer throws during Kimi header construction, which silently nulled every <code>kimi-code</code> usage probe on fresh installs.</li>
<li>Coerced boolean tool-schema subschemas to MFJS object forms for native Moonshot/Kimi endpoints, preventing the task tool's <code>outputSchema</code> field from causing HTTP 400 responses (<a href="https://github.com/can1357/oh-my-pi/issues/5952" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/5952/hovercard">#5952</a>).</li>
</ul>
<h2>@oh-my-pi/pi-catalog</h2>
<h3>Changed</h3>
<ul>
<li>Kimi-family models now use MFJS tool schema on all hosts, including proxies like OpenRouter that forward schemas to Moonshot</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed bundled Linux ffmpeg recording by selecting its available ALSA input when PulseAudio support is absent, and surfaced recorder stderr when capture fails (<a href="https://github.com/can1357/oh-my-pi/issues/5907" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/5907/hovercard">#5907</a>).</li>
<li>Session load now skips the recursive async blob-ref resolver for entries with no <code>blob:sha256:</code> references. A cheap synchronous precheck gates the walk per entry (preserving the previous per-entry initiation order under synchronous store mutation), so text-heavy histories no longer pay the <code>Promise.all</code> tree descent for every non-session entry (<a href="https://github.com/can1357/oh-my-pi/issues/5922" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/5922/hovercard">#5922</a>).</li>
<li>Fixed <code>task</code> tool schemas emitting boolean subschemas that llama.cpp grammar generation cannot parse (<a href="https://github.com/can1357/oh-my-pi/issues/5957" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/5957/hovercard">#5957</a>).</li>
<li>Fixed the transcript keeping finalized assistant blocks in the live compose walk after their rows entered native terminal scrollback, making each stream tick's <code>TranscriptContainer.render</code> depth-linear in session length. Fully committed finalized blocks are now compacted out of the local frame regardless of post-finalize version tracking; a later mutation no longer recommits on ordinary frames (no duplication) and rehydrates on the next destructive full replay (no loss). Compose cost for a live tail tick is now flat as depth grows (<code>bench/transcript-compose.bench.ts</code>: ratio(N5000/N500) 2.30 → 0.90) (<a href="https://github.com/can1357/oh-my-pi/issues/5930" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/5930/hovercard">#5930</a>).</li>
<li>Fixed <code>/quit</code> and <code>/exit</code> hanging during interactive shutdown by making the mnemopi dispose path retain the current session and flush in-flight extractions without sleeping the bank; the <code>/memory enqueue</code> path and end-of-session backend enqueue still perform full cross-session consolidation. (<a href="https://github.com/can1357/oh-my-pi/issues/3641" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3641/hovercard">#3641</a>)</li>
</ul>
<h2>@oh-my-pi/hashline</h2>
<h3>Fixed</h3>
<ul>
<li>Rejected <code>DEL N:</code> headers with a trailing colon instead of silently tolerating the colon, so delete-with-body mistakes surface the corrective "has no colon" guidance.</li>
</ul>
<h2>@oh-my-pi/pi-mnemopi</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed a corrupt cached embedding model (truncated <code>model_optimized.onnx</code>, <code>Protobuf parsing failed</code> on load) permanently disabling local embeddings: init now quarantines the broken cache file (rename to <code>*.corrupt-&lt;ts&gt;</code>, only when the path resolves inside the fastembed cache directory) and retries once so the model re-downloads.</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix(mnemopi): self-heal a corrupt cached embedding model on init by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/DarkPhilosophy/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/DarkPhilosophy">@DarkPhilosophy</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4915535326" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/5923" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/5923/hovercard" href="https://github.com/can1357/oh-my-pi/pull/5923">#5923</a></li>
<li>perf(session): gate blob-ref resolution behind synchronous precheck by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4915557895" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/5925" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/5925/hovercard" href="https://github.com/can1357/oh-my-pi/pull/5925">#5925</a></li>
<li>fix(task): avoid boolean output schema subschemas by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4916647111" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/5958" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/5958/hovercard" href="https://github.com/can1357/oh-my-pi/pull/5958">#5958</a></li>
<li>fix(stt): select a supported Linux ffmpeg input by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4914568211" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/5909" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/5909/hovercard" href="https://github.com/can1357/oh-my-pi/pull/5909">#5909</a></li>
<li>fix(tui): compact committed finalized transcript history by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4915924036" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/5943" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/5943/hovercard" href="https://github.com/can1357/oh-my-pi/pull/5943">#5943</a></li>
<li>fix(ai): normalize boolean tool schemas for Moonshot by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4916584073" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/5955" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/5955/hovercard" href="https://github.com/can1357/oh-my-pi/pull/5955">#5955</a></li>
<li>fix(kimi): surface the 5h usage window reset time by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/iacore/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/iacore">@iacore</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4916567403" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/5953" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/5953/hovercard" href="https://github.com/can1357/oh-my-pi/pull/5953">#5953</a></li>
<li>fix(mnemopi): lighter dispose consolidation so /quit returns quickly by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/iacore/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/iacore">@iacore</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4837166232" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/4843" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/4843/hovercard" href="https://github.com/can1357/oh-my-pi/pull/4843">#4843</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/iacore/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/iacore">@iacore</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4916567403" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/5953" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/5953/hovercard" href="https://github.com/can1357/oh-my-pi/pull/5953">#5953</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v17.0.3...v17.0.4"><tt>v17.0.3...v17.0.4</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.0.3]]></title>
<description><![CDATA[chore: bump version to 17.0.3]]></description>
<link>https://tsecurity.de/weiterlesen/3648770/3676911/v1703/</link>
<pubDate>Fri, 17 Jul 2026 21:39:17 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 17.0.3</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Mozilla Privacy Blog: Beyond technical fixes: Protecting kids online without breaking the internet]]></title>
<description><![CDATA[This is part one of a two-part series in which we explore approaches to protecting children online while safeguarding privacy, security and the open web. Part one covers our concerns regarding age gates, and alternative policy proposals that address the root causes of online harms. 
Young people ...]]></description>
<link>https://tsecurity.de/weiterlesen/3647717/3675858/mozilla-privacy-blog-beyond-technical-fixes-protecting-kids-online-without-breaking-the-internet/</link>
<pubDate>Fri, 17 Jul 2026 13:10:44 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p><i>This is part one of a two-part series in which we explore approaches to protecting children online while safeguarding privacy, security and the open web. Part one covers our concerns regarding age gates, and alternative policy proposals that address the root causes of online harms. </i></p>
<p>Young people today have unprecedented opportunities to learn, connect, and explore — not just the web and the world, but also themselves. With the increased ubiquity of digital technologies and devices, worries around the <a href="https://www.nature.com/articles/s41562-018-0506-1">relationship between these technologies and young people’s well-being</a> have grown, too. While concerns about the societal implications of new technologies is <a href="https://journals.sagepub.com/doi/10.1177/1745691620919372">not a new phenomenon</a>, <a href="https://www.science.org/doi/10.1126/science.adt6807">experts argue</a> that the accelerating speed of deployment of new technologies has outpaced scientists’ capacity to feed into policy recommendations addressing risks. A growing body of research <a href="https://osf.io/preprints/psyarxiv/m38u6_v2">documents</a> the harms experienced by young people online and the challenges <a href="https://ijse.padovauniversitypress.it/2024/1/8">reported</a> by parents attempting to mediate their kids’ technology use. At the same time, experts highlight the importance of contextual factors like <a href="https://www.nature.com/articles/s41562-025-02134-4">existing mental health conditions</a>, <a href="https://onlinelibrary.wiley.com/doi/full/10.1002/jad.12193">socio-economic circumstances</a> and <a href="https://www.sciencedirect.com/science/article/pii/S0747563224000244">parental mediation</a> to understand the real-world effects of digital technologies.</p>
<p>Faced with this complexity, and mounting public pressure, policymakers around the world are urgently seeking ways to improve child safety online. Driven by a sense of time running out and promises of new <a href="https://www.schneier.com/blog/archives/2026/05/laurie-anderson-is-quoting-me.html">technical solutions</a> to difficult questions, this has led, <a href="https://avpassociation.com/map/">across jurisdictions</a>, to proposals to restrict young people’s access to certain technologies or platforms by introducing age assurance mandates.</p>
<p>Privacy and user empowerment have always formed a core part of Mozilla’s mission. As <a href="https://blog.mozilla.org/netpolicy/2025/12/19/australias-social-media-ban-why-age-limits-wont-fix-what-is-wrong-with-online-platforms/">we have said before</a>, we support safer spaces for minors, but we caution against approaches that rely on identity checks, surveillance-based enforcement, or exclusionary defaults. Such interventions rely on the collection of personal and sensitive data and, thus, introduce major new privacy and security risks.</p>
<p>While many technologies exist to verify, estimate, or infer users’ ages, fundamental tensions around accessibility, their effectiveness and effects on user’s privacy, security and free expression <a href="https://kgi.georgetown.edu/wp-content/uploads/2026/01/Age_Assurance_Online_Technical-Assessment_Report_KGI.pdf">remain</a>. Technological approaches must be part of wider efforts to address the root causes of online harms. However, the deployment of age assurance technologies will not solve the complex challenge of preparing young people to navigate an increasingly online world and ensure their wellbeing. That will require more holistic approaches: offering education and support to navigate the web safely, addressing harmful business practices and acknowledging the offline factors shaping children’s lives including social inequality, poverty or disparate access to (mental) health care services.</p>
<p><em><b>Ineffective age-gating mandates and the dangerous shift toward VPN restrictions</b></em></p>
<p>As jurisdictions around the world gain experience with government-mandated age gates for certain services, evidence is mounting that age restrictions are not an effective policy tool. Avoiding age gates is widespread and trivially easy: In Australia, where minors under 16 year of age have been banned from certain social media platforms since December 2025, the government’s Compliance Update <a href="https://www.esafety.gov.au/sites/default/files/2026-03/SocialMediaMinimumAgeComplianceUpdateMarch2026.pdf?v=1775600939713">reports</a> that seven out of ten young Australians remain online, often skirting age checks by simply entering a fake birthdate. A recent <a href="https://www.internetmatters.org/wp-content/uploads/2026/04/Internet-Matters-Online-Safety-Act-Report-May-2026.pdf">study</a> on the implementation of the UK’s Online Safety Act found that a third of children have bypassed age gates with fairly trivial steps like faking their birthdate, borrowing someone else’s login credentials, or even drawing on facial hair, and that a quarter of parents have helped their children to bypass age assurance systems. In the US, <a href="https://www.ftc.gov/sites/default/files/documents/public_comments/massachusetts-00243%C2%A0/00243-82161.pdf">studies</a> indicate that as far back as 2011, 64% of parents who were aware their child under 13 had a social media account were also ones who helped them create that account.</p>
<p>Confronted with the apparent ineffectiveness of age gates, policymakers around the world seem to be shifting their attention to alleged circumvention tools. While <a href="https://www.internetmatters.org/wp-content/uploads/2026/04/Internet-Matters-Online-Safety-Act-Report-May-2026.pdf">research</a> shows that many young people bypass age barriers by using other people’s devices and accounts or tricking age estimation tools by making themselves look older, virtual private networks (VPNs) are <a href="https://www.europarl.europa.eu/RegData/etudes/ATAG/2026/782618/EPRS_ATA(2026)782618_EN.pdf">increasingly</a> <a href="https://www.bbc.com/news/articles/cn438z3ejxyo">framed</a> as primarily a “loophole” to age gates. VPNs create encrypted “tunnels” between a user’s device and the internet, protecting all internet traffic from that device and concealing users’ IP addresses. VPNs are an essential privacy and security resource for millions of users worldwide, <a href="https://home.crin.org/the-big-debates/vpns-for-children">including young people</a>.</p>
<p><a href="https://www.eff.org/deeplinks/2026/04/utahs-new-law-regulating-vpns-goes-effect-next-week">Utah’s recent age verification law</a> holds websites hosting age-restricted content liable for verifying the age of anyone physically located in Utah, including individuals using VPNs or proxies. While the law does not ban VPNs outright, it forces websites to either block known VPN IP addresses or verify the age of every visitor globally. In the UK, policymakers <a href="https://www.bbc.com/news/articles/c9824zvpz9po">debated</a> <a href="https://www.bbc.com/news/articles/cn438z3ejxyo">age gates</a> for VPNs extensively, but <a href="https://www.bbc.com/news/articles/c982857nlrlo">stopped short</a> of restricting VPNs after <a href="https://www.gov.uk/government/publications/childrens-circumvention-behaviours-online?utm_medium=email&amp;utm_campaign=govuk-notifications-topic&amp;utm_source=97439257-1368-42dd-835e-2ecc1f690097&amp;utm_content=immediately">new evidence</a> <a href="https://vpntrust.net/2026/07/08/new-yougov-research-finds-vpns-are-not-widely-used-by-children-to-avoid-age-checks/?msg_pos=1">confirmed</a> that VPNs are not a relevant pathway for children seeking to bypass age checks. In Brazil, the ECA Digital law <a href="https://www.planalto.gov.br/ccivil_03/_ato2023-2026/2026/decreto/d12880.htm">empowers</a> the regulatory authority to order technical countermeasures against circumvention tools such as VPNs. These developments suggest a worrying trend: well-meaning but ineffective attempts to protect children risk undermining the fundamental rights to privacy, security, and free expression of all users, as well as the health and openness of the web itself.</p>
<p>We are convinced, however, that there are rights-respecting alternatives policymakers can pursue to empower young people online and improve their safety and well-being.</p>
<p><em><strong>Moving beyond access bans</strong></em></p>
<p>We strongly believe that online safety frameworks should be grounded in <a href="https://www.unicef.org/innovation/stories/protecting-childrens-rights-in-digital-environments">children’s rights</a>, striking a balance between their right to protection and their right to participate in society, express themselves freely, and access media and information. Such frameworks must also be proportionate and should not undermine the fundamental rights and access to tools like VPNs for all users.</p>
<p>Rather than focusing on limiting access, we believe that policymakers should prioritize interventions that tackle the root causes of online harm. Before considering new instruments, this work starts with ensuring that independent regulatory authorities have the necessary resources to enforce existing online safety frameworks. In Europe, preliminary findings against <a href="https://ec.europa.eu/commission/presscorner/detail/en/ip_26_1579">Meta</a> and <a href="https://digital-strategy.ec.europa.eu/en/news/commission-preliminarily-finds-tiktoks-addictive-design-breach-digital-services-act">TikTok</a> find these companies’ addictive design features to be in breach of the Digital Services Act, underlining the potential of frameworks like the DSA to address key concerns.</p>
<p>The design of online interfaces, and the affordances and constraints they offer, significantly influences users’ interactions, decisions and overall wellbeing. ‘Dark patterns’ or deceptive interfaces are key drivers of harms experienced by users, and especially young people: they can compel people to consent to extensive data collection and processing, resulting in hyper-personalized feeds, personalized ads that may exploit cognitive vulnerabilities and promote unhealthy or excessive consumer choices, and an overall erosion of privacy.</p>
<p>This is why we support proposals like <a href="https://blog.mozilla.org/netpolicy/2025/10/31/pathways-to-a-fairer-digital-world-mozilla-shares-views-on-the-eu-digital-fairness-act/">EU Digital Fairness Act (DFA) </a>and the <a href="https://blog.mozilla.org/netpolicy/2026/06/11/a-handful-of-companies-control-the-web-aicoa-can-change-that/">American Innovation and Choice Online Act (AICOA)</a> that could fill regulatory gaps. Specifically, we advocate for the <b>prohibition of harmful design</b>, guided by harmonized definitions of core concepts like “dark patterns”, “deceptive design,” and “addictive design” and anti-circumvention clauses to prevent companies from avoiding regulation through small tweaks. Platforms should be responsible for demonstrating that their design choices are fair, non-manipulative and non-exploitative. And services that are likely to be accessed by children should be required to refrain from enabling certain design features, including excessive notifications, endless feeds and gambling-like features by default, and only with parental consent.</p>
<p>Further, we urge policymakers to adopt a <b>privacy-first approach to online harms</b>. Many of the risks encountered by young people online are related to the collection and processing of personal data. Platforms collect enormous amounts of personal data, including sensitive data, to personalize and target services, ranging from algorithmic recommender systems to online ads. While the systems that target and display ads and curate online content are distinct, both are based on the surveillance and profiling of users.</p>
<p>Such profiling is the basis for young people being targeted with personalized ads and content recommendations, which can segment, exclude, or steer people into inequitable options and towards harmful content. Providers should thus be prohibited from using sensitive personal data (e.g. ethnicity, religious belief, health status, sexual orientation, political affiliation) to personalize content recommendations or ads, and they should be mandated to enable privacy-protective settings by default, including restricting access to users’ location, camera, microphone, contacts, and camera roll. Policymakers should also extend the fairness and transparency obligations to personalization systems and advertising actors, including intermediaries and data brokers.</p>
<p>Additionally, everyone online, including families and young people, should be fully in control of their online experiences and navigate the web according to their preferences and needs. There is a significant opportunity to <b>empower users with easy, effective opt-out rights and granular user controls</b>. In practice, users should have the right to opt out of personalized content and targeting without being penalized with a downgraded version of the service. Some frameworks already strengthen choice – in those cases, we advocate for their robust enforcement.</p>
<p>Across jurisdictions, choice can be strengthened by ensuring that preferences explicitly expressed (e.g. settings selected, feedback signals, customization choices made, survey responses) are respected and “sticky”, so do not get reset without being explicitly requested by the user. Interoperability mandates should let people integrate third-party content moderation systems or recommendation algorithms that better match their preferences and help them break out of the walled gardens of a few dominant companies. Parental controls are another important lever to operationalize user controls: Providers should deploy easy-to-use and effective parental controls that allow families to tailor online experiences to their preferences, across platforms.</p>
<p>We appreciate that this is a long list of complex policy recommendations which are also impacted by broader (geo)political developments. The fact remains that current age assurance approaches are not a silver bullet, and will create more, rather than solve, problems in the long term.</p>
<p>Where policymakers consider age signals as necessary to ensure age-appropriate online experiences, we believe that there are technical approaches better suited to balance users’ rights than those currently pursued. We will explore these developments and approaches in the second part of this series.</p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/07/17/beyond-technical-fixes-protecting-kids-online-without-breaking-the-internet/">Beyond technical fixes: Protecting kids online without breaking the internet </a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.0.2]]></title>
<description><![CDATA[chore: bump version to 17.0.2]]></description>
<link>https://tsecurity.de/weiterlesen/3647024/3675165/v1702/</link>
<pubDate>Fri, 17 Jul 2026 07:54:25 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 17.0.2</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Workshop Basel day three]]></title>
<description><![CDATA[See also: day one, day two. There is only one thing that is better than two days of HTTP workshop, and that is of course three days of HTTP workshop. The final day of this edition of the series started out with us again shuffling around where we parked ourselves around the big table. Except … Con...]]></description>
<link>https://tsecurity.de/weiterlesen/3646444/3674585/workshop-basel-day-three/</link>
<pubDate>Thu, 16 Jul 2026 22:23:46 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[See also: day one, day two. There is only one thing that is better than two days of HTTP workshop, and that is of course three days of HTTP workshop. The final day of this edition of the series started out with us again shuffling around where we parked ourselves around the big table. Except … <a href="https://daniel.haxx.se/blog/2026/07/16/workshop-basel-day-three/" class="more-link">Continue reading <span class="screen-reader-text">Workshop Basel day three</span> <span class="meta-nav">→</span></a>]]></content:encoded>
</item>
<item>
<title><![CDATA[Niko Matsakis: Battery packs: Let's talk about crates, baby]]></title>
<description><![CDATA[This blog post describes an idea I’ve been kicking around called battery packs. Battery packs are a curated set of crates arranged around a common theme. For example, there’s a CLI battery pack that has everything you need to build a great CLI, an opinionated pack for creating a backend web servi...]]></description>
<link>https://tsecurity.de/weiterlesen/3646125/3674266/niko-matsakis-battery-packs-lets-talk-about-crates-baby/</link>
<pubDate>Thu, 16 Jul 2026 19:24:07 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<img alt="Battery pack logo" class="float-right" src="https://smallcultfollowing.com/babysteps/%20/assets/2026-07-15-battery-packs.png">
<p>This blog post describes an idea I’ve been kicking around called <strong>battery packs</strong>. Battery packs are a curated set of crates arranged around a common theme. For example, there’s a CLI battery pack that has <a href="https://crates.io/crates/cli-battery-pack">everything you need to build a great CLI</a>, an opinionated pack for <a href="https://crates.io/crates/backend-service-battery-pack">creating a backend web service</a>, and <a href="https://crates.io/crates/embedded-battery-pack">one for embedded development</a> (based on the Embedded Working Group’s <a href="https://github.com/rust-embedded/awesome-embedded-rust">Awesome Rust repository</a>). We’ve also got some smaller ones, such as the <a href="https://crates.io/crates/error-battery-pack">error-handling battery pack</a> that shows how to handle errors in Rust. But this is just the beginning – a key part of the battery pack design is that anybody can create one.</p>
<p>Battery packs are meant to address one of the most common things I hear from new Rust adopters. Everyone loves the wealth of high-quality crates available on crates.io. And everyone hates having to spend a bunch of time researching and comparing alternatives. Battery packs can serve as a good set of default choices. And they don’t lock you in. At heart, they’re basically just a list of recommended crates, so you can always swap something out if you find an alternative.</p>

<p>We’ve got a prototype of the battery pack tool working today, so you can try it out if you’re curious. Just run <code>cargo install cargo-bp</code> and then try a few commands! For example,</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-bash"><span class="line"><span class="cl">&gt; cargo bp list
</span></span></code></pre></div><p>will show you the set of available battery packs, based on a crates.io search (as I’ll explain below, a battery pack is itself packaged and distributed as a crate, but not one that you take a direct dependency on). And <code>cargo bp add</code> will add batteries from a battery pack into your crate, so e.g.</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-bash"><span class="line"><span class="cl">&gt; cargo bp add cli
</span></span></code></pre></div><p>would let you select and add common CLI libraries. If you want to see a more involved demo, try out <code>cargo bp add embedded</code>, which is derived from the <a href="https://github.com/rust-embedded/awesome-embedded-rust">Awesome Embedded Rust</a> repository.</p>
<h3>Let’s talk about you and me</h3>
<p>One of the key ideas from battery packs is that <strong>anybody can publish one</strong>. They are just a crate named <code>X-battery-pack</code>; the dependencies of that crate are your recommendations. Features are designations of common sets of crates frequently used together. The examples are your templates. And so forth.</p>
<p>Letting anybody create a battery pack is in contrast to the previous ideas for an “extended standard library for Rust”<sup><a class="footnote-ref" href="https://smallcultfollowing.com/babysteps/atom.xml#fn:1">1</a></sup>, and it is intended to address some of Rust’s unique challenges. For one thing, it lets people publish battery packs that are tailored to specific requirements. For example, the <a href="https://crates.io/crates/cli-battery-pack">CLI</a> and <a href="https://crates.io/crates/backend-service-battery-pack">backend service</a> battery packs are targeting a “typical computer”. But I could imagine the <a href="https://rust-embedded.org/">Rust embedded working group</a> publishing a battery pack with libraries focused on no-std and binary size optimization.</p>
<p>Being open-ended also addresses the <em>“who decides?”</em> question. To my mind, the best people to recommend what libraries you ought to use are <strong>other people building systems like yours</strong>. This is why I mentioned the Embedded Working Group publishing an Embedded battery pack, for example, as I think they are clearly a set of people who know their space well. But even within the embedded space there are yet smaller groups, and I imagine that sometimes it’ll make sense to get narrower. For example, perhaps a battery pack targeted <a href="https://embassy.dev/">embassy</a> and its associated ecosystem? Unclear.</p>
<h4>Creating a battery pack</h4>
<p>If you wanted to create a battery pack, how do you do it? One answer is that you just create a new crate. But a better approach is to use the “battery-pack battery pack”<sup><a class="footnote-ref" href="https://smallcultfollowing.com/babysteps/atom.xml#fn:2">2</a></sup>, which bundles a template:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-bash"><span class="line"><span class="cl">cargo bp new battery-pack
</span></span></code></pre></div><p>This will prompt you for the name of the battery pack you want to create and a few other things and make your crate. Then you can just use <code>cargo add</code> dependencies to represent the libraries you want to recommend and publish.</p>
<h4>“Batteries” are more than dependencies</h4>
<p>The “batteries” that you can add to your project aren’t always dependencies. They can also be “recipes” or templates. For example, the CI battery pack<sup><a class="footnote-ref" href="https://smallcultfollowing.com/babysteps/atom.xml#fn:3">3</a></sup> can configure your project with the kind of “super neat-o” github actions you’ve always wanted but never wanted to bother configuring. To use it, select one or more of the templates to install:</p>
<div class="highlight"><pre class="chroma" tabindex="0"><code class="language-bash"><span class="line"><span class="cl">cargo bp add ci
</span></span></code></pre></div><p>I expect this kind of “actions to improve your crate” to become a rich source of things. Right now we’re using a relatively lightweight template system built on <a href="https://github.com/mitsuhiko/minijinja">minijinja</a>, but I think we’re going to want to expand on this.</p>
<h4>Giving it some structure</h4>
<p>Battery Packs also support more than just a flat listing of dependencies/features/templates. You can group dependencies and features into <em>categories</em> and then, for each category, distinguish between “pick at most one” or “pick any number”. For a fun example, try <code>cargo bp add embedded</code>, which is derived from the <a href="https://github.com/rust-embedded/awesome-embedded-rust">Awesome Embedded Rust</a> repository. If you run it, you’ll see something like this, which groups the choices thematically and, in some areas like “concurrency framework”, makes it clear that you want to pick one:</p>
<pre tabindex="0"><code>──────────────────────────────────────────────────────────────────
 ▼ Concurrency Framework (pick at most one)
 &gt; ○ ✦ embassy [embassy-executor, embassy-sync, embassy-time]
   ○ ✦ rtic [cortex-m, rtic]    RTIC — interrupt-driven real-time

 ▼ Display &amp; Graphics (pick any number)
   [ ] ✦ display-ssd1306 [embedded-graphics, ssd1306]    SSD1306
   [ ] ✦ display-st7789 [embedded-graphics, st7789]    ST7789 col

 ▼ Popular Drivers (pick any number)
   [ ] ✦ display-ssd1306 [embedded-graphics, ssd1306]    SSD1306
   [ ] ✦ display-st7789 [embedded-graphics, st7789]    ST7789 col
   [ ] ✦ sensor-bme280 [bme280]    BME280 temperature/humidity/pr
   [ ] ✦ sensor-lis3dh [lis3dh]    LIS3DH 3-axis accelerometer (I
   [ ] ✦ usb-device [usb-device, usbd-serial]    USB device stack

 ▼ Hardware Abstraction Layer (pick at most one)
   ○ ✦ atsamd [atsamd-hal, cortex-m-rt, critical-section-impl, co
   ○ ✦ esp32 [embedded-hal, esp-hal]    ESP32 (Xtensa, WiFi + BT,
   ○ ✦ esp32c3 [embedded-hal, esp-hal]    ESP32-C3 (RISC-V, WiFi
   ○ ✦ esp32s3 [embedded-hal, esp-hal]    ESP32-S3 (Xtensa, WiFi
   ○ ✦ nrf52832 [cortex-m-rt, critical-section-impl, cortex-m, em
   ○ ✦ nrf52840 [cortex-m-rt, critical-section-impl, cortex-m, em
   ○ ✦ nrf9160 [cortex-m-rt, critical-section-impl, cortex-m, emb
   ○ ✦ rp2040 [cortex-m-rt, critical-section-impl, cortex-m, embe
   ○ ✦ stm32f0 [cortex-m-rt, critical-section-impl, cortex-m, emb
 embedded-battery-pack v0.1.0  ↑↓/jk Navigate | Space Toggle | ←/→
</code></pre><h3>Let’s talk about all the good things…</h3>
<p>So why am I so keen on battery packs? It’s largely because I’ve heard so many would-be or recent Rust adopters talk about picking crates as a challenge. But I feel they would help with some other problems as well.</p>
<p>What I really want to see is working groups in the <a href="https://rustfoundation.org/rust-commercial-network/">Rust Commercial Network</a> banding together to publish battery packs and recommendations. These would cover the dependencies that they’re actually using.</p>
<h4>Supporting maintainers</h4>
<p>One of the reasons I want to have RCN-recognized battery packs is that they are a natural focal point to then prompt RCN members to fund the maintenance of those crates. I am imagining that for each sponsored battery pack vended within the RCN, there is an associated “ecosystem fund”. Companies or individuals could sponsor this fund to get access to early patches, security disclosures, etc or other perks. The money would be used to support the maintainers of those crates, to implement missing features, and so forth.</p>
<h4>Fostering interoperability</h4>
<p>Another value-add from battery packs is the ability to drive interop efforts. I think that as soon as we start talking about standardizing, we’re also going to recognize that there are some places where standardization is hard. For example, early conversations within the <a href="https://rust-commercial-network.github.io/rcn/network-services-wg.html">network service working group</a> (unsurprisingly) immediately identified that while most people are using <a href="https://tokio.rs/">tokio</a>, some major companies are using their own runtimes internally. It’s not like the need for “async runtime interop” is <a href="https://rust-lang.github.io/wg-async/vision/submitted_stories/status_quo/barbara_wishes_for_easy_runtime_switch.html">news</a>. But right now, every crate winds up effectively implementing their own set of little traits to make it work. Sponsored battery packs offer the possibility of a neutral home for that sort of thing.</p>
<h3>…and the bad things that could be</h3>
<p>There are some risks to people using battery packs. The most obvious is that the fact that anybody can publish a battery pack may mean that you just get a ton of battery packs, which doesn’t really help anybody! I’m not so worried about this because I think that there will be a few obvious places that most people go first, and then I think once people are oriented, they’ll get excited to explore what crates.io has to offer and start discovering more niche battery packs.</p>
<h4>Avoiding stagnation</h4>
<p>Battery packs are designed to evolve. I’ve seen it happen a number of times that there is a dominant crate for something, often taking a “traditional approach”, but then somebody else comes along and presents an interesting alternative that gradually takes off. I love that and I don’t want to put it at risk.</p>
<p>One example of evolution around CLI argument parsing. For a time, <a href="https://crates.io/crates/docopt">docopt</a> was a popular way to parse command-line options. Then <a href="https://crates.io/crates/clap">clap</a> came along and presented a more structured alternative; that was nice, but then structopt came along and connected clap to an auto-derive, so you could just write your data structure and be done. And <em>that</em> was awesome. (That is now the standard in clap.) I want to be sure that, even if there is a CLI battery pack, there’s room for the next clap to come along.</p>
<p>There are a few things about battery pack that I think will help us deal with this. First, they are a “thin abstraction”. You don’t “depend on” a battery pack, you depend on the crates within it. So if a new version comes out that uses clap instead of docopt, that doesn’t impact you at all. Your code keeps working same as it ever did. And of course it helps that <em>anybody</em> can publish a battery pack. You can now have variations on battery packs that are focused around a new approach to help it get started.</p>
<p>Done right, I think that standardized battery packs can also <em>help</em> the ecosystem evolve and pivot. As it is now, knowledge of new crates has to spread by word-of-mouth. But if everybody is aligned around a new approach, adopting that new approach within a battery packs sends a clear signal that your group is aligned that something is the new hotness.</p>
<h3>…Let’s talk about crates<sup><a class="footnote-ref" href="https://smallcultfollowing.com/babysteps/atom.xml#fn:4">4</a></sup></h3>
<h4>“Always bet on the ecosystem”</h4>
<p>I see <strong>always bet on the ecosystem</strong> as a key Rust design axiom. It’s the reason we chose a small standard library and a package manager in the first place. It’s also why battery packs are designed to be published by anyone.</p>
<p>But just like plants sometimes need a trellis to grow taller, any successful ecosystem reaches a point where it needs another layer of structure to help it keep growing. Without that, you have this “layer of tacic knowledge” (in <a href="https://blog.rust-lang.org/2025/12/19/what-do-people-love-about-rust/#example-the-wealth-of-crates-on-crates-io-are-a-key-enabler-but-can-be-an-obstacle">the words of a Rust Vision Doc interviewee</a>) that becomes an obstacle for folks. And I think we’ve reached that point with <code>crates.io</code>.</p>
<p>I am hopeful that battery packs can provide that next layer of structure. But at the end of the day, if there’s a better approach, that’s fine too, so long as we find a way to help people find (<em>and fund!</em>) the crates they need. So let’s talk about it!</p>
<div class="footnotes">
<hr>
<ol>
<li>
<p>My first recollection of it was the <a href="https://internals.rust-lang.org/t/proposal-the-rust-platform/3745">Rust Platform</a> idea we floated in 2016! <a class="footnote-backref" href="https://smallcultfollowing.com/babysteps/atom.xml#fnref:1">↩︎</a></p>
</li>
<li>
<p>Yo dawg… <a class="footnote-backref" href="https://smallcultfollowing.com/babysteps/atom.xml#fnref:2">↩︎</a></p>
</li>
<li>
<p>Hat tip to Jess Izen, who proposed and developed the CI battery pack. Neat idea. <a class="footnote-backref" href="https://smallcultfollowing.com/babysteps/atom.xml#fnref:3">↩︎</a></p>
</li>
<li>
<p>Oh, and: my apologies to <a href="https://en.wikipedia.org/wiki/Let's_Talk_About_Sex">Salt-N-Peppa</a>. <a class="footnote-backref" href="https://smallcultfollowing.com/babysteps/atom.xml#fnref:4">↩︎</a></p>
</li>
</ol>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[This Week In Rust: This Week in Rust 660]]></title>
<description><![CDATA[Hello and welcome to another issue of This Week in Rust!
Rust is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
@thisweekinrust.bsky.social on Bluesky or
@ThisWeekinRu...]]></description>
<link>https://tsecurity.de/weiterlesen/3644235/3672376/this-week-in-rust-this-week-in-rust-660/</link>
<pubDate>Thu, 16 Jul 2026 07:09:13 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social, or
<a href="https://github.com/rust-lang/this-week-in-rust">send us a pull request</a>.
Want to get involved? <a href="https://github.com/rust-lang/rust/blob/main/CONTRIBUTING.md">We love contributions</a>.</p>
<p><em>This Week in Rust</em> is openly developed <a href="https://github.com/rust-lang/this-week-in-rust">on GitHub</a> and archives can be viewed at <a href="https://this-week-in-rust.org/">this-week-in-rust.org</a>.
If you find any errors in this week's issue, <a href="https://github.com/rust-lang/this-week-in-rust/pulls">please submit a PR</a>.</p>
<p>Want TWIR in your inbox? <a href="https://this-week-in-rust.us11.list-manage.com/subscribe?u=fd84c1c757e02889a9b08d289&amp;id=0ed8b72485">Subscribe here</a>.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4>


<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#official">Official</a></h5>
<ul>
<li><a href="https://blog.rust-lang.org/2026/07/09/Rust-1.97.0/">Announcing Rust 1.97.0</a></li>
<li><a href="https://blog.rust-lang.org/2026/07/13/crates-io-development-update/">crates.io: development update</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://bun.com/blog/bun-in-rust">Rewriting Bun in Rust</a></li>
<li><a href="https://bullmq.io/news/260712/rust-release/">Announcing BullMQ for Rust</a></li>
<li><a href="https://github.com/zs-dima/prost-protovalidate/releases/tag/v0.6.0">prost-protovalidate 0.6 — buf.validate (protovalidate) for prost and buffa: compile-time codegen + runtime CEL, 2872/2872 conformance</a></li>
<li><a href="https://github.com/StaszeKrk/plaza/releases/tag/v1.0.0">plaza 1.0: a ratatui package-manager TUI that searches pacman, the AUR, apt, dnf, and Flatpak at once</a></li>
<li><a href="https://github.com/danube-messaging/danube/releases/tag/v0.15.1">Danube v0.15.1: native Apache Iceberg integration for streaming-to-lakehouse export</a></li>
<li><a href="https://www.willsearch.com.br/sentinel/">Guardian Sentinel. The Terminal User Interface for Guardian Decentralized Database - P2P</a></li>
<li><a href="https://github.com/kunobi-ninja/kobe/releases/tag/v0.33.0">kobe 0.33.0: a Rust operator for instant CI Kubernetes clusters</a></li>
<li><a href="https://navigatorbuilds.github.io/elara-mesh/blog/black-box-for-ai-agents.html">Elara Mesh: what the black box for AI agents actually does</a></li>
<li>
<p><a href="https://github.com/kunobi-ninja/kache/releases/tag/v0.10.0">kache 0.10.0: instant download dedup, no more polling</a></p>
</li>
<li>
<p><a href="https://richer-richard.github.io/cochlea/">cochlea 0.1.0: a headless, deterministic audio engine for AI agents</a></p>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5>
<ul>
<li><a href="https://opensourcesecurity.io/2026/2026-07-rfmf-lori-niko/">Open Source Security Podcast: Rust Foundation Maintainers Fund with Lori and Niko</a></li>
<li><a href="https://pulsebeam.dev/blog/moving-to-thread-per-core">Moving a Rust WebRTC SFU to thread-per-core</a></li>
<li><a href="https://abundance.build/blog/2026-07-11-faster-rust-tests-in-ci-with-parallel-steps/">Faster Rust tests in CI with parallel steps</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=fugcSHD-9Jw">The Only Diagram You Need to Understand Rust Ownership</a></li>
<li><a href="https://encore.dev/blog/typescript-parser-wasm">We compiled our TypeScript parser to WASM</a></li>
<li><a href="https://kerkour.com/rust-hype">Understanding the Rust hype for the busy developer</a></li>
<li><a href="https://dev.to/akavlabs_69/i-red-teamed-my-own-llm-security-gateway-in-four-passes-heres-every-gap-i-found-5cl9">I red-teamed my own LLM security gateway (Rust) in four passes — every detection gap and how I closed it</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5>
<ul>
<li>[video] <a href="https://www.youtube.com/watch?v=DJhhy6YQe8k">Backend Concepts in Rust: HTTP Servers</a></li>
<li><a href="https://dystroy.org/blog/picamobile/">Fearless Embedded Rust: A FPV Lego car</a></li>
<li><a href="https://www.aravpanwar.com/writing/building-decayfmt-in-rust/">What I learned building a self-corrupting file format in Rust</a></li>
<li><a href="https://corentin-core.github.io/posts/ruxe-async-runtime-agnostic/">Come Async You Are</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#miscellaneous">Miscellaneous</a></h5>
<ul>
<li><a href="https://blog.theembeddedrustacean.com/oxidize-xiao">Oxidize XIAO — An Embedded Rust Community Program</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#crate-of-the-week">Crate of the Week</a></h4>
<p>This week's crate is <a href="https://crates.io/crates/dashu">dashu</a>, a pure Rust set of libraries of arbitrary precision numbers.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1628">JacobZ</a> for the self-suggestion!</p>
<p><a href="https://users.rust-lang.org/t/crate-of-the-week/2704">Please submit your suggestions and votes for next week</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#calls-for-testing">Calls for Testing</a></h4>
<p>An important step for RFC implementation is for people to experiment with the
implementation and give feedback, especially before stabilization.</p>
<p>If you are a feature implementer and would like your RFC to appear in this list, add a
<code>call-for-testing</code> label to your RFC along with a comment providing testing instructions and/or
guidance on which aspect(s) of the feature need testing.</p>
<p><em>No calls for testing were issued this week by
<a href="https://github.com/rust-lang/rust/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rust</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/rustup/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rustup</a> or
<a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing%20state%3Aopen">Rust language RFCs</a>.</em></p>
<p><a href="https://github.com/rust-lang/this-week-in-rust/issues">Let us know</a> if you would like your feature to be tracked as a part of this list.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#call-for-participation-projects-and-speakers">Call for Participation; projects and speakers</a></h4>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-projects">CFP - Projects</a></h5>
<p>Always wanted to contribute to open-source projects but did not know where to start?
Every week we highlight some tasks from the Rust community for you to pick and get started!</p>
<p>Some of these tasks may also have mentors available, visit the task page for more information.</p>



<ul>
<li><a href="https://github.com/supernovae-st/nika/issues/424">Nika - showcase: CSV → chart PNG → markdown report (nika:chart has no example yet)</a></li>
</ul>


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



<p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4>
<p>550 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-07-07..2026-07-14">merged in the last week</a></p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/158931">inline some <code>Symbol</code> functions</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157104">predicate/clause cleanups</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158942">remove some AST <code>tokens</code> fields</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159019">resolver: wrap arenas in <code>WorkerLocal</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158794">rework read deduplication with pooled read recorders</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159012">shrink <code>mir::Statement</code> to 40 bytes</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157491">shrink no-op drop elaboration</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158865">specialize common <code>(1, 1)</code> case for arg unification</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158842">use SmallVec for return places in MIR</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#library">Library</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/158866">add explicit <code>Iterator::count</code> impl for <code>ChunkBy</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157153">allow <code>Allocator</code>s to be used as <code>#[global_allocator]</code>s</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158876">fix multiple logic bugs in <code>Arc::make_mut</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158940">implement feature <code>char_to_u32</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159092">make volatile operations const</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158541">move <code>std::io::Write</code> to <code>core::io</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/159099">stabilize <code>String::from_utf8_lossy_owned</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/151379">stabilize <code>VecDeque::retain_back</code> from <code>truncate_front</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/cargo/pull/17199"><code>install</code>: Move --debug to Compilation options</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17204"><code>source</code>: incorrect duplicate package warning</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17202">fix manifest schema generation: <code>TomlDebugInfo</code> enum-variants doesn't renamed</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17198">dont apply host-config gating to stable behavior</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17191">reduce library search path length in new build dir layout</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17168">reduce rustc <code>-L</code> args used in the new <code>build-dir</code> layout</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17149">rename <code>-Zno-embed-metadata</code> to <code>-Zembed-metadata=no</code></a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17203">test: fix race in <code>cargo_compile_with_invalid_code_in_deps</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/15000">add new lints: <code>rest_pattern_accessible_field</code> and <code>unnecessary_rest_pattern</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16965">new lint: <code>definition_in_module_root</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17343"><code>arbitrary_source_item_ordering</code>: add configurable trait impl item ordering modes</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17387"><code>tests_outside_test_module</code>: put code in backticks in the lint message</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17215">count length of the first paragraph by its text</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16980">fix <code>suboptimal_flops</code> false negative with ambiguous float literals</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17416">partly disable <code>unneeded_wildcard_pattern</code> when <code>rest_pattern_accessible_field</code> is enabled</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17404">respect the configured MSRV in <code>implicit_saturating_sub</code>'s <code>if x != 0 { x -= 1 }</code> rewrite</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16513">trigger <code>single_element_loop</code> if the block contains only a final expression</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16808">optimize <code>nonstandard_macro_braces</code> by 99.9683% (1.1b → 351K)</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17381">perf: bail out of the <code>disallowed_methods</code> rule if the disallowed list is empty</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-analyzer">Rust-Analyzer</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22771">ask for disclosure in AI contributions</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22734">add fixes for array length for <code>type_mismatch</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22741">add parens in transformed dyn type in ref type</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22736">avoid panic in merge imports on trailing path separator</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22654">change some things for <code>#[doc = macro!()]</code> expansion</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22770">clamp cttz const-eval result to type width</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22751">correctly handled cfg'ed tail expr, take 2</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22749">crash on code actions when an unresolved module is present</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22707">crash when computing diagnostics with MIR and error types</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22744">don't complete default in default impl</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22283">early late classification of lifetimes</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22583">fix <code>render_const_using_debug_impl</code> constructing outdated std layouts</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22735">fix proc macros <code>TokenStream::from_str()</code> for doc comments</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22464">hide private fields on hover depending on context</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22753">make lsp-server <code>Response</code> type closer aligned to JSON-RPC</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22535">pretty assoc const when trait in macro</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22747">reimplement <code>crate_supports_no_std</code> syntactic heuristic</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22773">resolve non-plain paths in blocks correctly</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22683">support Cargo 1.97.0 lockfile path setting</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22405">hir-ty: walk container exprs for <code>unused_must_use</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22768">fix onEnter erroneously deleting/interpreting <code>$foo</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22726">suggest code action fixes produced from diagnostics under cursor, even if they have effects elsewhere</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22777">treat library files as truly client immutable</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22534">turn <code>BlockLoc</code> into a tracked struct, take 3</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5>
<p>This week many new optimizations landed, making this a very good week for performance.
The only real regression was a fix for a miscompile that will likely be re-landed in the future.</p>
<p>Triage done by <strong>@JonathanBrouwer</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=3659db0d3e2cd634c766fcda79ed118eca31a9fd&amp;end=5503df87342a73d0c29126a7e08dc9c1255c46ad&amp;absolute=false&amp;stat=instructions%3Au">3659db0d..5503df87</a></p>
<p><strong>Summary</strong>:</p>
<table>
<thead>
<tr>
<th>(instructions:u)</th>
<th>mean</th>
<th>range</th>
<th>count</th>
</tr>
</thead>
<tbody>
<tr>
<td>Regressions ❌ <br> (primary)</td>
<td>0.3%</td>
<td>[0.2%, 0.4%]</td>
<td>3</td>
</tr>
<tr>
<td>Regressions ❌ <br> (secondary)</td>
<td>0.9%</td>
<td>[0.1%, 2.5%]</td>
<td>25</td>
</tr>
<tr>
<td>Improvements ✅ <br> (primary)</td>
<td>-1.2%</td>
<td>[-9.9%, -0.2%]</td>
<td>195</td>
</tr>
<tr>
<td>Improvements ✅ <br> (secondary)</td>
<td>-3.4%</td>
<td>[-92.1%, -0.1%]</td>
<td>174</td>
</tr>
<tr>
<td>All ❌✅ (primary)</td>
<td>-1.2%</td>
<td>[-9.9%, 0.4%]</td>
<td>198</td>
</tr>
</tbody>
</table>
<p>2 Regressions, 10 Improvements, 10 Mixed; 7 of them in rollups
36 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/212da2d63f1edf2ab22293547a99f0fbf8cb68a8/triage/2026/2026-07-13.md">Full report here</a></p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#approved-rfcs"></a><a href="https://github.com/rust-lang/rfcs/commits/master">Approved RFCs</a></h5>
<p>Changes to Rust follow the Rust <a href="https://github.com/rust-lang/rfcs#rust-rfcs">RFC (request for comments) process</a>. These
are the RFCs that were approved for implementation this week:</p>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3955">Named <code>Fn</code> trait parameters</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#final-comment-period">Final Comment Period</a></h5>
<p>Every week, <a href="https://www.rust-lang.org/team.html">the team</a> announces the 'final comment period' for RFCs and key PRs
which are reaching a decision. Express your opinions now.</p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust"></a><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Rust</a>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/159179">enable <code>unreachable_cfg_select_predicates</code> lint as part of <code>unused</code> lint group</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/156906">Stabilize <code>dyn Allocator</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/146954">Tracking Issue for vec_try_remove</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157226">Partially stabilize <code>box_vec_non_null</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/152761">Never break between empty parens</a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler-team-mcps-only"></a><a href="https://github.com/rust-lang/compiler-team/issues?q=label%3Amajor-change%20label%3Afinal-comment-period%20state%3Aopen">Compiler Team</a> <a href="https://forge.rust-lang.org/compiler/mcp.html">(MCPs only)</a>
<ul>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1015">Enable <code>-Zpolonius=next</code> on nightly</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1014">Enable <code>-Znext-solver</code> on nightly by default for testing</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1012">Stabilizing the state of the debuginfo test suite</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/922">Optimize <code>repr(Rust)</code> enums by omitting tags in more cases involving uninhabited variants.</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/841">Proposal for Adapt Stack Protector for Rust</a></li>
</ul>
<p><em>No Items entered Final Comment Period this week for
<a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a>,
<a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Team</a>,
<a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a>,
<a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</a> or
<a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Unsafe Code Guidelines</a>.</em></p>
<p>Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"></a><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h5>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3983">bf16 primitive type</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4>
<p>Rusty Events between 2026-07-15 - 2026-08-12 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-07-15 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/21k797xr"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-15 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-16 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/312045926/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-19 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314329045/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/315102297/"><strong>Lunch &amp; Learn: Learning Rust as First Programming Language</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (Tel Aviv-yafo, IL) | <a href="https://www.meetup.com/rust-tlv/events/">Rust 🦀 TLV</a><ul>
<li><a href="https://www.meetup.com/rust-tlv/events/315676843/"><strong>שיחה חופשית ווירטואלית על ראסט</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/315279653/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
<li>2026-07-22 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/hd8mlw56"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Mountain View, CA, US | <a href="https://www.meetup.com/hackerdojo/events/">Hacker Dojo</a><ul>
<li><a href="https://www.meetup.com/hackerdojo/events/315418155/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
</ul>
</li>
<li>2026-07-28 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254777/"><strong>Fourth Tuesday</strong></a></li>
</ul>
</li>
<li>2026-07-29 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/uo5ek1f4"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin/events/">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/312045928/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-08-02 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust/events/">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314095294/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-08-04 | Virtual (London, GB) | <a href="https://www.meetup.com/women-in-rust/events/">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/315213885/"><strong>👋 Community Catch Up</strong></a></li>
</ul>
</li>
<li>2026-08-05 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/f2hnzrug"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-08-05 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs/events/">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/315210367/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
</li>
<li>2026-08-11 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust/events/">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254776/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-08-12 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/f2hnzrug"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-07-19 | Virtual (Bangalore, IN) | <a href="https://discord.gg/VJyv3NfVdw">Embedded Rust Discord</a><ul>
<li><a href="https://discord.gg/6gwCNpFP?event=1526087936234225814"><strong>Silicon Sundays</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#asia">Asia</a></h5>
<ul>
<li>2026-07-18 | Bangalore, IN | <a href="https://hasgeek.com/rustbangalore">Rust Bangalore</a><ul>
<li><a href="https://hasgeek.com/rustbangalore/july-2026-rustacean-meetup/"><strong>July 2026 Rustacean Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-19 | Virtual (Bangalore, IN) | <a href="https://discord.gg/VJyv3NfVdw">Embedded Rust Discord</a><ul>
<li><a href="https://discord.gg/6gwCNpFP?event=1526087936234225814"><strong>Silicon Sundays</strong></a></li>
</ul>
</li>
<li>2026-07-25 | Mumbai, IN | <a href="https://luma.com/mumbai">Rust Mumbai</a><ul>
<li><a href="https://luma.com/7ksabwbm/"><strong>​Rust Mumbai — July Meetup 🦀</strong></a></li>
</ul>
</li>
<li>2026-07-26 | Pune, MA, IN | <a href="https://www.meetup.com/rust-pune/events/">Rust Pune</a><ul>
<li><a href="https://www.meetup.com/rust-pune/events/315651505/"><strong>Rust Pune: July 2026</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#europe">Europe</a></h5>
<ul>
<li>2026-07-15 | Dortmund, DE | <a href="https://www.meetup.com/rust-dortmund/events/">Rust Dortmund</a><ul>
<li><a href="https://www.meetup.com/rust-dortmund/events/315496876/"><strong>Teach and Hack at Projektspeicher</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Leipzig, DE | <a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig">Rust - Modern Systems Programming in Leipzig</a><ul>
<li><a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/events/313816470/"><strong>Supercharge Rust funcs with implicit arguments and context-generic programming</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/315484101/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
<li>2026-07-23 | London, UK | <a href="https://www.meetup.com/london-rust-project-group">London Rust Project Group</a><ul>
<li><a href="https://www.meetup.com/london-rust-project-group/events/315366453/"><strong>Rama modular service framework for Rust</strong></a></li>
</ul>
</li>
<li>2026-07-23 | London, UK | <a href="https://www.meetup.com/rust-london-user-group/events/">Rust London User Group</a><ul>
<li><a href="https://www.meetup.com/rust-london-user-group/events/315612916/"><strong>LDN Talks: July 2026 Antithesis Takeover</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Paris, FR | <a href="https://www.meetup.com/rust-paris">Rust Paris</a><ul>
<li><a href="https://www.meetup.com/rust-paris/events/315309633/"><strong>Rust meetup #87</strong></a></li>
</ul>
</li>
<li>2026-07-29 | Poland, PL | <a href="https://www.meetup.com/rust-poland-meetup">Rust Poland</a><ul>
<li><a href="https://www.meetup.com/rust-poland-meetup/events/315582674/"><strong>Rust Poland x Kraków #10</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Manchester, GB | <a href="https://www.meetup.com/rust-manchester/events/">Rust Manchester</a><ul>
<li><a href="https://www.meetup.com/rust-manchester/events/315037685/"><strong>Rust Manchester July Code Night</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<li>2026-07-15 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-18 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225872/"><strong>North End Rust Lunch, July 18</strong></a></li>
</ul>
</li>
<li>2026-07-21 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group">San Francisco Rust Study Group</a><ul>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/314997214/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-07-22 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/xvkdgtyjckbdc/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-07-22 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a><ul>
<li><a href="https://www.meetup.com/rust-los-angeles/events/315376271/"><strong>Rust LA: Rust in Distributed Systems with Flight Science!</strong></a></li>
</ul>
</li>
<li>2026-07-22 | New York, NY, US | <a href="https://www.meetup.com/rust-nyc/events/">Rust NYC</a><ul>
<li><a href="https://www.meetup.com/rust-nyc/events/315636854/"><strong>Rust NYC: Write A Custom Coding Agent and wasm_zero</strong></a></li>
</ul>
</li>
<li>2026-07-25 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust/events/">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315582650/"><strong>Porter Square Rust Lunch, July 25</strong></a></li>
</ul>
</li>
<li>2026-07-25 | Brooklyn, NY, US | <a href="https://flowercomputer.com/">Flower</a><ul>
<li><a href="https://partiful.com/e/Vq9fyDNCMSO7ia4ulK5b"><strong>BOG-A-THON 2</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Atlanta, GA, US | <a href="https://www.meetup.com/rust-atl/events/">Rust Atlanta</a><ul>
<li><a href="https://www.meetup.com/rust-atl/events/313539329/"><strong>Rust-Atl</strong></a></li>
</ul>
</li>
<li>2026-08-01 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust/events/">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315582653/"><strong>Chinatown Rust Lunch, Aug 1</strong></a></li>
</ul>
</li>
<li>2026-08-04 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust/events/">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/314660176/"><strong>Evening Boston Rust Meetup at Red Hat, Aug 4</strong></a></li>
</ul>
</li>
<li>2026-08-06 | Saint Louis, MO, US | <a href="https://www.meetup.com/stl-rust/events/">STL Rust</a><ul>
<li><a href="https://www.meetup.com/stl-rust/events/314701905/"><strong>Shipping Temporal: How a Global Rust Ecosystem Built Chrome’s Newest Web API</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#south-america">South America</a></h5>
<ul>
<li>2026-08-08 | São Paulo, SP | <a href="https://luma.com/calendar/cal-bif2oHITU1aVvsr">Rust-SP</a><ul>
<li><a href="https://luma.com/41oiyhtk"><strong>Rust SP - Aug/2026</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5>
<ul>
<li>2026-07-21 | Barton, AU | <a href="https://www.meetup.com/rust-canberra">Canberra Rust User Group</a><ul>
<li><a href="https://www.meetup.com/rust-canberra/events/315307280/"><strong>July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Perth, AU | <a href="https://www.meetup.com/perth-rust-meetup-group">Rust Perth Meetup Group</a><ul>
<li><a href="https://www.meetup.com/perth-rust-meetup-group/events/315451138/"><strong>Rust Perth: July Meetup!</strong></a></li>
</ul>
</li>
<li>2026-07-30 | Melbourne, AU | <a href="https://www.meetup.com/rust-melbourne/events/">Rust Melbourne</a><ul>
<li><a href="https://www.meetup.com/rust-melbourne/events/315039480/"><strong>Rust Melbourne July 2026</strong></a></li>
</ul>
</li>
</ul>
<p>If you are running a Rust event please add it to the <a href="https://www.google.com/calendar/embed?src=apd9vmbc22egenmtu5l6c5jbfc%40group.calendar.google.com">calendar</a> to get
it mentioned here. Please remember to add a link to the event too.
Email the <a href="mailto:community-team@rust-lang.org">Rust Community Team</a> for access.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#jobs">Jobs</a></h4>
<p>Please see the latest <a href="https://www.reddit.com/r/rust/comments/1ttbtf5/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p>
<h3><a class="toclink" href="https://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3>
<blockquote>
<p>Thank you for your PR, but please edit the description like you are a chainsaw-wielding maniac that just discovered the sentences are young adults who came to the lake at summer camp after sunset.</p>
</blockquote>
<p>– <a href="https://github.com/rust-lang/rust/pull/159039#issuecomment-4931084997">workingjubilee on Rust github</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1786">Theemathas</a> for the suggestion!</p>
<p><a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328">Please submit quotes and vote for next week!</a></p>
<p>This Week in Rust is edited by:</p>
<ul>
<li><a href="https://github.com/nellshamrell">nellshamrell</a></li>
<li><a href="https://github.com/llogiq">llogiq</a></li>
<li><a href="https://github.com/ericseppanen">ericseppanen</a></li>
<li><a href="https://github.com/extrawurst">extrawurst</a></li>
<li><a href="https://github.com/U007D">U007D</a></li>
<li><a href="https://github.com/mariannegoldin">mariannegoldin</a></li>
<li><a href="https://github.com/bdillo">bdillo</a></li>
<li><a href="https://github.com/opeolluwa">opeolluwa</a></li>
<li><a href="https://github.com/bnchi">bnchi</a></li>
<li><a href="https://github.com/KannanPalani57">KannanPalani57</a></li>
<li><a href="https://github.com/tzilist">tzilist</a></li>
</ul>
<p><em>Email list hosting is sponsored by <a href="https://foundation.rust-lang.org/">The Rust Foundation</a></em></p>
<p><small><a href="https://www.reddit.com/r/rust/comments/1uxsigp/this_week_in_rust_660/">Discuss on r/rust</a></small></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.0.1]]></title>
<description><![CDATA[chore: bump version to 17.0.1]]></description>
<link>https://tsecurity.de/weiterlesen/3644107/3672248/v1701/</link>
<pubDate>Thu, 16 Jul 2026 05:07:45 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 17.0.1</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v8.19.0]]></title>
<description><![CDATA[Group admins can now bring chats to their natural conclusion with the new "End Group" option in group settings. Ending a group prevents group members from sending messages or starting calls, and also disables invites. Now you can make sure everyone stays on the right thread by ending last year's ...]]></description>
<link>https://tsecurity.de/weiterlesen/3643935/3672076/v8190/</link>
<pubDate>Thu, 16 Jul 2026 01:38:16 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<ul>
<li>Group admins can now bring chats to their natural conclusion with the new "End Group" option in group settings. Ending a group prevents group members from sending messages or starting calls, and also disables invites. Now you can make sure everyone stays on the right thread by ending last year's sewing meetup group before stitching a new one together.</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Workshop Basel day two]]></title>
<description><![CDATA[If you missed it. I already described day one. Caffeinated and ready, we all gathered in the same spacious room as yesterday, but seated in new places as “suggested” by our captain. Some of us even remembered to move over the name tags we wrote yesterday to our new seats. No time was wasted on … ...]]></description>
<link>https://tsecurity.de/weiterlesen/3643641/3671782/workshop-basel-day-two/</link>
<pubDate>Wed, 15 Jul 2026 22:09:08 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[If you missed it. I already described day one. Caffeinated and ready, we all gathered in the same spacious room as yesterday, but seated in new places as “suggested” by our captain. Some of us even remembered to move over the name tags we wrote yesterday to our new seats. No time was wasted on … <a href="https://daniel.haxx.se/blog/2026/07/15/workshop-basel-day-two/" class="more-link">Continue reading <span class="screen-reader-text">Workshop Basel day two</span> <span class="meta-nav">→</span></a>]]></content:encoded>
</item>
<item>
<title><![CDATA[v17.0.0]]></title>
<description><![CDATA[chore: bump version to 17.0.0]]></description>
<link>https://tsecurity.de/weiterlesen/3643335/3671476/v1700/</link>
<pubDate>Wed, 15 Jul 2026 19:24:53 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 17.0.0</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.5.2]]></title>
<description><![CDATA[chore: bump version to 16.5.2]]></description>
<link>https://tsecurity.de/weiterlesen/3641083/3669224/v1652/</link>
<pubDate>Wed, 15 Jul 2026 00:24:32 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.5.2</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Workshop Basel day one]]></title>
<description><![CDATA[On this hot summer’s day in Basel, Switzerland, the seventh HTTP workshop started. These events tend to work roughly the same way and the people in the room are also to large extent familiar and known since previous editions. Forty people in a meeting room, where we take turns in doing short talk...]]></description>
<link>https://tsecurity.de/weiterlesen/3640957/3669098/workshop-basel-day-one/</link>
<pubDate>Tue, 14 Jul 2026 22:38:44 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[On this hot summer’s day in Basel, Switzerland, the seventh HTTP workshop started. These events tend to work roughly the same way and the people in the room are also to large extent familiar and known since previous editions. Forty people in a meeting room, where we take turns in doing short talks on HTTP … <a href="https://daniel.haxx.se/blog/2026/07/14/workshop-basel-day-one/" class="more-link">Continue reading <span class="screen-reader-text">Workshop Basel day one</span> <span class="meta-nav">→</span></a>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Tooling Announcements: Happy BMO Push Day! (20260713.1)]]></title>
<description><![CDATA[Github Link
The following changes have been pushed to bugzilla.mozilla.org:

Bug 2053330 - “Close and move to invalid bugs” button jumps way to the left (possibly under your mouse, asking for a mis-click) when you close a bug with another resolution.
Bug 2052048 - Make the “Close as invalid” butt...]]></description>
<link>https://tsecurity.de/weiterlesen/3640934/3669075/firefox-tooling-announcements-happy-bmo-push-day-202607131/</link>
<pubDate>Tue, 14 Jul 2026 22:23:58 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p><a href="https://github.com/mozilla-bteam/bmo/tree/release-20260713.1" rel="noopener nofollow ugc">Github Link</a></p>
<p>The following changes have been pushed to <a href="https://bugzilla.mozilla.org/">bugzilla.mozilla.org</a>:</p>
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2053330">Bug 2053330</a> - “Close and move to invalid bugs” button jumps way to the left (possibly under your mouse, asking for a mis-click) when you close a bug with another resolution.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2052048">Bug 2052048</a> - Make the “Close as invalid” button a bit more targeted</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2053269">Bug 2053269</a> - BMO API bugzilla.login helper needs to support Bugzilla_api_token + cookie for authenication support</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2051396">Bug 2051396</a> - Make form.web.bounty stop adding the bounty flag and more strongly push people to HackerOne</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1355999">Bug 1355999</a> - Autocomplete on https://bugzilla.mozilla.org/form.web.bounty</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2049554">Bug 2049554</a> - Cloned security bugs should default to being secure even if they aren’t in the default security group</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2036191">Bug 2036191</a> - Crash Signature Field Mismatch in Bugzilla REST API</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2043733">Bug 2043733</a> - Live Github Status for Pull Requests</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1619459">Bug 1619459</a> - Updated QA test to stop testing XMLRPC/JSONRPC and only test REST</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2052429">Bug 2052429</a> - “Show: Open/Closed/All” selects “All” incorrectly</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2052188">Bug 2052188</a> - “Close as Invalid” button is too close to the Attach New File button so can be confusing</li>
</ul>
<p>Discuss these changes in the <a href="https://matrix.to/#/%23bmo:mozilla.org" rel="noopener nofollow ugc">BMO Matrix Room</a></p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/happy-bmo-push-day-20260713-1/148934">Read full topic</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Community Office Hours: A Thundermail Update]]></title>
<description><![CDATA[Our Community Office Hours series is all about connecting with the people behind Thunderbird and our products, and sharing the work that’s happening behind the scenes. These conversations are a chance to learn more about the direction of our projects and to hear directly from the people making it...]]></description>
<link>https://tsecurity.de/weiterlesen/3640855/3668996/community-office-hours-a-thundermail-update/</link>
<pubDate>Tue, 14 Jul 2026 21:38:42 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Our Community Office Hours series is all about connecting with the people behind Thunderbird and our products, and sharing the work that’s happening behind the scenes. These conversations are a chance to learn more about the direction of our projects and to hear directly from the people making it happen. In this episode, we are […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/07/community-office-hours-a-thundermail-update/">Community Office Hours: A Thundermail Update</a> appeared first on <a href="https://blog.thunderbird.net/">The Thunderbird Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.5.1]]></title>
<description><![CDATA[chore: bump version to 16.5.1]]></description>
<link>https://tsecurity.de/weiterlesen/3640660/3668801/v1651/</link>
<pubDate>Tue, 14 Jul 2026 19:33:46 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.5.1</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Over The Edge 2.0: what independent researchers found about browser choice on Windows]]></title>
<description><![CDATA[Two years ago Mozilla asked two leading experts on deceptive design, Dr. Harry Brignull and Cennydd Bowles, to look at how Microsoft was treating people who tried to use a different browser on Windows. Their report, Over The Edge, documented a pattern of design choices in Windows, Edge, and Bing ...]]></description>
<link>https://tsecurity.de/weiterlesen/3639812/3667953/over-the-edge-20-what-independent-researchers-found-about-browser-choice-on-windows/</link>
<pubDate>Tue, 14 Jul 2026 14:42:25 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Two years ago Mozilla asked two leading experts on deceptive design, Dr. Harry Brignull and Cennydd Bowles, to look at how Microsoft was treating people who tried to use a different browser on Windows. Their report, Over The Edge, documented a pattern of design choices in Windows, Edge, and Bing that nudged, pressured, and at […]</p>
<p>The post <a href="https://blog.mozilla.org/en/mozilla/browser-choice-windows-report-over-the-edge-2/">Over The Edge 2.0: what independent researchers found about browser choice on Windows</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Mozilla’s Inaugural ‘State of Open Source AI’ Report Is Here]]></title>
<description><![CDATA[Open source AI has crossed a threshold. For years the debate has centered around whether open models could ever compete with closed ones. This is no longer a debate we should be having. Today Mozilla is publishing its inaugural State of Open Source AI report, built on new analysis and a global su...]]></description>
<link>https://tsecurity.de/weiterlesen/3639738/3667879/mozillas-inaugural-state-of-open-source-ai-report-is-here/</link>
<pubDate>Tue, 14 Jul 2026 14:08:43 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Open source AI has crossed a threshold. For years the debate has centered around whether open models could ever compete with closed ones. This is no longer a debate we should be having. Today Mozilla is publishing its inaugural State of Open Source AI report, built on new analysis and a global survey of 950+ […]</p>
<p>The post <a href="https://blog.mozilla.org/en/mozilla/mozilla-state-of-open-source-ai-report/">Mozilla’s Inaugural ‘State of Open Source AI’ Report Is Here</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Mozilla GFX: HDR video in Firefox for Windows tech retrospective]]></title>
<description><![CDATA[HDR video is coming to Firefox for Windows users (and has been available for some time on macOS).  This blog post explains how we developed the feature and gives a retrospective on the technical choices we made.



A primer on video playback for the web:




Video file demux and decode: A video s...]]></description>
<link>https://tsecurity.de/weiterlesen/3638738/3666879/mozilla-gfx-hdr-video-in-firefox-for-windows-tech-retrospective/</link>
<pubDate>Tue, 14 Jul 2026 07:08:30 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p class="wp-block-paragraph">HDR video is coming to Firefox for Windows users (and has been available for some time on macOS).  This blog post explains how we developed the feature and gives a retrospective on the technical choices we made.</p>



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<p class="wp-block-paragraph">We’re working on extending HDR support to photos, apps/games and general web content.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.5.0]]></title>
<description><![CDATA[chore: bump version to 16.5.0]]></description>
<link>https://tsecurity.de/weiterlesen/3638447/3666588/v1650/</link>
<pubDate>Tue, 14 Jul 2026 01:38:09 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.5.0</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Application Security Team: Firefox Security & Privacy Newsletter 2026 Q2]]></title>
<description><![CDATA[Welcome to the Q2 2026 edition of the Firefox Security & Privacy Newsletter.

Security and privacy are core principles of Mozilla’s Manifesto and remain at the heart of Firefox’s development. In this edition, we highlight some of the key security and privacy initiatives from Q2 2026, grouped into...]]></description>
<link>https://tsecurity.de/weiterlesen/3637366/3665507/firefox-application-security-team-firefox-security-privacy-newsletter-2026-q2/</link>
<pubDate>Mon, 13 Jul 2026 16:10:17 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Welcome to the Q2 2026 edition of the Firefox Security &amp; Privacy Newsletter.</p>

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

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

<h3>Preface</h3>

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

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

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

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

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

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

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

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

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

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

<h3>Core Security</h3>

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

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

<h3>Community Engagement</h3>

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

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

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

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

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

<h3>Looking Ahead</h3>

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

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

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

<p><em>— The Firefox Security &amp; Privacy Teams</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.4.8]]></title>
<description><![CDATA[chore: bump version to 16.4.8]]></description>
<link>https://tsecurity.de/weiterlesen/3635598/3663739/v1648/</link>
<pubDate>Sun, 12 Jul 2026 20:53:26 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.4.8</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.4.7]]></title>
<description><![CDATA[chore: bump version to 16.4.7]]></description>
<link>https://tsecurity.de/weiterlesen/3635043/3663184/v1647/</link>
<pubDate>Sun, 12 Jul 2026 13:09:17 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.4.7</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.4.6]]></title>
<description><![CDATA[chore: bump version to 16.4.6]]></description>
<link>https://tsecurity.de/weiterlesen/3634435/3662576/v1646/</link>
<pubDate>Sun, 12 Jul 2026 02:52:34 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.4.6</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.4.5]]></title>
<description><![CDATA[chore: bump version to 16.4.5]]></description>
<link>https://tsecurity.de/weiterlesen/3634109/3662250/v1645/</link>
<pubDate>Sat, 11 Jul 2026 19:53:13 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.4.5</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.4.4]]></title>
<description><![CDATA[chore: bump version to 16.4.4]]></description>
<link>https://tsecurity.de/weiterlesen/3633546/3661687/v1644/</link>
<pubDate>Sat, 11 Jul 2026 12:37:25 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.4.4</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.4.3]]></title>
<description><![CDATA[docs(coding-agent): noted E2BIG bundle fix in 16.4.3 changelog]]></description>
<link>https://tsecurity.de/weiterlesen/3633206/3661347/v1643/</link>
<pubDate>Sat, 11 Jul 2026 08:07:02 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>docs(coding-agent): noted E2BIG bundle fix in 16.4.3 changelog</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.4.2]]></title>
<description><![CDATA[chore: bump version to 16.4.2]]></description>
<link>https://tsecurity.de/weiterlesen/3632790/3660931/v1642/</link>
<pubDate>Sat, 11 Jul 2026 00:23:22 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.4.2</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.4.1]]></title>
<description><![CDATA[chore: bump version to 16.4.1]]></description>
<link>https://tsecurity.de/weiterlesen/3632496/3660637/v1641/</link>
<pubDate>Fri, 10 Jul 2026 20:52:52 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.4.1</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.4.0]]></title>
<description><![CDATA[chore: bump version to 16.4.0]]></description>
<link>https://tsecurity.de/weiterlesen/3631529/3659670/v1640/</link>
<pubDate>Fri, 10 Jul 2026 14:24:16 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.4.0</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Ryan Hunt: Just Keep At It: A Decade at Mozilla]]></title>
<description><![CDATA[Well, that went by quick!
I joined Mozilla as an intern in 2016. I wouldn’t believe you if you told me I’d still be here in 2026, working on their WebAssembly engine and contributing to the WebAssembly standards process.
Ten years at one company is a long time in this industry. I’m feeling a bit ...]]></description>
<link>https://tsecurity.de/weiterlesen/3631351/3659492/ryan-hunt-just-keep-at-it-a-decade-at-mozilla/</link>
<pubDate>Fri, 10 Jul 2026 13:09:28 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Well, that went by quick!</p>
<p>I joined Mozilla as an intern in 2016. I wouldn’t believe you if you told me I’d still be here in 2026, working on their WebAssembly engine and contributing to the WebAssembly standards process.</p>
<p>Ten years at one company is a long time in this industry. I’m feeling a bit sentimental, so I thought I’d share how that happened, and why I’m still here.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.15]]></title>
<description><![CDATA[chore: bump version to 16.3.15]]></description>
<link>https://tsecurity.de/weiterlesen/3630088/3658228/v16315/</link>
<pubDate>Thu, 09 Jul 2026 22:53:56 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.15</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.14]]></title>
<description><![CDATA[chore: bump version to 16.3.14]]></description>
<link>https://tsecurity.de/weiterlesen/3629868/3658008/v16314/</link>
<pubDate>Thu, 09 Jul 2026 20:38:37 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.14</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.13]]></title>
<description><![CDATA[chore: bump version to 16.3.13]]></description>
<link>https://tsecurity.de/weiterlesen/3629775/3657915/v16313/</link>
<pubDate>Thu, 09 Jul 2026 19:54:22 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.13</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Tooling Announcements: Firefox Profiler Deployment (July 9, 2026)]]></title>
<description><![CDATA[The latest version of the Firefox Profiler is now live! Check out the full changelog below to see what’s changed:
Highlights:

[Florian Quèze] Add “/” and “f” keyboard shortcuts to focus the panel filter box (#6025)
[Markus Stange] Change profile.shared.stackTable.prefix to prefixOffset (delta fr...]]></description>
<link>https://tsecurity.de/weiterlesen/3629677/3657817/firefox-tooling-announcements-firefox-profiler-deployment-july-9-2026/</link>
<pubDate>Thu, 09 Jul 2026 19:08:34 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>The latest version of the <a href="https://profiler.firefox.com/" rel="noopener nofollow ugc">Firefox Profiler</a> is now live! Check out the full changelog below to see what’s changed:</p>
<p><strong>Highlights:</strong></p>
<ul>
<li>[Florian Quèze] Add “/” and “f” keyboard shortcuts to focus the panel filter box (<a href="https://github.com/firefox-devtools/profiler/pull/6025" rel="noopener nofollow ugc">#6025</a>)</li>
<li>[Markus Stange] Change profile.shared.stackTable.prefix to prefixOffset (delta from current index) (<a href="https://github.com/firefox-devtools/profiler/pull/6089" rel="noopener nofollow ugc">#6089</a>)</li>
<li>[Markus Stange] Implement column sorting in the marker table (<a href="https://github.com/firefox-devtools/profiler/pull/6083" rel="noopener nofollow ugc">#6083</a>)</li>
<li>[cathaysia] feat: invert call stack in flame graph to render as icicle graph (<a href="https://github.com/firefox-devtools/profiler/pull/6090" rel="noopener nofollow ugc">#6090</a>)</li>
</ul>
<p><strong>Other Changes:</strong></p>
<ul>
<li>[Sky Ning] Add workflow to insert PR preview links (<a href="https://github.com/firefox-devtools/profiler/pull/6133" rel="noopener nofollow ugc">#6133</a>)</li>
<li>[Markus Stange] Make it easier to create upside-down flame graphs (<a href="https://github.com/firefox-devtools/profiler/pull/6128" rel="noopener nofollow ugc">#6128</a>)</li>
<li>[Markus Stange] Use appropriate highlighter dialects for ts + jsx (<a href="https://github.com/firefox-devtools/profiler/pull/6141" rel="noopener nofollow ugc">#6141</a>)</li>
<li>[cathaysia] style: add .editorconfig (<a href="https://github.com/firefox-devtools/profiler/pull/6142" rel="noopener nofollow ugc">#6142</a>)</li>
<li>[Nazım Can Altınova] Prevent long source URLs from overflowing the code error overlay (<a href="https://github.com/firefox-devtools/profiler/pull/6147" rel="noopener nofollow ugc">#6147</a>)</li>
<li>[Nazım Can Altınova] Extract a runCommand helper for profiler-cli command handlers (<a href="https://github.com/firefox-devtools/profiler/pull/6148" rel="noopener nofollow ugc">#6148</a>)</li>
<li>[cathaysia] feat(theme): add color-scheme meta (<a href="https://github.com/firefox-devtools/profiler/pull/6150" rel="noopener nofollow ugc">#6150</a>)</li>
<li>[Nazım Can Altınova] Add an early throw for the this.querier and remove the non-null asserts in the cli codebase (<a href="https://github.com/firefox-devtools/profiler/pull/6145" rel="noopener nofollow ugc">#6145</a>)</li>
<li>[skylarkning] Improve preview link discovery (<a href="https://github.com/firefox-devtools/profiler/pull/6149" rel="noopener nofollow ugc">#6149</a>)</li>
<li>[Nazım Can Altınova] <img alt=":clockwise_vertical_arrows:" class="emoji" height="20" src="https://emoji.discourse-cdn.com/twitter/clockwise_vertical_arrows.png?v=15" title=":clockwise_vertical_arrows:" width="20"> Sync: l10n → main (July 9, 2026) (<a href="https://github.com/firefox-devtools/profiler/pull/6155" rel="noopener nofollow ugc">#6155</a>)</li>
</ul>
<p>Big thanks to our amazing localizers for making this release possible:</p>
<ul>
<li>de: Michael Köhler</li>
<li>el: Jim Spentzos</li>
<li>en-GB: Ian Neal</li>
<li>es-CL: ravmn</li>
<li>fr: Théo Chevalier</li>
<li>fy-NL: Fjoerfoks</li>
<li>ia: Melo46</li>
<li>it: Francesco Lodolo [:flod]</li>
<li>nl: Fjoerfoks</li>
<li>ru: Valery Ledovskoy</li>
<li>tr: Nazım Can Altınova</li>
<li>zh-TW: Pin-guang Chen</li>
</ul>
<p>Find out more about the Firefox Profiler on <a href="https://profiler.firefox.com/" rel="noopener nofollow ugc">profiler.firefox.com</a>! If you have any questions, join the discussion on our <a href="https://chat.mozilla.org/#/room/%23profiler:mozilla.org" rel="noopener nofollow ugc">Matrix channel</a>!</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/firefox-profiler-deployment-july-9-2026/148882">Read full topic</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Tooling Announcements: Engineering Effectiveness Newsletter (Q2 2026 Edition)]]></title>
<description><![CDATA[Welcome to the Q2 edition of the Engineering Effectiveness Newsletter! The Engineering Effectiveness org makes it easy to develop, test and release Mozilla software at scale. See below for some highlights, then read on for more detailed info!
Highlights 


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


<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#official">Official</a></h5>
<ul>
<li><a href="https://blog.rust-lang.org/inside-rust/2026/07/07/maintainer-spotlight-gen-li-rami3l/">Maintainer spotlight: Gen Li (@rami3l)</a></li>
<li><a href="https://blog.rust-lang.org/inside-rust/2026/07/06/unite-for-clippy/">Together for a healthier Clippy</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#newsletters">Newsletters</a></h5>
<ul>
<li><a href="https://www.theembeddedrustacean.com/p/the-embedded-rustacean-issue-75">The Embedded Rustacean Issue #75</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://www.copper-robotics.com/whats-new/copper-rs-v100">copper-rs v1.0.0</a>: the open source deterministic robotics OS is now stable.</li>
<li><a href="https://rayfish.xyz/blog/01-introducing-rayfish">Rayfish: Your own private network. No servers, no setup.</a></li>
<li><a href="https://plabayo.tech/blog/rama-0-3">rama v0.3.0 — network service framework ready to be used by the wider Rust community</a></li>
<li><a href="https://github.com/kunobi-ninja/kache/releases/tag/v0.9.0">kache 0.9.0: supply-chain hardening + read-only CI cache</a></li>
<li><a href="https://www.willsearch.com.br/blog/2026/07/04/meet-guardiandbs-new-postgresql-compatibility-layer/">GuardianDB - PostgreSQL and P2P/Local-First Together</a></li>
<li><a href="https://buildnectar.com/">Nectar: a Rust-like language that compiles your whole web app to WebAssembly</a></li>
<li><a href="https://thekeeper.io/blog/logdrain-log-template-mining-in-rust/">logdrain: Fast, Embeddable Log-Template Mining in Rust</a></li>
<li><a href="https://medium.com/@vbasky/packaging-the-worlds-video-in-pure-rust-ff1f6b884fec">sheathe: Packaging the World's Video in Pure Rust</a></li>
<li><a href="https://docs.wickra.org/Quickstart-Rust">wickra: streaming-first technical indicators</a></li>
<li><a href="https://github.com/TeamXcelerator/xcelerator-solver/releases/tag/v0.1.0">Xcelerator Solver v0.1.0 -- deterministic symbolic regression</a></li>
<li><a href="https://github.com/tkmsikd/dlt-tui/releases/tag/v1.1.0">dlt-tui 1.1.0 - a fast TUI viewer for automotive DLT (AUTOSAR Diagnostic Log and Trace) files</a></li>
<li><a href="https://github.com/shihuili1218/rssh/releases/tag/v0.2.11">RSSH v0.2.11 — terminal workflows, safer SSH key import, and observable AI ops</a></li>
<li><a href="https://blog.none.at/blog/2026/2026-07-06-k8s-scale-app-rs/">k8s-scale-app-rs: Scale or Restart a Kubernetes Deployment from a CronJob</a></li>
<li><a href="https://dev.to/sicklefire/m-vis-v050-rc1-update-11cp">M-vis v0.5.0-rc1 update</a></li>
<li><a href="https://ganeshsivakumar.substack.com/p/flaredb">FlareDB: An Apache Beam Native Streaming Database built in Rust</a></li>
<li><a href="https://holovskyi.github.io/blog/typed-mqtt-topics-for-rust/">mqtt-typed-client 0.2: a type-safe async MQTT client on rumqttc</a></li>
<li><a href="https://github.com/LeChatP/RootAsRole/releases/tag/v4.0.0">RootAsRole: v4.0.0 Major release, secure execution, new logo</a></li>
<li><a href="https://www.qt.io/blog/rust-ui-framework-via-bridging-technology">A Cross-Platform Rust UI Framework via Qt’s Bridging Technology</a></li>
<li><a href="https://rapha.land/jam-programming-language/">Jam Programming Language</a></li>
<li><a href="https://www.clever.cloud/blog/company/2026/07/01/sozu-2-1-0-udp-load-balancer-programmable-edge/">Sōzu 2.1.0: UDP load balancing for the programmable edge</a></li>
<li><a href="https://op3kay.dev/writing/b0nker">b0nker: a minimal container runtime written in Rust</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5>
<ul>
<li>[video] <a href="https://www.youtube.com/watch?v=SGR5qBdwk30">Rust Berlin Meetup 25/06/2026 Livestream</a></li>
<li>[video] <a href="https://www.youtube.com/live/_LtgHxuysUo">How do you rewrite C/C++ projects to Rust? – JetBrains interview with Luca Palmieri, Mainmatter</a></li>
<li><a href="https://kerkour.com/rustcrypto-slow-simd-rust">Investigating why RustCrypto is slow: Deep dive into SIMD instructions and hardware acceleration</a></li>
<li><a href="https://parsa.wtf/cast/">bool as u32</a></li>
<li><a href="https://arxiv.org/html/2605.30106">A Rust-to-Lean Verification Pipeline with AI Provers: An Experience Report</a></li>
<li><a href="https://blog.dureuill.net/articles/wip/">Work In Progress Rust</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=Fk165jYfHpc">OpenAI just spent $600k on Rust</a></li>
<li>[audio] <a href="https://corrode.dev/podcast/s06e07-rising-academies/">Rising Academies with Dylan Brown - Rust in Production Podcast</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5>
<ul>
<li>[series] <a href="https://aibodh.com/posts/bevy-tutorial-build-your-first-3d-editor-in-rust/">Bevy Tutorial: Build Your First 3D Editor - Create a 3D Space on an Infinite Grid</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-axum-basics-and-routing-by-building-a-url-shortener/">Learn Axum Basics and Routing by Building a URL Shortener</a></li>
<li>[series] <a href="https://plabayo.tech/blog/rama-101-1-https-clients-and-abstractions">Rama 101.1: HTTPS clients and layers of abstraction</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#miscellaneous">Miscellaneous</a></h5>
<ul>
<li><a href="https://seanborg.tech/tiny-blog/rust-week-ven-diagram/">Clickable euler diagram of all the Rust week talks</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#crate-of-the-week">Crate of the Week</a></h4>
<p>This week's crate is <a href="https://crates.io/crates/apis-saltans-core">apis-saltans</a>, a Zigbee implementation including a coordinator API.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1627">Richard Neumann</a> for the self-suggestion!</p>
<p><a href="https://users.rust-lang.org/t/crate-of-the-week/2704">Please submit your suggestions and votes for next week</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#calls-for-testing">Calls for Testing</a></h4>
<p>An important step for RFC implementation is for people to experiment with the
implementation and give feedback, especially before stabilization.</p>
<p>If you are a feature implementer and would like your RFC to appear in this list, add a
<code>call-for-testing</code> label to your RFC along with a comment providing testing instructions and/or
guidance on which aspect(s) of the feature need testing.</p>
<p><em>No calls for testing were issued this week by
<a href="https://github.com/rust-lang/rust/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rust</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/rustup/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rustup</a> or
<a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing%20state%3Aopen">Rust language RFCs</a>.</em></p>
<p><a href="https://github.com/rust-lang/this-week-in-rust/issues">Let us know</a> if you would like your feature to be tracked as a part of this list.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#call-for-participation-projects-and-speakers">Call for Participation; projects and speakers</a></h4>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-projects">CFP - Projects</a></h5>
<p>Always wanted to contribute to open-source projects but did not know where to start?
Every week we highlight some tasks from the Rust community for you to pick and get started!</p>
<p>Some of these tasks may also have mentors available, visit the task page for more information.</p>

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


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



<p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4>
<p>598 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-06-30..2026-07-07">merged in the last week</a></p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/156976">enable eager <code>param_env</code> norm in new solver</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156379">lint on <code>core::ffi::c_void</code> as a return type</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158577">polish some macro parsing code</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158604">resolve: no allocation in <code>resolve_ident_in(_local)_module_*</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158627">simplify option-iterator flattening in the compiler</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157857">stabilize <code>#[my_macro] mod foo;</code> (part of <code>proc_macro_hygiene</code>)</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#library">Library</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/158537">add <code>std::io::cursor::WriteThroughCursor</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157347">implement <code>Box::as_non_null()</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156737">implement <code>DoubleEndedIterator::next_chunk_back</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/134021">implement <code>IntoIterator</code> for <code>[&amp;[mut]] Box&lt;[T; N], A&gt;</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158427">implement <code>ptr::{read,write}_unaligned</code> via <code>repr(packed)</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158539">move <code>SizeHint</code> and <code>IoHandle</code> to <code>core::io</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158540">move <code>std::io::Seek</code> to <code>core::io</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158704">optimize <code>ArrayChunks::try_rfold</code> with <code>DoubleEndedIterator::next_chunk_back</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158573">stabilize <code>feature(atomic_from_mut)</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/cargo/pull/17135"><code>bindeps</code>: register transitive artifact targets</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17167">avoid cloning parsed TOML manifest in <code>ManifestErrorContext</code></a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17176">avoid extra clone of parsed TOML manifest</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17178">remove unneeded cloning when parsing package index</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17169">change HashMaps and HashSets in Cargo to use Fxhasher</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17174">do not pass lint rustflags when <code>--cap-lints=allow</code> is set</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17164">fixed <code>Compilation::deps_output</code> only taking the last dep</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17177">pre-allocate a few vectors</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/16807">stabilize <code>build-dir</code> layout v2</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17180">use a set when checking visited workspace members</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rustdoc">Rustdoc</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/158751">fix crash when trying to inline foreign item which cannot have attributes</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158334">show use-site paths for unevaluated const array lengths</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17319"><code>chunks_exact_to_as_chunks</code>: Don't report expressions with const parameters</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17360"><code>chunks_exact_to_as_chunks</code>: Don't report expressions with type params</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17309"><code>missing_trait_methods</code>: MSRV/unstable awareness</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17289"><code>vec_init_then_push</code>: don't lint pushes from a macro expansion</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17346"><code>inline_modules</code>: ignore <code>cfg(test)</code> modules in test builds</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17345"><code>match_same_arms</code>: keep arm-level expectations working under an outer allow</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17341"><code>unnecessary_operation</code>: avoid bad <code>!</code> suggestions</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17351"><code>unnecessary_unwrap_unchecked</code>: don't trigger inside the <code>_unchecked</code> fn</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17348">add required parentheses when the <code>needless_bool</code> suggestion is an operand</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17353">fix ICE when resolving local in <code>unnecessary_unwrap_unchecked</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17311">fix <code>infinite_loop</code> false positive inside gen blocks</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17358">fix <code>manual_c_str_literals</code> suggestion when the trailing backslash is escaped</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17337">fix <code>strlen_on_c_strings</code> incorrect suggestion logic</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17323">fix <code>suspicious_operation_groupings</code> duplications</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16902">lint bit width</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17338">optimize <code>Msrv::meets</code> calls</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17273">bail out of unicode lint scans when the snippet is pure ASCII</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17224">skip the HIR parent walk in <code>is_in_test_function</code> when there are no test items</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17366">place generated impl block after the existing impl block</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17333">refactor <code>StringAdd</code> lint pass</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17334">refactor <code>suspicious_xor_used_as_pow</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17293">remove <code>lower_ty</code> in <code>uninhabited_reference</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17328">respect the configured MSRV in <code>manual_is_variant_and</code>'s <code>map() == Some(_)</code> rewrite</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17332">rewrite <code>mut_mut</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17329">rewrite <code>redundant_else</code> as a late pass</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17354">rewrite <code>tuple_array_conversions</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-analyzer">Rust-Analyzer</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22595">SCIP: exclude leading/trailing trivia in definition ranges</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22708">SCIP: remove dead <code>inlay_hints</code> field</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22433"><code>feat(ide-diagnostics)</code>: add diagnostics for invalid union patterns (E0784)</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22704"><code>internal(query-group-macro)</code>: remove the arity test</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22668">add tree top method to Syntax node</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22665">add handler for E0627</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22231">supports multi arms for <code>replace_match_with_if_let</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22690">fix UB in <code>smol_str borsh_non_utf8</code> test cases</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/20362">fix generic param for <code>generate_default_from_enum_variant</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22703"><code>walkthrough_create_project</code> file not packaged</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22677">assertion failure on closure with unbound function</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22613">avoid panic in <code>convert_tuple_struct_to_named_struct</code> on nested pattern usage</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22649">configuration syntax for nvim-lsp</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22706">correct resolution to value when it shares the same name with type</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22619">exclude impls on the error type from impl enumeration</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22705">fix crash on <code>extract_variable</code> when selecting unresolved macro call</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22715">fix crash on completion inside macros</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22673">fix handling of params of coroutine fns</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22675">handle more cases of cfgs in expr store lowering</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22488">no generate with default assoc item</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22674">panics in <code>unwrap_return_type</code>, <code>remove_underscore</code>, and <code>promote_local_to_const</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22711">hoist attribute qualifier segment collection</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22709">reduce parser joint-token allocation</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22676">project-model: don't pass metadata extra args to sysroot</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22679">project-model: introduce cargo.configPath</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22581">provide startup time to ready log point and associated benchmark</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5>
<p>This week was dominated by wild swings in benchmarks of the new-solver, which is not enabled by default, yet.
Apart from that, we got a very few notable changes, only one unexpected speedup from a bugfix in rustdoc.</p>
<p>Triage done by <strong>@panstromek</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=7dc2c162b9c197aaa76a6f9e7534569537830a01&amp;end=3659db0d3e2cd634c766fcda79ed118eca31a9fd&amp;absolute=false&amp;stat=instructions%3Au">7dc2c162..3659db0d</a></p>
<p><strong>Summary</strong>:</p>
<table>
<thead>
<tr>
<th>(instructions:u)</th>
<th>mean</th>
<th>range</th>
<th>count</th>
</tr>
</thead>
<tbody>
<tr>
<td>Regressions ❌ <br> (primary)</td>
<td>0.2%</td>
<td>[0.2%, 0.2%]</td>
<td>3</td>
</tr>
<tr>
<td>Regressions ❌ <br> (secondary)</td>
<td>162.1%</td>
<td>[0.2%, 1116.3%]</td>
<td>20</td>
</tr>
<tr>
<td>Improvements ✅ <br> (primary)</td>
<td>-1.4%</td>
<td>[-8.4%, -0.1%]</td>
<td>7</td>
</tr>
<tr>
<td>Improvements ✅ <br> (secondary)</td>
<td>-1.1%</td>
<td>[-8.4%, -0.1%]</td>
<td>11</td>
</tr>
<tr>
<td>All ❌✅ (primary)</td>
<td>-0.9%</td>
<td>[-8.4%, 0.2%]</td>
<td>10</td>
</tr>
</tbody>
</table>
<p>1 Regression, 1 Improvement, 4 Mixed; 3 of them in rollups
17 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/9f1bc6e374b5ae202366df1cbef850b79be8c641/triage/2026/2026-07-06.md">Full report here</a></p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#approved-rfcs"></a><a href="https://github.com/rust-lang/rfcs/commits/master">Approved RFCs</a></h5>
<p>Changes to Rust follow the Rust <a href="https://github.com/rust-lang/rfcs#rust-rfcs">RFC (request for comments) process</a>. These
are the RFCs that were approved for implementation this week:</p>
<ul>
<li><em>No RFCs were approved this week.</em></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#final-comment-period">Final Comment Period</a></h5>
<p>Every week, <a href="https://www.rust-lang.org/team.html">the team</a> announces the 'final comment period' for RFCs and key PRs
which are reaching a decision. Express your opinions now.</p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust"></a><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Rust</a>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/158522">Lint against invalid POSIX symbol definitions</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158325">Document NonNull layout guarantees</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/112811">Tracking Issue for <code>slice_split_once</code></a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler-team-mcps-only"></a><a href="https://github.com/rust-lang/compiler-team/issues?q=label%3Amajor-change%20label%3Afinal-comment-period%20state%3Aopen">Compiler Team</a> <a href="https://forge.rust-lang.org/compiler/mcp.html">(MCPs only)</a>
<ul>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1011">Let the OS handle stack growth</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1010">Add <code>target_feature_available_at_call_site</code></a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#language-reference"></a><a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a>
<ul>
<li><a href="https://github.com/rust-lang/reference/pull/2293">Empty repr(Rust) enums are ZSTs</a></li>
</ul>
<p><em>No Items entered Final Comment Period this week for
<a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Team</a>,
<a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a>,
<a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</a> or
<a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Unsafe Code Guidelines</a>.</em></p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"></a><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h5>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3982">Update RFC template</a></li>
<li><a href="https://github.com/rust-lang/rfcs/pull/3981">RFC: Store registry tokens in the OS credential store by default</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4>
<p>Rusty Events between 2026-07-08 - 2026-08-05 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-07-08 | Virtual (Cardiff, GB) | <a href="https://www.meetup.com/rust-and-c-plus-plus-in-cardiff/events/">Rust and C++ Cardiff</a></li>
<li><a href="https://www.meetup.com/rust-and-c-plus-plus-in-cardiff/events/315506435/"><strong>Operating Systems Book Club: Introduction + Processes</strong></a></li>
<li>2026-07-08 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a></li>
<li><a href="https://luma.com/jv9lom12"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
<li>2026-07-09 | Virtual (Nürnberg, DE) | <a href="https://www.meetup.com/rust-noris/events/">Rust Nuremberg</a></li>
<li><a href="https://www.meetup.com/rust-noris/events/315517604/"><strong>Rust Nürnberg online</strong></a></li>
<li>2026-07-14 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a></li>
<li><a href="https://www.meetup.com/dallasrust/events/310254778/"><strong>Second Tuesday</strong></a></li>
<li>2026-07-15 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a></li>
<li><a href="https://luma.com/21k797xr"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
<li>2026-07-15 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a></li>
<li><a href="https://www.meetup.com/vancouver-rust/events/314233743/"><strong>Jiff</strong></a></li>
<li>2026-07-16 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a></li>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
<li>2026-07-16 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a></li>
<li><a href="https://www.meetup.com/rust-berlin/events/312045926/"><strong>Rust Hack and Learn</strong></a></li>
<li>2026-07-19 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a></li>
<li><a href="https://www.meetup.com/dallasrust/events/314329045/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
<li>2026-07-21 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a></li>
<li><a href="https://www.meetup.com/women-in-rust/events/315102297/"><strong>Lunch &amp; Learn: Learning Rust as First Programming Language</strong></a></li>
<li>2026-07-21 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a></li>
<li><a href="https://www.meetup.com/rustdc/events/315279653/"><strong>Mid-month Rustful</strong></a></li>
<li>2026-07-22 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a></li>
<li><a href="https://luma.com/hd8mlw56"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
<li>2026-07-28 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a></li>
<li><a href="https://www.meetup.com/dallasrust/events/310254777/"><strong>Fourth Tuesday</strong></a></li>
<li>2026-07-29 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a></li>
<li><a href="https://luma.com/uo5ek1f4"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
<li>2026-07-30 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin/events/">Rust Berlin</a></li>
<li><a href="https://www.meetup.com/rust-berlin/events/312045928/"><strong>Rust Hack and Learn</strong></a></li>
<li>2026-08-02 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust/events/">Dallas Rust User Meetup</a></li>
<li><a href="https://www.meetup.com/dallasrust/events/314095294/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
<li>2026-08-04 | Virtual (London, GB) | <a href="https://www.meetup.com/women-in-rust/events/">Women in Rust</a></li>
<li><a href="https://www.meetup.com/women-in-rust/events/315213885/"><strong>👋 Community Catch Up</strong></a></li>
<li>2026-07-29 | Virtual (Girona, ES) | <a href="https://luma.com/rust-girona">Rust Girona</a></li>
<li><a href="https://luma.com/ii2jrwva"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
<li>2026-08-05 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs/events/">Indy Rust</a></li>
<li><a href="https://www.meetup.com/indyrs/events/315210367/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#asia">Asia</a></h5>
<ul>
<li>2026-07-18 | Bangalore, IN | <a href="https://hasgeek.com/rustbangalore">Rust Bangalore</a></li>
<li><a href="https://hasgeek.com/rustbangalore/july-2026-rustacean-meetup/"><strong>July 2026 Rustacean Meetup</strong></a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#africa">Africa:</a></h5>
<ul>
<li>2026-07-14 | Johannesburg, ZA | <a href="https://www.meetup.com/johannesburg-rust-meetup/events/">Johannesburg Rust Meetup</a></li>
<li><a href="https://www.meetup.com/johannesburg-rust-meetup/events/315573758/"><strong>Debugging a production grade Open Source Rust crate</strong></a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#europe">Europe</a></h5>
<ul>
<li>2026-07-08 | Dublin, IE | <a href="https://www.meetup.com/rust-dublin">Rust Dublin</a></li>
<li><a href="https://www.meetup.com/rust-dublin/events/315150327/"><strong>Join us live and INPERSON for Rust 262</strong></a></li>
<li>2026-07-09 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin/events/">Rust Berlin</a></li>
<li><a href="https://www.meetup.com/rust-berlin/events/315585121/"><strong>Rust Berlin on location 🏳️‍🌈 - Edition 015</strong></a></li>
<li>2026-07-09 | Frankfurt, DE | <a href="https://www.meetup.com/rust-rhein-main/events/">Rust Rhein-Main</a></li>
<li><a href="https://www.meetup.com/rust-rhein-main/events/315366165/"><strong>Building Cross Platform Applications with Ply</strong></a></li>
<li>2026-07-09 | Switzerland, CH | <a href="https://www.posttenebraslab.ch/wiki/events/start">PostTenebrasLab</a></li>
<li><a href="https://www.posttenebraslab.ch/wiki/events/monthly_meeting/rust_meetup"><strong>Rust Meetup Geneva</strong></a></li>
<li>2026-07-15 | Dortmund, DE | <a href="https://www.meetup.com/rust-dortmund/events/">Rust Dortmund</a></li>
<li><a href="https://www.meetup.com/rust-dortmund/events/315496876/"><strong>Teach and Hack at Projektspeicher</strong></a></li>
<li>2026-07-21 | Leipzig, DE | <a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig">Rust - Modern Systems Programming in Leipzig</a></li>
<li><a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/events/313816470/"><strong>Supercharge Rust funcs with implicit arguments and context-generic programming</strong></a></li>
<li>2026-07-23 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a></li>
<li><a href="https://www.meetup.com/rust-berlin/events/315484101/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
<li>2026-07-23 | London, UK | <a href="https://www.meetup.com/london-rust-project-group">London Rust Project Group</a></li>
<li><a href="https://www.meetup.com/london-rust-project-group/events/315366453/"><strong>Rama modular service framework for Rust</strong></a></li>
<li>2026-07-23 | Paris, FR | <a href="https://www.meetup.com/rust-paris">Rust Paris</a></li>
<li><a href="https://www.meetup.com/rust-paris/events/315309633/"><strong>Rust meetup #87</strong></a></li>
<li>2026-07-30 | Manchester, GB | <a href="https://www.meetup.com/rust-manchester/events/">Rust Manchester</a></li>
<li><a href="https://www.meetup.com/rust-manchester/events/315037685/"><strong>Rust Manchester July Code Night</strong></a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<li>2026-07-09 | Lehi, UT, US | <a href="https://www.meetup.com/utah-rust">Utah Rust</a></li>
<li><a href="https://www.meetup.com/utah-rust/events/314696647/"><strong>Utah Rust July Meetup</strong></a></li>
<li>2026-07-09 | Mountain View, CA, US | <a href="https://www.meetup.com/hackerdojo/events/">Hacker Dojo</a></li>
<li><a href="https://www.meetup.com/hackerdojo/events/315338107/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
<li>2026-07-11 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a></li>
<li><a href="https://www.meetup.com/bostonrust/events/315225865/"><strong>MIT Rust Lunch, July 11</strong></a></li>
<li>2026-07-15 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a></li>
<li><a href="https://www.meetup.com/vancouver-rust/events/314233743/"><strong>Jiff</strong></a></li>
<li>2026-07-16 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a></li>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
<li>2026-07-18 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a></li>
<li><a href="https://www.meetup.com/bostonrust/events/315225872/"><strong>North End Rust Lunch, July 18</strong></a></li>
<li>2026-07-21 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group">San Francisco Rust Study Group</a></li>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/314997214/"><strong>Rust Hacking in Person</strong></a></li>
<li>2026-07-22 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx">Rust ATX</a></li>
<li><a href="https://www.meetup.com/rust-atx/events/xvkdgtyjckbdc/"><strong>Rust Lunch - Fareground</strong></a></li>
<li>2026-07-22 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a></li>
<li><a href="https://www.meetup.com/rust-los-angeles/events/315376271/"><strong>Rust LA: Rust in Distributed Systems with Flight Science!</strong></a></li>
<li>2026-07-25 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust/events/">Boston Rust Meetup</a></li>
<li><a href="https://www.meetup.com/bostonrust/events/315582650/"><strong>Porter Square Rust Lunch, July 25</strong></a></li>
<li>2026-07-25 | Brooklyn, NY, US | <a href="https://flowercomputer.com/">Flower</a></li>
<li><a href="https://partiful.com/e/Vq9fyDNCMSO7ia4ulK5b"><strong>BOG-A-THON 2</strong></a></li>
<li>2026-07-30 | Atlanta, GA, US | <a href="https://www.meetup.com/rust-atl/events/">Rust Atlanta</a></li>
<li><a href="https://www.meetup.com/rust-atl/events/313539329/"><strong>Rust-Atl</strong></a></li>
<li>2026-08-01 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust/events/">Boston Rust Meetup</a></li>
<li><a href="https://www.meetup.com/bostonrust/events/315582653/"><strong>Chinatown Rust Lunch, Aug 1</strong></a></li>
<li>2026-08-04 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust/events/">Boston Rust Meetup</a></li>
<li><a href="https://www.meetup.com/bostonrust/events/314660176/"><strong>Evening Boston Rust Meetup at Red Hat, Aug 4</strong></a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5>
<ul>
<li>2026-07-09 | Brisbane City, QL, AU | <a href="https://www.meetup.com/rust-brisbane/events/">Rust Brisbane</a></li>
<li><a href="https://www.meetup.com/rust-brisbane/events/315563251/"><strong>Rust Brisbane • July 2026</strong></a></li>
<li>2026-07-21 | Barton, AU | <a href="https://www.meetup.com/rust-canberra">Canberra Rust User Group</a></li>
<li><a href="https://www.meetup.com/rust-canberra/events/315307280/"><strong>July Meetup</strong></a></li>
<li>2026-07-23 | Perth, AU | <a href="https://www.meetup.com/perth-rust-meetup-group">Rust Perth Meetup Group</a></li>
<li><a href="https://www.meetup.com/perth-rust-meetup-group/events/315451138/"><strong>Rust Perth: July Meetup!</strong></a></li>
<li>2026-07-30 | Melbourne, AU | <a href="https://www.meetup.com/rust-melbourne/events/">Rust Melbourne</a></li>
<li><a href="https://www.meetup.com/rust-melbourne/events/315039480/"><strong>Rust Melbourne July 2026</strong></a></li>
</ul>
<p>If you are running a Rust event please add it to the <a href="https://www.google.com/calendar/embed?src=apd9vmbc22egenmtu5l6c5jbfc%40group.calendar.google.com">calendar</a> to get
it mentioned here. Please remember to add a link to the event too.
Email the <a href="mailto:community-team@rust-lang.org">Rust Community Team</a> for access.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#jobs">Jobs</a></h4>
<p>Please see the latest <a href="https://www.reddit.com/r/rust/comments/1ttbtf5/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p>
<h3><a class="toclink" href="https://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3>
<blockquote>
<p>if a ptr is dereferenced in a forest and nobody hears it, is it sound?</p>
</blockquote>
<p>– <a href="https://users.rust-lang.org/t/does-the-indirection-of-a-pointer-immediately-create-a-reference/141071/10">Kornel on rust-users</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1785">Cerber-Ursi</a> for the suggestion!</p>
<p><a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328">Please submit quotes and vote for next week!</a></p>
<p>This Week in Rust is edited by:</p>
<ul>
<li><a href="https://github.com/nellshamrell">nellshamrell</a></li>
<li><a href="https://github.com/llogiq">llogiq</a></li>
<li><a href="https://github.com/ericseppanen">ericseppanen</a></li>
<li><a href="https://github.com/extrawurst">extrawurst</a></li>
<li><a href="https://github.com/U007D">U007D</a></li>
<li><a href="https://github.com/mariannegoldin">mariannegoldin</a></li>
<li><a href="https://github.com/bdillo">bdillo</a></li>
<li><a href="https://github.com/opeolluwa">opeolluwa</a></li>
<li><a href="https://github.com/bnchi">bnchi</a></li>
<li><a href="https://github.com/KannanPalani57">KannanPalani57</a></li>
<li><a href="https://github.com/tzilist">tzilist</a></li>
</ul>
<p><em>Email list hosting is sponsored by <a href="https://foundation.rust-lang.org/">The Rust Foundation</a></em></p>
<p><small><a href="https://www.reddit.com/r/rust/comments/1ureq0r/this_week_in_rust_659/">Discuss on r/rust</a></small></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.12]]></title>
<description><![CDATA[chore: bump version to 16.3.12]]></description>
<link>https://tsecurity.de/weiterlesen/3626954/3655094/v16312/</link>
<pubDate>Wed, 08 Jul 2026 19:53:58 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.12</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v1.74.4]]></title>
<description><![CDATA[Version v1.74.4]]></description>
<link>https://tsecurity.de/weiterlesen/3626850/3654990/v1744/</link>
<pubDate>Wed, 08 Jul 2026 19:24:37 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Version v1.74.4</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The zero-days are numbered ]]></title>
<description><![CDATA[Since February, the Firefox team has been working around the clock using frontier AI models to find and fix latent security vulnerabilities in the browser. We wrote previously about our collaboration with Anthropic to scan Firefox with Opus 4.6, which led to fixes for 22 security-sensitive bugs i...]]></description>
<link>https://tsecurity.de/weiterlesen/3626250/3654389/the-zero-days-are-numbered/</link>
<pubDate>Wed, 08 Jul 2026 15:10:33 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Since February, the Firefox team has been working around the clock using frontier AI models to find and fix latent security vulnerabilities in the browser. We wrote previously about our collaboration with Anthropic to scan Firefox with Opus 4.6, which led to fixes for 22 security-sensitive bugs in Firefox 148. As part of our continued […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/privacy-security/ai-security-zero-day-vulnerabilities/">The zero-days are numbered </a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Keeping the web open and private in the bot era]]></title>
<description><![CDATA[If you’ve been running into endless CAPTCHAS or website login requests lately, you’re not imagining things.  Websites, facing a rising tide of abusive traffic from bots, are adopting increasingly aggressive countermeasures, damaging user’s experience of the web, their privacy and open access to t...]]></description>
<link>https://tsecurity.de/weiterlesen/3626249/3654388/keeping-the-web-open-and-private-in-the-bot-era/</link>
<pubDate>Wed, 08 Jul 2026 15:10:31 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>If you’ve been running into endless CAPTCHAS or website login requests lately, you’re not imagining things.  Websites, facing a rising tide of abusive traffic from bots, are adopting increasingly aggressive countermeasures, damaging user’s experience of the web, their privacy and open access to the web.    In this post, we’ll talk about a new initiative we’re […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/privacy-security/keeping-the-web-open-and-private-in-the-bot-era/">Keeping the web open and private in the bot era</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Wrexham AFC and Firefox announce a multi-year, front-of-kit partnership]]></title>
<description><![CDATA[We don’t put our name on much. So when we do, it means something. Starting with the 2026/27 season, Firefox is Wrexham AFC’s Official Web Browser Partner and front-of-kit sponsor on the men’s and women’s teams.  More than 160 years old and nearly lost for good, the football club was saved by the ...]]></description>
<link>https://tsecurity.de/weiterlesen/3626248/3654387/wrexham-afc-and-firefox-announce-a-multi-year-front-of-kit-partnership/</link>
<pubDate>Wed, 08 Jul 2026 15:10:29 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>We don’t put our name on much. So when we do, it means something. Starting with the 2026/27 season, Firefox is Wrexham AFC’s Official Web Browser Partner and front-of-kit sponsor on the men’s and women’s teams.  More than 160 years old and nearly lost for good, the football club was saved by the community that […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/wrexham-afc-firefox-partnership/">Wrexham AFC and Firefox announce a multi-year, front-of-kit partnership</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Desktop settings research: what we learned from your feedback]]></title>
<description><![CDATA[A few weeks ago, we conducted hour-long conversations with 10 of our users to dig deep into how you manage your preferences and configurations in Thunderbird desktop. While this specific research cycle focused on the desktop experience, our ultimate goal is a holistic strategy that ensures our mo...]]></description>
<link>https://tsecurity.de/weiterlesen/3624421/3652560/desktop-settings-research-what-we-learned-from-your-feedback/</link>
<pubDate>Tue, 07 Jul 2026 20:57:39 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>A few weeks ago, we conducted hour-long conversations with 10 of our users to dig deep into how you manage your preferences and configurations in Thunderbird desktop. While this specific research cycle focused on the desktop experience, our ultimate goal is a holistic strategy that ensures our mobile settings feel like a natural extension of […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/07/desktopsettings/">Desktop settings research: what we learned from your feedback</a> appeared first on <a href="https://blog.thunderbird.net/">The Thunderbird Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Mozilla Localization (L10N): Giving Pontoon’s Editor Its Own Theme]]></title>
<description><![CDATA[Each year, Mozilla welcomes interns who work alongside our engineering teams on projects that ship to production and improve the experience for contributors around the world. This year, Ayush joined the Firefox Localization team to work on Pontoon, Mozilla’s open source localization platform, whe...]]></description>
<link>https://tsecurity.de/weiterlesen/3621316/3649455/mozilla-localization-l10n-giving-pontoons-editor-its-own-theme/</link>
<pubDate>Mon, 06 Jul 2026 19:06:41 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<blockquote>
<p class="PDq2pG_selectionAnchorContainer">Each year, Mozilla welcomes interns who work alongside our engineering teams on projects that ship to production and improve the experience for contributors around the world. This year, Ayush joined the Firefox Localization team to work on Pontoon, Mozilla’s open source localization platform, where he already tackled several user-facing improvements while learning how large-scale open source software is built.</p>
<p>In this post, Ayush shares the story behind one of his first projects: giving Pontoon’s translation editor its own appearance settings. From understanding long-standing design decisions to balancing accessibility with user expectations, he walks through both the technical implementation and the product thinking that shaped the feature.</p>
<p class="isSelectedEnd">You can follow Ayush’s work on <a href="https://github.com/ayshushus">GitHub</a> and connect with him on <a href="https://www.linkedin.com/in/ayshushus">LinkedIn</a>.</p>
</blockquote>
<h3>Introduction</h3>
<p>Studying <a href="https://future.utoronto.ca/program/computer-engineering">Computer Engineering</a> with a <a href="https://discover.engineering.utoronto.ca/experiential-learning/professional-experience-year-pey/">Professional Experience Year (PEY)</a> at the <a href="https://www.engineering.utoronto.ca/">University of Toronto’s Faculty of Applied Science</a> gave me a variety of opportunities and companies to choose spending a year interning at. I chose Software Engineering at <a href="https://www.mozilla.org/">Mozilla</a> because it’s an open source company that puts people first, which matters to me a lot and allows me to equip my portfolio using snippets and examples from real code used in production.</p>
<p>I joined <a href="https://language.mozilla.org/">Mozilla’s Firefox Localization (l10n) team</a> as part of <a href="https://www.mozilla.org/foundation/moco/">Mozilla Corporation</a>’s Firefox Desktop Engineering Team, based in Downtown Toronto. I officially began my internship on Friday, May 1, 2026, but I unofficially began in mid February. Since my team’s flagship product’s (<a href="https://pontoon.mozilla.org/">Pontoon</a>) codebase is entirely open source, I talked to both my <a href="https://github.com/flodolo">manager</a> and <a href="https://github.com/mathjazz">Pontoon owner</a> right after signing my offer and got early access to our weekly meetings and some confidential data. I then started to learn as much as I possibly could.</p>
<p><a href="https://blog.mozilla.org/l10n/files/2026/07/image7.png"><img alt="" class="alignnone size-full wp-image-1889" height="856" src="https://blog.mozilla.org/l10n/files/2026/07/image7.png" width="1662"></a></p>
<p>Even before I started learning the <a href="https://github.com/mozilla/pontoon">codebase</a>, just looking at the Pontoon’s default translation UI was rather interesting because of our editor pane’s glaring white color in dark mode/theme.</p>
<p><a href="https://blog.mozilla.org/l10n/files/2026/07/image3.png"><img alt="" class="alignnone size-full wp-image-1890" height="950" src="https://blog.mozilla.org/l10n/files/2026/07/image3.png" width="1664"></a></p>
<p>Even though I saw the <a href="https://github.com/mozilla/pontoon/issues/4001">issue (#4001)</a> filed for working on that, I thought that the stark contrast was a stylistic choice because an average user would spend most of their time on said pane editing strings anyway, so I just went on with it.</p>
<p><a href="https://blog.mozilla.org/l10n/files/2026/07/image11.png"><img alt="" class="alignnone size-full wp-image-1891" height="794" src="https://blog.mozilla.org/l10n/files/2026/07/image11.png" width="1664"></a></p>
<p>However, once I officially started to work, I got my onboarding document and saw my starting set of issues. That’s where I came across the very same <a href="https://github.com/mozilla/pontoon/issues/4001">issue (#4001)</a> on my todo batch, which made me very happy since I could address it and I’d already looked at the surrounding context before working with it.</p>
<h3>The Original Experience</h3>
<p>At first, the user could only change Pontoon’s appearance from their `profile menu` or <a href="https://pontoon.mozilla.org/settings/">Pontoon’s `/settings` page</a>. This is where they have the ability to change their appearance to `dark mode`, `light mode`, or keep the `system theme` that matches their device’s preferences.</p>
<div class="wp-caption alignnone"><a href="https://blog.mozilla.org/l10n/files/2026/07/image10.png"><img alt="" class="wp-image-1892 size-full" height="362" src="https://blog.mozilla.org/l10n/files/2026/07/image10.png" width="1308"></a><p class="wp-caption-text">This is the view from Pontoon’s Settings page.</p></div>
<div class="wp-caption alignnone"><a href="https://blog.mozilla.org/l10n/files/2026/07/image2.png"><img alt="" class="wp-image-1893 size-full" height="1046" src="https://blog.mozilla.org/l10n/files/2026/07/image2.png" width="1154"></a><p class="wp-caption-text">This is the view from Pontoon’s Profile menu.</p></div>
<div class="wp-caption alignnone"><a href="https://blog.mozilla.org/l10n/files/2026/07/image1.png"><img alt="" class="wp-image-1894 size-full" height="1126" src="https://blog.mozilla.org/l10n/files/2026/07/image1.png" width="1999"></a><p class="wp-caption-text">Ironically, the dark appearance warrants a light themed `editor pane`.</p></div>
<div class="wp-caption alignnone"><a href="https://blog.mozilla.org/l10n/files/2026/07/image9.png"><img alt="" class="size-full wp-image-1895" height="628" src="https://blog.mozilla.org/l10n/files/2026/07/image9.png" width="1782"></a><p class="wp-caption-text">There is also no option to change the `editor pane` appearance from the `editor menu`.</p></div>
<h3>Design Considerations</h3>
<p>In general, when a product has a large, established user base that has grown accustomed to a particular interface, it’s important to approach visual changes with care. Even if a redesign is arguably more visually appealing and offers clear accessibility benefits, changing familiar workflows and appearance can still disrupt the user experience.</p>
<p>In fact, according to <a href="https://research.mozilla.org/">this Mozilla Research</a> article I read, which explored <a href="https://research.mozilla.org/browser-competition/remedyconcepts/">browser choice design interventions</a>, “It is important that the organizations tasked with designing and regulating current and future interventions (including browser choice screens) are mindful of the design principles we have articulated with this research.”</p>
<p>Even though the relevance of said <a href="https://research.mozilla.org/browser-competition/remedyconcepts/">research</a> is for the browser use-case, the impacts are for a user interface design like in this blog, as the article also mentions “The inertia is a strong force to overcome”, and Pontoon’s inertia dates back over a decade.</p>
<p>This meant that if we were to change the editor pane color, we would have to allow the user to have things as they currently are.</p>
<h3>The New Experience</h3>
<p>In the update Appearance section of the <a href="https://pontoon.mozilla.org/settings/">Settings page</a>, users have the ability to change the main interface as before, but now have the ability to update editor to `dark mode`, `light mode`, or match their `main interface theme` to automatically sync the colors.</p>
<p>The editor theme remains light by default, regardless of the main interface theme.</p>
<div class="wp-caption alignnone"><a href="https://blog.mozilla.org/l10n/files/2026/07/image5.png"><img alt="" class="size-full wp-image-1896" height="652" src="https://blog.mozilla.org/l10n/files/2026/07/image5.png" width="1590"></a><p class="wp-caption-text">This is the view from Pontoon’s Settings page.</p></div>
<div class="wp-caption alignnone"><a href="https://blog.mozilla.org/l10n/files/2026/07/image8.png"><img alt="" class="size-full wp-image-1897" height="896" src="https://blog.mozilla.org/l10n/files/2026/07/image8.png" width="1712"></a><p class="wp-caption-text">Editor appearance can also be quickly changed from the editor menu.</p></div>
<div class="wp-caption alignnone"><a href="https://blog.mozilla.org/l10n/files/2026/07/image6.png"><img alt="" class="size-full wp-image-1898" height="890" src="https://blog.mozilla.org/l10n/files/2026/07/image6.png" width="1694"></a><p class="wp-caption-text">This UI now matches the dark theme, either by explicitly selecting it or matching the main interface theme.</p></div>
<div class="wp-caption alignnone"><a href="https://blog.mozilla.org/l10n/files/2026/07/image4.png"><img alt="" class="size-full wp-image-1899" height="914" src="https://blog.mozilla.org/l10n/files/2026/07/image4.png" width="1698"></a><p class="wp-caption-text">Since the issue was with `dark interface mode` having a `light editor`, setting the default `editor` to `light` neatly agreed with how the UI looked before the changes were brought in.</p></div>
<h3>Looking Ahead</h3>
<p>These changes neatly allow the user to modify their theme keeping their general preferences in mind. The change is also remembered by Pontoon and stays consistent at every instance the user logs back in.</p>
<p>Furthermore, we now track if the user has interacted with the `editor theme` which gives us knowledge on if we want to eventually change the default editor theme, addressing the concerns of `UI inertia` brought up in <a href="https://research.mozilla.org/browser-competition/remedyconcepts/">Mozilla’s research</a>.</p>
<p>For more information and technical details, please visit: <a href="https://www.ayshush.us/mozilla/issue-notes/4001">https://www.ayshush.us/mozilla/issue-notes/4001</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.11]]></title>
<description><![CDATA[chore: bump version to 16.3.11]]></description>
<link>https://tsecurity.de/weiterlesen/3621137/3649276/v16311/</link>
<pubDate>Mon, 06 Jul 2026 17:57:21 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.11</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.10]]></title>
<description><![CDATA[chore: bump version to 16.3.10]]></description>
<link>https://tsecurity.de/weiterlesen/3619784/3647923/v16310/</link>
<pubDate>Mon, 06 Jul 2026 08:23:07 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.10</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[About:Community: A new Firefox look, hidden features, and more]]></title>
<description><![CDATA[Hi Mozillians, welcome to another Mozilla community roundup!
This month, we’re taking a look at what’s next for Firefox. From an upcoming visual refresh and a peek behind the new design system to hidden features you may never have used before. We’re also highlighting a recent Reddit AMA on the ne...]]></description>
<link>https://tsecurity.de/weiterlesen/3619633/3647772/aboutcommunity-a-new-firefox-look-hidden-features-and-more/</link>
<pubDate>Mon, 06 Jul 2026 07:06:19 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Hi Mozillians, welcome to another Mozilla community roundup!</p>
<p>This month, we’re taking a look at what’s next for Firefox. From an upcoming visual refresh and a peek behind the new design system to hidden features you may never have used before. We’re also highlighting a recent Reddit AMA on the new Firefox product Roadmap and celebrating community contribution that’s making collaboration in Pontoon even better.</p>
<p>Let’s dive in!</p>
<p><strong>✨ Firefox gets a fresh new look. Soon!</strong></p>
<p><a href="https://blog.mozilla.org/community/files/2026/07/nova.png"><img alt="" class="alignnone size-full wp-image-2545" height="1427" src="https://blog.mozilla.org/community/files/2026/07/nova.png" width="2485"></a></p>
<p>Firefox is evolving with a refreshed design that makes the browser feel more modern, approachable, and consistent across desktop and mobile. The refresh also extends to Firefox’s voice and writing style, making product experience feel more human, direct, and unmistakably Firefox. If you’re excited about these changes, make sure to keep an eye out for an upcoming foxfooding opportunity later this month!</p>
<p><a href="https://connect.mozilla.org/t5/discussions/sharing-more-about-project-nova/td-p/125996/">Learn more</a></p>
<p><strong> Firefox can do all this?</strong></p>
<p>Sreenath from <em>It’s FOSS</em> rounded up 21 Firefox features that many users never discover. From the built-in Eyedropper tool and Picture-in-Picture to vertical tabs and other productivity features, there’s plenty to explore. See how many you’ve already used! We could even turn it into a fun bingo at our next community event.</p>
<p><a href="https://itsfoss.com/firefox-additional-features/">Read more</a></p>
<p><strong> From the Reddit Community</strong></p>
<p><a href="https://blog.mozilla.org/community/files/2026/07/Firefox_Distilled_Roadmap-1000x563-1.webp"><img alt="Fx roadmap" class="alignnone size-full wp-image-2544" height="563" src="https://blog.mozilla.org/community/files/2026/07/Firefox_Distilled_Roadmap-1000x563-1.webp" width="1000"></a></p>
<p>Firefox leaders recently joined<a href="https://www.reddit.com/r/firefox/"> r/firefox</a> for a live AMA to answer questions about the newly launched Firefox Product Roadmap. Community members asked about everything from Android improvements and Containers to Project Nova, PWAs, performance, and future browser development. The conversation generated a wide range of discussions and provided valuable insight into what Firefox users are most excited, and concerned, about.</p>
<p><a href="https://www.reddit.com/r/firefox/comments/1u7cyh7/introducing_the_firefox_roadmap_ama_next_week/">Read the full AMA</a></p>
<p><strong> Community spotlight</strong></p>
<p>Collaboration in Pontoon just got a little easier. Thanks to volunteer contributor <strong>Serah Nderi</strong>, users can now edit and delete their own comments, while project managers can remove comments for moderation purposes. This long-requested feature helps reduce clutter, improve discussions, and makes collaboration smoother for localization teams.</p>
<p><a href="https://blog.mozilla.org/l10n/2026/04/03/enhancing-comment-management-in-pontoon/">Read more</a></p>
<hr>
<p>P.S.</p>
<p>Enjoyed these updates? Subscribe to the <a href="https://community.mozilla.org/newsletter">Mozilla Community Newsletter</a> and get the latest updates delivered straight to your inbox.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.9]]></title>
<description><![CDATA[chore: bump version to 16.3.9]]></description>
<link>https://tsecurity.de/weiterlesen/3619445/3647584/v1639/</link>
<pubDate>Mon, 06 Jul 2026 04:20:49 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.9</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.8]]></title>
<description><![CDATA[chore: bump version to 16.3.8]]></description>
<link>https://tsecurity.de/weiterlesen/3618937/3647076/v1638/</link>
<pubDate>Sun, 05 Jul 2026 19:53:18 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.8</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.7]]></title>
<description><![CDATA[chore: bump version to 16.3.7]]></description>
<link>https://tsecurity.de/weiterlesen/3618748/3646887/v1637/</link>
<pubDate>Sun, 05 Jul 2026 17:07:53 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.7</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.6]]></title>
<description><![CDATA[chore: bump version to 16.3.6]]></description>
<link>https://tsecurity.de/weiterlesen/3617179/3645318/v1636/</link>
<pubDate>Sat, 04 Jul 2026 14:07:51 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.6</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.5]]></title>
<description><![CDATA[chore: bump version to 16.3.5]]></description>
<link>https://tsecurity.de/weiterlesen/3616558/3644697/v1635/</link>
<pubDate>Sat, 04 Jul 2026 05:22:34 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.5</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Mozilla Privacy Blog: Mozilla Mornings comes to the UK: privacy-enhancing technologies and the questions they raise]]></title>
<description><![CDATA[During London Tech Week, Mozilla hosted the first UK edition of Mozilla Mornings, our breakfast-discussion series on the digital questions of the moment. We brought together technologists, policymakers, industry, civil society and researchers to ask how the UK can drive forward responsible innova...]]></description>
<link>https://tsecurity.de/weiterlesen/3615200/3643339/mozilla-privacy-blog-mozilla-mornings-comes-to-the-uk-privacy-enhancing-technologies-and-the-questions-they-raise/</link>
<pubDate>Fri, 03 Jul 2026 13:10:32 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p><i>During London Tech Week, Mozilla hosted the first UK edition of Mozilla Mornings, our breakfast-discussion series on the digital questions of the moment. We brought together technologists, policymakers, industry, civil society and researchers to ask how the UK can drive forward responsible innovation in privacy-enhancing technologies (PETs) in ways that protect people, strengthen trust and keep digital markets open. </i></p>
<h3><b>The role of PETs in building a better internet</b></h3>
<p>Protecting people’s privacy has always been central to Mozilla’s mission to build a better internet – one where privacy and security are fundamental, people have meaningful control over their data and online lives, and independent actors can compete on a level playing field. Privacy-enhancing technologies (PETs) are an important part of that vision. They help minimise the amount of personal data that needs to be collected and processed while enabling useful functionality. In Firefox, this work includes technologies such as <a href="https://support.mozilla.org/en-US/kb/ohttp-explained">Oblivious HTTP</a>, differential privacy, the Distributed Aggregation Protocol and <a href="https://support.mozilla.org/en-US/kb/firefox-dns-over-https">DNS over HTTPS</a>.</p>
<p>PETs encompass a broad family of technical, architectural and product-design approaches where data analysis, measurement, collaboration, access and computation happen with lower privacy risk.</p>
<p>Advancing both privacy and competition together is key to a healthier internet ecosystem. Advertising illustrates both the challenge and the opportunity. It keeps most of the web free and accessible, but today’s dominant model leans on hidden data collection and opaque systems that work around people rather than with them. Solutions that simply hand more data, more infrastructure or more decision-making power to a handful of large companies do not fix that.</p>
<p>Importantly, PETs should not be viewed as a way to bypass privacy rules. Their value lies in reducing the amount of personal data that needs to be collected, shared or processed in the first place, while preserving useful functionality where appropriate. That is why we have been <a href="https://blog.mozilla.org/en/advertising/principles/improving-online-advertising/">investing in and building around privacy-preserving advertising</a>, recognising that PETs are not a silver bullet but an important part of a better model.</p>
<p>Responsible deployment of PETs depends not only on the technical design, but also on the governance, assurance, and market context around it. PETs should be grounded in open standards and interoperable architectures. Otherwise, they risk reinforcing walled gardens, limiting choice or creating new dependencies rather than supporting a more open and competitive ecosystem.</p>
<h3><b>The discussion</b></h3>
<p>The event opened with remarks from the Information Commissioner’s Office (ICO). This included the ICO’s work on PETs, online tracking, privacy-preserving attribution and the questions raised under Regulation 6 of the Privacy and Electronic Communications Regulations (PECR). Shortly before the event, the ICO had published <a href="https://ico.org.uk/media2/yefdqvk4/20260505-report-for-dsit-on-changes-to-regulation-6-pecr-for-online-advertising.pdf">advice</a> to the government on possible online advertising exceptions to Regulation 6 PECR. As we set out in our submission to the ICO’s call for views on online advertising, we support reform that incentivises privacy-preserving practices while keeping consent the default for high-risk practices.</p>
<p>Gijs Kruitbosch, Principal Engineer at Mozilla, then gave a technical demonstration of how Mozilla uses PETs and privacy-preserving design in Firefox, including on New Tab, where relevance can be improved through approaches that reduce reliance on user identifiers and server-side user profiles.</p>
<p>The panel, moderated by Mozilla’s Kirsten Nelson-de Búrca, widened the lens well beyond advertising. Speakers from eyeo, OpenMined, the Open Data Institute and the Information Society Law Centre discussed how PETs are governed and used across sectors, and how their deployment could affect competition as well as privacy. The discussion explored public-interest examples, including federated rare-disease and genomic research that lets analysis happen without data leaving an institution or a country, and emerging routes for external researchers to study platform data.</p>
<p>A recurring theme was that successful deployment depends as much on governance and public trust as it does on mathematics. PETs have the potential to reduce the competitive advantages associated with large-scale personal data collection, but they could also entrench incumbents if the relevant infrastructure is closed, proprietary or expensive to audit. The discussion complicated the familiar trade-off between privacy and competition, arguing that it eases when PETs are built in the open, on shared standards, with interoperable and auditable implementations and real routes for smaller players and new entrants to take part.</p>
<h3><b>What comes next</b></h3>
<p>The most important questions were the ones we left without tidy answers. Who gets to set standards, and are they set in the open? How do smaller players actually participate, rather than being told they may? What forms of assurance or audit are needed before policymakers can rely on privacy claims? And how should PETs be built into the next generation of AI, where the most sensitive data and the strongest case for protection often sit together? These are the questions we want to keep working on with those who joined us and the wider community.</p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/07/03/mozilla-mornings-comes-to-the-uk-privacy-enhancing-technologies-and-the-questions-they-raise/">Mozilla Mornings comes to the UK: privacy-enhancing technologies and the questions they raise</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.4]]></title>
<description><![CDATA[chore: bump version to 16.3.4]]></description>
<link>https://tsecurity.de/weiterlesen/3614572/3642711/v1634/</link>
<pubDate>Fri, 03 Jul 2026 06:50:33 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.4</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.3]]></title>
<description><![CDATA[chore: bump version to 16.3.3]]></description>
<link>https://tsecurity.de/weiterlesen/3614279/3642418/v1633/</link>
<pubDate>Fri, 03 Jul 2026 01:08:52 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.3</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.2]]></title>
<description><![CDATA[@oh-my-pi/pi-ai
Changed

Removed automated injection of reasoning suppression prompts in OpenAI responses

@oh-my-pi/pi-catalog
Fixed

Fixed ZenMux model discovery to run without a ZENMUX_API_KEY, so newly published ZenMux models (for example anthropic/claude-fable-5-free) auto-update into the ru...]]></description>
<link>https://tsecurity.de/weiterlesen/3613584/3641723/v1632/</link>
<pubDate>Thu, 02 Jul 2026 18:26:02 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-ai</h2>
<h3>Changed</h3>
<ul>
<li>Removed automated injection of reasoning suppression prompts in OpenAI responses</li>
</ul>
<h2>@oh-my-pi/pi-catalog</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed ZenMux model discovery to run without a <code>ZENMUX_API_KEY</code>, so newly published ZenMux models (for example <code>anthropic/claude-fable-5-free</code>) auto-update into the runtime <code>models.db</code> cache instead of waiting on a regenerated <code>models.json</code>.</li>
<li>Fixed ZenMux runtime discovery to query the <code>/api/v1/models</code> endpoint even when the resolved provider base URL points at the Anthropic-compatible route, so discovery no longer requests a non-existent <code>/api/anthropic/models</code> path.</li>
</ul>
<h3>Removed</h3>
<ul>
<li>Removed reasoning suppression prompt logic for GPT-5 models</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Changed search tool <code>paths</code> parameter to a single semicolon-delimited <code>path</code> string parameter</li>
<li>Changed the <code>grep</code>, <code>glob</code>, and <code>ast_grep</code> tools to take a single optional <code>path</code> argument instead of a <code>paths</code> array. <code>path</code> accepts one path or a semicolon-delimited list (<code>src; tests</code>); omitting it searches the workspace root (<code>.</code>). Multi-path search, delimited expansion, and internal-URL scopes are unchanged. (<code>ast_edit</code> continues to take <code>paths</code>.)</li>
</ul>
<h3>Added</h3>
<ul>
<li>Added <code>speech.enhanced</code> setting to rewrite assistant output into natural spoken prose</li>
<li>Added <code>speech.enhanced</code> setting: assistant output is rewritten into natural spoken prose by the tiny/smol model before synthesis — code blocks become one-clause descriptions, links speak their label or site name, numbers and symbols read naturally, lists become flowing sentences. Blocks are rewritten fence-aware and coalesced (bounded to two concurrent completions); any failed or timed-out rewrite falls back to the mechanical cleanup so speech never blocks on the model.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Reduced extension startup cost, especially on Windows, by reading each extension source-graph module from disk once per load instead of twice (the graph scan now feeds the load-time rewrite hook) (<a href="https://github.com/can1357/oh-my-pi/issues/4196" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/4196/hovercard">#4196</a>).</li>
<li>Redesigned speech vocalization for low latency and clean spoken content. Assistant markdown now runs through a speakable-text pipeline before synthesis: code blocks and tables are silent, links speak their label, bare URLs speak their host, inline-code ticks/emphasis/heading/bullet markers are stripped, and long file paths collapse to their basename. Segmentation is now parent-side and emits at sentence boundaries immediately (the previous engine-side splitter held each sentence until the next one arrived), with clause-level cuts for long sentences and an idle flush when generation stalls mid-sentence. macOS gains a gapless streaming playback backend (ffmpeg AudioToolbox, sox fallback) instead of spawning <code>afplay</code> per sentence.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed ALL-CAPS acronyms (e.g. <code>CNPG</code>, <code>ETL</code>, <code>JWT</code>) being lowered to title case in auto-generated session titles. <code>reconcileTitleCasing</code> (<code>packages/coding-agent/src/tiny/text.ts</code>) now maps ALL-CAPS source tokens into an <code>acronyms</code> table and restores them when the model produces a title-cased artifact (<code>Cnpg</code>), while still declining restoration on shouty input (<code>FIX the BUG NOW</code>, <code>ALL ERROR HANDLING</code>) via a consecutive-ALL-CAPS heuristic. Title prompts also instruct the model to preserve ALL-CAPS acronyms verbatim. (<a href="https://github.com/can1357/oh-my-pi/issues/4220" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/4220/hovercard">#4220</a>)</li>
<li>Fixed cold-start <code>--model</code> resolution for extension providers whose catalogs come only from <code>fetchDynamicModels</code>, so fresh cached runtime models are available before session startup falls back or hard-fails. (<a href="https://github.com/can1357/oh-my-pi/issues/4216" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/4216/hovercard">#4216</a>)</li>
<li>Fixed plugin and legacy extension discovery repeatedly re-reading plugin manifests and walking extension <code>node_modules</code> by caching results until plugin cache invalidation. (<a href="https://github.com/can1357/oh-my-pi/issues/4197" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/4197/hovercard">#4197</a>)</li>
<li>Fixed <code>discoverExtensionPaths</code> invoking every registered extension-module provider (claude, codex, gemini, opencode) on startup and discarding all non-native results. The extension-module capability is now loaded with <code>providers: ["native"]</code>, skipping four foreign directory walks per session — noticeable on Windows where the walks are slowest (<a href="https://github.com/can1357/oh-my-pi/issues/4198" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/4198/hovercard">#4198</a>).</li>
<li>Fixed <code>/move</code> overlay running an <code>fs.statSync</code> per directory entry per keystroke; the directory listing cache now stores <code>Dirent[]</code> and classifies entries without a syscall, falling back to <code>statSync</code> only for symlink entries (<a href="https://github.com/can1357/oh-my-pi/issues/4199" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/4199/hovercard">#4199</a>).</li>
<li>Fixed default model switches being persisted without changing the active goal-mode session when the current context exceeded the target model window. (<a href="https://github.com/can1357/oh-my-pi/issues/4219" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/4219/hovercard">#4219</a>)</li>
<li>Fixed live tool preview spinners staying pinned to their first frame for <code>eval</code> and shell-style renderers. (<a href="https://github.com/can1357/oh-my-pi/issues/4170" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/4170/hovercard">#4170</a>)</li>
<li>Fixed isolated task merges failing when the parent working tree carried WIP for a file the isolated subagent also touched. <code>commitPatchToBranchWorktree</code> now tries plain apply and <code>git apply --3way</code> first (agent-only outcome when the WIP-side blob is tracked in HEAD), then falls back to seeding the temp worktree with the baseline WIP so the delta patch's HEAD+WIP context matches, and rewinds WIP-only files afterward so they don't leak into the branch commit. Covers untracked WIP files, staged-new WIP files, and overlaps <code>--3way</code> cannot resolve. (<a href="https://github.com/can1357/oh-my-pi/issues/4136" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/4136/hovercard">#4136</a>)</li>
<li>Fixed <code>discoverAgents()</code> skipping <code>agents/</code> subdirectories inside OMP extension packages, so agents shipped by <code>omp plugin install</code>-ed npm plugins (e.g. <code>loom</code>) and <code>--extension</code>/<code>extensions:</code> settings roots now load the same way their sibling <code>skills/</code>, <code>hooks/</code>, <code>tools/</code> directories already do. The new scan goes through <code>listOmpExtensionRoots</code>, so Claude marketplace installs continue to flow through the <code>claude-plugins</code> provider without being double-counted. (<a href="https://github.com/can1357/oh-my-pi/issues/3920" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3920/hovercard">#3920</a>)</li>
<li>Fixed plan mode hanging without converging on <code>ask</code>/<code>resolve</code> after advisor cards, idle IRC messages, or follow-on turns. Plan-mode decision enforcement ran on only the non-synthetic <code>prompt()</code> return; continuation/wake paths settled via <code>agent_end</code> and bypassed it. Advisor cards and idle IRC are now recorded into context without waking an autonomous turn, and the <code>ask</code>/<code>resolve</code> decision is enforced at the universal <code>agent_end</code> terminal settle via a bounded-retry counter (provider-neutral <code>required</code>, both tools kept available) that reminds-then-forces a fixed number of times and then yields to the user — never looping, never silently ending plan mode un-converged. An <code>irc send await:true</code> to an idle plan-mode session now answers the sender through the existing ephemeral side-channel auto-reply instead of stranding it until its wait timeout, and a queued forced plan decision is dropped when its continuation is skipped or plan mode exits. (<a href="https://github.com/can1357/oh-my-pi/issues/3910" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3910/hovercard">#3910</a>)</li>
<li>Reduced subagent streaming CPU cost: the recent-output window no longer re-splits the full (up to 8 KB) tail on every streamed text token. Fragments without a newline extend the current last line in place, and a full recompute runs only when line boundaries actually change.</li>
<li>Reduced task-render CPU cost: the task result frame (repainted ~30×/sec via the spinner) previously did 7+ full passes over the result set (<code>some</code>/<code>filter</code>/<code>reduce</code>); a single pass now derives the status booleans, footer counts, and request total, and incremental review extraction reuses the yield data the caller already normalized instead of re-normalizing it.</li>
<li>Reduced model-resolution cost: <code>resolveModelRoleValue</code> now builds the preference context (an O(n) model-order map over all available models) once and reuses it across every fallback pattern instead of rebuilding it per pattern, and <code>matchModel</code> hoists the case-folded pattern once instead of <code>.toLowerCase()</code>-ing it for every candidate across each filter pass.</li>
<li>Reduced read-tool allocation: line counting counts newlines directly instead of allocating via <code>split("\n")</code>, and the hashline formatter no longer counts the same content twice.</li>
<li>Fixed the assistant-message streaming fast path dropping the transient flag, which disabled the transient render path (code-highlight skip and streaming prefix caches) on every same-shape streaming tick. In-flight renders now correctly skip per-tick syntax highlighting; highlighting applies once at message finalization.</li>
<li>Fixed hidden goal-mode todo context: phase names and task text are now sanitized before prompt injection (no raw newlines or control characters forging extra context lines), and the block is only rendered with tool-accurate guidance when the <code>todo</code> tool is active or discoverable instead of unconditionally instructing the agent to call an unavailable tool.</li>
<li>Fixed custom tool loading treating <code>process.exit()</code> from a tool module's import or factory as a host process exit instead of a recoverable load failure. Custom tools now load under the shared extension exit guard, so an exiting tool is skipped with a load error while remaining tools still load (<a href="https://github.com/can1357/oh-my-pi/issues/1704" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/1704/hovercard">#1704</a>).</li>
<li>Fixed stuttering/latency in speech by running synthesis chunks through the player gaplessly</li>
<li>Fixed race condition causing EPIPE errors and broken pipes during speech playback</li>
<li>Fixed interrupted speech audio by ensuring segments queue and drain in order</li>
<li>Fixed speech vocalization starting only after the entire reply was synthesized: ONNX inference blocks the TTS worker's event loop, so per-segment IPC audio chunks queued unflushed and arrived in one burst. Streaming sends now drain the IPC channel before the next segment's inference, cutting time-to-first-audio to ~1.5s regardless of reply length.</li>
<li>Fixed an unhandled <code>EPIPE: broken pipe, write</code> rejection at the end of speech playback: the streaming player's <code>stop()</code> raced an un-awaited <code>FileSink.end()</code> against the backend SIGKILL, and mid-session writes never awaited the flush. Writes now await the flush (so a dead backend is detected and the chunk replays on the next candidate or the per-file path) and <code>stop()</code> swallows the expected teardown rejection.</li>
</ul>
<h2>@oh-my-pi/collab-web</h2>
<h3>Changed</h3>
<ul>
<li>Updated the glob, grep, and ast_grep tool cards to read the new single <code>path</code> argument, falling back to the legacy <code>paths</code> array so historical transcripts still render their search scope.</li>
</ul>
<h2>@oh-my-pi/omp-stats</h2>
<h3>Added</h3>
<ul>
<li>Added a Tools tab to the <code>omp stats</code> dashboard (<code>/#/tools</code>): per-tool call counts, error rates, result/argument payload sizes, per-model breakdown, and a stacked calls-over-time chart. Token and cost columns attribute each invoking turn's real provider usage evenly across that turn's tool calls. Existing databases re-parse sessions once on the next sync to backfill historical tool calls.</li>
</ul>
<h2>@oh-my-pi/pi-utils</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>parseJsonWithRepair</code> failing tool calls whose streamed arguments contain an unquoted string value (e.g. <code>{"paths": packages/foo/*, "i": "…"}</code>). Final parsing now recovers such barewords in object/array value position as strings, terminating at <code>,</code> / <code>}</code> / <code>]</code> / newline. Recovery deliberately refuses anything that could mask real structure or bad data — truncated values, tokens containing <code>"</code> / <code>{</code> / <code>[</code> or a key-like <code>:</code> (URL <code>://</code> and Windows <code>:\</code> colons stay literal), and non-finite atoms (<code>NaN</code>, <code>Infinity</code>, <code>undefined</code>) — and streaming partial parses still roll back unfinished barewords instead of committing them.</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>Fix todo HUD and goal context follow-ups by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/jeffscottward/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/jeffscottward">@jeffscottward</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4764619447" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3777" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3777/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3777">#3777</a></li>
<li>perf: streaming-reveal/render throughput + core hot-path optimizations by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/oldschoola/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/oldschoola">@oldschoola</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4772486225" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3843" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3843/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3843">#3843</a></li>
<li>fix(session): converge plan mode on ask/resolve across continuation paths by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/metaphorics/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/metaphorics">@metaphorics</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4778129627" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3911" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3911/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3911">#3911</a></li>
<li>fix(task): scan OMP extension agents/ dirs in discoverAgents by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4780460395" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3922" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3922/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3922">#3922</a></li>
<li>fix(coding-agent): stopped isolated task merges failing when working tree carries WIP for files the agent also modifies by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4785497810" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/4140" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/4140/hovercard" href="https://github.com/can1357/oh-my-pi/pull/4140">#4140</a></li>
<li>fix(tui): animate live tool spinners by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4788171973" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/4172" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/4172/hovercard" href="https://github.com/can1357/oh-my-pi/pull/4172">#4172</a></li>
<li>fix(robomp): run sandbox setup/teardown off the event loop safely by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/metaphorics/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/metaphorics">@metaphorics</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4789853833" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/4184" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/4184/hovercard" href="https://github.com/can1357/oh-my-pi/pull/4184">#4184</a></li>
<li>fix(coding-agent): scope discoverExtensionPaths to native extension-module provider by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4791333341" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/4202" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/4202/hovercard" href="https://github.com/can1357/oh-my-pi/pull/4202">#4202</a></li>
<li>fix(model-discovery): auto-update ZenMux models into models.db without a key by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/metaphorics/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/metaphorics">@metaphorics</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4791367044" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/4204" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/4204/hovercard" href="https://github.com/can1357/oh-my-pi/pull/4204">#4204</a></li>
<li>fix(coding-agent): cache plugin extension resolution by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4791383356" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/4209" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/4209/hovercard" href="https://github.com/can1357/oh-my-pi/pull/4209">#4209</a></li>
<li>fix(providers): hydrate runtime model cache before selection by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4791806327" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/4217" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/4217/hovercard" href="https://github.com/can1357/oh-my-pi/pull/4217">#4217</a></li>
<li>fix(session): keep model switches active after rate limits by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4791982615" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/4221" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/4221/hovercard" href="https://github.com/can1357/oh-my-pi/pull/4221">#4221</a></li>
<li>fix(coding-agent): guard custom tool process exits during load by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4570706556" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/1706" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/1706/hovercard" href="https://github.com/can1357/oh-my-pi/pull/1706">#1706</a></li>
<li>fix(tui): stop /move overlay from statting every entry per keystroke by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4791327639" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/4200" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/4200/hovercard" href="https://github.com/can1357/oh-my-pi/pull/4200">#4200</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v16.3.1...v16.3.2"><tt>v16.3.1...v16.3.2</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.1]]></title>
<description><![CDATA[chore: bump version to 16.3.1]]></description>
<link>https://tsecurity.de/weiterlesen/3612238/3640377/v1631/</link>
<pubDate>Thu, 02 Jul 2026 09:09:25 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.1</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[This Week In Rust: This Week in Rust 658]]></title>
<description><![CDATA[Hello and welcome to another issue of This Week in Rust!
Rust is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
@thisweekinrust.bsky.social on Bluesky or
@ThisWeekinRu...]]></description>
<link>https://tsecurity.de/weiterlesen/3612031/3640170/this-week-in-rust-this-week-in-rust-658/</link>
<pubDate>Thu, 02 Jul 2026 07:10:00 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social, or
<a href="https://github.com/rust-lang/this-week-in-rust">send us a pull request</a>.
Want to get involved? <a href="https://github.com/rust-lang/rust/blob/main/CONTRIBUTING.md">We love contributions</a>.</p>
<p><em>This Week in Rust</em> is openly developed <a href="https://github.com/rust-lang/this-week-in-rust">on GitHub</a> and archives can be viewed at <a href="https://this-week-in-rust.org/">this-week-in-rust.org</a>.
If you find any errors in this week's issue, <a href="https://github.com/rust-lang/this-week-in-rust/pulls">please submit a PR</a>.</p>
<p>Want TWIR in your inbox? <a href="https://this-week-in-rust.us11.list-manage.com/subscribe?u=fd84c1c757e02889a9b08d289&amp;id=0ed8b72485">Subscribe here</a>.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4>


<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#official">Official</a></h5>
<ul>
<li><a href="https://blog.rust-lang.org/2026/06/30/Rust-1.96.1/">Announcing Rust 1.96.1 | Rust Blog</a></li>
<li><a href="https://blog.rust-lang.org/2026/06/25/vision-doc-journeys-to-learning-rust/">The many journeys of learning Rust | Rust Blog</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#foundation">Foundation</a></h5>
<ul>
<li><a href="https://rustfoundation.org/media/rust-foundation-trusted-training-program-launches-giving-learners-a-mark-of-quality-to-trust/">Rust Foundation Trusted Training Program Launches, Giving Learners a Mark of Quality to Trust</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#newsletters">Newsletters</a></h5>
<ul>
<li><a href="https://scientificcomputing.rs/monthly/2026-06">Scientific Computing in Rust #19 (June 2026)</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://slint.dev/blog/slint-1.17-released">Slint 1.17 Released</a></li>
<li><a href="https://blog.antoyo.xyz/rustc_codegen_gcc-progress-report-42">rustc_codegen_gcc: Progress Report #42</a></li>
<li><a href="https://hovinen.me/announcements/2026/06/24/introducing-test-that.html">Introducing Test That!</a></li>
<li><a href="https://hovinen.me/announcements/2026/06/24/introducing-test-that.html">Introducing Test That!: A rich test assertion library for Rust from the original author of GoogleTest Rust</a></li>
<li><a href="https://github.com/shihuili1218/rssh/blob/main/docs/article_arch_en.md">Inside RSSH: one Rust crate, three binaries, and the Tauri lessons along the way</a></li>
<li><a href="https://github.com/Aleixenandros/Rustty/releases/tag/v1.38.0">Rustty 1.38 – accessibility &amp; keyboard nav</a></li>
<li><a href="https://www.willsearch.com.br/blog/2026/06/25/guardiandb-0-17-0-secure-namespaces-iroh-1-0-and-the-arrival-of-the-odm/">GuardianDB 0.17.0: Secure namespaces, Iroh 1.0, and the arrival of the ODM</a></li>
<li><a href="https://dev.to/iam_suriyan_b9078a5b3a553/building-a-real-time-voice-agent-runtime-in-rust-no-gil-one-binary-2000-calls-a-box-12ko">Building a real-time voice-agent runtime in Rust: no GIL, one binary, 2,000 calls a box</a></li>
<li><a href="https://aimdb.dev/blog/aimdb-bring-your-own-connector">AimDB: Bring Your Own Connector</a></li>
<li><a href="https://github.com/kunobi-ninja/kache/releases/tag/v0.8.0">kache 0.8.0: zero-copy restores on Windows (ReFS)</a></li>
<li><a href="https://miskibin.github.io/warbell/">Warbell — a castle-defense action-RPG built with Bevy 0.19</a></li>
<li><a href="https://dev.to/gregorymc86/i-built-a-macos-ftp-client-entirely-in-rust-no-electron-no-webview-2a8i">I built a macOS FTP client entirely in Rust - no Electron, no webview</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5>
<ul>
<li><a href="https://blog.yoshuawuyts.com/hoisting-expressions">Hoisting Expressions</a></li>
<li><a href="https://blog.jetbrains.com/rust/2026/06/25/rust-web-development-2026/">The Unglamorous Side of Rust Web Development</a></li>
<li><a href="https://dev.to/ernesto_arias_148b35bc25d/-how-i-found-out-52-of-my-knowledge-graph-was-duplicates-and-what-i-did-about-it-3coh">How I Found Out 52% of My Knowledge Graph Was Duplicates (and What I Did About It)</a></li>
<li><a href="https://jtjlehi.github.io/2026/06/25/novel-rust-error-handling.html">A Novel Approach to Rust Error Handling</a></li>
<li><a href="https://encore.dev/blog/redis-runtime">We put a Redis server inside our runtime</a></li>
<li><a href="https://kerkour.com/rust-high-performance-memory-fragmentation-allocations">High-performance Rust: Understanding and eliminating memory fragmentation</a></li>
<li><a href="https://kunobi.ninja/blog/kache-storage-worktrees">AI and worktrees are filling our disks: kache storage, measured</a></li>
<li><a href="https://dev.to/sicklefire/designing-a-cross-platform-terminal-memory-visualizer-in-rust-2365">Designing a cross-platform terminal memory visualizer in Rust</a></li>
<li><a href="https://pranitha.dev/posts/rust-and-memory-allocators">Your Rust Service Isn't Leaking — It Could Be the Allocator</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5>
<ul>
<li><a href="https://medium.com/@vbasky/measure-dont-guess-building-viser-a-content-adaptive-video-encoding-optimizer-in-rust-7675edd6943a">Measure, Don't Guess: Building viser, a Content-Adaptive Video Encoding Optimizer in Rust</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-sql-and-sqlx-by-building-a-book-library-cli-in-rust/">Learn SQL and SQLx by Building a Book Library CLI in Rust</a></li>
<li>[series] <a href="https://aibodh.com/posts/async-rust-chapter-2-what-async-fn-compiles-into/">Reasoning About Async Rust with State Machines</a></li>
<li><a href="https://mainmatter.com/c-to-rust-migration-book/">The C to Rust Migration Book</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#crate-of-the-week">Crate of the Week</a></h4>
<p>This week's crate is <a href="https://github.com/pbkx/deconvolution">deconvolution</a>, a image deconvolution and restoration library.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1621">pbkx</a> for the self-suggestion!</p>
<p><a href="https://users.rust-lang.org/t/crate-of-the-week/2704">Please submit your suggestions and votes for next week</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#calls-for-testing">Calls for Testing</a></h4>
<p>An important step for RFC implementation is for people to experiment with the
implementation and give feedback, especially before stabilization.</p>
<p>If you are a feature implementer and would like your RFC to appear in this list, add a
<code>call-for-testing</code> label to your RFC along with a comment providing testing instructions and/or
guidance on which aspect(s) of the feature need testing.</p>
<p><em>No calls for testing were issued this week by
<a href="https://github.com/rust-lang/rust/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rust</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/rustup/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rustup</a> or
<a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing%20state%3Aopen">Rust language RFCs</a>.</em></p>
<p><a href="https://github.com/rust-lang/this-week-in-rust/issues">Let us know</a> if you would like your feature to be tracked as a part of this list.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#call-for-participation-projects-and-speakers">Call for Participation; projects and speakers</a></h4>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-projects">CFP - Projects</a></h5>
<p>Always wanted to contribute to open-source projects but did not know where to start?
Every week we highlight some tasks from the Rust community for you to pick and get started!</p>
<p>Some of these tasks may also have mentors available, visit the task page for more information.</p>
<p><a href="https://github.com/kmolan/multicalc-rust/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22">multicalc - good first issues</a></p>



<ul>
<li><a href="https://github.com/aimdb-dev/aimdb/issues/93">AimDB - Add minimal example: hello-single-latest</a></li>
<li><a href="https://github.com/aimdb-dev/aimdb/issues/109">AimDB - Wire <code>.transform()</code> and <code>.transform_join()</code> into stage profiling</a></li>
<li><a href="https://github.com/SzilvasiPeter/edid-info/issues/1">edid-info - Increase test coverage with real EDID data</a></li>
<li><a href="https://github.com/SzilvasiPeter/edid-info/issues/2">edid-info - Finalize CTA-861 extension implementation</a></li>
<li><a href="https://github.com/SzilvasiPeter/edid-info/issues/3">edid-info - Support additional EDID extension block types</a></li>
</ul>
<p>If you are a Rust project owner and are looking for contributors, please submit tasks <a href="https://github.com/rust-lang/this-week-in-rust?tab=readme-ov-file#call-for-participation-guidelines">here</a> or through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-events">CFP - Events</a></h5>
<p>Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.</p>



<p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4>
<p>426 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-06-23..2026-06-30">merged in the last week</a></p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/157996">drop the full-crate AST walk in <code>check_unused</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158185">make <code>stable_crate_ids</code> reads lock-free after crate loading</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158239">rework lint pass running</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157271">simplify some <code>proc_macro</code> things</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#library">Library</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/158326">add <code>io::ErrorKind::TooManyOpenFiles</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/153097">expand <code>OptionFlatten</code>'s iterator methods</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155625">move <code>std::io::Error</code> into <code>core</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158053">optimize network address parser</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/cargo/pull/17106">add <code>-Zhint-msrv</code> flag</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17237"><code>filter_map_next</code>: clean-up, overhaul suggestions</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17318"><code>chunks_exact_to_as_chunks</code>: Prevent syntactically invalid suggestions</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17317"><code>chunks_exact_to_as_chunks</code>: Use correct method name in message</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17316"><code>chunks_exact_to_as_chunks</code>: Pick iter method depending on mut-ness</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17302"><code>non_ascii_literal</code>, <code>invisible_characters</code>: don't suggest a fix on raw strings</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17228">create a single <code>ConstEvalCtxt</code> in <code>expr_eagerness</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17299">detect new range types in <code>higher::Range</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17270">do not trigger <code>manual_option_zip</code> when map receiver is a lazy evaluated expression</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16746">enhance <code>needless_late_init</code> to cover grouped assignments</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17257">fix: <code>borrow_as_ptr</code> is triggered on generated code</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-analyzer">Rust-Analyzer</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22466">add diagnostic for E0596</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22645">add fixes add '.await' for <code>type_mismatch</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22646">crash on lowering consts with associated types</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22640">crash when hovering on anonymous consts</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22582">only run <code>Drop::drop</code> when implemented</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22633">mark <code>inline_convert_while_ascii()</code> as <code>unsafe</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22115">switch out lsp-types for gen-lsp-types</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5>
<p>Overall, the week was fairly neutral, with no meaningful shift on most benchmarks on any of our statistics.</p>
<p>Triage done by <strong>@simulacrum</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=8b6558a02b2774acfb25cf15e199467c37ba7490&amp;end=7dc2c162b9c197aaa76a6f9e7534569537830a01&amp;absolute=false&amp;stat=instructions%3Au">8b6558a0..7dc2c162</a></p>
<p>2 Regressions, 1 Improvement, 7 Mixed; 5 of them in rollups
34 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/master/triage/2026/2026-06-29.md">Full report here</a></p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#approved-rfcs"></a><a href="https://github.com/rust-lang/rfcs/commits/master">Approved RFCs</a></h5>
<p>Changes to Rust follow the Rust <a href="https://github.com/rust-lang/rfcs#rust-rfcs">RFC (request for comments) process</a>. These
are the RFCs that were approved for implementation this week:</p>
<ul>
<li><em>No RFCs were approved this week.</em></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#final-comment-period">Final Comment Period</a></h5>
<p>Every week, <a href="https://www.rust-lang.org/team.html">the team</a> announces the 'final comment period' for RFCs and key PRs
which are reaching a decision. Express your opinions now.</p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust"></a><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Rust</a>
<ul>
<li><a href="https://github.com/rust-lang/rust/issues/143989">Tracking Issue for LocalKey/Cell::update</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/142312">Tracking Issue for <code>{str, [T], Path}::trim_prefix</code> and <code>{str, [T]}::trim_suffix</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155697">Stabilize c-variadic function definitions</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/69835">Tracking Issue for layout information behind pointers</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158523">Fix feature gate for <code>repr(simd)</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/154585">reat no_mangle_generic_items as hard error instead of lint warning</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158522">Lint against invalid POSIX symbol definitions</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158302">Fix <code>overflowing_literals</code> lint with repeated negation</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158504">stabilize <code>extern "custom"</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158057">Don't escape U+FF9E and U+FF9F in <code>escape_debug_ext</code></a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler-team-mcps-only"></a><a href="https://github.com/rust-lang/compiler-team/issues?q=label%3Amajor-change%20label%3Afinal-comment-period%20state%3Aopen">Compiler Team</a> <a href="https://forge.rust-lang.org/compiler/mcp.html">(MCPs only)</a>
<ul>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1007">Decouple <code>BackendRepr</code> from ABI alignment</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1005">MCP: Stabilization strategy for rustc parallel frontend</a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#language-reference"></a><a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a>
<ul>
<li><a href="https://github.com/rust-lang/reference/pull/2166">Fields must fit in the type, even for repr(Rust)</a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-rfcs"></a><a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</a>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3527">RFC: Associated const underscore</a></li>
<li><a href="https://github.com/rust-lang/rfcs/pull/3980">Add <code>extern "custom"</code></a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#unsafe-code-guidelines"></a><a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Unsafe Code Guidelines</a>
<ul>
<li><a href="https://github.com/rust-lang/unsafe-code-guidelines/issues/615">Opsem extension proposal: atomic volatile accesses</a></li>
</ul>
<p><em>No Items entered Final Comment Period this week for
<a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Team</a> or
<a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a>.</em></p>
<p>Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"></a><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h5>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3977">Method chain as item</a></li>
<li><a href="https://github.com/rust-lang/rfcs/pull/3980">Add <code>extern "custom"</code></a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4>
<p>Rusty Events between 2026-07-01 - 2026-07-29 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-07-01 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/315210366/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455932/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Virtual (Charlottesville, VA, US) | <a href="https://www.meetup.com/charlottesville-rust-meetup">Charlottesville Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/charlottesville-rust-meetup/events/315211402/"><strong>Learning Game Development the Hard Way with Rust and Bevy</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Virtual (Nürnberg, DE) | <a href="https://www.meetup.com/rust-noris">Rust Nuremberg</a><ul>
<li><a href="https://www.meetup.com/rust-noris/events/313345243/"><strong>Rust Nürnberg online</strong></a></li>
</ul>
</li>
<li>2026-07-04 | Virtual (Kampala, UG) | <a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763176587">Rust Circle Meetup</a><ul>
<li><a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763176587"><strong>Rust Circle Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-05 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314095287/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-07 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/315060981/"><strong>👋 Community Catch Up</strong></a></li>
</ul>
</li>
<li>2026-07-14 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254778/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-07-15 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-16 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/312045926/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-19 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314329045/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/315102297/"><strong>Lunch &amp; Learn: Learning Rust as First Programming Language</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/315279653/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
<li>2026-07-28 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254777/"><strong>Fourth Tuesday</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#asia">Asia</a></h5>
<ul>
<li>2026-07-18 | Bangalore, IN | <a href="https://hasgeek.com/rustbangalore">Rust Bangalore</a><ul>
<li><a href="https://hasgeek.com/rustbangalore/july-2026-rustacean-meetup/"><strong>July 2026 Rustacean Meetup</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#europe">Europe</a></h5>
<ul>
<li>2026-07-01 | Köln, DE | <a href="https://www.meetup.com/rust-cologne-bonn">Rust Cologne</a><ul>
<li><a href="https://www.meetup.com/rustcologne/events/315404678/"><strong>Rust in July: Vecs and Strings and Slices, Oh My!</strong></a></li>
</ul>
</li>
<li>2026-07-01 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul>
<li><a href="https://www.meetup.com/rust-manchester/events/315200163/"><strong>Rust Manchester June Talks</strong></a></li>
</ul>
</li>
<li>2026-07-01 | Oxford, UK | <a href="https://www.meetup.com/oxford-rust-meetup-group">Oxford ACCU/Rust Meetup.</a><ul>
<li><a href="https://www.meetup.com/oxford-rust-meetup-group/events/315409335/"><strong>Building a file system from scratch</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Edinburgh, UK | <a href="https://www.meetup.com/rust-edi">Rust and Friends</a><ul>
<li><a href="https://www.meetup.com/rust-and-friends/events/314941098/"><strong>Bevy, Bits, &amp; Cats (Rust July Talks)</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Enschede, NL | <a href="https://www.meetup.com/dutch-rust-meetup">Baseflow Tech Meetups</a><ul>
<li><a href="https://www.meetup.com/baseflow-tech-meetups/events/315099547/"><strong>AI Summit</strong></a></li>
</ul>
</li>
<li>2026-07-08 | Dublin, IE | <a href="https://www.meetup.com/rust-dublin">Rust Dublin</a><ul>
<li><a href="https://www.meetup.com/rust-dublin/events/315150327/"><strong>Join us live and INPERSON for Rust 262</strong></a></li>
</ul>
</li>
<li>2026-07-09 | Switzerland, CH | <a href="https://www.posttenebraslab.ch/wiki/events/start">PostTenebrasLab</a><ul>
<li><a href="https://www.posttenebraslab.ch/wiki/events/monthly_meeting/rust_meetup"><strong>Rust Meetup Geneva</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Leipzig, DE | <a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig">Rust - Modern Systems Programming in Leipzig</a><ul>
<li><a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/events/313816470/"><strong>Supercharge Rust funcs with implicit arguments and context-generic programming</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/315484101/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
<li>2026-07-23 | London, UK | <a href="https://www.meetup.com/london-rust-project-group">London Rust Project Group</a><ul>
<li><a href="https://www.meetup.com/london-rust-project-group/events/315366453/"><strong>Rama modular service framework for Rust</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Paris, FR | <a href="https://www.meetup.com/rust-paris">Rust Paris</a><ul>
<li><a href="https://www.meetup.com/rust-paris/events/315309633/"><strong>Rust meetup #87</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<li>2026-07-02 | Saint Louis, MO, US | <a href="https://www.meetup.com/stl-rust">STL Rust</a><ul>
<li><a href="https://www.meetup.com/stl-rust/events/315103359/"><strong>Git is easy?</strong></a></li>
</ul>
</li>
<li>2026-07-04 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225861/"><strong>Boston University Rust Lunch, July 4</strong></a></li>
</ul>
</li>
<li>2026-07-09 | Lehi, UT, US | <a href="https://www.meetup.com/utah-rust">Utah Rust</a><ul>
<li><a href="https://www.meetup.com/utah-rust/events/314696647/"><strong>Utah Rust July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-11 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225865/"><strong>MIT Rust Lunch, July 11</strong></a></li>
</ul>
</li>
<li>2026-07-15 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-18 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225872/"><strong>North End Rust Lunch, July 18</strong></a></li>
</ul>
</li>
<li>2026-07-21 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group">San Francisco Rust Study Group</a><ul>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/314997214/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-07-22 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/xvkdgtyjckbdc/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-07-22 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a><ul>
<li><a href="https://www.meetup.com/rust-los-angeles/events/315376271/"><strong>Rust LA: Rust in Distributed Systems with Flight Science!</strong></a></li>
</ul>
</li>
<li>2026-07-25 | Brooklyn, NY, US | <a href="https://flowercomputer.com/">Flower</a><ul>
<li><a href="https://partiful.com/e/Vq9fyDNCMSO7ia4ulK5b"><strong>BOG-A-THON 2</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5>
<ul>
<li>2026-07-21 | Barton, AU | <a href="https://www.meetup.com/rust-canberra">Canberra Rust User Group</a><ul>
<li><a href="https://www.meetup.com/rust-canberra/events/315307280/"><strong>July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-23 | Perth, AU | <a href="https://www.meetup.com/perth-rust-meetup-group">Rust Perth Meetup Group</a><ul>
<li><a href="https://www.meetup.com/perth-rust-meetup-group/events/315451138/"><strong>Rust Perth: July Meetup!</strong></a></li>
</ul>
</li>
</ul>
<p>If you are running a Rust event please add it to the <a href="https://www.google.com/calendar/embed?src=apd9vmbc22egenmtu5l6c5jbfc%40group.calendar.google.com">calendar</a> to get
it mentioned here. Please remember to add a link to the event too.
Email the <a href="mailto:community-team@rust-lang.org">Rust Community Team</a> for access.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#jobs">Jobs</a></h4>
<p>Please see the latest <a href="https://www.reddit.com/r/rust/comments/1ttbtf5/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p>
<h3><a class="toclink" href="https://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3>
<blockquote>
<p>I <em>do</em> rather hope anyone using <code>-Zllvm-target-features</code> or any stabilized form thereof would know that they are getting a conversation with the dragon directly and they should mind their words carefully if they do not wish to be barbecued by it and served over a nice plate of iron filings.</p>
</blockquote>
<p>– <a href="https://rust-lang.zulipchat.com/#narrow/channel/233931-t-compiler.2Fmajor-changes/topic/Add.20.60-Zllvm-target-feature.60.20target.20.2Amodif.E2.80.A6.20compiler-team.23994/near/606147265">workingjubilee on rust zulip</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1784">Tomáš Šedovič</a> for the suggestion!</p>
<p><a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328">Please submit quotes and vote for next week!</a></p>
<p>This Week in Rust is edited by:</p>
<ul>
<li><a href="https://github.com/nellshamrell">nellshamrell</a></li>
<li><a href="https://github.com/llogiq">llogiq</a></li>
<li><a href="https://github.com/ericseppanen">ericseppanen</a></li>
<li><a href="https://github.com/extrawurst">extrawurst</a></li>
<li><a href="https://github.com/U007D">U007D</a></li>
<li><a href="https://github.com/mariannegoldin">mariannegoldin</a></li>
<li><a href="https://github.com/bdillo">bdillo</a></li>
<li><a href="https://github.com/opeolluwa">opeolluwa</a></li>
<li><a href="https://github.com/bnchi">bnchi</a></li>
<li><a href="https://github.com/KannanPalani57">KannanPalani57</a></li>
<li><a href="https://github.com/tzilist">tzilist</a></li>
</ul>
<p><em>Email list hosting is sponsored by <a href="https://foundation.rust-lang.org/">The Rust Foundation</a></em></p>
<p><small><a href="https://www.reddit.com/r/rust/comments/1ul6xfl/this_week_in_rust_658/">Discuss on r/rust</a></small></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.3.0]]></title>
<description><![CDATA[chore: bump version to 16.3.0]]></description>
<link>https://tsecurity.de/weiterlesen/3611898/3640037/v1630/</link>
<pubDate>Thu, 02 Jul 2026 04:23:26 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.3.0</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v8.18.0-beta.1]]></title>
<description><![CDATA[Polls can now be created in individual chats too. Present a curated list of choices to your indecisive friend, or recapture the magic of passing a note to your crush by creating a “Do you like me? Y/N/Maybe” poll.]]></description>
<link>https://tsecurity.de/weiterlesen/3611241/3639380/v8180-beta1/</link>
<pubDate>Wed, 01 Jul 2026 20:08:57 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<ul>
<li>Polls can now be created in individual chats too. Present a curated list of choices to your indecisive friend, or recapture the magic of passing a note to your crush by creating a “Do you like me? Y/N/Maybe” poll.</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.13]]></title>
<description><![CDATA[chore: bump version to 16.2.13]]></description>
<link>https://tsecurity.de/weiterlesen/3611240/3639379/v16213/</link>
<pubDate>Wed, 01 Jul 2026 20:08:56 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.2.13</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v8.17.0]]></title>
<description><![CDATA[Group admins can now delete recently sent messages in a group chat. If someone accidentally posts a spoiler in your Book Club group and then walks away from their phone, a group admin can delete it to keep the plot twist intact. You can easily see when a message was deleted and who removed it, ju...]]></description>
<link>https://tsecurity.de/weiterlesen/3611166/3639305/v8170/</link>
<pubDate>Wed, 01 Jul 2026 19:38:55 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<ul>
<li>Group admins can now delete recently sent messages in a group chat. If someone accidentally posts a spoiler in your Book Club group and then walks away from their phone, a group admin can delete it to keep the plot twist intact. You can easily see when a message was deleted and who removed it, just like the existing "Delete for Everyone" feature.</li>
<li>We also increased the maximum number of pinned chats from 4 to 10, so you can show 6 more people how much you love what they have to say.</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.12: test(coding-agent): hoisted renderYieldSchema test imports to top level]]></title>
<description><![CDATA[AGENTS.md forbids inline await import() — move fs, path, and prompt
to top-level namespace/named imports. The prompt-templates module import
already registers the Handlebars helper as a side-effect, so the render
calls still resolve the new renderYieldSchema helper.]]></description>
<link>https://tsecurity.de/weiterlesen/3609198/3637337/v16212-testcoding-agent-hoisted-renderyieldschema-test-imports-to-top-level/</link>
<pubDate>Wed, 01 Jul 2026 05:52:51 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>AGENTS.md forbids inline <code>await import()</code> — move <code>fs</code>, <code>path</code>, and <code>prompt</code><br>
to top-level namespace/named imports. The <code>prompt-templates</code> module import<br>
already registers the Handlebars helper as a side-effect, so the render<br>
calls still resolve the new <code>renderYieldSchema</code> helper.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Tooling Announcements: Happy BMO Push Day! (20260630.1)]]></title>
<description><![CDATA[Github Link
The following changes have been pushed to bugzilla.mozilla.org:

Bug 1726931 - New issues should displayed on “My Dashboard” for first time users instead of assigned bugs
Bug 1834454 - [WEBHOOKS] Webhooks for a product change don’t fire if product is changed away from the target produ...]]></description>
<link>https://tsecurity.de/weiterlesen/3609099/3637238/firefox-tooling-announcements-happy-bmo-push-day-202606301/</link>
<pubDate>Wed, 01 Jul 2026 04:08:28 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p><a href="https://github.com/mozilla-bteam/bmo/tree/release-20260630.1" rel="noopener nofollow ugc">Github Link</a></p>
<p>The following changes have been pushed to <a href="https://bugzilla.mozilla.org/">bugzilla.mozilla.org</a>:</p>
<ul>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1726931">Bug 1726931</a> - New issues should displayed on “My Dashboard” for first time users instead of assigned bugs</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1834454">Bug 1834454</a> - [WEBHOOKS] Webhooks for a product change don’t fire if product is changed away from the target product</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1684509">Bug 1684509</a> - Have a single button to mark a bug as abusive/spam</li>
</ul>
<p>Discuss these changes in the <a href="https://matrix.to/#/%23bmo:mozilla.org" rel="noopener nofollow ugc">BMO Matrix Room</a></p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/happy-bmo-push-day-20260630-1/148802">Read full topic</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.11]]></title>
<description><![CDATA[chore: bump version to 16.2.11]]></description>
<link>https://tsecurity.de/weiterlesen/3609020/3637159/v16211/</link>
<pubDate>Wed, 01 Jul 2026 03:07:52 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.2.11</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.10]]></title>
<description><![CDATA[chore: bump version to 16.2.10]]></description>
<link>https://tsecurity.de/weiterlesen/3608911/3637050/v16210/</link>
<pubDate>Wed, 01 Jul 2026 01:09:04 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.2.10</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.9]]></title>
<description><![CDATA[chore: bump version to 16.2.9]]></description>
<link>https://tsecurity.de/weiterlesen/3608048/3636187/v1629/</link>
<pubDate>Tue, 30 Jun 2026 18:09:59 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.2.9</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.8]]></title>
<description><![CDATA[chore: bump version to 16.2.8]]></description>
<link>https://tsecurity.de/weiterlesen/3607014/3635153/v1628/</link>
<pubDate>Tue, 30 Jun 2026 12:09:02 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.2.8</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Servo Blog: May in Servo: user scripts, mp4 compat, blackboxing in DevTools, and more!]]></title>
<description><![CDATA[Servo 0.3.0 contains all of the changes we landed in May, which came out to 391 commits (March: 534).
For security fixes, see § Security.

    

We’ve shipped several new web platform features:

‘font-kerning: none’ (@simonwuelker, #44634)
‘font-variant-east-asian’ (@simonwuelker, #44989)
‘font-v...]]></description>
<link>https://tsecurity.de/weiterlesen/3606749/3634888/the-servo-blog-may-in-servo-user-scripts-mp4-compat-blackboxing-in-devtools-and-more/</link>
<pubDate>Tue, 30 Jun 2026 10:07:49 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p><a href="https://github.com/servo/servo/releases/tag/v0.3.0"><strong>Servo 0.3.0</strong></a> contains all of the changes we landed in May, which came out to <strong>391 commits</strong> (March: 534).
For security fixes, see <a href="https://servo.org/blog/2026/06/30/may-in-servo/#security"><strong>§ Security</strong></a>.</p>
<figure>
    <a href="https://servo.org/img/blog/2026-06-diffie.png"><img alt="servoshell 0.3.0 showing several new features: the `document.execCommand()` commands ‘back­Color’, ‘create­Link’, ‘unlink’, ‘superscript’, ‘subscript’, and ‘remove­Format’, plus ‘font-kerning’ and ‘font-variant-ligatures’" src="https://servo.org/img/blog/2026-06-diffie.png"></a>
</figure>
<p>We’ve shipped several new web platform features:</p>
<ul>
<li><strong>‘font-kerning: none’</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44634">#44634</a>)</li>
<li><strong>‘font-variant-east-asian’</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44989">#44989</a>)</li>
<li><strong>‘font-variant-ligatures’</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44903">#44903</a>)</li>
<li><strong>‘font-variant-numeric’</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44950">#44950</a>)</li>
<li><strong>‘font-variant-position’</strong> (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/45142">#45142</a>)</li>
<li><strong>mp4</strong> files <strong>without fast start</strong> in <strong>&lt;video&gt;</strong> (<a href="https://github.com/calvaris">@calvaris</a>, <a href="https://github.com/servo/servo/pull/45084">#45084</a>)</li>
<li><code>&lt;form enctype="multipart/form-data"&gt;</code> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/45028">#45028</a>)</li>
<li><code>&lt;form enctype="text/plain"&gt;</code> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/45111">#45111</a>)</li>
<li><strong>&lt;![CDATA[]]&gt;</strong> layout (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44791">#44791</a>)</li>
</ul>
<p>Plus a bunch of new DOM APIs:</p>
<ul>
<li><strong>onslotchange</strong> property on <strong>Shadow­Root</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44688">#44688</a>)</li>
<li><strong>screen­Left</strong> and <strong>screen­Top</strong> on <strong>Window</strong> (<a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/servo/servo/pull/45128">#45128</a>)</li>
<li><strong>new Blob()</strong> with <code>{endings: "native"}</code> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44803">#44803</a>)</li>
<li><strong>new Performance­Mark()</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/44702">#44702</a>)</li>
<li><strong>parse­HTML()</strong> on <strong>Document</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/44952">#44952</a>)</li>
<li><strong>read­As­Binary­String()</strong> on <strong>File­Reader</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44858">#44858</a>, <a href="https://github.com/servo/servo/pull/44921">#44921</a>)</li>
<li><strong>performance.measure()</strong> with mark values <strong>‘redirect­Start’</strong>, <strong>‘redirect­End’</strong>, <strong>‘secure­Connection­Start’</strong>, and <strong>‘response­End’</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/44673">#44673</a>, <a href="https://github.com/servo/servo/pull/44624">#44624</a>, <a href="https://github.com/servo/servo/pull/44850">#44850</a>, <a href="https://github.com/servo/servo/pull/44739">#44739</a>)</li>
</ul>
<p>We’ve also fixed some build issues on Windows (<a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/45079">#45079</a>), FreeBSD (<a href="https://github.com/delan">@delan</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/44600">#44600</a>), and for anyone building Servo on NixOS or with Nix (<a href="https://github.com/freyacodes">@freyacodes</a>, <a href="https://github.com/servo/servo/pull/45051">#45051</a>, <a href="https://github.com/servo/servo/pull/45135">#45135</a>).</p>
<p>This is another big update, so here’s an outline:</p>
<ul>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#security"><strong>Security</strong></a><br>– memory safety fixes</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#work-in-progress"><strong>Work in progress</strong></a><br>– execCommand(), Sanitizer, IndexedDB, accessibility, workers</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#embedding-api"><strong>Embedding API</strong></a><br>– MSRV, cookies, preferences, diagnostics</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#for-users-and-developers"><strong>For users and developers</strong></a><br>– <code>--host-file</code>, <code>--userscripts</code>, DevTools Debugger</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#more-on-the-web-platform"><strong>More on the web platform</strong></a><br>– focus, forms, navigation, SubtleCrypto, WebGPU</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#performance"><strong>Performance</strong></a><br>– about:memory, threads, layout, DOM, build times</p>
</li>
<li>
<p><a href="https://servo.org/blog/2026/06/30/may-in-servo/#stability"><strong>Stability</strong></a><br>– crashes, hangs, static analysis</p>
</li>
</ul>
<h3>Security <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#security">
        <span class="icon hashlink"><i class="fas fa-link"></i></span>
      </a></h3>
<p>Servo’s JS runtime, <strong>SpiderMonkey 140.10.0</strong>, had several <strong>memory safety bugs</strong> that have been fixed in Servo 0.3.0 with the update to SpiderMonkey 140.10.1 (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44755">#44755</a>).
For more details, see <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-7322">CVE-2026-7322</a>, <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-7323">CVE-2026-7323</a>, and <a href="https://www.mozilla.org/en-US/security/advisories/mfsa2026-36/">MFSA 2026-36</a>.</p>
<h3>Work in progress <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#work-in-progress">
        <span class="icon hashlink"><i class="fas fa-link"></i></span>
      </a></h3>
<p>We’re continuing to implement <strong>document.exec­Command()</strong> for <strong>rich text editing</strong>, under <code>--pref dom­_exec­_command­_enabled</code> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44735">#44735</a>, <a href="https://github.com/servo/servo/pull/44973">#44973</a>, <a href="https://github.com/servo/servo/pull/44887">#44887</a>).
This release adds support for the <strong>‘back­Color’</strong>, <strong>‘fore­Color’</strong>, <strong>‘create­Link’</strong>, <strong>‘unlink’</strong>, <strong>‘superscript’</strong>, <strong>‘subscript’</strong>, and <strong>‘remove­Format’</strong> commands (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44644">#44644</a>, <a href="https://github.com/servo/servo/pull/44682">#44682</a>, <a href="https://github.com/servo/servo/pull/44657">#44657</a>, <a href="https://github.com/servo/servo/pull/44710">#44710</a>, <a href="https://github.com/servo/servo/pull/44677">#44677</a>), plus partial support for the <strong>‘insert­Paragraph’</strong> command (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44909">#44909</a>).</p>
<p>We’re also working on the <strong>Sanitizer</strong> API, under <code>--pref dom­_sanitizer­_enabled</code>.
With the feature now enabled in servoshell’s experimental mode (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/44701">#44701</a>), this release adds support for <strong>set­Comments()</strong>, <strong>set­Data­Attributes()</strong>, <strong>allow­Processing­Instruction()</strong>, <strong>remove­Processing­Instruction()</strong>, and <strong>remove­Unsafe()</strong> on <strong>Sanitizer</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/44734">#44734</a>, <a href="https://github.com/servo/servo/pull/44983">#44983</a>).</p>
<p><strong>IndexedDB</strong> continues to improve, under <code>--pref dom­_indexeddb­_enabled</code>.
This release brings a more conformant <strong>abort()</strong> on <strong>IDB­Transaction</strong> (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/43950">#43950</a>).</p>
<p>All of the features above are enabled in servoshell’s experimental mode.</p>
<p>We’ve made more progress towards <strong>accessibility</strong> support, including the <a href="https://w3c.github.io/aria/#namefromcontent"><strong>name from contents</strong></a> algorithm (<a href="https://github.com/alice">@alice</a>, <a href="https://github.com/delan">@delan</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44439">#44439</a>) and several changes towards <strong>building the accessibility tree incrementally</strong> (<a href="https://github.com/alice">@alice</a>, <a href="https://github.com/delan">@delan</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44766">#44766</a>, <a href="https://github.com/servo/servo/pull/45035">#45035</a>, <a href="https://github.com/servo/servo/pull/45207">#45207</a>, <a href="https://github.com/servo/servo/pull/44768">#44768</a>, <a href="https://github.com/servo/servo/pull/44785">#44785</a>, <a href="https://github.com/servo/servo/pull/44801">#44801</a>, <a href="https://github.com/servo/servo/pull/44767">#44767</a>, <a href="https://github.com/servo/servo/pull/45029">#45029</a>).
The latter is critical for performance in real-world web content.</p>
<p>We’re now working on <strong>SharedWorker</strong> and <strong>ServiceWorker</strong>, under <code>--pref dom­_sharedworker­_enabled</code> and <code>--pref dom­_serviceworker­_enabled</code> respectively.
This release adds support for <strong>new Shared­Worker()</strong> (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/44761">#44761</a>), and parts of the ServiceWorker API (<a href="https://github.com/gterzian">@gterzian</a>, <a href="https://github.com/arihant2math">@arihant2math</a>, <a href="https://github.com/servo/servo/pull/45082">#45082</a>, <a href="https://github.com/servo/servo/pull/44787">#44787</a>).</p>
<h3>Embedding API <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#embedding-api">
        <span class="icon hashlink"><i class="fas fa-link"></i></span>
      </a></h3>
<p>Servo now requires <strong>Rust 1.88.0</strong> or newer, up from the old MSRV of 1.86.0 (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/44815">#44815</a>).
We run compile tests with the MSRV, but most of our testing is now done with Rust 1.95.0 (<a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44632">#44632</a>).</p>
<p><strong>Breaking changes</strong> to the <strong>cookies</strong> methods in our <a href="https://doc.servo.org/servo/struct.SiteDataManager.html"><strong>SiteDataManager</strong></a> API (<a href="https://github.com/longvatrong111">@longvatrong111</a>, <a href="https://github.com/servo/servo/pull/44708">#44708</a>):</p>
<ul>
<li>
<p><a href="https://doc.servo.org/servo/struct.SiteDataManager.html"><code>Site­Data­Manager</code></a>::<a href="https://doc.servo.org/servo/struct.SiteDataManager.html#method.clear_cookies"><code>clear­_cookies</code></a> now takes an additional <code>callback</code> argument, allowing it to be called async – to continue calling it sync, pass <code>None</code> as the <code>callback</code></p>
</li>
<li>
<p><a href="https://doc.servo.org/servo/struct.SiteDataManager.html"><code>Site­Data­Manager</code></a>::<a href="https://doc.servo.org/servo/struct.SiteDataManager.html#method.clear_session_cookies"><code>clear­_session­_cookies</code></a> now takes an additional <code>callback</code> argument, allowing it to be called async – to continue calling it sync, pass <code>None</code> as the <code>callback</code></p>
</li>
<li>
<p><a href="https://doc.servo.org/servo/struct.SiteDataManager.html"><code>Site­Data­Manager</code></a>::<a href="https://doc.servo.org/servo/struct.SiteDataManager.html#method.set_cookie_for_url"><code>set­_cookie­_for­_url</code></a> now takes an additional <code>callback</code> argument, allowing it to be called async – to continue calling it sync, pass <code>None</code> as the <code>callback</code></p>
</li>
<li>
<p><a href="https://doc.servo.org/servo/struct.SiteDataManager.html"><code>Site­Data­Manager</code></a>::<code>set­_cookie­_for­_url­_async</code> has been removed in favour of <a href="https://doc.servo.org/servo/struct.SiteDataManager.html#method.set_cookie_for_url"><code>set­_cookie­_for­_url</code></a> – to migrate, replace <code>set­_cookie­_for­_url­_async(​callback)</code> with <code>set­_cookie­_for­_url(​Some(​Box::new(​callback)))</code></p>
</li>
</ul>
<p><strong>Breaking changes</strong> to our <a href="https://doc.servo.org/servo/struct.Preferences.html"><strong>Preferences</strong></a> API (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44307">#44307</a>):</p>
<ul>
<li>
<p><code>threadpools­_image­_cache­_workers­_max</code>, <code>threadpools­_indexeddb­_workers­_max</code>, and <code>threadpools­_webstorage­_workers­_max</code> have been <strong>removed</strong> in favour of a combined <a href="https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_workers_max"><code>thread­_pool­_workers­_max</code></a></p>
</li>
<li>
<p><code>threadpools­_fallback­_worker­_num</code> has been <strong>renamed</strong> to <a href="https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_fallback_workers"><code>thread­_pool­_fallback­_workers</code></a></p>
</li>
<li>
<p><code>threadpools­_async­_runtime­_workers­_max</code> has been <strong>renamed</strong> to <a href="https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_async_runtime_workers_max"><code>thread­_pool­_async­_runtime­_workers­_max</code></a></p>
</li>
<li>
<p><code>threadpools­_webrender­_workers­_max</code> has been <strong>renamed</strong> to <a href="https://doc.servo.org/servo/struct.Preferences.html#structfield.thread_pool_webrender_workers_max"><code>thread­_pool­_webrender­_workers­_max</code></a></p>
</li>
</ul>
<p>We’ve also reworked our <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><strong>DiagnosticsLogging</strong></a> API (<a href="https://github.com/mukilan">@mukilan</a>, <a href="https://github.com/servo/servo/pull/44703">#44703</a>):</p>
<ul>
<li>
<p>You can now set options with <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><code>DiagnosticsLogging</code></a>::<a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.toggle_option"><code>toggle­_option</code></a>, and check if they are enabled with <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><code>DiagnosticsLogging</code></a>::<a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.is_enabled"><code>is­_enabled</code></a></p>
</li>
<li>
<p>Each option is a variant of <a href="https://doc.servo.org/servo/enum.DiagnosticsLoggingOption.html"><code>DiagnosticsLoggingOption</code></a>, a new type that also has useful methods for exposing these options in embedder UI</p>
</li>
<li>
<p><strong>(Breaking change)</strong> <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><code>DiagnosticsLogging</code></a> no longer has <code>pub</code> fields representing each option – to migrate, replace field writes and field reads with <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.toggle_option"><code>toggle­_option</code></a> and <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.is_enabled"><code>is­_enabled</code></a> respectively</p>
</li>
<li>
<p><strong>(Breaking change)</strong> <a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html"><code>DiagnosticsLogging</code></a>::<a href="https://doc.servo.org/servo/struct.DiagnosticsLogging.html#method.extend_from_string"><code>extend­_from­_string</code></a> no longer accepts a <code>help</code> option – this option only existed to support servoshell’s <code>-Z help</code> / <code>--debug=help</code> option, so the code implementing it has been moved to servoshell</p>
</li>
</ul>
<h3>For users and developers <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#for-users-and-developers">
        <span class="icon hashlink"><i class="fas fa-link"></i></span>
      </a></h3>
<p><strong>servoshell</strong> has two new options:</p>
<ul>
<li>
<p>You can now configure the path to a <a href="https://en.wikipedia.org/w/index.php?title=Hosts_(file)&amp;oldid=1360805760"><strong>hosts file</strong></a> with <strong>--host-file=</strong> (singular), as an alternative to the <strong>HOST_FILE</strong> (singular) environment variable (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44880">#44880</a>).</p>
</li>
<li>
<p>You can now provide a directory of <strong>user scripts</strong> to run in every document with <strong>--userscripts=</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44754">#44754</a>).</p>
</li>
</ul>
<p>When using the <strong>Debugger</strong> tab in the Firefox <strong>DevTools</strong>:</p>
<ul>
<li>
<p>You can now <a href="https://antongunnarsson.com/devtools-blackbox/">“blackbox”</a> a script by clicking <strong>Ignore source</strong> (<a href="https://github.com/freyacodes">@freyacodes</a>, <a href="https://github.com/servo/servo/pull/44359">#44359</a>).
This prevents breakpoints from being hit inside that script, and it should also allow you to step through execution in the debugger without pausing inside that script.</p>
</li>
<li>
<p>The <strong>Scopes</strong> panel is more accurate now (<a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/servo/servo/pull/44765">#44765</a>).</p>
</li>
</ul>
<p>For developers of Servo itself, please note that <a href="https://book.servo.org/contributing/getting-started.html#ai-contributions">per project policy</a>, you <strong>must not</strong> use the output of <strong>large language models</strong> or other <strong>generative AI tools</strong> in your contributions.
To help us enforce that, we now have CI checks that reject AI agents as coauthors (<a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/delan">@delan</a>, <a href="https://github.com/servo/servo/pull/44723">#44723</a>).</p>
<p>We’ve also fixed build issues with <code>--features vello</code> (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44875">#44875</a>, <a href="https://github.com/servo/servo/pull/45036">#45036</a>).</p>
<h3>More on the web platform <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#more-on-the-web-platform">
        <span class="icon hashlink"><i class="fas fa-link"></i></span>
      </a></h3>
<p>We’ve improved the default appearance of <strong>&lt;dl&gt;</strong>, <strong>&lt;ol&gt;</strong>, <strong>&lt;ul&gt;</strong>, <strong>&lt;table&gt;</strong>, <strong>&lt;thead&gt;</strong>, <strong>&lt;tbody&gt;</strong>, <strong>&lt;tfoot&gt;</strong>, <strong>&lt;tr&gt;</strong>, <strong>&lt;td&gt;</strong>, <strong>&lt;th&gt;</strong>, <strong>&lt;dir&gt;</strong>, <strong>&lt;menu&gt;</strong>, and <strong>&lt;form&gt;</strong> (<a href="https://github.com/avis137">@avis137</a>, <a href="https://github.com/servo/servo/pull/44837">#44837</a>, <a href="https://github.com/servo/servo/pull/44920">#44920</a>).</p>
<p><strong>CryptoKey</strong> is now <strong>serializable</strong>, allowing it to be used in structuredClone() and postMessage() (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/45163">#45163</a>).</p>
<p>We’ve improved <strong>JS error messages</strong> in several parts of the DOM (<a href="https://github.com/n0blenote">@n0blenote</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/PuercoPop">@PuercoPop</a>, <a href="https://github.com/servo/servo/pull/44704">#44704</a>, <a href="https://github.com/servo/servo/pull/45186">#45186</a>, <a href="https://github.com/servo/servo/pull/44656">#44656</a>).</p>
<p>We’ve improved the conformance of <strong>form submission</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44943">#44943</a>, <a href="https://github.com/servo/servo/pull/44953">#44953</a>, <a href="https://github.com/servo/servo/pull/44954">#44954</a>, <a href="https://github.com/servo/servo/pull/44957">#44957</a>), <strong>tab navigation</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44684">#44684</a>), <strong>javascript: url navigation</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/43490">#43490</a>), <strong>‘Refresh’ headers</strong> and <strong>&lt;meta http-equiv=Refresh&gt;</strong> (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/45113">#45113</a>, <a href="https://github.com/servo/servo/pull/45116">#45116</a>), <strong>‘line-break: anywhere’</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/44609">#44609</a>), <strong>assign()</strong> on <strong>Location</strong> (<a href="https://github.com/TG199">@TG199</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44298">#44298</a>), <strong>crypto.subtle.derive­Bits()</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/44706">#44706</a>), <strong>get­Computed­Style()</strong> (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/44856">#44856</a>), <strong>performance.measure()</strong> (<a href="https://github.com/shubhamg13">@shubhamg13</a>, <a href="https://github.com/servo/servo/pull/44675">#44675</a>), <strong>read­As­Data­URL()</strong> on <strong>File­Reader</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44897">#44897</a>, <a href="https://github.com/servo/servo/pull/44924">#44924</a>), <strong>stream()</strong> on <strong>Blob</strong> (<a href="https://github.com/Taym95">@Taym95</a>, <a href="https://github.com/servo/servo/pull/45133">#45133</a>), and <strong>ML-KEM</strong> in <strong>Subtle­Crypto</strong> (<a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/servo/servo/pull/45153">#45153</a>).</p>
<p>We’ve also landed improvements to <strong>GPU­Supported­Limits</strong> (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/45114">#45114</a>), <strong>GPU­Texture</strong> (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/45154">#45154</a>), <strong>create­Bind­Group()</strong> on <strong>GPU­Device</strong> (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/45140">#45140</a>), and other <strong>WebGPU</strong> features (<a href="https://github.com/sagudev">@sagudev</a>, <a href="https://github.com/servo/servo/pull/45097">#45097</a>).</p>
<p>We’ve fixed bugs related to <strong>&lt;svg&gt;</strong> with <strong>‘Content-Security-Policy’</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44974">#44974</a>), <strong>‘:active’</strong> (<a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43953">#43953</a>), <strong>‘:hover’</strong> (<a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/43979">#43979</a>), <strong>‘align-items’</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44396">#44396</a>), <strong>‘border-image-outset’</strong> (<a href="https://github.com/lumiscosity">@lumiscosity</a>, <a href="https://github.com/servo/servo/pull/45039">#45039</a>), <strong>‘padding’</strong> with <strong>‘overflow: scroll’</strong> (<a href="https://github.com/stevennovaryo">@stevennovaryo</a>, <a href="https://github.com/servo/servo/pull/44263">#44263</a>), <strong>‘pointerup’ events</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44666">#44666</a>), <strong>‘slotchange’ events</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44688">#44688</a>), <strong>dynamic import()</strong> (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/servo/servo/pull/44741">#44741</a>), and <strong>clip()</strong> on <strong>CanvasRenderingContext2D</strong> (<a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44831">#44831</a>).</p>
<h3>Performance <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#performance">
        <span class="icon hashlink"><i class="fas fa-link"></i></span>
      </a></h3>
<p>We’ve built a tool that will help us improve <strong>‘about:memory’</strong> by finding untracked allocations (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/44674">#44674</a>, <a href="https://github.com/servo/servo/pull/44980">#44980</a>).</p>
<p>Servo now requires fewer OS threads per CPU, after we combined the <strong>thread pools</strong> for the image cache, web storage, and IndexedDB (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44307">#44307</a>).</p>
<p>We’ve landed a bunch of <strong>layout</strong> optimisations:</p>
<ul>
<li>
<p>The fragment tree is now <strong>immutable</strong> for the most part, with small pockets of interior mutability where mutability is needed.
This means that most fragment tree accesses no longer have to incur the runtime cost of borrowing an <a href="https://docs.rs/atomic_refcell/0.1.14/atomic_refcell/">AtomicRefCell</a> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/44849">#44849</a>).</p>
</li>
<li>
<p>Two steps in the layout process, calculating <strong>containing blocks</strong> and building the <strong>stacking context tree</strong>, require traversing the fragment tree.
This can be expensive, but we’ve now combined them into a <strong>single fragment tree traversal</strong> in most cases (<a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44911">#44911</a>, <a href="https://github.com/servo/servo/pull/45210">#45210</a>).</p>
</li>
<li>
<p>Another step in the layout process, calculating <strong>scrollable overflow</strong>, used to require traversing the entire fragment tree.
We’ve effectively eliminated that traversal, by making the calculation both <strong>lazy</strong> and <strong>incremental</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/44854">#44854</a>).</p>
</li>
<li>
<p>We’ve improved the caching of fragments, shaping results, and other layout results between reflows (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/45038">#45038</a>, <a href="https://github.com/servo/servo/pull/44769">#44769</a>).</p>
</li>
<li>
<p>We’ve made incremental fragment layout more precise (<a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44925">#44925</a>).</p>
</li>
<li>
<p>We’ve reduced the memory usage of text shaping (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/44609">#44609</a>).</p>
</li>
</ul>
<p><strong>DOM attributes</strong> are much more efficient in this release:</p>
<ul>
<li>
<p>When scripts write attribute values, we avoid serialising them until the attribute is read back by a script (if ever), speeding up frequent writes to inline styles by up to 25% (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44931">#44931</a>).</p>
</li>
<li>
<p>When we parse attributes in HTML or read attribute values internally, we avoid constructing <a href="https://developer.mozilla.org/en-US/docs/Web/API/Attr">Attr</a> nodes until a script <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttributeNode">actually</a> <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/attributes">needs</a> them, reducing memory usage and making garbage collection less likely (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44209">#44209</a>, <a href="https://github.com/servo/servo/pull/45023">#45023</a>, <a href="https://github.com/servo/servo/pull/45031">#45031</a>, <a href="https://github.com/servo/servo/pull/45060">#45060</a>).</p>
</li>
</ul>
<p>We’ve eliminated a traversal of the whole DOM tree whenever an <strong>&lt;iframe&gt;</strong> is attached to the tree, which is especially noticeable when parsing documents with many &lt;iframe&gt; tags (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/45236">#45236</a>).</p>
<p>Stylesheet locks now use <a href="https://docs.rs/atomic_refcell/0.1.14/atomic_refcell/">AtomicRefCell</a>, which is even more efficient than a <a href="https://docs.rs/parking_lot/0.12.5/parking_lot/">parking_lot</a>::<a href="https://docs.rs/parking_lot/0.12.5/parking_lot/type.RwLock.html">RwLock</a> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44883">#44883</a>).</p>
<p>On OpenHarmony, we now have a real refresh driver for reduced idle CPU usage (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44927">#44927</a>), and we now cache the font list on disk for faster startup (<a href="https://github.com/RichardTjokroutomo">@RichardTjokroutomo</a>, <a href="https://github.com/d-desyatkin">@d-desyatkin</a>, <a href="https://github.com/servo/servo/pull/44158">#44158</a>).</p>
<p>We’ve also reduced allocations, GC rooting steps, and other operations in many parts of Servo (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/SteveSharonSam">@SteveSharonSam</a>, <a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/nodelpit">@nodelpit</a>, <a href="https://github.com/simonwuelker">@simonwuelker</a>, <a href="https://github.com/servo/servo/pull/44961">#44961</a>, <a href="https://github.com/servo/servo/pull/44944">#44944</a>, <a href="https://github.com/servo/servo/pull/44972">#44972</a>, <a href="https://github.com/servo/servo/pull/45231">#45231</a>, <a href="https://github.com/servo/servo/pull/45078">#45078</a>, <a href="https://github.com/servo/servo/pull/44662">#44662</a>, <a href="https://github.com/servo/servo/pull/44679">#44679</a>, <a href="https://github.com/servo/servo/pull/44967">#44967</a>, <a href="https://github.com/servo/servo/pull/44963">#44963</a>, <a href="https://github.com/servo/servo/pull/44933">#44933</a>, <a href="https://github.com/servo/servo/pull/44935">#44935</a>, <a href="https://github.com/servo/servo/pull/44905">#44905</a>).</p>
<p>To improve Servo’s <strong>build times</strong>, we’re moving more code out of our massive <strong>script crate</strong> (<a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44598">#44598</a>, <a href="https://github.com/servo/servo/pull/44636">#44636</a>, <a href="https://github.com/servo/servo/pull/44823">#44823</a>), and reduced the size of our dependency tree (<a href="https://github.com/jschwe">@jschwe</a>, <a href="https://github.com/servo/servo/pull/44818">#44818</a>).</p>
<h3>Stability <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#stability">
        <span class="icon hashlink"><i class="fas fa-link"></i></span>
      </a></h3>
<p>Several crashes and hangs have been fixed:</p>
<ul>
<li>in <strong>‘content’</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/SimonSapin">@SimonSapin</a>, <a href="https://github.com/servo/servo/pull/45227">#45227</a>, <a href="https://github.com/servo/servo/pull/44762">#44762</a>)</li>
<li>in <strong>Media­Stream</strong> (<a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/servo/servo/pull/44781">#44781</a>)</li>
<li>in <strong>item()</strong> on <strong>attributes</strong> on <strong>Element</strong> (<a href="https://github.com/webbeef">@webbeef</a>, <a href="https://github.com/servo/servo/pull/44721">#44721</a>)</li>
<li>in <strong>append­Rule()</strong> on <strong>CSS­Keyframes­Rule</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/45173">#45173</a>)</li>
<li>in <strong>init­Event()</strong> on <strong>Focus­Event</strong> (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/44870">#44870</a>)</li>
<li>in <strong>stop()</strong> on <strong>Window</strong> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44804">#44804</a>)</li>
<li>in <code>document.exec­Command(​"delete")</code> (<a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/servo/servo/pull/44748">#44748</a>)</li>
<li>in <code>--debug-mozjs</code> builds (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/SharanRP">@SharanRP</a>, <a href="https://github.com/servo/servo/pull/44745">#44745</a>, <a href="https://github.com/servo/servo/pull/45001">#45001</a>)</li>
<li>when evaluating scripts in DevTools while paused (<a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/pull/45050">#45050</a>)</li>
<li>when previewing some JS values in DevTools (<a href="https://github.com/eerii">@eerii</a>, <a href="https://github.com/atbrakhi">@atbrakhi</a>, <a href="https://github.com/servo/servo/pull/45054">#45054</a>)</li>
<li>when shaping zero-width spaces in layout (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/servo/servo/pull/45176">#45176</a>)</li>
<li>when toggling servoshell’s experimental mode at runtime (<a href="https://github.com/mrobinson">@mrobinson</a>, <a href="https://github.com/Loirooriol">@Loirooriol</a>, <a href="https://github.com/servo/servo/pull/45226">#45226</a>)</li>
</ul>
<p>We’ve continued our long-running effort to <strong>use the Rust type system</strong> to make certain kinds of dynamic borrow failures impossible (<a href="https://github.com/Gae24">@Gae24</a>, <a href="https://github.com/MavenRain">@MavenRain</a>, <a href="https://github.com/Narfinger">@Narfinger</a>, <a href="https://github.com/SteveSharonSam">@SteveSharonSam</a>, <a href="https://github.com/TimvdLippe">@TimvdLippe</a>, <a href="https://github.com/elomscansio">@elomscansio</a>, <a href="https://github.com/jdm">@jdm</a>, <a href="https://github.com/kkoyung">@kkoyung</a>, <a href="https://github.com/yezhizhen">@yezhizhen</a>, <a href="https://github.com/servo/servo/pull/44712">#44712</a>, <a href="https://github.com/servo/servo/pull/44759">#44759</a>, <a href="https://github.com/servo/servo/pull/44879">#44879</a>, <a href="https://github.com/servo/servo/pull/45014">#45014</a>, <a href="https://github.com/servo/servo/pull/45058">#45058</a>, <a href="https://github.com/servo/servo/pull/45061">#45061</a>, <a href="https://github.com/servo/servo/pull/45076">#45076</a>, <a href="https://github.com/servo/servo/pull/45098">#45098</a>, <a href="https://github.com/servo/servo/pull/45110">#45110</a>, <a href="https://github.com/servo/servo/pull/45149">#45149</a>, <a href="https://github.com/servo/servo/pull/45117">#45117</a>, <a href="https://github.com/servo/servo/pull/45184">#45184</a>, <a href="https://github.com/servo/servo/pull/45201">#45201</a>, <a href="https://github.com/servo/servo/pull/44806">#44806</a>, <a href="https://github.com/servo/servo/pull/44930">#44930</a>, <a href="https://github.com/servo/servo/pull/44942">#44942</a>, <a href="https://github.com/servo/servo/pull/44946">#44946</a>, <a href="https://github.com/servo/servo/pull/45233">#45233</a>, <a href="https://github.com/servo/servo/pull/45181">#45181</a>, <a href="https://github.com/servo/servo/pull/44659">#44659</a>, <a href="https://github.com/servo/servo/pull/44660">#44660</a>, <a href="https://github.com/servo/servo/pull/44664">#44664</a>, <a href="https://github.com/servo/servo/pull/44668">#44668</a>, <a href="https://github.com/servo/servo/pull/44992">#44992</a>, <a href="https://github.com/servo/servo/pull/45000">#45000</a>, <a href="https://github.com/servo/servo/pull/45081">#45081</a>, <a href="https://github.com/servo/servo/pull/45009">#45009</a>, <a href="https://github.com/servo/servo/pull/45225">#45225</a>, <a href="https://github.com/servo/servo/pull/45087">#45087</a>, <a href="https://github.com/servo/servo/pull/45244">#45244</a>, <a href="https://github.com/servo/servo/pull/45245">#45245</a>, <a href="https://github.com/servo/servo/pull/45247">#45247</a>, <a href="https://github.com/servo/servo/pull/44663">#44663</a>, <a href="https://github.com/servo/servo/pull/44665">#44665</a>, <a href="https://github.com/servo/servo/pull/44993">#44993</a>, <a href="https://github.com/servo/servo/pull/45040">#45040</a>, <a href="https://github.com/servo/servo/pull/45053">#45053</a>, <a href="https://github.com/servo/servo/pull/44647">#44647</a>, <a href="https://github.com/servo/servo/pull/44671">#44671</a>, <a href="https://github.com/servo/servo/pull/44681">#44681</a>, <a href="https://github.com/servo/servo/pull/44717">#44717</a>, <a href="https://github.com/servo/servo/pull/44733">#44733</a>, <a href="https://github.com/servo/servo/pull/44686">#44686</a>, <a href="https://github.com/servo/servo/pull/44653">#44653</a>).</p>
<h3>New contributors <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#new-contributors">
        <span class="icon hashlink"><i class="fas fa-link"></i></span>
      </a></h3>
<p>A special thanks to the following people for landing their first patch in Servo:</p>
<ul>
<li>AbdAlRahman Gad (<a href="https://github.com/AbdAlRahmanGad">@AbdAlRahmanGad</a>, <a href="https://github.com/servo/servo/pull/45213">#45213</a>)</li>
<li>Onyeka Obi (<a href="https://github.com/MavenRain">@MavenRain</a>, <a href="https://github.com/servo/servo/pull/44806">#44806</a>)</li>
<li>Steve Sharon Sam (<a href="https://github.com/SteveSharonSam">@SteveSharonSam</a>, <a href="https://github.com/servo/servo/pull/45030">#45030</a>)</li>
<li>avis137 (<a href="https://github.com/avis137">@avis137</a>, <a href="https://github.com/servo/servo/pull/44837">#44837</a>)</li>
<li>Xabier Rodríguez (<a href="https://github.com/calvaris">@calvaris</a>, <a href="https://github.com/servo/servo/pull/45084">#45084</a>)</li>
<li>June (<a href="https://github.com/kimjune01">@kimjune01</a>, <a href="https://github.com/servo/servo/pull/44816">#44816</a>)</li>
<li>Matt Van Horn (<a href="https://github.com/mvanhorn">@mvanhorn</a>, <a href="https://github.com/servo/servo/pull/44740">#44740</a>)</li>
<li>nicole (<a href="https://github.com/n0blenote">@n0blenote</a>, <a href="https://github.com/servo/servo/pull/44704">#44704</a>)</li>
<li>panxt8 (<a href="https://github.com/panxt8">@panxt8</a>, <a href="https://github.com/servo/servo/pull/44991">#44991</a>)</li>
</ul>
<p>Interested in helping build a web browser?
Take a look at our <a href="https://starters.servo.org/">curated list</a> of issues that are good for new contributors!</p>
<h3>Donations <a class="header-anchor" href="https://servo.org/blog/2026/06/30/may-in-servo/#donations">
        <span class="icon hashlink"><i class="fas fa-link"></i></span>
      </a></h3>
<p>Thanks again for your generous support!
We are now receiving <strong>7659 USD/month</strong> (+4.2% from April) in recurring donations.
This helps us cover the cost of our <strong><a href="https://ci0.servo.org/">speedy</a> <a href="https://ci1.servo.org/">CI</a> <a href="https://ci2.servo.org/">and</a> <a href="https://ci3.servo.org/">benchmarking</a> <a href="https://ci4.servo.org/">servers</a></strong>, one of our latest <strong><a href="https://www.outreachy.org/alums/2026-05/#:~:text=Servo">Outreachy interns</a></strong>, and funding <strong><a href="https://servo.org/blog/2025/09/17/your-donations-at-work-funding-jdm/">maintainer work</a></strong> that helps more people contribute to Servo.</p>
<p>Servo is also on <a href="https://thanks.dev/">thanks.dev</a>, and already <strong>35 GitHub users</strong> (+2 from April) that depend on Servo are sponsoring us there.
If you use Servo libraries like <a href="https://crates.io/crates/url/reverse_dependencies">url</a>, <a href="https://crates.io/crates/html5ever/reverse_dependencies">html5ever</a>, <a href="https://crates.io/crates/selectors/reverse_dependencies">selectors</a>, or <a href="https://crates.io/crates/cssparser/reverse_dependencies">cssparser</a>, signing up for <a href="https://thanks.dev/">thanks.dev</a> could be a good way for you (or your employer) to give back to the community.</p>
<p>We now have <a href="https://servo.org/blog/2025/11/21/sponsorship-tiers/"><strong>sponsorship tiers</strong></a> that allow you or your organisation to donate to the Servo project with public acknowlegement of your support.
If you’re interested in this kind of sponsorship, please contact us at <a href="mailto:join@servo.org">join@servo.org</a>.</p>
<figure class="_fig"><div class="_flex">
    <div>
        <div><strong>7659</strong> USD/month</div>
        <div></div>
        <div></div>
        <div><strong>10000</strong></div>
    </div>
    <progress max="10000" value="7659"></progress>
</div></figure>
<p>Use of donations is decided transparently via the Technical Steering Committee’s public <strong><a href="https://github.com/servo/project/blob/main/FUNDING_REQUEST.md">funding request process</a></strong>, and active proposals are tracked in <a href="https://github.com/servo/project/issues/187">servo/project#187</a>.
For more details, head to our <a href="https://servo.org/sponsorship/">Sponsorship page</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.7]]></title>
<description><![CDATA[chore: bump version to 16.2.7]]></description>
<link>https://tsecurity.de/weiterlesen/3606492/3634631/v1627/</link>
<pubDate>Tue, 30 Jun 2026 07:38:25 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.2.7</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.6]]></title>
<description><![CDATA[chore: bump version to 16.2.6]]></description>
<link>https://tsecurity.de/weiterlesen/3605647/3633786/v1626/</link>
<pubDate>Mon, 29 Jun 2026 20:23:53 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.2.6</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Kali Linux 2026.2 Release (GNOME 50, KDE 6.6, Helper Scripts, APT Formats & VM Boot Tweaking)]]></title>
<description><![CDATA[It’s the final week of Q2, and Kali Linux 2026.2 is here - right on schedule ;) We have been heads down since our last release, and we are ready to share what we have been working on. This release is a mix of desktop refreshes, infrastructure improvements, and quality-of-life changes that we thin...]]></description>
<link>https://tsecurity.de/weiterlesen/3605369/3633508/kali-linux-20262-release-gnome-50-kde-66-helper-scripts-apt-formats-vm-boot-tweaking/</link>
<pubDate>Mon, 29 Jun 2026 18:25:00 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>It’s the final week of Q2, and Kali Linux 2026.2 is here - right on schedule ;) We have been heads down since our last release, and we are ready to share what we have been working on. This release is a mix of desktop refreshes, infrastructure improvements, and quality-of-life changes that we think you will appreciate.</p>
<p>The summary of the <a href="https://bugs.kali.org/changelog_page.php">changelog</a> since the <a href="https://www.kali.org/blog/kali-linux-2026-1-release/">2026.1 release from March</a> is:</p>
<ul>
<li><strong><a href="https://www.kali.org/blog/kali-linux-2026-2-release/#desktop-environments-updates">Desktop Environments</a></strong> - Bump to GNOME 50 and KDE Plasma 6.6</li>
<li><strong><a href="https://www.kali.org/blog/kali-linux-2026-2-release/#improved-consistency-for-services-helper-scripts">Helper Scripts Consistency</a></strong> - Consistency to our little launches at starting services</li>
<li><strong><a href="https://www.kali.org/blog/kali-linux-2026-2-release/#apt-gets-a-new-sources-format">APT Format</a></strong> - Goodbye <code>sources.list</code>, hello <code>sources.list.d/kali.source</code></li>
<li><strong><a href="https://www.kali.org/blog/kali-linux-2026-2-release/#no-more-graphics-firmware-pre-installed-for-vm-use-cases">VM Boot Optimisation</a></strong> - Smaller initrd + faster boot times = happy virtual machine users</li>
<li><strong><a href="https://www.kali.org/blog/kali-linux-2026-2-release/#disruptive-package-updates">Reboot Warning</a></strong> - Heads-up, <code>polkit</code> and <code>xrdp</code> upgrades require a system reboot</li>
<li><strong><a href="https://www.kali.org/blog/kali-linux-2026-2-release/#linux-kernel-for-this-release-619">Kali Kernel Incoming</a></strong> - Staying with 6.19 for now, how to get 7.0 early</li>
<li><strong><a href="https://www.kali.org/blog/kali-linux-2026-2-release/#a-sneak-peek-build-scripts">Build Scripts Incoming</a></strong> - Heads-up with some changing on the way</li>
<li><strong><a href="https://www.kali.org/blog/kali-linux-2026-2-release/#new-tools-in-kali">New Tools</a></strong> - As always, various new shiny packages have been added <em>(9!)</em></li>
</ul>
<hr>
<h2>Desktop Environments Updates</h2>
<p>As we do roughly every six months, every other Kali release, our <a href="https://www.kali.org/docs/general-use/switching-desktop-environments/">desktop environments</a> get a major update. This time it’s for: <a href="https://www.kali.org/blog/kali-linux-2026-2-release/#gnome-50">GNOME</a> and <a href="https://www.kali.org/blog/kali-linux-2026-2-release/#kde-plasma-6-6">KDE Plasma</a>. Neither brings sweeping changes, but both have put real effort into <strong>refining performance and usability</strong> across the whole ecosystem.</p>
<h3>GNOME 50</h3>
<p>GNOME 50 brings usability and performance improvements across the desktop. The <strong>file manager received significant optimizations</strong>, resulting in faster thumbnail and icon loading, improved responsiveness, and reduced memory usage. The desktop also received new accessibility enhancements through a brand-new preferences window, tweaks to the screen reader, and automatic language switching.</p>
<p>Another addition is <strong>support for document annotations</strong> in the Document Viewer app, making it easier to add text notes and highlights directly to documents.</p>
<p>Here you can read more about all the changes with this new GNOME release: <a href="https://release.gnome.org/50/">GNOME 50 release announcement</a>.</p>
<p></p><p>
<a href="https://www.kali.org/blog/kali-linux-2026-2-release/images/gnome-50.png" target="_blank">
<img src="https://www.kali.org/blog/kali-linux-2026-2-release/images/gnome-50.png" alt="Kali + GNOME 50">
</a>
</p>

<h3>KDE Plasma 6.6</h3>
<p>KDE Plasma 6.6 focuses on improving usability and accessibility while introducing several new features, including a <strong>new on-screen keyboard</strong>, providing a better experience particularly for touch-enabled devices.</p>
<p>The <strong>Spectacle screenshot utility can now recognize and extract text</strong> directly from screenshots, making OCR functionality available from the desktop. Accessibility has also been enhanced with new color-vision support options, improvements to Zoom and Magnifier, support for Slow Keys on Wayland, and adoption of the standardized Reduced Motion setting.</p>
<p>Here you can read more about all the changes with this new Plasma release: <a href="https://kde.org/announcements/plasma/6/6.6.0/">KDE Plasma 6.6 release announcement</a>.</p>
<p></p><p>
<a href="https://www.kali.org/blog/kali-linux-2026-2-release/images/kde-6.6.png" target="_blank">
<img src="https://www.kali.org/blog/kali-linux-2026-2-release/images/kde-6.6.png" alt="Kali + KDE Plasma 6.6">
</a>
</p>

<h2>Improved Consistency For Services Helper Scripts</h2>
<p>To improve consistency across tools that depend on a service, we have updated our helper scripts. Previously, a tool that required a service might only let you start it (with no way to stop) - and the information displayed back was inconsistent (mixture of service status, how to access, default credentials or nothing at all). With this change, multiple packages have been updated to use these new scripts, which now handle the following tasks:</p>
<ul>
<li>Manage the service - <strong>start/stop</strong></li>
<li><strong>Check if the service is already running</strong> - avoiding starting it twice</li>
<li>Show the <strong>service status</strong></li>
<li>Show any <strong><a href="https://www.kali.org/docs/introduction/default-credentials/">default credentials</a></strong></li>
<li>Show <strong>how to access it</strong> - such as if it’s a web UI, the URL <em>(and bonus, <strong>automatically open it in the browser</strong>!)</em></li>
</ul>
<p>We also make sure that any Kali packages which include a service use <strong><code>&lt;tool&gt;-start</code></strong>/<strong><code>&lt;tool&gt;-stop</code></strong> for their command names.</p>
<p><em>Hopefully this makes the little things a little easier.</em></p>
<p></p><p>
<a href="https://www.kali.org/blog/kali-linux-2026-2-release/images/kali-services.png" target="_blank">
<img src="https://www.kali.org/blog/kali-linux-2026-2-release/images/kali-services.png" alt="Kali Services Helper Scripts">
</a>
</p>

<h2>APT Gets A New Sources Format</h2>
<p>Since the beginning of time, the APT sources for Kali Linux were configured in the file <code>/etc/apt/sources.list</code>. This file tells APT from where to update your system, and it’s so fundamental that pretty much everyone (that is, Kali users) knows this file and its content:</p>
<pre><code class="language-console">┌──(kali㉿kali)-[~]
└─$ cat /etc/apt/sources.list
# See https://www.kali.org/docs/general-use/kali-linux-sources-list-repositories/
deb http://http.kali.org/kali kali-rolling main contrib non-free non-free-firmware
</code></pre>
<p>Well, it’s a <strong>“once in a distro lifetime” kind of thing, and here it is</strong> - <code>/etc/apt/sources.list</code> is retired, in favor of the new file <code>/etc/apt/sources.list.d/kali.sources</code>:</p>
<pre><code class="language-console">┌──(kali㉿kali)-[~]
└─$ cat /etc/apt/sources.list.d/kali.sources
# See https://www.kali.org/docs/general-use/kali-apt-sources/
Types: deb
URIs: http://http.kali.org/kali/
Suites: kali-rolling
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/kali-archive-keyring.gpg
</code></pre>
<p><strong>All the freshly-installed systems will be configured</strong> as such. <strong>Existing systems won’t be changed</strong>. Both files are equivalent and work just the same. However, in the near future, APT will warn if the old file is in use, and will suggest modernizing it.</p>
<p>Note that, for those in the know, this isn’t anything new: both formats have existed for a long time now, and you could use either one or the other. What’s happening is that the <em>default</em> is slowly changing, from the <strong>old “one-line-style”</strong> to the <strong>new “deb822-style”</strong>. This is happening in Debian and in Debian-derivatives like Ubuntu. Kali is just following suit.</p>
<p>And for the curious, there’s a very complete and detailed manual page:</p>
<pre><code class="language-console">┌──(kali㉿kali)-[~]
└─$ man sources.list
</code></pre>
<h2>No More Graphics Firmware Pre-installed For VM Use-cases</h2>
<p>Kali has had a long tradition of pre-installing a lot of firmware in its images. The upside is that users didn’t need to know what firmware they needed to install for their hardware to work: it was already there. And the downside, obviously, was that all the firmware that wasn’t needed was nevertheless installed and taking space for nothing. </p>
<p>It worked for us so far, in the sense that we don’t get too many bug reports related to missing firmware. But lately the changing landscape of <em>graphics firmware</em> forced us to re-evaluate this decision.</p>
<p>The issue with graphics firmware is that it just keeps growing bigger, and right now having it installed for <a href="https://www.kali.org/docs/general-use/install-nvidia-drivers-on-kali-linux/">NVidia</a>, AMD and Intel GPUs takes almost 300 MB. But what’s even worse: some bits and pieces of these firmware packages need to be loaded very early, and therefore they are also installed in the initrd (note: the initrd, or initramfs, is this “minimal” system that is loaded early on by the kernel at boot time). And lately, the Kali initrd peaked at around 200 MB, mainly due to graphics firmware. What does that mean in practice? A bigger initrd means slower boot time, and can potentially fill up your <code>/boot</code> partition if ever it’s too small.</p>
<p>So we thought we could improve the situation for VM users here: the vast majority probably don’t need graphics firmware, ever. The only use-case we can think of is a VM with a dedicated GPU + GPU passthrough enabled. If you’re in this case, you might need graphics firmware.</p>
<p>So, what changed in practice, you may ask?</p>
<ul>
<li><strong><a href="https://www.kali.org/get-kali/#kali-virtual-machines">Pre-built VM images</a> don’t come with graphics firmware anymore</strong></li>
<li><a href="https://www.kali.org/get-kali/#kali-installer-images"><strong>Installer images</strong></a> now detect if installation happens <strong>in a VM</strong>, and in that case <strong>graphics firmware is not installed</strong></li>
</ul>
<p>As a result, the <strong>initrd is down to 60 MB for VM users, and the boot time is cut by ~3x</strong> (tested for QEMU VM on a Linux host, your mileage may vary). That’s a massive improvement in boot time.</p>
<p>For baremetal users: nothing changed, so you still get a 200 MB initrd with all graphics firmware pre-installed. If you’d like to optimize, it’s on you to uninstall the firmware that you don’t need. A word of caution though: make sure to know what you’re doing, because removing graphics firmware that is <em>needed</em> might leave you with a <a href="https://www.kali.org/docs/troubleshooting/graphics-issues-on-bare-metal-installation/">system without graphics after reboot</a>.</p>
<h2>Disruptive Package Updates</h2>
<p>We’ve got some slightly disruptive updates in this release.</p>
<p><strong>polkit: a reboot is required</strong></p>
<p>The update of the <code>polkitd</code> package requires a reboot, otherwise <em>trying to start GUI applications as root will fail with cryptic error messages</em>.</p>
<p>There’s an indication of this <strong>reboot requirement</strong> in the output of <code>apt full-upgrade</code>, when the <code>polkitd</code> package is updated. It’s just <strong>not very obvious</strong>, the hint is buried with the rest of the logs:</p>
<pre><code class="language-console">┌──(kali㉿kali)-[~]
└─$ sudo apt update &amp;&amp; sudo apt full-upgrade
[...]
Setting up libpolkit-gobject-1-0:amd64 (127+really127-0kali1)…
Setting up libpolkit-agent-1-0:amd64 (127+really127-0kali1)…
Setting up polkitd (127+really127-0kali1)…
Upgrading to this polkitd version requires a reboot, please reboot the system when convenient.
Created symlink '/etc/systemd/system/sockets.target.wants/polkit-agent-helper.socket' → '/usr/lib/systemd/system/polkit-agent-helper.socket'.
[...]
</code></pre>
<p>After a reboot, and if ever you still can’t run applications as root, make sure that <code>polkit-agent-helper</code> is started:</p>
<pre><code class="language-console">┌──(kali㉿kali)-[~]
└─$ sudo systemctl enable --now polkit-agent-helper.socket
</code></pre>
<p>If you’re still having issues, reach out on our <a href="https://bugs.kali.org/">bug tracker</a>.</p>
<hr>
<p><strong>xrdp: a reboot is required</strong></p>
<p>In this Kali release, we updated <code>xrdp</code> and <code>xorgxrdp</code> to the <code>v0.10</code> series. <a href="https://www.kali.org/docs/general-use/xfce-with-rdp/">xrdp</a> is an open-source Remote Desktop Protocol server: you might use it if you connect to your Kali instance remotely. <em>If you’re an xrdp user, you’ll need to reboot after this upgrade</em>.</p>
<p>For those who run Kali in Hyper-V, using the <a href="https://www.kali.org/docs/virtualization/install-hyper-v-guest-enhanced-session-mode/">Enhanced Session Mode</a>: you’re an xrdp user, even if you didn’t know it! We did our best to ensure a smooth transition, and yet we got reports that xrdp wasn’t functional after the upgrade. If ever you’re in this case, you can try to run <code>kali-tweaks</code>, and in the Virtualization section you can try to <strong>disable, and then enable again</strong> the Hyper-V Enhanced Session Mode. That might fix the issue. <strong>Don’t forget to reboot</strong>!</p>
<p>As always, if you’re still having issues after that, feel free to reach out on the <a href="https://bugs.kali.org/">Kali bug tracker</a>.</p>
<h2>Linux Kernel For This Release: 6.19</h2>
<p>Regarding the version of the <a href="https://pkg.kali.org/pkg/linux">Linux kernel</a> to include in this release of Kali, it’s been a tough decision.</p>
<p>On one hand, we’d like to release with the latest version of the Linux kernel, due to all the recent vulnerability disclosures (<a href="https://en.wikipedia.org/wiki/Copy_Fail">Copy Fail/CVE-2026-31431</a>, <a href="https://github.com/V4bel/dirtyfrag">Dirty Frag/CVE-2026-43284 &amp; CVE-2026-43500</a> and others ). On the other hand, when the 7.0 kernel reached Debian, there were <a href="https://bugs.debian.org/1135362">reports of incompatibilities with the NVidia DKMS drivers</a> .</p>
<p>We decided to release with a 6.19 kernel to avoid breaking <a href="https://www.kali.org/docs/general-use/install-nvidia-drivers-on-kali-linux/">NVidia users</a>. At the same time, for <strong>those who prefer to get the latest kernel</strong> and don’t care about NVidia compatibility, <strong>we have the kernel 7.0 ready for you in <code>kali-experimental</code></strong>. Make sure to check our documentation that explains <a href="https://www.kali.org/docs/general-use/kali-apt-sources/#enabling-kali-additional-branches">how to enable the kali-experimental repository</a>. The 7.0 kernel is also available in kali-rolling, so you can just <a href="https://www.kali.org/docs/general-use/updating-kali/">update your whole system</a> and get the latest packages from <a href="https://www.kali.org/docs/general-use/kali-branches/">kali-rolling</a>.</p>
<h2>A Sneak Peek: Build Scripts</h2>
<p>Our <a href="https://gitlab.com/kalilinux/build-scripts/">build scripts</a> are what we use to produce every Kali image - ARM SBCs, Base (Installer and live ISOs), Cloud, Containers, VMs, WSL &amp; NetHunter/Pro. Each lives in its own repo, and over time they have each grown in slightly different directions. For the next release, Kali 2026.3, we are doing <strong>a consistency pass across all of them: same structure, same conventions, same behaviour throughout</strong>.</p>
<p>As a result of these changes, some CI pipelines or workflows may need tweaking.</p>
<h2>New Tools in Kali</h2>
<p>This release brings <strong>9 new tools</strong> <em>(to the network repositories)</em>. As always, we have been busy adding to the arsenal:</p>
<ul>
<li><a href="https://www.kali.org/tools/arsenal-ng/">arsenal-ng</a> - Go-based command library equipped with 200+ cybersecurity cheat-sheets</li>
<li><a href="https://www.kali.org/tools/hydra/">hydra-gtk</a> - [Re-added] Very fast network logon cracker - GTK+ based GUI</li>
<li><a href="https://www.kali.org/tools/legba/">legba</a> - Multiprotocol credentials bruteforcer / password sprayer and enumerator</li>
<li><a href="https://www.kali.org/tools/oletools/">oletools</a> - Analyze MS OLE2 files and MS Office documents</li>
<li><a href="https://www.kali.org/tools/penelope/">penelope</a> - Powerful shell handler</li>
<li><a href="https://www.kali.org/tools/shell-gpt/">shell-gpt</a> - Command-line productivity tool powered by AI large language models</li>
<li><a href="https://www.kali.org/tools/tailscale/">tailscale</a> - Secure connectivity platform</li>
<li><a href="https://www.kali.org/tools/tookie-osint/">tookie-osint</a> - OSINT information gathering tool for finding social media accounts</li>
<li><a href="https://www.kali.org/tools/uro/">uro</a> - Declutter URLs for crawling/pentesting</li>
</ul>
<p><em>There has also been numerous packages updates and new libraries as well. We also bump the <a href="https://www.kali.org/blog/kali-linux-2026-2-release/#linux-kernel-for-this-release-619">Kali kernel to 6.19</a>.</em></p>
<h2>Kali NetHunter Updates</h2>
<p></p><p>
<a href="https://www.kali.org/blog/kali-linux-2026-2-release/images/nethunter-eviltwin.jpg" target="_blank">
<img src="https://www.kali.org/blog/kali-linux-2026-2-release/images/nethunter-eviltwin.jpg" alt="Kali NetHunter EvilTwin">
</a>
</p>

<p>We have a tremendous amount of news for the lovers of mobile hacking! The <a href="https://store.nethunter.com/packages/com.offsec.nethunter/">Kali NetHunter app</a> <strong>launches instantly</strong> now, various <strong>bugs have been fixed</strong> with the <a href="https://www.kali.org/docs/nethunter/nethunter-custom-commands/">custom commands</a> and <a href="https://www.kali.org/docs/nethunter/nethunter-chroot-manager/">chroot manager</a> . A <strong>new EvilTwin</strong> (Wi-Fi Fake AP) tab has been added with password verification captive portal, <em>which brought along a really needed iptables fix</em>. So now after using <a href="https://www.kali.org/docs/nethunter/nethunter-wifipumpkin/">Wifipumpkin3</a> or EvilTwin, Android Hotspot will work properly. Huge thanks to the incredible work by <a href="https://gitlab.com/dr1408">@dr.rootsu</a>. The <a href="https://www.kali.org/docs/nethunter/nethunter-kernel/">kernel flasher tab</a> has also <strong>received a refresh</strong>.</p>
<p>However, this release’s spotlight is on the beginning of the <a href="https://www.kali.org/blog/kali-linux-2026-2-release/#the-qcacld30-injection-story">Qcacld-3.0 injection patch</a> wave.</p>
<h3>The Qcacld3.0 Injection Story</h3>
<p>We finally came to a milestone, shout-out to all the developers that worked on injection through the <em>years</em>!</p>
<p><a href="https://gitlab.com/kimocoder">@kimocoder</a> easily spent more than anyone else on this goal. His original injection implementation came to life, on a specific device: the OnePlus Nord (AC2003). You can find the commit <a href="https://github.com/kimocoder/android_kernel_oneplus_avicii/commit/8eb5de1047e7bf069cb4de38c3a35489b35df189">here</a>. Then <a href="https://gitlab.com/Loukious">@Loukious</a> came in the mix and his modifications made it to work on other devices with <a href="https://github.com/Loukious/android_kernel_xiaomi_sm8150/commit/18c57c61ecd8f02de778e36db6be9b41167a8825">this port</a>. Finally, <a href="https://gitlab.com/cyberknight777">@cyberknight777</a> did some housekeeping, removed unnecessary changes, logging, and restored the correct authorship while attributing @Loukious as co-author. The result, <a href="https://github.com/Neternels/android_kernel_xiaomi_sunny/commit/1a4a7d313acc75cfca9a5e97673745d721b6ccea">this patch</a> is the <strong>almost universal</strong> one which brought many devices into the injection world, starting with the ones below for both kernel 4.x and 5.x versions:</p>
<ul>
<li><a href="https://www.kali.org/docs/nethunter/installing-nethunter-on-the-oneplus-7/">OnePlus 7</a> (LineageOS 23.2)</li>
<li>OnePlus 9 / 9 Pro</li>
<li>OnePlus Nord</li>
<li>POCO X3 Pro</li>
<li>Redmi Note 10</li>
<li>Samsung A73</li>
<li><a href="https://www.kali.org/docs/nethunter/installing-nethunter-on-the-xiaomi-mi-a3/">Xiaomi Mi A3</a> (LineageOS 23.2)</li>
<li>Xiaomi Poco X3 NFC (PixelOS Android 16)</li>
<li>Xiaomi Redmi Note 8</li>
</ul>
<h3>Wifite On TV</h3>
<p></p><p>
<a href="https://www.kali.org/blog/kali-linux-2026-2-release/images/nethunter-wifite2-netflix-bloodhounds-s02e01.jpg" target="_blank">
<img src="https://www.kali.org/blog/kali-linux-2026-2-release/images/nethunter-wifite2-netflix-bloodhounds-s02e01.jpg" alt="Kali Wifite Netflix Bloodhounds S02E01">
</a>
</p>

<p>In the meantime, his continuous work on improving <a href="https://www.kali.org/tools/wifite/">wifite</a> caught some attention - spotted on Netflix twice. Not bad!</p>
<h3>Magisk Standalone Kernel Installer</h3>
<p>The kernel flasher tab <em>(still experimental on some devices)</em> is back in a new shape, giving a hint for the possible future look for the NetHunter app.</p>
<p>The <strong>Magisk standalone kernel flashing support is now here</strong> - you can simply open any newly built kernel installer zip in the Magisk app that was built using the <a href="https://gitlab.com/kalilinux/nethunter/build-scripts/kali-nethunter-installer">kali-nethunter-installer</a>.</p>
<h3>New Kernels</h3>
<p>In addition to the kernels that now support the qcacld3 injection, there are several <a href="https://nethunter.kali.org/kernels.html">new versions and phones</a>:</p>
<ul>
<li>Google Pixel 6a (LineageOS 23.2)</li>
<li>Redmi 5A (crDroid 14)</li>
<li>Samsung Note 20 Ultra (Android 13)</li>
<li><a href="https://www.kali.org/docs/nethunter/installing-nethunter-on-the-samsung-galaxy-s10/">Samsung S10</a> (LineageOS 23.2)</li>
<li>Samsung S10 5G (LineageOS 23.2)</li>
<li>Samsung S10+ (LineageOS 23.2)</li>
<li>Samsung S10e (LineageOS 23.2)</li>
</ul>
<h3>NetHunter Pro</h3>
<p>Kali bare metal now on more phones! New devices added in build thanks to the awesome work by <a href="https://github.com/taygoth">@Max Furman</a>:</p>
<ul>
<li>Fairphone FP5 (QCM6490) (fp5)</li>
<li>Google Pixel 3 (SDM845) (blueline)</li>
<li>Google Pixel 3a (SDM670) (sargo)</li>
<li>Google Pixel 3a XL SDC panel (SDM670) (bonito-sdc)</li>
<li>Google Pixel 3a XL Tianma panel (SDM670) (bonito-tianma)</li>
<li>Google Pixel 4a (SDM730) (sunfish)</li>
<li>LG G7 ThinQ (SDM845) (judyln)</li>
<li>LG V35 ThinQ (SDM845) (judyp)</li>
<li>Samsung Galaxy S9 China (SDM845) (starqltechn)</li>
<li>SHIFTphone 8 (QCM6490) (otter)</li>
<li>Sony Xperia 10 III (SM6350) (pdx213)</li>
<li>Sony Xperia XZ2 (SDM845) (xperia-tama-apollo)</li>
<li>Sony Xperia XZ2 Compact (SDM845) (xperia-tama-akari)</li>
<li>Sony Xperia XZ2 Premium (SDM845) (xperia-tama-akatsuki)</li>
<li>Xiaomi Mi 10T Lite (SM7225) (toco)</li>
<li>Xiaomi Mi 9 Pro 5G (SM8150) (tucana)</li>
<li>Xiaomi Mi 9T Pro Samsung panel (SM8150) (davinci-samsung)</li>
<li>Xiaomi Mi 9T Pro Visionox panel (SM8150) (davinci-visionox)</li>
<li>Xiaomi Mi Mix 2S (SDM845) (polaris)</li>
<li>Xiaomi Poco X3 Huaxing panel (SM7150) (surya-huaxing)</li>
<li>Xiaomi Poco X3 Tianma panel (SM7150) (surya-tianma)</li>
<li>Xiaomi Redmi Note 10 Pro (SM7150) (sweet)</li>
</ul>
<h3>NetHunter Podcast Episode 3</h3>
<p><a href="https://gitlab.com/yesimxev">@yesimxev</a> and <a href="https://www.linkedin.com/in/kristopher-wilson-208b59123">@Kristopher Wilson</a> joined for a discussion about NetHunter in cars, and leveraging AI for Bug Bounty projects and more.</p>
<div>

</div>
<h2>Kali Website Updates</h2>
<p>Since our last release, Kali 2026.1, we have been keeping the website and documentation up-to-date. Here is a quick summary of what has changed.</p>
<h3>Kali Documentation</h3>
<p>Most of the <a href="https://www.kali.org/docs/">documentation</a> updates this cycle are around NetHunter device support and the new APT sources format. Pages which got something more than a tweak:</p>
<ul>
<li><a href="https://www.kali.org/docs/development/live-build-a-custom-kali-iso/">Creating A Custom Kali ISO</a> <em>(updated)</em></li>
<li><a href="https://www.kali.org/docs/troubleshooting/handling-common-apt-errors/">Handling common APT problems</a> <em>(updated)</em></li>
<li><a href="https://www.kali.org/docs/nethunter/installing-nethunter-on-the-samsung-galaxy-s10/">Installing NetHunter on the Samsung Galaxy S10</a> <em>(updated)</em></li>
<li><a href="https://www.kali.org/docs/nethunter/installing-nethunter-on-the-ticwatch-pro-3/">Installing NetHunter on the TicWatch Pro 3</a> <em>(updated)</em></li>
<li><a href="https://www.kali.org/docs/nethunter/installing-nethunter-on-the-ticwatch-pro/">Installing NetHunter on the TicWatch Pro</a> <em>(updated)</em></li>
<li><a href="https://www.kali.org/docs/nethunter/installing-nethunter-on-the-xiaomi-mi-a2/">Installing NetHunter on the Xiaomi Mi A2</a> <em>(updated)</em></li>
<li><a href="https://www.kali.org/docs/nethunter/installing-nethunter-on-the-xiaomi-mi-a3/">Installing NetHunter on the Xiaomi Mi A3</a> <em>(updated)</em></li>
<li><a href="https://www.kali.org/docs/nethunter/">Kali NetHunter</a> <em>(updated)</em></li>
<li><a href="https://www.kali.org/docs/general-use/kali-apt-sources/">Kali Network Repositories (/etc/apt/sources.list)</a> <em>(updated)</em></li>
<li><a href="https://www.kali.org/docs/introduction/default-credentials/">Kali’s Default Credentials</a> <em>(updated)</em></li>
<li><a href="https://www.kali.org/docs/community/submitting-issues-kali-bug-tracker/">Submitting Bugs for Kali Linux</a> <em>(updated)</em></li>
</ul>
<p>We also want to say a little thank you to the following for their work on the sites:</p>
<ul>
<li><a href="https://gitlab.com/chrisjr404">@Chris Southerland Jr</a></li>
<li><a href="https://gitlab.com/mr00k3">@mr00k3</a></li>
<li><a href="https://gitlab.com/Simeon53424">@Simeon_YT</a></li>
<li><a href="https://gitlab.com/V0lk3n">@V0lk3n</a></li>
</ul>
<p>Anyone can help out, anyone can get <a href="https://www.kali.org/docs/community/contribute/">involved</a>!</p>
<h3>New Kali Mirrors</h3>
<p>We welcomed <strong>1 new mirror</strong> during this release cycle, but that’s a significant one: <strong>our first mirror in Africa!</strong> Hoping that many others will follow ;)</p>
<p>The mirror is located in <strong>South Africa</strong>, online at <a href="https://mirror.africloud.com/kali/">mirror.africloud.com</a>. It is sponsored by <a href="https://africloud.com/">AFRICLOUD</a>, and was setup thanks to Oluniyi Ajao.</p>
<p>If you have the disk space and bandwidth, <a href="https://www.kali.org/docs/community/setting-up-a-kali-linux-mirror/">we always welcome new mirrors</a>.</p>
<hr>
<h2>Get Kali Linux 2026.2</h2>
<p><strong>Fresh Images</strong></p>
<p>So what’s stopping you? Go and <a href="https://www.kali.org/get-kali/">get Kali</a> already!</p>
<p>If you cannot wait for the next release, we also produce <strong><a href="https://cdimage.kali.org/kali-images/kali-weekly/">weekly builds</a></strong> which include the latest packages at the time of download, meaning fewer updates needed on first boot. These are automated builds rather than QA’d releases like our standard <a href="https://www.kali.org/releases/">release images</a>, but we still welcome <a href="https://bugs.kali.org/">bug reports</a> on them. The earlier we catch issues, the sooner they get fixed.</p>
<p><strong>Existing Installs</strong></p>
<p>Using Kali already? Great! You can <a href="https://www.kali.org/docs/general-use/updating-kali/">keep it up-to-date</a> by doing:</p>
<pre><code class="language-console">┌──(kali㉿kali)-[~]
└─$ sudo tee /etc/apt/sources.list.d/kali.sources &lt;&lt; 'EOF'
Types: deb
URIs: http://http.kali.org/kali/
Suites: kali-rolling
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/kali-archive-keyring.gpg
EOF
[...]
┌──(kali㉿kali)-[~]
└─$ sudo apt update &amp;&amp; sudo apt -y full-upgrade
[...]
┌──(kali㉿kali)-[~]
└─$ cp -vrbi /etc/skel/. ~/
[...]
┌──(kali㉿kali)-[~]
└─$ sudo reboot -f
</code></pre>
<p><em>Remember, we recommend doing <a href="https://www.kali.org/blog/kali-linux-2026-2-release/#disruptive-package-updates">a reboot for this release</a>!</em></p>
<p>You should now be on Kali Linux 2026.2. We can double check this by doing:</p>
<pre><code class="language-console">┌──(kali㉿kali)-[~]
└─$ grep VERSION /etc/os-release
VERSION="2026.2"
VERSION_ID="2026.2"
VERSION_CODENAME="kali-rolling"
┌──(kali㉿kali)-[~]
└─$ uname -v
#1 SMP PREEMPT_DYNAMIC Kali 6.19.14-1+kali1 (2026-05-05)
┌──(kali㉿kali)-[~]
└─$ uname -r
6.19.14+kali-amd64
</code></pre>
<p><em>NOTE: The output of <code>uname -r</code> may be different depending on the system <a href="https://pkg.kali.org/pkg/linux">architecture</a>.</em></p>
<hr>
<p>As always, if you run into anything broken, please <a href="https://bugs.kali.org/">report it</a>. <em>We will never be able to fix what we do not know is broken!</em> <strong>And Social networks are not bug trackers!</strong></p>
<hr>
<p>Want to keep up-to-date easier? We’ve got you!</p>
<ul>
<li><a href="https://www.kali.org/blog/">Blog</a>? Use our <a href="https://www.kali.org/rss.xml">RSS feed</a> and <a href="https://www.kali.org/newsletter/">newsletter</a></li>
<li><a href="https://www.kali.org/get-kali/">Download</a>? We have a <a href="https://www.kali.org/torrents.xml">Torrent RSS feed</a></li>
<li><a href="https://www.kali.org/docs/community/list-of-official-kali-sites/#social-media-networks">Socials</a>? <a href="https://bsky.app/profile/kalilinux.bsky.social">Bluesky</a>, <a href="https://www.facebook.com/KaliLinux/">Facebook</a>, <a href="https://www.instagram.com/kalilinux/">Instagram</a>, <a href="https://infosec.exchange/@kalilinux">Mastodon</a> &amp; <a href="https://x.com/kalilinux">X</a></li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Tooling Announcements: Firefox Profiler Deployment (June 29, 2026)]]></title>
<description><![CDATA[The latest version of the Firefox Profiler is now live! Check out the full changelog below to see what’s changed:
Highlights:

[Markus Stange] First typed array: Allow profile.shared.stackTable.frame to be an Int32Array (#6087)
[Nazım Can Altınova] Show more user friendly errors for unsupported p...]]></description>
<link>https://tsecurity.de/weiterlesen/3604570/3632709/firefox-tooling-announcements-firefox-profiler-deployment-june-29-2026/</link>
<pubDate>Mon, 29 Jun 2026 13:09:34 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>The latest version of the <a href="https://profiler.firefox.com/" rel="noopener nofollow ugc">Firefox Profiler</a> is now live! Check out the full changelog below to see what’s changed:</p>
<p><strong>Highlights:</strong></p>
<ul>
<li>[Markus Stange] First typed array: Allow profile.shared.stackTable.frame to be an Int32Array (<a href="https://github.com/firefox-devtools/profiler/pull/6087" rel="noopener nofollow ugc">#6087</a>)</li>
<li>[Nazım Can Altınova] Show more user friendly errors for unsupported profile version in both the frontend and the cli (<a href="https://github.com/firefox-devtools/profiler/pull/6107" rel="noopener nofollow ugc">#6107</a>)</li>
<li>[fatadel] Expose counter information in profiler-cli (<a href="https://github.com/firefox-devtools/profiler/pull/6084" rel="noopener nofollow ugc">#6084</a>)</li>
</ul>
<p><strong>Other Changes:</strong></p>
<ul>
<li>[Nazım Can Altınova] Bump profiler-cli version to 0.3.0 (<a href="https://github.com/firefox-devtools/profiler/pull/6104" rel="noopener nofollow ugc">#6104</a>)</li>
<li>[Markus Stange] Split getSelfAndTotal. (<a href="https://github.com/firefox-devtools/profiler/pull/6113" rel="noopener nofollow ugc">#6113</a>)</li>
<li>[Markus Stange] Add missing transform shortcut key handling for S (focus-self) (<a href="https://github.com/firefox-devtools/profiler/pull/6117" rel="noopener nofollow ugc">#6117</a>)</li>
<li>[Markus Stange] Remove unused isInverted prop from FlameGraphCanvas. (<a href="https://github.com/firefox-devtools/profiler/pull/6116" rel="noopener nofollow ugc">#6116</a>)</li>
<li>[Markus Stange] Change sidebar splitter CSS to only apply to the sidebar, not to all splitters under .DetailsContainer (<a href="https://github.com/firefox-devtools/profiler/pull/6114" rel="noopener nofollow ugc">#6114</a>)</li>
<li>[Markus Stange] Pass callNodeInfo to handleCallNodeTransformShortcut. (<a href="https://github.com/firefox-devtools/profiler/pull/6115" rel="noopener nofollow ugc">#6115</a>)</li>
<li>[Markus Stange] Move column declarations out into a separate file (<a href="https://github.com/firefox-devtools/profiler/pull/6119" rel="noopener nofollow ugc">#6119</a>)</li>
<li>[fatadel] Keep menu panels above the selected-marker tooltip (<a href="https://github.com/firefox-devtools/profiler/pull/6125" rel="noopener nofollow ugc">#6125</a>)</li>
<li>[Nazım Can Altınova] Make sure to always sanitize source contents even when no PII sanitization is requested (<a href="https://github.com/firefox-devtools/profiler/pull/6127" rel="noopener nofollow ugc">#6127</a>)</li>
<li>[Markus Stange] Compute FlameGraphTiming rows lazily (<a href="https://github.com/firefox-devtools/profiler/pull/6126" rel="noopener nofollow ugc">#6126</a>)</li>
<li>[Markus Stange] Create a non-connected FlameGraph component (<a href="https://github.com/firefox-devtools/profiler/pull/6118" rel="noopener nofollow ugc">#6118</a>)</li>
<li>[Nazım Can Altınova] <img alt=":clockwise_vertical_arrows:" class="emoji" height="20" src="https://emoji.discourse-cdn.com/twitter/clockwise_vertical_arrows.png?v=15" title=":clockwise_vertical_arrows:" width="20"> Sync: l10n → main (June 29, 2026) (<a href="https://github.com/firefox-devtools/profiler/pull/6130" rel="noopener nofollow ugc">#6130</a>)</li>
</ul>
<p>Big thanks to our amazing localizers for making this release possible:</p>
<ul>
<li>de: Michael Köhler</li>
<li>el: Jim Spentzos</li>
<li>en-GB: Ian Neal</li>
<li>es-CL: ravmn</li>
<li>fr: Théo Chevalier</li>
<li>fur: Fabio Tomat</li>
<li>fy-NL: Fjoerfoks</li>
<li>ia: Melo46</li>
<li>it: Francesco Lodolo [:flod]</li>
<li>nl: Mark Heijl</li>
<li>ru: Valery Ledovskoy</li>
<li>sv-SE: Luna Jernberg</li>
<li>zh-TW: Pin-guang Chen</li>
</ul>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/firefox-profiler-deployment-june-29-2026/148795">Read full topic</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Do excellent vulnerability reports]]></title>
<description><![CDATA[Over the years, we have received, read and handled way over one thousand vulnerability reports filed against curl. We have seen most kinds. It is time for me to try to help future reporters by providing a short guide on how to submit a truly excellent vulnerability report to an Open Source projec...]]></description>
<link>https://tsecurity.de/weiterlesen/3604117/3632256/do-excellent-vulnerability-reports/</link>
<pubDate>Mon, 29 Jun 2026 09:55:23 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[Over the years, we have received, read and handled way over one thousand vulnerability reports filed against curl. We have seen most kinds. It is time for me to try to help future reporters by providing a short guide on how to submit a truly excellent vulnerability report to an Open Source project. Researchers We … <a href="https://daniel.haxx.se/blog/2026/06/29/do-excellent-vulnerability-reports/" class="more-link">Continue reading <span class="screen-reader-text">Do excellent vulnerability reports</span> <span class="meta-nav">→</span></a>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.5]]></title>
<description><![CDATA[chore: bump version to 16.2.5]]></description>
<link>https://tsecurity.de/weiterlesen/3603440/3631579/v1625/</link>
<pubDate>Sun, 28 Jun 2026 23:39:21 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.2.5</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.4]]></title>
<description><![CDATA[chore: bump version to 16.2.4]]></description>
<link>https://tsecurity.de/weiterlesen/3603293/3631432/v1624/</link>
<pubDate>Sun, 28 Jun 2026 20:53:39 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.2.4</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.3]]></title>
<description><![CDATA[@oh-my-pi/pi-agent-core
Changed

Enabled V2 streaming remote compaction by default for compatible AI and OpenAI-compatible models, which forwards full conversation history to the provider and supports session routing, prompt caching, provider-native tool history replay, transient error retries, a...]]></description>
<link>https://tsecurity.de/weiterlesen/3603087/3631226/v1623/</link>
<pubDate>Sun, 28 Jun 2026 18:09:21 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-agent-core</h2>
<h3>Changed</h3>
<ul>
<li>Enabled V2 streaming remote compaction by default for compatible AI and OpenAI-compatible models, which forwards full conversation history to the provider and supports session routing, prompt caching, provider-native tool history replay, transient error retries, and configurable timeouts.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed an issue where assistant responses and encrypted reasoning could be lost during local history trimming.</li>
<li>Added <code>title_change</code> session metadata to the compaction entry type union to maintain type compatibility for hosts with title audit entries.</li>
</ul>
<h2>@oh-my-pi/pi-ai</h2>
<h3>Changed</h3>
<ul>
<li>Enabled automatic removal of leaked reasoning tags for all models</li>
<li>Prevented reasoning text duplication when models emit both structured and inline thinking</li>
<li>Defaulted reasoning context to all turns for all Codex requests.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Enabled freeform tool patch support for Azure OpenAI and Codex models.</li>
<li>Fixed an issue where the <code>/usage show</code> command returned "No usage data available" when using a custom proxy base URL for Codex.</li>
</ul>
<h2>@oh-my-pi/pi-catalog</h2>
<h3>Added</h3>
<ul>
<li>Added support and configuration parameters for V2 streaming compaction in RemoteCompactionConfig, catalog types, and model/provider metadata.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Enabled automatic content markup healing for all OpenAI-compatible streaming models</li>
<li>Updated pricing and context window limits for several catalog models.</li>
<li>Disabled reasoning capability for multiple providers in the catalog.</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Added</h3>
<ul>
<li>Added support for multiple configurable advisors via WATCHDOG.yml/WATCHDOG.yaml files, allowing per-advisor models, tool subsets, and instructions.</li>
<li>Added /advisor configure, a full-screen, mouse-driven TUI to easily manage the advisor roster, configure models, toggle tool permissions, and edit instructions.</li>
<li>Added full unified edit diffs to advisor transcripts, allowing advisors to see changes directly without re-reading files.</li>
<li>Added the statusLine.compactThinkingLevel setting to render the model segment's thinking level as a single leading glyph instead of a separate text suffix.</li>
<li>Added support for tracking reasoning tokens in session and advisor statistics.</li>
<li>Added Remote Compaction V2 streaming configuration settings (compaction.remoteStreamingV2Enabled and compaction.v2RetainedMessageBudget) to control token budgets and toggle V2 streaming for remote compaction.</li>
<li>Added the edit.citationTags setting to emit model-facing hashline section headers as OpenAI citation markers with opaque source IDs, along with citation-marker unwrapping for hashline edit parsing, diff previews, and streaming matching.</li>
<li>Added mutable session titles with automatic replan title refreshes and configurable idle recaps.</li>
<li>Added support for incremental yield submissions with typed sections and final results for subagents.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Reduced session file size by removing redundant thinking signatures already present in payloads</li>
<li>Advisors can now be granted any built-in agent tool (including edit, write, and bash), removing the previous read-only restriction.</li>
<li>Improved the debug log and raw SSE stream viewers with a wider, bordered overlay, clearer status indicators, dynamic layouts, and mouse support for scrolling and interaction.</li>
<li>Updated the idle recap feature to use an LLM-generated summary of where things stand (anchored by the live goal and active todo task) instead of a static status line.</li>
<li>Refined interrupted thinking system instructions to encourage smoother continuation.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed array-typed output schema validation by correctly assembling incremental yields into lists.</li>
<li>Fixed OpenAI/Codex compatibility by removing top-level schema combinators from tool parameters.</li>
<li>Fixed validation errors for untyped final yields in strict-mode providers by allowing null types.</li>
<li>Fixed Alt+M default-role model configuration being disabled by the current session's context size.</li>
<li>Fixed MCP type: "sse" servers by adding the legacy HTTP+SSE endpoint handshake and streaming JSON-RPC response path.</li>
<li>Fixed interrupted reasoning blocks being incorrectly stripped when they contained a valid signature.</li>
<li>Fixed interrupted thinking being lost in LLM provider requests after user interrupts by properly stripping trailing reasoning blocks from assistant turns while preserving them in the UI and session history.</li>
<li>Fixed the live todo HUD going stale during long tool-use loops by introducing a mid-run reconciliation reminder that prompts the agent to update incomplete items.</li>
<li>Fixed resumed OpenAI and OpenAI-Codex sessions losing encrypted reasoning and native assistant turns during rehydration.</li>
<li>Fixed the ask tool's custom answer editor dropping the original question and option list while typing.</li>
<li>Fixed auto-snapcompact failing the session on local blockers (such as text-only active models, high non-ASCII transcripts, or context budget overflows) by gracefully downgrading automatic maintenance to context-full compaction.</li>
<li>Fixed autoresearch's before_agent_start handler crashing when the system prompt was undefined.</li>
<li>Fixed OMP exiting silently during startup when encountering standalone Codex hook scripts in ~/.codex/hooks/.</li>
<li>Fixed unreachable keyboard shortcuts in HTML session exports by changing the "toggle thinking" and "toggle tools" shortcuts from Ctrl+T and Ctrl+O to bare T and O keys.</li>
<li>Fixed user-invoked /skill: prompts reaching model providers as developer turns instead of user turns, including during compaction.</li>
<li>Fixed reasoning streaming being locked off for OpenAI-compatible providers that stream reasoning content without advertising reasoning support in model metadata.</li>
<li>Fixed /shake and other mid-stream chat rebuilds erasing live LLM output by preserving the in-flight streaming components and pending tools.</li>
<li>Fixed the time_spent status-line segment ticking continuously during idle sessions by ensuring it only accumulates active agent execution windows and resets correctly across session switches.</li>
<li>Fixed expanded pending SSH previews committing provisional rows to native scrollback before the final result render.</li>
<li>Fixed ssh:// rejecting POSIX-capable remotes whose login-shell classification was ambiguous by verifying a working transfer shell directly and gating transfers on that capability.</li>
</ul>
<h3>Removed</h3>
<ul>
<li>Removed history URI support for reading agent transcripts</li>
</ul>
<h2>@oh-my-pi/omp-stats</h2>
<h3>Added</h3>
<ul>
<li>Support for parsing named advisor transcripts using the <code>__advisor.&lt;slug&gt;.jsonl</code> naming convention.</li>
</ul>
<h2>@oh-my-pi/pi-tui</h2>
<h3>Added</h3>
<ul>
<li>Added a desktop notification fallback for Linux terminals using D-Bus (via notify-send or gdbus), enabling completion and prompt notifications in VTE-family terminals (such as GNOME Terminal, Ptyxis, Tilix), Alacritty, and xterm. This is automatically skipped for terminals with native notification support (like VS Code and Warp) and can be disabled using the PI_NO_DESKTOP_NOTIFY=1 environment variable.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed slash skill autocomplete not opening when there is existing prompt text, ensuring mid-prompt slash lookups correctly display and insert skill commands.</li>
<li>Fixed modified Enter and keyboard shortcuts in fullscreen overlays for terminals using the xterm modifyOtherKeys fallback (such as iTerm2 when Kitty keyboard negotiation is unavailable).</li>
</ul>
<h2>@oh-my-pi/pi-utils</h2>
<h3>Added</h3>
<ul>
<li>Added <code>escapeXmlAttribute</code> utility function for safe XML attribute value encoding.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed a crash in <code>ptree.ChildProcess.bytes()</code> and the <code>ssh://</code> read path when handling large subprocess outputs (over 128 KB) under Bun by ensuring it consistently returns a <code>Uint8Array</code>.</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix(tui): open mid-prompt skill autocomplete by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4758447888" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3657" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3657/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3657">#3657</a></li>
<li>fix(tui): preserve in-flight assistant turn across /shake rebuilds by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4758461749" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3658" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3658/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3658">#3658</a></li>
<li>fix(compaction): fall back from auto-snapcompact on text-only models by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4758585650" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3661" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3661/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3661">#3661</a></li>
<li>fix(autoresearch): guard before_agent_start against undefined event.systemPrompt by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4758968334" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3667" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3667/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3667">#3667</a></li>
<li>fix(export): use browser-safe single-key toggles in HTML export by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4759249175" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3671" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3671/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3671">#3671</a></li>
<li>fix(tui): allow thinking toggle after streamed reasoning by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4759250805" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3672" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3672/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3672">#3672</a></li>
<li>fix(ai): ignore non-canonical codex baseUrl for wham/usage by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4759849380" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3682" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3682/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3682">#3682</a></li>
<li>fix(extensions): isolate codex hook scripts so process.exit cannot kill OMP startup by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4759861840" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3683" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3683/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3683">#3683</a></li>
<li>fix(tui): track active processing time for time_spent status segment by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4759892075" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3684" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3684/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3684">#3684</a></li>
<li>fix(tui): use OSC 9 notifications for VTE terminals by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4760151561" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3687" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3687/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3687">#3687</a></li>
<li>fix(coding-agent): present user skill prompts as user turns by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4761058923" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3699" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3699/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3699">#3699</a></li>
<li>fix(coding-agent): preserve queued skill invocations by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4761070999" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3700" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3700/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3700">#3700</a></li>
<li>fix(tui): keep Shift+Enter enhanced in iTerm fallback overlays by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4761297085" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3706" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3706/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3706">#3706</a></li>
<li>fix(coding-agent): keep Alt+M default role selectable over context by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4761410375" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3709" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3709/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3709">#3709</a></li>
<li>fix(mcp): support legacy SSE transport by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4761507119" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3711" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3711/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3711">#3711</a></li>
<li>fix(utils): normalize ptree.bytes() to Uint8Array by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4761865940" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3713" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3713/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3713">#3713</a></li>
<li>fix(ssh): pinned expanded pending preview commit-unstable by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4761959232" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3716" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3716/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3716">#3716</a></li>
<li>fix(ssh): gate ssh:// transfers on verified POSIX shell capability by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4762116112" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3722" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3722/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3722">#3722</a></li>
<li>fix(providers): keep runtime headers live by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4762468882" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3726" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3726/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3726">#3726</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v16.2.2...v16.2.3"><tt>v16.2.2...v16.2.3</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.2]]></title>
<description><![CDATA[chore: bump lockfile]]></description>
<link>https://tsecurity.de/weiterlesen/3601364/3629503/v1622/</link>
<pubDate>Sat, 27 Jun 2026 13:38:20 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump lockfile</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.1]]></title>
<description><![CDATA[@oh-my-pi/pi-coding-agent
Added

Included project context files (AGENTS.md, etc.) in the advisor's system prompt to ensure adherence to user-defined project rules
Added project context files (AGENTS.md and the like) to the advisor's system prompt, so the read-only reviewer judges against the user...]]></description>
<link>https://tsecurity.de/weiterlesen/3600819/3628958/v1621/</link>
<pubDate>Sat, 27 Jun 2026 06:53:47 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Added</h3>
<ul>
<li>Included project context files (AGENTS.md, etc.) in the advisor's system prompt to ensure adherence to user-defined project rules</li>
<li>Added project context files (AGENTS.md and the like) to the advisor's system prompt, so the read-only reviewer judges against the user's standing project rules the same way the main agent does.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed live ACP <code>generate_image</code> updates resolving OMP-internal image blob refs before sending renderable image content to clients. (<a href="https://github.com/can1357/oh-my-pi/issues/3623" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3623/hovercard">#3623</a>)</li>
<li>Fixed Claude marketplace plugin <code>.mcp.json</code> MCP servers to expand environment variables in <code>url</code> and <code>headers</code> before connecting. (<a href="https://github.com/can1357/oh-my-pi/issues/3621" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3621/hovercard">#3621</a>)</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix(mcp): expand Claude plugin MCP header env vars by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4756518363" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3622" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3622/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3622">#3622</a></li>
<li>fix(acp): resolve generated image blob refs in live updates by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4756623909" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3625" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3625/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3625">#3625</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v16.2.0...v16.2.1"><tt>v16.2.0...v16.2.1</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.2.0]]></title>
<description><![CDATA[chore: bump version to 16.2.0]]></description>
<link>https://tsecurity.de/weiterlesen/3600758/3628897/v1620/</link>
<pubDate>Sat, 27 Jun 2026 04:50:59 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.2.0</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.23]]></title>
<description><![CDATA[chore: bump version to 16.1.23]]></description>
<link>https://tsecurity.de/weiterlesen/3599938/3628077/v16123/</link>
<pubDate>Fri, 26 Jun 2026 18:39:39 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.23</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[A curl mountain movie]]></title>
<description><![CDATA[One of my favorite visuals for known vulnerabilities in curl is the mountain. It shows how many currently known vulnerabilities were present in the code through-out curl’s history. In the end of June 2026 it looks like this: Over time we get more vulnerabilities reported. Since every flaw has a v...]]></description>
<link>https://tsecurity.de/weiterlesen/3599075/3627214/a-curl-mountain-movie/</link>
<pubDate>Fri, 26 Jun 2026 13:38:24 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[One of my favorite visuals for known vulnerabilities in curl is the mountain. It shows how many currently known vulnerabilities were present in the code through-out curl’s history. In the end of June 2026 it looks like this: Over time we get more vulnerabilities reported. Since every flaw has a version range during which the … <a href="https://daniel.haxx.se/blog/2026/06/26/a-curl-mountain-movie/" class="more-link">Continue reading <span class="screen-reader-text">A curl mountain movie</span> <span class="meta-nav">→</span></a>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.22]]></title>
<description><![CDATA[chore: bump version to 16.1.22]]></description>
<link>https://tsecurity.de/weiterlesen/3598451/3626590/v16122/</link>
<pubDate>Fri, 26 Jun 2026 09:23:45 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.22</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.21]]></title>
<description><![CDATA[chore: bump version to 16.1.21]]></description>
<link>https://tsecurity.de/weiterlesen/3598265/3626404/v16121/</link>
<pubDate>Fri, 26 Jun 2026 07:53:17 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.21</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.20]]></title>
<description><![CDATA[chore: bump version to 16.1.20]]></description>
<link>https://tsecurity.de/weiterlesen/3597707/3625846/v16120/</link>
<pubDate>Thu, 25 Jun 2026 22:52:58 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.20</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Tooling Announcements: MozPhab 2.15.3 Released]]></title>
<description><![CDATA[Bugs resolved in Moz-Phab 2.15.3:

bug 2049293 [moz-phab] Init errors get swallowed by Jujutsu backend
bug 2049296 [moz-phab] Add jj util backend name check for Jujutsu integration

Discuss these changes in #engineering-workflow on Slack or #Conduit Matrix.
            1 post - 1 participant
    ...]]></description>
<link>https://tsecurity.de/weiterlesen/3597636/3625775/firefox-tooling-announcements-mozphab-2153-released/</link>
<pubDate>Thu, 25 Jun 2026 22:08:00 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Bugs resolved in Moz-Phab 2.15.3:</p>
<ul>
<li><a href="https://bugzilla.mozilla.org/2049293">bug 2049293</a> [moz-phab] Init errors get swallowed by Jujutsu backend</li>
<li><a href="https://bugzilla.mozilla.org/2049296">bug 2049296</a> [moz-phab] Add <code>jj util backend name</code> check for Jujutsu integration</li>
</ul>
<p>Discuss these changes in <span class="hashtag-raw">#engineering-workflow</span> on Slack or <span class="hashtag-raw">#Conduit</span> Matrix.</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/mozphab-2-15-3-released/148767">Read full topic</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Thunderbird Monthly Development Digest: June 2026]]></title>
<description><![CDATA[Welcome back from the Thunderbird development team! The past few months have been exceptionally busy across the project. As we approach the midpoint of the year, we’ve been focused on a mixture of delivering user-facing features, investing in long-term architectural improvements, and preparing fo...]]></description>
<link>https://tsecurity.de/weiterlesen/3597489/3625628/thunderbird-monthly-development-digest-june-2026/</link>
<pubDate>Thu, 25 Jun 2026 20:38:50 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Welcome back from the Thunderbird development team! The past few months have been exceptionally busy across the project. As we approach the midpoint of the year, we’ve been focused on a mixture of delivering user-facing features, investing in long-term architectural improvements, and preparing for the next ESR cycle. A significant amount of effort has gone […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/06/thunderbird-monthly-development-digest-june-2026/">Thunderbird Monthly Development Digest: June 2026</a> appeared first on <a href="https://blog.thunderbird.net/">The Thunderbird Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.19]]></title>
<description><![CDATA[chore: bump version to 16.1.19]]></description>
<link>https://tsecurity.de/weiterlesen/3596138/3624277/v16119/</link>
<pubDate>Thu, 25 Jun 2026 13:24:11 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.19</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Trailing dots are the worst]]></title>
<description><![CDATA[Trailing dots after hostnames in URLs remain my worst enemies. I wrote about several problems with them in the past that involved those nasty things. They are still painful. When we shipped curl 8.21.0 on June 24 2026 we fixed at least three brand new problems that involved trailing dots. C’mon, ...]]></description>
<link>https://tsecurity.de/weiterlesen/3595576/3623715/trailing-dots-are-the-worst/</link>
<pubDate>Thu, 25 Jun 2026 09:54:10 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[Trailing dots after hostnames in URLs remain my worst enemies. I wrote about several problems with them in the past that involved those nasty things. They are still painful. When we shipped curl 8.21.0 on June 24 2026 we fixed at least three brand new problems that involved trailing dots. C’mon, follow me down the … <a href="https://daniel.haxx.se/blog/2026/06/25/trailing-dots-are-the-worst/" class="more-link">Continue reading <span class="screen-reader-text">Trailing dots are the worst</span> <span class="meta-nav">→</span></a>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.18]]></title>
<description><![CDATA[chore: bump version to 16.1.18]]></description>
<link>https://tsecurity.de/weiterlesen/3595145/3623284/v16118/</link>
<pubDate>Thu, 25 Jun 2026 05:22:40 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.18</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[This Week In Rust: This Week in Rust 657]]></title>
<description><![CDATA[Hello and welcome to another issue of This Week in Rust!
Rust is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
@thisweekinrust.bsky.social on Bluesky or
@ThisWeekinRu...]]></description>
<link>https://tsecurity.de/weiterlesen/3595083/3623222/this-week-in-rust-this-week-in-rust-657/</link>
<pubDate>Thu, 25 Jun 2026 04:09:06 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social, or
<a href="https://github.com/rust-lang/this-week-in-rust">send us a pull request</a>.
Want to get involved? <a href="https://github.com/rust-lang/rust/blob/main/CONTRIBUTING.md">We love contributions</a>.</p>
<p><em>This Week in Rust</em> is openly developed <a href="https://github.com/rust-lang/this-week-in-rust">on GitHub</a> and archives can be viewed at <a href="https://this-week-in-rust.org/">this-week-in-rust.org</a>.
If you find any errors in this week's issue, <a href="https://github.com/rust-lang/this-week-in-rust/pulls">please submit a PR</a>.</p>
<p>Want TWIR in your inbox? <a href="https://this-week-in-rust.us11.list-manage.com/subscribe?u=fd84c1c757e02889a9b08d289&amp;id=0ed8b72485">Subscribe here</a>.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4>


<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#foundation">Foundation</a></h5>
<ul>
<li><a href="https://rustfoundation.org/media/rust-foundation-welcomes-openai-as-platinum-member-announces-donation-to-rust-project/">Rust Foundation Welcomes OpenAI As Platinum Member</a></li>
<li><a href="https://rustfoundation.org/media/rust-commercial-network-launches-to-bring-commercial-users-of-rust-language-together/">Rust Commercial Network Launches to Unite Commercial Users of Rust</a></li>
<li><a href="https://rustfoundation.org/media/mainmatter-is-bringing-hands-on-rust-training-to-upskilling-week-in-barcelona/">Mainmatter Is Bringing Hands-On Rust Training</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#newsletters">Newsletters</a></h5>
<ul>
<li><a href="https://www.theembeddedrustacean.com/p/the-embedded-rustacean-issue-74">The Embedded Rustacean Issue #74</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://bevy.org/news/bevy-0-19">Bevy 0.19</a></li>
<li><a href="https://blog.image-rs.org/2026/06/18/png-adoption.html">Rust PNG crate gets even faster, used by GNOME and Chromium</a></li>
<li><a href="https://github.com/kunobi-ninja/kache/releases/tag/v0.7.0">kache 0.7.0: caching real-world C/C++ trees</a></li>
<li><a href="https://www.willsearch.com.br/blog/2026/06/23/new-feature-in-guardiandb-introducing-the-odm-object-document-mapper-layer/">New Feature in GuardianDB: Introducing the ODM (Object Document Mapper) Layer</a></li>
<li><a href="https://shnatsel.medium.com/safe-simd-in-rust-even-on-the-inside-c6f1ff381828">Safe SIMD in Rust, even on the inside</a></li>
<li><a href="https://ratatui.rs/highlights/v0302/">Ratatui 0.30.2 is released - a Rust library for cooking up terminal user interfaces</a></li>
<li><a href="https://dev.to/alexandr_litvinov/adding-a-post-quantum-hybrid-handshake-to-a-rust-vpn-pk8">Adding a post-quantum hybrid handshake to a Rust VPN</a></li>
<li><a href="https://tensor4all.org/blog/introducing-tenferro-rs/">From Julia to Rust: a differentiable tensor stack for scientific computing in the agentic AI era</a></li>
<li><a href="https://hotpath.rs/blog/profiling-async-rust">hotpath-rs 0.18: Profiling Async and Concurrent Rust - Channels and Lock Contention</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5>
<ul>
<li><a href="https://blog.cloudflare.com/hyper-bug/">How we found a bug in the hyper HTTP library</a></li>
<li><a href="https://corrode.dev/podcast/s06e06-clickhouse/">ClickHouse with Alexey Milovidov and Austin Bonander</a></li>
<li><a href="https://kerkour.com/iroh-v1-p2p">Deep dive into iroh: A replacement for WireGuard or a peer-to-peer layer for your application?</a></li>
<li><a href="https://kobzol.github.io/rust/2026/06/21/optimizing-sqlx-test-rebuild-time.html">Optimizing #[sqlx::test] rebuild time</a></li>
<li><a href="https://bitfieldconsulting.com/posts/rewrite-in-rust">Rewriting the world in Rust</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5>
<ul>
<li><a href="https://docs.litellm.ai/blog/litellm-rust-launch">Migrating LiteLLM to Rust - Building the Fastest and Litest AI Gateway</a></li>
<li><a href="https://medium.com/@shnatsel/safe-simd-in-rust-even-on-the-inside-c6f1ff381828">Safe SIMD in Rust, even on the inside</a></li>
<li><a href="https://blog.sheerluck.dev/posts/learn-rust-async-await-by-building-an-http-server/">Learn Rust Async/Await, Tokio, and TCP Networking by Building an HTTP/1.1 Server</a></li>
<li><a href="https://blog.sheerluck.dev/posts/build-breakout-in-bevy-step-by-step/">Building Breakout in Bevy: Step by Step</a></li>
<li><a href="https://medium.com/@vbasky/porting-200-000-lines-of-c-to-rust-building-a-byte-identical-mediainfo-replacement-8e9b587d469a">Porting 300,000 Lines of C++ and Perl to Rust: A Dual-Oracle Media Metadata Engine</a></li>
<li><a href="https://corentin-core.github.io/posts/ruxe-type-level-disjointness/">A data race that doesn't compile</a></li>
<li>[video] <a href="https://www.youtube.com/watch?v=RKojTb9IVJc">RustCurious lesson 9: Traits are Interfaces</a></li>
<li>[Video] <a href="https://www.youtube.com/watch?v=X8GDc2AtbG8">BAML: a new programming language (created in Rust)</a></li>
<li>[Video] <a href="https://www.youtube.com/watch?v=O3YWQvNqwHc">The Future of Version Control</a></li>
<li>[Video] <a href="https://www.youtube.com/watch?v=1Xz1E_27Uqc">Borrowing Beauty: My Beginner's Quest to Create Approachable Bevy &amp; Rust Code</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#crate-of-the-week">Crate of the Week</a></h4>
<p>This week's crate is <a href="https://github.com/orium/cargo-rdme">cargo-rdme</a>, a </p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1616">Diogo Sousa</a> for the self-suggestion!</p>
<p><a href="https://users.rust-lang.org/t/crate-of-the-week/2704">Please submit your suggestions and votes for next week</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#calls-for-testing">Calls for Testing</a></h4>
<p>An important step for RFC implementation is for people to experiment with the
implementation and give feedback, especially before stabilization.</p>
<p>If you are a feature implementer and would like your RFC to appear in this list, add a
<code>call-for-testing</code> label to your RFC along with a comment providing testing instructions and/or
guidance on which aspect(s) of the feature need testing.</p>
<p><em>No calls for testing were issued this week by
<a href="https://github.com/rust-lang/rust/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rust</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/rustup/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rustup</a> or
<a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing%20state%3Aopen">Rust language RFCs</a>.</em></p>
<p><a href="https://github.com/rust-lang/this-week-in-rust/issues">Let us know</a> if you would like your feature to be tracked as a part of this list.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#call-for-participation-projects-and-speakers">Call for Participation; projects and speakers</a></h4>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-projects">CFP - Projects</a></h5>
<p>Always wanted to contribute to open-source projects but did not know where to start?
Every week we highlight some tasks from the Rust community for you to pick and get started!</p>
<p>Some of these tasks may also have mentors available, visit the task page for more information.</p>




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



<p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4>
<p>515 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-06-16..2026-06-23">merged in the last week</a></p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/157926">implement <code>#[diagnostic::on_unknown]</code> for modules</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158042">outline part of <code>evaluate_goal_raw</code> into its own <code>#[cold]</code> function</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157967">preserve <code>track_caller</code> for by-value dyn vtable shims</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#library">Library</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/156983">add <code>io::Read::read_le</code> and <code>io::Read::read_be</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155616">constify <code>TryFrom&lt;Vec&gt;</code> for array</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157878"><code>impl [const] Default for BTreeMap</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157912">stabilize <code>str_from_utf16_endian</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/158012">stabilize <code>strip_circumfix</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/141266">stabilize <code>substr_range</code> and <code>subslice_range</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/cargo/pull/17112"><code>diag</code>: Support <code>build.warnings</code> for cargo lints</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17117"><code>add</code>: list too-new versions and how to override</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17123"><code>host-config</code>: dont apply target config to host artifacts</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17107"><code>install</code>: Run cargo lints like rustc lints</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17118"><code>resolver</code>: hint how to resolve too-new versions</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17127"><code>test</code>: skip dwp uplift test without packed debuginfo</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17110">add Solaris fcntl file locking</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17012"><code>-Zmin-publish-age</code></a> (RFC <a href="https://rust-lang.github.io/rfcs/3923-cargo-min-publish-age.html">#3923</a>)</li>
<li><a href="https://github.com/rust-lang/cargo/pull/17108">improved the test error messages when 'rustc -V' fails</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17115">remove windows-sys dependencies older than 0.61</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16931">add lint to suggest <code>as_chunks</code> over <code>chunks_exact</code> with constant</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16252">new <code>unnecessary_unwrap_unchecked</code>: lint</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/15907"><code>extra_unused_type_parameters</code>: don't suggest an autofix</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17001"><code>let_underscore_future</code>: skip bindings with an explicit type annotation</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16976">avoid ICE when evaluating constants containing unsized type args</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16928">avoid <code>map_unwrap_or</code> fix when default is adjusted</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17256">do not check for unused lifetimes in expanded code</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17249">don't trigger <code>unnecessary_box_returns</code> when the size depends on generics</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17243">find a shared context for the format string and the <code>format!</code> call</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17205">fix OOM panic for large types on uninit check</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16964">fix <code>std_instead_of_core</code>: false positives for <code>core::io</code>/MSRV</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16926"><code>manual_slice_fill</code> detect for in loops over <code>&amp;mut [T; N]</code> slices</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17239">merge comment and cfg checking in <code>matches</code> lint pass</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17266">perf: check the method name first in <code>or_fun_call</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17265">perf: compare method names before type queries in three lint passes</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17275">perf: run structural checks before const context queries in <code>question_mark, manual_clamp</code> and ranges</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17272">perf: skip <code>match_same_arms</code> work when the lint is allowed</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17226">perf: skip tokenizing in <code>span_contains_cfg</code> when no '#' is present</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17278">treat <code>!</code> the same as <code>-</code> in <code>unnecessary_cast</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-analyzer">Rust-Analyzer</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22618"><code>assists/replace_match_with_if_let</code>: don't parenthesize if-let guards</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22617"><code>implements_trait_unique_with_infcx</code>: only forbid the self type from being an error type</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22516">bye bye ted</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22627">do not visit nodes in GC multiple times</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22594">MIR eval mixed bit and byte sizes</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22599">check for <code>#[cfg]s</code> in tail expression macros</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22601">crash on static constants in array length positions</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22486">don't complete <code>.await</code> on receivers of unknown type</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22621">don't panic on out-of-range integer literals in const positions</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22351">migrate merge imports to editor</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5>
<p>This week had a lot of big swings, with two significant perf regressions that are accepted
because they unlock future features and perf improvements.
We also saw large improvements in the next trait solver due to the performance optimization work happening there.</p>
<p>Triage done by <strong>@JonathanBrouwer</strong> with help from <strong>@Kobzol</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=b5d46ecb51c3e4134b82570cfe718f093daa6390&amp;end=8b6558a02b2774acfb25cf15e199467c37ba7490&amp;absolute=false&amp;stat=instructions%3Au">b5d46ecb..8b6558a0</a></p>
<p><strong>Summary</strong>:</p>
<table>
<thead>
<tr>
<th>(instructions:u)</th>
<th>mean</th>
<th>range</th>
<th>count</th>
</tr>
</thead>
<tbody>
<tr>
<td>Regressions ❌ <br> (primary)</td>
<td>0.9%</td>
<td>[0.2%, 2.7%]</td>
<td>184</td>
</tr>
<tr>
<td>Regressions ❌ <br> (secondary)</td>
<td>1.0%</td>
<td>[0.1%, 4.2%]</td>
<td>160</td>
</tr>
<tr>
<td>Improvements ✅ <br> (primary)</td>
<td>-0.3%</td>
<td>[-0.3%, -0.2%]</td>
<td>2</td>
</tr>
<tr>
<td>Improvements ✅ <br> (secondary)</td>
<td>-11.8%</td>
<td>[-69.9%, -0.2%]</td>
<td>25</td>
</tr>
<tr>
<td>All ❌✅ (primary)</td>
<td>0.8%</td>
<td>[-0.3%, 2.7%]</td>
<td>186</td>
</tr>
</tbody>
</table>
<p>5 Regressions, 3 Improvements, 2 Mixed; 4 of them in rollups
30 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/660052c17ccde865dff7c7ffd525affa0550c846/triage/2026/2026-06-21.md">Full report here</a></p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#approved-rfcs"></a><a href="https://github.com/rust-lang/rfcs/commits/master">Approved RFCs</a></h5>
<p>Changes to Rust follow the Rust <a href="https://github.com/rust-lang/rfcs#rust-rfcs">RFC (request for comments) process</a>. These
are the RFCs that were approved for implementation this week:</p>
<ul>
<li><em>No RFCs were approved this week.</em></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#final-comment-period">Final Comment Period</a></h5>
<p>Every week, <a href="https://www.rust-lang.org/team.html">the team</a> announces the 'final comment period' for RFCs and key PRs
which are reaching a decision. Express your opinions now.</p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust"></a><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Rust</a>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/157497">rustc_lint: Allow scoped <code>non_ascii_idents</code> lint levels</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157857">Stabilize <code>#[my_macro] mod foo;</code> (part of <code>proc_macro_hygiene</code>)</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/134021">Implement <code>IntoIterator</code> for <code>[&amp;[mut]] Box&lt;[T; N], A&gt;</code></a></li>
<li><a href="https://github.com/rust-lang/rust/issues/129436">Tracking Issue for <code>string_from_utf8_lossy_owned</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156508">Infer all anonymous lifetimes in assoc consts as <code>'static</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157820">consider subtyping when checking if an infer var is sized</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156749">remove <code>box_patterns</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156976">enable eager <code>param_env</code> norm in new solver</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/153563">Lint against iterator functions that panic when <code>N</code> is zero</a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#leadership-council"></a><a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a>
<ul>
<li><a href="https://github.com/rust-lang/leadership-council/issues/298">Start a t-project-structure/t-comprehensibility</a></li>
</ul>
<p><em>No Items entered Final Comment Period this week for
<a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/compiler-team/issues?q=label%3Amajor-change%20label%3Afinal-comment-period%20state%3Aopen">Compiler Team</a> <a href="https://forge.rust-lang.org/compiler/mcp.html">(MCPs only)</a>,
<a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a>,
<a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Team</a>,
<a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</a> or
<a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Unsafe Code Guidelines</a>.</em></p>
<p>Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"></a><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h5>
<ul>
<li><em>No New or Updated RFCs were created this week.</em></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4>
<p>Rusty Events between 2026-06-24 - 2026-07-22 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-06-25 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/rust-girona?e=evt-rgneLvX1H85AmjV"><strong>Rust Girona Weekly Session</strong></a></li>
</ul>
</li>
<li>2026-07-01 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/315210366/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455932/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Virtual (Charlottesville, VA, US) | <a href="https://www.meetup.com/charlottesville-rust-meetup">Charlottesville Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/charlottesville-rust-meetup/events/315211402/"><strong>Learning Game Development the Hard Way with Rust and Bevy</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Virtual (Nürnberg, DE) | <a href="https://www.meetup.com/rust-noris">Rust Nuremberg</a><ul>
<li><a href="https://www.meetup.com/rust-noris/events/313345243/"><strong>Rust Nürnberg online</strong></a></li>
</ul>
</li>
<li>2026-07-04 | Virtual (Kampala, UG) | <a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763176587">Rust Circle Meetup</a><ul>
<li><a href="https://www.eventbrite.com/e/rust-circle-meetup-tickets-628763176587"><strong>Rust Circle Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-05 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314095287/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-07 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/315060981/"><strong>👋 Community Catch Up</strong></a></li>
</ul>
</li>
<li>2026-07-14 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254778/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-07-15 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-16 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/312045926/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-19 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314329045/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/315102297/"><strong>Lunch &amp; Learn: Learning Rust as First Programming Language</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Virtual (Washington, DC, US) | <a href="https://www.meetup.com/rustdc">Rust DC</a><ul>
<li><a href="https://www.meetup.com/rustdc/events/315279653/"><strong>Mid-month Rustful</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#asia">Asia</a></h5>
<ul>
<li>2026-07-18 | Bangalore, IN | <a href="https://hasgeek.com/rustbangalore">Rust Bangalore</a><ul>
<li><a href="https://hasgeek.com/rustbangalore/july-2026-rustacean-meetup/"><strong>July 2026 Rustacean Meetup</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#europe">Europe</a></h5>
<ul>
<li>2026-06-24 | Manchester, UK | <a href="https://www.meetup.com/rust-manchester">Rust Manchester</a><ul>
<li><a href="https://www.meetup.com/rust-manchester/events/315200163/"><strong>Rust Manchester June Talks</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Trondheim, NO | <a href="https://www.meetup.com/rust-trondheim">Rust Trondheim</a><ul>
<li><a href="https://www.meetup.com/rust-trondheim/events/315298357/"><strong>The Chaos of Time and Time Intervals</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/314396600/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Copenhagen, DK | <a href="https://www.meetup.com/copenhagen-rust-community">Copenhagen Rust Community</a><ul>
<li><a href="https://www.meetup.com/copenhagen-rust-community/events/315214426/"><strong>Rust meetup #69</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Toulouse, FR | <a href="https://www.meetup.com/rust-community-toulouse/">Rust Toulouse</a><ul>
<li><a href="https://www.meetup.com/rust-community-toulouse/events/314947457/"><strong>Rust Toulouse Meetup - Bevy &amp; ESP32</strong></a></li>
</ul>
</li>
<li>2026-06-27 | Stockholm, SE | <a href="https://www.meetup.com/stockholm-rust">Stockholm Rust</a><ul>
<li><a href="https://www.meetup.com/stockholm-rust/events/315371143/"><strong>Ferris' Fika Forum #27</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Edinburgh, UK | <a href="https://www.meetup.com/rust-edi">Rust and Friends</a><ul>
<li><a href="https://www.meetup.com/rust-and-friends/events/314941098/"><strong>Bevy, Bits, &amp; Cats (Rust July Talks)</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Enschede, NL | <a href="https://www.meetup.com/dutch-rust-meetup">Baseflow Tech Meetups</a><ul>
<li><a href="https://www.meetup.com/baseflow-tech-meetups/events/315099547/"><strong>AI Summit</strong></a></li>
</ul>
</li>
<li>2026-07-08 | Dublin, IE | <a href="https://www.meetup.com/rust-dublin">Rust Dublin</a><ul>
<li><a href="https://www.meetup.com/rust-dublin/events/315150327/"><strong>Join us live and INPERSON for Rust 262</strong></a></li>
</ul>
</li>
<li>2026-07-09 | Switzerland, CH | <a href="https://www.posttenebraslab.ch/wiki/events/start">PostTenebrasLab</a><ul>
<li><a href="https://www.posttenebraslab.ch/wiki/events/monthly_meeting/rust_meetup"><strong>Rust Meetup Geneva</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<li>2026-06-24 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/315105633/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a><ul>
<li><a href="https://www.meetup.com/rust-los-angeles/events/314386080/"><strong>Rust LA: Rust-Based Constraint Solvers in 2D Sketching with Zoo Technologies</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Atlanta, GA, US | <a href="https://www.meetup.com/rust-atl">Rust Atlanta</a><ul>
<li><a href="https://www.meetup.com/rust-atl/events/313539326/"><strong>Rust-Atl</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Mountain View, CA, US | <a href="https://www.meetup.com/hackerdojo/events/">Hacker Dojo</a><ul>
<li><a href="https://www.meetup.com/hackerdojo/events/314825008/"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
</ul>
</li>
<li>2026-06-26 | New York, NY, US | <a href="https://www.meetup.com/rust-nyc">Rust NYC</a><ul>
<li><a href="https://www.meetup.com/rust-nyc/events/315014582/"><strong>Rust NYC's Big Summer Social</strong></a></li>
</ul>
</li>
<li>2026-06-27 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225857/"><strong>Somerville Union Square Rust Lunch, June 27</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Saint Louis, MO, US | <a href="https://www.meetup.com/stl-rust">STL Rust</a><ul>
<li><a href="https://www.meetup.com/stl-rust/events/315103359/"><strong>Git is easy?</strong></a></li>
</ul>
</li>
<li>2026-07-04 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225861/"><strong>Boston University Rust Lunch, July 4</strong></a></li>
</ul>
</li>
<li>2026-07-09 | Lehi, UT, US | <a href="https://www.meetup.com/utah-rust">Utah Rust</a><ul>
<li><a href="https://www.meetup.com/utah-rust/events/314696647/"><strong>Utah Rust July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-11 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225865/"><strong>MIT Rust Lunch, July 11</strong></a></li>
</ul>
</li>
<li>2026-07-15 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
<li>2026-07-16 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314520812/"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-18 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225872/"><strong>North End Rust Lunch, July 18</strong></a></li>
</ul>
</li>
<li>2026-07-21 | San Francisco, CA, US | <a href="https://www.meetup.com/san-francisco-rust-study-group">San Francisco Rust Study Group</a><ul>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/events/314997214/"><strong>Rust Hacking in Person</strong></a></li>
</ul>
</li>
<li>2026-07-22 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/xvkdgtyjckbdc/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-07-22 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a><ul>
<li><a href="https://www.meetup.com/rust-los-angeles/events/315376271/"><strong>Rust LA: Rust in Distributed Systems with Flight Science!</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5>
<ul>
<li>2026-06-25 | Melbourne, AU | <a href="https://www.meetup.com/rust-melbourne">Rust Melbourne</a><ul>
<li><a href="https://www.meetup.com/rust-melbourne/events/315039461/"><strong>Rust Melbourne June 2026</strong></a></li>
</ul>
</li>
<li>2026-07-21 | Barton, AU | <a href="https://www.meetup.com/rust-canberra">Canberra Rust User Group</a><ul>
<li><a href="https://www.meetup.com/rust-canberra/events/315307280/"><strong>July Meetup</strong></a></li>
</ul>
</li>
</ul>
<p>If you are running a Rust event please add it to the <a href="https://www.google.com/calendar/embed?src=apd9vmbc22egenmtu5l6c5jbfc%40group.calendar.google.com">calendar</a> to get
it mentioned here. Please remember to add a link to the event too.
Email the <a href="mailto:community-team@rust-lang.org">Rust Community Team</a> for access.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#jobs">Jobs</a></h4>
<p>Please see the latest <a href="https://www.reddit.com/r/rust/comments/1ttbtf5/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p>
<h3><a class="toclink" href="https://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3>
<blockquote>
<p>I think this is the wrong decision, and I wish the lang team had stabilized the Late type instead.
Better Late than Never.</p>
</blockquote>
<p>– <a href="https://www.reddit.com/r/rust/comments/1u1v53c/the_never_type_is_likely_to_stabilize_soon/oqsxf3v/">/u/CouteauBleu on /r/rust</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1782">Theemathas</a> for the suggestion!</p>
<p><a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328">Please submit quotes and vote for next week!</a></p>
<p>This Week in Rust is edited by:</p>
<ul>
<li><a href="https://github.com/nellshamrell">nellshamrell</a></li>
<li><a href="https://github.com/llogiq">llogiq</a></li>
<li><a href="https://github.com/ericseppanen">ericseppanen</a></li>
<li><a href="https://github.com/extrawurst">extrawurst</a></li>
<li><a href="https://github.com/U007D">U007D</a></li>
<li><a href="https://github.com/mariannegoldin">mariannegoldin</a></li>
<li><a href="https://github.com/bdillo">bdillo</a></li>
<li><a href="https://github.com/opeolluwa">opeolluwa</a></li>
<li><a href="https://github.com/bnchi">bnchi</a></li>
<li><a href="https://github.com/KannanPalani57">KannanPalani57</a></li>
<li><a href="https://github.com/tzilist">tzilist</a></li>
</ul>
<p><em>Email list hosting is sponsored by <a href="https://foundation.rust-lang.org/">The Rust Foundation</a></em></p>
<p><small><a href="https://this-week-in-rust.org/REDDIT_LINK_HERE">Discuss on r/rust</a></small></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v8.17.0-beta.1]]></title>
<description><![CDATA[Group admins can now delete recently sent messages in a group chat. If someone accidentally posts a spoiler in your Book Club group and then walks away from their phone, a group admin can delete it to keep the plot twist intact. You can easily see when a message was deleted and who removed it, ju...]]></description>
<link>https://tsecurity.de/weiterlesen/3594846/3622985/v8170-beta1/</link>
<pubDate>Thu, 25 Jun 2026 00:38:49 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<ul>
<li>Group admins can now delete recently sent messages in a group chat. If someone accidentally posts a spoiler in your Book Club group and then walks away from their phone, a group admin can delete it to keep the plot twist intact. You can easily see when a message was deleted and who removed it, just like the existing "Delete for Everyone" feature.</li>
<li>We also increased the maximum number of pinned chats from 4 to 10, so you can show 6 more people how much you love what they have to say.</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[a CVE dispute]]></title>
<description><![CDATA[A few years years ago the curl project signed up and became a CNA. This means that we are masters of and can allocate our own CVE identifiers. For any security problems within our territory, it is we who decides if the issue should get a CVE or not. No more bogus CVEs. 57 CVEs … Continue reading ...]]></description>
<link>https://tsecurity.de/weiterlesen/3594784/3622923/a-cve-dispute/</link>
<pubDate>Wed, 24 Jun 2026 23:54:03 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[A few years years ago the curl project signed up and became a CNA. This means that we are masters of and can allocate our own CVE identifiers. For any security problems within our territory, it is we who decides if the issue should get a CVE or not. No more bogus CVEs. 57 CVEs … <a href="https://daniel.haxx.se/blog/2026/06/24/a-cve-dispute/" class="more-link">Continue reading <span class="screen-reader-text">a CVE dispute</span> <span class="meta-nav">→</span></a>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.17]]></title>
<description><![CDATA[@oh-my-pi/pi-agent-core
Fixed

Hardened the agent-loop cooperative yield against backward wall-clock jumps. A stale future timestamp left in the shared yield gate (NTP step, or a fake-timer test mocking Date.now) could make yieldIfDue() gate forever and stop yielding to the event loop; the gate n...]]></description>
<link>https://tsecurity.de/weiterlesen/3594511/3622650/v16117/</link>
<pubDate>Wed, 24 Jun 2026 21:38:45 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-agent-core</h2>
<h3>Fixed</h3>
<ul>
<li>Hardened the agent-loop cooperative yield against backward wall-clock jumps. A stale future timestamp left in the shared yield gate (NTP step, or a fake-timer test mocking <code>Date.now</code>) could make <code>yieldIfDue()</code> gate forever and stop yielding to the event loop; the gate now treats a backward clock delta as due and re-anchors. The gate is exposed as an injectable <code>YieldGate</code> (with <code>yieldIfDue()</code> retained as the shared singleton) so it can be exercised without mocking process-global timers.</li>
</ul>
<h2>@oh-my-pi/pi-ai</h2>
<h3>Added</h3>
<ul>
<li>Added provider-level <code>notes?: string[]</code> field to <code>UsageReport</code> for disclaimers that apply to every limit (e.g. "OMP-observed spend only"). The field is declared in both the <code>usage.ts</code> schema and the auth-broker wire schema copy so it survives the <code>"+": "reject"</code> deserialization gate. (<a href="https://github.com/can1357/oh-my-pi/issues/3268" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3268/hovercard">#3268</a>)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Moved the OpenCode Go "OMP-observed spend only" disclaimer from per-limit <code>notes</code> to provider-level <code>notes</code>, so it renders once per provider instead of duplicating across every account × window. (<a href="https://github.com/can1357/oh-my-pi/issues/3268" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3268/hovercard">#3268</a>)</li>
<li>Fixed Anthropic rate-limit header usage cache entries retaining legacy missing account metadata after refresh.</li>
<li>Fixed Anthropic-compatible budget-effort models dropping the selected effort before request serialization, so <code>output_config.effort</code> is emitted alongside <code>thinking.budget_tokens</code> when model metadata declares <code>mode: "anthropic-budget-effort"</code>.</li>
<li>Fixed <code>anthropic-messages</code> silently dropping caller-supplied <code>Authorization</code> / <code>X-Api-Key</code> from <code>model.headers</code> and <code>ANTHROPIC_CUSTOM_HEADERS</code>, blocking custom proxy auth schemes. Non-OAuth requests now honor the caller's value (matching <code>openai-responses</code>); the lower-level client also suppresses its <code>X-Api-Key</code> add when a custom <code>Authorization</code> is supplied for a non-official endpoint so the proxy receives a single credential. OAuth bearer + Cloudflare AI Gateway keep their pre-existing enforced auth headers. (<a href="https://github.com/can1357/oh-my-pi/issues/3391" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3391/hovercard">#3391</a>)</li>
<li>Fixed Ollama Cloud <code>num_predict</code> ignoring the provider's 65536 output-token cap so stale <code>models.db</code> rows (or custom <code>modelOverrides</code> re-enabling output caps) that carried <code>maxTokens: 1048576</code> from a pre-omitMaxOutputTokens catalog 400'd every request with <code>max_tokens (1048576) exceeds model's maximum output tokens (65536) for model deepseek-v4-pro</code>. The Ollama provider now clamps <code>num_predict</code> for any <code>ollama-cloud</code> request at the documented 65536 cap before sending, independent of the cached spec's <code>maxTokens</code> and on top of the existing <code>omitMaxOutputTokens</code> policy — so the request stays valid even when the load-time policy never normalized the spec. Self-hosted <code>ollama</code> traffic is unaffected. (<a href="https://github.com/can1357/oh-my-pi/issues/3392" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3392/hovercard">#3392</a>)</li>
<li>Fixed OpenRouter Anthropic models on the Responses path omitting <code>cache_control</code>, so prompt caching engages without forcing Chat Completions. (<a href="https://github.com/can1357/oh-my-pi/issues/3397" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3397/hovercard">#3397</a>)</li>
<li>Fixed OpenRouter Anthropic Responses follow-up requests replaying prior reasoning items with stale signatures, which caused HTTP 400 <code>Invalid signature in thinking block</code> errors after a thinking turn. (<a href="https://github.com/can1357/oh-my-pi/issues/3399" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3399/hovercard">#3399</a>)</li>
<li>Fixed OpenRouter Anthropic models on the Responses path omitting <code>cache_control</code>, so prompt caching engages without forcing Chat Completions. <code>cacheRetention: "long"</code> now upgrades the breakpoint to <code>ttl: "1h"</code>. (<a href="https://github.com/can1357/oh-my-pi/issues/3397" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3397/hovercard">#3397</a>)</li>
</ul>
<h2>@oh-my-pi/pi-catalog</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed the Umans GLM-5.2 thinking-level picker collapsing to a single <code>high</code> tier after dynamic discovery: the <code>max</code> upstream level now resolves to the internal <code>xhigh</code> effort, the picker shows both <code>high</code> and <code>xhigh</code>, and the metadata maps <code>xhigh</code> back to Umans's native <code>max</code> wire tier. (<a href="https://github.com/can1357/oh-my-pi/issues/3192" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3192/hovercard">#3192</a>)</li>
<li>Fixed GitHub Copilot business and enterprise endpoints accepting image inputs that they reject with <code>400 vision is not supported</code>. The Copilot <code>/models</code> response advertises <code>capabilities.supports.vision = true</code> for Claude/GPT chat models on every host, but only the canonical personal endpoint (<code>https://api.githubcopilot.com</code>) actually serves them; <code>githubCopilotModelManagerOptions</code> now forces <code>input: ["text"]</code> whenever discovery resolves to a non-personal base URL, and <code>mergeDynamicModel</code> honours the dynamic value (instead of OR-upgrading) when the merged endpoint differs from the bundled reference. (<a href="https://github.com/can1357/oh-my-pi/issues/3387" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3387/hovercard">#3387</a>)</li>
<li>Fixed OpenRouter Anthropic compat to strip Responses reasoning history during replay so signed thinking blocks are not sent back to routed Anthropic providers. (<a href="https://github.com/can1357/oh-my-pi/issues/3399" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3399/hovercard">#3399</a>)</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed mnemopi auto-retain extracting facts/entities from assistant-authored transcript turns. <code>MnemopiSessionState.retainMessages</code> still stores the full multi-role window for episodic recall, but passes only user-authored turns as <code>extractText</code>, so assistant prose containing <code>always</code>/<code>never</code> no longer becomes durable user <code>Instruction:</code> memory. (<a href="https://github.com/can1357/oh-my-pi/issues/3372" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3372/hovercard">#3372</a>)</li>
<li>Fixed lazy tool auto-downloads hanging when <code>Bun.write(dest, response)</code> receives a streaming <code>fetch()</code> <code>Response</code>; tool assets now stream the response body to disk with the existing download abort signal and remove partial files on abort. (<a href="https://github.com/can1357/oh-my-pi/issues/3369" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3369/hovercard">#3369</a>)</li>
<li>Fixed profile-alias installer producing backslash-separated paths for bash/zsh/fish config files on Windows. <code>path.join</code> was used unconditionally, producing Windows-style paths that POSIX shells can't resolve. The installer now uses <code>path.posix.join</code> for non-Windows platforms and normalizes script paths to forward slashes for POSIX shell alias blocks, so <code>omp --alias</code> works correctly in Git Bash and WSL.</li>
<li>Fixed pasted or dragged non-image file paths in the TUI prompt staying as inert raw text; existing files now attach as clean <code>local://attachment-N.&lt;ext&gt;</code> references while image paths keep the image attachment flow. (<a href="https://github.com/can1357/oh-my-pi/issues/3360" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3360/hovercard">#3360</a>)</li>
<li>Slash commands are now recorded in input history (Up Arrow recall). Previously only 4 commands (<code>/plan</code>, <code>/goal</code>, <code>/mcp</code>, <code>/ssh</code>) stored their text; all other built-in slash commands were silently skipped because <code>executeBuiltinSlashCommand</code> returned <code>true</code> before <code>addToHistory</code> was called. History is now centralized in the input controller after successful command dispatch. Commands that may carry secrets (<code>/login &lt;url&gt;</code> with OAuth callback params, <code>/mcp add --token &lt;token&gt;</code>) are excluded from history to prevent credential leakage (<a href="https://github.com/can1357/oh-my-pi/issues/3148" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3148/hovercard">#3148</a>)</li>
<li>Fixed the <code>ask</code> tool's "Other (type your own)" free-text editor (prompt-style <code>HookEditorComponent</code>) ignoring Ctrl+Q and Ctrl+Enter, so Windows Terminal users who learned the <code>app.message.followUp</code> chord from the main editor (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4594434621" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/1903" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/1903/hovercard" href="https://github.com/can1357/oh-my-pi/issues/1903">#1903</a> / fixed by <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4594461651" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/1905" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/1905/hovercard" href="https://github.com/can1357/oh-my-pi/pull/1905">#1905</a>) got zero feedback on submit. The hook-style and main-editor surfaces honored <code>matchesAppFollowUp</code>; the prompt-style handler did not, leaving plain Enter as the sole submit path and Ctrl+Enter falling through to Editor as a newline (silently swallowed by WT). <code>#handlePromptStyleInput</code> now checks <code>matchesAppFollowUp</code> first — mirroring <code>#handleHookStyleInput</code> — and the hint reads <code>enter or ctrl+q submit</code> so the chord is discoverable. (<a href="https://github.com/can1357/oh-my-pi/issues/3353" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3353/hovercard">#3353</a>)</li>
<li>Fixed the TUI freezing when a tool approval prompt fires while <code>/settings</code> (or the Extensions/Agents dashboard) is open. The fullscreen overlay's close handler restored focus to the editor it had captured at open time, but <code>ExtensionUiController</code> had since swapped the editor out of the editor slot for the approval prompt — so on exit the visible prompt sat unreachable while keystrokes routed to the now-unmounted editor (no Enter/Up/Down/Esc response, only Ctrl+C escaped). <code>SelectorController</code> now restores focus to whatever currently owns the editor slot via a <code>focusActiveEditorArea()</code> helper, applied to settings, extensions dashboard, and agents dashboard close paths. (<a href="https://github.com/can1357/oh-my-pi/issues/3349" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3349/hovercard">#3349</a>)</li>
<li>Fixed <code>/settings</code> coercing enum/text values to display strings before handing them to the TUI list, preventing YAML numeric enum values from reaching native truncation (<a href="https://github.com/can1357/oh-my-pi/issues/3338" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3338/hovercard">#3338</a>).</li>
<li>Fixed all extension loading silently failing on the cross-compiled <code>omp-darwin-arm64</code> release binary (downloaded directly or via a Homebrew tap wrapper) because <code>__computeBunfsPackageRoot</code> mis-handled <code>import.meta.dir = "//root/omp-darwin-arm64"</code>. Bun 1.3.14 reports <code>&lt;bunfs-root&gt;/&lt;binary-name&gt;</code> for the compiled entry's <code>import.meta.dir</code>, but the pre-fix function joined <code>metaDir + "packages"</code> and produced <code>/root/omp-darwin-arm64/packages</code> — the binary basename was baked into every bunfs path, so the TypeBox/legacy-pi shims and every <code>@oh-my-pi/pi-*</code> package-root override failed <code>existsSync</code> validation and <code>resolveCanonicalPiSpecifier</code> fell through to a bunfs <code>Bun.resolveSync</code> that also could not find the module. The function now detects the bunfs-root + binary-basename shape (<code>path.basename(path.dirname(metaDir)) === "root"</code>) and strips the trailing binary segment by slicing the original <code>metaDir</code>; the production bunfs shim join path also preserves Bun's bunfs-native <code>//root</code> / <code>B:\~BUN\root</code> prefix that <code>path.join</code> would otherwise collapse. (<a href="https://github.com/can1357/oh-my-pi/issues/3329" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3329/hovercard">#3329</a>)</li>
<li>Fixed llama.cpp discovery to prefer per-model <code>/v1/models</code> <code>meta.n_ctx</code>/<code>meta.n_ctx_train</code> values, refresh selected models after lazy load, and bypass fresh-cache reuse so server restarts update context windows. (<a href="https://github.com/can1357/oh-my-pi/issues/3310" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3310/hovercard">#3310</a>)</li>
<li>Fixed <code>task.maxConcurrency: 0</code> serializing subagent spawns instead of running them unbounded. The settings UI labels <code>0</code> as "Unlimited", but the session-scoped spawn <code>Semaphore</code> clamped <code>max</code> via <code>Math.max(1, max)</code>, so the second subagent body in a batch always waited for the first to release the seat. The constructor now treats <code>max &lt;= 0</code> (and any non-finite input) as unbounded via <code>Number.POSITIVE_INFINITY</code>, matching the eval <code>parallel()</code>/<code>pipeline()</code> worker-pool semantics (<a href="https://github.com/can1357/oh-my-pi/issues/3305" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3305/hovercard">#3305</a>).</li>
<li>Fixed MCP tool calls forwarding empty optional placeholder arguments (<code>""</code> and <code>{}</code>) to <code>tools/call</code>; optional placeholders are now omitted while required fields and meaningful falsy values are preserved. (<a href="https://github.com/can1357/oh-my-pi/issues/3302" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3302/hovercard">#3302</a>)</li>
<li>Fixed the welcome <code>Tip:</code> line rendering with hardcoded <code>#b48cff</code> / <code>#9ccfff</code> pastels plus a manual <code>\x1b[2m</code> dim, so any light theme dropped the body to ~1.5:1 contrast (well under WCAG AA). <code>renderWelcomeTip</code> in <code>packages/coding-agent/src/modes/components/welcome.ts</code> now paints the label through <code>theme.fg("customMessageLabel", …)</code> and the body through <code>theme.fg("muted", …)</code> (no manual dim), so the line tracks the active theme and stays legible on light backgrounds. (<a href="https://github.com/can1357/oh-my-pi/issues/3337" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3337/hovercard">#3337</a>)</li>
<li>Fixed <code>omp usage</code> and the <code>/usage</code> command duplicating provider-wide disclaimer notes (e.g. OpenCode Go's "OMP-observed spend only") once per account × limit window. Provider-level notes now render once above the per-account sections in the TUI, CLI, and ACP render paths, and identical per-limit notes are deduplicated in the TUI aggregate renderer. (<a href="https://github.com/can1357/oh-my-pi/issues/3268" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3268/hovercard">#3268</a>)</li>
<li>Fixed the welcome panel advertising <code>? for keyboard shortcuts</code> after the <code>?</code> shortcut was deliberately removed (commit <a class="commit-link" data-hovercard-type="commit" data-hovercard-url="https://github.com/can1357/oh-my-pi/commit/dcf482c4c458e325e5482b607441ebd1eca5b9d9/hovercard" href="https://github.com/can1357/oh-my-pi/commit/dcf482c4c458e325e5482b607441ebd1eca5b9d9"><tt>dcf482c</tt></a>). The tips section now points users at <code>/hotkeys</code> instead. (<a href="https://github.com/can1357/oh-my-pi/issues/1614" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/1614/hovercard">#1614</a>)</li>
<li>Fixed Devin provider models silently producing empty responses under the default <code>defaultThinkingLevel: auto</code>. Devin models advertise <code>reasoning: true</code> but no <code>thinking.efforts</code> (Cascade selects effort by routing to sibling model ids, not a wire param), so <code>getSupportedEfforts(model)</code> was empty; <code>clampAutoThinkingEffort</code> returned the classifier-picked effort as-is, which then tripped <code>requireSupportedEffort</code> in <code>pi-ai/stream.ts</code> with <code>Thinking effort low is not supported by devin/&lt;id&gt;. Supported efforts: </code> (silently swallowed by the TUI). <code>clampAutoThinkingEffort</code> now returns <code>undefined</code> when the model has no controllable effort surface, matching <code>clampThinkingLevelForModel</code>; the auto-thinking turn hook also short-circuits the classifier call for these models. (<a href="https://github.com/can1357/oh-my-pi/issues/3356" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3356/hovercard">#3356</a>)</li>
<li>Fixed <code>omp tiny-models download</code> exiting before its unref'd worker subprocess could install the runtime or download model weights. The tiny-model client now references the worker while requests are pending so standalone CLI downloads wait for <code>Downloaded ...</code> / <code>Failed ...</code> completion. (<a href="https://github.com/can1357/oh-my-pi/issues/3291" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3291/hovercard">#3291</a>)</li>
<li>Fixed marketplace plugin installs registering only in <code>installed_plugins.json</code> and never in the runtime plugin tree, leaving slash commands and extensions unavailable after <code>omp plugin install name@marketplace</code>. The runtime loader now also enumerates the project-scope plugins root (<code>&lt;projectAnchor&gt;/.omp/plugins</code>) so <code>--scope project</code> installs surface alongside user-scope installs, with project entries shadowing same-named user entries (<a href="https://github.com/can1357/oh-my-pi/issues/3244" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3244/hovercard">#3244</a>).</li>
<li>Fixed <code>umans</code> requests with more than 10 live context images still sending every image despite the provider budget; outgoing provider contexts now drop the oldest images above the active provider cap while preserving text and newest images (<a href="https://github.com/can1357/oh-my-pi/issues/3230" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3230/hovercard">#3230</a>).</li>
<li>Fixed snapcompact auto-compaction looping the "snapcompact could not bring the context under the limit — using an LLM summary instead" warning on every threshold tick for sub-1M-token models (Claude Sonnet 4.5, GPT-5.x, Gemini 2.x). <code>snapcompact.compact()</code> was called with no <code>maxFrames</code> override, so it defaulted to <code>MAX_FRAMES_DEFAULT = 80</code>; the projection in <code>AgentSession</code> charges <code>FRAME_TOKEN_ESTIMATE = 5024</code> per frame block (the conservative high-res Anthropic ceiling), making 80 × 5024 ≈ 402k frame-token projections that always overflow a 200k budget. <code>AgentSession.#computeSnapcompactMaxFrames</code> now sizes the <code>maxFrames</code> cap from a <strong>shape-aware</strong> reserve — <code>2 × geometry(shape).capacity</code> worth of verbatim text-edge chars billed at the tiktoken cl100k 4-chars/token baseline (with a 1.15 multiplier for tokenizer drift), plus a 2k summary-template allowance — mirroring what <code>#projectSnapcompactContextTokens</code> will charge once frames land. The shape comes from the same <code>snapcompact.resolveShape(model, settings)</code> call the auto and manual paths pass into <code>snapcompact.compact()</code>. The cap reserve applies <strong>only</strong> to the frame-cap math, not the skip decision: snapcompact is skipped outright only when <code>kept-recent + non-message ≥ ctxWindow − reserve</code> (no headroom at all), so the frame-less <code>text.length &lt;= 2 * edgeCap</code> short-circuit in <code>planArchive</code> can still land a valid text-only archive when residual headroom is positive but below the cap reserve. The projection guard catches any actual frame-bearing archive that overflows. (<a href="https://github.com/can1357/oh-my-pi/issues/3247" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3247/hovercard">#3247</a>)</li>
<li>Fixed large-session TUI stalls by tailing appended transcript JSONL and collapsing compacted history on the live display surface (<a href="https://github.com/can1357/oh-my-pi/issues/3258" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3258/hovercard">#3258</a>).</li>
<li>Fixed status-line <code>usage</code> segment ignoring Codex subscription limits that carry a <code>scope.tier</code> (<a href="https://github.com/can1357/oh-my-pi/issues/2877" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2877/hovercard">#2877</a>).</li>
<li>Fixed extension <code>tool_call</code>/<code>tool_result</code> events for hashline <code>edit</code> calls to expose <code>event.input.path</code> for single-file edits and <code>event.input.paths</code> for every parsed target, so planning-mode gates can allow one markdown plan edit but still block multi-file hashline calls that cannot be represented by one path (<a href="https://github.com/can1357/oh-my-pi/issues/1678" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/1678/hovercard">#1678</a>).</li>
<li>Fixed scripted <code>eval</code> <code>agent()</code> subagents continuing after a successful <code>yield</code> when a trailing empty assistant <code>stop</code> arrived after the executor's yield-triggered abort. The session's <code>agent_end</code> maintenance compared <code>#assistantEndedWithSuccessfulYield(msg)</code> against the trailing empty-stop message — not the prior yield-bearing one — so the empty-stop recovery path appended a retry reminder and scheduled <code>agent.continue()</code>, reviving the already-yielded child. The yield handler now sets a sticky <code>#yieldTerminationPending</code> flag (cleared on the next <code>prompt()</code>) that short-circuits empty-stop / unexpected-stop / compaction continuations for the rest of the run, so a successful yield is terminal regardless of trailing stops (<a href="https://github.com/can1357/oh-my-pi/issues/3389" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3389/hovercard">#3389</a>).</li>
<li>Fixed snapcompact rasterizing transcript frames into requests bound for GitHub Copilot business and enterprise endpoints, which then rejected the session permanently with <code>400 vision is not supported</code>. The snapcompact vision gate now also short-circuits whenever <code>model.provider === "github-copilot"</code> and the resolved <code>baseUrl</code> is not the canonical personal-Copilot host, protecting cached/stale Model specs that still advertise <code>["text","image"]</code> on a non-personal endpoint. (<a href="https://github.com/can1357/oh-my-pi/issues/3387" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3387/hovercard">#3387</a>)</li>
</ul>
<h2>@oh-my-pi/pi-mnemopi</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>remember(..., { extract: true })</code> fact/entity extraction accepting an <code>extractText</code> override so hosts can store full transcripts while mining facts from a safer projection; also tightened deterministic <code>Instruction:</code> extraction to require an explicit <code>I</code>/<code>you</code> subject instead of treating every <code>always</code>/<code>never</code> clause as a user instruction. (<a href="https://github.com/can1357/oh-my-pi/issues/3372" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3372/hovercard">#3372</a>)</li>
</ul>
<h2>@oh-my-pi/pi-natives</h2>
<h3>Added</h3>
<ul>
<li>Added <code>setHangulCompatJamoWidthOverride(value)</code> to override the Hangul Compatibility Jamo (U+3131..U+318E) display width at runtime via a process-global atomic, instead of relying solely on the compile-time <code>cfg!(target_os = "macos")</code> heuristic. The actual width is decided by the client terminal (not the host OS), so the TUI resolves it from the terminal identity and pushes the result here. Encoding: <code>0</code> = platform default (macOS narrow, otherwise UAX#11), <code>1</code> = narrow (1 cell), <code>2</code> = wide (2 cells), <code>3</code> = Unicode width (no correction). The leaf width helpers read this override, so no width/slice/truncate/wrap signatures change.</li>
</ul>
<h2>@oh-my-pi/omp-stats</h2>
<h3>Fixed</h3>
<ul>
<li>Stats sync counted the same provider request multiple times when a forked or branched session file copied the parent's entries verbatim. Inserts now skip rows whose <code>(entry_id, timestamp)</code> already exists under a different <code>session_file</code>, and a one-shot migration on the next <code>omp stats</code> run collapses any pre-existing duplicates (<a href="https://github.com/can1357/oh-my-pi/issues/3370" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3370/hovercard">#3370</a>).</li>
</ul>
<h2>@oh-my-pi/pi-tui</h2>
<h3>Added</h3>
<ul>
<li>Added runtime resolution of the Hangul Compatibility Jamo (U+3131..U+318E) display width for terminals known to disagree with the platform default (e.g. Ghostty, which renders these at 2 cells). Fixes doubled/ghosted jamo during Korean IME composition; the resolved width is pushed into the native width engine before the first paint. Other terminals keep the platform default (macOS narrow, otherwise UAX#11), so the override is a no-op outside Ghostty. A runtime DSR/CPR probe for unknown terminals is tracked separately.</li>
<li>Added <code>setHangulCompatibilityJamoWidth</code> / <code>getHangulCompatibilityJamoWidth</code> to set the jamo width profile (<code>"platform" | "unicode" | 1 | 2</code>); the profile is mirrored into the native <code>setHangulCompatJamoWidthOverride</code>.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Removed the 30-second OSC 11 background-color poll that ran on terminals without DEC Mode 2031 support (macOS Terminal.app, Warp, VS Code's built-in terminal, older Alacritty/WezTerm). Each poll's OSC 11 + DA1 write wiped the user's active text selection on several of those terminals, causing intermittent "can't copy" failures whenever a poll fired mid-drag — most visibly during the Ask tool dialog when the user wants to quote text back from the conversation (<a href="https://github.com/can1357/oh-my-pi/issues/3297" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3297/hovercard">#3297</a>). Theme detection now relies on the initial startup probe plus Mode 2031 push notifications; affected terminals pick up OS-theme changes on next launch.</li>
<li>Fixed <code>@</code>-path autocomplete failing on Windows for paths outside the cwd. Windows absolute paths (e.g. <code>C:\\Users\\...</code>) were not detected as absolute — only <code>/</code> was checked — so they were incorrectly joined with the base directory, producing invalid search paths and empty suggestions. Path-join calls also introduced backslashes into suggestion values, breaking round-trip insertion. Absolute path detection now uses <code>path.isAbsolute()</code> (handles drive letters) and suggestion paths are normalized to forward slashes (valid on all platforms).</li>
<li>Fixed settings rows crashing native text truncation when a malformed config value reaches the renderer as a non-string (<a href="https://github.com/can1357/oh-my-pi/issues/3338" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3338/hovercard">#3338</a>).</li>
<li>Fixed desktop notifications being silently lost under tmux on the common stack of tmux + kitty/ghostty/wezterm/iTerm2. <code>TERMINAL_ID</code> resolves to the inner terminal (whose markers leak into the tmux session env), which maps to <code>NotifyProtocol.Osc9</code> / <code>NotifyProtocol.Osc99</code>, and <code>sendNotification()</code> wrote that raw OSC straight to stdout — tmux dropped it on the floor and <code>monitor-bell</code> / <code>monitor-activity</code> never fired, so a backgrounded omp pane had no way to flag completion or <code>ask</code> blockage. Under <code>TMUX</code>, OSC-protocol notifications are now wrapped in tmux's <code>\x1bPtmux;…\x1b\\</code> DCS passthrough envelope (so users with <code>set -g allow-passthrough on</code> still get the real toast on the outer terminal) and followed by a <code>\x07</code> BEL (so <code>set -g monitor-bell on</code> reliably flags the window otherwise). The OSC 99 capability probe in <code>terminal.ts</code> is wrapped the same way so rich notifications keep working across tmux. <code>NotifyProtocol.Bell</code> paths are unchanged. (<a href="https://github.com/can1357/oh-my-pi/issues/3395" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3395/hovercard">#3395</a>)</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix(coding-agent): handled <code>&lt;bunfs-root&gt;/&lt;binary&gt;</code> in __computeBunfsPackageRoot by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4727451927" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3330" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3330/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3330">#3330</a></li>
<li>fix(mcp): omit unused optional tool args by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4724931350" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3304" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3304/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3304">#3304</a></li>
<li>fix(task): treat maxConcurrency 0 as unbounded in spawn semaphore by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4724988039" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3307" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3307/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3307">#3307</a></li>
<li>fix(providers): honor llama.cpp per-model context windows by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4725795113" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3311" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3311/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3311">#3311</a></li>
<li>fix(tui): deliver notifications under tmux via DCS passthrough + BEL fallback by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4737277542" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3396" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3396/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3396">#3396</a></li>
<li>fix(tui): runtime Hangul Compatibility Jamo width override + Ghostty detection by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ZergRocks/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ZergRocks">@ZergRocks</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4582051803" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/1800" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/1800/hovercard" href="https://github.com/can1357/oh-my-pi/pull/1800">#1800</a></li>
<li>fix(catalog): restore Umans GLM-5.2 max reasoning by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4710426433" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3193" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3193/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3193">#3193</a></li>
<li>fix(agent): clamp provider context images by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4713879562" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3232" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3232/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3232">#3232</a></li>
<li>fix(cli): register marketplace plugin installs by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4714884175" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3245" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3245/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3245">#3245</a></li>
<li>fix(agent): size snapcompact maxFrames by the live model window by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4715541246" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3249" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3249/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3249">#3249</a></li>
<li>fix(tui): reduce large transcript stalls by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4716377651" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3259" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3259/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3259">#3259</a></li>
<li>fix(tui): include tiered Codex usage limits by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/riverpilot/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/riverpilot">@riverpilot</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4721837079" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3289" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3289/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3289">#3289</a></li>
<li>fix(cli): keep tiny-model downloads alive by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4721879295" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3292" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3292/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3292">#3292</a></li>
<li>fix(usage): dedup provider-wide notes and add report-level notes field by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/oldschoola/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/oldschoola">@oldschoola</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4726234349" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3312" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3312/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3312">#3312</a></li>
<li>fix(welcome): replace stale ? shortcut with /hotkeys in tips panel by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/oldschoola/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/oldschoola">@oldschoola</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4726458520" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3315" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3315/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3315">#3315</a></li>
<li>fix(tui): stop OSC 11 poll from wiping text selection by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/oldschoola/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/oldschoola">@oldschoola</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4728748344" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3344" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3344/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3344">#3344</a></li>
<li>fix(tui): @-path autocomplete on Windows for paths outside cwd by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/oldschoola/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/oldschoola">@oldschoola</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4728809733" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3345" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3345/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3345">#3345</a></li>
<li>fix(cli): profile-alias installer produces correct paths for POSIX shells on Windows by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/oldschoola/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/oldschoola">@oldschoola</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4728902013" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3346" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3346/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3346">#3346</a></li>
<li>fix: store slash commands in input history by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/oldschoola/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/oldschoola">@oldschoola</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4729574543" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3352" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3352/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3352">#3352</a></li>
<li>fix(tui): theme-aware welcome tip line for light-theme legibility by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4735382484" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3376" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3376/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3376">#3376</a></li>
<li>fix(settings): prevent numeric config values from crashing settings UI by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4735458942" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3377" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3377/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3377">#3377</a></li>
<li>fix(tools): stream tool downloads without Bun.write Response by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4735597315" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3379" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3379/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3379">#3379</a></li>
<li>fix(coding-agent): clamp auto thinking to undefined for models without controllable effort by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4735598995" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3380" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3380/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3380">#3380</a></li>
<li>fix(coding-agent): honor app.message.followUp chord in ask prompt-style editor by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4735599275" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3381" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3381/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3381">#3381</a></li>
<li>fix(stats): dedupe forked-session entries to stop double-counting by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4735616453" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3382" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3382/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3382">#3382</a></li>
<li>fix(memory): scope mnemopi entity extraction to user turns by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4735668029" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3383" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3383/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3383">#3383</a></li>
<li>fix(tui): attach pasted file paths as local refs by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4735671604" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3384" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3384/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3384">#3384</a></li>
<li>fix(coding-agent): restore TUI focus to live editor-slot owner when a fullscreen overlay closes by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4735691495" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3385" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3385/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3385">#3385</a></li>
<li>fix(catalog,coding-agent): disable vision on non-personal Copilot endpoints (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4736520339" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3387" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3387/hovercard" href="https://github.com/can1357/oh-my-pi/issues/3387">#3387</a>) by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4736626781" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3388" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3388/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3388">#3388</a></li>
<li>fix(session): suppress empty-stop retry after successful yield by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4736900317" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3390" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3390/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3390">#3390</a></li>
<li>fix(ai/anthropic): honor caller-supplied Authorization/X-Api-Key for custom proxies (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4736906280" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3391" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3391/hovercard" href="https://github.com/can1357/oh-my-pi/issues/3391">#3391</a>) by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4736976378" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3393" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3393/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3393">#3393</a></li>
<li>fix(ai/ollama): clamp num_predict at the Ollama Cloud 65536 cap by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4737031173" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3394" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3394/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3394">#3394</a></li>
<li>fix(providers): strip OpenRouter Anthropic reasoning replay by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4737583588" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3400" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3400/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3400">#3400</a></li>
<li>fix(coding-agent): expose hashline edit path to extensions by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4567862708" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/1681" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/1681/hovercard" href="https://github.com/can1357/oh-my-pi/pull/1681">#1681</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v16.1.16...v16.1.17"><tt>v16.1.16...v16.1.17</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[curl 8.21.0]]></title>
<description><![CDATA[Release presentation At 09:00 UTC (11:00 CEST) today I will do a traditional live-streamed release presentation of this release over on my Twitch channel. Numbers the 275th release6 changes56 days (total: 10,817)276 bugfixes (total: 14,187)531 commits (total: 39,077)0 new public libcurl function ...]]></description>
<link>https://tsecurity.de/weiterlesen/3592232/3620371/curl-8210/</link>
<pubDate>Wed, 24 Jun 2026 08:23:48 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[Release presentation At 09:00 UTC (11:00 CEST) today I will do a traditional live-streamed release presentation of this release over on my Twitch channel. Numbers the 275th release6 changes56 days (total: 10,817)276 bugfixes (total: 14,187)531 commits (total: 39,077)0 new public libcurl function (total: 100)0 new curl_easy_setopt() option (total: 308)1 new curl command line option (total: … <a href="https://daniel.haxx.se/blog/2026/06/24/curl-8-21-0/" class="more-link">Continue reading <span class="screen-reader-text">curl 8.21.0</span> <span class="meta-nav">→</span></a>]]></content:encoded>
</item>
<item>
<title><![CDATA[The web is evolving. So are we.]]></title>
<description><![CDATA[Earlier this month, we officially stood up Mozilla.org: a new 501(c)(3) nonprofit created to steward the long term success of the Mozilla Project.  Over the last year or so, I’ve said a lot about how AI is reshaping the web — and how we need to simultaneously stand up for the open internet Mozill...]]></description>
<link>https://tsecurity.de/weiterlesen/3591099/3619238/the-web-is-evolving-so-are-we/</link>
<pubDate>Tue, 23 Jun 2026 20:08:37 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Earlier this month, we officially stood up Mozilla.org: a new 501(c)(3) nonprofit created to steward the long term success of the Mozilla Project.  Over the last year or so, I’ve said a lot about how AI is reshaping the web — and how we need to simultaneously stand up for the open internet Mozilla helped build […]</p>
<p>The post <a href="https://blog.mozilla.org/en/mozilla/news/announcing-mozilla-org-new-non-profit/">The web is evolving. So are we.</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Thundermail June 2026 update: what we learned after the first few waves of invites]]></title>
<description><![CDATA[Over the past several weeks, we have been welcoming early users from our waitlist into Thundermail, a few waves at a time. Many of you are now setting up your accounts, trying things out, and sharing your thoughts with us. Naming updates You may have noticed that we are now saying Thundermail mor...]]></description>
<link>https://tsecurity.de/weiterlesen/3591077/3619216/thundermail-june-2026-update-what-we-learned-after-the-first-few-waves-of-invites/</link>
<pubDate>Tue, 23 Jun 2026 19:54:14 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Over the past several weeks, we have been welcoming early users from our waitlist into Thundermail, a few waves at a time. Many of you are now setting up your accounts, trying things out, and sharing your thoughts with us. Naming updates You may have noticed that we are now saying Thundermail more often, and […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/06/thundermail-june-2026-update-what-we-learned-after-the-first-few-waves-of-invites/">Thundermail June 2026 update: what we learned after the first few waves of invites</a> appeared first on <a href="https://blog.thunderbird.net/">The Thunderbird Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Keeping the Web Open and Private in the Bot Era]]></title>
<description><![CDATA[If you’ve been running into endless CAPTCHAS or website login requests lately, you’re not imagining things.  Websites, facing a rising tide of abusive traffic from bots, are adopting increasingly aggressive countermeasures, damaging user’s experience of the web, their privacy and open access to t...]]></description>
<link>https://tsecurity.de/weiterlesen/3590778/3618917/keeping-the-web-open-and-private-in-the-bot-era/</link>
<pubDate>Tue, 23 Jun 2026 18:26:55 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>If you’ve been running into endless CAPTCHAS or website login requests lately, you’re not imagining things.  Websites, facing a rising tide of abusive traffic from bots, are adopting increasingly aggressive countermeasures, damaging user’s experience of the web, their privacy and open access to the web.    In this post, we’ll talk about a new initiative we’re […]</p>
<p>The post <a href="https://blog.mozilla.org/en/privacy-security/keeping-the-web-open-and-private-in-the-bot-era/">Keeping the Web Open and Private in the Bot Era</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Mozilla Privacy Blog: Building Competitive Digital Markets: From Rules to Results]]></title>
<description><![CDATA[Two years ago, the Digital Markets Act was the first of its kind: an ex ante competition framework introducing contestability and supporting innovation. But, as much as its critics try to cast it as a European experiment, it was never alone. In 2019, expert reports across the US, EU, UK and elsew...]]></description>
<link>https://tsecurity.de/weiterlesen/3590473/3618612/mozilla-privacy-blog-building-competitive-digital-markets-from-rules-to-results/</link>
<pubDate>Tue, 23 Jun 2026 16:23:15 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Two years ago, the Digital Markets Act was the first of its kind: an ex ante competition framework introducing contestability and supporting innovation. But, as much as its critics try to cast it as a European experiment, it was never alone. In 2019, expert reports across the <a href="https://www.chicagobooth.edu/-/media/research/stigler/pdfs/digital-platforms---committee-report---stigler-center.pdf">US</a>, <a href="https://op.europa.eu/en/publication-detail/-/publication/21dc175c-7b76-11e9-9f05-01aa75ed71a1/language-en?afd_azwaf_tok=eyJraWQiOiIxNkY3M0JFMkNDMjZDOUM1ODBGMzM4NjAzN0I1ODRCQTc4REQ1ODcwQUFFRkJGNEZDRUJFOUZEQkNGMENGMTNEIiwiYWxnIjoiUlMyNTYifQ.eyJhdWQiOiJvcC5ldXJvcGEuZXUiLCJleHAiOjE3ODIyMTEwNDQsImlhdCI6MTc4MjIxMTAzNCwiaXNzIjoidGllcjEtNjhiNWZjODc3NC01NmdzOCIsInN1YiI6IjEyYTo0YjoyY2JmOmQ1OmZlNjQ6MjkyODo0MDdhOmMzOGUiLCJkYXRhIjp7InR5cGUiOiJpc3N1ZWQiLCJyZWYiOiIyMDI2MDYyM1QxMDM3MTRaLTE2OGI1ZmM4Nzc0NTZnczhoQzFMT04xcnUwMDAwMDAwMG40MDAwMDAwMDAwOHUydiIsImIiOiItd1FJa2stbVUtZzUtdVh3MmVYeWVUOHlWanlYR1RBdm1ncEhCNkNMb3VVIiwiaCI6ImVoaWl0cHljUEVfOFRsVkZpU1JIV3o4Zl9UdU14VGduMnU1Z3NOamxYSlUifX0.wo6Nkk6kIiuxtYkfP8FFChuDMWFumyPWkxmmoLJeGIejbeAoPSjBmGFf7S-RHyP-Ln0A-dgpvzp67_WnVqfulSjGbtSvq3CJCip63xfbJpnfPv7LcKLT3hZVrtEyAYxWXbeuFcaxqWuA3gvQQAD0AYOQ9AqMxOC62PkszaflA842DtjCzVMlHniH892tJTRyJSyP9j2VPVBMx9tJ6nidak7asAMr3G4cIUeYlB26L6TNrUpVP9LPmvMqtdlPRGb5_hs1HWX0oVyBLlbdwNImoo8pu9XIwSixIfbl4Qq2YbVZDYtO50PMP_IKGf0AvcG6fxRfX1maru_ptV9haCBPGw.WF3obl2IDtqgvMFRqVdYkD5s">EU</a>, <a href="https://assets.publishing.service.gov.uk/media/5c88150ee5274a230219c35f/unlocking_digital_competition_furman_review_web.pdf">UK</a> and elsewhere studied the competitive dynamics of digital platforms. Today, the conversation has moved on to how to restore competition and choice within digital markets.</p>
<p>That shift was on display at Mozilla’s event in Brussels on 2 June, <em>“Rebalancing Digital Markets: Delivering Competition, Choice, and the Road Ahead.”</em> Regulators and policymakers from the EU, UK, Japan, and Brazil came together to assess what two years of reform have delivered and what still needs to happen. The answer was clearer than expected: ex ante competition regulation works, but only where it has been properly enforced.</p>
<h3>The proof of concept holds</h3>
<p>The DMA’s browser choice screen obligations have produced real, measurable results. We have <a href="https://blog.mozilla.org/netpolicy/2026/05/11/six-million-selections-later-how-the-dma-is-giving-people-browser-choice/">written</a> about the data in detail. The headline numbers: Firefox has been selected via a DMA choice screen over six million times in two years, once every ten seconds. Daily active users in the EU have grown to double those in comparable countries. People who choose Firefox through a choice screen are five times more likely to stick with it than those who arrive organically. The core finding is simple: this is what competition looks like when it is allowed to work. When users are given a genuine, well-designed choice, they take it. That was not a given. Earlier choice screens resulting from ex post antitrust processes produced no measurable impact. What changed was rigour and enforcement: working with behavioural economists, testing interfaces carefully, focusing on outcomes rather than checkbox compliance.</p>
<p>The lesson extends well beyond browsers. Desktop remains largely untouched, leaving roughly 310 million desktops and laptops in the EU without an equivalent level of browser choice. Windows users are still frequently steered towards Microsoft’s own services through design choices that override user choice or make switching more difficult than it should be. Ensuring that users of all gatekeeper services can easily change default settings, free from manipulative practices or undue influence, remains a critical test for DMA implementation. Choice screens can help, but they are not a silver bullet. Ecosystem lock-in, interoperability barriers and entrenched defaults continue to limit competition and innovation. The window to address these issues before new forms of digital gatekeeping become entrenched remains open, but it will not stay open indefinitely.</p>
<h3>Reform is going global and fast</h3>
<p>The institutional approaches across jurisdictions may differ, but the direction of travel is increasingly similar. Policymakers are recognising the need to address concentrated power in digital markets, expand user choice, and create conditions for competition and innovation to flourish.</p>
<p>The UK has opted for a flexible, case-by-case model and has already designated Google and Apple in respect of their mobile platforms. Japan scoped its legislation tightly to mobile, moved quickly, and is now seeking to ensure effective compliance for Japanese smartphone users. Brazil is building a framework calibrated to its own market realities.</p>
<p>None of these jurisdictions is simply copying the EU’s DMA. All of them are drawing on their experience and developing ex ante frameworks that work for their people and their economies: what a good choice screen looks like in practice, what regulatory capacity is needed before a law enters into force, and what happens when the large tech companies seek to undermine rather than facilitate choice and competition.</p>
<h3>What the momentum demands</h3>
<p>The consistent lesson is unglamorous: the staff, expertise, and industry relationships needed to enforce these rules have to be built before the law arrives, not after.</p>
<p>A clearer consensus is also forming around what enforcement needs to deliver. Rules that look good on paper but do not change what users experience every day are not enough. Technical expertise matters, particularly as AI raises questions that economists and lawyers alone cannot answer. The European Commission’s ongoing proceedings in AI distribution are a test of exactly this: whether regulators can move fast enough to ensure competing AI services are able to reach users before vertical integration entrenches dominance. And regulators need to be clear-eyed about a pattern that has emerged across jurisdictions: gatekeepers framing incomplete compliance as a deliberate policy choice, rather than acknowledging it as a failure to meet their obligations.</p>
<p>These are sophisticated companies, and they will keep testing what regulators will accept. The measure of this generation of digital market frameworks is not whether they passed through legislatures, but whether they can deliver real impact for people.</p>
<p>For Mozilla, that means ensuring the lessons travel: to desktop, to AI, and to every jurisdiction building its own version of these rules. Competition, choice, and true innovation in digital markets should be the norm, not the exception.</p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/06/23/building-competitive-digital-markets-from-rules-to-results/">Building Competitive Digital Markets: From Rules to Results</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.16]]></title>
<description><![CDATA[chore: bump version to 16.1.16]]></description>
<link>https://tsecurity.de/weiterlesen/3589231/3617370/v16116/</link>
<pubDate>Tue, 23 Jun 2026 08:39:17 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.16</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.15]]></title>
<description><![CDATA[chore: bump version to 16.1.15]]></description>
<link>https://tsecurity.de/weiterlesen/3587915/3616054/v16115/</link>
<pubDate>Mon, 22 Jun 2026 18:08:59 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.15</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.14]]></title>
<description><![CDATA[chore: bump version to 16.1.14]]></description>
<link>https://tsecurity.de/weiterlesen/3586429/3614568/v16114/</link>
<pubDate>Mon, 22 Jun 2026 07:39:22 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.14</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.13]]></title>
<description><![CDATA[chore: bump version to 16.1.13]]></description>
<link>https://tsecurity.de/weiterlesen/3586262/3614401/v16113/</link>
<pubDate>Mon, 22 Jun 2026 04:53:33 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.13</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.12]]></title>
<description><![CDATA[chore: bump version to 16.1.12]]></description>
<link>https://tsecurity.de/weiterlesen/3586110/3614249/v16112/</link>
<pubDate>Mon, 22 Jun 2026 01:23:00 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.12</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.11]]></title>
<description><![CDATA[chore: bump version to 16.1.11]]></description>
<link>https://tsecurity.de/weiterlesen/3585725/3613864/v16111/</link>
<pubDate>Sun, 21 Jun 2026 18:39:13 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.11</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.10]]></title>
<description><![CDATA[chore: bump version to 16.1.10]]></description>
<link>https://tsecurity.de/weiterlesen/3585077/3613216/v16110/</link>
<pubDate>Sun, 21 Jun 2026 08:52:54 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.10</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.9]]></title>
<description><![CDATA[Merge remote-tracking branch 'origin/farm/584fc779/fix-litellm-model-…]]></description>
<link>https://tsecurity.de/weiterlesen/3584835/3612974/v1619/</link>
<pubDate>Sun, 21 Jun 2026 04:23:45 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Merge remote-tracking branch 'origin/farm/584fc779/fix-litellm-model-…</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.8]]></title>
<description><![CDATA[chore: bump version to 16.1.8]]></description>
<link>https://tsecurity.de/weiterlesen/3584715/3612854/v1618/</link>
<pubDate>Sun, 21 Jun 2026 00:53:30 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.8</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[QUERY with curl]]></title>
<description><![CDATA[RFC 10008 is brand new a specification detailing the new HTTP method called QUERY: This specification defines the QUERY method for HTTP. A QUERY requests that the request target process the enclosed content in a safe and idempotent manner and then respond with the result of that processing. This ...]]></description>
<link>https://tsecurity.de/weiterlesen/3584695/3612834/query-with-curl/</link>
<pubDate>Sun, 21 Jun 2026 00:37:41 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[RFC 10008 is brand new a specification detailing the new HTTP method called QUERY: This specification defines the QUERY method for HTTP. A QUERY requests that the request target process the enclosed content in a safe and idempotent manner and then respond with the result of that processing. This is similar to POST requests but … <a href="https://daniel.haxx.se/blog/2026/06/21/query-with-curl/" class="more-link">Continue reading <span class="screen-reader-text">QUERY with curl</span> <span class="meta-nav">→</span></a>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.7]]></title>
<description><![CDATA[chore: bump version to 16.1.7]]></description>
<link>https://tsecurity.de/weiterlesen/3583481/3611620/v1617/</link>
<pubDate>Sat, 20 Jun 2026 05:52:49 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.7</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.6]]></title>
<description><![CDATA[chore: bump version to 16.1.6]]></description>
<link>https://tsecurity.de/weiterlesen/3583369/3611508/v1616/</link>
<pubDate>Sat, 20 Jun 2026 02:52:28 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.6</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.5]]></title>
<description><![CDATA[@oh-my-pi/pi-agent-core
Fixed

Wire-encoded normalizeTools parameters unconditionally so tools whose intent resolves to "omit" (function intent or intent: "omit", e.g. builtin eval / resolve) no longer leak raw arktype/zod schema objects in parameters (#3074)

@oh-my-pi/pi-coding-agent
Changed

R...]]></description>
<link>https://tsecurity.de/weiterlesen/3583143/3611282/v1615/</link>
<pubDate>Fri, 19 Jun 2026 22:53:13 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-agent-core</h2>
<h3>Fixed</h3>
<ul>
<li>Wire-encoded <code>normalizeTools</code> parameters unconditionally so tools whose <code>intent</code> resolves to <code>"omit"</code> (function intent or <code>intent: "omit"</code>, e.g. builtin <code>eval</code> / <code>resolve</code>) no longer leak raw arktype/zod schema objects in <code>parameters</code> (<a href="https://github.com/can1357/oh-my-pi/issues/3074" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/3074/hovercard">#3074</a>)</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Changed</h3>
<ul>
<li>Removed the legacy <code>AgentSession.nextToolChoice()</code> method. The per-turn tool-choice directive now flows solely through <code>nextToolChoiceDirective()</code> (which folds in the hard-choice dequeue plus active-tool filtering as a private helper), eliminating the dual entry point that let callers consume the queue while bypassing the soft pending-preview lifecycle. The underlying <code>ToolChoiceQueue.nextToolChoice()</code> is unchanged.</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix(agent): wire-encode normalizeTools parameters for omit-intent tools by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4703173416" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/3076" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/3076/hovercard" href="https://github.com/can1357/oh-my-pi/pull/3076">#3076</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v16.1.4...v16.1.5"><tt>v16.1.4...v16.1.5</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.4]]></title>
<description><![CDATA[chore: bump version to 16.1.4]]></description>
<link>https://tsecurity.de/weiterlesen/3583029/3611168/v1614/</link>
<pubDate>Fri, 19 Jun 2026 20:53:45 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.4</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.3]]></title>
<description><![CDATA[chore: bump version to 16.1.3]]></description>
<link>https://tsecurity.de/weiterlesen/3582710/3610849/v1613/</link>
<pubDate>Fri, 19 Jun 2026 17:53:13 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.3</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.2]]></title>
<description><![CDATA[chore: bump version to 16.1.2]]></description>
<link>https://tsecurity.de/weiterlesen/3582512/3610651/v1612/</link>
<pubDate>Fri, 19 Jun 2026 16:24:40 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.2</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.1]]></title>
<description><![CDATA[chore: bump version to 16.1.1]]></description>
<link>https://tsecurity.de/weiterlesen/3581449/3609588/v1611/</link>
<pubDate>Fri, 19 Jun 2026 09:09:32 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.1.1</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.1.0]]></title>
<description><![CDATA[tests: remove stale openrouter tests]]></description>
<link>https://tsecurity.de/weiterlesen/3581379/3609518/v1610/</link>
<pubDate>Fri, 19 Jun 2026 08:23:18 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>tests: remove stale openrouter tests</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.11]]></title>
<description><![CDATA[chore: bump version to 16.0.11]]></description>
<link>https://tsecurity.de/weiterlesen/3581155/3609294/v16011/</link>
<pubDate>Fri, 19 Jun 2026 05:07:48 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.0.11</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.10]]></title>
<description><![CDATA[chore: bump version to 16.0.10]]></description>
<link>https://tsecurity.de/weiterlesen/3580968/3609107/v16010/</link>
<pubDate>Fri, 19 Jun 2026 01:38:18 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.0.10</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.9]]></title>
<description><![CDATA[chore: bump version to 16.0.9]]></description>
<link>https://tsecurity.de/weiterlesen/3580807/3608946/v1609/</link>
<pubDate>Thu, 18 Jun 2026 23:08:47 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.0.9</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.8]]></title>
<description><![CDATA[chore: bump version to 16.0.8]]></description>
<link>https://tsecurity.de/weiterlesen/3580485/3608624/v1608/</link>
<pubDate>Thu, 18 Jun 2026 20:08:29 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.0.8</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.7]]></title>
<description><![CDATA[@oh-my-pi/pi-ai
Changed

Switched Google OAuth callback hostname from localhost to 127.0.0.1 to prevent IPv6 loopback fallback delays and proxy routing interception.

Fixed

Fixed OpenCode Go usage reporting to synthesize /usage limits from OMP-observed request costs for the 5h, weekly, and month...]]></description>
<link>https://tsecurity.de/weiterlesen/3580056/3608195/v1607/</link>
<pubDate>Thu, 18 Jun 2026 17:17:09 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-ai</h2>
<h3>Changed</h3>
<ul>
<li>Switched Google OAuth callback hostname from <code>localhost</code> to <code>127.0.0.1</code> to prevent IPv6 loopback fallback delays and proxy routing interception.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed OpenCode Go usage reporting to synthesize <code>/usage</code> limits from OMP-observed request costs for the 5h, weekly, and monthly provider caps. (<a href="https://github.com/can1357/oh-my-pi/issues/2942" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2942/hovercard">#2942</a>)</li>
<li>Fixed MiniMax Anthropic-compatible requests to serialize adaptive thinking without an invalid Anthropic <code>output_config.effort</code> tier (<a href="https://github.com/can1357/oh-my-pi/issues/2928" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2928/hovercard">#2928</a>).</li>
</ul>
<h2>@oh-my-pi/pi-catalog</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed MiniMax Anthropic-compatible M2/M3 thinking metadata to expose the adaptive transport and keep M2 mandatory reasoning floored (<a href="https://github.com/can1357/oh-my-pi/issues/2928" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2928/hovercard">#2928</a>).</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>/model</code> in the TUI to open the model setup picker again, leaving <code>/switch</code> as the temporary session model switcher (<a href="https://github.com/can1357/oh-my-pi/issues/2933" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2933/hovercard">#2933</a>).</li>
<li>Fixed OpenCode Go sessions recording per-request cost history so <code>/usage</code> can show local cap utilization. (<a href="https://github.com/can1357/oh-my-pi/issues/2942" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2942/hovercard">#2942</a>)</li>
</ul>
<h2>@oh-my-pi/pi-natives</h2>
<h3>Added</h3>
<ul>
<li>Added Fortran support to the AST tooling, including file/alias resolution.</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix(coding-agent): restore /model role picker by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4689481935" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2938" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2938/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2938">#2938</a></li>
<li>fix(ai/kimi): sanitize client device headers to avoid Cloudflare 520 errors by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/usr-bin-roygbiv/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/usr-bin-roygbiv">@usr-bin-roygbiv</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4689558875" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2939" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2939/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2939">#2939</a></li>
<li>fix(coding-agent): bypass stream-interrupted guard for Gemini malformed function calls by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/usr-bin-roygbiv/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/usr-bin-roygbiv">@usr-bin-roygbiv</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4689561146" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2940" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2940/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2940">#2940</a></li>
<li>fix(providers): add OpenCode Go usage reporting by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4690156672" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2947" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2947/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2947">#2947</a></li>
<li>perf(auth): switch Google OAuth callback hostname to 127.0.0.1 for fast loopback by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/cagedbird043/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/cagedbird043">@cagedbird043</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4689158706" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2932" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2932/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2932">#2932</a></li>
<li>fix(providers): map MiniMax Anthropic thinking by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4689304037" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2934" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2934/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2934">#2934</a></li>
<li>feat(coding-agent): add Fortran support by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/TobiasLinnITHE/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/TobiasLinnITHE">@TobiasLinnITHE</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4691385911" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2964" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2964/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2964">#2964</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/TobiasLinnITHE/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/TobiasLinnITHE">@TobiasLinnITHE</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4691385911" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2964" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2964/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2964">#2964</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v16.0.6...v16.0.7"><tt>v16.0.6...v16.0.7</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[This Week In Rust: This Week in Rust 656]]></title>
<description><![CDATA[Hello and welcome to another issue of This Week in Rust!
Rust is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
@thisweekinrust.bsky.social on Bluesky or
@ThisWeekinRu...]]></description>
<link>https://tsecurity.de/weiterlesen/3578528/3606667/this-week-in-rust-this-week-in-rust-656/</link>
<pubDate>Thu, 18 Jun 2026 07:08:48 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social, or
<a href="https://github.com/rust-lang/this-week-in-rust">send us a pull request</a>.
Want to get involved? <a href="https://github.com/rust-lang/rust/blob/main/CONTRIBUTING.md">We love contributions</a>.</p>
<p><em>This Week in Rust</em> is openly developed <a href="https://github.com/rust-lang/this-week-in-rust">on GitHub</a> and archives can be viewed at <a href="https://this-week-in-rust.org/">this-week-in-rust.org</a>.
If you find any errors in this week's issue, <a href="https://github.com/rust-lang/this-week-in-rust/pulls">please submit a PR</a>.</p>
<p>Want TWIR in your inbox? <a href="https://this-week-in-rust.us11.list-manage.com/subscribe?u=fd84c1c757e02889a9b08d289&amp;id=0ed8b72485">Subscribe here</a>.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4>

<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#projecttooling-updates">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://arxiv.org/abs/2606.15991">cuTile Rust - Fearless Concurrency on the GPU, memory-safe, data-race-free GPU kernels, B200 benchmarks</a></li>
<li><a href="https://www.iroh.computer/blog/v1">Iroh 1.0 - Dial Keys, not IPs</a></li>
<li><a href="https://manishearth.github.io/blog/2026/06/14/diplomat-multi-language-ffi-for-rust-libraries/">Diplomat - Multi-language FFI for Rust libraries</a></li>
<li><a href="https://sergey-melnychuk.github.io/2026/05/23/yevm/">I built EVM from scratch. Again.</a></li>
<li><a href="https://zelanton.github.io/processkit/">processkit 1.0 - async process tree management</a></li>
<li><a href="https://github.com/obazin/litchee/releases/tag/v0.1.0">litchee: Rust Lichess API client</a></li>
<li><a href="https://jolars.co/blog/2026-06-10-basin/">Basin - Numerical Optimization in Rust</a></li>
<li><a href="https://github.com/carboxyl-rs/carboxyl/releases/tag/v0.1.0-servo-rc.1">Carboxyl 0.1.0-rc - A servo-based browser for the terminal</a></li>
<li><a href="https://github.com/kunobi-ninja/kache/releases/tag/v0.6.0">kache 0.6.0 - a shareable Rust + C/C++ build cache</a></li>
<li><a href="https://github.com/GianIac/numax/releases/tag/v0.1.0">numax v0.1.0 - first stable release of the numax distributed WASM runtime</a></li>
<li><a href="https://dev.to/etoile_bleu/-i-built-a-sync-engine-for-clinics-that-run-on-2g-and-lose-power-mid-transfer-here-is-why-and-18od">ZamSync - offline-first Rust sync engine</a></li>
<li><a href="https://dev.to/phpcraftdream/ktav-i-got-fed-up-with-every-config-format-so-i-built-one-with-no-quotes-no-commas-no-54an">Ktav - a quote-free config format</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#observationsthoughts">Observations/Thoughts</a></h5>
<ul>
<li><a href="https://trifectatech.org/blog/zlib-rs-in-firefox/">zlib-rs in Firefox</a></li>
<li><a href="https://corrode.dev/blog/rust-prevents-data-races-not-race-conditions/">Rust Prevents Data Races, Not Race Conditions</a></li>
<li><a href="https://fnordig.de/2026/06/16/build-your-project-zig-style/">Build your project Zig-style</a></li>
<li><a href="https://kobzol.github.io/rust/2026/06/15/how-memory-safety-cves-differ-between-rust-and-c-cpp.html">How memory safety CVEs differ between Rust and C/C++</a></li>
<li><a href="https://kerkour.com/stdx-cratesio">Why stdx is not on crates.io</a></li>
<li>[videos] <a href="https://www.youtube.com/watch?v=PrfMpCaIh0k&amp;list=PL8Q1w7Ff68DBpmF38rcIAf8Z9Gj2TnlgM">RustWeek 2026 by RustNL, all talks playlist</a></li>
<li><a href="https://www.p2claw.com/blog/2026-06-09-the-ipad-was-on-tailscale/">The iPad was on Tailscale</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-walkthroughs">Rust Walkthroughs</a></h5>
<ul>
<li><a href="https://blog.sheerluck.dev/posts/learn-rust-concurrency-by-building-a-thread-pool/">Learn Rust Concurrency By Building a Thread Pool</a></li>
<li><a href="https://grack.com/blog/2026/06/11/life-before-main/">There Is Life Before Main in Rust</a></li>
<li><a href="https://wolfgirl.dev/blog/2026-06-16-async-task-locals-from-scratch/">Async Task Locals From Scratch</a></li>
<li><a href="https://dystroy.org/blog/picomobile/">Fearless Embedded Rust: Driving a Lego Car with a Pico W</a></li>
<li><a href="https://smista.ai/blog/how-we-built-a-provider-agnostic-llm-layer-in-rust-with-rig">Building a provider-agnostic LLM layer in Rust with Rig</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#miscellaneous">Miscellaneous</a></h5>
<ul>
<li>[video] <a href="https://2026.rustweek.org/blog/2026-06-10-rustweek-recordings-published/">RustWeek 2026 talk recordings</a></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#crate-of-the-week">Crate of the Week</a></h4>
<p>This week's crate is <a href="https://github.com/ArneCode/marser">marser</a>, a parser combinator library with a twist.</p>
<p>Thanks to <a href="https://users.rust-lang.org/t/crate-of-the-week/2704/1611">Arne Code</a> for the self-suggestion!</p>
<p><a href="https://users.rust-lang.org/t/crate-of-the-week/2704">Please submit your suggestions and votes for next week</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#calls-for-testing">Calls for Testing</a></h4>
<p>An important step for RFC implementation is for people to experiment with the
implementation and give feedback, especially before stabilization.</p>
<p>If you are a feature implementer and would like your RFC to appear in this list, add a
<code>call-for-testing</code> label to your RFC along with a comment providing testing instructions and/or
guidance on which aspect(s) of the feature need testing.</p>
<p><em>No calls for testing were issued this week by
<a href="https://github.com/rust-lang/rust/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rust</a>,
<a href="https://github.com/rust-lang/cargo/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/rustup/issues?q=state%3Aopen%20label%3Acall-for-testing%20state%3Aopen">Rustup</a> or
<a href="https://github.com/rust-lang/rfcs/issues?q=label%3Acall-for-testing%20state%3Aopen">Rust language RFCs</a>.</em></p>
<p><a href="https://github.com/rust-lang/this-week-in-rust/issues">Let us know</a> if you would like your feature to be tracked as a part of this list.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#call-for-participation-projects-and-speakers">Call for Participation; projects and speakers</a></h4>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cfp-projects">CFP - Projects</a></h5>
<p>Always wanted to contribute to open-source projects but did not know where to start?
Every week we highlight some tasks from the Rust community for you to pick and get started!</p>
<p>Some of these tasks may also have mentors available, visit the task page for more information.</p>


<ul>
<li><a href="https://github.com/satyakwok/solana-infra-doctor/issues/77">solana-infra-doctor - List exit codes in <code>sol-doctor --help</code></a></li>
<li><a href="https://github.com/satyakwok/solana-infra-doctor/issues/78">solana-infra-doctor - Make the invalid-URL error suggest the expected scheme</a></li>
<li><a href="https://github.com/satyakwok/solana-infra-doctor/issues/79">solana-infra-doctor - Add a glossary of RPC readiness terms</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/38">openslate - add unit tests for slugify() in api/src/notes.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/70">openslate - add integration tests for notes CRUD in api/src/notes.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/96">openslate - add integration tests for auth flow in api/src/users.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/89">openslate - add unit tests for build_fts_query() in api/src/search.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/106">openslate - add integration tests for auth middleware and logout in api/src/auth.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/85">openslate - add integration tests for media endpoints (DB layer) in api/src/media.rs</a></li>
<li><a href="https://github.com/MrSheerluck/openslate/issues/40">openslate - add unit tests for ext_from_mime() and filename_from_url() in api/src/media.rs</a></li>
</ul>


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



<p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://github.com/rust-lang/this-week-in-rust">PR to TWiR</a> or by reaching out on <a href="https://bsky.app/profile/thisweekinrust.bsky.social">Bluesky</a> or <a href="https://mastodon.social/@thisweekinrust">Mastodon</a>!</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-the-rust-project">Updates from the Rust Project</a></h4>
<p>527 pull requests were <a href="https://github.com/search?q=is%3Apr+org%3Arust-lang+is%3Amerged+merged%3A2026-06-09..2026-06-16">merged in the last week</a></p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler">Compiler</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/156187"><code>obligations_for_self_ty</code>: skip irrelevant goals (recompute <code>sub_root</code> from <code>stalled_vars)</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157768"><code>codegen_ssa</code>: peel trans. wrappers on scalable vecs</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156934">add a check for impossible predicates to <code>trivial_const</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156816">add unstable loop unrolling hint attributes</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157714">improve polymorphization of raw pointer formatting</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155200">introduce <code>#[diagnostic::on_type_error(message)]</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157781">perf: reuse green-marking's edge walk when promoting a node</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#library">Library</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/157355">add <code>or_try_*</code> variants for <code>HashMap</code> and <code>BTreeMap</code> Entry APIs</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/149749">make <code>BorrowedBuf</code> and <code>BorrowedCursor</code> generic over the data</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155527">replace printables table with <code>unicode_data.rs</code> tables</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157876">stabilize <code>#![feature(box_as_ptr)]</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/156629">stabilize <code>core::range::{legacy, RangeFull, RangeTo}</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/152544">stabilize <code>int_format_into</code> feature</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157877">stabilize <code>nonzero_from_str_radix</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157029">stabilize feature <code>float_algebraic</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#cargo">Cargo</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/cargo/pull/17104"><code>trim-paths</code>: emit <code>CARGO_TRIM_PATHS_REMAP</code> for build.rs</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17101"><code>diag</code>: Give diagnostics the same display path behavior as rustc</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17095"><code>diag</code>: Report all errors, in order</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17071"><code>publish</code>: avoid false deadlock when <code>to_confirm</code> is non-empty</a></li>
<li><a href="https://github.com/rust-lang/cargo/pull/17083"><code>resolver</code>: move yank policy to resolver layer</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rustdoc">Rustdoc</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/141000">also run lint <code>unused_doc_comments</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157874">cleanup and (micro-)optimize <code>print_where_clause</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157740">correct doctest span for trailing semicolon after item</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157838">don't strip hidden items in <code>AliasedNonLocalStripper</code></a></li>
<li><a href="https://github.com/rust-lang/rust/pull/157796">some more lazy formatting</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rustfmt">Rustfmt</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rustfmt/pull/6616">add <code>doc_comment_code_block_small_heuristics</code>, to override <code>use_small_heuristics</code> in doc code</a></li>
<li><a href="https://github.com/rust-lang/rustfmt/pull/6935">stabilize <code>hex_literal_case</code></a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#clippy">Clippy</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17042">new <code>by_ref_peekable_peek</code> lint</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17192">add <code>with_capacity_zero</code> lint</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17191"><code>mem_replace_with_default</code>: also emit inside macros</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17175"><code>infallible_destructuring_match</code>: clean-up, split off the suggestion from the main message</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17184"><code>manual_is_variant_and</code>: lint <code>result.ok().is_some_and(f)</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17171"><code>needless_borrow</code>: same-name methods false positive</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17216"><code>unnecessary_lazy_evaluations</code>: handle closure <code>-&gt;</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17208">deprecate the <code>from_iter_instead_of_collect</code> lint</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17204">remove <code>is_integer_const</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17250">do not trigger <code>ref_patterns</code> lint on automatically derived code</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17145">enhance never loop</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/15779">add profile-specific configuration for disallowed methods and types</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16749">fix <code>collapsible_match</code> suggests wrongly when match body has no braces</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/16868">fix <code>unnecessary_sort_by</code> reverse suggestion using wrong closure parameter name</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17107">fix redundant closure call async false positive</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17218">perf: check <code>is_in_test</code> last in <code>incompatible_msrv</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17219">perf: check the token kind before extracting source in early literal lints</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17220">perf: match expression shape before MSRV check in <code>cloned_ref_to_slice_refs</code></a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17217">perf: skip <code>doc_markdown</code> text collection and word scan when the lint is allowed</a></li>
<li><a href="https://github.com/rust-lang/rust-clippy/pull/17225">perf: skip <code>single_component_path_imports</code> module walk when nothing to lint</a></li>
</ul>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-analyzer">Rust-Analyzer</a></h6>
<ul>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22562">create directory for <code>cargo xtask metrics rustc_tests</code></a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22575">don't count C-variadic <code>...</code> as a parameter for fn pointers</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22549">support flyimport exclude variants</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22566">fix destructuring assignments not introducing moves</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22584">offer inline macro in macro call and proc macro</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22591">prefer bench command when target is bench to avoid cargo run</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22551">supports inline variable in macro</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22574">use package id as argument to <code>--package</code> if package is not unique</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22545">assist <code>inline_type_alias</code> work on ADT definitions</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22579">perf: defer initial workspace flycheck until cache priming completes</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22561">remove docs about removed <code>analysis-bench</code> command</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22571">remove unnecessary feature flags from tests</a></li>
<li><a href="https://github.com/rust-lang/rust-analyzer/pull/22585">use ASCII lowercase for dylib extensions check</a></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-compiler-performance-triage">Rust Compiler Performance Triage</a></h5>
<p>This week we had quite a lot of changes, a few small regressions that were a bit tough to diagnose, but the week is largely positive, overall.
Notably, we got one massive improvement on the next-solver benchmark in #<a href="https://github.com/rust-lang/rust/pull/156187">156187</a>,
and a nice speedup for incremental in <a href="https://github.com/rust-lang/rust/pull/157781">#157781</a>.</p>
<p>Triage done by <strong>@panstromek</strong>.
Revision range: <a href="https://perf.rust-lang.org/?start=f3ef3bd882dd24a275a60701a67c3bb330edd8c1&amp;end=b5d46ecb51c3e4134b82570cfe718f093daa6390&amp;absolute=false&amp;stat=instructions%3Au">f3ef3bd8..b5d46ecb</a></p>
<p><strong>Summary</strong>:</p>
<table>
<thead>
<tr>
<th>(instructions:u)</th>
<th>mean</th>
<th>range</th>
<th>count</th>
</tr>
</thead>
<tbody>
<tr>
<td>Regressions ❌ <br> (primary)</td>
<td>0.4%</td>
<td>[0.2%, 0.6%]</td>
<td>22</td>
</tr>
<tr>
<td>Regressions ❌ <br> (secondary)</td>
<td>0.5%</td>
<td>[0.1%, 2.0%]</td>
<td>40</td>
</tr>
<tr>
<td>Improvements ✅ <br> (primary)</td>
<td>-1.8%</td>
<td>[-5.9%, -0.1%]</td>
<td>125</td>
</tr>
<tr>
<td>Improvements ✅ <br> (secondary)</td>
<td>-3.8%</td>
<td>[-69.4%, -0.1%]</td>
<td>90</td>
</tr>
<tr>
<td>All ❌✅ (primary)</td>
<td>-1.5%</td>
<td>[-5.9%, 0.6%]</td>
<td>147</td>
</tr>
</tbody>
</table>
<p>1 Regression, 4 Improvements, 8 Mixed; 5 of them in rollups
28 artifact comparisons made in total</p>
<p><a href="https://github.com/rust-lang/rustc-perf/blob/d36b1ad8679b65efbb98252fbb93f72a7d90d4c6/triage/2026/2026-06-16.md">Full report here</a></p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#approved-rfcs"></a><a href="https://github.com/rust-lang/rfcs/commits/master">Approved RFCs</a></h5>
<p>Changes to Rust follow the Rust <a href="https://github.com/rust-lang/rfcs#rust-rfcs">RFC (request for comments) process</a>. These
are the RFCs that were approved for implementation this week:</p>
<ul>
<li><em>No RFCs were approved this week.</em></li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#final-comment-period">Final Comment Period</a></h5>
<p>Every week, <a href="https://www.rust-lang.org/team.html">the team</a> announces the 'final comment period' for RFCs and key PRs
which are reaching a decision. Express your opinions now.</p>
<h6><a class="toclink" href="https://this-week-in-rust.org/atom.xml#tracking-issues-prs">Tracking Issues &amp; PRs</a></h6>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust"></a><a href="https://github.com/rust-lang/rust/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Rust</a>
<ul>
<li><a href="https://github.com/rust-lang/rust/pull/156047">Fix trait method resolution on an adjusted never type</a></li>
<li><a href="https://github.com/rust-lang/rust/issues/76314">Tracking Issue for atomic_from_mut</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/155499">stabilize never type</a></li>
<li><a href="https://github.com/rust-lang/rust/pull/153563">Lint against iterator functions that panic when N is zero</a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#compiler-team-mcps-only"></a><a href="https://github.com/rust-lang/compiler-team/issues?q=label%3Amajor-change%20label%3Afinal-comment-period%20state%3Aopen">Compiler Team</a> <a href="https://forge.rust-lang.org/compiler/mcp.html">(MCPs only)</a>
<ul>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1002">Single-byte counter support in coverage instrumentation</a></li>
<li><a href="https://github.com/rust-lang/compiler-team/issues/1003">Rename the compiler files containing struct diagnostics to <code>diagnostics.rs</code></a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#leadership-council"></a><a href="https://github.com/rust-lang/leadership-council/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Leadership Council</a>
<ul>
<li><a href="https://github.com/rust-lang/leadership-council/issues/301">Delegate Project Grants to the Funding team</a></li>
<li><a href="https://github.com/rust-lang/leadership-council/issues/304">Allocate budget to the Funding team</a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#rust-rfcs"></a><a href="https://github.com/rust-lang/rfcs/issues?q=state%3Aopen%20label%3Afinal-comment-period%20state%3Aopen">Rust RFCs</a>
<ul>
<li><a href="https://github.com/rust-lang/rfcs/pull/3955">Named Fn trait parameters</a></li>
</ul>
<a class="toclink" href="https://this-week-in-rust.org/atom.xml#language-reference"></a><a href="https://github.com/rust-lang/reference/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Reference</a>
<ul>
<li><a href="https://github.com/rust-lang/reference/pull/2262">Structs with no fields or all-ZST fields are ZSTs</a></li>
</ul>
<p><em>No Items entered Final Comment Period this week for
<a href="https://github.com/rust-lang/cargo/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Cargo</a>,
<a href="https://github.com/rust-lang/lang-team/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Language Team</a> or
<a href="https://github.com/rust-lang/unsafe-code-guidelines/issues?q=is%3Aopen%20label%3Afinal-comment-period%20sort%3Aupdated-desc%20state%3Aopen">Unsafe Code Guidelines</a>.</em></p>
<p>Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#new-and-updated-rfcs"></a><a href="https://github.com/rust-lang/rfcs/pulls">New and Updated RFCs</a></h5>
<ul>
<li><em>No New or Updated RFCs were created this week.</em></li>
</ul>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#upcoming-events">Upcoming Events</a></h4>
<p>Rusty Events between 2026-06-17 - 2026-07-15 🦀</p>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#virtual">Virtual</a></h5>
<ul>
<li>2026-06-17 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314000478/"><strong>Rust Study/Hack/Hang-out</strong></a></li>
</ul>
</li>
<li>2026-06-17 | Virtual (Girona, ES) | <a href="https://lu.ma/rust-girona">Rust Girona</a><ul>
<li><a href="https://luma.com/ekws5nr4"><strong>Weekly coding session</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314236370/"><strong>June, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455931/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-06-21 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314329044/"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254779/"><strong>Fourth Tuesday</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/313767883/"><strong>Lunch &amp; Learn: What the heck are monads - and how do we fake them in Rust</strong></a></li>
</ul>
</li>
<li>2026-07-01 | Virtual (Indianapolis, IN, US) | <a href="https://www.meetup.com/indyrs">Indy Rust</a><ul>
<li><a href="https://www.meetup.com/indyrs/events/315210366/"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Virtual (Berlin, DE) | <a href="https://www.meetup.com/rust-berlin/events/">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/308455932/"><strong>Rust Hack and Learn</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Virtual (Charlottesville, VA, US) | <a href="https://www.meetup.com/charlottesville-rust-meetup/events/">Charlottesville Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/charlottesville-rust-meetup/events/315211402/"><strong>Learning Game Development the Hard Way with Rust and Bevy</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Virtual (Nürnberg, DE) | <a href="https://www.meetup.com/rust-noris/events/">Rust Nuremberg</a><ul>
<li><a href="https://www.meetup.com/rust-noris/events/313345243/"><strong>Rust Nürnberg online</strong></a></li>
</ul>
</li>
<li>2026-07-05 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust/events/">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/314095287/"><strong>Rust Deep Learning: First Sunday</strong></a></li>
</ul>
</li>
<li>2026-07-07 | Virtual (London, UK) | <a href="https://www.meetup.com/women-in-rust/events/">Women in Rust</a><ul>
<li><a href="https://www.meetup.com/women-in-rust/events/315060981/"><strong>👋 Community Catch Up</strong></a></li>
</ul>
</li>
<li>2026-07-14 | Virtual (Dallas, TX, US) | <a href="https://www.meetup.com/dallasrust/events/">Dallas Rust User Meetup</a><ul>
<li><a href="https://www.meetup.com/dallasrust/events/310254778/"><strong>Second Tuesday</strong></a></li>
</ul>
</li>
<li>2026-07-15 | Virtual (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust/events/">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314233743/"><strong>Jiff</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#europe">Europe</a></h5>
<ul>
<li>2026-06-18 | Aarhus, DK | <a href="https://www.meetup.com/rust-aarhus">Rust Aarhus</a><ul>
<li><a href="https://www.meetup.com/rust-aarhus/events/314965238/"><strong>Talk Night at Danske Commodities</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Edinburgh, GB | <a href="https://www.meetup.com/rust-edi/events/">Rust and Friends</a><ul>
<li><a href="https://www.meetup.com/rust-and-friends/events/315093492/"><strong>Rust and Friends comes to Glasgow! (daytime coffee)</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Edinburgh, GB | <a href="https://www.meetup.com/rust-edi/events/">Rust and Friends</a><ul>
<li><a href="https://www.meetup.com/rust-and-friends/events/315093500/"><strong>Rust and Friends comes to Glasgow! (evening pub)</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Barcelona, ES | <a href="https://www.meetup.com/bcnrust/events/">BcnRust</a><ul>
<li><a href="https://www.meetup.com/bcnrust/events/315094938/"><strong>21st BcnRust Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-19 | Dresden, DE | <a href="https://github.com/rust-dresden">Rust Dresden</a><ul>
<li><a href="https://pretix.eu/rust-dresden/on-location-2"><strong>Second Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Paris, FR | <a href="https://www.meetup.com/rust-paris">Rust Paris</a><ul>
<li><a href="https://www.meetup.com/rust-paris/events/315040676/"><strong>Rust meetup #86</strong></a></li>
</ul>
</li>
<li>2026-06-23 | Warsaw, PL | <a href="https://luma.com/rust.in.warsaw">Rust Warsaw</a><ul>
<li><a href="https://luma.com/djs7ntfx"><strong>Rust Warsaw Meetup: June 2026</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Manchester, GB | <a href="https://www.meetup.com/rust-manchester/events/">Rust Manchester</a><ul>
<li><a href="https://www.meetup.com/rust-manchester/events/315200163/"><strong>Rust Manchester June Talks</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Berlin, DE | <a href="https://www.meetup.com/rust-berlin">Rust Berlin</a><ul>
<li><a href="https://www.meetup.com/rust-berlin/events/314396600/"><strong>Rust Berlin Talks: The next generation</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Copenhagen, DK | <a href="https://www.meetup.com/copenhagen-rust-community/events/">Copenhagen Rust Community</a><ul>
<li><a href="https://www.meetup.com/copenhagen-rust-community/events/315214426/"><strong>Rust meetup #69</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Edinburgh, GB | <a href="https://www.meetup.com/rust-edi/events/">Rust and Friends</a><ul>
<li><a href="https://www.meetup.com/rust-and-friends/events/314941098/"><strong>Bevy, Bits, &amp; Cats (Rust July Talks)</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Enschede, OV, NL | <a href="https://www.meetup.com/dutch-rust-meetup/events/">Baseflow Tech Meetups</a><ul>
<li><a href="https://www.meetup.com/baseflow-tech-meetups/events/315099547/"><strong>AI Summit</strong></a></li>
</ul>
</li>
<li>2026-07-08 | Dublin, IE | <a href="https://www.meetup.com/rust-dublin/events/">Rust Dublin</a><ul>
<li><a href="https://www.meetup.com/rust-dublin/events/315150327/"><strong>Join us live and INPERSON for Rust 261</strong></a></li>
</ul>
</li>
<li>2026-07-09 | Switzerland, CH | <a href="https://www.posttenebraslab.ch/wiki/events/start">PostTenebrasLab</a><ul>
<li><a href="https://www.posttenebraslab.ch/wiki/events/monthly_meeting/rust_meetup"><strong>Rust Meetup Geneva</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#north-america">North America</a></h5>
<ul>
<li>2026-06-17 | Hybrid (Vancouver, BC, CA) | <a href="https://www.meetup.com/vancouver-rust">Vancouver Rust</a><ul>
<li><a href="https://www.meetup.com/vancouver-rust/events/314000478/"><strong>Rust Study/Hack/Hang-out</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Hybrid (Seattle, WA, US) | <a href="https://www.meetup.com/join-srug">Seattle Rust User Group</a><ul>
<li><a href="https://www.meetup.com/seattle-rust-user-group/events/314236370/"><strong>June, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-18 | Nashville, TN, US | <a href="https://www.meetup.com/music-city-rust-developers/events/">Music City Rust Developers</a><ul>
<li><a href="https://www.meetup.com/music-city-rust-developers/events/315213927/"><strong>Community Meetup</strong></a></li>
</ul>
</li>
<li>2026-06-20 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust/events/">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225854/"><strong>Northeastern Rust Lunch, June 20</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Austin, TX, US | <a href="https://www.meetup.com/rust-atx/events/">Rust ATX</a><ul>
<li><a href="https://www.meetup.com/rust-atx/events/315105633/"><strong>Rust Lunch - Fareground</strong></a></li>
</ul>
</li>
<li>2026-06-24 | Los Angeles, CA, US | <a href="https://www.meetup.com/rust-los-angeles">Rust Los Angeles</a><ul>
<li><a href="https://www.meetup.com/rust-los-angeles/events/314386080/"><strong>Rust LA: Rust-Based Constraint Solvers in 2D Sketching with Zoo Technologies</strong></a></li>
</ul>
</li>
<li>2026-06-25 | Atlanta, GA, US | <a href="https://www.meetup.com/rust-atl">Rust Atlanta</a><ul>
<li><a href="https://www.meetup.com/rust-atl/events/313539326/"><strong>Rust-Atl</strong></a></li>
</ul>
</li>
<li>2026-06-26 | New York, NY, US | <a href="https://www.meetup.com/rust-nyc">Rust NYC</a><ul>
<li><a href="https://www.meetup.com/rust-nyc/events/315014582/"><strong>Rust NYC's Big Summer Social</strong></a></li>
</ul>
</li>
<li>2026-06-27 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust/events/">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225857/"><strong>Somerville Union Square Rust Lunch, June 27</strong></a></li>
</ul>
</li>
<li>2026-07-02 | Saint Louis, MO, US | <a href="https://www.meetup.com/stl-rust/events/">STL Rust</a><ul>
<li><a href="https://www.meetup.com/stl-rust/events/315103359/"><strong>Git is easy?</strong></a></li>
</ul>
</li>
<li>2026-07-04 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust/events/">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225861/"><strong>Boston University Rust Lunch, July 4</strong></a></li>
</ul>
</li>
<li>2026-07-09 | Lehi, UT, US | <a href="https://www.meetup.com/utah-rust/events/">Utah Rust</a><ul>
<li><a href="https://www.meetup.com/utah-rust/events/314696647/"><strong>Utah Rust July Meetup</strong></a></li>
</ul>
</li>
<li>2026-07-11 | Boston, MA, US | <a href="https://www.meetup.com/bostonrust/events/">Boston Rust Meetup</a><ul>
<li><a href="https://www.meetup.com/bostonrust/events/315225865/"><strong>MIT Rust Lunch, July 11</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#oceania">Oceania</a></h5>
<ul>
<li>2026-06-25 | Melbourne, AU | <a href="https://www.meetup.com/rust-melbourne">Rust Melbourne</a><ul>
<li><a href="https://www.meetup.com/rust-melbourne/events/315039461/"><strong>Rust Melbourne June 2026</strong></a></li>
</ul>
</li>
</ul>
<h5><a class="toclink" href="https://this-week-in-rust.org/atom.xml#south-america">South America</a></h5>
<ul>
<li>2026-06-18 | Florianópolis, BR | <a href="https://luma.com/rust-sc">Rust SC</a><ul>
<li><a href="https://luma.com/acinctdf"><strong>Rust Floripa</strong></a></li>
</ul>
</li>
</ul>
<p>If you are running a Rust event please add it to the <a href="https://www.google.com/calendar/embed?src=apd9vmbc22egenmtu5l6c5jbfc%40group.calendar.google.com">calendar</a> to get
it mentioned here. Please remember to add a link to the event too.
Email the <a href="mailto:community-team@rust-lang.org">Rust Community Team</a> for access.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#jobs">Jobs</a></h4>
<p>Please see the latest <a href="https://www.reddit.com/r/rust/comments/1ttbtf5/official_rrust_whos_hiring_thread_for_jobseekers/">Who's Hiring thread on r/rust</a></p>
<h3><a class="toclink" href="https://this-week-in-rust.org/atom.xml#quote-of-the-week">Quote of the Week</a></h3>
<blockquote>
<p>"The never type is named after the date of its stabilization" was a good joke while it lasted.</p>
</blockquote>
<p>– <a href="https://www.reddit.com/r/rust/comments/1u1v53c/the_never_type_is_likely_to_stabilize_soon/oqss8ii/">Sergey "Shnatsel" Davidoff on /r/rust</a></p>
<p>Thanks to <a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328/1780">Dos Moonen</a> for the suggestion!</p>
<p><a href="https://users.rust-lang.org/t/twir-quote-of-the-week/328">Please submit quotes and vote for next week!</a></p>
<p>This Week in Rust is edited by:</p>
<ul>
<li><a href="https://github.com/nellshamrell">nellshamrell</a></li>
<li><a href="https://github.com/llogiq">llogiq</a></li>
<li><a href="https://github.com/ericseppanen">ericseppanen</a></li>
<li><a href="https://github.com/extrawurst">extrawurst</a></li>
<li><a href="https://github.com/U007D">U007D</a></li>
<li><a href="https://github.com/mariannegoldin">mariannegoldin</a></li>
<li><a href="https://github.com/bdillo">bdillo</a></li>
<li><a href="https://github.com/opeolluwa">opeolluwa</a></li>
<li><a href="https://github.com/bnchi">bnchi</a></li>
<li><a href="https://github.com/KannanPalani57">KannanPalani57</a></li>
<li><a href="https://github.com/tzilist">tzilist</a></li>
</ul>
<p><em>Email list hosting is sponsored by <a href="https://foundation.rust-lang.org/">The Rust Foundation</a></em></p>
<p><small><a href="https://this-week-in-rust.org/REDDIT_LINK_HERE">Discuss on r/rust</a></small></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.6]]></title>
<description><![CDATA[chore: bump version to 16.0.6]]></description>
<link>https://tsecurity.de/weiterlesen/3578318/3606457/v1606/</link>
<pubDate>Thu, 18 Jun 2026 03:22:48 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.0.6</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Tooling Announcements: New Deploy of PerfCompare (June 17th)]]></title>
<description><![CDATA[The latest version of PerfCompare is now live!
Check out the change-log below to see the updates:
[andra - esanuandra ]

PCF-391 The keyboard handling for the revision dropdown should be done differently (#926)

[david - davidmiculit ]

Bug 2040649 - Remove Raptor framework from PerfCompare (#104...]]></description>
<link>https://tsecurity.de/weiterlesen/3577508/3605647/firefox-tooling-announcements-new-deploy-of-perfcompare-june-17th/</link>
<pubDate>Wed, 17 Jun 2026 19:24:01 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>The latest version of<a href="https://perf.compare/" rel="noopener nofollow ugc"> PerfCompare</a> is now live!</p>
<p>Check out the change-log below to see the updates:</p>
<p>[andra - <a href="https://github.com/mozilla/perfcompare/commits?author=esanuandra" rel="noopener nofollow ugc">esanuandra </a>]</p>
<ul>
<li>PCF-391 The keyboard handling for the revision dropdown should be done differently <strong>(</strong><span class="hashtag-raw">#926</span>)</li>
</ul>
<p>[david - <a href="https://github.com/mozilla/perfcompare/commits?author=davidmiculit" rel="noopener nofollow ugc">davidmiculit</a> ]</p>
<ul>
<li>Bug 2040649 - Remove Raptor framework from PerfCompare (<span class="hashtag-raw">#1042</span>)</li>
</ul>
<p>[kala - <a href="https://github.com/mozilla/perfcompare/commits?author=kala-moz" rel="noopener nofollow ugc">kala-moz</a> ]</p>
<ul>
<li>
<p>Results Page: Return the scatter series for base and new back to original order (<span class="hashtag-raw">#1046</span>)</p>
</li>
<li>
<p>Bug: 2044194 Port client-side KDE mode detection from kde-widget into CommonGraph (<span class="hashtag-raw">#1045</span>)</p>
</li>
<li>
<p>Bug 2034263: Give subtest column in subtest page a max-width (<span class="hashtag-raw">#1047</span>)</p>
</li>
</ul>
<p>[paul - <a href="https://github.com/mozilla/perfcompare/commits?author=padenot" rel="noopener nofollow ugc">padenot</a>]</p>
<ul>
<li>
<p>Two small followups on modal-work (<span class="hashtag-raw">#1049</span>)</p>
</li>
<li>
<p>Assorted fixes to improve the app when numbers are very large and not measuring time. (<span class="hashtag-raw">#1050</span>)</p>
</li>
</ul>
<p>Thank you for the contributions!</p>
<p>Bugs or feature requests can be<a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Testing&amp;component=PerfCompare&amp;status_whiteboard=%5Bpcf%5D"> filed on Bugzilla</a>. The team can also be found on<a href="https://matrix.to/#/%23perfcompare:mozilla.org" rel="noopener nofollow ugc"> the #perfcompare channel on Element</a>. Come and chat!</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/new-deploy-of-perfcompare-june-17th/148663">Read full topic</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.5]]></title>
<description><![CDATA[test(coding-agent): added OpenAI key initialization in context test s…]]></description>
<link>https://tsecurity.de/weiterlesen/3576844/3604983/v1605/</link>
<pubDate>Wed, 17 Jun 2026 15:39:09 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>test(coding-agent): added OpenAI key initialization in context test s…</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.4]]></title>
<description><![CDATA[chore: bump version to 16.0.4]]></description>
<link>https://tsecurity.de/weiterlesen/3575830/3603969/v1604/</link>
<pubDate>Wed, 17 Jun 2026 09:53:28 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.0.4</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.3]]></title>
<description><![CDATA[@oh-my-pi/pi-ai
Added

Exported renderDelimitedThinking from the @oh-my-pi/pi-ai/dialect barrel so consumers can reuse the dialect's  envelope unwrap-and-rewrap logic (the only ./dialect/rendering primitive re-exported; the rest stay dialect-internal).

Fixed

Fixed OpenAI Responses/Codex tool sc...]]></description>
<link>https://tsecurity.de/weiterlesen/3575238/3603377/v1603/</link>
<pubDate>Wed, 17 Jun 2026 02:23:16 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-ai</h2>
<h3>Added</h3>
<ul>
<li>Exported <code>renderDelimitedThinking</code> from the <code>@oh-my-pi/pi-ai/dialect</code> barrel so consumers can reuse the dialect's <code>&lt;thinking&gt;</code> envelope unwrap-and-rewrap logic (the only <code>./dialect/rendering</code> primitive re-exported; the rest stay dialect-internal).</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed OpenAI Responses/Codex tool schema normalization stripping provider-rejected regex lookaround patterns from MCP tool parameter schemas. (<a href="https://github.com/can1357/oh-my-pi/issues/2784" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2784/hovercard">#2784</a>)</li>
<li>Fixed OpenAI Responses parallel tool-call routing so late keyed argument deltas for a closed call are dropped instead of being appended to another open call.</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Added</h3>
<ul>
<li>Added support for LaTeX color commands (<code>\textcolor</code>, <code>\colorbox</code>, and <code>\fcolorbox</code>) in user-visible terminal prose and final chat to colorize output</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Changed STT dependency setup to validate recorder and model assets per <code>stt.modelName</code>, so switching speech models re-runs dependency checks and downloads for the new model</li>
<li>Changed STT startup with cached models to warm the speech model in the background and defer full model loading until transcription begins, reducing push-to-talk start latency</li>
<li>Allowed user-visible terminal and final-chat responses to include LaTeX math delimiters/commands and Mermaid <code>```mermaid</code> diagrams</li>
<li>Changed the hold-<code>Space</code> push-to-talk gesture to recognize a held bar from the <em>regularity</em> of the OS key auto-repeat rather than a raw space count or speed alone, so it no longer spams the editor, no longer eats deliberate space taps, and no longer triggers when the bar is smashed. Recording starts only after two consecutive inter-space deltas are "mechanical" — both fast (within ~120 ms) and near-identical, the metronomic signature of auto-repeat; the few pre-burst spaces typed are then tracked back out. Smashing (fast but jittery) and deliberate spacing (steady but slow) both keep typing real spaces and never start recording.</li>
<li>Updated markdown Mermaid rendering to color ASCII diagrams with the active theme and automatically choose a narrower layout that better fits the terminal width</li>
<li>Made the watched-session transcript sent to the advisor (and shown by <code>/advisor dump</code>) clearer: each turn now opens with a <code>### Session update</code> heading; watched-agent roles render as inline <code>**agent**:</code> / <code>**user**:</code> labels instead of level-2 headings that collided with the advisor's own turns; consecutive same-role messages collapse under one label (the watched agent emits one assistant message per tool call); and batched updates are joined by a blank line rather than a <code>---</code> rule.</li>
<li>Changed the compact transcript tool-intent prefix (<code>history://</code>, <code>/advisor dump</code>) from <code># </code> to <code>// </code> so intent lines read as comments instead of rendering as Markdown H1 headings.</li>
<li>Changed the advisor advice injected into the primary transcript from a <code>Advisor (...): - [severity] note</code> prose block to one <code>&lt;advisory severity="…" guidance="weigh, don't blindly obey"&gt;…&lt;/advisory&gt;</code> element per note, with XML-escaped bodies. (Relocated the shared <code>escapeXmlText</code> helper to <code>@oh-my-pi/pi-utils</code>.)</li>
<li>Reverted <code>/dump</code> and <code>/advisor dump raw</code> to the pre-16.x full verbose dump: system prompt, model/thinking config, tool inventory with parameters, and the message transcript rendered with markdown role headings (<code>## User</code>, <code>## Assistant</code>, <code>### Tool Call: &lt;name&gt;</code> with the call's <code>_i</code> intent as a <code>//</code> comment under the heading and the remaining arguments as a fenced YAML block, <code>### Tool Result: &lt;name&gt;</code>, plus <code>## Bash Execution</code>/<code>## File Mention</code>/summary sections) instead of the model's native-dialect turn envelopes and <code>&lt;invoke&gt;</code>/<code>&lt;parameter&gt;</code> XML tool calls. Dropped the compact default and the <code>[raw]</code> flag on <code>/dump</code>; the compact <code>→ tool(...) ⇒ ok</code> history format is no longer reachable from <code>/dump</code>. <code>/advisor dump</code> still defaults to compact, and <code>/advisor dump raw</code> now renders the same markdown dump (previously the model's native-dialect envelopes).</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed Whisper STT cache detection to require both encoder and decoder <code>.onnx</code> files, so partial model downloads now trigger a proper foreground download instead of being treated as fully cached</li>
<li>Fixed same-process <code>JsRuntime</code> cleanup so disposing an older inline/direct runtime no longer deletes a newer runtime's JS helper globals; inactive cmux/direct runtimes now re-activate their globals before sequential use while overlapping cross-runtime runs fail explicitly.</li>
<li>Fixed magic-keyword steering notices (<code>ultrathink-notice</code>, <code>orchestrate-notice</code>, <code>workflow-notice</code>) to be prepended before the related user message so they influence that same turn</li>
<li>Fixed dequeuing or popping queued user messages to remove their preceding hidden magic-keyword notice companions, preventing orphaned queued notices</li>
<li>Fixed queued user steers to auto-resume after interrupts even when the transcript tail is a preserved advisor card or other non-conversational custom message</li>
<li>Fixed queued user follow-up messages to remain queued after an interrupt and only run on explicit resume, even when an IRC wake leaves a provider-valid tail</li>
<li>Fixed stranded IRC asides to wake a response turn after interruption instead of remaining pending</li>
<li>Fixed accepted IRC asides to be flushed into the transcript during disposal instead of being discarded</li>
<li>Fixed interactive submissions made while the TUI had no active input waiter: they now start a real prompt directly, with steer fallback if a background turn races in, instead of queueing behind a non-resumable idle transcript and appearing to do nothing.</li>
<li>Fixed pressing Esc (or Alt+Up dequeue) while agent-authored messages were queued — advisor concern/blocker notes, hidden goal/plan/budget steers, IRC/extension asides — dumping their text into the user's editor. Editor restoration (<code>clearQueue()</code>), pending chips (<code>getQueuedMessages()</code>), and <code>popLastQueuedMessage()</code> now surface only genuinely user-authored queued messages (plain user turns and <code>attribution: "user"</code> custom messages like <code>/skill</code>). Plain Alt+Up dequeue leaves all other queued messages in place for the continuing stream; only the Esc interrupt path keeps just advisor cards (so abort's preservation still re-records them as visible advice) and drops other internal steers, so a user interrupt can't be silently undone by an auto-resume on leftover internal context. <code>queuedMessageCount</code> still reflects all actual queued work (advisor cards included) so <code>hasPendingMessages()</code>/RPC and the empty-submit abort gate stay accurate.</li>
<li>Fixed advisor <code>concern</code>/<code>blocker</code> advice being withheld from the running agent and then dumped as one burst at the next user prompt after a deliberate interrupt. A user interrupt latches advisor auto-resume suppression, but a non-user resume (synthetic/auto-continue, or a queued steer draining after the abort) leaves the run streaming with that latch still set, so every interrupting note was parked hidden in the next-turn queue instead of steered into the live turn — the agent never heard the advisor mid-run and the backlog flushed all at once on the next prompt. Suppression now only withholds interrupting advice while the agent is idle (or still tearing the interrupted turn down); once a turn is streaming again the note is steered in live, since steering an active run never auto-resumes a stopped one. A concern that strands in the steer queue past the resumed turn's final poll is reclaimed as visible advice when the agent settles (mirroring abort), so it neither auto-resumes the stopped run nor lingers to flush at the next prompt.</li>
<li>Fixed <code>omp --continue</code>/<code>-c</code> sometimes resuming into a subagent transcript instead of the interactive session. Subagent (and HTML-export) <code>SessionManager.open()</code> calls run in the parent's terminal and were clobbering the per-TTY <code>--continue</code> breadcrumb with their own artifact-dir session file; these headless opens now suppress the breadcrumb. <code>continueRecent()</code> also recovers already-poisoned breadcrumbs by resolving any session file inside a parent's artifacts dir (<code>&lt;parent&gt;/&lt;agentId&gt;.jsonl</code>) back up to the top-level session.</li>
<li>Fixed the Agent Hub stacking duplicate <code>Agent Hub · N running</code> frames and stranding garbage rows in scrollback while navigating with subagents still streaming. The hub was a non-fullscreen overlay composited over a live transcript, so each time a running subagent's progress grew the frame and scrolled the window the previously-painted hub copy was pushed permanently into the terminal's native scrollback (which the engine can't rewrite). It now renders inline in the editor slot — the same anchored region every other selector and the <code>ask</code> tool use — riding the normal append-only commit path, so the transcript commits above it exactly once and the hub repaints in place instead of leaking copies. (Avoids borrowing the alternate screen.)</li>
<li>Fixed every subagent registering itself as its own parent in the agent registry (<code>parentId === id</code>), so the Agent Hub rendered each agent as <code>sub · of &lt;itself&gt;</code> and the ←← parent-navigation gesture looped on the same agent. The SDK was reusing <code>parentTaskPrefix</code> — the agent's own artifact/output-id prefix — as the registry parent link; spawns now pass a separate <code>parentAgentId</code> (the spawning agent's id: <code>Main</code> for top-level <code>task</code> spawns, the parent subagent for nested spawns and eval <code>agent()</code>, the focused agent for <code>/tan</code>) and the registry records that as the parent.</li>
<li>Fixed messaging a <code>parked</code> subagent that was restored from disk (Agent Hub scan, or a resumed/restarted session) failing with <code>cannot be revived (no reviver registered)</code> even though its transcript was intact. Such refs carry a session file but no in-memory reviver — the executor's live reviver closure dies with the spawning turn/process — so IRC sends and Agent Hub focus refused them. <code>AgentLifecycleManager.ensureLive</code> now cold-revives them through a persisted-subagent reviver factory (installed by the top-level interactive/RPC session) that rebuilds the subagent from its JSONL the way <code>--resume</code> rebuilds a session: it reopens the file and replays it through <code>createAgentSession</code>, but sources the runtime contract from a now-readable <code>session_init</code> record (<code>SessionManager.peekSessionInit</code>) so tools, system prompt, output schema, and kind are restored rather than resurrected as a default top-level session. <code>session_init</code> now also persists the effective <code>spawns</code> allowlist and read-summarization flag so a cold revive keeps the original capability surface (old files without them deny re-spawning rather than defaulting to wildcard). Isolated runs and pre-<code>session_init</code> files whose recorded workspace no longer exists stay transcript-only (<code>history://</code>).</li>
<li>Fixed the terminal window-title OSC writes (<code>setTerminalTitle</code>/<code>pushTerminalTitle</code>/<code>popTerminalTitle</code>) leaking escape sequences to a developer's terminal during <code>bun test</code>; they now skip when the terminal is headless (the test-runtime default), matching the <code>ProcessTerminal</code> render/probe suppression so interactive-mode tests no longer paint to the real terminal</li>
<li>Fixed empty CLI sessions being retained after opening <code>omp</code> and exiting without a prompt (<a href="https://github.com/can1357/oh-my-pi/issues/2800" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2800/hovercard">#2800</a>).</li>
<li>Fixed <code>hooks/pre/*.ts</code> and <code>hooks/post/*.ts</code> files discovered through <code>hookCapability</code> being registered in discovery but never loaded into the extension runner, so their <code>tool_call</code> handlers now run without a manual <code>settings.json</code> <code>extensions</code> entry (<a href="https://github.com/can1357/oh-my-pi/issues/2796" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2796/hovercard">#2796</a>).</li>
<li>Fixed startup model fallback choosing the plain OpenAI <code>gpt-5.5</code> provider before the Codex OAuth provider when both shared the same default model id, which could surface a misleading OpenAI 401 despite valid Codex credentials (<a href="https://github.com/can1357/oh-my-pi/issues/2807" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2807/hovercard">#2807</a>).</li>
<li>Fixed local auto-thinking classification for reasoning-capable tiny models by giving them the same safe answer budget as online reasoning classifiers, with a larger local floor for non-reasoning tiny models (<a href="https://github.com/can1357/oh-my-pi/issues/2808" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2808/hovercard">#2808</a>).</li>
</ul>
<h3>Removed</h3>
<ul>
<li>Removed the built-in <code>render_mermaid</code> tool and its <code>renderMermaid.enabled</code> setting, so it can no longer be invoked directly</li>
</ul>
<h2>@oh-my-pi/collab-web</h2>
<h3>Removed</h3>
<ul>
<li>Removed rendering support for the <code>render_mermaid</code> tool from the web tool registry</li>
</ul>
<h2>@oh-my-pi/pi-tui</h2>
<h3>Added</h3>
<ul>
<li>Added <code>\tfrac</code> support to stacked display-math rendering so it now displays as a vertical fraction in <code>latexToBlock</code> output</li>
<li>Added markdown parsing for own-line display-math blocks (<code>$$...$$</code> and <code>\[...\]</code>) and delimiter-free <code>\begin{...}...\end{...}</code> math environments so block equations render via LaTeX-to-Unicode</li>
<li>Added stacked rendering of display-math fractions (<code>\frac</code>, <code>\dfrac</code>, <code>\cfrac</code>): the numerator is drawn over a horizontal bar over the denominator, with surrounding terms and <code>align</code>/<code>equation</code>-style environment rows aligned to the bar. Triggered for own-line <code>$$</code>/<code>\[</code> blocks, bare <code>\begin{...}</code> environments, and a paragraph whose sole content is a single display-math span; inline <code>$...$</code> fractions stay single-line (<code>½</code>, <code>(a+b)/c</code>)</li>
<li>Added bare math auto-rendering in <code>renderMathInText</code> for math-shaped lines and math environment blocks that omit <code>$</code>/<code>\(</code> delimiters</li>
<li>Added LaTeX-to-Unicode rendering for markdown math spans, converting <code>$$...$$</code>, <code>$...$</code>, <code>\(...\)</code>, and <code>\[...\]</code> into readable Unicode in Markdown output</li>
<li>Exported LaTeX conversion helpers from the package entrypoint so consumers can call <code>latexToUnicode</code>, <code>latexToBlock</code>, <code>renderMathInText</code>, <code>inlineMathSpanEnd</code>, and <code>isBareMathEnvironment</code> directly</li>
<li>Expanded LaTeX-to-Unicode conversion coverage for additional math fonts, delimiters, extensible arrows, layout environments, cancel/brace annotations, references, and AMS symbols</li>
<li>Added ANSI color rendering for LaTeX <code>\textcolor</code>, scoped <code>\color</code>, <code>\colorbox</code>, and <code>\fcolorbox</code>, including xcolor/CSS color parsing and truecolor/256-color terminal output</li>
<li>Added an optional <code>maxWidth</code> parameter to <code>MarkdownTheme.resolveMermaidAscii</code> to allow diagram resolvers to fit ASCII output to the available content width</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Changed markdown math rendering to preserve multiline layout for display equations, keeping <code>\\</code> row breaks as separate output lines (including inside list items)</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>alignat</code>/<code>alignedat</code>/<code>gatheredat</code> rendering in <code>latexToBlock</code> so the required <code>{n}</code> preamble is not rendered as visible math content</li>
<li>Fixed math parsing to leave non-math LaTeX snippets (for example <code>\begin{itemize}</code>) and fenced code blocks as literal text instead of rendering them as math</li>
<li>Fixed <code>renderInlineMarkdown</code> to handle top-level display-math tokens so raw <code>$$...$$</code> delimiters are no longer leaked</li>
<li>Fixed inline math span detection so escaped dollars and currency-like patterns (such as <code>$5</code> and <code>$10</code>) are not converted as math</li>
<li>Fixed Mermaid diagram rendering in Markdown code blocks to clip each ASCII line to content width before wrapping, preventing preformatted diagram rows from fragmenting</li>
<li>Fixed fullscreen overlays losing keyboard focus to hidden prompt surfaces, which could make settings unresponsive while a background approval request was pending (<a href="https://github.com/can1357/oh-my-pi/issues/2789" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2789/hovercard">#2789</a>).</li>
<li>Fixed <code>bun test</code> runs inside a real terminal leaking TUI output: <code>ProcessTerminal</code> now honors a headless test-runtime default, so frame paints, <code>start()</code> capability probes (OSC 11 / DA1 / kitty), the progress keepalive, notifications, and teardown escapes no longer reach the developer's terminal, and stdin raw mode is never engaged. Previously <code>#safeWrite</code> only skipped on <code>!process.stdout.isTTY</code>, so a developer running the suite in an interactive terminal saw stray status/editor boxes and probe queries. Terminal-contract suites opt back into real I/O via <code>setTerminalHeadless(false)</code></li>
</ul>
<h2>@oh-my-pi/pi-utils</h2>
<h3>Added</h3>
<ul>
<li>Added <code>escapeXmlText</code> utility to escape XML-significant characters <code>&amp;</code>, <code>&lt;</code>, and <code>&gt;</code> in element body text</li>
<li>Added <code>isTerminalHeadless()</code> / <code>setTerminalHeadless()</code> to centrally suppress real-terminal side effects (stdout escape/frame writes, stdin raw mode, CSI/OSC capability probes, SIGWINCH, window-title changes, emergency restore) under the test runtime. Defaults on when <code>bun test</code> sets <code>NODE_ENV=test</code>; terminal-contract tests opt out via <code>setTerminalHeadless(false)</code></li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix(tui): keep overlay focus above hidden prompts by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4676940403" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2795" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2795/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2795">#2795</a></li>
<li>fix(coding-agent): load discovered hook factories by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4677385980" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2798" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2798/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2798">#2798</a></li>
<li>fix(cli): skip empty session persistence by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4677808827" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2804" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2804/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2804">#2804</a></li>
<li>fix(coding-agent): prefer Codex default auth by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4678553738" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2810" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2810/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2810">#2810</a></li>
<li>fix(coding-agent): expand local auto-thinking classifier budget by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4678723092" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2814" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2814/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2814">#2814</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v16.0.2...v16.0.3"><tt>v16.0.2...v16.0.3</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Developer Experience: Firefox WebDriver Newsletter 152]]></title>
<description><![CDATA[WebDriver is a remote control interface that enables introspection and control of user agents. As such, it can help developers to verify that their websites are working and performing well with all major browsers. The protocol is standardized by the W3C and consists of two separate specifications...]]></description>
<link>https://tsecurity.de/weiterlesen/3574520/3602659/firefox-developer-experience-firefox-webdriver-newsletter-152/</link>
<pubDate>Tue, 16 Jun 2026 19:09:00 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p><em>WebDriver is a remote control interface that enables introspection and control of user agents. As such, it can help developers to verify that their websites are working and performing well with all major browsers. The protocol is standardized by the<a href="https://www.w3.org/"> W3C</a> and consists of two separate specifications:<a href="https://w3c.github.io/webdriver/"> WebDriver classic</a> (HTTP) and the new<a href="https://w3c.github.io/webdriver-bidi/"> WebDriver BiDi</a> (Bi-Directional).</em></p>



<p><em>This newsletter gives an overview of the work we’ve done as part of the Firefox 152 release cycle</em>.</p>



<h3>Contributions</h3>



<p>Firefox is an open source project, and we are always happy to receive external code contributions to our WebDriver implementation. We want to give special thanks to everyone who filed issues, bugs and submitted patches.</p>



<p>In Firefox 152, multiple WebDriver bugs were fixed by contributors:</p>



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



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



<li>Amin Amir <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2031599">fixed a bug in browsingContext.sys.mjs</a> where a private field was incorrectly assigned without the # prefix.</li>
</ul>



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



<h3>General</h3>



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



<h3>WebDriver BiDi</h3>



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



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



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



<h3>Marionette</h3>



<ul>
<li>Improved the <a href="https://bugzil.la/2033769"><code>WebDriver:Navigate</code> and <code>WebDriver:Refresh</code> commands to properly report errors when triggering the navigation fails</a>, instead of silently ignoring them.</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox Tooling Announcements: Firefox Profiler Deployment (June 16, 2026)]]></title>
<description><![CDATA[The latest version of the Firefox Profiler is now live! Check out the full changelog below to see what’s changed:
Highlights:

[Nazım Can Altınova] Add source map symbolication and source view support (#6018)

It requires Firefox changes that will land in Firefox 154, but after these changes, you...]]></description>
<link>https://tsecurity.de/weiterlesen/3573965/3602104/firefox-tooling-announcements-firefox-profiler-deployment-june-16-2026/</link>
<pubDate>Tue, 16 Jun 2026 16:09:18 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>The latest version of the <a href="https://profiler.firefox.com/" rel="noopener nofollow ugc">Firefox Profiler</a> is now live! Check out the full changelog below to see what’s changed:</p>
<p><strong>Highlights:</strong></p>
<ul>
<li>[Nazım Can Altınova] Add source map symbolication and source view support (<a href="https://github.com/firefox-devtools/profiler/pull/6018" rel="noopener nofollow ugc">#6018</a>)
<ul>
<li>It requires Firefox changes that will land in Firefox 154, but after these changes, you will be able to see the source mapped function names as well as the source contents!</li>
</ul>
</li>
<li>[fatadel] Upgrade to React 19 (<a href="https://github.com/firefox-devtools/profiler/pull/6067" rel="noopener nofollow ugc">#6067</a>)</li>
<li>[fatadel] Drive counter tooltips from a tooltipRows schema (<a href="https://github.com/firefox-devtools/profiler/pull/6023" rel="noopener nofollow ugc">#6023</a>)</li>
<li>[Markus Stange] Support reading profiles from JsonSlabs files (<a href="https://github.com/firefox-devtools/profiler/pull/6037" rel="noopener nofollow ugc">#6037</a>)</li>
<li>[fatadel] Replace the footer-links overlay with a settings menu (<a href="https://github.com/firefox-devtools/profiler/pull/6042" rel="noopener nofollow ugc">#6042</a>)</li>
</ul>
<p><strong>Other Changes:</strong></p>
<ul>
<li>[Nazım Can Altınova] Fix call node context menu being hidden behind source view bottom box (<a href="https://github.com/firefox-devtools/profiler/pull/6045" rel="noopener nofollow ugc">#6045</a>)</li>
<li>[Nazım Can Altınova] Pass <code>--use-env-proxy</code> only when the node version is &gt;= 24 (<a href="https://github.com/firefox-devtools/profiler/pull/6064" rel="noopener nofollow ugc">#6064</a>)</li>
<li>[fatadel] Upgrade <span class="mention">@firefox-devtools</span>/react-contextmenu to 5.2.4 (<a href="https://github.com/firefox-devtools/profiler/pull/6066" rel="noopener nofollow ugc">#6066</a>)</li>
<li>[Markus Stange] Switch profiler-edit from minimist to commander (<a href="https://github.com/firefox-devtools/profiler/pull/6065" rel="noopener nofollow ugc">#6065</a>)</li>
<li>[Florian Quèze] Don’t fail profile processing when a marker’s stack field is not a backtrace (<a href="https://github.com/firefox-devtools/profiler/pull/6069" rel="noopener nofollow ugc">#6069</a>)</li>
<li>[fatadel] Remove unused undici-types package (<a href="https://github.com/firefox-devtools/profiler/pull/6074" rel="noopener nofollow ugc">#6074</a>)</li>
<li>[cathaysia] Update isLocalURL to include LAN addresses, .local domains, and hostn… (<a href="https://github.com/firefox-devtools/profiler/pull/5973" rel="noopener nofollow ugc">#5973</a>)</li>
<li>[Markus Stange] Fix from-url with binary profiles (<a href="https://github.com/firefox-devtools/profiler/pull/6072" rel="noopener nofollow ugc">#6072</a>)</li>
<li>[Markus Stange] Add an insertStackLabels helper. (<a href="https://github.com/firefox-devtools/profiler/pull/6076" rel="noopener nofollow ugc">#6076</a>)</li>
<li>[fatadel] Add TrackPower–tooltip-average-power-microwatt (<a href="https://github.com/firefox-devtools/profiler/pull/6080" rel="noopener nofollow ugc">#6080</a>)</li>
<li>[Markus Stange] Downgrade to React 19.1 to fix unusable dev build performance. (<a href="https://github.com/firefox-devtools/profiler/pull/6082" rel="noopener nofollow ugc">#6082</a>)</li>
<li>[spokodev] fix(FilterNavigatorBar): clip overflow so many breadcrumbs do not expand the parent (<a href="https://github.com/firefox-devtools/profiler/pull/6085" rel="noopener nofollow ugc">#6085</a>)</li>
<li>[Markus Stange] Move paddings inside the tree header cells. (<a href="https://github.com/firefox-devtools/profiler/pull/6002" rel="noopener nofollow ugc">#6002</a>)</li>
<li>[Markus Stange] Add an --insert-label-frames argument to the profiler-edit tool (<a href="https://github.com/firefox-devtools/profiler/pull/5966" rel="noopener nofollow ugc">#5966</a>)</li>
<li>[Markus Stange] Stop printing “error: too many arguments” during tests. (<a href="https://github.com/firefox-devtools/profiler/pull/6088" rel="noopener nofollow ugc">#6088</a>)</li>
<li>[Markus Stange] More additions to profiler-edit, for sp3 profiles (<a href="https://github.com/firefox-devtools/profiler/pull/6009" rel="noopener nofollow ugc">#6009</a>)</li>
<li>[Nazım Can Altınova] Do not rely on localized texts in the settings menu tests (<a href="https://github.com/firefox-devtools/profiler/pull/6101" rel="noopener nofollow ugc">#6101</a>)</li>
</ul>
<p>Big thanks to our amazing localizers for making this release possible:</p>
<ul>
<li>be: Andrei Mukamolau</li>
<li>de: Ger</li>
<li>de: Michael Köhler</li>
<li>de: Ralf Duehnfahr</li>
<li>el: Jim Spentzos</li>
<li>en-CA: chutten</li>
<li>en-GB: Ian Neal</li>
<li>es-CL: ravmn</li>
<li>fr: Théo Chevalier</li>
<li>fr: wy</li>
<li>fur: Fabio Tomat</li>
<li>fy-NL: Fjoerfoks</li>
<li>ia: Melo46</li>
<li>it: Francesco Lodolo [:flod]</li>
<li>nl: Mark Heijl</li>
<li>ru: Valery Ledovskoy</li>
<li>sr: Марко Костић (Marko Kostić)</li>
<li>sv-SE: Andreas Pettersson</li>
<li>tr: Grk</li>
<li>tr: Selim Şumlu</li>
<li>zh-CN: Olvcpr423</li>
<li>zh-TW: Pin-guang Chen</li>
</ul>
<p>Find out more about the Firefox Profiler on <a href="https://profiler.firefox.com/" rel="noopener nofollow ugc">profiler.firefox.com</a>! If you have any questions, join the discussion on our <a href="https://chat.mozilla.org/#/room/%23profiler:mozilla.org" rel="noopener nofollow ugc">Matrix channel</a>!</p>
            <p><small>1 post - 1 participant</small></p>
            <p><a href="https://discourse.mozilla.org/t/firefox-profiler-deployment-june-16-2026/148655">Read full topic</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.2]]></title>
<description><![CDATA[@oh-my-pi/pi-ai
Added

Added UMANS_WEBSEARCH_PROVIDER=native|exa support for routing Umans gateway-owned web search requests.

Fixed

A single MCP tool whose input schema can't be emitted as a valid strict tool schema for the active provider no longer fails the whole turn with HTTP 400. convertTo...]]></description>
<link>https://tsecurity.de/weiterlesen/3573906/3602045/v1602/</link>
<pubDate>Tue, 16 Jun 2026 15:54:19 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-ai</h2>
<h3>Added</h3>
<ul>
<li>Added <code>UMANS_WEBSEARCH_PROVIDER=native|exa</code> support for routing Umans gateway-owned web search requests.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>A single MCP tool whose input schema can't be emitted as a valid strict tool schema for the active provider no longer fails the whole turn with HTTP 400. <code>convertTools</code> (openai-responses) now validates each tool's emitted parameter schema for <code>enum</code>/<code>const</code>-vs-<code>type</code> contradictions that pass structural JSON-Schema validation but the provider rejects — e.g. a non-null <code>enum</code> on a <code>type: "null"</code> node, or an <code>enum</code> on an <code>array</code> node — and quarantines just the offending tool with a <code>logger.warn</code> naming the tool and schema path, keeping every other tool usable. Adds <code>findStrictToolSchemaViolation</code> to <code>@oh-my-pi/pi-ai/utils/schema</code> (<a href="https://github.com/can1357/oh-my-pi/issues/2652" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2652/hovercard">#2652</a>)</li>
<li>Fixed OpenAI Responses-compatible streams from Ollama/local hosts dropping arguments for parallel tool calls whose deltas use <code>fc_&lt;call_id&gt;</code> item ids, which left earlier <code>ast_grep</code> calls with <code>{}</code> and failed validation. (<a href="https://github.com/can1357/oh-my-pi/issues/2715" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2715/hovercard">#2715</a>)</li>
<li>Fixed dialect transcript rendering so literal thinking envelopes are unwrapped before adding the dialect's own thinking tags, preventing nested <code>&lt;thinking&gt;</code> output in advisor raw dumps (<a href="https://github.com/can1357/oh-my-pi/issues/2700" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2700/hovercard">#2700</a>).</li>
<li>Fixed Anthropic-compatible Umans requests escaping client tool names and forwarding gateway web search headers so Kimi answers normally instead of returning raw gateway search results.</li>
<li>Fixed Google Gemini tool calls with <code>toolChoice: "auto"</code> serializing an explicit <code>toolConfig</code> AUTO mode, which can cause Gemini-3 models to leak raw planning JSON instead of executing tools. (<a href="https://github.com/can1357/oh-my-pi/issues/2776" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2776/hovercard">#2776</a>)</li>
<li>Fixed OpenAI-compatible Ollama completions that return empty <code>finish_reason:length</code> after filling <code>num_ctx</code> so they surface an actionable context-window error instead of an empty length stop. (<a href="https://github.com/can1357/oh-my-pi/issues/2774" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2774/hovercard">#2774</a>)</li>
<li>Fixed Codex browser login issuing credentials for the <code>opencode</code> OAuth originator while OMP requests identify as <code>pi</code>, which could make the first authenticated Codex request return 401 (<a href="https://github.com/can1357/oh-my-pi/issues/2696" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2696/hovercard">#2696</a>).</li>
</ul>
<h2>@oh-my-pi/pi-catalog</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed Kimi output caps for Umans AI Coding Plan and Venice so discovery metadata cannot use context-sized token ceilings as request caps.</li>
<li>Marked Umans Anthropic-compatible models as client-tool escaped so cached and bundled metadata do not expose <code>web_search</code> as a provider server tool.</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Added</h3>
<ul>
<li>Added the <code>UMANS_WEBSEARCH_PROVIDER</code> environment variable to CLI help for Umans gateway web search backend selection.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>The eager <code>task</code> (<code>task.eager: always</code>) and eager <code>todo</code> (<code>todo.eager: preferred</code>/<code>always</code>) hidden reminders now re-fire on the auto-continuation turn after a compaction (context-full / snapcompact / handoff / shake). Compaction summarizes away the first-message prelude, so the agent would otherwise silently lose the delegate-via-tasks / phased-todo guidance mid-work; the post-compaction todo nudge is reminder-only and never forces the <code>todo</code> tool onto the resumed turn.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed edit-tool block operations on Emacs Lisp files: <code>.el</code> and <code>.emacs</code> paths now resolve top-level forms for <code>SWAP.BLK</code>, <code>DEL.BLK</code>, and <code>INS.BLK.POST</code> instead of reporting an unsupported-language block-resolution error.</li>
<li>Fixed PDF reads leaking recoverable MuPDF WASM warnings into the terminal TUI by routing MuPDF output through the file logger before <code>markit-ai</code> loads it (<a href="https://github.com/can1357/oh-my-pi/issues/2766" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2766/hovercard">#2766</a>).</li>
<li>Fixed <code>/exit</code> and <code>/quit</code> waiting one shutdown timeout per hanging extension by running <code>session_shutdown</code> handlers within a shared shutdown window (<a href="https://github.com/can1357/oh-my-pi/issues/2736" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2736/hovercard">#2736</a>).</li>
<li>Fixed GitHub Copilot <code>.github/instructions/*.instructions.md</code> discovery by loading those files as rules that honor <code>applyTo</code> scoping, including always-apply <code>**</code> files and <code>rule://&lt;name&gt;</code> access for glob-scoped entries (<a href="https://github.com/can1357/oh-my-pi/issues/2731" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2731/hovercard">#2731</a>).</li>
<li>Fixed Windows bash-tool child processes defaulting interpreter pipe I/O to the ANSI codepage by adding UTF-8 encoding defaults when the inherited environment is unset (<a href="https://github.com/can1357/oh-my-pi/issues/2701" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2701/hovercard">#2701</a>).</li>
<li>Fixed <code>/advisor dump raw</code> so Opus 4.5 thinking content that already includes literal <code>&lt;thinking&gt;</code> tags is not rendered with nested thinking tags (<a href="https://github.com/can1357/oh-my-pi/issues/2700" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2700/hovercard">#2700</a>).</li>
<li>The <code>plugin-extensions-discovery</code> test suite no longer writes fixtures into — and <code>rm -rf</code>s the <code>node_modules</code> of — the developer's real <code>~/.omp/plugins</code>. Its <code>XDG_DATA_HOME</code> isolation was a no-op on Windows (XDG is gated to Linux/macOS) and was bypassed in XDG-migrated Linux/macOS environments, so a local run could delete installed plugins. The suite now isolates the whole config root via an <code>os.homedir()</code> mock plus cleared <code>XDG_*</code> vars, with a pre-write guard that fails if resolution escapes the temp home (<a href="https://github.com/can1357/oh-my-pi/issues/2721" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2721/hovercard">#2721</a>).</li>
<li>Installed plugins whose <code>extensions</code> manifest entry points at a directory of sub-extensions (the standard pi <code>extensions/&lt;name&gt;/index.ts</code> layout, e.g. <code>pi.extensions: ["./extensions"]</code>) are no longer rejected at install (<code>declared extension entry not found on disk</code>) or silently dropped at load. The plugin manifest resolver now resolves a directory the same way as the configured-directory (<code>-e</code>) extension loader: the directory's own <code>package.json</code> <code>omp</code>/<code>pi</code> <code>extensions</code> (authoritative — a missing declared entry is reported instead of falling back to a decoy <code>index</code>), then a direct <code>index.{ts,js,mjs,cjs}</code>, then a one-level scan of sub-extensions (<a href="https://github.com/can1357/oh-my-pi/issues/2713" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2713/hovercard">#2713</a>).</li>
<li>Fixed OpenRouter <code>@upstream</code> routing selectors whose upstream slug also appears in the model id, so <code>openrouter/...@deepseek:high</code> keeps <code>openRouterRouting.only</code> instead of being consumed by provider-scoped fuzzy matching (<a href="https://github.com/can1357/oh-my-pi/issues/2708" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2708/hovercard">#2708</a>).</li>
<li>Fixed <code>omp plugin list --json</code> omitting locally linked plugins that exist only in <code>omp-plugins.lock.json</code> and <code>node_modules</code> symlinks. (<a href="https://github.com/can1357/oh-my-pi/issues/2742" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2742/hovercard">#2742</a>)</li>
<li>Fixed task subagents to install their configured ordered model candidates as child-session retry fallback chains, so retryable provider failures can advance to the next subagent model instead of failing the worker (<a href="https://github.com/can1357/oh-my-pi/issues/2750" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2750/hovercard">#2750</a>).</li>
<li>Fixed empty reasonless aborted assistant turns to auto-retry without switching model fallback, so transient provider-side aborts after tool results do not end headless sessions (<a href="https://github.com/can1357/oh-my-pi/issues/2685" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2685/hovercard">#2685</a>).</li>
</ul>
<h2>@oh-my-pi/hashline</h2>
<h3>Fixed</h3>
<ul>
<li>Auto-repaired duplicated JSX/XML closing boundary lines at the end of single-line replacement expansions. (<a href="https://github.com/can1357/oh-my-pi/issues/2705" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2705/hovercard">#2705</a>)</li>
</ul>
<h2>@oh-my-pi/pi-natives</h2>
<h3>Added</h3>
<ul>
<li>Added Emacs Lisp (<code>.el</code>, <code>.emacs</code>, <code>emacs-lisp</code>/<code>elisp</code>) support to native tree-sitter language inference, enabling astGrep/astEdit, summarizeCode, and blockRangeAt on Emacs Lisp source.</li>
</ul>
<h2>@oh-my-pi/pi-tui</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed VS Code integrated terminal keypad digit CSI-u input being handled as navigation instead of text.</li>
<li>Fixed xterm-compatible terminals scrolling the native viewport to the bottom on prompt-editor keypresses by disabling <code>?1010</code>/<code>?1011</code> while the TUI owns the TTY and restoring the prior set modes on exit (<a href="https://github.com/can1357/oh-my-pi/issues/2732" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2732/hovercard">#2732</a>).</li>
<li>Fixed CMUX sessions being treated as direct terminals during resize/reset because they do not set <code>TMUX</code>/<code>STY</code>/<code>ZELLIJ</code> and may run with <code>TERM=dumb</code>; the renderer now treats CMUX workspace/surface env markers as multiplexer signals and preserves pane scrollback instead of emitting ED3 (<code>CSI 3 J</code>).</li>
<li>Fixed a self-sustaining resize-redraw storm in Warp: the non-multiplexer resize fast path borrows the alternate screen, and Warp re-reports a one-row-different size whenever the alt buffer is toggled, so each drag frame fed back a fresh resize event and the TUI flooded ED3 full repaints with stable geometry. Resize now repaints in place (no alt-screen borrow, no ED3 rewrap) on terminals that re-report size on alt-screen toggles, matching the multiplexer path. Overridable with <code>PI_TUI_RESIZE_IN_PLACE=1|0</code>.</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix(ai): route prefixed Responses tool deltas by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4669710676" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2719" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2719/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2719">#2719</a></li>
<li>test(plugins): isolate discovery test from real ~/.omp on all platforms by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/AsafMah/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/AsafMah">@AsafMah</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4669729057" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2722" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2722/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2722">#2722</a></li>
<li>fix(coding-agent): load GitHub Copilot instruction rules by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4670507607" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2734" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2734/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2734">#2734</a></li>
<li>fix(tui): stop Warp resize feedback-loop redraw storm by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/sorphwer/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/sorphwer">@sorphwer</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4671065904" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2741" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2741/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2741">#2741</a></li>
<li>fix(cli): speed up exit shutdown handlers by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4671164530" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2745" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2745/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2745">#2745</a></li>
<li>fix(cli): list linked local plugins by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4671230064" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2746" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2746/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2746">#2746</a></li>
<li>fix(providers): handle Umans Kimi output caps and web search by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/oldschoola/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/oldschoola">@oldschoola</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4671571838" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2751" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2751/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2751">#2751</a></li>
<li>fix(agent): retry subagent model fallback chains by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4671783707" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2753" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2753/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2753">#2753</a></li>
<li>fix(tui): detect CMUX as multiplexer by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/pathard1128/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/pathard1128">@pathard1128</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4672246682" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2755" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2755/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2755">#2755</a></li>
<li>fix(coding-agent): route MuPDF warnings to logger by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4673746131" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2772" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2772/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2772">#2772</a></li>
<li>fix(ai): omit Google AUTO toolConfig by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4674509706" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2782" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2782/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2782">#2782</a></li>
<li>feat(ast): add Emacs Lisp tree-sitter support by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ryjm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ryjm">@ryjm</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4667318103" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2693" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2693/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2693">#2693</a></li>
<li>fix(ai): unwrap thinking envelopes in raw dumps by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4668789863" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2702" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2702/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2702">#2702</a></li>
<li>fix(tool): default Windows bash children to UTF-8 by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4668993321" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2704" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2704/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2704">#2704</a></li>
<li>fix(hashline): drop duplicated JSX boundary echoes by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4669256053" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2709" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2709/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2709">#2709</a></li>
<li>fix(providers): preserve OpenRouter upstream routing by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4669299033" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2710" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2710/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2710">#2710</a></li>
<li>fix(openai-responses): quarantine invalid tool schemas instead of failing the whole turn (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4665238895" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2652" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2652/hovercard" href="https://github.com/can1357/oh-my-pi/issues/2652">#2652</a>) by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/AsafMah/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/AsafMah">@AsafMah</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4669341536" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2711" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2711/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2711">#2711</a></li>
<li>fix(plugins): resolve directory extension manifest entries one level deep by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/AsafMah/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/AsafMah">@AsafMah</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4669526068" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2714" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2714/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2714">#2714</a></li>
<li>fix(tui): preserve scrollback while editing by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4670384480" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2733" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2733/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2733">#2733</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/sorphwer/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/sorphwer">@sorphwer</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4671065904" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2741" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2741/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2741">#2741</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/pathard1128/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/pathard1128">@pathard1128</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4672246682" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2755" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2755/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2755">#2755</a></li>
<li><a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ryjm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ryjm">@ryjm</a> made their first contribution in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4667318103" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2693" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2693/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2693">#2693</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v16.0.1...v16.0.2"><tt>v16.0.1...v16.0.2</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[What’s new in Firefox this June, and what’s next on the Firefox roadmap]]></title>
<description><![CDATA[Firefox has been busy introducing updates across productivity, privacy and AI. From Project Nova and browser-wide AI controls to expanded privacy protections and new ways to stay organized, the goal is simple: help you spend less time managing your browser and more time getting things done online...]]></description>
<link>https://tsecurity.de/weiterlesen/3573782/3601921/whats-new-in-firefox-this-june-and-whats-next-on-the-firefox-roadmap/</link>
<pubDate>Tue, 16 Jun 2026 15:10:27 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Firefox has been busy introducing updates across productivity, privacy and AI. From Project Nova and browser-wide AI controls to expanded privacy protections and new ways to stay organized, the goal is simple: help you spend less time managing your browser and more time getting things done online. But building the best browser isn’t just about […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-roadmap-152/">What’s new in Firefox this June, and what’s next on the Firefox roadmap</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firefox is easier than ever to customize]]></title>
<description><![CDATA[Firefox gives you many ways to make the browser your own, from privacy settings and AI controls to tab management, custom colors, and more. As we continue to improve Firefox, you get more control over how it works for you. Today, we’re introducing a redesigned settings experience that makes your ...]]></description>
<link>https://tsecurity.de/weiterlesen/3573781/3601920/firefox-is-easier-than-ever-to-customize/</link>
<pubDate>Tue, 16 Jun 2026 15:10:25 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Firefox gives you many ways to make the browser your own, from privacy settings and AI controls to tab management, custom colors, and more. As we continue to improve Firefox, you get more control over how it works for you. Today, we’re introducing a redesigned settings experience that makes your options easier to find, understand, […]</p>
<p>The post <a href="https://blog.mozilla.org/en/firefox/firefox-settings/">Firefox is easier than ever to customize</a> appeared first on <a href="https://blog.mozilla.org/en/">The Mozilla Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Mobile Progress Report: June 2026]]></title>
<description><![CDATA[The past month was busy; the theme was evolution. We went into this quarter with our own ideas for what we wanted to accomplish. However, our users had better ideas. With the release of Thunderbird’s own mail service, Thundermail, the need for a better account settings import process across our s...]]></description>
<link>https://tsecurity.de/weiterlesen/3573431/3601570/mobile-progress-report-june-2026/</link>
<pubDate>Tue, 16 Jun 2026 13:09:27 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>The past month was busy; the theme was evolution. We went into this quarter with our own ideas for what we wanted to accomplish. However, our users had better ideas. With the release of Thunderbird’s own mail service, Thundermail, the need for a better account settings import process across our services and apps became vital. […]</p>
<p>The post <a href="https://blog.thunderbird.net/2026/06/mobile-progress-report-june-2026/">Mobile Progress Report: June 2026</a> appeared first on <a href="https://blog.thunderbird.net/">The Thunderbird Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.1]]></title>
<description><![CDATA[chore: bump version to 16.0.1]]></description>
<link>https://tsecurity.de/weiterlesen/3571950/3600089/v1601/</link>
<pubDate>Mon, 15 Jun 2026 21:45:18 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 16.0.1</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v16.0.0]]></title>
<description><![CDATA[@oh-my-pi/pi-agent-core
Breaking Changes

Renamed owned tool-calling options from toolCallSyntax/exampleSyntax to dialect/exampleDialect.
Changed compaction conversation serialization to use the target model's native dialect turn, thinking, tool-call, and tool-result envelopes when a dialect is s...]]></description>
<link>https://tsecurity.de/weiterlesen/3571463/3599602/v1600/</link>
<pubDate>Mon, 15 Jun 2026 17:47:30 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-agent-core</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Renamed owned tool-calling options from <code>toolCallSyntax</code>/<code>exampleSyntax</code> to <code>dialect</code>/<code>exampleDialect</code>.</li>
<li>Changed compaction conversation serialization to use the target model's native dialect turn, thinking, tool-call, and tool-result envelopes when a dialect is selected.</li>
<li>Renamed the owned dialect environment variable from <code>PI_OWNED_TOOLS</code> to <code>PI_DIALECT</code>.</li>
</ul>
<h3>Added</h3>
<ul>
<li>Added <code>onTurnEnd</code> hook support (<code>setOnTurnEnd</code>/<code>onTurnEnd</code>) to run awaited per-turn bookkeeping with current messages before the next model request and skip callback execution for aborted or error turns</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Renamed <code>toolCallSyntax</code> option to <code>dialect</code> in AgentOptions and AgentLoopConfig</li>
<li>Updated conversation serialization to use dialect's native transcript rendering when a dialect is selected</li>
<li>Changed internal references from <code>ToolCallSyntax</code> type to <code>Dialect</code> type across agent loop and compaction modules</li>
</ul>
<h2>@oh-my-pi/pi-ai</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Renamed the public dialect entrypoint from <code>@oh-my-pi/pi-ai/grammar</code> to <code>@oh-my-pi/pi-ai/dialect</code>.</li>
<li>Renamed grammar dialect identifiers from <code>ToolCallSyntax</code> to <code>Dialect</code>, renamed the <code>Grammar</code> interface to <code>DialectDefinition</code>, and renamed <code>Grammar.syntax</code> to <code>DialectDefinition.dialect</code>.</li>
<li>Added <code>DialectDefinition.renderThinking</code> and <code>DialectDefinition.renderTranscript</code> so dialect implementations serialize complete native chat transcripts, not just tool call/result blocks.</li>
</ul>
<h3>Added</h3>
<ul>
<li>Added <code>renderTranscript</code> method to dialect definitions for serializing complete native chat transcripts</li>
<li>Added <code>renderThinking</code> method to dialect definitions for rendering thinking/reasoning blocks</li>
<li>Added support for 11 dialect implementations: Anthropic, DeepSeek, Gemini, Gemma, GLM, Harmony, Hermes, Kimi, Pi-native, Qwen3, and XML</li>
<li>Added <code>createInbandScanner</code> factory function to instantiate dialect-specific scanners</li>
<li>Added <code>getDialectDefinition</code> function to retrieve dialect implementations by name</li>
<li>Added <code>renderToolCatalog</code> and <code>renderInbandToolPrompt</code> functions for tool catalog rendering</li>
<li>Added <code>renderToolInventory</code> function to generate human-readable per-tool documentation with examples</li>
<li>Added <code>renderToolExamples</code> function to render tool usage examples in the model's native dialect</li>
<li>Added <code>encodeInbandToolHistory</code> function to encode tool call history in dialect-specific format</li>
<li>Added <code>wrapInbandToolStream</code> function to process streaming responses with in-band tool call parsing</li>
<li>Added <code>ThinkingInbandScanner</code> for parsing thinking/reasoning blocks across dialects</li>
<li>Added <code>OwnedStream</code> class for managing dialect-aware streaming with tool call events</li>
<li>Added in-band thinking channels to every dialect that was missing one: <code>gemini</code> (a <code>```thinking</code> fence mirroring <code>```tool_code</code>), <code>gemma</code> (its native <code>&lt;|channel&gt;thought…&lt;channel|&gt;</code> reasoning channel), <code>kimi</code> (<code>&lt;think&gt;…&lt;/think&gt;</code>), and <code>pi</code> (<code>&lt;thinking&gt;…&lt;/thinking&gt;</code>). Each scanner now parses reasoning into thinking events instead of leaking chain-of-thought into the visible reply, and every dialect's <code>renderThinking</code> is a real channel that round-trips back through its scanner (no passthrough renderers).</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Moved public dialect entrypoint from <code>@oh-my-pi/pi-ai/grammar</code> to <code>@oh-my-pi/pi-ai/dialect</code> in package exports</li>
<li>Updated internal imports in <code>stream-markup-healing.ts</code> to use new dialect module path</li>
<li>Changed <code>renderToolInventory</code> to demote a tool description's own markdown headers by one level when it contains a top-level <code># </code> header, so they nest under the wrapping <code># Tool: &lt;name&gt;</code> heading instead of reading as sibling sections. Descriptions that already start at <code>##</code> and headers inside fenced code blocks are left untouched.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed Gemini, Gemma, Kimi, and Pi in-band scanners to respect <code>parseThinking: false</code>, leaving private reasoning markers in visible text when parsing is disabled</li>
<li>Fixed thinking-channel parsing for streaming Gemini, Gemma, Kimi, and Pi outputs so split or partial <code>&lt;thinking&gt;</code> blocks no longer leak into visible replies</li>
<li>Fixed in-band thinking finalization and Kimi stream-healing interactions so leaked <code>&lt;think&gt;</code> blocks are preserved when structured tool calls are present, not duplicated when explicit reasoning is present, and closed on stream flush.</li>
</ul>
<h3>Removed</h3>
<ul>
<li>Removed <code>src/grammar/factory.ts</code> (replaced by <code>src/dialect/factory.ts</code>)</li>
<li>Removed <code>src/grammar/rendering.ts</code> (functionality moved to <code>src/dialect/rendering.ts</code>)</li>
<li>Removed <code>src/grammar/xml.ts</code> (replaced by <code>src/dialect/xml.ts</code>)</li>
</ul>
<h2>@oh-my-pi/pi-catalog</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Renamed the catalog-owned tool syntax API from <code>ToolCallSyntax</code>/<code>FALLBACK_TOOL_SYNTAX</code>/<code>preferredToolSyntax</code> to <code>Dialect</code>/<code>FALLBACK_DIALECT</code>/<code>preferredDialect</code>.</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Renamed the SDK tool format type and resolver from <code>ToolCallFormat</code>/<code>resolveToolCallSyntax</code> to <code>DialectFormat</code>/<code>resolveDialect</code>, and the agent option from <code>toolCallSyntax</code> to <code>dialect</code>.</li>
<li>Changed <code>/dump</code> transcript output to render messages with the selected model's native dialect turn and thinking envelopes instead of markdown role headings.</li>
</ul>
<h3>Added</h3>
<ul>
<li>Added <code>advisor.syncBacklog</code> setting (<code>off</code>, <code>1</code>, <code>3</code>, <code>5</code>) to pause turn completion until advisor review backlog drops below the threshold, with a maximum 30-second wait</li>
<li>Added advisor backlog synchronization at turn end when enabled so the main session stays aligned with the advisor's pending review turns</li>
<li>Added automatic discovery of WATCHDOG.md files from user and project locations so advisor guidance from local watchdog instructions is appended to its system prompt</li>
<li>Added <code>/advisor on</code>, <code>/advisor off</code>, <code>/advisor status</code>, and <code>/advisor dump [raw]</code> slash-command subcommands to manage the advisor at runtime</li>
<li>Added <code>advisor.enabled</code> and <code>advisor.subagents</code> settings to enable the advisor and extend it to spawned task/eval subagents</li>
<li>Added advisor status badge (<code>++</code> in success color) to the status line when an advisor is active</li>
<li>Added <code>/dump [raw]</code> flag to toggle between compact and legacy uncompact transcript output formats</li>
<li>Added <code>/advisor on</code>, <code>/advisor off</code>, and <code>/advisor status</code> slash-command subcommands to enable or disable the advisor at runtime and view advisor status metrics</li>
<li>Added a passive advisor: assign a second model to the <code>advisor</code> role and enable <code>advisor.enabled</code> to have it silently review each primary turn and inject severity-tagged advice notes via the <code>advise</code> tool. A <code>nit</code> rides the non-interrupting aside queue (batched into one card at the next step boundary), while a <code>concern</code> or <code>blocker</code> interrupts the running agent through the steering channel — aborting in-flight tools, or resuming the agent when it has already yielded — so high-severity advice is acted on immediately. Advice renders in the primary transcript as a distinct <code>Advisor</code> card, and the advisor gets hard-isolated read-only <code>read</code>/<code>search</code>/<code>find</code> access — bound to its own <code>ToolSession</code> so its reads never touch the primary's snapshot/seen-lines caches — to investigate the workspace before weighing in. The status line shows a <code>++</code> badge (in the success color, kept distinct from the model name) after the model name while an advisor is active, and <code>/advisor dump</code> copies the advisor's own transcript to the clipboard. Advisors are created only for the top-level session by default; enable <code>advisor.subagents</code> to extend them to spawned task/eval subagents.</li>
<li>Animated "thinking" pulse (<code>·‥…‥</code>) shown in place of a hidden thinking block while the model is actively reasoning, so streaming progress is visible even with <code>hideThinkingBlock</code> enabled.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Changed advisor prompting guidance to emit at most one <code>advise</code> per update and to prefer silence when the agent is on track</li>
<li>Changed <code>/dump</code> default output to compact markdown format; use <code>/dump raw</code> for the legacy uncompact format</li>
<li>Changed <code>/dump</code> and <code>/advisor dump</code> to default to compact transcript output and accept an optional <code>raw</code> flag for the legacy uncompact format</li>
<li>Session dump output now renders message history using the model's native dialect turn envelope instead of markdown role headings</li>
<li>Changed RPC, RPC-UI, and ACP hosts to default the advisor settings off instead of inheriting a user's interactive-session advisor preference.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed advisor backlog tracking so failed advice prompts do not stall catch-up indefinitely by dropping pending backlog after repeated consecutive failures</li>
<li>Fixed backlog accounting to decrement only after successful advisor prompts so sync waits correctly reflect advisor progress</li>
<li>Fixed advisor context batching to still send pending review updates when context maintenance fails instead of dropping the batch</li>
<li>Fixed explicit advisor enablement to clear protocol-default overrides so enabling the advisor applies immediately</li>
<li>Fixed advisor message card notes getting truncated to two lines when the card is collapsed.</li>
<li>Fixed advisor context handling to maintain its token budget by promoting or compacting/restarting advisor context while preserving advisor reasoning-off settings.</li>
<li>Fixed <code>startup.quiet</code> leaving MCP and LSP startup status events visible during launch (<a href="https://github.com/can1357/oh-my-pi/issues/2639" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2639/hovercard">#2639</a>).</li>
<li>Registered the <code>Advisor</code> group in the <code>model</code> settings tab so advisor settings render correctly in the settings panel.</li>
<li>Fixed Windows bash path handling so MSYS/Git-Bash drive aliases like <code>/d/project</code> and WSL-style <code>/mnt/d/project</code> normalize to native drive paths consistently across the bash tool cwd validation and brush filesystem builtins (<a href="https://github.com/can1357/oh-my-pi/issues/2634" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2634/hovercard">#2634</a>).</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix: align tool cache paths with XDG dirs by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Parsifa1/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Parsifa1">@Parsifa1</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4664679585" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2637" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2637/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2637">#2637</a></li>
<li>fix(coding-agent): respect startup.quiet for startup statuses by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4664916547" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2640" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2640/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2640">#2640</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v15.13.3...v16.0.0"><tt>v15.13.3...v16.0.0</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.13.3]]></title>
<description><![CDATA[@oh-my-pi/pi-agent-core
Added

Added the interruptible tool field: when set, the agent loop may abort the tool mid-execution to deliver a queued steering message (honored only in immediate interrupt mode).
Added support for gemini and gemma as valid owned tool syntax values in environment configu...]]></description>
<link>https://tsecurity.de/weiterlesen/3570721/3598860/v15133/</link>
<pubDate>Mon, 15 Jun 2026 13:09:42 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-agent-core</h2>
<h3>Added</h3>
<ul>
<li>Added the <code>interruptible</code> tool field: when set, the agent loop may abort the tool mid-execution to deliver a queued steering message (honored only in <code>immediate</code> interrupt mode).</li>
<li>Added support for <code>gemini</code> and <code>gemma</code> as valid owned tool syntax values in environment configuration</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>pruneToolOutputs</code> blanking tiny tool results during overflow pruning: results below <code>50</code> tokens (<code>MIN_PRUNE_TOKENS</code>) are no longer replaced with the <code>[Output truncated - N tokens]</code> placeholder, which cost more tokens than the result itself and churned the prompt cache for zero savings.</li>
</ul>
<h2>@oh-my-pi/pi-ai</h2>
<h3>Added</h3>
<ul>
<li>Added the <code>gemini</code> in-band tool-call syntax with Python-style <code>tool_code</code> blocks and <code>default_api</code> invocations</li>
<li>Added the <code>gemma</code> token-delimited in-band tool-call syntax using <code>&lt;|tool_call&gt;</code> and <code>&lt;|tool_response&gt;</code> blocks</li>
<li>Added <code>gemini</code> and <code>gemma</code> to owned stream tool-result token detection so their tool responses are recognized</li>
<li>Fixed truncated Gemini and Gemma tool blocks from being emitted as plain text during streaming</li>
<li>Added the Azure OpenAI provider definition (<code>azure</code>) to the registry; <code>AZURE_OPENAI_API_KEY</code> resolves as its env-var API key via the catalog provider table.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Gemini tool-call examples now render without the <code>default_api.</code> namespace prefix, keeping <code>&lt;example&gt;</code> blocks concise. The live wire format still uses <code>default_api.</code> per the Gemini grammar.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed duplicate tool call projections by deduplicating provider-native <code>toolCall</code> events against in-band <code>tool_code</code> calls and keeping only the first real channel</li>
<li>Dropped nameless native <code>toolCall</code> events so they no longer appear as surfaced tool calls in owned-mode streams</li>
<li>Fixed Gemini/Gemma in-band tool-call parsing around Python comments, raw/unicode string literals, and Gemma close-token text inside string values.</li>
</ul>
<h2>@oh-my-pi/pi-catalog</h2>
<h3>Added</h3>
<ul>
<li>Added Azure OpenAI as a catalog provider (<code>azure</code>, default model <code>gpt-5.5</code>, env var <code>AZURE_OPENAI_API_KEY</code>), bundling the OpenAI-family models Azure serves over the Responses API (GPT-4/4.1/4o, GPT-5 family, o-series, Codex). Like Amazon Bedrock it is catalog-only — models ship in the bundle and become selectable once the env key is set, with the deployment base URL resolved at runtime from <code>AZURE_OPENAI_BASE_URL</code>/<code>AZURE_OPENAI_RESOURCE_NAME</code>.</li>
<li>Added models.dev-backed bundled catalogs for providers that previously shipped no offline models: Hugging Face, Kilo, Moonshot, NanoGPT, Synthetic, Venice, Ollama Cloud, and the Xiaomi Token Plan regions (ams/cn/sgp). They still discover live when credentialed; the bundle is now a non-empty baseline.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Updated stale provider default models to their latest bundled versions: OpenAI-family providers (<code>azure</code>, <code>github-copilot</code>, <code>aimlapi</code>) → GPT-5.5; Gemini providers (<code>google</code>, <code>google-gemini-cli</code>, <code>google-vertex</code>) → <code>gemini-3.1-pro-preview</code>; GLM providers (<code>zai</code>, <code>zhipu-coding-plan</code>) → <code>glm-5.2</code>, <code>cerebras</code> → <code>zai-glm-4.7</code>; Kimi providers (<code>fireworks</code>, <code>opencode-go</code>, <code>moonshot</code>) → <code>kimi-k2.7-code</code>, <code>kimi-code</code> → <code>kimi-for-coding</code>, <code>together</code> → <code>moonshotai/Kimi-K2.7-Code</code>; <code>alibaba-coding-plan</code> → <code>qwen3.7-plus</code>; and Claude-Sonnet defaults (<code>cloudflare-ai-gateway</code>, <code>cursor</code>, <code>gitlab-duo</code>, <code>kilo</code>, <code>opencode-zen</code>, <code>vercel-ai-gateway</code>) → Claude Opus 4.x.</li>
<li>Restricted models.dev Azure discovery to OpenAI-family IDs (<code>gpt-</code>, <code>o1</code>, <code>o3</code>, <code>o4</code>, <code>codex</code>, <code>chatgpt</code>), excluding Foundry-hosted third parties (Claude/DeepSeek/Llama/Mistral/Phi) that Azure serves through non-Responses APIs.</li>
<li>Detected the Azure OpenAI Responses compat surface (developer role, strict tool mode, strict tool-result pairing) by provider id as well as base URL, so bundled <code>azure</code> models whose deployment host is only known at runtime still get the right wire behavior.</li>
<li>Renamed the <code>Qwen3-ASR-Flash</code> model label to <code>Qwen3 ASR Flash</code></li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed tool syntax selection for Gemini-family and Gemma model IDs by routing them to dedicated <code>gemini</code> and <code>gemma</code> formats instead of generic XML</li>
<li>Fixed <code>zhipu-coding-plan</code> and <code>together</code> shipping no bundled models: their descriptors referenced non-existent models.dev keys (<code>zhipu-coding-plan</code>, <code>together</code>); pointed them at the real keys (<code>zhipuai-coding-plan</code>, <code>togetherai</code>) so they bundle their GLM and full catalogs respectively.</li>
<li>Folded the <code>azure-openai-responses</code> API into the OpenAI Responses thinking-inference branches so Azure reasoning models (o-series, GPT-5, Codex) resolve the discrete effort vocabulary (including <code>xhigh</code>) and effort-control mode instead of falling through to generic defaults.</li>
<li>Fixed <code>ollama-cloud</code> discovery inheriting an unsafe cross-provider <code>contextWindow</code>/<code>maxTokens</code> when <code>/api/show</code> returns no size metadata; it now falls back to the safe 128K context / 8K output caps.</li>
<li>Dropped internal Fireworks control-plane resource ids (<code>accounts/fireworks/{models,routers}/…</code>) from the bundle; only the public request ids ship.</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Added</h3>
<ul>
<li>Unexpected stop detection: optional tiny/smol classifier that continues the turn when the assistant says it will act but emits no tool calls.</li>
<li>Settings <code>features.unexpectedStopDetection</code> and <code>providers.unexpectedStopModel</code>.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Changed the <code>job</code> poll to return early when a steering message is queued, draining the steer immediately instead of waiting out the poll window.</li>
<li>Capped unexpected-stop auto-continuation to three retry attempts before giving up on repeated stops</li>
<li>Updated the <code>edit</code> tool's hashline prompt, grammar, and docs to recommend the <code>.=</code> inclusive range separator (<code>SWAP 1.=3:</code>); the legacy <code>..</code> form still parses.</li>
<li>Normalized all internal worker argv selectors under the <code>__omp_worker_</code> prefix, skipping the async worker dispatch check during normal CLI startup.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Filtered out whitespace-only and dot-only (<code>.</code> or <code>…</code>) assistant blocks so they are treated as empty and no longer appear as visible content in message rendering, streaming reveal counts, or session export output</li>
<li>Filtered placeholder-only thinking content from ACP notifications and message visibility checks so dot-only <code>reasoning_content</code> no longer triggers turn completion or read/run updates</li>
<li>Fixed ModelRegistry tests making outbound network calls by automatically stubbing fetch during test execution.</li>
<li>Fixed <code>eval</code> JS cells (and browser-tab worker startup) always stalling for the full init timeout — typically the cell's whole 30s budget — before silently falling back to the slower inline worker. The self-dispatching CLI host imports the worker module dynamically from its argv dispatch, so the worker's own <code>parentPort.on("message")</code> attached only after Bun flushed the messages the parent posted before spawn; the synchronously-posted <code>init</code> handshake was dropped and never answered with <code>ready</code>. The host now installs a buffering <code>parentPort</code> inbox synchronously in the entry's sync prefix (before importing the worker module) and the worker binds it on load, replaying the buffered handshake. <code>omp --smoke-test</code> now also spawns the JS eval worker through the host entry and asserts it handshakes on a real worker thread.</li>
<li>Fixed pre-prompt context-full compaction on OpenAI Responses sessions to use provider-anchored context usage when available, so large encrypted reasoning signatures no longer trigger automatic maintenance while the visible context percentage remains below threshold (<a href="https://github.com/can1357/oh-my-pi/issues/2628" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2628/hovercard">#2628</a>).</li>
</ul>
<h2>@oh-my-pi/collab-web</h2>
<h3>Fixed</h3>
<ul>
<li>Wrapped composer button labels to display icon-only on mobile devices for a more compact and readable layout</li>
<li>Made the connect screen, ended session card, and notification toasts fully responsive for smaller device viewports</li>
<li>Fixed mobile layout issues where the entire chat flow would overflow horizontally and text was rendered too large on iOS Safari (by setting <code>text-size-adjust: 100%</code>)</li>
<li>Made transcript rows stack vertically on small screens to optimize reading space, and prevented grid track expansion</li>
<li>Hid non-essential metadata (such as the model name, thinking level, and working directory path) and context gauge tracks on mobile headers to prevent overflow</li>
</ul>
<h2>@oh-my-pi/hashline</h2>
<h3>Changed</h3>
<ul>
<li>Changed the recommended hashline range separator from <code>..</code> to <code>.=</code> (e.g. <code>SWAP 1.=3:</code>, <code>DEL 4.=5</code>) so the inclusive <code>&lt;=</code>-style end is self-evident. <code>HL_RANGE_SEP</code> is now <code>.=</code>; the prompt, grammar, error messages, and emitted headers all use it. The lenient parser still accepts the legacy <code>..</code> (and <code>-</code>/<code>…</code>/space) forms.</li>
</ul>
<h2>@oh-my-pi/omp-stats</h2>
<h3>Changed</h3>
<ul>
<li>Renamed <code>__omp_stats_sync_worker</code> to <code>__omp_worker_stats_sync</code>.</li>
</ul>
<h2>@oh-my-pi/pi-utils</h2>
<h3>Added</h3>
<ul>
<li>Added <code>installWorkerInbox(port)</code> / <code>consumeWorkerInbox()</code> to <code>@oh-my-pi/pi-utils/worker-host</code>. A self-dispatching CLI host that imports a Bun worker module dynamically attaches the worker's real <code>message</code> listener after Bun flushes the messages the parent posted before spawn, dropping a synchronously-posted <code>init</code>. The host installs this buffering inbox synchronously in the entry's sync prefix so a listener exists at flush time; the worker module consumes it and binds the real handler, replaying anything buffered.</li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v15.13.2...v15.13.3"><tt>v15.13.2...v15.13.3</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.13.2]]></title>
<description><![CDATA[chore: bump version to 15.13.2]]></description>
<link>https://tsecurity.de/weiterlesen/3570141/3598280/v15132/</link>
<pubDate>Mon, 15 Jun 2026 08:53:59 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.13.2</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[curl summer of bliss]]></title>
<description><![CDATA[The curl project will not accept or otherwise handle any vulnerability reports during the month of July 2026. We call it the curl summer of bliss. curl’s submission form on Hackerone will be paused starting July 1, 2026. Summer of bliss starts: July 1, 2026. 00:00 CEST Submissions resume: August ...]]></description>
<link>https://tsecurity.de/weiterlesen/3570077/3598216/curl-summer-of-bliss/</link>
<pubDate>Mon, 15 Jun 2026 08:24:18 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[The curl project will not accept or otherwise handle any vulnerability reports during the month of July 2026. We call it the curl summer of bliss. curl’s submission form on Hackerone will be paused starting July 1, 2026. Summer of bliss starts: July 1, 2026. 00:00 CEST Submissions resume: August 3 2026. 09:00 CEST The … <a href="https://daniel.haxx.se/blog/2026/06/15/curl-summer-of-bliss/" class="more-link">Continue reading <span class="screen-reader-text">curl summer of bliss</span> <span class="meta-nav">→</span></a>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.13.1]]></title>
<description><![CDATA[chore: bump version to 15.13.1]]></description>
<link>https://tsecurity.de/weiterlesen/3569734/3597873/v15131/</link>
<pubDate>Mon, 15 Jun 2026 04:37:22 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.13.1</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.13.0]]></title>
<description><![CDATA[chore: bump version to 15.13.0]]></description>
<link>https://tsecurity.de/weiterlesen/3569216/3597355/v15130/</link>
<pubDate>Sun, 14 Jun 2026 18:39:00 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.13.0</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.12.6]]></title>
<description><![CDATA[chore: bump version to 15.12.6]]></description>
<link>https://tsecurity.de/weiterlesen/3568222/3596361/v15126/</link>
<pubDate>Sun, 14 Jun 2026 02:38:22 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.12.6</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.12.5]]></title>
<description><![CDATA[chore: bump version to 15.12.5]]></description>
<link>https://tsecurity.de/weiterlesen/3567982/3596121/v15125/</link>
<pubDate>Sat, 13 Jun 2026 21:53:26 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.12.5</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.12.4]]></title>
<description><![CDATA[@oh-my-pi/pi-agent-core
Fixed

Fixed remote compaction input trimming to use unlimited context when model.contextWindow is unset

@oh-my-pi/pi-ai
Added

Added GITLAB_CLIENT_ID and GITLAB_REDIRECT_URI env-var overrides for the GitLab Duo OAuth login flow so users running with their own GitLab OAut...]]></description>
<link>https://tsecurity.de/weiterlesen/3567743/3595882/v15124/</link>
<pubDate>Sat, 13 Jun 2026 18:24:20 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-agent-core</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed remote compaction input trimming to use unlimited context when <code>model.contextWindow</code> is unset</li>
</ul>
<h2>@oh-my-pi/pi-ai</h2>
<h3>Added</h3>
<ul>
<li>Added <code>GITLAB_CLIENT_ID</code> and <code>GITLAB_REDIRECT_URI</code> env-var overrides for the GitLab Duo OAuth login flow so users running with their own GitLab OAuth application can replace the bundled credentials when GitLab rejects the bundled <code>client_id</code>'s redirect URI. Setting <code>GITLAB_REDIRECT_URI</code> also disables the random-port fallback (strict OAuth providers reject mismatched URIs anyway). (<a href="https://github.com/can1357/oh-my-pi/issues/2424" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2424/hovercard">#2424</a>)</li>
<li>Added <code>AuthStorage.listStoredCredentials()</code> and <code>AuthStorage.removeCredential()</code> for per-account credential management.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Replaced the OpenAI SDK client usage in <code>openai-completions</code>, <code>openai-responses</code>, <code>azure-openai-responses</code>, and <code>openai-codex-responses</code> with the new internal <code>postOpenAIStream</code> OpenAI-wire JSON/SSE transport</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed streaming providers to cancel upstream model requests when the client closes the response body, so interrupted SSE sessions stop instead of continuing in the background</li>
<li>Fixed: provider request builders treat unknown <code>model.maxTokens</code> (<code>null</code>) as "no model cap" instead of coercing to <code>0</code> via <code>Math.min</code>; Anthropic falls back to the 64k Claude-Code cap for its required <code>max_tokens</code>.</li>
<li>Fixed transient stream failures on OpenAI-compatible providers by retrying HTTP 408/429/5xx responses and transient network errors with Retry-After/quota-hint aware backoff</li>
<li>Fixed SSE stream handling for OpenAI-compatible responses by parsing wire-level JSON frames directly and honoring <code>[DONE]</code> termination</li>
<li>Fixed stream error handling for OpenAI-compatible providers by preserving structured HTTP status/headers and response body details from failed requests for retry and strict-tool fallback logic</li>
<li>Fixed OpenAI-compat streams ending with a bare <code>finish_reason: "error"</code> (gateways like OpenRouter reporting upstream failures, e.g. Gemini <code>MALFORMED_FUNCTION_CALL</code>) surfacing as a non-retryable <code>Provider finish_reason: error</code>. The reason is now mapped to <code>Provider returned error finish_reason</code>, which the session retry classifier recognizes as transient, so the turn auto-retries instead of stopping with a pinned error banner.</li>
<li>Fixed <code>SqliteAuthCredentialStore.open()</code> crashing with <code>SQLITE_BUSY_RECOVERY</code> (errno 261) when several <code>omp --session</code> panes restore concurrently after an unclean shutdown: <code>PRAGMA busy_timeout = 5000</code> now runs as a standalone statement BEFORE <code>PRAGMA journal_mode=WAL</code> (the first lock-taking statement during WAL recovery), and <code>open()</code> retries the BUSY family — <code>SQLITE_BUSY</code>, <code>SQLITE_BUSY_RECOVERY</code>, <code>SQLITE_BUSY_SNAPSHOT</code>, <code>SQLITE_BUSY_TIMEOUT</code> — with bounded exponential backoff. The exhausted-retry error message includes the DB path. Exported <code>isSqliteBusyError(err)</code> for callers that need the same classifier (<a href="https://github.com/can1357/oh-my-pi/issues/2421" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2421/hovercard">#2421</a>).</li>
<li>Fixed MiniMax-M3 OpenAI-compatible streams rendering reasoning twice when the same chunk carried both <code>&lt;think&gt;…&lt;/think&gt;</code> content and structured <code>reasoning_content</code>; structured reasoning now wins and cumulative MiniMax reasoning snapshots are collapsed to deltas. (<a href="https://github.com/can1357/oh-my-pi/issues/2433" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2433/hovercard">#2433</a>)</li>
<li>Fixed Gemini turns silently halting the agent when the model returned <code>finishReason: STOP</code> with only an empty (or whitespace-only) text part and no tool call — the well-known "empty response" failure. All Google surfaces (public Generative Language <code>streamGoogle</code>, Vertex <code>streamGoogleVertex</code>, and Cloud Code Assist <code>google-gemini-cli</code>/<code>google-antigravity</code>) now classify such a turn as empty via the shared <code>hasMeaningfulGoogleContent</code> check and retry it up to <code>MAX_EMPTY_STREAM_RETRIES</code> times before surfacing an error. The Cloud Code Assist path previously had an empty-stream retry that never fired for this case (its <code>hasContent</code> flag counted an empty-string text part as content), and the public/Vertex path had no retry at all; the retry now emits a single <code>start</code> event so no duplicate partial message leaks downstream.</li>
</ul>
<h2>@oh-my-pi/pi-catalog</h2>
<h3>Added</h3>
<ul>
<li>Added bundled Fireworks models <code>deepseek-v4-flash</code>, <code>kimi-k2.7-code</code>, <code>minimax-m2.5</code>, <code>minimax-m3</code>, <code>nemotron-3-ultra-nvfp4</code>, <code>qwen3.6-plus</code>, and <code>qwen3.7-plus</code></li>
<li>Changed</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Model <code>contextWindow</code>/<code>maxTokens</code> are now <code>number | null</code>; discovery emits <code>null</code> when a provider reports no limit, replacing the <code>222222</code>/<code>8888</code> (<code>UNK_CONTEXT_WINDOW</code>/<code>UNK_MAX_TOKENS</code>) sentinels (now removed). Bundled <code>models.json</code> unknown limits are <code>null</code>.</li>
<li>Changed the <code>github-copilot</code> model context window to <code>524288</code> tokens</li>
<li>Changed Fireworks model discovery to source the control-plane <code>List Models</code> API (<code>GET /v1/accounts/fireworks/models?filter=supports_serverless=true</code>) instead of the OpenAI-compatible <code>/v1/models</code> inference listing. The inference endpoint returns a sparse, account-specific subset that omits on-demand serverless models (e.g. <code>kimi-k2.7-code</code>), so newly published serverless models stayed invisible in the picker until hand-added to the bundled catalog. The control-plane catalog enumerates every serverless model with capability metadata (<code>supportsServerless</code>/<code>supportsTools</code>/<code>supportsImageInput</code>/<code>contextLength</code>/<code>displayName</code>), paginated and filtered to tool-capable <code>READY</code> entries, then merged with bundled/models.dev references — the Kimi K2 max-output clamp and DeepSeek V4 thinking-toggle strip are preserved, and unbundled models default to reasoning so <code>buildModel</code> derives the Fireworks effort map. New serverless releases now surface automatically with no catalog edits.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Filled missing <code>contextWindow</code> and <code>maxTokens</code> in generated <code>models.json</code> for proxy/reseller variants by inheriting limits from canonical-family and segment-reference models</li>
<li>Ignored zero-cost <code>x-ai</code> subscription entries as reference sources when backfilling limits so inflated values are not propagated</li>
<li>Fixed the model cache opening with <code>PRAGMA journal_mode=WAL</code> before <code>PRAGMA busy_timeout</code>, so concurrent omp startups could crash inside <code>getDb()</code> on <code>SQLITE_BUSY</code> during WAL recovery instead of waiting through the transient lock. The busy handler is now installed before the first lock-taking statement (<a href="https://github.com/can1357/oh-my-pi/issues/2421" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2421/hovercard">#2421</a>).</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Removed the top-level <code>--list-models</code> flag path and migrated model listing to the new <code>omp models</code> command</li>
</ul>
<h3>Added</h3>
<ul>
<li>Added <code>omp models</code> command to list and manage models with <code>ls</code>, <code>find</code>, <code>canonical</code>, and <code>refresh</code> actions</li>
<li>Added <code>--json</code> output plus <code>-e/--extension</code>, <code>--no-extensions</code>, and <code>--config</code> controls to <code>omp models</code> listings</li>
<li>Added <code>skills.enableAgentsUser</code> and <code>skills.enableAgentsProject</code> settings (default on) so the canonical OMP-native <code>~/.agent[s]/skills</code> and project-walkup <code>.agent[s]/skills</code> are configurable independently from the third-party Claude/Codex/Pi toggles.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Model registry merge and <code>omp models</code> / model picker handle unknown context/output limits (<code>null</code>) — unknown limits render as <code>-</code> instead of a fake <code>222K</code>/<code>8.9K</code>.</li>
<li>Changed <code>omp models</code> to use cached provider data by default and require <code>omp models refresh</code> for a forced online re-fetch</li>
<li>Updated model-resolution errors to point to <code>omp models</code> when a provider or model is not found</li>
<li>Upgraded workspace catalog packages to their latest versions as of 3 days ago, and refactored the ACP agent implementation to be compatible with <code>@agentclientprotocol/sdk</code> version <code>0.25.0</code>.</li>
<li>Made the <code>zod</code> version requirement in the workspace catalog more tolerant (<code>^4.0.0</code> instead of <code>4.4.3</code>), and aligned type definitions in coding-agent extensibility modules.</li>
<li>Changed <code>/logout</code> to pick a stored account after the provider, so multi-account OAuth providers can remove one credential without logging out every account.</li>
<li>Changed the status-line context% to report the provider's real prompt-token count — anchored on the last assistant response, matching the <code>/context</code> panel and the collab host broadcast — instead of an independent cl100k estimate of the whole conversation. The estimate could read several points high and climb past 100% on subscription/Codex models (whose advertised window, e.g. <code>272K</code>, is already the input budget after reserving max output) while the request was still well within the real limit. Right after compaction the segment now shows <code>?</code> until the next response re-establishes the true count, and the redundant per-message estimate cache was dropped in favor of memoizing <code>getContextUsage()</code>.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed ACP thinking-delta mapping to tolerate live chunks that only carry delta text.</li>
<li>Fixed image input to Ollama (local <code>ollama</code>, <code>ollama-cloud</code>, and any <code>ollama-chat</code> model) failing with an opaque HTTP 400 when an attached image was encoded as WebP. Ollama decodes images through llama.cpp / <code>stb_image</code>, which is built without WebP support, so the resize pipeline now auto-excludes WebP for those models — the automatic equivalent of <code>OMP_NO_WEBP=1</code>, applied across every image path (<code>@file</code> mentions and prompt/paste/CLI attachments, the <code>read</code>/<code>inspect_image</code> tools, <code>eval</code> display images, <code>fetch</code>ed images, and browser screenshots). Other providers are unaffected and still honor <code>OMP_NO_WEBP</code>.</li>
<li>Fixed queued steering/follow-up display to derive from the agent-core queue, so queued chips clear when the core dequeues them and no longer strand after empty-Enter aborts.</li>
<li>Fixed model auth gateway probing to avoid skipping candidates with unknown <code>maxTokens</code> limits (<code>null</code>)</li>
<li>Fixed model listings so providers registered via extensions are now included from <code>-e</code> and configured <code>extensions</code> sources</li>
<li>Fixed <code>/mcp reauth</code>, <code>/mcp test</code>, and <code>/mcp unauth</code> to find and operate on MCP servers reported by <code>/mcp list</code> even when they are only runtime-discovered and not stored in writable config, including namespaced plugin servers like <code>cloudflare:cloudflare-api</code></li>
<li>Fixed MCP server name validation so colon-namespaced server IDs are accepted when persisting reauth overrides so namespaced OAuth MCP servers can be stored in user config as <code>server:subserver</code> entries</li>
<li>Retried assistant turns that stop with reasoning/thinking only and no final text or tool call, so Gemini/Antigravity thought-only <code>STOP</code> responses continue instead of silently ending the session.</li>
<li>Fixed <code>~/.agent[s]/skills</code> not appearing as <code>/skill:&lt;name&gt;</code> commands when every named source toggle (<code>skills.enableCodexUser</code>, <code>skills.enableClaudeUser</code>, <code>skills.enableClaudeProject</code>, <code>skills.enablePiUser</code>, <code>skills.enablePiProject</code>) was off: <code>loadSkills</code> gated the <code>agents</code> provider on <code>anyBuiltInSkillSourceEnabled</code>, so a user who turned off the Claude/Codex/Pi sources to clean noise also lost their own canonical OMP-native skills. The <code>agents</code> provider now reads the dedicated <code>enableAgentsUser</code>/<code>enableAgentsProject</code> toggles, decoupled from the third-party fall-through (<a href="https://github.com/can1357/oh-my-pi/issues/2401" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2401/hovercard">#2401</a>).</li>
<li>Fixed Windows PowerShell image paste so Ctrl+V can fall back to the PowerShell clipboard bridge when the native clipboard reader reports no image (<a href="https://github.com/can1357/oh-my-pi/issues/2429" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2429/hovercard">#2429</a>).</li>
<li>Fixed misaligned box borders in Mermaid ASCII rendering for CJK (Korean/Japanese/Chinese) and emoji labels — affects both fenced <code>mermaid</code> code blocks in assistant messages and the <code>render_mermaid</code> tool. <code>beautiful-mermaid@1.1.3</code> measures label width in UTF-16 code units while terminals render East Asian characters 2 columns wide; a <code>patchedDependencies</code> entry rebuilds its ASCII renderer to measure terminal display columns (grapheme-cluster aware, wcwidth-style policy). The patch mirrors the upstream PR (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4654741745" data-permission-text="Title is private" data-url="https://github.com/lukilabs/beautiful-mermaid/issues/128" data-hovercard-type="pull_request" data-hovercard-url="/lukilabs/beautiful-mermaid/pull/128/hovercard" href="https://github.com/lukilabs/beautiful-mermaid/pull/128">lukilabs/beautiful-mermaid#128</a>) and should be dropped once it ships in a release.</li>
<li>Fixed interrupt loader state getting stuck after queued-message aborts by removing the session-layer flush/latch path; empty Enter now aborts the active turn and lets the existing post-unwind queue drain resume normally.</li>
<li>Fixed <code>/goal &lt;objective&gt;</code> and <code>/goal set &lt;objective&gt;</code> during streaming so goal context is steered immediately but objective submission waits for the active turn to finish instead of spamming <code>AgentBusyError</code> (<a href="https://github.com/can1357/oh-my-pi/issues/2454" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2454/hovercard">#2454</a>).</li>
<li>Fixed concurrent <code>omp --session</code> startups (e.g. cmux pane restore after an unclean shutdown) crashing with <code>SQLITE_BUSY_RECOVERY</code> while the agent SQLite databases were still under WAL recovery. The auth credential store and <code>AgentStorage.open()</code> retry the <code>SQLITE_BUSY</code> family with bounded backoff, and every shared SQLite open path (<code>AgentStorage</code>, history, autoresearch, memories, github cache, auto-QA grievances, catalog model cache, stats) now installs the busy handler before the first lock-taking statement so transient WAL recovery contention waits instead of crashing (<a href="https://github.com/can1357/oh-my-pi/issues/2421" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2421/hovercard">#2421</a>).</li>
<li>Mnemopi <code>per-project</code> / <code>per-project-tagged</code> bank derivation is now stable for one cwd, ignoring the surrounding git layout. Previously the bank id was hashed from <code>git.repo.resolveSync(cwd)?.repoRoot ?? path.resolve(cwd)</code>, so adding or removing a <code>.git</code> anywhere above the working directory silently repointed the same conversation to a new bank and stranded its memories (e.g. <code>/home/x/projects/repo</code> flipping between <code>projects-…</code> and <code>repo-…</code>). The derivation in <code>packages/coding-agent/src/mnemopi/config.ts</code> now hashes <code>path.resolve(cwd)</code> directly, and session startup widens the recall set with any sibling bank under <code>&lt;dbDir&gt;/banks/</code> whose <code>working_memory</code> rows already carry the active cwd in <code>metadata_json.$.cwd</code>, so memories stranded by the old, less-stable derivation become visible again on the next session without manual migration (<a href="https://github.com/can1357/oh-my-pi/issues/2412" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2412/hovercard">#2412</a>).</li>
<li>Fixed model switching (Ctrl+P role cycling and the alt+p / <code>/switch</code> / <code>/models</code> selector) intermittently freezing the UI for several seconds. <code>AgentSession.setModel</code>/<code>setModelTemporary</code> ran an eager <code>await modelRegistry.getApiKey(model)</code> purely as an existence pre-flight and discarded the value — but <code>getApiKey</code> does real work: it synchronously executes command-backed key programs (<code>apiKey: "!cmd"</code>, <code>execSync</code> with a 10s timeout, blocking the event loop) and refreshes OAuth tokens over the network when one crosses the expiry window (the "fine for a few switches, then a multi-second stall" symptom). Switching now uses the synchronous, side-effect-free <code>ModelRegistry.hasConfiguredAuth</code> check; the concrete key (command execution + OAuth refresh) is still resolved lazily per request via the existing resolver, so an unconfigured provider still fails fast with <code>No API key</code> while a healthy switch never touches the network or spawns a subprocess. <code>hasConfiguredAuth</code> no longer runs the command program or refreshes tokens either, matching its documented "probe without resolving an API key" contract.</li>
<li>Fixed session resume (<code>pi -c</code> / <code>--continue</code> / <code>--session</code>) hanging for ~10s at startup — surfaced by the watchdog as <code>Still starting … phase: createAgentSession &gt; restoreSessionModel</code> — when an OAuth token needed refreshing or the auth broker (<code>OMP_AUTH_BROKER_URL</code>) was unreachable. Picking which saved model to restore is a pure <em>selection</em> that only needs to know whether auth is configured, but <code>restoreSessionModel</code> probed each candidate with the async <code>getApiKey</code>, which refreshes OAuth tokens over the network, executes command-backed key programs, and issues auth-broker requests — so a slow or unreachable endpoint stalled resume for the full refresh timeout per candidate. Startup model selection now uses the synchronous, side-effect-free <code>ModelRegistry.hasConfiguredAuth</code> probe (the same fix already applied to interactive model switching); the concrete key is still resolved lazily on the first request via the resolver.</li>
</ul>
<h2>@oh-my-pi/collab-web</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed context usage percentage calculations to return null when context window is missing or non-positive, preventing invalid or Infinity/NaN usage display</li>
</ul>
<h2>@oh-my-pi/pi-mnemopi</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>consolidateToEpisodic</code> (the function backing <code>sleep</code> / <code>sleepAllSessions</code>) never populating the episodic graph: the <code>gists</code> and <code>graph_edges</code> tables stayed at 0 rows across every bank even after multiple consolidation cycles, so Polyphonic Recall's <code>graph</code> voice (BFS over <code>findGistsByParticipant</code> / <code>findRelatedMemories</code>) always returned nothing. Consolidation now best-effort ingests the new episodic memory into <code>EpisodicGraph</code> so the gist row, gist→memory <code>ctx</code> edge, fact edges, and cross-memory similarity/entity/temporal edges land alongside the episodic row. Independent of the existing <code>MNEMOPI_PROACTIVE_LINKING</code> flag, which still gates the same enrichment on the <code>remember()</code> write path. (<a href="https://github.com/can1357/oh-my-pi/issues/2435" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2435/hovercard">#2435</a>)</li>
</ul>
<h2>@oh-my-pi/pi-natives</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed native shell execution rejecting quoted heredocs whose closing delimiter is the final line without a trailing newline, matching bash paste-run snippets.</li>
</ul>
<h2>@oh-my-pi/omp-stats</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed the stats dashboard's SQLite init never setting <code>PRAGMA busy_timeout</code>, so a concurrent <code>omp</code> startup hitting WAL recovery could crash <code>initDb()</code> with <code>SQLITE_BUSY</code> instead of waiting through it. The busy handler is now installed before <code>PRAGMA journal_mode=WAL</code> (<a href="https://github.com/can1357/oh-my-pi/issues/2421" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2421/hovercard">#2421</a>).</li>
</ul>
<h2>@oh-my-pi/pi-tui</h2>
<h3>Added</h3>
<ul>
<li><code>PI_FORCE_HYPERLINKS=1</code> / <code>PI_NO_HYPERLINKS=1</code> env overrides for the OSC 8 hyperlink capability, mirroring the <code>PI_FORCE_SYNC_OUTPUT</code>/<code>PI_NO_SYNC_OUTPUT</code> shape (opt-out beats force-on).</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Auto-enable OSC 8 hyperlinks inside tmux when tmux self-reports &gt;= 3.4 via <code>TERM_PROGRAM_VERSION</code>; tmux 3.4 stores OSC 8 as a cell attribute and forwards it to outer terminals whose <code>terminal-features</code> include <code>hyperlinks</code>. Older tmux, GNU screen, and tmux without a reported version still default off. Resolution is factored into <code>hyperlinksUserOverride()</code> and <code>shouldEnableHyperlinksByDefault()</code> mirroring the sync-output helpers (<a href="https://github.com/can1357/oh-my-pi/issues/2403" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2403/hovercard">#2403</a>).</li>
</ul>
<h2>@oh-my-pi/pi-utils</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed abortable stream wrappers to cancel the source stream on abort, so timeout watchdogs release upstream HTTP bodies instead of only stopping the local reader.</li>
</ul>
<h2>@oh-my-pi/pi-wire</h2>
<h3>Changed</h3>
<ul>
<li>Changed <code>WireModel.contextWindow</code> and <code>ContextUsage.contextWindow</code> to <code>number | null</code> to allow representing unavailable context-window values</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix(tui): respect OSC 8 hyperlinks under tmux &gt;= 3.4 by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4650944240" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2404" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2404/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2404">#2404</a></li>
<li>fix(skills): load ~/.agents/skills even when third-party source toggles are off by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4651011756" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2405" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2405/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2405">#2405</a></li>
<li>fix(coding-agent): stabilize mnemopi per-project bank derivation (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4651832873" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2412" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2412/hovercard" href="https://github.com/can1357/oh-my-pi/issues/2412">#2412</a>) by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4651944937" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2414" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2414/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2414">#2414</a></li>
<li>fix(auth): retried SQLITE_BUSY family and hoisted busy_timeout by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4652322896" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2423" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2423/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2423">#2423</a></li>
<li>fix(ai): added GITLAB_CLIENT_ID and GITLAB_REDIRECT_URI overrides for gitlab-duo OAuth by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4652454808" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2425" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2425/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2425">#2425</a></li>
<li>fix(coding-agent): restore Windows image paste fallback by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4652851725" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2430" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2430/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2430">#2430</a></li>
<li>fix(ai): deduplicate MiniMax reasoning stream by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4654022523" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2434" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2434/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2434">#2434</a></li>
<li>fix(mnemopi): populated gists and graph_edges during consolidation by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4654648195" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2439" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2439/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2439">#2439</a></li>
<li>fix: align Mermaid ASCII box borders for CJK/emoji labels by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/chan1103/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/chan1103">@chan1103</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4654744037" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2442" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2442/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2442">#2442</a></li>
<li>docs: document project settings and disabledProviders by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4655013563" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2448" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2448/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2448">#2448</a></li>
<li>fix(cli): defer goal objectives while streaming by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4655927611" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2455" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2455/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2455">#2455</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v15.12.3...v15.12.4"><tt>v15.12.3...v15.12.4</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.12.3]]></title>
<description><![CDATA[chore: bump version to 15.12.3]]></description>
<link>https://tsecurity.de/weiterlesen/3565854/3593993/v15123/</link>
<pubDate>Fri, 12 Jun 2026 18:14:25 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.12.3</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.12.2]]></title>
<description><![CDATA[test(collab): deflake read-only guest tests against broadcast frame r…]]></description>
<link>https://tsecurity.de/weiterlesen/3565755/3593894/v15122/</link>
<pubDate>Fri, 12 Jun 2026 17:32:57 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>test(collab): deflake read-only guest tests against broadcast frame r…</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.12.1]]></title>
<description><![CDATA[@oh-my-pi/pi-agent-core
Breaking Changes

Changed pruneSupersededToolResults to allow supersedeKey to be omitted so useless-result pruning can run without read-style supersede grouping

Added

Added pruneUseless controls to PruneConfig and SupersedePruneConfig so callers can toggle compaction of ...]]></description>
<link>https://tsecurity.de/weiterlesen/3565651/3593790/v15121/</link>
<pubDate>Fri, 12 Jun 2026 16:45:27 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-agent-core</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Changed <code>pruneSupersededToolResults</code> to allow <code>supersedeKey</code> to be omitted so useless-result pruning can run without read-style supersede grouping</li>
</ul>
<h3>Added</h3>
<ul>
<li>Added <code>pruneUseless</code> controls to <code>PruneConfig</code> and <code>SupersedePruneConfig</code> so callers can toggle compaction of <code>toolResult</code> entries marked <code>useless</code></li>
<li>Added the ability to disable useless-result pruning by setting <code>pruneUseless</code> to false</li>
<li>Tools can flag a result contextually useless (<code>AgentToolResult.useless</code>; overridable via <code>AfterToolCallResult.useless</code>): the agent loop copies the flag onto the persisted <code>ToolResultMessage</code> (errors always win), and compaction consumes it — the cache-aware supersede pass and the threshold prune blank flagged results to the exact <code>USELESS_NOTICE</code> placeholder (bypassing the protect window, skipping results smaller than the notice), shake collects them inside the protect-recent window, and <code>serializeConversation</code> drops the whole tool call/result pair from summarizer input</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Changed <code>pruneSupersededToolResults</code> to allow omitted <code>supersedeKey</code> when <code>pruneUseless</code> is enabled, so useless-result pruning can run without read-style supersede grouping</li>
</ul>
<h2>@oh-my-pi/pi-ai</h2>
<h3>Added</h3>
<ul>
<li>Added the optional <code>ToolResultMessage.useless</code> flag: tools can declare a finished result contextually useless (zero matches, elapsed wait) so compaction passes may elide it once consumed. Never serialized to provider wire formats and never set together with <code>isError</code>.</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Added</h3>
<ul>
<li>Added the <code>compaction.dropUseless</code> setting (default on): tool results flagged contextually useless are elided by the per-turn cache-aware prune pass and the pre-compaction threshold prune, replaced with <code>[Uneventful result elided]</code>. Built-in tools flag their uneventful outcomes — zero-match/zero-result <code>search</code>/<code>find</code>/<code>ast_grep</code>/<code>recall</code> (warnings included; the follow-up call has already corrected course), empty LSP lookups, <code>job</code> polls where everything is still running (plus nothing-to-wait-for and unknown-id polls), <code>irc</code> wait timeouts and empty inbox drains, and zero-result <code>github</code> searches / run-watch give-ups</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Restored the default double-Esc behavior to open the editable message-history selector instead of <code>/tree</code> so pressing Esc twice can edit a previous message again (<a href="https://github.com/can1357/oh-my-pi/issues/2396" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2396/hovercard">#2396</a>).</li>
</ul>
<h2>@oh-my-pi/snapcompact</h2>
<h3>Changed</h3>
<ul>
<li><code>serializeConversation</code> now skips tool call/result pairs whose result is flagged contextually useless (<code>useless: true</code>, non-error), so archived frames stop carrying zero-match searches and timed-out waits</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix(tui): restore double-Esc message history by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4649876266" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2397" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2397/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2397">#2397</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v15.12.0...v15.12.1"><tt>v15.12.0...v15.12.1</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[About:Community: May highlights: Contributor spotlight, Web Serial support, and more]]></title>
<description><![CDATA[Hi Mozillians,
For years, the Mozilla Community Newsletter has served as a monthly touchpoint for contributors and community members across the Mozilla ecosystem. Coordinated by the Customer Experience (CX) team, it helps keep our global contributor and product communities informed, connected, an...]]></description>
<link>https://tsecurity.de/weiterlesen/3565508/3593647/aboutcommunity-may-highlights-contributor-spotlight-web-serial-support-and-more/</link>
<pubDate>Fri, 12 Jun 2026 15:56:09 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Hi Mozillians,</p>
<p class="isSelectedEnd">For years, the <a href="https://community.mozilla.org/newsletter">Mozilla Community Newsletter</a> has served as a monthly touchpoint for contributors and community members across the Mozilla ecosystem. Coordinated by the Customer Experience (CX) team, it helps keep our global contributor and product communities informed, connected, and engaged through updates, contributor stories, announcements, and opportunities to get involved.</p>
<p class="isSelectedEnd">While the newsletter has traditionally been distributed directly to community members, we recognize that many of these updates are valuable to a broader audience as well. That’s why we’re bringing our contentinto blog post format, making it easier for anyone interested in Mozilla’s mission, products, and community work to stay informed.</p>
<p class="isSelectedEnd">Whether you’re a longtime contributor, a Firefox enthusiast, or simply curious about what’s happening across Mozilla, we hope these updates provide useful insights into the people, projects, and initiatives shaping our community.</p>
<p>In this edition, we’re sharing our latest updates from May 2026. It’s packed with the latest community news, contributor highlights, project updates, and opportunities to get involved in Mozilla’s work around the world.</p>
<p>So, without further ado, let’s dive in!</p>
<p><b>‍ From localizing to Firefox Enterprise</b></p>
<p>Long-time Mozillian Valery recently shared an open-source project he built to help Firefox Enterprise administrators manage Firefox deployments more easily called Browser Policy Manager or BPM. Beyond the tool itself, this story is a proof of the long-term value of investing in the community. Stories like Valery’s show how community contributions evolve over time and why fostering a strong, engaged contributor community continues to pay dividends across the Mozilla ecosystem.</p>
<p><a href="https://connect.mozilla.org/t5/discussions/i-built-an-open-source-firefox-enterprise-policy-manager-and/m-p/126284">Learn more about PBM</a></p>
<p><b> Firefox Referrals: We want to hear from you</b></p>
<p>Could Firefox users help grow the community by recommending Firefox to friends and family? That’s the question being explored in a recent Mozilla Connect discussion about potential referral programs. Join the conversation to share your thoughts on what would motivate you to recommend Firefox, and what a referral experience should (or shouldn’t) look like.</p>
<p><a href="https://connect.mozilla.org/t5/discussions/what-do-you-think-of-firefox-referrals/td-p/127384">Share your feedback</a></p>
<p><b> Web Serial finally arrives in Firefox 151</b></p>
<p>After years of community interest and requests dating back more than a decade, Firefox 151 now includes support for the <strong>Web Serial API</strong>. Developers can use Firefox to communicate with and manage serial-connected devices such as ESP boards, Raspberry Pi Picos, 3D printers, CNC machines, and other microcontrollers directly from the web. It’s a long-awaited milestone for the maker and hardware community, and we’re excited to finally see it land in Firefox.</p>
<p><a href="https://www.firefox.com/firefox/151.0/releasenotes/#html5">Learn more</a></p>
<p><b> Community spotlight</b></p>
<p>In this community spotlight, we feature <strong>Baurzhan Muftakhidinov</strong>, whose work has helped bring Firefox and many other open source projects to Kazakh users. His story is a testament to the power of persistence, community, and the importance of keeping smaller languages visible online.</p>
<p><a href="https://blog.mozilla.org/l10n/2026/04/15/localizer-spotlight-baurzhan/">Read Baurzhan’s story</a></p>
<hr>
<p>P.S.</p>
<p>Enjoyed these updates? Subscribe to the <a href="https://community.mozilla.org/newsletter">Mozilla Community Newsletter</a> and get the latest updates delivered straight to your inbox.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.12.0]]></title>
<description><![CDATA[chore: bump version to 15.12.0]]></description>
<link>https://tsecurity.de/weiterlesen/3565507/3593646/v15120/</link>
<pubDate>Fri, 12 Jun 2026 15:56:08 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.12.0</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.11.8]]></title>
<description><![CDATA[chore: bump version to 15.11.8]]></description>
<link>https://tsecurity.de/weiterlesen/3565004/3593143/v15118/</link>
<pubDate>Fri, 12 Jun 2026 12:23:58 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.11.8</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.11.7]]></title>
<description><![CDATA[test: Update issue #2372 repro test to use rebuildChatFromMessages]]></description>
<link>https://tsecurity.de/weiterlesen/3564688/3592827/v15117/</link>
<pubDate>Fri, 12 Jun 2026 10:09:35 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>test: Update issue <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4647377182" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2372" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2372/hovercard" href="https://github.com/can1357/oh-my-pi/issues/2372">#2372</a> repro test to use <code>rebuildChatFromMessages</code></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.11.6]]></title>
<description><![CDATA[@oh-my-pi/pi-coding-agent
Changed

Renamed the saved Codex reset command from /reset-usage to /usage reset and added /usage show as an explicit alias for plain /usage.

Fixed

Fixed the Subagents HUD order so progress updates no longer move active rows; batched subagents keep their task order.
Fi...]]></description>
<link>https://tsecurity.de/weiterlesen/3564279/3592415/v15116/</link>
<pubDate>Fri, 12 Jun 2026 06:53:26 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Changed</h3>
<ul>
<li>Renamed the saved Codex reset command from <code>/reset-usage</code> to <code>/usage reset</code> and added <code>/usage show</code> as an explicit alias for plain <code>/usage</code>.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed the Subagents HUD order so progress updates no longer move active rows; batched subagents keep their task order.</li>
<li>Fixed <code>/settings</code> dirty-value highlighting so changed values stay orange while the row has keyboard focus.</li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v15.11.5...v15.11.6"><tt>v15.11.5...v15.11.6</tt></a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.11.5]]></title>
<description><![CDATA[chore: bump version to 15.11.5]]></description>
<link>https://tsecurity.de/weiterlesen/3564219/3592355/v15115/</link>
<pubDate>Fri, 12 Jun 2026 06:08:35 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.11.5</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.11.4]]></title>
<description><![CDATA[chore: bump version to 15.11.4]]></description>
<link>https://tsecurity.de/weiterlesen/3564096/3592232/v15114/</link>
<pubDate>Fri, 12 Jun 2026 04:38:06 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.11.4</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.11.3]]></title>
<description><![CDATA[chore: bump version to 15.11.3]]></description>
<link>https://tsecurity.de/weiterlesen/3563556/3591692/v15113/</link>
<pubDate>Thu, 11 Jun 2026 21:38:10 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.11.3</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.11.2]]></title>
<description><![CDATA[chore: bump version to 15.11.2]]></description>
<link>https://tsecurity.de/weiterlesen/3563161/3591297/v15112/</link>
<pubDate>Thu, 11 Jun 2026 18:39:21 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.11.2</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[v15.11.1]]></title>
<description><![CDATA[chore: bump version to 15.11.1]]></description>
<link>https://tsecurity.de/weiterlesen/3562847/3590983/v15111/</link>
<pubDate>Thu, 11 Jun 2026 17:10:38 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>chore: bump version to 15.11.1</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Pascal Chevrel: Spell-checking for more Firefox users — a community effort]]></title>
<description><![CDATA[A while back, I stumbled onto something that turned into a rewarding side-project at Mozilla.

Firefox ships with a built-in spellchecker, but it only activates if a dictionary for your language is bundled with the browser. Coverage had grown organically over the years — driven largely by localiz...]]></description>
<link>https://tsecurity.de/weiterlesen/3562730/3590866/pascal-chevrel-spell-checking-for-more-firefox-users-a-community-effort/</link>
<pubDate>Thu, 11 Jun 2026 16:24:27 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>A while back, I stumbled onto something that turned into a rewarding side-project at Mozilla.</p>

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

<h3>Taking stock</h3>

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

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

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

<h3>Plugging into the community</h3>

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

<h3>The results</h3>

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

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

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

<h3>Stirring the pot</h3>

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

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

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

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

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

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

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

<h3>An open invitation</h3>

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

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

<p>See you in May 2027 for the next update.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Mozilla Open Policy & Advocacy Blog: A Handful of Companies Control the Web. AICOA Can Change That.]]></title>
<description><![CDATA[Mozilla Champions the Reintroduction of the American Innovation and Choice Online Act (AICOA)
Today, only a handful of tech companies shape the online experience for the more than 300 million internet users in America. This concentration of power is exactly why we need legislation that advances c...]]></description>
<link>https://tsecurity.de/weiterlesen/3562729/3590865/mozilla-open-policy-advocacy-blog-a-handful-of-companies-control-the-web-aicoa-can-change-that/</link>
<pubDate>Thu, 11 Jun 2026 16:24:26 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p><strong>Mozilla Champions the Reintroduction of the American Innovation and Choice Online Act (AICOA)</strong></p>
<p>Today, only a handful of tech companies shape the online experience for the more than 300 million internet users in America. This concentration of power is exactly why we need legislation that advances competition and user choice.  It’s all the more urgent as AI transforms not just the tools that people use, but also <a href="https://blog.mozilla.org/en/mozilla/rewiring-mozilla-ai-and-web/">magnifies the competitive inequities</a> underlying the web itself.</p>
<p>The American Innovation and Choice Online Act (AICOA) is bipartisan legislation designed to curb harmful gatekeeper behaviors of the biggest tech platforms. The bill does so by prohibiting dominant platforms from unfairly preferencing their own products, discriminating against tech competitors, and preventing interoperability — all practices that stop the best product winning and stifle consumer control. The goal is straightforward: companies should compete based on the quality of their products, not by leveraging anticompetitive tactics.</p>
<p>As the builder and operator of the Firefox browser and the browser engine <a href="https://blog.mozilla.org/netpolicy/2026/03/23/competition-innovation-and-the-future-of-the-web/">Gecko</a>, Mozilla has firsthand experience with the impact of the exclusionary practices AICOA seeks to prevent. For example, <a href="https://research.mozilla.org/browser-competition/over-the-edge-the-use-of-design-tactics-to-undermine-browser-choice/">deceptive design tactics</a> deployed by operating systems make it difficult for people to install and keep Firefox as their preferred browser. Browsers are the portal through which people access the open web, and users should define that interaction. AICOA would help limit the ability of operating systems to steer users toward affiliated products through deceptive design choices. Ensuring meaningful user choice online is not just about variety; it reflects values and individual preferences. Openness and innovation thrives when the web is built around platforms that serve people, not the other way round.</p>
<p>Browser engines, while lesser-known, are among the most complex and consequential pieces of infrastructure on the modern internet, impacting user-focused innovations in privacy, security, speed, and more. Gecko is one of only three widely used engines and the only independent browser engine. The importance of that competitive counterweight cannot be underestimated. When platform owners favor their own vertically integrated products, independent challengers face barriers that have nothing to do with product quality and everything to do with a monopolized market.</p>
<p>It’s important to recognize that antitrust reform can make the internet <i>more</i> private and secure than it is today, as we’ve consistently <a href="https://blog.mozilla.org/en/mozilla/calling-for-antitrust-reform/">emphasized</a>. For example, in 2021, Firefox was <a href="https://blog.mozilla.org/security/2021/02/23/total-cookie-protection/">at the forefront of developing technology against cross-site tracking</a>, but could not release the technology to Firefox users on iOS because of app store rules preferring Apple’s own browser engine, blocking alternatives like<a href="https://blog.mozilla.org/netpolicy/2026/03/23/competition-innovation-and-the-future-of-the-web/"> Gecko</a>.</p>
<p>We’re champions of AICOA and look forward to working with members of Congress to push this legislation forward and tackle longstanding anticompetitive practices. Mozilla thanks Senators Grassley and Klobuchar for their leadership in advancing competition. A thriving tech ecosystem requires an open, fair, and competitive market where innovative services can compete on merit and people can control their own experiences online.</p>
<p>The post <a href="https://blog.mozilla.org/netpolicy/2026/06/11/a-handful-of-companies-control-the-web-aicoa-can-change-that/">A Handful of Companies Control the Web. AICOA Can Change That.</a> appeared first on <a href="https://blog.mozilla.org/netpolicy">Open Policy &amp; Advocacy</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[This Week In Rust: This Week in Rust 655]]></title>
<description><![CDATA[Hello and welcome to another issue of This Week in Rust!
Rust is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
@thisweekinrust.bsky.social on Bluesky or
@ThisWeekinRu...]]></description>
<link>https://tsecurity.de/weiterlesen/3561677/3589813/this-week-in-rust-this-week-in-rust-655/</link>
<pubDate>Thu, 11 Jun 2026 10:13:12 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://www.rust-lang.org/">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://bsky.app/profile/thisweekinrust.bsky.social">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://mastodon.social/@thisweekinrust">@ThisWeekinRust</a> on mastodon.social, or
<a href="https://github.com/rust-lang/this-week-in-rust">send us a pull request</a>.
Want to get involved? <a href="https://github.com/rust-lang/rust/blob/main/CONTRIBUTING.md">We love contributions</a>.</p>
<p><em>This Week in Rust</em> is openly developed <a href="https://github.com/rust-lang/this-week-in-rust">on GitHub</a> and archives can be viewed at <a href="https://this-week-in-rust.org/">this-week-in-rust.org</a>.
If you find any errors in this week's issue, <a href="https://github.com/rust-lang/this-week-in-rust/pulls">please submit a PR</a>.</p>
<p>Want TWIR in your inbox? <a href="https://this-week-in-rust.us11.list-manage.com/subscribe?u=fd84c1c757e02889a9b08d289&amp;id=0ed8b72485">Subscribe here</a>.</p>
<h4><a class="toclink" href="https://this-week-in-rust.org/atom.xml#updates-from-rust-community">Updates from Rust Community</a></h4>


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

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



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



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

Removed compaction/index.ts re-export of snapcompact helpers, so snapcompact utilities are no longer available from the agent compaction barrel and should be imported from @oh-my-pi/snapcompact
Removed the convertToLlm alias export from compaction/message...]]></description>
<link>https://tsecurity.de/weiterlesen/3560944/3589080/v15110/</link>
<pubDate>Thu, 11 Jun 2026 00:25:07 +0200</pubDate>
<category>💾  Tools</category>
<source url="https://tsecurity.de">TSECURITY.DE</source>
<content:encoded><![CDATA[<h2>@oh-my-pi/pi-agent-core</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Removed <code>compaction/index.ts</code> re-export of snapcompact helpers, so snapcompact utilities are no longer available from the agent compaction barrel and should be imported from <code>@oh-my-pi/snapcompact</code></li>
<li>Removed the <code>convertToLlm</code> alias export from <code>compaction/messages</code> — it duplicated <code>defaultConvertToLlm</code> under a second name. Import <code>defaultConvertToLlm</code> (array form) or the new <code>convertMessageToLlm</code> (single-message form) instead</li>
</ul>
<h3>Added</h3>
<ul>
<li>Added <code>convertMessageToLlm()</code>: the single-message core transformer behind <code>defaultConvertToLlm()</code>. Embedders with app-specific message roles should handle their own roles and delegate every core role (<code>user</code>/<code>developer</code>/<code>assistant</code>/<code>toolResult</code>/<code>custom</code>/<code>hookMessage</code>/<code>branchSummary</code>/<code>compactionSummary</code>) to it instead of duplicating the conversion — a duplicated <code>compactionSummary</code> case is how snapcompact frames once silently dropped off provider requests</li>
<li>Added <code>pruneSupersededToolResults()</code> and the opt-in <code>PruneConfig.supersedeKey</code> hook so harnesses can prune stale tool results superseded by a newer read of the same file; superseded results are pruned ahead of age-based victims during overflow pruning and replaced with a <code>[Superseded by a newer read of this file]</code> placeholder. Without the new config, <code>pruneToolOutputs()</code> behavior is unchanged.</li>
<li>Added <code>readToolSupersedeKey()</code> implementing the read-tool path/selector grammar (selector-free reads supersede range reads of the same file; URL-scheme paths exempt). Pruning honors prompt-cache economics: per-turn prunes only fire when the post-candidate suffix is small or the cache is cold (idle gap).</li>
<li>Added the <code>snapcompact</code> compaction strategy via <code>@oh-my-pi/snapcompact</code>: instead of an LLM summary, discarded history is printed onto dense bitmap frames and re-attached to the compaction summary message as image blocks. <code>CompactionSummaryMessage</code> gains an optional <code>images</code> field, <code>estimateTokens()</code> charges per attached frame, and frames persist under <code>preserveData.snapcompact</code> with an 8-frame middle-out eviction budget.</li>
<li>Snapcompact frames are now rendered in a provider-aware shape (<code>SNAPCOMPACT_SHAPES</code> + <code>resolveSnapcompactShape(api)</code>), following the snapcompact 200k-token monolithic evals: Anthropic-family and unknown APIs get <code>8x8r-bw</code> (unscii-8 square cells, black ink, every line printed twice with the copy on a pale highlight band — read at F1 parity with raw text at ~2x lower cost and the most refusal-robust), Google gets <code>8x8r-sent</code> (sentence-hue ink, ~2.9x cheaper), and OpenAI gets <code>6x6u-sent</code> (unscii Lanczos-stretched to 6x6 cells — OpenAI bills a flat ~2.9k tokens per image, so frame count is the only cost lever) with <code>detail: "original"</code> on the frame images. <code>snapcompactCompact()</code> accepts <code>model</code>/<code>shape</code> options, frames persist their shape metadata, mixed-shape archives (provider switches, legacy 5x8 frames) are flagged in the reading instructions, and <code>snapcompactGeometry()</code>/<code>renderSnapcompactFrame()</code> now take a shape</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Compaction and branch-summary file lists are now a single <code>&lt;files&gt;</code> tag instead of <code>&lt;read-files&gt;</code>/<code>&lt;modified-files&gt;</code>: paths render as the grouped, prefix-folded directory tree the find/search tools emit (<code># dir/</code> headers, bare basenames), each annotated <code>(Read)</code>, <code>(Write)</code>, or <code>(RW)</code> — modified files that were also read get <code>(RW)</code>. Legacy tags in summaries written by earlier versions are still stripped and self-heal on the next compaction</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed queued steering messages being drained into an externally aborted run: interrupting mid-tool execution (e.g. Enter with a pending steer) dequeued the steer into the dying run — it landed in history without a response and the post-abort resume saw an empty queue, so the agent stopped instead of continuing. Steering/follow-up/aside queue polls are now skipped once the run's abort signal fires, leaving the queue intact for <code>Agent.continue()</code>.</li>
<li>Fixed <code>&lt;read-files&gt;</code> compaction lists recording the same file once per line-range/raw selector (<code>src/foo.ts:50-200</code>, <code>:raw</code>, <code>:1-50:raw</code>, …): read-tool selectors are now stripped before tracking, so reads dedupe to the base path and match their write/edit path when splitting read-only vs modified lists. Selector-polluted lists stored by earlier compactions self-heal on the next compaction. <code>readToolSupersedeKey()</code> now shares the same splitter (<code>splitReadSelector()</code>), gaining the <code>..</code> range alias and <code>L</code>-prefix forms it previously missed.</li>
<li>Fixed <code>estimateTokens()</code> undercounting thinking-heavy assistant messages on replay: <code>thinkingSignature</code> payloads (OpenAI Responses encrypted reasoning items, Anthropic signed thinking blocks, etc.) and <code>redactedThinking.data</code> are now charged alongside the visible thinking text, so the local estimate tracks provider-reported usage instead of straddling the threshold on every turn (<a href="https://github.com/can1357/oh-my-pi/issues/2275" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2275/hovercard">#2275</a>).</li>
</ul>
<h2>@oh-my-pi/pi-ai</h2>
<h3>Added</h3>
<ul>
<li>Added optional <code>ImageContent.detail</code> (<code>"auto" | "low" | "high" | "original"</code>): an OpenAI resolution hint forwarded by the <code>openai-responses</code> serializers (default stays <code>auto</code>) and by <code>openai-completions</code> for the values Chat Completions supports. <code>"original"</code> preserves native resolution — required for snapcompact frames, whose pixel-font glyphs do not survive the default downscale. Providers without a detail knob ignore the field.</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed OpenRouter DeepSeek V4 strict tool schemas nesting <code>anyOf</code> inside the nullable wrapper for optional unions, which produced a branch without <code>type</code> and triggered OpenRouter's <code>Invalid tool parameters schema : field anyOf: missing field type</code> 400. (<a href="https://github.com/can1357/oh-my-pi/issues/2270" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2270/hovercard">#2270</a>)</li>
<li>Hardened strict tool-schema handling beyond the optional-union case: <code>enforceStrictSchema</code> now splices natively nested pure unions into the parent <code>anyOf</code> (only when the inner node carries no constraining siblings, since sibling keywords are conjunctive with <code>anyOf</code>), so source schemas with nested unions no longer produce type-less <code>anyOf</code> branches that strict upstream validators reject. (<a href="https://github.com/can1357/oh-my-pi/issues/2270" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2270/hovercard">#2270</a>)</li>
<li>Made the openai-completions non-strict retry reachable for <code>"mixed"</code> strict mode (previously gated to <code>all_strict</code>, i.e. Cerebras only) and taught it to recognize upstream tool-schema validation 400s (<code>Invalid tool parameters schema …</code>, <code>Invalid schema for function …</code>). A matching rejection now retries the request with base (non-strict) schemas and persists <code>strictToolsDisabled</code> on the provider session, so later requests skip the doomed strict attempt instead of paying a 400 + retry round-trip each turn. (<a href="https://github.com/can1357/oh-my-pi/issues/2270" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2270/hovercard">#2270</a>)</li>
<li>Cross-model <code>anthropic-messages → anthropic-messages</code> continuations now preserve prior assistant turns' reasoning chains end-to-end: every prior <code>thinking</code>/<code>redactedThinking</code> block survives (not just the latest surviving assistant), and third-party ↔ third-party replays keep their signatures intact so the reasoning chain stays signed for the next turn. Signatures are stripped (and any <code>redacted_thinking</code> sibling without a native landing spot is dropped) only when an official Anthropic endpoint is on either end of the replay — official Anthropic cryptographically binds reasoning signatures to its key+session+model, while compatible reasoning endpoints (Z.AI, DeepSeek, custom anthropic-messages providers configured via <code>models.yaml</code>) treat them as opaque continuation hints. Source-side official detection uses the canonical catalog provider id <code>"anthropic"</code> (assistant messages carry no <code>baseUrl</code>); target-side detection reuses the baked <code>compat.officialEndpoint</code> flag. Latest-turn byte-for-byte behavior (Anthropic's "thinking blocks in the latest assistant message cannot be modified" rule) and existing aborted/errored last-block sanitization are unchanged. (<a href="https://github.com/can1357/oh-my-pi/issues/2257" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2257/hovercard">#2257</a>, <a href="https://github.com/can1357/oh-my-pi/issues/2265" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2265/hovercard">#2265</a>)</li>
</ul>
<h2>@oh-my-pi/pi-catalog</h2>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>buildModel</code> so malformed explicit thinking metadata without <code>efforts</code> is treated as sparse input and inferred instead of crashing during model resolution (<a href="https://github.com/can1357/oh-my-pi/issues/2251" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2251/hovercard">#2251</a>).</li>
</ul>
<h2>@oh-my-pi/pi-coding-agent</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Removed the <code>resume</code> option from the <code>task</code> tool API and its resume execution path; continue work on finished subagents by sending follow-up messages via <code>irc</code> instead</li>
<li>Removed the <code>irc.enabled</code> setting: irc availability is now derived — the tool exists exactly when there is someone to message (the session can spawn subagents through <code>task</code>, or it is a subagent itself). A stale <code>irc.enabled</code> key in config is ignored</li>
<li>The <code>task</code> tool was reworked to always run spawns in the background as independent, persistent agents: results arrive as async job deliveries (block with <code>job poll</code> only when genuinely needed). The wire schema is now shape-swapped by the new <code>task.batch</code> setting (default on): <code>{ agent, context, tasks[] }</code> — one subagent per task item, per-item <code>isolated</code>, and a required shared <code>context</code> — or, when disabled, a flat single-spawn shape <code>{ agent, id?, description?, assignment, isolated? }</code> with shared background passed via <code>local://</code> files instead</li>
<li>Removed the <code>task.simple</code> setting and the task tool's per-call <code>schema</code> parameter outright: structured subagent output now comes only from the agent definition's <code>output</code> frontmatter or the inherited session schema, and ad-hoc structured workflows use eval <code>agent(prompt, schema)</code>. A stale <code>task.simple</code> key in config is migrated away</li>
<li>Reworked <code>irc</code> to <code>send</code>/<code>wait</code>/<code>inbox</code>/<code>list</code> ops over a per-agent mailbox bus: the blocking <code>awaitReply</code> auto-reply turn is removed — <code>send</code> is fire-and-forget with delivery receipts, and replies are real turns by the recipient observed via <code>wait</code> (or the <code>send</code> <code>await: true</code> sugar)</li>
<li>Removed the <code>context</code> argument from eval <code>agent()</code> in both the JS and Python preludes: pass shared background via a <code>local://</code> file referenced in the prompt</li>
<li>Replaced the standalone session-observer overlay with the Agent Hub: <code>app.session.observe</code> (<code>ctrl+s</code>) now opens the hub, whose chat view absorbed the observer's transcript renderer</li>
</ul>
<h3>Added</h3>
<ul>
<li>Snapcompact compaction now passes the session model so frames render in the provider-optimal shape (unscii <code>8x8r-bw</code> for Anthropic-family/unknown APIs, <code>8x8r-sent</code> for Google, Lanczos-stretched <code>6x6u-sent</code> with <code>detail: "original"</code> for OpenAI), per the snapcompact 200k-token evals</li>
<li>Added per-turn supersede pruning of stale <code>read</code> results: when a file is re-read, older copies of the same path/selector are pruned from context at cache-favorable moments (small suffix, idle gap, or alongside overflow pruning). Gated by the new <code>compaction.supersedeReads</code> setting (default on)</li>
<li>Added soft request budgets for task subagents (explore/quick_task 40, others 90, configurable via <code>task.softRequestBudget</code>, 0 disables): crossing the budget injects a one-time wrap-up steer into the child; crossing 1.5× aborts the run gracefully</li>
<li>Added cancelled/aborted subagent salvage: instead of <code>(no output)</code>, merged task results now carry the child's last activity snippet plus request/token stats, and per-child stats lines include request counts</li>
<li>Added a repeat-read notice to the <code>read</code> tool: the third and later reads of the same file in a session append a one-line note suggesting range re-reads or the context echoed in edit results</li>
<li>Added a hard inline byte cap (~50KB) at the bash and browser tool-result boundaries with head/tail elision and an <code>artifact://</code> footer for the full output, closing paths that previously let 100KB+ results land inline</li>
<li>Added the Agent Hub overlay (<code>ctrl+s</code>, <code>alt+a</code>, or double-tap left arrow on an empty editor): a live table of registered subagents (status, unread IRC count, current task, last activity) with per-agent chat — Enter opens a transcript + input line that steers a running agent, prompts an idle one, and revives a parked one; <code>r</code> revives and <code>x</code> aborts/releases the selected agent</li>
<li>Added the <code>snapcompact</code> compaction strategy (<code>compaction.strategy: "snapcompact"</code>): history is archived onto dense bitmap "snapcompact" frames a vision model reads back directly, instead of an LLM-generated summary — instant, free, and verbatim. Auto compaction (including overflow recovery) and manual <code>/compact</code> both honor it; falls back to context-full with a visible warning notice when the current model is text-only (e.g. Codex API surfaces) or when <code>/compact</code> is given custom instructions. Frames survive context rebuilds and later compactions (budget eviction is middle-out: the session-head frame is pinned); the expanded compaction message notes the attached frame count</li>
<li>Added a persistent subagent lifecycle: finished subagents stay live as <code>idle</code>, are parked to disk after <code>task.agentIdleTtlMs</code> (default 7 minutes; <code>0</code> keeps them live until exit), and are revived automatically when messaged or prompted from the Agent Hub</li>
<li>Added the <code>history://</code> protocol: <code>history://</code> lists every registered agent and <code>history://&lt;agentId&gt;</code> renders a concise markdown transcript (tool calls collapsed to one line each, thinking elided) for live and parked agents alike</li>
<li>Added an IRC mailbox bus with bounded per-agent inboxes: <code>irc</code> <code>wait</code> blocks until a matching message arrives, <code>inbox</code> drains or peeks pending messages, and sending to an idle or parked agent wakes or revives it for a real turn</li>
<li>Added a dedicated TUI renderer for the <code>irc</code> tool: directional send/receive headers with delivery-outcome coloring, quoted message bodies with expand-aware truncation, per-recipient receipt trees for broadcasts and failures, and status-badged peer listings with unread counts</li>
<li>Added the <code>task.batch</code> setting (default on): the task tool's batch shape <code>{ agent, context, tasks[] }</code> spawns one subagent per item — each its own independent background job with the normal idle/parked lifecycle and optional per-item isolation — and prepends the required shared <code>context</code> to every spawned subagent's system prompt; disabling it restores the flat single-spawn schema</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Changed task-tool sync execution to fan out multiple <code>tasks[]</code> items in parallel and return a merged result payload when no async job manager is available</li>
<li>Changed the compaction UX so the conversation no longer visually restarts: the TUI renders the full-history display transcript (<code>buildSessionContext({ transcript: true })</code>), with each compaction shown as a slim inline divider — <code>── 📷 compacted · ctrl+o ──</code> — at the point it fired; expanding (ctrl+o) reveals the summary and snapcompact frame count. Applies to live compaction, <code>/compact</code>, <code>/tree</code> navigation, and session resume</li>
<li>Changed <code>async.enabled</code> to gate async bash commands only — the <code>task</code> tool now runs asynchronously regardless of the setting</li>
<li>Changed <code>irc.timeoutMs</code> to be the default timeout for <code>irc</code> <code>wait</code> and <code>send</code> with <code>await: true</code></li>
<li>Moved the grouped path-tree helpers (<code>buildPathTree</code>, <code>walkPathTree</code>, find's grouped output formatter — now <code>formatGroupedPaths</code>) to <code>@oh-my-pi/pi-utils</code> so compaction summaries can render file lists with the same prefix-folded tree as find/search; <code>tools/find</code> no longer exports <code>formatFindGroupedOutput</code></li>
<li>Changed TTSR rule notifications to combine rules into one block: a multi-rule match renders <code>name: description</code> rows (collapsed view caps at 4 rules with a <code>+N more</code> hint, ctrl+o expands), and consecutive notifications merge into the previous block while it is still the live transcript tail</li>
</ul>
<h3>Removed</h3>
<ul>
<li>Removed the pre-initialization startup splash and input buffer, so commands typed during launch are no longer queued and are handled only after the interactive TUI initializes</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed <code>irc</code> live message delivery so successfully handed-off messages are no longer enqueued as mailbox mail, so they do not inflate unread <code>irc</code> counts</li>
<li>Fixed <code>irc send</code> with <code>await: true</code> to wait for a fresh reply to the current call instead of consuming previously buffered messages</li>
<li>Fixed main-session chat output to stop duplicating outbound <code>irc</code> sends from the main agent as relay cards</li>
<li>Fixed task-tool runtime compatibility so legacy flat <code>task</code> calls (<code>agent</code>, <code>assignment</code>) still execute under <code>task.batch</code> even though the wire schema is batch-first</li>
<li>Fixed the <code>job</code> tool's TUI preview leaking the model-facing <code>&lt;task-result&gt;</code> envelope for settled task jobs — the preview now shows the inner output body, and pretty-printed JSON bodies are flattened onto one line instead of previewing a lone <code>{</code></li>
<li>Fixed npm CLI distribution bundles by embedding the stats dashboard client bundle so dashboard assets are served in prebuilt installs</li>
<li>Fixed the <code>resolve</code> tool's result block turning white after the leading icon: the accent-styled symbol embedded a foreground reset inside the inverse-rendered line, dropping the block color for the rest of the row</li>
<li>Fixed the CLI smoke-test command to start the stats server and verify dashboard HTML is served, catching bundled-asset regressions</li>
<li>Added verification of a <code>&lt;div id="root"&gt;&lt;/div&gt;</code> and <code>index.js</code> in smoke-test dashboard responses</li>
<li>Restored the checkmark glyph on ask-tool custom answers and the multi-select "Done selecting" option, which a status-glyph sweep had swapped for the ask tool icon</li>
<li>Fixed the <code>thinking.autoPending</code> statusbar indicator using question-mark glyphs (<code>▣?</code>, nf-md-help_box, <code>[?]</code>) in every symbol preset, which made the auto-thinking pending state indistinguishable from a terminal missing-glyph fallback. Replaced with clear loading indicators (<code>⟳</code>, fa-circle-o-notch, <code>[~]</code>) (<a href="https://github.com/can1357/oh-my-pi/issues/2267" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2267/hovercard">#2267</a>).</li>
<li>Fixed <code>tab.screenshot({ save })</code> ignoring the save path's extension: an explicit <code>.webp</code>/<code>.jpg</code> destination received hardcoded PNG bytes behind a mismatched name. The full-res capture format is now derived from the save path (<code>png</code>/<code>jpeg</code>/<code>webp</code>, puppeteer-native), and the reported mime type follows the bytes actually written; unknown or missing extensions still capture PNG</li>
<li>Fixed an infinite <code>compaction.strategy: shake</code> auto-continue loop in thinking-heavy sessions: the post-shake check now uses the provider-anchored trigger metric (instead of a local estimate that undercounts <code>thinkingSignature</code> payloads) and only treats pressure as resolved when residual context lands inside an 80% recovery band, so shake reliably falls back to context-full compaction when it cannot create real headroom (<a href="https://github.com/can1357/oh-my-pi/issues/2275" data-hovercard-type="issue" data-hovercard-url="/can1357/oh-my-pi/issues/2275/hovercard">#2275</a>).</li>
</ul>
<h2>@oh-my-pi/hashline</h2>
<h3>Changed</h3>
<ul>
<li>Block-unresolved errors (<code>replace block N:</code> / <code>delete block N</code> / <code>insert after block N:</code> failing to resolve a syntactic block) now append a numbered preview of the file around the anchor line — same <code>*</code>-marked context rows the hash-mismatch error shows — so the offending line is visible without a re-read</li>
</ul>
<h2>@oh-my-pi/pi-natives</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Changed <code>renderSnapcompactPng(text, options)</code> to return a base64-encoded PNG <code>string</code> instead of a <code>Uint8Array</code></li>
</ul>
<h3>Added</h3>
<ul>
<li>Added dim-span ink toggles to <code>renderSnapcompactPng</code>: <code>U+000E</code>/<code>U+000F</code> in the input switch to a dim gray ink (palette index 9) and back without occupying a glyph cell, letting callers visually de-emphasize spans such as archived tool output</li>
<li>Added <code>renderSnapcompactPng(text, options)</code>: rasterizes pre-normalized text onto a square PNG in an eval-validated snapcompact shape. Options select the bundled font (<code>5x8</code> X.org BDF or <code>8x8</code> unscii-8, both public domain, shipped in <code>crates/pi-natives/src/fonts/</code>), the ink variant (<code>sent</code> six-hue sentence cycling or <code>bw</code> black), line repetition (each text line printed N times, copies on a pale highlight band), and a target cell size — cells differing from the font's natural cell render via Lanczos3 stretch into an anti-aliased RGB frame (e.g. the OpenAI-optimal 6x6 unscii shape); native-cell shapes encode as 4-bit indexed PNG. Replaces the JS rasterizer/PNG writer previously in <code>@oh-my-pi/pi-agent-core</code>.</li>
</ul>
<h2>@oh-my-pi/snapcompact</h2>
<h3>Breaking Changes</h3>
<ul>
<li>Changed <code>renderSnapcompactFrame</code> output from <code>png: Uint8Array</code> to <code>data: string</code> base64, requiring consumers to read frame payloads from <code>frame.data</code></li>
</ul>
<h3>Added</h3>
<ul>
<li>Added new serialization options <code>toolResultMaxChars</code>, <code>toolArgMaxChars</code>, <code>toolCallMaxChars</code>, <code>truncateHeadRatio</code>, and <code>dimToolResults</code> to <code>snapcompactCompact</code>/<code>serializeSnapcompactConversation</code> so callers can tune how tool results and arguments are archived</li>
<li>Added exported default constants <code>SNAPCOMPACT_TOOL_RESULT_MAX_CHARS</code>, <code>SNAPCOMPACT_TOOL_ARG_MAX_CHARS</code>, <code>SNAPCOMPACT_TOOL_CALL_MAX_CHARS</code>, and <code>SNAPCOMPACT_TRUNCATE_HEAD_RATIO</code> for reuse when configuring truncation limits</li>
<li>Added provider-specific snapcompact frame-shape presets and shape helpers (<code>SNAPCOMPACT_SHAPES</code>, <code>resolveSnapcompactShape</code>, <code>isSnapcompactShape</code>) so callers can consistently select validated image-frame geometry for archive renders</li>
<li>Added <code>file-operations.md</code> and <code>snapcompact-summary.md</code> prompts to preserve file-read/write context and frame metadata in the compaction prompt flow</li>
<li>Added a full <code>packages/snapcompact/research</code> experiment and visualization suite for running snapcompact SQuAD studies, provider probes, and activation-style analyses</li>
<li>Added package-level TypeScript exports and publication config so consumers can import <code>@oh-my-pi/snapcompact</code> with typed access to snapcompact APIs</li>
<li>Published <code>@oh-my-pi/snapcompact</code> as the reusable snapcompact compaction package, including bitmap-frame rendering helpers, archive helpers, and the local <code>snapcompactCompact()</code> strategy.</li>
</ul>
<h3>Changed</h3>
<ul>
<li>Changed truncation in archived tool output to keep both the beginning and end of long text using a configurable head/tail ratio instead of a single hard cut</li>
<li>Changed tool-result text rendering so archived tool results are shown in dim gray ink by default and the summary prompt notes that dim text is archived tool output</li>
<li>Changed <code>RenderedFrame</code> visible-character accounting so <code>chars</code> no longer includes invisible dim-control markers</li>
<li>Changed the file-operations summary block to a single <code>&lt;files&gt;</code> tag: one grouped, prefix-folded directory tree with per-file <code>(Read)</code>/<code>(Write)</code>/<code>(RW)</code> markers, replacing the separate <code>&lt;read-files&gt;</code>/<code>&lt;modified-files&gt;</code> lists; <code>upsertSnapcompactFileOperations</code> takes the cumulative read set to distinguish <code>(RW)</code> from blind writes</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed frame rendering at archive chunk boundaries to reopen dim spans when a chunk ends inside a dimmed tool-result segment</li>
<li>Fixed message serialization to strip user- and assistant-provided dim markers so only renderer-generated dim spans can be applied</li>
</ul>
<h2>@oh-my-pi/omp-stats</h2>
<h3>Added</h3>
<ul>
<li>Added support for prebuilt npm bundle mode via <code>PI_BUNDLED</code>, allowing the stats server to use an embedded dashboard bundle in packaged CLI distributions</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed handling of legacy <code>embedded-client.generated.txt</code> placeholder content so it is treated as missing archive instead of being decoded into invalid bytes</li>
<li>Fixed ENOENT handling while scanning dashboard source/build directories so missing <code>client/</code> or <code>dist/client</code> trees no longer crash startup</li>
</ul>
<h2>@oh-my-pi/pi-tui</h2>
<h3>Added</h3>
<ul>
<li>Added support for asynchronous <code>onSubmit</code> handlers by allowing the callback to return a <code>Promise&lt;void&gt;</code></li>
</ul>
<h2>@oh-my-pi/pi-utils</h2>
<h3>Added</h3>
<ul>
<li>Added the <code>path-tree</code> module (<code>buildPathTree</code>, <code>walkPathTree</code>, <code>formatGroupedPaths</code>, <code>isUrlLikePath</code>), moved from the coding agent's grouped file output so compaction file lists can share the same prefix-folded directory-tree rendering; <code>formatGroupedPaths</code> gains an optional <code>annotate</code> callback for per-file suffixes</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>Fixed the <code>{{join}}</code> prompt helper joining with a literal two-character <code>\n</code> when templates pass <code>"\n"</code> as the separator — Handlebars string literals carry no escape processing. The separator now unescapes <code>\n</code>/<code>\t</code>, matching the <code>{{#list}}</code> helper's documented convention (visible as literal <code>\n</code> between paths in compaction <code>&lt;read-files&gt;</code> lists).</li>
</ul>
<h2>What's Changed</h2>
<ul>
<li>fix(ai): preserve 3p anthropic-messages reasoning chains across model swaps by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4634060202" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2266" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2266/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2266">#2266</a></li>
<li>fix(tui): replaced thinking.autoPending question-mark glyphs with loading indicators by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4634329299" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2268" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2268/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2268">#2268</a></li>
<li>fix(catalog): handle missing thinking efforts by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4630134022" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2252" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2252/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2252">#2252</a></li>
<li>fix(ai): flatten OpenRouter DeepSeek strict unions by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4634643976" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2271" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2271/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2271">#2271</a></li>
<li>fix(agent): break shake auto-continue loop when local estimate diverges from provider usage by <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/roboomp/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/roboomp">@roboomp</a> in <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="4635063548" data-permission-text="Title is private" data-url="https://github.com/can1357/oh-my-pi/issues/2277" data-hovercard-type="pull_request" data-hovercard-url="/can1357/oh-my-pi/pull/2277/hovercard" href="https://github.com/can1357/oh-my-pi/pull/2277">#2277</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a class="commit-link" href="https://github.com/can1357/oh-my-pi/compare/v15.10.12...v15.11.0"><tt>v15.10.12...v15.11.0</tt></a></p>]]></content:encoded>
</item>
</channel>
</rss>
<!-- Generated in 0,01ms -->