<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>RubyGems Blog</title>
 <link href="https://blog.rubygems.org/atom.xml" rel="self"/>
 <link href="https://blog.rubygems.org/"/>
 <updated>2026-04-30T04:52:44+00:00</updated>
 <id>https://blog.rubygems.org/</id>
 <author>
   <name>RubyGems Team</name>
   <email>support@rubygems.org</email>
 </author>

 
 <entry>
   <title>4.0.11 Released</title>
   <link href="https://blog.rubygems.org/2026/04/30/4.0.11-released.html"/>
   <updated>2026-04-30T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/04/30/4.0.11-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.11 includes enhancements and Bundler 4.0.11 includes enhancements, bug fixes and documentation.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.11
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Add commented-out rubygems_mfa_required to bundle gem template. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9487&quot;&gt;#9487&lt;/a&gt; by MatheusRich&lt;/li&gt;
  &lt;li&gt;Clarify the name and meaning of the first argument to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem spec&lt;/code&gt;. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9476&quot;&gt;#9476&lt;/a&gt; by eregon&lt;/li&gt;
  &lt;li&gt;Installs bundler 4.0.11 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Update gem creation guide URL to rubygems.org. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9500&quot;&gt;#9500&lt;/a&gt; by nissyi-gh&lt;/li&gt;
  &lt;li&gt;Lock the checksum of Bundler itself in the lockfile. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9366&quot;&gt;#9366&lt;/a&gt; by Edouard-chin&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix installing gems with native extensions + transitive dependencies. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9477&quot;&gt;#9477&lt;/a&gt; by nicholasdower&lt;/li&gt;
  &lt;li&gt;Fix the bundler version not being updated in dev/test lockfile. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9463&quot;&gt;#9463&lt;/a&gt; by Edouard-chin&lt;/li&gt;
  &lt;li&gt;Ensure the release CI doesn’t break due to the Bundler checksum feature. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9436&quot;&gt;#9436&lt;/a&gt; by Edouard-chin&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;documentation&quot;&gt;Documentation:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix formatting for BUNDLE_PREFER_PATCH variable in man page. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9474&quot;&gt;#9474&lt;/a&gt; by toy&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.11.tgz&lt;br /&gt;
95fe9d9d5293d022ceb29afac56eee4e2d46f901de309ab46915ff84d5ec68e8&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.11.zip&lt;br /&gt;
1b5800bf8b94d0ac4027d71efe8eace3d1ec24442397731cd0c6b16ecfa30163&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.11.gem&lt;br /&gt;
d851e6dfc3d1984952c1f6129798472baa899d3ad84ea9eb687cd1237b341068&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Scaling Ruby&apos;s defenses with AI</title>
   <link href="https://blog.rubygems.org/2026/04/29/scaling-rubys-defenses-with-ai.html"/>
   <updated>2026-04-29T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/04/29/scaling-rubys-defenses-with-ai</id>
   <author><name>Colby Swandale</name></author>
   <content type="html">&lt;p&gt;On April 23rd, we submitted a vulnerability report to the &lt;a href=&quot;https://github.com/sparklemotion/nokogiri&quot;&gt;Nokogiri&lt;/a&gt; maintainers. It was the first one our team has filed using AI-assisted scanning. The maintainers accepted the report and published it as &lt;a href=&quot;https://github.com/sparklemotion/nokogiri/security/advisories/GHSA-c4rq-3m3g-8wgx&quot;&gt;GHSA-c4rq-3m3g-8wgx&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The same week, news broke that Mythos, Anthropic’s most capable security model, had been accessed by unauthorized users through a third-party vendor. According to Anthropic, Mythos has identified thousands of zero-day vulnerabilities across every major operating system and web browser, &lt;a href=&quot;https://red.anthropic.com/2026/mythos-preview/&quot;&gt;including a 17-year-old remote code execution flaw in FreeBSD and a 27-year-old bug in OpenBSD&lt;/a&gt;. Two stories on the same shift, one from each side of it. The capability gap between attackers and defenders just widened, and most open source ecosystems have nothing to close it with.&lt;/p&gt;

&lt;p&gt;Anthropic is bringing some open source maintainers into &lt;a href=&quot;https://www.anthropic.com/glasswing&quot;&gt;Project Glasswing&lt;/a&gt;. Ruby is on the list, and agreements signed, but the access is not live yet. We cannot afford to be on the wrong side of that gap.&lt;/p&gt;

&lt;p&gt;We have been working on the defender side. &lt;a href=&quot;https://rubygems.org&quot;&gt;RubyGems&lt;/a&gt; hosts roughly 190,000 gems, and you cannot audit them all. The &lt;a href=&quot;https://openssf.org/projects/criticality-score/&quot;&gt;OpenSSF Criticality Score&lt;/a&gt; lets us focus on the gems whose compromise would cascade through the rest of the ecosystem. We’re looking at those first.&lt;/p&gt;

&lt;p&gt;We are using Claude Opus 4.7 to surface candidate vulnerabilities. A human reviewer triages, verifies, and writes up every finding before anything reaches a maintainer. None of this work happens without backing. &lt;a href=&quot;https://alpha-omega.dev/&quot;&gt;Alpha Omega&lt;/a&gt;, a project of the &lt;a href=&quot;https://openssf.org&quot;&gt;OpenSSF&lt;/a&gt; at the Linux Foundation, is &lt;a href=&quot;https://www.linuxfoundation.org/press/linux-foundation-announces-12.5-million-in-grant-funding-from-leading-organizations-to-advance-open-source-security&quot;&gt;sponsoring this work&lt;/a&gt;. Anthropic is providing the model access we need to operate at the scale it needs.&lt;/p&gt;

&lt;p&gt;The bug we found in Nokogiri is a regex backtracking pathology in the CSS tokenizer. A short, unterminated attribute selector could hang the Ruby process indefinitely because the tokenizer’s regex tries to interpret each escape sequence two different ways and explores an exponential number of possibilities before giving up. Every public Nokogiri CSS entry point routes through this tokenizer. Most large consumers (Rails, Capybara, Loofah) pass developer-written selectors and were unaffected. But any application that lets user input flow into a CSS selector (scrapers, feed readers) was exposed to an unauthenticated denial-of-service via a payload small enough to fit in a request parameter.&lt;/p&gt;

&lt;p&gt;ReDoS bugs are a sweet spot for model-assisted finding. They are hard to spot by reading code and easy to verify by running them. Opus 4.7 flagged the ambiguous STRING rule in the CSS tokenizer and proposed a payload to exercise it: an unterminated attribute selector followed by a run of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;\a&lt;/code&gt; escape sequences. I ran it. Parsing took 6ms at fifteen escape sequences and timed out past five seconds at twenty-four. Each added escape roughly quadrupled the runtime, which is what catastrophic backtracking looks like. I wrote up the report. The Nokogiri maintainers accepted it, patched the bug, and published the advisory. The fix is in.&lt;/p&gt;

&lt;p&gt;Open source maintainers are already drowning in AI-generated security reports that don’t hold up. Each one wastes a maintainer’s day and makes the next legitimate report harder to act on. We are not going to be part of that.&lt;/p&gt;

&lt;p&gt;Opus 4.7 is the most capable model we have access to right now, and it produced a real advisory in one of the most widely used gems in the ecosystem. We are working with Anthropic to gain access to Mythos through Project Glasswing. We did not need to wait for it to find this bug, and we will not wait to find the next one.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://rubycentral.org&quot;&gt;RubyCentral&lt;/a&gt; is hiring a small team of security engineers to scale this work. The job is to run AI-assisted reviews against the most critical gems on rubygems.org, verify findings, and earn the kind of relationship with maintainers where an advisory from us is taken seriously and acted on quickly. If you have done open source security work in any ecosystem and want to do it at scale, we would like to hear from you. Please reach out to &lt;a href=&quot;mailto:oss@rubycentral.org&quot;&gt;oss@rubycentral.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We submitted our first report on April 23rd. There are 190,000 more gems to look at.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Update, 30 April 2026:&lt;/strong&gt; An earlier version of this post said &lt;em&gt;“Ruby is not in yet”&lt;/em&gt; in reference to Project Glasswing. We have been invited into the program, but the access is not live yet. The line has been clarified to reflect that.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>rubygems.org has a public roadmap</title>
   <link href="https://blog.rubygems.org/2026/04/15/rubygems-org-has-a-public-roadmap.html"/>
   <updated>2026-04-15T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/04/15/rubygems-org-has-a-public-roadmap</id>
   <author><name>Colby Swandale</name></author>
   <content type="html">&lt;p&gt;&lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; has been a busy project. This past year we shipped formal policies for the first time in the registry’s history, launched the Organizations private beta, and made some meaningful security improvements to how gems get validated and how compromised passwords get caught. A lot of that work happened quietly. If you wanted to know where things were headed, you had to catch the right conference talk or subscribe to the right newsletter, and even then you’d only get pieces. The roadmap puts it in one place.&lt;/p&gt;

&lt;p&gt;The roadmap covers work at different stages, from Organizations moving toward general availability to longer-horizon work on security tooling, gem archival, and acceptable use policies. The full list is on &lt;a href=&quot;https://github.com/orgs/rubygems/projects/21&quot;&gt;the board&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As the registry has grown, the stakes of each change have grown with it. Those changes ripple out to gem authors, client maintainers, and anyone who depends on the ecosystem being stable. Getting that right requires input from people outside the core team. Contributors from both the RubyGems client team and Shopify are already working with us on making native gems a better experience for the Ruby community. A public roadmap makes more of that possible.&lt;/p&gt;

&lt;p&gt;If you see something on the &lt;a href=&quot;https://github.com/orgs/rubygems/projects/21&quot;&gt;roadmap&lt;/a&gt; that affects your work, leave a comment on the issue. If something’s missing that you think should be there, &lt;a href=&quot;https://github.com/rubygems/roadmap/issues/new&quot;&gt;open an issue&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The roadmap is public now. We’re curious what the community does with it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Protecting rubygems.org from the outside in: DoS prevention and compromised passwords</title>
   <link href="https://blog.rubygems.org/2026/04/09/protecting-rubygems-from-the-outside-in.html"/>
   <updated>2026-04-09T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/04/09/protecting-rubygems-from-the-outside-in</id>
   <author><name>Colby Swandale</name></author>
   <content type="html">&lt;p&gt;Every gem published to &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; ends up running on someone’s computer. It’s up to &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; to ensure that each gem contains what it claims, that its metadata is well-formed, and that the person who pushed it is who they say they are.&lt;/p&gt;

&lt;p&gt;We’ve been chipping away at that. Over the past few months, we shipped two changes that tighten &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt;’s defences at very different layers: stronger validation of gem contents at push time, and integration with Have I Been Pwned to catch compromised passwords at login.&lt;/p&gt;

&lt;h2 id=&quot;what-rubygemsorg-checks-when-you-gem-push&quot;&gt;What &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; checks when you gem push&lt;/h2&gt;

&lt;p&gt;A RubyGem is actually just a regular tar file, which contains 3 sections: the code, metadata, and checksums, which you can inspect for yourself.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;gem fetch rails
Fetching rails-8.1.3.gem
Downloaded rails-8.1.3

&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;tar&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-xvf&lt;/span&gt; rails-8.1.3.gem
x metadata.gz
x data.tar.gz
x checksums.yaml.gz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; closely inspects all 3 of these files when a gem is published, but the ones we’re looking at are the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metadata&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;checksums.yaml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;checksums.yaml&lt;/code&gt; certifies the integrity hash of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data.tar.gz&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metadata.gz&lt;/code&gt; with a sha256 after &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem build&lt;/code&gt;. If someone tampers with the code directly, the checksums won’t match and &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; rejects the push immediately. Checksums are the easy part.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;metadata.gz&lt;/code&gt; has the serialised YAML of the gem metadata, generated from the gemspec during &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem build&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;s&quot;&gt;--- !ruby/object:Gem::Specification&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;rails&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;!ruby/object:Gem::Version&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;8.1.3&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;platform&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;ruby&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;authors&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;David Heinemeier Hansson&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;bindir&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;bin&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;cert_chain&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;1980-01-02 00:00:00.000000000 Z&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;dependencies&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;!ruby/object:Gem::Dependency&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;activesupport&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;requirement&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;!ruby/object:Gem::Requirement&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;requirements&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;=&apos;&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;!ruby/object:Gem::Version&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;8.1.3&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;:runtime&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;prerelease&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;version_requirements&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;!ruby/object:Gem::Requirement&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;requirements&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;=&apos;&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;!ruby/object:Gem::Version&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;8.1.3&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When a gem is pushed, &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; deserialises the YAML and reconstructs a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Specification&lt;/code&gt; object from it. It then validates the result, checking that the name and version are well-formed, that the declared dependencies are valid, that the person pushing is authorised. This is where gem validation gets complex.&lt;/p&gt;

&lt;h2 id=&quot;exploiting-the-validation-process&quot;&gt;Exploiting the validation process&lt;/h2&gt;

&lt;p&gt;This process of reconstructing the gemspec YAML into a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Specification&lt;/code&gt; object invites a class of exploitation called &lt;a href=&quot;https://owasp.org/www-community/vulnerabilities/Insecure_Deserialization&quot;&gt;insecure deserialisation&lt;/a&gt; that would allow a crafted YAML to attack &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This isn’t a theoretical concern. In 2017, a &lt;a href=&quot;https://blog.rubygems.org/2017/10/09/unsafe-object-deserialization-vulnerability.html&quot;&gt;security researcher discovered&lt;/a&gt; that rubygems.org was using a bare &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YAML.load&lt;/code&gt; to deserialise checksums inside gem files, a vulnerability that had potentially been present since 2012. The team patched it within hours by switching to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YAML.safe_load&lt;/code&gt;, which restricts which Ruby objects can be instantiated from a document. But that only narrowed the problem. Even with a precise allowlist of classes and objects, malicious gems could still exploit the deserialisation process to exhaust memory or CPU before any validation even ran, causing rubygems.org servers to stop working.&lt;/p&gt;

&lt;h2 id=&quot;validating-gems-without-gemspecification&quot;&gt;Validating gems without &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Specification&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;The fix was to stop trusting the YAML to tell &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; what to do with itself.&lt;/p&gt;

&lt;p&gt;This was largely &lt;a href=&quot;https://bsky.app/profile/tenderlove.dev&quot;&gt;Aaron Patterson’s&lt;/a&gt; (tenderlove) work. He designed and built the AST-based approach from the ground up. Rather than handing the document to Ruby and letting it materialise objects, we traverse the parsed tree ourselves and extract only the values we expect to find. The YAML never gets to decide what gets instantiated. We also validate the structure against a schema derived from the real thing: Aaron audited all 180,000 gems published on &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; and built a tool to validate them against it. Some very old gems turned up edge cases we deliberately chose not to handle. If those gems were pushed today, they’d be rejected, but these gems that haven’t seen a new version in years almost certainly never will be. His contribution here is greatly appreciated.&lt;/p&gt;

&lt;p&gt;The result is that an entire class of exploitation (using malformed metadata to attack the push endpoint itself) is no longer possible. The attack surface doesn’t exist anymore.&lt;/p&gt;

&lt;h2 id=&quot;compromised-passwords-and-the-supply-chain&quot;&gt;Compromised passwords and the supply chain&lt;/h2&gt;

&lt;p&gt;Gem validation protects &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; from what gets pushed. But there’s a separate persistent threat: who’s doing the pushing.&lt;/p&gt;

&lt;p&gt;Package registries are high-value targets for credential stuffing. If an attacker gets hold of a developer’s reused password from an unrelated breach, they can log in as that developer and push a malicious version of a legitimate gem. The code is signed by a trusted account. The checksums match. Everything looks right, because as far as &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; can tell, it is.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://haveibeenpwned.com&quot;&gt;Have I Been Pwned&lt;/a&gt; (HIBP) is a service run by security researcher &lt;a href=&quot;https://www.troyhunt.com&quot;&gt;Troy Hunt&lt;/a&gt; that tracks passwords exposed in known data breaches. At the time of writing, it contains over 10 billion compromised passwords. &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; now checks against it at login, registration and password resets.&lt;/p&gt;

&lt;h2 id=&quot;checking-passwords-without-exposing-them&quot;&gt;Checking passwords without exposing them&lt;/h2&gt;

&lt;p&gt;The obvious concern with checking your password against a third-party service is privacy. &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; never sends your password, or even a full hash of it, to HIBP.&lt;/p&gt;

&lt;p&gt;Instead, it uses &lt;a href=&quot;https://www.troyhunt.com/understanding-have-i-been-pwneds-use-of-sha-1-and-k-anonymity/&quot;&gt;HIBP’s k-anonymity model&lt;/a&gt;. When you log in, &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; computes a SHA-1 hash of your password and sends only the first 5 characters of that hash to the HIBP API. HIBP returns a list of all hashed passwords in its database that start with those 5 characters. &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; then checks that list locally. Your full password hash never leaves our servers.&lt;/p&gt;

&lt;p&gt;If your password appears in the results, &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; blocks the session and shows a warning explaining your password has been found in a known breach. You’ll need to reset your password before you can log in again.&lt;/p&gt;

&lt;p&gt;Since shipping, it’s detected 1,166 accounts with compromised passwords. Because rubygems.org hashes passwords with bcrypt, we’ve never been able to inspect the strength of passwords in the database directly. This is the first real window into how widespread the problem is, and a way to start course correcting it.&lt;/p&gt;

&lt;h2 id=&quot;shipping-the-work&quot;&gt;Shipping the work&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; serves almost a billion gem downloads every single day. Every Ruby application, from side projects to the infrastructure powering large parts of the internet, depends on the integrity of what we distribute.&lt;/p&gt;

&lt;p&gt;These two changes address the supply chain at different layers: one at the moment a gem is built and pushed, the other at the moment a person logs in. Neither is glamorous. Validating YAML ASTs and hashing password prefixes don’t ship in a splash announcement. But this is the work: closing specific, real attack vectors before someone finds them for you. If you want to follow along or get involved, everything happens in the open at &lt;a href=&quot;https://github.com/rubygems/rubygems.org&quot;&gt;github.com/rubygems/rubygems.org&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>4.0.10 Released</title>
   <link href="https://blog.rubygems.org/2026/04/08/4.0.10-released.html"/>
   <updated>2026-04-08T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/04/08/4.0.10-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.10 includes enhancements and bug fixes and Bundler 4.0.10 includes enhancements and bug fixes.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.10
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Ignore warnings with spec different platforms. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8508&quot;&gt;#8508&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Better algorithm for sorting gem version. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9421&quot;&gt;#9421&lt;/a&gt; by Edouard-chin&lt;/li&gt;
  &lt;li&gt;Update SPDX license list as of 2026-02-20. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9434&quot;&gt;#9434&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Installs bundler 4.0.10 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Register native extension files in default spec map. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9431&quot;&gt;#9431&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Fix NoMethodError in Gem.try_activate when activation conflicts occur. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9404&quot;&gt;#9404&lt;/a&gt; by hsbt&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Ignore warnings with spec different platforms. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8508&quot;&gt;#8508&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Improve error message when current platform is not in lockfile. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9439&quot;&gt;#9439&lt;/a&gt; by 55728&lt;/li&gt;
  &lt;li&gt;Cache package version selection. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9410&quot;&gt;#9410&lt;/a&gt; by Edouard-chin&lt;/li&gt;
  &lt;li&gt;Check happy path first when comparing gem version. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9417&quot;&gt;#9417&lt;/a&gt; by Edouard-chin&lt;/li&gt;
  &lt;li&gt;[feature] default_cli_command for config what command bundler runs when no specific command is provided. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8886&quot;&gt;#8886&lt;/a&gt; by jonbarlo&lt;/li&gt;
  &lt;li&gt;Introduce a fast path for comparing Gem::Version. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9414&quot;&gt;#9414&lt;/a&gt; by Edouard-chin&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes-1&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Restore rb_sys dependency for Rust. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9416&quot;&gt;#9416&lt;/a&gt; by bangseongbeom&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.10.tgz&lt;br /&gt;
6a225b7a8883de45d90c9b3f7ee14391759b286030ba1d1d77588cd7282e6cc7&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.10.zip&lt;br /&gt;
edbb019691ef32e5e086595f54e1bc24bcfe5b9fe77e27aa893c7c752ef190d9&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.10.gem&lt;br /&gt;
bd9dcd20076e809467739c868df95bcd628744f63e3b63d9df169d6223dabf6d&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Temporarily disabling language support on rubygems.org</title>
   <link href="https://blog.rubygems.org/2026/04/07/temporarily-disabling-language-support.html"/>
   <updated>2026-04-07T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/04/07/temporarily-disabling-language-support</id>
   <author><name>Colby Swandale</name></author>
   <content type="html">&lt;p&gt;I’m one of the operators of &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt;. Here’s what’s been happening over the past week, and a temporary change we’re making as a result.&lt;/p&gt;

&lt;p&gt;For the past seven days, &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; has been under sustained bot traffic from many different sources scraping data from every published gem. The volume has been large enough to force the site offline while we respond. The bots are deliberately bypassing the Fastly cache, hitting our origin servers directly.&lt;/p&gt;

&lt;p&gt;The primary target has been our language locale pages, the translated versions of &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt;. Unfortunately, the locale system wasn’t designed to cache easily through a CDN. To protect site stability, we’re temporarily disabling language support while we rearchitect how locale pages are cached.&lt;/p&gt;

&lt;p&gt;We’ll restore language support as soon as we have caching in place that can handle this volume. Thank you for your patience.&lt;/p&gt;

&lt;p&gt;P.S. if you need gem and version data for a project, we publish regular database exports at &lt;a href=&quot;https://rubygems.org/pages/data&quot;&gt;https://rubygems.org/pages/data&lt;/a&gt;. We strongly recommend using those instead of scraping &lt;a href=&quot;https://rubygems.org&quot;&gt;rubygems.org&lt;/a&gt; directly.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>4.0.9 Released</title>
   <link href="https://blog.rubygems.org/2026/03/25/4.0.9-released.html"/>
   <updated>2026-03-25T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/03/25/4.0.9-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.9 includes enhancements, bug fixes and documentation and Bundler 4.0.9 includes enhancements and bug fixes.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.9
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix: include owner role in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem owner&lt;/code&gt;. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9403&quot;&gt;#9403&lt;/a&gt; by gjtorikian&lt;/li&gt;
  &lt;li&gt;Installs bundler 4.0.9 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix: Ensure trailing slash is added to source URIs added via gem sources. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9055&quot;&gt;#9055&lt;/a&gt; by zirni&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;documentation&quot;&gt;Documentation:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;[DOC] Fix link. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9409&quot;&gt;#9409&lt;/a&gt; by BurdetteLamar&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Check the git version only &lt;strong&gt;once&lt;/strong&gt; per &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt;. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9406&quot;&gt;#9406&lt;/a&gt; by Edouard-chin&lt;/li&gt;
  &lt;li&gt;Normalize the number of workers when performing parallel operations. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9400&quot;&gt;#9400&lt;/a&gt; by Edouard-chin&lt;/li&gt;
  &lt;li&gt;Add exponential backoff to bundler retries. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9163&quot;&gt;#9163&lt;/a&gt; by ChrisBr&lt;/li&gt;
  &lt;li&gt;Introduce a priority queue. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9389&quot;&gt;#9389&lt;/a&gt; by Edouard-chin&lt;/li&gt;
  &lt;li&gt;Split the download and install process of a gem. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9381&quot;&gt;#9381&lt;/a&gt; by Edouard-chin&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes-1&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Retry git fetch without –depth for dumb HTTP transport. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9405&quot;&gt;#9405&lt;/a&gt; by hsbt&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.9.tgz&lt;br /&gt;
39b1e2c878946e420116c3c26e4e708c0ddbdf7cd4a13c48dd0fc0774c7add8d&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.9.zip&lt;br /&gt;
d77dfd4baabcdc5b0a268f79332239bbbe2647f78d40778c243beace61d856a6&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.9.gem&lt;br /&gt;
e1c0b84abaf481a4e0553d666986156090399afcc099aa18cac6fabbddc45514&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>4.0.8 Released</title>
   <link href="https://blog.rubygems.org/2026/03/11/4.0.8-released.html"/>
   <updated>2026-03-11T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/03/11/4.0.8-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.8 includes enhancements and documentation and Bundler 4.0.8 includes enhancements and bug fixes.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Use JSON for cargo metadata parsing. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9373&quot;&gt;#9373&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Fix NameError in Gem::Request.get_proxy_from_env when requiring
rubygems/request directly. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9362&quot;&gt;#9362&lt;/a&gt; by afurm&lt;/li&gt;
  &lt;li&gt;Installs bundler 4.0.8 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;documentation&quot;&gt;Documentation:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Unify Compact Index API naming. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9372&quot;&gt;#9372&lt;/a&gt; by simi&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Add a new Bundler config to control how many specs are fetched &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9363&quot;&gt;#9363&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Restrict GitHub Actions workflow permissions for newgem &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9361&quot;&gt;#9361&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix plugin new version not registering &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9355&quot;&gt;#9355&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.8.tgz&lt;br /&gt;
b18663def26384e467f2594bf27190c580771df0ca7ba444afa1d76609881813&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.8.zip&lt;br /&gt;
205198b7513521d2ba358e6b4df88924601be89b329d2b49fc0c0f55e41b167b&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.8.gem&lt;br /&gt;
3465eef02174a0bbad1f8d343eff67a33e7fc6eeb84cf69f1d1ca77ce565045c&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>4.0.7 Released</title>
   <link href="https://blog.rubygems.org/2026/02/25/4.0.7-released.html"/>
   <updated>2026-02-25T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/02/25/4.0.7-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.7 includes enhancements and documentation and Bundler 4.0.7 includes enhancements, bug fixes and documentation.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.7
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Add Gem.disable_system_update_message in setup.rb. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9020&quot;&gt;#9020&lt;/a&gt; by hyuraku&lt;/li&gt;
  &lt;li&gt;Print message when signing in with an existing API key. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9312&quot;&gt;#9312&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Installs bundler 4.0.7 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;documentation&quot;&gt;Documentation:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Document gemspecs must be deterministic. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9321&quot;&gt;#9321&lt;/a&gt; by fxn&lt;/li&gt;
  &lt;li&gt;Remove “##” from a comment to require. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9306&quot;&gt;#9306&lt;/a&gt; by tompng&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Don’t check whether a plugin needs to be installed: &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9328&quot;&gt;#9328&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;[rust gem] Major improvements for gem scaffolding (rebased) &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8455&quot;&gt;#8455&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix(bundler): only preload git sources for requested groups &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9234&quot;&gt;#9234&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Raise error when gem contains capital letters &lt;a href=&quot;https://github.com/ruby/rubygems/pull/5432&quot;&gt;#5432&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix Bundler crashing when it tries to install plugin: &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9335&quot;&gt;#9335&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Run git operations in parallel (take 2): &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9323&quot;&gt;#9323&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Add support for help flag in plugin commands &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9263&quot;&gt;#9263&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;documentation-1&quot;&gt;Documentation:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;[DOC] Fix link in Bundler &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9315&quot;&gt;#9315&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.7.tgz&lt;br /&gt;
80578da300518eca7abebb4c89ad26e5751ac8a77919f246b4fed67609f919e3&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.7.zip&lt;br /&gt;
e6c46b17a7495a8fdeef91de1bf76d225e0ec4f164e6b88ea5f38f43ca531ba8&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.7.gem&lt;br /&gt;
273c1291b85cd5882b10242e3c8463995164bcb2d37c2a92347ecd04fa5ae99a&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Organizations Private Beta</title>
   <link href="https://blog.rubygems.org/2026/02/16/organizations-beta.html"/>
   <updated>2026-02-16T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/02/16/organizations-beta</id>
   <author><name>Marty Haught</name></author>
   <content type="html">&lt;p&gt;We’re excited to announce that the Organizations feature for RubyGems.org has entered private beta!&lt;/p&gt;

&lt;h3 id=&quot;a-long-time-coming&quot;&gt;A long time coming&lt;/h3&gt;

&lt;p&gt;We started the Organizations work back in 2024 as announced in our &lt;a href=&quot;https://blog.rubygems.org/2024/07/23/june-rubygems-updates.html&quot;&gt;June 2024 RubyGems update&lt;/a&gt;, where we shared our plans to bring organization accounts, memberships, and more precise gem permission controls to the platform. Since then, the team has been steadily building out the feature from refactoring our permissions models to introducing &lt;a href=&quot;https://blog.rubygems.org/2024/11/20/october-rubygems-updates.html&quot;&gt;ownership roles&lt;/a&gt;, building the &lt;a href=&quot;https://blog.rubygems.org/2024/12/20/november-rubygems-updates.html&quot;&gt;organization onboarding experience&lt;/a&gt;, and updating our &lt;a href=&quot;https://guides.rubygems.org/organizations/getting-started/&quot;&gt;guides&lt;/a&gt; to cover how Organizations work.  After more than a year of development, Organizations is ready for real-world feedback.&lt;/p&gt;

&lt;h3 id=&quot;join-the-private-beta&quot;&gt;Join the Private Beta&lt;/h3&gt;

&lt;p&gt;While ready for testing, it’s not ready for general release.  We’re still refining some workflows and welcome feedback on any gaps you encounter.  After talking to our friends at PyPI, we know that a public rollout of a feature like this will not be trivial.  Instead, we’re adding a limited number of private beta organizations to help us refine the feature.  We’ve already onboarded four organizations, with another four accepted into the program.&lt;/p&gt;

&lt;p&gt;We envision Organizations primarily serving publishers with extended teams who manage gem publishing workflows. We’re especially interested in organizations that approach publishing in unusual or non-standard ways as these edge cases will help us build a better feature for everyone.  If you’re interested in participating, please complete our &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScDimnhTz7u0o6kpFJEmvu6Dn-IJz5kXaW1vu5sV5qxVzoAkQ/viewform?usp=header&quot;&gt;interest form&lt;/a&gt; to get started.&lt;/p&gt;

&lt;h3 id=&quot;whats-next&quot;&gt;What’s Next&lt;/h3&gt;

&lt;p&gt;We’ll be iterating on the feature based on what we learn from beta participants. Our goal is to open Organizations to the broader community once we’re confident the experience is solid. As we don’t have an anticipated timeline, stay tuned for updates.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>4.0.6 Released</title>
   <link href="https://blog.rubygems.org/2026/02/05/4.0.6-released.html"/>
   <updated>2026-02-05T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/02/05/4.0.6-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.6 includes enhancements and Bundler 4.0.6 includes bug fixes and documentation.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Update vendored resolv to 0.7.0. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9298&quot;&gt;#9298&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Installs bundler 4.0.6 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix gzip cache corruption when recovering from HTTP 416 responses &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9272&quot;&gt;#9272&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fallback git/path sources to default source &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9301&quot;&gt;#9301&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Ensure revision is always re-resolved in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git_proxy.rb&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9294&quot;&gt;#9294&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;documentation&quot;&gt;Documentation:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Clarify local gem override docs to require git-sourced gems &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9305&quot;&gt;#9305&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.6.tgz&lt;br /&gt;
98049c08fb8a94a12cc10c43ef4997faec76c4c6f328733a938f1ca6aa2c811e&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.6.zip&lt;br /&gt;
5dc4e49b1399a99465bf1ea4c188d920fbe28e0b7193a3dc44891216e1b1d5ff&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.6.gem&lt;br /&gt;
bbd93b2e1410ebc41d22e07c1b3346d03b633b09b12421bf0b776ad5c9a3acc4&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>4.0.5 Released</title>
   <link href="https://blog.rubygems.org/2026/01/29/4.0.5-released.html"/>
   <updated>2026-01-29T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/01/29/4.0.5-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.5 includes enhancements, bug fixes and documentation and Bundler 4.0.5 includes enhancements and bug fixes.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Removed unused deprecate loading. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9266&quot;&gt;#9266&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Validate executable names for invalid characters. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9257&quot;&gt;#9257&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Installs bundler 4.0.5 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix RubyGems not able to require the right gem:. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9246&quot;&gt;#9246&lt;/a&gt; by Edouard-chin&lt;/li&gt;
  &lt;li&gt;Remove special behavior for rake. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9245&quot;&gt;#9245&lt;/a&gt; by JasonLunn&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;documentation&quot;&gt;Documentation:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Added another usage of pristine command. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9255&quot;&gt;#9255&lt;/a&gt; by hsbt&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix Bundler that re-exec $0 when a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;version&lt;/code&gt; is present in the config: &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9249&quot;&gt;#9249&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes-1&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Only use parent source with Git and Path sources &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9269&quot;&gt;#9269&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.5.tgz&lt;br /&gt;
f3d3be045119301be1f2dbb4d6ac018a76f2969a367cf072c94ce06392961c75&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.5.zip&lt;br /&gt;
a890bd73dd7f9382cdf9e89655f8b626eac919080a8e67d5cfffb74ee5bd24d4&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.5.gem&lt;br /&gt;
00f14f539debafb3c207cf4d5af097bd458bc57d12538354275da3ebdc8276a0&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>4.0.4 Released</title>
   <link href="https://blog.rubygems.org/2026/01/15/4.0.4-released.html"/>
   <updated>2026-01-15T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2026/01/15/4.0.4-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.4 includes enhancements and bug fixes and Bundler 4.0.4 includes enhancements and bug fixes.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Remove date require from rebuild command. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9232&quot;&gt;#9232&lt;/a&gt; by jeremyevans&lt;/li&gt;
  &lt;li&gt;Installs bundler 4.0.4 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Add a missing “require ‘etc’” statement:. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9242&quot;&gt;#9242&lt;/a&gt; by Edouard-chin&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Validate more options for add sub-command &lt;a href=&quot;https://github.com/ruby/rubygems/pull/5905&quot;&gt;#5905&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Support Ruby 4.1 &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9219&quot;&gt;#9219&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes-1&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix dependency source bug in bundler &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9213&quot;&gt;#9213&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Retain current bundler version on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle clean&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9221&quot;&gt;#9221&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.4.tgz&lt;br /&gt;
89668a8eaba1a53c6f525221ab58cfe901dae41765b6f5e7ad2bd9c3119421e8&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.4.zip&lt;br /&gt;
eec3ac3fb8bc00ec8797c495b4aaa5930ad0539304bbe419761f8a4194ab29a8&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.4.gem&lt;br /&gt;
3c9f05b54dacb41ac6385f3793566a7b0ad7a0519fc412aa9bebdb181ed1dbd8&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>What&apos;s New in RubyGems/Bundler 4</title>
   <link href="https://blog.rubygems.org/2025/12/26/whats-new-rubygems-bundler4.html"/>
   <updated>2025-12-26T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2025/12/26/whats-new-rubygems-bundler4</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;&lt;a href=&quot;https://www.ruby-lang.org/en/news/2025/12/25/ruby-4-0-0-released/&quot;&gt;Ruby 4.0.0 was released on December 25, 2025&lt;/a&gt;, and RubyGems/Bundler 4.0.3 is now bundled with Ruby 4.0.0.&lt;/p&gt;

&lt;p&gt;Since &lt;a href=&quot;https://blog.rubygems.org/2025/12/03/upgrade-to-rubygems-bundler-4.html&quot;&gt;my previous post focused on migration and compatibility concerns&lt;/a&gt;, I’d like to highlight some of the exciting new features in this release.&lt;/p&gt;

&lt;h2 id=&quot;parallelization-of-c-extension-gem-builds&quot;&gt;Parallelization of C-extension Gem Builds&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9131&quot;&gt;Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAKEFLAGS=-j&lt;/code&gt; by default before compiling&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When installing gems with C extensions (such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mysql2&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pg&lt;/code&gt;), RubyGems now automatically adds &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAKEFLAGS=-j&lt;/code&gt; to the make command for parallel execution. Users previously had to manually configure this themselves. By leveraging multi-core CPUs by default, installation times are significantly reduced.&lt;/p&gt;

&lt;p&gt;By default, RubyGems uses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Etc.nprocessors + 1&lt;/code&gt;, fully utilizing available CPU cores during compilation. You can override this by setting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAKEFLAGS&lt;/code&gt; explicitly (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAKEFLAGS=-j2&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;While convenient for local development, we discovered after implementation that in containerized environments like CircleCI, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Etc.nprocessors&lt;/code&gt; returns the host server’s CPU count rather than the container’s allocation. This caused failures when jobs were assigned &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-j32&lt;/code&gt; despite having only 2 available CPUs. To address this, we’ve introduced the following improvements.&lt;/p&gt;

&lt;h2 id=&quot;unified-parallel-job-execution-options&quot;&gt;Unified Parallel Job Execution Options&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9171&quot;&gt;Pass down value of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUNDLE_JOBS&lt;/code&gt; to RubyGems before compiling &amp;amp; introduce a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem install -j&lt;/code&gt; flag&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To prevent resource exhaustion in virtual environments, a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-j&lt;/code&gt; flag for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem install&lt;/code&gt; and automatic passing of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUNDLE_JOBS&lt;/code&gt; to RubyGems have been introduced.&lt;/p&gt;

&lt;p&gt;Now when you set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUNDLE_JOBS=4&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; runs with 4-way parallelism, and C extensions are built with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-j4&lt;/code&gt;. In resource-constrained CI environments, specifying 1 or 2 prevents resource exhaustion.&lt;/p&gt;

&lt;p&gt;However, even with these changes, worst-case scenarios remain (where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUNDLE_JOBS=4&lt;/code&gt; could consume up to 16 CPU cores). To address this, we’re exploring a &lt;a href=&quot;https://www.gnu.org/software/make/manual/html_node/POSIX-Jobserver.html&quot;&gt;GNU Make jobserver&lt;/a&gt;—a mechanism where a server controls available CPUs and jobs query it before running.&lt;/p&gt;

&lt;p&gt;While the specifics are still in development, this should eliminate worst-case scenarios. We’ve also learned that Go’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GOMAXPROCS&lt;/code&gt; handles containerized environments like CircleCI by reading CPU info from cgroup:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.ruby-lang.org/issues/21797&quot;&gt;Feature #21797: Improve Etc.nprocessors for cgroup environment&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By incorporating this approach into Ruby core and combining it with a jobserver, we expect to achieve optimal build speeds while fully utilizing available CPUs. Stay tuned!&lt;/p&gt;

&lt;h2 id=&quot;increased-connection-pool-and-efficient-network-communication&quot;&gt;Increased Connection Pool and Efficient Network Communication&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9087&quot;&gt;Increase connection pool to allow for up to 70% speed increase on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The default connection pool for Bundler and RubyGems network requests has been expanded to 5 parallel connections. This improvement reportedly reduces &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; times by up to 70%.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9071&quot;&gt;Adjust the API_REQUEST_LIMIT to make less network roundtrip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additionally, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;API_REQUEST_LIMIT&lt;/code&gt; (which controls batch sizes of dependency information) has increased from 50 to 100, doubling the gems per request. For example, a Gemfile with 400 dependencies now requires just 4 network requests instead of 8.&lt;/p&gt;

&lt;h2 id=&quot;pattern-matching-support-for-gemnametuple-and-gemplatform&quot;&gt;Pattern Matching Support for Gem::NameTuple and Gem::Platform&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9062&quot;&gt;Add pattern matching support to Gem::Platform&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When writing scripts that need to inspect gem names, versions, or platforms, you can now use Ruby’s pattern matching for cleaner and safer logic.&lt;/p&gt;

&lt;p&gt;As shown in the GitHub PR, you can write platform-specific logic cleanly using pattern matching on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Platform&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;platform&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;cpu: &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;x86_64&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;os: &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;linux&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;install_linux_x64&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;cpu: &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;arm64&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;os: &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;darwin&quot;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;install_macos_arm&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pattern matching support for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Version&lt;/code&gt; is still under consideration and may not move forward.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9060&quot;&gt;Add pattern matching support to Gem::Version&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The proposal suggested decomposing versions into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;major&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;minor&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;build&lt;/code&gt; components, but real-world versions include strings like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4.0.0.beta3&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4.0.0.beta.3&lt;/code&gt;. It would be inconsistent for these to equal &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4.0.0&lt;/code&gt;, and equally confusing for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;beta3&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;beta.3&lt;/code&gt; to be treated as equivalent. Additionally, since &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;build&lt;/code&gt; is sometimes called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tiny&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;patch&lt;/code&gt; and lacks a clear definition, I’m hesitant about introducing this feature.&lt;/p&gt;

&lt;h2 id=&quot;json-output-for-bundle-list&quot;&gt;JSON Output for bundle list&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8728&quot;&gt;Introduce &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle list --format=json&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--format=json&lt;/code&gt; option for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle list&lt;/code&gt; makes it easy to integrate Bundler with external tools.&lt;/p&gt;

&lt;p&gt;When analyzing a project’s gem dependencies programmatically (via CI tools, security scanners, etc.), JSON output eliminates the need to parse text, greatly simplifying integration. While Bundler has parsers for Gemfiles and lockfiles, they’re essentially Ruby code or custom formats—so being able to process them with tools like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jq&lt;/code&gt; is a welcome addition.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;bundle list &lt;span class=&quot;nt&quot;&gt;--format&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;json | jq &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;.gems[] | select(.name == &quot;json&quot;) | .version&apos;&lt;/span&gt;
2.18.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;bundle-install-without-generating-a-lockfile&quot;&gt;bundle install Without Generating a Lockfile&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9059&quot;&gt;Add support for lockfile in Gemfile and bundle install –no-lock&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install --no-lock&lt;/code&gt; flag now skips lockfile generation, which is convenient when you want to test dependency resolution without creating or modifying lockfile artifacts.&lt;/p&gt;

&lt;h2 id=&quot;specifying-the-generated-lockfile-name&quot;&gt;Specifying the Generated Lockfile Name&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9111&quot;&gt;Support bundle install –lockfile option&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now specify a custom lockfile name using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install --gemfile=foo --lockfile=bar&lt;/code&gt;. This defaults to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.lock&lt;/code&gt; extension if not specified, but is useful when working with variants like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile.next&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile.rails81&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;creating-go-extension-gems&quot;&gt;Creating Go-extension Gems&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8183&quot;&gt;Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--ext=go&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle gem&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RubyGems’ gem scaffolding and build tools previously supported C and Rust extensions. Support for Go has now been added. You can create a Go-extension gem template with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle gem --ext=go foo&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;using-did_you_mean-for-bundler-typo-checks&quot;&gt;Using did_you_mean for Bundler Typo Checks&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ruby/rubygems/pull/3857&quot;&gt;Use DidYouMean::SpellChecker for gem suggestions in Bundler&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bundler’s typo detection and command suggestions previously used a custom implementation. This has now been updated to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;did_you_mean&lt;/code&gt;, keeping it consistent with other Ruby tools.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;This post highlighted some major new features in RubyGems/Bundler 4.0. The project consists of two main components: the “resolver” (which handles dependency resolution) and the “CLI/UI” (which manages user interaction).&lt;/p&gt;

&lt;p&gt;Historically, RubyGems and Bundler have maintained separate codebases for their resolvers despite performing similar tasks. Looking ahead to version 4.1, we plan to gradually consolidate and unify these components.&lt;/p&gt;

&lt;p&gt;I’m looking forward to work with you all to make RubyGems and Bundler even better in 2026!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>4.0.3 Released</title>
   <link href="https://blog.rubygems.org/2025/12/23/4.0.3-released.html"/>
   <updated>2025-12-23T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2025/12/23/4.0.3-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.3 includes enhancements and documentation and Bundler 4.0.3 includes enhancements.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Installs bundler 4.0.3 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;documentation&quot;&gt;Documentation:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix broken documentation links. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9208&quot;&gt;#9208&lt;/a&gt; by eileencodes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fall back to ruby platform gem when precompiled variant is incompatible &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9211&quot;&gt;#9211&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.3.tgz&lt;br /&gt;
f5f728a40603773eec1a5c0857693485e7a118619f6ae70dcece6c2e719129a0&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.3.zip&lt;br /&gt;
2b8c02560ed846e7e007564a97ef2d1c5b6f77d1f957ed4d4e5635a3083a83b7&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.3.gem&lt;br /&gt;
eeb62154c557a5750f28a30e7361b7d333631db6178cd4ccafe7b3361ffdbb1e&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>4.0.2 Released</title>
   <link href="https://blog.rubygems.org/2025/12/17/4.0.2-released.html"/>
   <updated>2025-12-17T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2025/12/17/4.0.2-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.2 includes enhancements and Bundler 4.0.2 includes enhancements and bug fixes.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Pass down value of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUNDLE_JOBS&lt;/code&gt; to RubyGems before compiling &amp;amp;
introduce a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem install -j&lt;/code&gt; flag. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9171&quot;&gt;#9171&lt;/a&gt; by Edouard-chin&lt;/li&gt;
  &lt;li&gt;Installs bundler 4.0.2 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Support single quotes in mise format ruby version &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9183&quot;&gt;#9183&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Tweak the Bundler’s “X gems now installed message”: &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9194&quot;&gt;#9194&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Allow to show cli_help with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundler&lt;/code&gt; executable &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9198&quot;&gt;#9198&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Allow bundle pristine to work for git gems in the same repo &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9196&quot;&gt;#9196&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.2.tgz&lt;br /&gt;
a5fdbcbd3cbd616360fc9b82d75cdfa1aea3cf1aa357496d8aecce6574d85bf8&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.2.zip&lt;br /&gt;
9f395a4a1c1a6a3a85b94eadc1960d7455818099317ce1111f393a17adb59ae2&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.2.gem&lt;br /&gt;
f9d627eaee40c74d784274aa6ac7d74ddc468223d947f8ade136905944154883&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>4.0.1 Released</title>
   <link href="https://blog.rubygems.org/2025/12/09/4.0.1-released.html"/>
   <updated>2025-12-09T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2025/12/09/4.0.1-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.1 includes enhancements, bug fixes and documentation and Bundler 4.0.1 includes performance, enhancements and bug fixes.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Installs bundler 4.0.1 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fixed unexpected default bundler installation. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9167&quot;&gt;#9167&lt;/a&gt; by hsbt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;documentation&quot;&gt;Documentation:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Update contributing docs with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RGV&lt;/code&gt;. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9155&quot;&gt;#9155&lt;/a&gt; by eileencodes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;performance&quot;&gt;Performance:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Increase connection pool to allow for up to 70% speed increase on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9087&quot;&gt;#9087&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix the config suggestion in the warning for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$ bundle&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9164&quot;&gt;#9164&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix native extension loading in newgem template for RHEL-based systems &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9156&quot;&gt;#9156&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes-1&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix Bundler removing executables after creating them &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9169&quot;&gt;#9169&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.1.tgz&lt;br /&gt;
efbdf2a575544198f0f9516dbffac2b0d576fbb504aea6d52d1976d0db512652&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.1.zip&lt;br /&gt;
98b829062f6f030603ed2243b9d05c6db6718c04b6d8589d68038474ec99adf3&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.1.gem&lt;br /&gt;
c2ff99782fc56f649d04edb3f88bbbb6c50d731d8dc87e2c0670dc79536e5c73&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Upgrading to RubyGems/Bundler 4</title>
   <link href="https://blog.rubygems.org/2025/12/03/upgrade-to-rubygems-bundler-4.html"/>
   <updated>2025-12-03T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2025/12/03/upgrade-to-rubygems-bundler-4</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;We introduced breaking changes in RubyGems/Bundler 4 in order to improve usability, security, and maintainability of the tool. This document describes the changes that you will find when upgrading to RubyGems 4 and Bundler 4, and how to prepare for them while still using Bundler 2.7.&lt;/p&gt;

&lt;h2 id=&quot;rubygems-4-cli-behavior-changes&quot;&gt;RubyGems 4: CLI behavior changes&lt;/h2&gt;

&lt;h3 id=&quot;removed-gem-query-command&quot;&gt;Removed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem query&lt;/code&gt; command&lt;/h3&gt;

&lt;p&gt;Please use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem search&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem list&lt;/code&gt; instead.&lt;/p&gt;

&lt;h3 id=&quot;completely-removed-gem-install---default-feature&quot;&gt;Completely removed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem install --default&lt;/code&gt; feature&lt;/h3&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--default&lt;/code&gt; option was confusing for RubyGems users and caused broken installs.&lt;/p&gt;

&lt;p&gt;This was an unfinished feature originally intended to install gems directly into the Ruby standard library location, but it only generated executables without properly copying library files. This partial implementation led to a complicated environment with no real benefit for users.&lt;/p&gt;

&lt;h2 id=&quot;rubygems-4-api-behavior-changes&quot;&gt;RubyGems 4: API behavior changes&lt;/h2&gt;

&lt;h3 id=&quot;no-replacements-for-removed-deprecated-methods&quot;&gt;No replacements for removed deprecated methods&lt;/h3&gt;

&lt;p&gt;The following deprecated methods have been removed with no replacement:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Specification#has_rdoc&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;has_rdoc=&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;has_rdoc?&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::DependencyInstaller#find_gems_with_sources&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Util.silent_system&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Specification#validate_metadata&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;validate_dependencies&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;validate_permissions&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Specification#default_executable&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Installer#unpack&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;removed-deprecated-gemplatformmatch&quot;&gt;Removed deprecated Gem::Platform.match&lt;/h3&gt;

&lt;p&gt;Please use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Platform.match_spec?&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;match_gem?&lt;/code&gt; instead.&lt;/p&gt;

&lt;h3 id=&quot;removed-deprecated-gembasicspecificationdefault_specifications_dir&quot;&gt;Removed deprecated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::BasicSpecification.default_specifications_dir&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Please use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem.default_specifications_dir&lt;/code&gt; instead.&lt;/p&gt;

&lt;h2 id=&quot;bundler-4-simulation-mode&quot;&gt;Bundler 4 simulation mode&lt;/h2&gt;

&lt;p&gt;In order to prepare for Bundler 4, you can easily configure Bundler 2.7 to behave exactly like Bundler 4 will behave.  To do so, you have three options:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Set the environment variable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUNDLE_SIMULATE_VERSION&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;4&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle config set --global simulate_version 4&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle config set --local simulate_version 4&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From now on in this document we will assume that all three of these configuration options are available, but will only mention &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle config set &amp;lt;option&amp;gt; &amp;lt;value&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The following is a summary of the changes that we introduced in Bundler 4, and why we made those changes. Some of them should be well known already by existing users, because we have been printing deprecation messages for years, but some of them are defaults that were switched in Bundler 4.&lt;/p&gt;

&lt;h2 id=&quot;bundler-4-cli-behavior-changes&quot;&gt;Bundler 4: CLI behavior changes&lt;/h2&gt;

&lt;h3 id=&quot;running-just-bundle-to-mean-bundle-install-is-not-recommended-anymore&quot;&gt;Running just &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle&lt;/code&gt; to mean &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; is not recommended anymore&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Update for version 4.0.1: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;install_or_cli_help&lt;/code&gt; is merged into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;install&lt;/code&gt; for backward compatibility of Bundler 2.x. We recommend using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;install&lt;/code&gt; instead of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;install_or_cli_help&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We changed this default to make Bundler more friendly for new users. We do understand that long time users already know how Bundler works and found it useful that just &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle&lt;/code&gt; defaulted to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Currently, Bundler uses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;install&lt;/code&gt; by default for backward compatibility. This automatically uses &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; or shows help depending on the context.&lt;/p&gt;

&lt;p&gt;If you want to keep the current behavior in the future, you can explicitly configure:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bundle config &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;default_cli_command &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;However, if you want to adopt the new behavior immediately where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle&lt;/code&gt; only shows help, you can configure:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bundle config &lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;default_cli_command cli_help &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Please use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; explicitly in your scripts and documentation, so that everyone is clear about what is happening.&lt;/p&gt;

&lt;h3 id=&quot;flags-passed-to-bundle-install-that-relied-on-being-remembered-across-invocations-have-been-removed&quot;&gt;Flags passed to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; that relied on being remembered across invocations have been removed&lt;/h3&gt;

&lt;p&gt;In particular, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--clean&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--deployment&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--frozen&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--no-prune&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--path&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--shebang&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--system&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--without&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--with&lt;/code&gt; options to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Remembering CLI options has been a source of historical confusion and bug reports, not only for beginners but also for experienced users.&lt;/p&gt;

&lt;p&gt;A CLI tool should not behave differently across exactly the same invocations &lt;em&gt;unless&lt;/em&gt; explicitly configured to do so. This is what configuration is about after all, and things should never be silently configured without the user knowing about it.&lt;/p&gt;

&lt;p&gt;The problem with this behavior was that very common workflows were relying on it. For example, when you ran &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install --without development:test&lt;/code&gt; in production, those flags were persisted in the app’s configuration file and further &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle&lt;/code&gt; invocations would happily ignore development and test gems.&lt;/p&gt;

&lt;p&gt;This magic has been removed from Bundler 4, and you now explicitly need to configure it, either through environment variables, application configuration, or machine configuration. For example, with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle config set --local without development test&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;bundle-viz-has-been-removed-and-extracted-to-a-plugin&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle viz&lt;/code&gt; has been removed and extracted to a plugin.&lt;/h3&gt;

&lt;p&gt;This was the only bundler command requiring external dependencies, both an OS dependency (the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;graphviz&lt;/code&gt; package) and a gem dependency (the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ruby-graphviz&lt;/code&gt; gem). Removing these dependencies made development easier and it was also seen by the bundler team as an opportunity to develop a bundler plugin that is officially maintained by the RubyGems team, and that users can take as a reference to develop their own plugins.&lt;/p&gt;

&lt;p&gt;The new plugin is called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundler-graph&lt;/code&gt; and it is available at &lt;a href=&quot;https://github.com/rubygems/bundler-graph&quot;&gt;https://github.com/rubygems/bundler-graph&lt;/a&gt; now.&lt;/p&gt;

&lt;p&gt;The plugin contains the same code as the old core command, the only difference being that the command is now implemented as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle graph&lt;/code&gt; which is much easier to understand.&lt;/p&gt;

&lt;h3 id=&quot;the-bundle-install-command-no-longer-accepts-a---binstubs-flag&quot;&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; command no longer accepts a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--binstubs&lt;/code&gt; flag.&lt;/h3&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--binstubs&lt;/code&gt; option has been removed from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; and replaced with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle binstubs&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--binstubs&lt;/code&gt; flag would create binstubs for all executables present inside the gems in the project. This was hardly useful since most users only use a subset of all the binstubs available to them. Also, it would force the introduction of a bunch of most likely unused files into source control. Because of this, binstubs now must be created and checked into version control individually.&lt;/p&gt;

&lt;p&gt;If you still want to create binstubs for all gems, you can run:&lt;/p&gt;

&lt;div class=&quot;language-sh highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bundle binstubs &lt;span class=&quot;nt&quot;&gt;--all&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;the-bundle-inject-command-has-been-replaced-with-bundle-add&quot;&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle inject&lt;/code&gt; command has been replaced with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle add&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;We believe the new command fits the user’s mental model better and it supports a wider set of use cases.&lt;/p&gt;

&lt;p&gt;The interface supported by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle inject&lt;/code&gt; works exactly the same in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle add&lt;/code&gt;, so it should be easy to migrate to the new command.&lt;/p&gt;

&lt;h2 id=&quot;bundler-4-gemfile-and-lockfile-behavior-changes&quot;&gt;Bundler 4: Gemfile and lockfile behavior changes&lt;/h2&gt;

&lt;h3 id=&quot;bundler-includes-checksums-in-new-lockfiles-by-default&quot;&gt;Bundler includes checksums in new lockfiles by default&lt;/h3&gt;

&lt;p&gt;We shipped this security feature and turned it on by default, so that everyone benefits from the extra security assurances. So whenever you create a new lockfile, Bundler now includes a CHECKSUMS section.&lt;/p&gt;

&lt;p&gt;Bundler will not automatically add a CHECKSUMS section to existing lockfiles, though, unless explicitly requested through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle lock --add-checksums&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;strict-source-pinning-in-gemfile-is-enforced-by-default&quot;&gt;Strict source pinning in Gemfile is enforced by default&lt;/h3&gt;

&lt;p&gt;In Bundler 4, the source for every dependency is now unambiguously defined, and Bundler refuses to run otherwise.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Multiple global Gemfile sources are no longer supported.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of something like this:&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;https://main_source&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;https://another_source&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;dependency1&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;dependency2&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;do something like this:&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;https://main_source&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;dependency1&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;https://another_source&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;dependency2&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;Global &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git&lt;/code&gt; sources are no longer supported.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of something like this:&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/my/path/with/gems&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;https://my_git_repo_with_gems&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;dependency1&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;dependency2&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;do something like this:&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;dependency1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;path: &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/my/path/with/gems&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;dependency2&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;git: &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;https://my_git_repo_with_gems&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;or use the block forms if you have multiple gems for each source and you want to be a bit DRYer:&lt;/p&gt;

&lt;div class=&quot;language-ruby highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/my/path/with/gems&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# gem &quot;dependency1&quot;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# gem &quot;dependencyn&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;https://my_git_repo_with_gems&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# gem &quot;dependency1&quot;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;# gem &quot;dependencyn&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;change-ruby-and-bundler-version-format&quot;&gt;Change Ruby and Bundler version format&lt;/h3&gt;

&lt;p&gt;In the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RUBY VERSION&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUNDLED WITH&lt;/code&gt; sections of the lockfile, we fixed the three space indentation to be just two spaces, to be consistent with the rest of the lockfile format. and we also removed the patch version from the Ruby version, since it’s not relevant for Ruby versioning policy.&lt;/p&gt;

&lt;h2 id=&quot;bundler-4-cache-behavior-changes&quot;&gt;Bundler 4: Cache behavior changes&lt;/h2&gt;

&lt;h3 id=&quot;git-and-path-gems-are-included-in-vendorcache-by-default&quot;&gt;Git and Path gems are included in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vendor/cache&lt;/code&gt; by default&lt;/h3&gt;

&lt;p&gt;If you have a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vendor/cache&lt;/code&gt; directory (to support offline scenarios, for example), Bundler now includes gems from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git&lt;/code&gt; sources in there.&lt;/p&gt;

&lt;p&gt;We’re unsure why these gems were treated specially so we’ll start caching them normally.&lt;/p&gt;

&lt;h3 id=&quot;bundler-uses-cached-local-data-if-available-when-network-issues-are-found-during-resolution&quot;&gt;Bundler uses cached local data if available when network issues are found during resolution&lt;/h3&gt;

&lt;p&gt;Just trying to provide a more resilient behavior here.&lt;/p&gt;

&lt;h2 id=&quot;bundler-4-api-behavior-changes&quot;&gt;Bundler 4: API behavior changes&lt;/h2&gt;

&lt;h3 id=&quot;bundlerclean_env-bundlerwith_clean_env-bundlerclean_system-and-bundlerclean_exec-have-been-removed&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.clean_env&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.with_clean_env&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.clean_system&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.clean_exec&lt;/code&gt; have been removed&lt;/h3&gt;

&lt;p&gt;All of these helpers ultimately used &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.clean_env&lt;/code&gt; under the hood, which made sure all bundler-related environment variables were removed inside the block it yields.&lt;/p&gt;

&lt;p&gt;After quite a lot of user reports, we noticed that users don’t usually want this but instead want the bundler environment as it was before the current process was started. Thus, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.with_original_env&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.original_system&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.original_exec&lt;/code&gt; were born. They all use the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.original_env&lt;/code&gt; under the hood.&lt;/p&gt;

&lt;p&gt;There are however some specific cases where the good old &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.clean_env&lt;/code&gt; behavior can be useful. For example, when testing Rails generators, you really want an environment where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundler&lt;/code&gt; is out of the picture. This is why we decided to keep the old behavior under a new more clear name, because we figured the word “clean” was too ambiguous. So we introduced &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.unbundled_env&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.with_unbundled_env&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.unbundled_system&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.unbundled_exec&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;bundlerenvironment-has-been-deprecated-in-favor-of-bundlerload&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.environment&lt;/code&gt; has been deprecated in favor of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.load&lt;/code&gt;.&lt;/h3&gt;

&lt;p&gt;We’re not sure how people might be using this directly but we removed the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler::Environment&lt;/code&gt; class which was instantiated by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.environment&lt;/code&gt; since we realized the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler::Runtime&lt;/code&gt; class was the same thing. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.environment&lt;/code&gt; now delegates to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.load&lt;/code&gt;, which holds the reference to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler::Runtime&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;removed-public-methods-of-bundlerspecset&quot;&gt;Removed public methods of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler::SpecSet&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SpecSet#-&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SpecSet#&amp;lt;&amp;lt;&lt;/code&gt; have been removed with no replacement.&lt;/p&gt;

&lt;h3 id=&quot;specsetfor-always-implicitly-performs-validation&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SpecSet#for&lt;/code&gt; always implicitly performs validation&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SpecSet#for&lt;/code&gt; received a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;check&lt;/code&gt; parameter, but that’s no longer used and deprecated. Please remove this parameter.&lt;/p&gt;

&lt;h3 id=&quot;currentrubymaglev-was-removed-with-no-replacement&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CurrentRuby#maglev?&lt;/code&gt; was removed with no replacement.&lt;/h3&gt;

&lt;p&gt;Please use the built-in Ruby &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RUBY_ENGINE&lt;/code&gt; constant to check the Ruby implementation you are running on.&lt;/p&gt;

&lt;h3 id=&quot;bundlerrubygemsall_specs-has-been-removed&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.rubygems.all_specs&lt;/code&gt; has been removed&lt;/h3&gt;

&lt;p&gt;Please use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.rubygems.installed_specs&lt;/code&gt; instead.&lt;/p&gt;

&lt;h2 id=&quot;bundler-4-other-notable-changes&quot;&gt;Bundler 4: Other notable changes&lt;/h2&gt;

&lt;h3 id=&quot;deployment-helpers-for-vlad-and-capistrano-have-been-removed&quot;&gt;Deployment helpers for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vlad&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;capistrano&lt;/code&gt; have been removed.&lt;/h3&gt;

&lt;p&gt;These were natural deprecations since the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vlad&lt;/code&gt; tool has had no activity for years whereas &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;capistrano&lt;/code&gt; 3 has built-in Bundler integration in the form of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;capistrano-bundler&lt;/code&gt; gem, and everyone using Capistrano 3 should already be using that instead. If for some reason, you are still using Capistrano 2, feel free to copy the Capistrano tasks out of the Bundler 2 file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lib/bundler/deployment.rb&lt;/code&gt; and put them into your app.&lt;/p&gt;

&lt;p&gt;In general, we don’t want to maintain integrations for every deployment system out there, so that’s why we removed these.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>4.0.0 Released</title>
   <link href="https://blog.rubygems.org/2025/12/03/4.0.0-released.html"/>
   <updated>2025-12-03T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2025/12/03/4.0.0-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.0 includes features, performance, enhancements, bug fixes, security, breaking changes, deprecations and documentation and Bundler 4.0.0 includes features, performance, enhancements, bug fixes, security, breaking changes and documentation.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;features&quot;&gt;Features:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Undeprecate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Version.new(nil)&lt;/code&gt;. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9086&quot;&gt;#9086&lt;/a&gt; by tenderlove&lt;/li&gt;
  &lt;li&gt;Add pattern matching support to Gem::NameTuple. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9064&quot;&gt;#9064&lt;/a&gt; by baweaver&lt;/li&gt;
  &lt;li&gt;Add pattern matching support to Gem::Platform. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9062&quot;&gt;#9062&lt;/a&gt; by baweaver&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;performance&quot;&gt;Performance:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MAKEFLAGS=-j&lt;/code&gt; by default before compiling. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9131&quot;&gt;#9131&lt;/a&gt; by Edouard-chin&lt;/li&gt;
  &lt;li&gt;Remove some memoization. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9017&quot;&gt;#9017&lt;/a&gt; by tenderlove&lt;/li&gt;
  &lt;li&gt;Pull &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem.win_platform?&lt;/code&gt; out of a hot path. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8983&quot;&gt;#8983&lt;/a&gt; by tenderlove&lt;/li&gt;
  &lt;li&gt;Stop trying to remove every file on extraction. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8974&quot;&gt;#8974&lt;/a&gt; by tenderlove&lt;/li&gt;
  &lt;li&gt;Use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IO.copy_stream&lt;/code&gt; with IO object directly. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8970&quot;&gt;#8970&lt;/a&gt; by tenderlove&lt;/li&gt;
  &lt;li&gt;Pass a file size to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IO.copy_stream&lt;/code&gt;. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8966&quot;&gt;#8966&lt;/a&gt; by tenderlove&lt;/li&gt;
  &lt;li&gt;Use File#chmod rather than FileUtils.chmod. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8965&quot;&gt;#8965&lt;/a&gt; by tenderlove&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Update all vendored libraries to latest version. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9089&quot;&gt;#9089&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Removed unused &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Deprecate&lt;/code&gt;. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9090&quot;&gt;#9090&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Add debug logging information to see the time it took to download and
install a gem. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9066&quot;&gt;#9066&lt;/a&gt; by Edouard-chin&lt;/li&gt;
  &lt;li&gt;Fix constants in TAR to be frozen. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9041&quot;&gt;#9041&lt;/a&gt; by tenderlove&lt;/li&gt;
  &lt;li&gt;Remove open-ended and prerelease dependency warnings when building gems.
Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9050&quot;&gt;#9050&lt;/a&gt; by
jeremyevans&lt;/li&gt;
  &lt;li&gt;Revamp CmakeBuilder. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8753&quot;&gt;#8753&lt;/a&gt; by cfis&lt;/li&gt;
  &lt;li&gt;Restrict what schemes are acceptable in the remote fetcher. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9022&quot;&gt;#9022&lt;/a&gt; by tenderlove&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem sources --prepend&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--append&lt;/code&gt; allow finer grained control of
sources. Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8901&quot;&gt;#8901&lt;/a&gt;
by martinemde&lt;/li&gt;
  &lt;li&gt;Improve &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem sources --remove&lt;/code&gt; output. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8909&quot;&gt;#8909&lt;/a&gt; by deivid-rodriguez&lt;/li&gt;
  &lt;li&gt;Make &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem sources&lt;/code&gt; output more clear. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8938&quot;&gt;#8938&lt;/a&gt; by deivid-rodriguez&lt;/li&gt;
  &lt;li&gt;Don’t fail if there is no makefile, simply don’t do anything. Pull
request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8879&quot;&gt;#8879&lt;/a&gt; by ioquatix&lt;/li&gt;
  &lt;li&gt;Use IMDSv2 for S3 instance credentials. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/7709&quot;&gt;#7709&lt;/a&gt; by folbricht-stripe&lt;/li&gt;
  &lt;li&gt;Fix regression in presence of RVM gems. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8854&quot;&gt;#8854&lt;/a&gt; by deivid-rodriguez&lt;/li&gt;
  &lt;li&gt;Restore parsing “–” as an unknown platform rather than crashing. Pull
request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8846&quot;&gt;#8846&lt;/a&gt; by
deivid-rodriguez&lt;/li&gt;
  &lt;li&gt;Installs bundler 4.0.0 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix test failure of mswin and nmake. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9135&quot;&gt;#9135&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Respect &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUNDLE_VERSION&lt;/code&gt; config at Gem::BundlerVersionFinder. Pull
request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9106&quot;&gt;#9106&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Fix “did you mean” suggestions for unknown commands. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8948&quot;&gt;#8948&lt;/a&gt; by deivid-rodriguez&lt;/li&gt;
  &lt;li&gt;Fix trailing slashes not considered by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem sources --remove&lt;/code&gt;. Pull
request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8939&quot;&gt;#8939&lt;/a&gt; by
deivid-rodriguez&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;security&quot;&gt;Security:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Bump up vendored URI to 1.0.4. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9031&quot;&gt;#9031&lt;/a&gt; by hsbt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;breaking-changes&quot;&gt;Breaking changes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Removed deprecated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-C&lt;/code&gt; option from gem build. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9088&quot;&gt;#9088&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Removed deprecated Gem::Specification#has_rdoc, has_rdoc= and has_rdoc?.
Pull request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9084&quot;&gt;#9084&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Removed deprecated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem query&lt;/code&gt; command. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9083&quot;&gt;#9083&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Removed deprecated Gem::DependencyInstaller#find_gems_with_sources. Pull
request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9082&quot;&gt;#9082&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Remove deprecated methods of RubyGems. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9081&quot;&gt;#9081&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Make verification methods private. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9051&quot;&gt;#9051&lt;/a&gt; by tenderlove&lt;/li&gt;
  &lt;li&gt;Deprecate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--default&lt;/code&gt; option from install command. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/7588&quot;&gt;#7588&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Removed &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;compatibility.rb&lt;/code&gt; for RG 4.0. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8899&quot;&gt;#8899&lt;/a&gt; by hsbt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;deprecations&quot;&gt;Deprecations:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Deprecate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gem::Specification#datadir&lt;/code&gt;. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8900&quot;&gt;#8900&lt;/a&gt; by hsbt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;documentation&quot;&gt;Documentation:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Unified UPGRADING.md and extract blog.rubygems.org. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9148&quot;&gt;#9148&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Remove italic formatting from changelog section headers. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9128&quot;&gt;#9128&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;[DOC] Fix the location of Gem::Deprecate document. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9065&quot;&gt;#9065&lt;/a&gt; by nobu&lt;/li&gt;
  &lt;li&gt;Fix typo. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9012&quot;&gt;#9012&lt;/a&gt; by etiennebarrie&lt;/li&gt;
  &lt;li&gt;Added document for Gem::Uninstaller. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8904&quot;&gt;#8904&lt;/a&gt; by hsbt&lt;/li&gt;
  &lt;li&gt;Use mailto link in Code of Conduct. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8849&quot;&gt;#8849&lt;/a&gt; by deivid-rodriguez&lt;/li&gt;
  &lt;li&gt;Update Code of Conduct email to conduct@rubygems.org. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/8848&quot;&gt;#8848&lt;/a&gt; by indirect&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;features-1&quot;&gt;Features:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Support bundle install –lockfile option &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9111&quot;&gt;#9111&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Add support for lockfile in Gemfile and bundle install –no-lock &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9059&quot;&gt;#9059&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--ext=go&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle gem&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8183&quot;&gt;#8183&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Update Bundler::CurrentRuby::ALL_RUBY_VERSIONS &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9058&quot;&gt;#9058&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Introduce &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle list --format=json&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8728&quot;&gt;#8728&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;performance-1&quot;&gt;Performance:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Run git operations in parallel to speed things up: &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9100&quot;&gt;#9100&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Replace instance method look up in plugin installer &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9094&quot;&gt;#9094&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Adjust the API_REQUEST_LIMIT to make less network roundtrip &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9071&quot;&gt;#9071&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Make BUNDLE_LOCKFILE environment variable have precedence over lockfile method in Gemfile &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9146&quot;&gt;#9146&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Improve banner message for the default command &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9145&quot;&gt;#9145&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Introduce &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;install_or_cli_help&lt;/code&gt; and use it default &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle&lt;/code&gt; command &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9136&quot;&gt;#9136&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Add go_gem/rake_task for Go native extension gem skeleton &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9105&quot;&gt;#9105&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Warn users that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle&lt;/code&gt; now display the help: &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9092&quot;&gt;#9092&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Use DidYouMean::SpellChecker for gem suggestions in Bundler &lt;a href=&quot;https://github.com/ruby/rubygems/pull/3857&quot;&gt;#3857&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Update all vendored libraries to latest version &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9089&quot;&gt;#9089&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;We don’t need to allow some warning now &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9074&quot;&gt;#9074&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Support to embedded Pathname &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9056&quot;&gt;#9056&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Enforce activation of irb when running with bundle console &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9033&quot;&gt;#9033&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Update Magnus version in Rust extension gem template &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9025&quot;&gt;#9025&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Add checksum of gems hosted on private servers: &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9004&quot;&gt;#9004&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Loading support on Windows &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8254&quot;&gt;#8254&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Improve error message when the same source is specified through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gemspec&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;path&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8460&quot;&gt;#8460&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Raise an error in frozen mode if some registry gems have empty checksums &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8888&quot;&gt;#8888&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Bump vendored thor to 1.4.0 &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8883&quot;&gt;#8883&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Delay default path and global cache changes to Bundler 5 &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8867&quot;&gt;#8867&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix spacing in bundle gem newgem.gemspec.tt &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8865&quot;&gt;#8865&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Add some missing deprecation messages &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8844&quot;&gt;#8844&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes-1&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fixed checksums generation issue when no source is specified &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9133&quot;&gt;#9133&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Check for file existence before deletion from cache &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9095&quot;&gt;#9095&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Use method_defined?(:method, false) &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9098&quot;&gt;#9098&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Handle BUNDLER_VERSION being set to an empty string &lt;a href=&quot;https://github.com/ruby/rubygems/pull/6928&quot;&gt;#6928&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; when the Gemfile contains “install_if” git gems: &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8992&quot;&gt;#8992&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix installation issue related to path sources and precompiled gems &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8973&quot;&gt;#8973&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix outdated lockfile during &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle lock&lt;/code&gt; when source changes &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8962&quot;&gt;#8962&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Raise error on missing version file &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8963&quot;&gt;#8963&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle cache --frozen&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle cache --no-prune&lt;/code&gt; not printing a deprecation message &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8926&quot;&gt;#8926&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix local installation incorrectly forced if there’s a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vendor/cache&lt;/code&gt; directory and frozen mode is set &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8925&quot;&gt;#8925&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle lock --update &amp;lt;gem&amp;gt;&lt;/code&gt; with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--lockfile&lt;/code&gt; flag updating all gems &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8922&quot;&gt;#8922&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle show --verbose&lt;/code&gt; and recommend it as an alternative to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle show --outdated&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8915&quot;&gt;#8915&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle cache --no-all&lt;/code&gt; not printing a deprecation warning &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8912&quot;&gt;#8912&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle update foo&lt;/code&gt; unable to update foo in an edge case &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8897&quot;&gt;#8897&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix Bundler printing more flags than actually passed in verbose mode &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8914&quot;&gt;#8914&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Fix bundler failing to install sorbet-static in truffleruby when there’s no lockfile &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8872&quot;&gt;#8872&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Cancel deprecation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--force&lt;/code&gt; flag to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle update&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8843&quot;&gt;#8843&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;security-1&quot;&gt;Security:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Bump up vendored URI to 1.0.4 &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9031&quot;&gt;#9031&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;breaking-changes-1&quot;&gt;Breaking changes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fix triple spacing when generating lockfile &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9076&quot;&gt;#9076&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Hide patchlevel from lockfile &lt;a href=&quot;https://github.com/ruby/rubygems/pull/7772&quot;&gt;#7772&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Remove &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundler_4_mode&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9038&quot;&gt;#9038&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Pick and add extra changes for 4.0.0 version &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9018&quot;&gt;#9018&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Replaced Bundler::SharedHelpers.major_deprecation to feature_removed! or feature_deprecated! &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9016&quot;&gt;#9016&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Removed legacy_check option from SpecSet#for &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9015&quot;&gt;#9015&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Make update_requires_all_flag to settings &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9011&quot;&gt;#9011&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Make default cli command settings &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9010&quot;&gt;#9010&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Make global_gem_cache flag to settings &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9009&quot;&gt;#9009&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Consolidate removal of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.rubygems.all_specs&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9008&quot;&gt;#9008&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Consolidate removal of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler::SpecSet#-&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler::SpecSet#&amp;lt;&amp;lt;&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9007&quot;&gt;#9007&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Replaced Bundler.feature_flag.plugins? to Bundler.settings &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9006&quot;&gt;#9006&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Make &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle show --outdated&lt;/code&gt; raise an error &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8980&quot;&gt;#8980&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Make &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--local-git&lt;/code&gt; flag to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle plugin install&lt;/code&gt; raise an error &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8979&quot;&gt;#8979&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Switch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cache_all&lt;/code&gt; to be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt; by default &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8975&quot;&gt;#8975&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Completely forbid passing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--ext&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle gem&lt;/code&gt; without a value &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8976&quot;&gt;#8976&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Switch &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lockfile_checksums&lt;/code&gt; to be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;true&lt;/code&gt; by default &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8981&quot;&gt;#8981&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Make &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install --binstubs&lt;/code&gt; raise an error &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8978&quot;&gt;#8978&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Make &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle remove --install&lt;/code&gt; raise an error &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8977&quot;&gt;#8977&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Remove support for multiple global sources in Gemfile &amp;amp; lockfile &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8968&quot;&gt;#8968&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Remove &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;allow_offline_install&lt;/code&gt; setting &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8969&quot;&gt;#8969&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Completely remove &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--rubocop&lt;/code&gt; flag to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle gem&lt;/code&gt;, and related configuration &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8967&quot;&gt;#8967&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Completely remove all remembered CLI flags &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8958&quot;&gt;#8958&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Remove implementation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deployment&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;capistrano&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vlad&lt;/code&gt; entrypoints &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8957&quot;&gt;#8957&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Remove deprecated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.*clean*&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Bundler.environment&lt;/code&gt; helpers &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8924&quot;&gt;#8924&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Remove deprecated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle viz&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle inject&lt;/code&gt; commands &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8923&quot;&gt;#8923&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Removed to workaround for Bundler 2.2 &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8903&quot;&gt;#8903&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;documentation-1&quot;&gt;Documentation:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Unified UPGRADING.md and extract blog.rubygems.org &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9148&quot;&gt;#9148&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Remove italic formatting from changelog section headers &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9128&quot;&gt;#9128&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Small clarifications to Bundler 4 upgrade docs &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8964&quot;&gt;#8964&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Improve documentation of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle doctor&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle plugin&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle config&lt;/code&gt; &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8919&quot;&gt;#8919&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Make sure all CLI flags and subcommands are documented &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8861&quot;&gt;#8861&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Clarify documentation about new default gem installation directory in Bundler 4 &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8857&quot;&gt;#8857&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Use mailto link in Code of Conduct &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8849&quot;&gt;#8849&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Update Code of Conduct email to conduct@rubygems.org &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8848&quot;&gt;#8848&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Add missing link to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;irb&lt;/code&gt; repo in DEBUGGING.md &lt;a href=&quot;https://github.com/ruby/rubygems/pull/8842&quot;&gt;#8842&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.0.tgz&lt;br /&gt;
31ee4f84cf6d06db294f998d6028835e286847c8b3fed7b9037f9b8562abdb84&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.0.zip&lt;br /&gt;
1fd3800c4aa945a246965ca3de89e8e21dd191ece2154526694f99f49819f1cc&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.0.gem&lt;br /&gt;
acb143e17e81d2851ecdc0d06f9362b05d4dcf288b53775b4588fe1401f8c3a6&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>4.0.0.beta2 Released</title>
   <link href="https://blog.rubygems.org/2025/11/26/4.0.0.beta2-released.html"/>
   <updated>2025-11-26T00:00:00+00:00</updated>
   <id>https://blog.rubygems.org/2025/11/26/4.0.0.beta2-released</id>
   <author><name>Hiroshi SHIBATA</name></author>
   <content type="html">&lt;p&gt;RubyGems 4.0.0.beta2 includes deprecations, enhancements and bug fixes and Bundler 4.0.0.beta2 includes features, performance, enhancements and bug fixes.&lt;/p&gt;

&lt;p&gt;To update to the latest RubyGems you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem update --system [--pre]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To update to the latest Bundler you can run:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem install bundler [--pre]
bundle update --bundler=4.0.0.beta2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rubygems-release-notes&quot;&gt;RubyGems Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;deprecations&quot;&gt;Deprecations:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Deprecate comparing Gem::Version objects with strings. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9085&quot;&gt;#9085&lt;/a&gt; by tenderlove&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;enhancements&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Undeprecate Gem::Version#&amp;lt;=&amp;gt; against strings. Pull request
&lt;a href=&quot;https://github.com/ruby/rubygems/pull/9110&quot;&gt;#9110&lt;/a&gt; by byroot&lt;/li&gt;
  &lt;li&gt;Installs bundler 4.0.0.beta2 as a default gem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Respect &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;BUNDLE_VERSION&lt;/code&gt; config at Gem::BundlerVersionFinder. Pull
request &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9106&quot;&gt;#9106&lt;/a&gt; by hsbt&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bundler-release-notes&quot;&gt;Bundler Release Notes&lt;/h2&gt;

&lt;h3 id=&quot;features&quot;&gt;Features:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Support bundle install –lockfile option &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9111&quot;&gt;#9111&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Add support for lockfile in Gemfile and bundle install –no-lock &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9059&quot;&gt;#9059&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;performance&quot;&gt;Performance:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Run git operations in parallel to speed things up: &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9100&quot;&gt;#9100&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;enhancements-1&quot;&gt;Enhancements:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Fixup GH-9085 &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9108&quot;&gt;#9108&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Add go_gem/rake_task for Go native extention gem skeleton &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9105&quot;&gt;#9105&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Keep legacy windows platform, not removed them &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9104&quot;&gt;#9104&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;bug-fixes-1&quot;&gt;Bug fixes:&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Check for file existence before deletion from cache &lt;a href=&quot;https://github.com/ruby/rubygems/pull/9095&quot;&gt;#9095&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;manual-installation&quot;&gt;Manual Installation&lt;/h2&gt;

&lt;p&gt;To install RubyGems by hand see the &lt;a href=&quot;https://rubygems.org/pages/download&quot;&gt;Download RubyGems&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;SHA256 Checksums:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rubygems-4.0.0.beta2.tgz&lt;br /&gt;
56363005d89de2e7d0ffb309ea966eff32e4aba80364366b0aac47cca6536748&lt;/li&gt;
  &lt;li&gt;rubygems-4.0.0.beta2.zip&lt;br /&gt;
66cda8eaf12a0c20e0b44461c9d6bd33b647c03c333c0c59cd49b8ba7dce5dcf&lt;/li&gt;
  &lt;li&gt;rubygems-update-4.0.0.beta2.gem&lt;br /&gt;
6aa2c4352e176b97982ffe8d85cd285730c04f980b35d093af3975ca8a89c6a7&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 

</feed>
