21 Jan 2026
Planet Mozilla
The Rust Programming Language Blog: crates.io: development update
Time flies! Six months have passed since our last crates.io development update, so it's time for another one. Here's a summary of the most notable changes and improvements made to crates.io over the past six months.
Security Tab
Crate pages now have a new "Security" tab that displays security advisories from the RustSec database. This allows you to quickly see if a crate has known vulnerabilities before adding it as a dependency.

The tab shows known vulnerabilities for the crate along with the affected version ranges.
This feature is still a work in progress, and we plan to add more functionality in the future. We would like to thank the OpenSSF (Open Source Security Foundation) for funding this work and Dirkjan Ochtman for implementing it.
Trusted Publishing Enhancements
In our July 2025 update, we announced Trusted Publishing support for GitHub Actions. Since then, we have made several enhancements to this feature.
GitLab CI/CD Support
Trusted Publishing now supports GitLab CI/CD in addition to GitHub Actions. This allows GitLab users to publish crates without managing API tokens, using the same OIDC-based authentication flow.
Note that this currently only works with GitLab.com. Self-hosted GitLab instances are not supported yet. The crates.io implementation has been refactored to support multiple CI providers, so adding support for other platforms like Codeberg/Forgejo in the future should be straightforward. Contributions are welcome!
Trusted Publishing Only Mode
Crate owners can now enforce Trusted Publishing for their crates. When enabled in the crate settings, traditional API token-based publishing is disabled, and only Trusted Publishing can be used to publish new versions. This reduces the risk of unauthorized publishes from leaked API tokens.
Blocked Triggers
The pull_request_target and workflow_run GitHub Actions triggers are now blocked from Trusted Publishing. These triggers have been responsible for multiple security incidents in the GitHub Actions ecosystem and are not worth the risk.
Source Lines of Code
Crate pages now display source lines of code (SLOC) metrics, giving you insight into the size of a crate before adding it as a dependency. This metric is calculated in a background job after publishing using the tokei crate. It is also shown on OpenGraph images:

Thanks to XAMPPRocky for maintaining the tokei crate!
Publication Time in Index
A new pubtime field has been added to crate index entries, recording when each version was published. This enables several use cases:
- Cargo can implement cooldown periods for new versions in the future
- Cargo can replay dependency resolution as if it were a past date, though yanked versions remain yanked
- Services like Renovate can determine release dates without additional API requests
Thanks to Rene Leonhardt for the suggestion and Ed Page for driving this forward on the Cargo side.
Svelte Frontend Migration
At the end of 2025, the crates.io team evaluated several options for modernizing our frontend and decided to experiment with porting the website to Svelte. The goal is to create a one-to-one port of the existing functionality before adding new features.
This migration is still considered experimental and is a work in progress. Using a more mainstream framework should make it easier for new contributors to work on the frontend. The new Svelte frontend uses TypeScript and generates type-safe API client code from our OpenAPI description, so types flow from the Rust backend to the TypeScript frontend automatically.
Thanks to eth3lbert for the helpful reviews and guidance on Svelte best practices. We'll share more details in a future update.
Miscellaneous
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.
-
Cargo user agent filtering: We noticed that download graphs were showing a constant background level of downloads even for unpopular crates due to bots, scrapers, and mirrors. Download counts are now filtered to only include requests from Cargo, providing more accurate statistics.
-
HTML emails: Emails from crates.io now support HTML formatting.
-
Encrypted GitHub tokens: OAuth access tokens from GitHub are now encrypted at rest in the database. While we have no evidence of any abuse, we decided to improve our security posture. The tokens were never included in the daily database dump, and the old unencrypted column has been removed.
-
Source link: Crate pages now display a "Browse source" link in the sidebar that points to the corresponding docs.rs page. Thanks to Carol Nichols for implementing this feature.
-
Fastly CDN: The sparse index at index.crates.io is now served primarily via Fastly to conserve our AWS credits for other use cases. In the past month, static.crates.io served approximately 1.6 PB across 11 billion requests, while index.crates.io served approximately 740 TB across 19 billion requests. A big thank you to Fastly for providing free CDN services through their Fast Forward program!
-
OpenGraph image improvements: We fixed emoji and CJK character rendering in OpenGraph images, which was caused by missing fonts on our server.
-
Background worker performance: Database indexes were optimized to improve background job processing performance.
-
CloudFront invalidation improvements: Invalidation requests are now batched to avoid hitting AWS rate limits when publishing large workspaces.
Feedback
We hope you enjoyed this update on the development of crates.io. If you have any feedback or questions, please let us know on Zulip or GitHub. We are always happy to hear from you and are looking forward to your feedback!
21 Jan 2026 12:00am GMT
20 Jan 2026
Planet Mozilla
Data@Mozilla: This Week in Data: There’s No Such Thing as a Normal Month
("This Week in Data" is a series of blog posts that the Data Team at Mozilla is using to communicate about our work. Posts in this series could be release notes, documentation, hopes, dreams, or whatever: so long as it's about data.)
At the risk of reminding you of a Nickleback song, look at this graph:

I've erased the y-axis because the absolute values don't actually matter for this discussion, but this is basically a sparkline plot of active users of Firefox Desktop for 2025. The line starts and ends basically at the same height but wow does it have a lot of ups and downs between.
I went looking at this shape recently while trying to estimate the costs of continuing to collect Legacy Telemetry in Firefox Desktop. We're at the point in our migration to Glean where you really ought to start removing your Legacy Telemetry probes unless you have some ongoing analyses that depend on them. I was working out a way to get a back-of-the-envelope dollar figure to scare teams into prioritizing such removals to be conducted sooner rather than later.
Our ingestion metadata (how many bytes were processed by which pieces of the pipeline) only goes back sixty days, and I was worried that basing my cost estimate on numbers from December 2025 would make them unusually low compared to "a normal month".
But what's "normal"? Which of these months could be considered "normal" by any measure? I mean:
- January: Beginning-of-year holiday slump
- February: Only twenty-eight days long
- March: Easter (sometimes), DST begins
- April: Easter (sometimes), something that really starts suppressing activity
- May: What's with that big rebound in the second half?
- June: Last day of school
- July: School's out, Northern Hemisphere Summer means less time on the 'net and more time touching grass
- August: Typical month for vacations in Europe
- September: Back-to-school
- October: Maybe "normal"?
- November: US Thanksgiving
- December: End-of-year holiday slump
October and maybe May are perhaps the closest things we have to "normal" months, and by being the only "normal"-ish months that makes them rather abnormal, don't you think?
Now, I've been lying to you with data visualization here. If you're exceedingly clever you'll notice that, in the sparkline plot above, not only did I take the y-axis labels off, I didn't start the y-axis at 0 (we had far more than zero active users of Firefox Desktop at the end of August, after all). I chose this to be illustrative of the differences from month to month, exaggerating them for effect. But if you look at, say, the Monthly Active Users (now combined Mobile + Desktop) on data.firefox.com it paints a rather more sedate picture, doesn't it:

This isn't a 100% fair comparison as data.firefox.com goes back years, and I stretched 2025 to be the same width, above… but you see what data visualization choices can do to help or hinder the story you're hoping to tell.
At any rate, I hope you found it as interesting as I did to learn that December's abnormality makes it just as "normal" as the rest of the months for my cost estimation purposes.
:chutten
(this is a syndicated copy of the original blog post.)
20 Jan 2026 3:32pm GMT
Chris H-C: This Week in Data: There’s No Such Thing as a Normal Month
("This Week in Data" is a series of blog posts that the Data Team at Mozilla is using to communicate about our work. Posts in this series could be release notes, documentation, hopes, dreams, or whatever: so long as it's about data.)
At the risk of reminding you of a Nickleback song, look at this graph:

I've erased the y-axis because the absolute values don't actually matter for this discussion, but this is basically a sparkline plot of active users of Firefox Desktop for 2025. The line starts and ends basically at the same height but wow does it have a lot of ups and downs between.
I went looking at this shape recently while trying to estimate the costs of continuing to collect Legacy Telemetry in Firefox Desktop. We're at the point in our migration to Glean where you really ought to start removing your Legacy Telemetry probes unless you have some ongoing analyses that depend on them. I was working out a way to get a back-of-the-envelope dollar figure to scare teams into prioritizing such removals to be conducted sooner rather than later.
Our ingestion metadata (how many bytes were processed by which pieces of the pipeline) only goes back sixty days, and I was worried that basing my cost estimate on numbers from December 2025 would make them unusually low compared to "a normal month".
But what's "normal"? Which of these months could be considered "normal" by any measure? I mean:
- January: Beginning-of-year holiday slump
- February: Only twenty-eight days long
- March: Easter (sometimes), DST begins
- April: Easter (sometimes), something that really starts suppressing activity
- May: What's with that big rebound in the second half?
- June: Last day of school
- July: School's out, Northern Hemisphere Summer means less time on the 'net and more time touching grass
- August: Typical month for vacations in Europe
- September: Back-to-school
- October: Maybe "normal"?
- November: US Thanksgiving
- December: End-of-year holiday slump
October and maybe May are perhaps the closest things we have to "normal" months, and by being the only "normal"-ish months that makes them rather abnormal, don't you think?
Now, I've been lying to you with data visualization here. If you're exceedingly clever you'll notice that, in the sparkline plot above, not only did I take the y-axis labels off, I didn't start the y-axis at 0 (we had far more than zero active users of Firefox Desktop at the end of August, after all). I chose this to be illustrative of the differences from month to month, exaggerating them for effect. But if you look at, say, the Monthly Active Users (now combined Mobile + Desktop) on data.firefox.com it paints a rather more sedate picture, doesn't it:

This isn't a 100% fair comparison as data.firefox.com goes back years, and I stretched 2025 to be the same width, above… but you see what data visualization choices can do to help or hinder the story you're hoping to tell.
At any rate, I hope you found it as interesting as I did to learn that December's abnormality makes it just as "normal" as the rest of the months for my cost estimation purposes.
:chutten
20 Jan 2026 3:19pm GMT