04 Apr 2026
Planet Mozilla
The Rust Programming Language Blog: docs.rs: building fewer targets by default
Building fewer targets by default
On 2026-05-01, docs.rs will make a breaking change to its build behavior.
Today, if a crate does not define a targets list in its docs.rs metadata, docs.rs builds documentation for a default list of five targets.
Starting on 2026-05-01, docs.rs will instead build documentation for only the default target unless additional targets are requested explicitly.
This is the next step in a change we first introduced in 2020, when docs.rs added support for opting into fewer build targets. Most crates do not compile different code for different targets, so building fewer targets by default is a better fit for most releases. It also reduces build times and saves resources on docs.rs.
This change only affects:
- new releases
- rebuilds of old releases
How is the default target chosen?
If you do not set default-target, docs.rs uses the target of its build servers: x86_64-unknown-linux-gnu.
You can override that by setting default-target in your docs.rs metadata:
[]
= "x86_64-apple-darwin"
How do I build documentation for additional targets?
If your crate needs documentation to be built for more than the default target, define the full list explicitly in your Cargo.toml:
[]
= [
"x86_64-unknown-linux-gnu",
"x86_64-apple-darwin",
"x86_64-pc-windows-msvc",
"i686-unknown-linux-gnu",
"i686-pc-windows-msvc"
]
When targets is set, docs.rs will build documentation for exactly those targets.
docs.rs still supports any target available in the Rust toolchain. Only the default behavior is changing.
04 Apr 2026 12:00am GMT
03 Apr 2026
Planet Mozilla
Mozilla Localization (L10N): Enhancing Comment Management in Pontoon
We're excited to highlight the work of Serah Nderi, a volunteer contributor to Pontoon who has quickly made a meaningful impact on the project. Since getting involved earlier this year, Serah has contributed a steady stream of improvements - including 10 patches in just the past two months - ranging from good-first issues to fully fledged features.
Serah joined the Mozilla community as an Outreachy intern on the SpiderMonkey team, where she demonstrated both strong technical skills and a passion for languages. That combination naturally led her to Pontoon, where she has been contributing not only as a developer but also as a localizer, exploring translations for languages like Kiswahili and Kikuyu.
Her latest contribution introduces long-awaited functionality for editing and deleting comments in Pontoon, improving collaboration and moderation workflows for translators and project managers alike.
You can follow Serah's work on GitHub and connect with her on LinkedIn.
Last year, I earned a B1 certification in German and TOPIK I certification in Korean. This year, I decided to explore something at the intersection of technology and languages, which led me to start contributing to Pontoon.
Pontoon is Mozilla's web-based localization platform, used by thousands of contributors to translate Firefox and other Mozilla projects into hundreds of languages.
I began by adding Kiswahili translations and exploring localization for my mother tongue, Kikuyu. While Kikuyu doesn't yet have a project manager and presents unique challenges, it made the experience even more interesting. After working on a few good-first issues, I decided to take on a larger challenge: implementing a full feature-the ability for users to edit and delete comments.
Previously, users could only add comments. If a comment contained a typo or needed clarification, the only option was to add another comment. This often led to cluttered discussions and made collaboration less efficient. I set out to improve this experience.
Under the hood
The frontend implementation had a natural starting point. Pontoon comments already included actions like pinning, so adding Edit and Delete followed a similar interaction pattern.
One of the main challenges was handling comment content. Comments in Pontoon are stored as serialized HTML paragraphs with support for @mentions. To enable editing, I needed to deserialize this stored content back into the editor so that users would see a fully functional input field pre-populated with their original comment-including mentions. When saving, the content is serialized again before being stored.
In addition to the UI changes, I implemented the backend views for editing and deleting comments, along with the necessary tests. The final result allows users to edit and delete their own comments, while project managers can delete any comment for moderation purposes.
This feature makes discussions in Pontoon more flexible, reduces noise from duplicate comments, and improves the overall collaboration experience for localization teams.
03 Apr 2026 10:00am GMT
02 Apr 2026
Planet Mozilla
Firefox Tooling Announcements: MozPhab 2.11.1 Released
Bugs resolved in Moz-Phab 2.11.1:
- bug 2028700 Only request AI review for updates if the --ai flag is passed
Discuss these changes in #engineering-workflow on Slack or #Conduit Matrix.
1 post - 1 participant
02 Apr 2026 8:26pm GMT
01 Apr 2026
Planet Mozilla
Firefox Tooling Announcements: MozPhab 2.11.0 Released
Bugs resolved in Moz-Phab 2.11.0:
- bug 2026935 moz-phab submit: add --test-plan flag
Discuss these changes in #engineering-workflow on Slack or #Conduit Matrix.
1 post - 1 participant
01 Apr 2026 4:33pm GMT
This Week In Rust: This Week in Rust 645
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 @ThisWeekinRust on mastodon.social, or send us a pull request. Want to get involved? We love contributions.
This Week in Rust is openly developed on GitHub and archives can be viewed at this-week-in-rust.org. If you find any errors in this week's issue, please submit a PR.
Want TWIR in your inbox? Subscribe here.
Updates from Rust Community
Official
Foundation
Project/Tooling Updates
- Ntpd-rs: it's about time!
- octopos: OS for risc-v in rust
- Building a guitar trainer with embedded Rust
- blogr v0.5.0 - blog without leaving your terminal
- feedr v0.7.0 - terminal-based RSS/Atom feed reader
- mdterm v2.0.0 - terminal-based Markdown browser
- RustGrep: simple search for 114 Rust blogs
- Rust's next-generation trait solver
- Portable Async Rust
- jsongrep faster than {jq, jmespath, jsonpath-rust, jql}
- SeqPacker: 11 bin-packing algorithms in Rust
- flodl v0.2.2: PyTorch parity in Rust
Observations/Thoughts
- filtra.io | Breaking The AI Infra Monopoly With Rust- Tracel AI
- Rust: Memory safety in kernel space | OSHub
- Fixing our own problems in the Rust compiler
- Bugs that the Rust compiler catches for you: The revolution of compiler-enforced correctness
- I ported the OpenAI Python SDK to Rust in 5 days with Claude Code
- [video] 🦀 Rust (mir) compiler bites: Closures - thou shalt not name this struct
- [video] How C++ Finally Beats Rust at JSON Serialization
Rust Walkthroughs
- Adding WASM Plugins to Your App
- ZK snarks for rust developer part 3/8
- Building a Crash-Safe Email Queue in Rust
- Adding a Scripting Engine to a Rust CLI with Rhai
Crate of the Week
This week's crate is tsastat, a high-resolution Thread State Analysis (TSA) tool for Linux.
Thanks to Ankur Rathore for the self-suggestion!
Please submit your suggestions and votes for next week!
Calls for Testing
An important step for RFC implementation is for people to experiment with the implementation and give feedback, especially before stabilization.
If you are a feature implementer and would like your RFC to appear in this list, add a call-for-testing label to your RFC along with a comment providing testing instructions and/or guidance on which aspect(s) of the feature need testing.
No calls for testing were issued this week by Rust, Cargo, Rustup or Rust language RFCs.
Let us know if you would like your feature to be tracked as a part of this list.
Call for Participation; projects and speakers
CFP - Projects
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!
Some of these tasks may also have mentors available, visit the task page for more information.
If you are a Rust project owner and are looking for contributors, please submit tasks here or through a PR to TWiR or by reaching out on Bluesky or Mastodon!
CFP - Events
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.
- NDC Techtown | CFP open until 2024-04-14 | Kongsberg, Norway | 2024-09-09 - 2026-09-12.
- EuroRust | CFP open until 2026-04-27 | Barcelona, Spain | 2026-10-14 - 2026-10-17
If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a PR to TWiR or by reaching out on Bluesky or Mastodon!
Updates from the Rust Project
487 pull requests were merged in the last week
Compiler
- add
x86_64-unknown-linux-gnu{m,t}santarget which enables {M,T}San by default - add
-Zsanitize=kernel-hwaddress
Library
- constify
Steptrait and all of itsimplementations - constify comparisons and
Cloneforcore::mem::Alignment - constify const Fn*: Destruct
- don't drop arguments' temporaries in
dbg! - don't fuse in
MapWindows - implement
unchecked_funnel_{shl,shr} - reimplement
hash_map!macro - make
PinCoerceUnsizedrequireDeref - stabilize new RangeFrom type and iterator
trim_prefixfor paths
Cargo
resolver: better match rustc in error stylingbuild: cover more behavior ofbuild.warningsbuild: make it easier to reviewbuild.warningsbehavior
Rustdoc
Rustfmt
Clippy
- add
manual_option_ziplint (a.and_then(|x| b.map(|y| (x, y)))) - impl
manual_noop_wakerlint explicit_counter_loop: suggest.take(n)forfor _ in 0..nco…iter_kv_map: handle identity map formapandflat_mapmanual_pop_if: lint more cases, even if we do not provide a suggestion- fix
collapsible_iffalse positive when the inner if contains cfg - preserve parentheses in suggestion in presence of cascaded casts
- perf: reduce
matching_root_macro_callusage (23b → 22.24b)
Rust-Analyzer
- fix not applicable on ambiguous ident pat for
merge_match_arms - complete envs in nested
env!() - correct
type_or_constparam index bound indebug_assert - correct missing-args messages for
sched_getaffinityand getenv shims - don't panic unmerge arm on trailing pipe
- fix block lowering in ast id map
- keep comments for 'Fill match arms'
- postfix completions include nots prefix-expr
- skip usages inside macro expansions in destructure struct/tuple binding
- turn back
TyLoweringContext.storeto self after lowering parent defaults - wrap
Option<>fordesugar_try_expr_let_else - wrap
Result<>fordesugar_try_expr_let_else - wrap ty-anchor in non-path type constuctor
- fully implement
VariantFields expression support - hookup Signature Inference in more places
- only allocate item blocks if they actually contain items or statement macros
- remove
ArcfromGenericParamsandAstIdMap - remove generate trait impl text intransitive from utils
Rust Compiler Performance Triage
We had some infrastructure troubles this week which prevented some rollup PRs from generating their "unrolled" builds, which made rollup regression investigation more complicated, although we were able to locate and revert the largest rollup regressions in the end. #154304 brought some nice improvements by optimizing the query system.
Triage done by @kobzol. Revision range: 6f22f613..cf7da0b7
Summary:
| (instructions:u) | mean | range | count |
|---|---|---|---|
| Regressions ❌ (primary) |
0.4% | [0.1%, 1.2%] | 4 |
| Regressions ❌ (secondary) |
0.3% | [0.1%, 0.5%] | 12 |
| Improvements ✅ (primary) |
-0.8% | [-6.2%, -0.2%] | 58 |
| Improvements ✅ (secondary) |
-0.4% | [-1.9%, -0.1%] | 28 |
| All ❌✅ (primary) | -0.8% | [-6.2%, 1.2%] | 62 |
3 Regressions, 4 Improvements, 2 Mixed; 2 of them in rollups 35 artifact comparisons made in total
Approved RFCs
Changes to Rust follow the Rust RFC (request for comments) process. These are the RFCs that were approved for implementation this week:
Final Comment Period
Every week, the team announces the 'final comment period' for RFCs and key PRs which are reaching a decision. Express your opinions now.
Tracking Issues & PRs
- Tracking Issue for
isolate_most_least_significant_one - Tracking Issue for
int_lowest_highest_one - Tracking Issue for
uint_bit_width - Tracking Issue for #138068: Add
Result::map_or_defaultandOption::map_or_default - Do not use non-wf input expectations from fudge when checking function calls
- Syntactically reject equality predicates
- Tracking Issue for tcp_deferaccept
- stabilize s390x vector registers
- Replacing self overwriting with proper resolution
No Items entered Final Comment Period this week for Cargo, Compiler Team (MCPs only), Language Team, Language Reference, Leadership Council or Unsafe Code Guidelines.
Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.
New and Updated RFCs
Upcoming Events
Rusty Events between 2026-04-01 - 2026-04-29 🦀
Virtual
- 2026-03-26 | Virtual (Berlin, DE) | Rust Berlin
- 2026-03-31 | Virtual (Tel Aviv-yafo, IL) | Code Mavens 🦀 - 🐍 - 🐪
- 2026-04-01 | Virtual (Girona, ES) | Rust Girona
- 2026-04-01 | Virtual (Indianapolis, IN, US) | Indy Rust
- 2026-04-02 | Virtual (Nürnberg, DE) | Rust Nuremberg
- 2026-04-04 | Virtual (Kampala, UG) | Rust Circle Meetup
- 2026-04-05 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
- 2026-04-07 | Virtual (Tel Aviv-yafo, IL) | Code Mavens 🦀 - 🐍 - 🐪
- 2026-04-09 | Virtual (Berlin, DE) | Rust Berlin
- 2026-04-14 | Virtual (Tel Aviv-yafo, IL) | Code Mavens 🦀 - 🐍 - 🐪
- 2026-04-14 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
- 2026-04-14 | Virtual (London, UK) | Women in Rust
- 2026-04-15 | Virtual (Girona, ES) | Rust Girona
- 2026-04-15 | Virtual (Vancouver, BC, CA) | Vancouver Rust
- 2026-04-16 | Hybrid (Seattle, WA, US) | Seattle Rust User Group
- 2026-04-19 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
- 2026-04-21 | Virtual (Washington, DC, US) | Rust DC
- 2026-04-22 | Virtual (Girona, ES) | Rust Girona
- 2026-04-23 | Virtual (Amsterdam, NL) | Bevy Game Development
- 2026-04-23 | Virtual (Berlin, DE) | Rust Berlin
- 2026-04-28 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
- 2026-04-28 | Virtual (London, UK) | Women in Rust
- 2026-04-29 | Virtual (Girona, ES) | Rust Girona
Asia
- 2026-04-11 | Bangalore, IN | Rust Bangalore
- 2026-04-17 | Bangalore, IN | Rust India
- 2026-04-18 | Bangalore, IN | Rust India
Europe
- 2026-04-01 | Berlin, DE | Rust Berlin
- 2026-04-01 | Edinburgh, UK | Rust and Friends
- 2026-04-01 | Köln, DE | Rust Cologne
- 2026-04-01 | Oxford, UK | Oxford ACCU/Rust Meetup.
- 2026-04-02 | London, UK | Rust London User Group
- 2026-04-02 | Toulouse, FR | Rust Toulouse
- 2026-04-03 | Edinburgh, UK | Rust and Friends
- 2026-04-07 | Basel, CH | Rust Basel
- 2026-04-07 | Frankfurt, DE | Rust Rhein-Main
- 2026-04-08 | Virtual (Girona, ES) | Rust Girona
- 2026-04-09 | Geneva, CH | Rust Meetup Geneva
- 2026-04-09 | Oslo, NO | Rust Oslo
- 2026-04-21 | Leipzig, DE | Rust - Modern Systems Programming in Leipzig
- 2026-04-23 | Aarhus, DK | Rust Aarhus
North America
- 2026-04-02 | Mountain View, CA, US | Hacker Dojo
- 2026-04-02 | Saint Louis, MO, US | STL Rust
- 2026-04-04 | Boston, MA, US | Boston Rust Meetup
- 2026-04-07 | New York, NY, US | Rust NYC
- 2026-04-09 | Chicago, IL, US | Chicago Rust Meetup
- 2026-04-09 | San Diego, CA, US | San Diego Rust
- 2026-04-11 | Boston, MA, US | Boston Rust Meetup
- 2026-04-14 | Charlottesville, VA, US | Charlottesville Rust Meetup
- 2026-04-15 | Hybrid (Vancouver, BC, CA) | Vancouver Rust
- 2026-04-16 | Hybrid (Seattle, WA, US) | Seattle Rust User Group
- 2026-04-18 | Boston, MA, US | Boston Rust Meetup
- 2026-04-20 - 2026-04-22 | Portland, OR | Tokio
- 2026-04-21 | San Francisco, CA, US | San Francisco Rust Study Group
- 2026-04-22 | Austin, TX, US | Rust ATX
- 2026-04-23 | Los Angeles, CA, US | Rust Los Angeles
- 2026-04-25 | Boston, MA, US | Boston Rust Meetup
Oceania
- 2026-04-09 | Brisbane City, QL, AU | Rust Brisbane
South America
- 2026-04-11 | Buenos Aires, AR | Oxidar Org
- 2026-04-17 | Rio de Janeiro, BR | Meetups Rust RJ
If you are running a Rust event please add it to the calendar to get it mentioned here. Please remember to add a link to the event too. Email the Rust Community Team for access.
Jobs
Please see the latest Who's Hiring thread on r/rust
Quote of the Week
When you do cursed things, problems find you.
- Folkert de Vries on the trifecta tech blog
We have gone four weeks bare of suggestions for quotes. llogiq is still fine with his choice, but he'd be much more happy if any of you would help him in his search.
Please submit quotes and vote for next week!
This Week in Rust is edited by:
- nellshamrell
- llogiq
- ericseppanen
- extrawurst
- U007D
- mariannegoldin
- bdillo
- opeolluwa
- bnchi
- KannanPalani57
- tzilist
Email list hosting is sponsored by The Rust Foundation
01 Apr 2026 4:00am GMT
Mozilla Localization (L10N): Localizer Spotlight: Cláudio
About you
My name is Cláudio Esperança, I'm from Portugal. I speak Portuguese and English. I have been contributing to Mozilla localization projects for more than 18 years.
Mozilla localization
Q: How did you first get involved in localization, and what drew you to Mozilla?
A: Curiosity has always driven me to understand how things work. Discovering open-source software, specifically Firefox and Linux, opened a world of limitless possibilities. I saw software translation not only as a way to improve my English but also as a great opportunity to start collaborating and contributing to the Mozilla mission. I began by following the community email list, contributing translations, and attending events. Before I knew it, I was leading the Portuguese translation team.
Q: You contribute across many projects in Pontoon. Is there a product that stands out to you? Have you shared with family and friends what you have been doing and promoting the products?
A: Firefox is always my favorite and the browser I use most regularly, as I trust it with my personal data. However, I contribute to all projects to provide users with more people-focused, secure, and private options, in a market often dominated by other vested interests.
I don't actively promote my work, as I prefer when people discover Mozilla products because they are the best solution for their needs. It may seem counterintuitive, but actually, I love when I see someone using Firefox, or another Mozilla product, not because they feel pressured by something I said, but because they've discovered it's the best solution for them. It is very gratifying to know that the strings I translate are used by thousands of people every day, including family, friends, coworkers, and many other people which I probably will never know.
Q: What have been some of the most rewarding or impactful projects you've localized?
A: Firefox is undoubtedly the most impactful due to its fundamental role on the web. I also found Firefox OS particularly interesting: the concept was great, and it had great potential, but unfortunately it didn't go as far as I would have liked. I still hope to see it reborn in some form one day.
Q: What advice would you give to someone considering contributing to Mozilla localization today?
A: One of the best things about L10n at Mozilla is how accessible localization has become. You don't need to be a developer to make a difference. Whether by starting with a smaller project to build up confidence or diving straight into a high-impact application, or focus on a tool you love or explore something entirely new, the choice is yours. The most important step is simply to begin. And there's no such thing as a 'small' contribution - every translated word helps to build a more inclusive internet for everyone.
Community & leadership
Q: How does the Portuguese localization community collaborate today?
A: The Portuguese community is small, and we don't have many members with recurring contributions. One of the reasons they give for this disengagement is that they feel their help isn't needed because our translation completion rate is high (which isn't true at all). There are other reasons like lack of time (main reason), and the fact that a large portion of the user base are pretty comfortable using software in English, Brazilian, or Spanish.
Regarding community communication, while we previously used various discussion groups, we now primarily communicate via email and direct contact, with most of the work happening directly on Pontoon.
Q: You've been leading the team for many years. How do you approach mentorship and conflict resolution?
A: When I started, I didn't have a mentor, so I had to rely on Mozilla's resources and some reverse engineering. Today, platforms like Pontoon and SUMO make the process much easier for volunteers. Regarding conflicts, like all communities, we sometimes face significant challenges regarding personality and linguistic differences. Overall, we try to maintain a positive, constructive, and inclusive attitude, where all well-founded contributions are welcome. We use a democratic process for most decisions, with a "benevolent dictator" model as a final fallback if consensus cannot be reached.
Professional background & skills
Q: What is your professional background, and how has it influenced your localization work?
A: I have a background in software engineering (Master's in Mobile Computing, Bachelor's in Information Systems, technical training in TCP/IP networks, Linux, and other technologies). This experience helps me handle technical aspects of software translation like placeholder syntax, HTML tags, and technical terminology, though modern tools like Pontoon have made localization much more accessible to everyone.
Q: How has localization influenced your professional work?
A: Localization provides a unique perspective on applications by allowing a deeper understanding of how they work. We get to learn about the various options available in the software, sometimes hidden in the more obscure areas of the application. Unlike more traditional applications that rely on older technologies, applications developed within the Mozilla ecosystem are at the forefront of web innovation, allowing early exposure to the future of the Internet. As a software engineer, I incorporate these insights into my own projects to create more modern and user-friendly solutions.
Q: After 18+ years, what keeps you motivated to continue contributing?
A: Our mission remains unfinished. We have a responsibility to ensure the internet remains a global public resource that doesn't require English as a barrier to entry. In an era where AI and massive platforms are consolidating power, the need for diverse alternatives has never been more urgent. Localizing Mozilla products into my native language is my way of practicing digital activism. It's incredibly rewarding to know that a handful of translated sentences can improve the lives of so many people instantly. The mission continues…
Interesting facts
Q: Tell us something unexpected about yourself.
A: How someone born on an island in the Azores, who lived in half a dozen different cities in a country as small as Portugal, and who has worked as a farmer, shepherd, beekeeper, construction worker, electrician, trainer, programmer, and software engineer ended up translating world-class open-source software is a difficult story to explain. Ultimately, I think it all comes back to curiosity…
01 Apr 2026 3:32am GMT
31 Mar 2026
Planet Mozilla
Firefox Tooling Announcements: MozPhab 2.10.0 Released
Bugs resolved in Moz-Phab 2.10.0:
- bug 2024404 Add
--aiflag tomoz-phabto trigger Review Helper automatically - bug 2028164 moz-phab test failure:
TypeError: Object of type AiReviewState is not JSON serializable
Discuss these changes in #engineering-workflow on Slack or #Conduit Matrix.
1 post - 1 participant
31 Mar 2026 8:30pm GMT
Thunderbird Blog: Thunderbird Monthly Development Digest: March 2026

Welcome back from the Thunderbird development team!
Reflecting back, the first quarter of the year has been a mix of deep technical focus and forward-looking planning. Much of the team's energy has gone into tackling some of the more complex, "gnarly" parts of our projects to land key milestones. In parallel, we've been laying the groundwork for what's next from ongoing hiring efforts to aligning our goals with broader company initiatives that support the roadmap ahead.
Security & Hardening
We've continued to make good progress on improving Thunderbird's security and privacy model, not just at a technical level, but in ways that are more usable and transparent for everyday users.
Unobtrusive Signatures
Kai recently presented his work at the IETF on Unobtrusive Signatures, which aims to make email signatures more reliable and less intrusive. The goal is to ensure message authenticity can be verified automatically and consistently, without requiring constant user attention or confusing workflows.
Improving Key Safety and Revocation
We're also exploring better ways to handle key revocation. Today, users often have no reliable way to know when a key should no longer be trusted. A proposed revocation service aims to improve how this information is distributed, while avoiding overly centralized or privacy-invasive approaches.
Moving Beyond "Encrypted or Not"
A major shift underway is how we present trust in encrypted email.
Instead of treating encryption as a simple on/off state, we're moving toward a graduated confidence model. Thunderbird will evaluate the strength of each recipient's key whether it's manually verified, CA-backed, or unverified, and present an overall confidence level to the user.
This allows encryption to work more automatically, while still giving users clear insight into how much trust they can place in a given message. Kai has worked with the design team and internal subject matter experts to refine the UX in this area and is getting close to a final UI.
Ongoing Security Fixes and Improvements
Alongside these larger initiatives, Kai, Magnus, and Justin have been actively triaging and addressing security issues and long-standing feature gaps. Recent work includes:
- Enabling search within encrypted messages
- Fixing issues with incorrect IMAP literal size handling
- Addressing a link spoofing vulnerability (CVE-2025-13015)
Together, these efforts reflect a broader direction: making strong security more accessible, while ensuring users remain informed and in control.
Exchange Email Support
Since our last update in February, the team has been moving quickly and has now completed Phase 1 and Phase 2 of the Graph API implementation for email, with Phase 3 already underway.
These phases focused on establishing a solid foundation and delivering core functionality required for real-world usage. Highlights include:
- Graph API login with OAuth
- Connectivity checks and account validation
- Autodiscover support for Graph endpoints
- Folder synchronization (fetching and populating folder hierarchy)
- Sending messages (including support for different recipient types)
- Support for POST requests and improved request handling
- Delta query support for efficient syncing
- Support for pageable results (x-ms-pageable)
- Test infrastructure for Graph (xpcshell and mochitests)
- Continued backend refactoring and interoperability work (C++/Rust integration, shared protocol components)
With these milestones in place, Phase 3 is now underway, focusing on deeper message handling (such as fetching message headers) and continued feature expansion.
Keep track of our Graph API implementation here.
Add-ons, Extensions and Experiments
While onboarding a new junior team member, John has also made a strong impact on the add-ons ecosystem, reaching an important milestone in the effort to move away from legacy, insecure experiments.
A key piece of this work is the VFS Toolkit, which leverages the Origin Private File System and introduces a more secure and maintainable way for WebExtensions to interact with the file system. As part of this, John developed a provider that allows extensions to access a user's local home folder through a controlled interface.
Under the hood, this works by combining WebExtensions with a small native helper application. The extension communicates with this helper via native messaging, allowing safe, permissioned access to local files, something that modern WebExtensions cannot do directly
The current focus is to enhance the Calendar API ahead of the next ESR release with some of this work tracked here.
Linux System Tray - Contributor Spotlight
We'd like to give a special shoutout this month to Christophe Henry, who has gone above and beyond with an ambitious contribution to improve Thunderbird's system tray integration on Linux.
This work isn't a small patch and spans multiple parts of the codebase, including JavaScript, C++, and Rust, and even bridges into XPCOM interfaces. The goal is to unify how unread mail indicators and tray icons behave across platforms, which is a surprisingly complex problem once you account for the differences between Linux environments, Windows, and macOS.
What really stood out was the level of persistence behind this contribution. Over multiple iterations, Christophe worked through build failures, lint issues, platform quirks, and detailed review feedback, all while tackling tricky problems like image encoding, system tray APIs, and cross-language integration.
This kind of work is rarely straightforward, and often requires deep dives into unfamiliar parts of the stack. Seeing it pushed forward with this level of care and determination is exactly what makes open source collaboration so powerful.
Thank you for the dedication and effort! It truly makes a difference.
Calendar UI Rebuild - Front End Team shoutout
A huge shoutout to the Front End team, who recently met in person in London for a work week and absolutely delivered.
Getting the chance to collaborate face-to-face made a real difference. The team came together to align on priorities, cut through complexity, and focus on what mattered most - and the results speak for themselves. They successfully pushed through the Event Read and Enhancements milestones at an impressive pace, clearing the path to shift full attention onto the First Time User Experience (FTUE) work.
It's not easy to balance quality, speed, and coordination across a distributed team, but this was a great example of what happens when everything clicks. Thoughtful planning, strong collaboration, and excellent execution all came together to move things forward in a big way.
Stay tuned to our milestones here:
- Event Read Dialog
- Event Read Enhancements
- Read Dialog inline editing
- Event Add/Edit Dialog
- Reminders UI
- Invitations Dialog
- Calendar Views
First Time User Experience (FTUE)
Following that strong push on Calendar, the front end team turned their focus to the First Time User Experience and made remarkable progress in a very short time.
In just a few weeks, the majority of the FTUE work has been completed, with only a handful of smaller items remaining in review. This included not only delivering the core experience, but also laying the groundwork for future improvements (such as early components of the "Sign in with Thundermail" flow, already available behind a preference).
Pulling together a milestone of this size on such a tight timeline is no small feat. It reflects both the clarity of planning coming out of the work week, and the team's ability to execute quickly without losing sight of the bigger picture.
Maintenance, Upstream adaptations, Recent Features and Fixes
Over the past couple of months, the team has continued to navigate changes from upstream dependencies that occasionally impact build stability, test reliability, and CI. While this is a normal part of working in a large, shared ecosystem, it does require ongoing attention, particularly when tracking down the root cause of regressions and ensuring Thunderbird-specific changes remain on solid ground. Some days it feels like a full-time job!
Alongside this, we've seen strong support from both the team and the wider contributor community, with a steady stream of fixes and improvements landing across the codebase.
This collective effort has resulted in a number of impactful patches landing recently, with the following being particularly helpful:
- Fixing several bugs in our Event Read milestone
- Calendar event URL protocol handler fix
- Fix POP3 state deadlock
- and many more which are listed in release notes for beta.
If you would like to see new features as they land, and help us find some early bugs, you can try running daily and check the pushlog to see what has recently landed. This assistance is immensely helpful for catching problems early.
-
Toby Pilling
Senior Manager, Desktop Engineering
The post Thunderbird Monthly Development Digest: March 2026 appeared first on The Thunderbird Blog.
31 Mar 2026 11:30am GMT
The Servo Blog: February in Servo: faster layout, pause and resume scripts, and more!
Servo 0.0.6 includes some exciting new features:
- <button command> and <button commandfor> (@lukewarlow, #41237)
- ':modal' selectors on <dialog> (@lukewarlow, #42201)
- '@property' rules (@yezhizhen, @Loirooriol, #42136, #42858)
- 'alignment-baseline' and 'baseline-shift' (@Loirooriol, #42361)
- 'Content-Security-Policy: base-uri' (@WaterWhisperer, #42272)
- partial support for <iframe loading=lazy> (@TimvdLippe, #41959)
- partial support for 'transform-style: preserve-3d' (@simonwuelker, #42755)
Plus a bunch of new DOM APIs:
- most of the Pointer Events API (@webbeef, #41290)
- the UserActivation API (@stevennovaryo, #42060)
- import.meta.resolve() (@Gae24, #42506)
- integrity in <script type=importmap> (@Gae24, #42604)
- the formData() method on Request (@Taym95, #42041)
- the alpha property on HTMLInputElement (@simonwuelker, #42293)
- tabIndex on HTMLElement and SVGElement (@mrobinson, @Loirooriol, #42913)
- fullscreenElement on Document and ShadowRoot (@onsah, #42401)
- toJSON() on PerformancePaintTiming (@shubhamg13, #42396)
- navigator.pdfViewerEnabled (@simonwuelker, #42277)
- keyPath on IDBIndex (@arihant2math, #42431)
- createIndex(), deleteIndex(), and index() on IDBObjectStore (@arihant2math, @bulltickr, #38840, #42440, #42443)

This is a big update, so here's an outline:
-
Work in progress
- accessibility, execCommand() -
Developer tools
- localhost only by default, Inspector, Console, Debugger -
servoshell
- servo:config, F5 to reload -
Embedding API
- offline builds, user stylesheets, context menus, gamepad API -
More on the web platform
- font fallback, cookies, IndexedDB, First and Largest Contentful Paint -
Performance and stability
- about:memory, incremental layout, shared memory -
Bug fixes
- Windows arm64, layout, DOM events, shadow DOM -
Donations
- how you can help Servo flourish
Work in progress
We've started working on accessibility support for web content (@alice, @delan, #42333, #42402), gated by a pref (--pref accessibility_enabled). Each webview will be able to expose its own accessibility tree, which the embedder can then integrate into its own accessibility tree. As part of this work:
-
AccessKit now supports combining accessibility trees with its new "subtree" feature (@DataTriny, @delan, @lukewarlow, @alice, AccessKit/accesskit#655, AccessKit/accesskit#641)
-
egui has been migrated to the new AccessKit API (@delan, @lukewarlow, @lucasmerlin, @DataTriny, emilk/egui#7850)
-
we added a
ServoAPI for activating accessibility features (@delan, @alice, #42336), although this has since become aWebViewAPI
We've started implementing document.execCommand() (@TimvdLippe, #42621, #42626, #42750), gated by a pref (--pref dom_exec_command_enabled). This feature is also enabled in experimental mode, and together with contenteditable, it's critical for rich text editing on the web. The work done in February includes:
- document.queryCommandEnabled() (@TimvdLippe, #42634)
- document.queryCommandSupported() (@TimvdLippe, #42731)
- document.queryCommandIndeterm(), queryCommandState(), and queryCommandValue() (@TimvdLippe, #42748)
- the canonicalize whitespace algorithm - this is used by the 'delete', 'forwardDelete', and 'insertText' commands (@TimvdLippe, #42704)
- contentEditable on HTMLElement - for execCommand() only, excluding any support for interactive editing (@TimvdLippe, #42633, #42734)
Developer tools
DevTools has seen some big improvements in February!
When enabled in servoshell, the DevTools server is more secure by default, listening only on localhost when only a port number is specified (@Narfinger, #42502). You can open the port for remote debugging by passing a full SocketAddr, such as --devtools=[::]:6080 or --devtools=0.0.0.0:6080.
In the Inspector tab, you can now edit DOM attributes, and the DOM tree updates when attributes change (@simonwuelker, #42601, #42785). You can now list the event type and phase of event listeners attached to a DOM node as well (@simonwuelker, #42355).
In the Console tab, objects can now be previewed when passed to console.log() and friends (@simonwuelker, #42296, #42510, #42752), and boolean values are now syntax highlighted (@pralkarz, #42513).
In the Debugger tab, you can now pause and resume script execution, both manually and when breakpoints are hit (@eerii, @atbrakhi, #42599, #42580, #42874). We've also started working on other debugger features (@atbrakhi, @eerii, #42306), including stepping execution (@eerii, @atbrakhi, #42844, #42878, #42906), so once again stay tuned!
servoshell
Back in August, we added a servo:preferences page to servoshell that allows you to set some of Servo's most common preferences at runtime (@jdm, #38159).

servoshell now has a servo:config page (@arihant2math, #40324), allowing you to set any preference, even internal ones. Note that preference changes are not yet persistent, and not all prefs take effect when changed at runtime.

You can now press F5 to reload the page in servoshell (@Narfinger, #42538), in addition to pressing Ctrl+R or ⌘R.
We've fixed a regression where the caret stopped being visible in the location bar (@mrobinson, #42470).
Embedding API
Servo is now easier to build offline, using the complete source tarball included in each release (@jschwe, #42852). Go to a release on GitHub, then download servo-[version]-src-vendored.tar.gz to get started.
You can now add and remove user stylesheets with UserContentManager::add_stylesheet and remove_stylesheet, and remove user scripts with UserContentManager::remove_script (@mukilan, #42288). Previously user stylesheets were only configurable via servoshell's --user-stylesheet option.
Before opening any context menus on behalf of web content, Servo now closes any context menus that were opened by web content (@mrobinson, #42487), to avoid UI problems on some platforms. This is done by calling WebViewDelegate::hide_embedder_control before calling show_embedder_control in those cases.
Input method events from web content now indicate whether or not the virtual keyboard should be shown (@stevennovaryo, @mrobinson, #42467), with the new InputMethodControl::allow_virtual_keyboard method. Generally the virtual keyboard should only be shown when the page has sticky activation.
We're reworking our gamepad API, with WebViewDelegate::play_gamepad_haptic_effect and stop_gamepad_haptic_effect being replaced by a new API that (as of the end of February at least) is known as GamepadProvider (@atbrakhi, #41568). The old methods are no longer called (#43743), and may be removed at some point.
We now have better diagnostic output when we fail to create an OpenGL context (@mrobinson, #42873), including when the OpenGL versions supported by the device are too old.
Servo::constellation_sender was removed (@jdm, #42389), since it was never useful to embedders.
We've also made some changes to Preferences:
-
devtools_server_portis nowdevtools_server_listen_address, and can now take either a port number (as before) or a full SocketAddr (@Narfinger, #42502) -
dom_worklet_blockingsleepis nowdom_worklet_blockingsleep_enabled(@mukilan, #42897) -
Removed many unused preferences (@mukilan, #42897) -
js_asyncstack,js_discard_system_source,js_dump_stack_on_debuggee_would_run,js_ion_offthread_compilation_enabled,js_mem_gc_allocation_threshold_avoid_interrupt_factor,js_mem_gc_allocation_threshold_factor,js_mem_gc_allocation_threshold_mb,js_mem_gc_decommit_threshold_mb,js_mem_gc_dynamic_heap_growth_enabled,js_mem_gc_dynamic_mark_slice_enabled,js_shared_memory,js_throw_on_asmjs_validation_failure,js_throw_on_debuggee_would_run,js_werror_enabled, andnetwork_mime_sniff
More on the web platform
If you navigate to a video file or audio file as a document, the player now has controls (@webbeef, #42488).
Images now rotate according to their EXIF metadata by default (@rayguo17, #42567), like they would once we add support for 'image-orientation: from-image'.
We're implementing system-font-aware font fallback (@mrobinson, #42466), with support for this on macOS landing this month (@mrobinson, #42776). This allows Servo to render text in scripts that are not covered by web fonts or any of the fonts on Servo's built-in lists of fallback fonts, as long as they are covered by fonts installed on the system.
Servo now supports the newer pointermove, pointerdown, pointerup, and pointercancel events (@webbeef, #41290). The older touchmove, touchstart, touchend, and touchcancel events continue to be supported.
The default language in 'Accept-Language' and navigator.language is now taken from the $LANG environment variable if present (@webbeef, #41919), rather than always being set to en-US.
<input type=color> now supports any CSS color value (@simonwuelker, #42275), including the more complex values like color-mix(). We've also landed the colorspace attribute (@simonwuelker, #42279), but only in the web-facing side of Servo for now, not the embedding API or in servoshell.
'vertical-align' is now a shorthand for 'alignment-baseline' and 'baseline-shift' (@Loirooriol, #42361), and scrollParent on HTMLElement is now a function per this recent spec update (@TimurBora, #42689).
Cookies are now more conformant (@sebsebmc, #42418, #42427, #42435). 'Expires' and 'Max-Age' attributes are now handled correctly in 'Set-Cookie' headers, get() and getAll() on CookieStore now trim whitespace in cookie names and values, and the behaviour of set() on CookieStore has been improved.
<iframe> elements are now more conformant in how load events are fired on the element and its contentWindow (@TimvdLippe, #42254), although there are still some bugs. This has long behaved incorrectly in Servo, and it has historically caused many problems in the Web Platform Tests.
IndexedDB is now more conformant in our handling of transactions (@Taym95, #41508, #42732), and when opening and closing connections (@gterzian, @Taym95, #42082, #42669).
We've started implementing Largest Contentful Paint timings (@shubhamg13, #42024), and we've landed a bunch of improvements to how First Contentful Paint timings work in Servo:
- we now include 'background-image' (@shubhamg13, #42569)
- we now include 'border-image' (@shubhamg13, #42581)
- we now ignore subtrees with 'opacity: 0' (@shubhamg13, #42768)
- we now ignore zero-sized subtrees (@shubhamg13, #42178)
- we now ignore <iframe> (@shubhamg13, #42498)
- we now ignore <video> and <video poster> unless they actually have an image (@shubhamg13, #42411)
- we now ignore mouse moves when deciding when to stop measuring (@shubhamg13, #41999)
new WebSocket() now resolves relative URLs (@webbeef, #42425).
requestFullscreen() on Element now requires user activation (@stevennovaryo, #42060).
performance.getEntries() now returns PerformanceResourceTiming entries for navigations in <iframe> (@muse254, #42270).
When geolocation is enabled (--pref dom_geolocation_enabled), navigator.geolocation.getCurrentPosition() and watchPosition() now support the optional errors argument (@arihant2math, #42295).
We now support the '-webkit-text-security' property in CSS (@mrobinson, #42181), which is not specified anywhere but required for MotionMark.
Performance and stability
Our about:memory page now knows how to report many new kinds of memory usage, including the DevTools server (@Narfinger, #42478, #42480), WebGL (@sagudev, #42570), localStorage and sessionStorage (@arihant2math, #42484), and some of the memory used by IndexedDB (@arihant2math, #42486). We've also started internally tracking the memory usage of the media subsystem (@Narfinger, #42504) and WebXR (@Narfinger, #42505).
Layout has seen a lot of performance work in February, with our main focus being on improving incremental layout of the box tree and fragment tree.
We now have our first truly incremental box tree layout (@mrobinson, @Loirooriol, @lukewarlow, #42700), rather than our previous "dirty roots"-based approach. Depending on how they were damaged, some boxes for floats (as above, #42816), independent formatting contexts (as above, #42783), and their descendants (as above, #42582) can now be reused, and they avoid damaging their parents (as above, #42847). We also destroy boxes with 'display: none' earlier in the layout process (as above, #42584).
Incremental fragment tree layout is improving too! Whereas we previously had to decide whether to run fragment tree layout in an "all or nothing" way, we can now reuse cached fragments in independent formatting contexts (@mrobinson, @Loirooriol, @lukewarlow, #42687, #42717, #42871). We can also measure how much work is being done on each layout (as above, #42817).
Servo uses shared memory for many situations where copying data over channels would be too expensive, such as for images and fonts. In multiprocess mode (--multiprocess), we use the operating system to create the shared memory in a way that can be shared with other processes, such as shm_open(3) or CreateFileMappingW, but this consumes resources that can sometimes be exhausted. We only need to use those kinds of shared memory in multiprocess mode, so we've reworked Servo to use Arc<Vec<u8>> in single-process mode (@Narfinger, #42083), which should avoid resource exhaustion.
Parsing web pages is complicated: we want pages to render incrementally as they stream in from the network, and we want to prefetch resources, but scripts can call document.write(), which injects markup "on the spot". This is further complicated if that markup also contains a <script>.
We've recently landed some fixes to Servo's async parser (@simonwuelker, #42882, #42910), which handles these issues more efficiently. This is currently an obscure and somewhat buggy feature (--pref dom_servoparser_async_html_tokenizer_enabled), but if we can get the feature working more reliably (#37418), it could halve the energy Servo spends on parsing, lower latency for pages that don't use document.write(), and even improve the html5ever API for the ecosystem.
We've also landed optimisations for 'Content-Security-Policy' (@Narfinger, #42716), IntersectionObserver (@Narfinger, @mrobinson, @stevennovaryo, #42366, #42390), layout queries (@webbeef, #42327), the bfcache (@Narfinger, #42703), loading images (@Narfinger, #42684), and checks for multiprocess mode (@Narfinger, #42782), as well as the interfaces between Servo and SpiderMonkey (@sagudev, #42135, #42576).
We've continued our long-running effort to use the Rust type system to make certain kinds of dynamic borrow failures impossible (@Gae24, @pralkarz, @BryanSmith00, @sagudev, @Narfinger, @TimvdLippe, @kkoyung, @TimurBora, @onsah, #42342, #42294, #42370, #42417, #42619, #42616, #42637, #42640, #42662, #42679, #42681, #42665, #42667, #42699, #42712, #42725, #42729, #42726, #42720, #42738, #42737, #42735, #42751, #42805, #42809, #42780, #42820, #42715, #42635, #42880, #42846).
Bug fixes
We've landed some fixes for issues preventing Servo from being built on Windows arm64 (@dpaoliello, @npiesco, #42371, #42341). Work to enable Windows arm64 as a build platform is ongoing (@npiesco, #42312).
<img height> now takes the default <img width> from the aspect ratio of the image (@Loirooriol, #42577), rather than using a width of 300px by default. <svg width=0> and <svg height=0> now take the default width and height (respectively) from the aspect ratio of the <svg viewBox> (@Loirooriol, #42545).
We've fixed a bug in the result of layout queries, such as getBoundingClientRect(), on inline <svg> (@jdm, @Loirooriol, #42594), and we've fixed layout bugs related to 'display: table-cell' (@Loirooriol, #42778), 'display: list-item' (@Loirooriol, #42825, #42864), 'inset: auto' (@Loirooriol, #42586), 'width: max-content' (@mrobinson, @Loirooriol, @lukewarlow, #42574), 'align-self: last baseline' (@rayguo17, #42724), 'list-style-image' (@lukewarlow, #42332), 'content: <image>' (@lukewarlow, #42332), negative 'margin' (@Loirooriol, #42889), and ink overflow (@mrobinson, #42403).
HTML and CSS bugs:
- Empty 'url()' values making requests when they shouldn't (@rayguo17, #42622)
- <template> failing to throw HierarchyRequestError when a DOM API is used to create an invalid hierarchy (@TimvdLippe, #42276)
- <input> and <textarea> selection behaviour being incorrect when the text contains more than one script (@mrobinson, #42399)
- <script nonce> validation failing to work correctly in some cases (@dyegoaurelio, #40956)
- <a target> failing to work correctly after the related <iframe> is removed and a new one added with the same name (@jdm, #42344)
- <base> not taking effect in some cases, or taking effect when given a data: or javascript: URL (@TimvdLippe, #42255, #42339)
JavaScript and DOM bugs:
event.targetbeing incorrect on touchmove, touchend, and touchcancel events (@yezhizhen, #42654)- touchmove events not being fired when part of a two-finger pinch zoom (@yezhizhen, #42528)
- touchend events erroneously firing after touchcancel events (@yezhizhen, #42654)
- assignedNodes() on HTMLSlotElement returning incorrect results after the <slot> was removed from the shadow tree (@rayguo17, #42250)
- Largest Contentful Paint timings no longer being collected after reloading or navigating (@shubhamg13, #41169)
- PerformancePaintTiming being exposed to Worker globals when they shouldn't be (@shubhamg13, #42409)
- JavaScript modules resolved incorrectly when there are overlapping
.importsor.scopesor import maps (@Gae24, #42668, #42630, #42754, #42821) - changes to how we trigger garbage collection breaking Speedometer (@sagudev, #42271)
WebDriver bugs:
- Pointer actions and wheel actions behaving incorrectly when devicePixelRatio ≠ 1 (@yezhizhen, #42387, #42628)
- Wheel actions throwing incorrect exceptions when they are missing properties (@yezhizhen, #42745)
- pointerMove actions with non-zero duration failing to interleave with other actions (@yezhizhen, #42289)
We've fixed crashes in DevTools, in the Inspector tab (@eerii, @mrobinson, #42330), when exiting Servo while DevTools is connected (@simonwuelker, #42543), when setting breakpoints (@atbrakhi, #42810), and after clients disconnect (@simonwuelker, #42583).
We've fixed crashes in layout, when using 'background-repeat: round' (@mrobinson, #42303), when using 'list-style-image' or 'content: <image>' (@lukewarlow, #42332), when calling elementFromPoint() on Document (@mrobinson, @Loirooriol, @lukewarlow, #42822), and when handling layout queries like getBoundingClientRect() on inline <svg> (@jdm, @Loirooriol, #42594).
We've fixed crashes related to stylesheets, when removing stylesheets from the DOM (@TimvdLippe, #42273), when changing the href of a <link rel=stylesheet> (@TimvdLippe, #42481), and when loading stylesheets with --layout-threads=1 (@mrobinson, @Loirooriol, @lukewarlow, #42685).
We've also fixed crashes when using multitouch input (@yezhizhen, #42350), when using MediaStreamAudioSourceNode (@mrobinson, #42914), when calling add() on HTMLOptionsCollection (@mrobinson, #42263), when calling elementFromPoint() on Document or ShadowRoot(), when we fail to open a database for IndexedDB (@jdm, @mrobinson, #42444), and when certain pages are run with a mozjs debug build (@Gae24, #42428).
Donations
Thanks again for your generous support! We are now receiving 6985 USD/month (−0.4% from January) in recurring donations. This helps us cover the cost of our speedy CI and benchmarking servers, one of our latest Outreachy interns, and funding maintainer work that helps more people contribute to Servo.
Servo is also on thanks.dev, and already 32 GitHub users (-1 from January) that depend on Servo are sponsoring us there. If you use Servo libraries like url, html5ever, selectors, or cssparser, signing up for thanks.dev could be a good way for you (or your employer) to give back to the community.
We now have sponsorship tiers 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 join@servo.org.
Use of donations is decided transparently via the Technical Steering Committee's public funding request process, and active proposals are tracked in servo/project#187. For more details, head to our Sponsorship page.
31 Mar 2026 12:00am GMT
30 Mar 2026
Planet Mozilla
Cameron Kaiser: So long, cheesegrater
9To5Mac is reporting that Apple has confirmed the Mac Pro is no longer for sale, and indeed, although it was up yesterday, today it's gone.
And are you surprised? After all, Macs have their own bespoke GPUs now, and RAM is on-die. (Glad I sprang for the 16GB option on my M1 Air - that has greatly lengthened its useful service life.) If Apple isn't shipping computers with DIMM slots anymore, then why would they ship PCIe slots for anything else? It wasn't like there were many options you could put in the last iteration anyway, because it too had a non-upgradeable GPU and fixed RAM. Okay, okay, you could stick a whole bunch of NVMe sticks in it and it had good cooling. Was that worth it?
This marks the end of the venerable tower Macs that we loved in the PowerPC days. The Mac Studio is the new Mac Pro. We were always at war with Eastasia.
30 Mar 2026 1:21am GMT
27 Mar 2026
Planet Mozilla
Firefox Tooling Announcements: MozPhab 2.9.1 Released
Bugs resolved in Moz-Phab 2.9.1:
- bug 2026194
moz-phab upliftshould not set a reviewerless patch as WIP - bug 2026300 Remove redundant "Figuring out who you are" wait message
Discuss these changes in #engineering-workflow on Slack or #Conduit Matrix.
1 post - 1 participant
27 Mar 2026 7:41pm GMT
26 Mar 2026
Planet Mozilla
The Mozilla Blog: Mozilla and Mila announce strategic research partnership to advance open source and sovereign AI capabilities

The future of AI should belong to all of humanity, well beyond a handful of countries or companies. For that to happen, AI needs to be open, trusted, and built in ways that give people, institutions, and nations real choices. That's why, today, Mozilla is announcing a strategic partnership with Mila - Quebec Artificial Intelligence Institute to advance open source and sovereign AI capabilities.
This partnership marks a landmark strategic collaboration for both organizations and Mozilla's first-ever partnership with a major AI research lab. It is designed to grow over time, with an inaugural project that focuses on the intersection of trust and usability, including private memory architectures for AI agents.
Mila brings world-class research depth and a proven track record moving ideas into systems - from fundamental breakthroughs to applied tools and the diffusion of technology. Mozilla brings deep open source experience, a vibrant developer community, and the ecosystem instincts needed to turn research into something that spreads. The partnership is designed to show that open source AI can close the gap between cutting-edge research and real-world impact.
As we saw in the web era, having a robust open source software stack can democratize and accelerate innovation in dramatic ways. The same opportunity exists in AI - across compute, models, data, and developer experience - and much of the stack is already being built in the open. But gaps remain, particularly in the layers that determine whether AI is trustworthy, private, and built for a world with many languages, many cultures, and many legitimate ways of organizing society. If we can close those gaps, open source AI becomes a genuine option for the people and institutions that need it most.
"We are working to build a future where AI development is rooted in openness, privacy, and humanity," said Mark Surman, president of Mozilla. "This partnership is a delivery vehicle for that vision - and for breakthroughs that will help governments, developers, and companies alike. Canada can lead on AI sovereignty; we're joining with Mila to make it happen."
"Canada has what it takes to lead on frontier AI that the world can actually trust: the research depth, the values, and the will to do it differently. The next frontier in AI isn't just capability, it is trustworthiness, and Canada is uniquely positioned to lead on both. This partnership is a concrete step in that direction. Open, trustworthy AI isn't a compromise on ambition. It's the higher bar," said Valérie Pisano, president and CEO of Mila.
Together, Mila and Mozilla will develop the technologies and approaches that reduce dependence on closed systems and create more room for transparency, accountability, and shared innovation. The partnership also lays the groundwork for middle-power cooperation in AI: Open source projects have consistently provided the framework for technical collaboration across geographies and jurisdictions. Both organizations welcome research institutions, developers, and like-minded organizations to help fill the stack.
This is the first of what both organizations intend to be a sustained and growing body of work.
Read more about our Open Source AI Strategy here. Learn more about Mila here.
The post Mozilla and Mila announce strategic research partnership to advance open source and sovereign AI capabilities appeared first on The Mozilla Blog.
26 Mar 2026 4:58pm GMT
The Rust Programming Language Blog: Announcing Rust 1.94.1
The Rust team has published a new point release of Rust, 1.94.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.94.1 is as easy as:
rustup update stable
If you don't have it already, you can get rustup from the appropriate page on our website.
What's in 1.94.1
Rust 1.94.1 resolves three regressions that were introduced in the 1.94.0 release.
- Fix
std::thread::spawnon wasm32-wasip1-threads - Remove new methods added to
std::os::windows::fs::OpenOptionsExtThe new methods were unstable, but the trait itself is not sealed and so cannot be extended with non-default methods. - Clippy: fix ICE in
match_same_arms - Cargo: downgrade curl-sys to 0.4.83 This fixes certificate validation error for some users on some versions of FreeBSD. See this issue for more details.
And a security fix:
- Cargo: Update tar to 0.4.45 This resolves CVE-2026-33055 and CVE-2026-33056. Users of crates.io are not affected. See blog for more details.
Contributors to 1.94.1
Many people came together to create Rust 1.94.1. We couldn't have done it without all of you. Thanks!
26 Mar 2026 12:00am GMT
25 Mar 2026
Planet Mozilla
Hacks.Mozilla.Org: Firefox Developer Edition and Beta: Try out Mozilla’s .rpm package!
In January, we introduced our Nightly package for RPM-based Linux distributions. Today, we are thrilled to announce it is now available for Firefox Beta!
Firefox Beta is great for testing your sites in a version of Firefox that will reach regular users in the coming weeks. If you find any issues, please file them on Bugzilla.
Switching to Mozilla's RPM repository allows Firefox Beta to be installed and updated like any other application, using your favorite package manager. It also provides a number of improvements:
- Better performance thanks to our advanced compiler-based optimizations,
- Updates as fast as possible because the .rpm management is integrated into Firefox's release process,
- Hardened binaries with all security flags enabled during compilation,
- No need to create your own .desktop file.
If you have Mozilla's RPM repository already set up, you can simply install Firefox Beta with your package manager. Otherwise, follow the setup steps below.
If you are on Fedora (41+), or any other distribution using dnf5 as the package manager
sudo dnf config-manager addrepo --id=mozilla --set=baseurl=https://packages.mozilla.org/rpm/firefox --set=gpgkey=https://packages.mozilla.org/rpm/firefox/signing-key.gpg --set=gpgcheck=1 --set=repo_gpgcheck=0
sudo dnf makecache --refresh
sudo dnf install firefox-beta
Note: repo_gpgcheck=0 deactivate the signature of metadata with GPG. However, this is safeguarded instead by HTTPS and package signatures (gpgcheck=1).
If you are on openSUSE or any other distribution using zypper as the package manager
sudo rpm --import https://packages.mozilla.org/rpm/firefox/signing-key.gpg
sudo zypper ar --gpgcheck-allow-unsigned-repo https://packages.mozilla.org/rpm/firefox mozilla
sudo zypper refresh
sudo zypper install firefox-beta
For other RPM based distributions (RHEL, CentOS, Rocky Linux, older Fedora versions)
sudo tee /etc/yum.repos.d/mozilla.repo > /dev/null << EOF
[mozilla]
name=Mozilla Packages
baseurl=https://packages.mozilla.org/rpm/firefox
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://packages.mozilla.org/rpm/firefox/signing-key.gpg
EOF
# For dnf users
sudo dnf makecache --refresh
sudo dnf install firefox-beta
# For zypper users
sudo zypper refresh
sudo zypper install firefox-beta
The firefox-beta package will not conflict with your distribution's Firefox package if you have it installed, you can have both at the same time!
Adding language packs
If your distribution language is set to a supported language, language packs for it should automatically be installed. You can also install them manually with the following command (replace fr with the language code of your choice):
sudo dnf install firefox-beta-l10n-fr
You can list the available languages with the following command:
dnf search firefox-beta-l10n
Don't hesitate to report any problem you encounter to help us make your experience better.
The post Firefox Developer Edition and Beta: Try out Mozilla's .rpm package! appeared first on Mozilla Hacks - the Web developer blog.
25 Mar 2026 4:17pm GMT
This Week In Rust: This Week in Rust 644
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 @ThisWeekinRust on mastodon.social, or send us a pull request. Want to get involved? We love contributions.
This Week in Rust is openly developed on GitHub and archives can be viewed at this-week-in-rust.org. If you find any errors in this week's issue, please submit a PR.
Want TWIR in your inbox? Subscribe here.
Updates from Rust Community
Official
Foundation
Newsletters
Project/Tooling Updates
- Ferox - A native PostgreSQL client in Rust
- Introducing dial9: A flight recorder for Tokio
- Zellij 0.44: native Windows support, new Rust APIs, remote sessions
- vigil-rs: A Rust Service Supervisor for Containers with PID 1 handling
- Fyrox 1.0.0
- Edge.js: running Node.js safely in a WebAssembly sandbox with Wasmer and WASIX
- Bookokrat v0.3.8: A terminal EPUB / PDF Book Reader now supports DJVU
- flodl v0.1.5: benchmarking Rust vs PyTorch on 7 models - up to 30% faster with 3-20x tighter variance
- Zero-copy Protobuf and ConnectRPC for Rust
- mtp-rs: pure-Rust MTP library, up to 4x faster than libmtp
- [video] Batty: Supervised Agent Execution for Software Teams - Demo
- indxr v0.2.0: A fast codebase indexer and MCP server for AI coding agents
- halloy 2026.5 - desktop IRC client with IRCv3 capabilities
Observations/Thoughts
- Deadlocking a Tokio Mutex without Holding a Lock
- The Good, the Bad, and the Leaky: jemalloc, bumpalo, and mimalloc in meilisearch
- Maximally minimal view types
- Matching Puzzle Pieces and Disappointing Benchmarks
- What If Traits Carried Values
- An effect notation based on with-clauses and blocks
- Rust threads on the GPU
- Elaborating Rust Traits to Dictionary-Passing Style
Rust Walkthroughs
- ZK snarks for rust developer part 2/8
- Let's see Paul Allen's SIMD CSV parser
- Building an LSP Server with Rust is surprisingly easy and fun
- An Incoherent Rust
- Building pentest devices with Rust and ESP32 microcontrollers
- Rust in Intersec's lib-common, Part 1: Integrating Rust in a C Build System
Crate of the Week
This week's crate is noq, a general purpose implementation of the QUIC transport protocol in pure rust.
Thanks to Brendan O'Brien for the self-suggestion!
Please submit your suggestions and votes for next week!
Calls for Testing
An important step for RFC implementation is for people to experiment with the implementation and give feedback, especially before stabilization.
If you are a feature implementer and would like your RFC to appear in this list, add a call-for-testing label to your RFC along with a comment providing testing instructions and/or guidance on which aspect(s) of the feature need testing.
No calls for testing were issued this week by Rust, Cargo, Rustup or Rust language RFCs.
Let us know if you would like your feature to be tracked as a part of this list.
Call for Participation; projects and speakers
CFP - Projects
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!
Some of these tasks may also have mentors available, visit the task page for more information.
If you are a Rust project owner and are looking for contributors, please submit tasks here or through a PR to TWiR or by reaching out on Bluesky or Mastodon!
CFP - Events
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.
- EuroRust | CFP open until 2026-04-27 | Barcelona, Spain | 2026-10-14 - 2026-10-17
- NDC Techtown 2026 | CFP open until 2026-05-03 | Kongsberg, Norway | 2026-09-21 - 2026-09-24
If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a PR to TWiR or by reaching out on Bluesky or Mastodon!
Updates from the Rust Project
433 pull requests were merged in the last week
Compiler
- fix some suggestions of the
for-loops-over-fallibleslint - guard patterns: lowering to THIR
- introduce
#[diagnostic::on_move(message)] - make
par_sliceconsistent with single-threaded execution - privacy: fix type privacy holes in RPITITs
Library
- add APIs for dealing with titlecase
- add
is_disconnectedfunctions to mpsc and mpmc channels - implement
BinaryHeap::as_mut_slice - make
OsString::truncatea no-op whenlen > current_len - optimize 128-bit integer formatting
- optimize
BTreeMap::append()using CursorMut vec::Drain::fill: avoid reference to uninitialized memory- unstable impl of
From<{i64, u64}> for f128
Cargo
- clean: Validate that
target_diris not a file cli: Add support for completing--configargument values withnative-completionscli: complete--configand--colorbefore commandcompile: Make build.warnings ignore non-local deps- fix
symlink_and_directorywhen running in a long target dir name - detect circular publish dependency cycle in workspace publish
- fix fetching non-standard git refspecs on non-github repos
- warn when installing with a non-default toolchain
Clippy
- add
BinaryHeap::pop_if()tomanual_pop_if - fix
collapsible_matchfalse positive when the pat binding is moved or mutated - perf:
manual_is_ascii_check,remove 822 million instructions
Rust-Analyzer
- add
ops::AddAssignimplement for IndentLevel - add applicable on LetExpr for
unwrap_tuple - add applicable on let-else branch for
unwrap_block - add auto trait name for
generate_trait_from_impl - add fixes for
non_exhaustive_letdiagnostic - add mapping to syntax factory constructor methods
- add nested lifetime support for
add_lifetime_to_type - add partial selection for
merge_imports - add wrap multiple attr for
wrap_unwrap_cfg_attr - change
test_nameplaceholder toexecutable_arg - complete block .let in closure expression
- offer
'add_braces'on bin-expr assignment - offer on let-expr for
inline_local_variable - fix asm sym operand parsing for parenthesized expr fragments
- fix indent for
convert_closure_to_fn - fix indent for
trait_impl_redundant_assoc_item - fix not applicable on empty
structforno_such_field - fix other predicate for
replace_is_method_with_if_let_method - fix postfix completion indentation compensation
- fix tuple
structpat expected type - add
ident_patqualifier to fully fn param - don't add a second semicolon after postfix completions
- fill match arms on last comma and empty expr
- fix overlap edit on record to tuple assist uses self
- incorrect flychecks with multiple workspaces
- offer on const like path-expr for
'extract_variable' - replace TODO placeholders in next-solver IrPrint with proper formatting
- implement signature type inference
- improve tmp iterator variable name for
convert_for_to_while_let - migrate
convert_from_to_tryfromassist to SyntaxEditor API - project json compatibility improvements
- project json compatibility improvements
- remove doc comments for
generate_trait_from_impl - remove outdated TODO
- remove the mapping for
expr_underscorefrom the syntax factory constructor - replace direct usage of make with syntax factory and migrate assist to syntaxEditor
- support WhileExpr and ForExpr for
add_label_to_loop - support more runnable kinds in project JSON
Rust Compiler Performance Triage
Lot of mixed results this week. One big regression from #152931 makes the results look pretty negative, but otherwise the week was fairly quiet.
Triage done by @panstromek. Revision range: 5b61449e..6f22f613
Summary:
| (instructions:u) | mean | range | count |
|---|---|---|---|
| Regressions ❌ (primary) |
1.0% | [0.1%, 4.2%] | 27 |
| Regressions ❌ (secondary) |
0.2% | [0.0%, 0.6%] | 36 |
| Improvements ✅ (primary) |
-0.1% | [-0.2%, -0.1%] | 3 |
| Improvements ✅ (secondary) |
-0.3% | [-2.8%, -0.0%] | 14 |
| All ❌✅ (primary) | 0.9% | [-0.2%, 4.2%] | 30 |
1 Regression, 1 Improvement, 4 Mixed; 1 of them in rollups 32 artifact comparisons made in total
Approved RFCs
Changes to Rust follow the Rust RFC (request for comments) process. These are the RFCs that were approved for implementation this week:
Final Comment Period
Every week, the team announces the 'final comment period' for RFCs and key PRs which are reaching a decision. Express your opinions now.
Tracking Issues & PRs
- Tracking Issue for fN::BITS
- Fallback
{float}tof32whenf32: From<{float}>and addimpl From<f16> for f32 - Tracking Issue for tcp_deferaccept
- Tracking Issue for #138068: Add
Result::map_or_defaultandOption::map_or_default - Merge
fabsf16/32/64/128intofabs::<F> - 1.95 beta regression: "malformed feature attribute input"
- Never break between empty parens
- Emit retags in codegen
- Optimize
repr(Rust)enums by omitting tags in more cases involving uninhabited variants. - Proposal for a dedicated test suite for the parallel frontend
- Promote tier 3 riscv32 ESP-IDF targets to tier 2
- Proposal for Adapt Stack Protector for Rust
No Items entered Final Comment Period this week for Rust RFCs, Language Team, Leadership Council or Unsafe Code Guidelines.
Let us know if you would like your PRs, Tracking Issues or RFCs to be tracked as a part of this list.
New and Updated RFCs
Upcoming Events
Rusty Events between 2026-03-25 - 2026-04-22 🦀
Virtual
- 2026-03-25 | Virtual (Girona, ES) | Rust Girona
- 2026-03-26 | Virtual (Berlin, DE) | Rust Berlin
- 2026-03-31 | Virtual (Tel Aviv-yafo, IL) | Code Mavens 🦀 - 🐍 - 🐪
- 2026-04-01 | Virtual (Girona, ES) | Rust Girona
- 2026-04-01 | Virtual (Indianapolis, IN, US) | Indy Rust
- 2026-04-02 | Virtual (Nürnberg, DE) | Rust Nuremberg
- 2026-04-04 | Virtual (Kampala, UG) | Rust Circle Meetup
- 2026-04-09 | Virtual (Berlin, DE) | Rust Berlin
- 2026-04-14 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
- 2026-04-14 | Virtual (London, GB) | Women in Rust
- 2026-04-15 | Virtual (Vancouver, BC, CA) | Vancouver Rust
- 2026-04-19 | Virtual (Dallas, TX, US) | Dallas Rust User Meetup
- 2026-04-21 | Virtual (Washington, DC, US) | Rust DC
Asia
- 2026-03-28 | Delhi, IN | Rust Delhi
- 2026-04-17 | Bangalore, IN, Rust India
- 2026-04-18 | Bangalore, IN, Rust India
Europe
- 2026-03-25 | Dresden, DE | Rust Dresden
- 2026-03-26 | Copenhagen, DK | Copenhagen Rust Community
- 2026-03-26 | Paris, FR | Rust Paris
- 2026-03-27 | Paris, FR | Rust in Paris
- 2026-03-28 | Stockholm, SE | Stockholm Rust
- 2026-04-01 | Berlin, DE | Rust Berlin
- 2026-04-01 | Edinburgh, GB | Rust and Friends
- 2026-04-01 | Oxford, UK | Oxford ACCU/Rust Meetup.
- 2026-04-02 | London, GB | Rust London User Group
- 2026-04-03 | Edinburgh, GB | Rust and Friends
- 2026-04-07 | Basel, CH | Rust Basel
- 2026-04-09 | Geneva, CH | Rust Meetup Geneva
- 2026-04-09 | Oslo, NO | Rust Oslo
- 2026-04-21 | Leipzig, SN, DE | Rust - Modern Systems Programming in Leipzig
North America
- 2026-03-25 | Austin, TX, US | Rust ATX
- 2026-03-25 | New York, NY, US | Rust NYC
- 2026-03-26 | Atlanta, GA, US | Rust Atlanta
- 2026-03-28 | Boston, MA, US | Boston Rust Meetup
- 2026-04-02 | Mountain View, CA, US | Hacker Dojo
- 2026-04-02 | Saint Louis, MO, US | STL Rust
- 2026-04-04 | Boston, MA, US | Boston Rust Meetup
- 2026-04-09 | San Diego, CA, US | San Diego Rust
- 2026-04-11 | Boston, MA, US | Boston Rust Meetup
- 2026-04-14 | Charlottesville, VA, US | Charlottesville Rust Meetup
- 2026-04-16 | Seattle, WA, US | Seattle Rust User Group
- 2026-04-18 | Boston, MA, US | Boston Rust Meetup
- 2026-04-20 - 2026-04-22 | Portland, OR | Tokio
- 2026-04-21 | San Francisco, CA, US | San Francisco Rust Study Group
- 2026-04-22 | Austin, TX, US | Rust ATX
Oceania
- 2026-03-26 | Melbourne, AU | Rust Melbourne
South America
- 2026-04-11 | Argentina, AR | Oxidar Org
- 2026-04-17 | Rio de Janeiro, BR | Meetups Rust RJ
If you are running a Rust event please add it to the calendar to get it mentioned here. Please remember to add a link to the event too. Email the Rust Community Team for access.
Jobs
Please see the latest Who's Hiring thread on r/rust
Quote of the Week
Code does not become better out of thin air just because you rewrite it in #rustlang.
Despite a third week gone by without a suggestion, llogiq is unrelenting in his quest to find a quote worth your while.
Please submit quotes and vote for next week!
This Week in Rust is edited by:
- nellshamrell
- llogiq
- ericseppanen
- extrawurst
- U007D
- mariannegoldin
- bdillo
- opeolluwa
- bnchi
- KannanPalani57
- tzilist
Email list hosting is sponsored by The Rust Foundation
25 Mar 2026 4:00am GMT
Jonathan Almeida: Use Android Studio for resolving conflicts in Jujutsu
You can use JJ's built-in editor for conflict resolutions, but I've found it difficult to follow. A recommendation from co-workers was to use Meld and that has worked quite well once I (begrudingly) accepted that I needed to download another single-purpose app.
Today, another co-worker Andrey Zinovyev found out that we can use Android Studio's (IntelliJ IDEA's really) built-in merge tool to resolve the three-way merge. This is more convenient for me since I spend most of my time here already, so using it as a general purpose merge editor for my work projects is quite nice.
[ui]
merge-editor = "studio"
[merge-tools.studio]
merge-args = ["merge", "$left", "$right", "$base", "$output"]
program = "/Users/jalmeida/Applications/Android Studio Nightly.app/Contents/MacOS/studio"
Presto!

25 Mar 2026 12:00am GMT


