
I'm Hiroshi Shibata (hsbt), a Ruby committer and the maintainer of RubyGems and Bundler. ...
I'm Hiroshi Shibata (hsbt), a Ruby committer and the maintainer of RubyGems and Bundler.
Every major package manager is adding "cooldown" — a waiting period before you can install newly released packages. RubyGems/Bundler doesn't have one yet. I've been discussing whether we should add it. Short answer: yes, as an opt-in option, but cooldown alone isn't enough.
A cooldown prevents upgrading to a new package version until a certain time has passed since its release. The idea is simple: if a malicious package is published, the waiting period gives security researchers time to catch it before it reaches your Gemfile.lock.
William Woodruff's analysis found that 8 out of 10 supply chain attacks he examined had an exploitation window of less than one week. A 7-day cooldown could have prevented most of them.
As Andrew Nesbitt summarizes in "Package Managers Need to Cool Down", from late 2025 into 2026, cooldown adoption has accelerated rapidly.
Cooldown started in dependency update tools, then spread to package managers themselves. One complication: every tool picked a different config name — minimumReleaseAge, min-release-age, npmMinimalAgeGate, exclude-newer, uploaded-prior-to, and so on. At least 10 different names exist. Polyglot developers, beware.
Dependabot added a cooldown block in July 2025. You can set different waiting periods per semver level, and security updates bypass the cooldown:
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "bundler"
directory: "/"
schedule:
interval: "weekly"
cooldown:
default-days: 3
semver-major-days: 7
Renovate has minimumReleaseAge (formerly stabilityDays), with per-package and per-update-type granularity:
{
"minimumReleaseAge": "3 days",
"packageRules": [
{
"matchUpdateTypes": ["major"],
"minimumReleaseAge": "7 days"
}
]
}
pnpm was first, shipping minimumReleaseAge in v10.16 (September 2025):
# pnpm-workspace.yaml
minimumReleaseAge: 1440 # 24 hours
minimumReleaseAgeExclude:
- '@myorg/*'
npm followed with min-release-age in CLI 11.x (February 2026). Bun added minimumReleaseAge in October 2025, Deno added --minimum-dependency-age. All major JavaScript runtimes now support cooldowns.
On the Python side, uv extended its --exclude-newer flag (originally for reproducible builds) to accept relative durations like "7 days". pip introduced --uploaded-prior-to in 26.0 (January 2026), though pip only takes absolute timestamps.
RubyGems and Bundler have no cooldown feature. A community member opened a Discussion on ruby/rubygems requesting one, and I discussed it with Ruby community members and the RubyGems team.
What follows is my take on the discussion. I'm the RubyGems/Bundler maintainer, so keep that bias in mind.
My first concern. Cooldowns implicitly assume that someone else will install the new version first and find problems. But if everyone enables cooldowns, nobody tries new releases during the waiting period — and the mechanism becomes useless. Better than nothing, probably. But it's a structural limitation of how OSS works.
A strict cooldown also delays urgent security patches. Distinguishing a malicious release from a legitimate security fix automatically is extremely difficult. Cooldowns could actually increase risk in some cases.
Software that hasn't been updated in 10 years may contain undiscovered vulnerabilities. Consider a gem that's been on RubyGems for years without updates — age tells you nothing about whether it's been audited. Time passing doesn't guarantee security. Cooldowns provide a sense of security, but a sense of security isn't the same as actual security.
On the other hand — and this is the strongest argument for cooldowns — they buy time for people who are actually scanning packages.
A concrete example: Maciej Mensfeld, a member of the RubyGems security team and developer of Diffend (a supply chain security platform for Ruby). He has detected and reported over 20,000 malicious packages across ecosystems.
In the RubyGems ecosystem specifically, he found over 700 typosquatting gems in 2020 (e.g., rail targeting rails), and in 2022, more than 400 malicious packages were removed. His RubyKaigi 2023 talk "RubyGems on the watch" covers these efforts.
Today, the security team including Maciej reviews gems after release on rubygems.org. Gems found to contain malicious code are removed. A cooldown isn't just about waiting — it becomes effective when combined with this kind of scanning infrastructure.
My current thinking: offer cooldown as an opt-in option in the short term, pursue more technically effective measures longer term.
Enterprise environments want this. Dependabot and Renovate already have equivalent features, so it makes sense to support it at the Bundler level too.
What the spec might look like:
bundle update --cooldown 3 (CLI option)bundle config set cooldown 3 (global config)gem install support for CI/CD environments like GitHub ActionsOpt-in, disabled by default. Users choose based on their own needs.
To make cooldowns actually useful, "has this gem been scanned?" matters as much as "has enough time passed?" On the rubygems.org side, we're considering:
There's also been a suggestion for a "scanned" badge on rubygems.org — worth exploring.
Separately, there's discussion about sandboxing code execution during gem install: ruby/rubygems#9138.
RubyGems and Bundler recently landed a change that separates the download and install phases: ruby/rubygems#9381. This was for performance, but the separation opens the door to running SAST or other verification after download and before install — potentially more effective than cooldown alone.
Cooldown is not a silver bullet. But combined with server-side scanning and metadata on rubygems.org, it can be a meaningful layer of defense. We plan to offer it as an opt-in option in RubyGems/Bundler.
If you have thoughts, join the GitHub Discussion.
gemmaI ported the whole Gemma-4 family — E2B, E4B, 12B, 31B, and the 26B-A4B MoE — to run on...
communityHey DEV, I'm Tobore. Let's actually connect. I've been on here for a while now, mostly writing and...
ai(yep, kinda clickbait, just for the funsies 😊) At the beginning of the year, I relaunched my...
aiMy laptop was sitting idle with the fan at full tilt. Nothing was running that I knew of. The culprit...
githubactionsI Built a Thing! TL;DR — Google Gemini-based Pull Request reviews and Issue Triaging for...
aiI've been hearing the word "harness" thrown around a lot lately. I assumed it just meant "the IDE" or...