1995 – 2026

Ruby Versions

Every public release of Ruby — from Yukihiro “Matz” Matsumoto's first public release in 1995 through Ruby 4.0 in December 2025 — with ship dates, maintenance status, and the major changes per version. Plus the annual Christmas-day release tradition, the 2004 Rails moment that made Ruby a mainstream web language, the 1.9 / YARV break, Ractor parallelism, and the YJIT → ZJIT performance arc.

Era & maintenance

Era

1.x — 1995–2011, the origin through the 1.9 / YARV line
2.x — 2013–2019, the mature line and the start of the Christmas cadence
3.x — 2020–2024, Ractor, RBS, and the YJIT performance push
4.x — 2025 onward, ZJIT and Ruby Box

Maintenance status

Normal — receiving bug fixes and security fixes
Security — security fixes only; no further bug fixes
EOL — past its support window; no further updates from ruby-core

Each stable branch gets roughly three years: about two in normal maintenance, then about one security-only, then end-of-life. The live status table is at ruby-lang.org/en/downloads/branches; every release is listed at ruby-lang.org/en/downloads/releases.

The Christmas release tradition

Ruby ships a new major every December 25.

Since Ruby 2.1 in 2013, every stable major has landed on Christmas Day — 2.2, 2.3, … 3.4, and Ruby 4.0 on December 25, 2025 — with patch releases through the rest of the year. The cadence has roots even earlier: Ruby 1.0 itself shipped on December 25, 1996. It's a deliberate, well-known rhythm that tells you exactly when to expect the next release.

Ruby version table

Version
Ruby 4.0
4.x
Normal
EOL ~2029 (TBD)
Dec 25, 2025
Latest release. ZJIT next-generation JIT; Ruby Box definition isolation (experimental); big Ractor improvements; Set and Pathname promoted to core classes.
  • ZJIT — a new method-based JIT compiler positioned as the next generation of YJIT, with an SSA intermediate representation and larger compilation units, written in Rust (1.85+). Enabled with --zjit. Faster than the interpreter but not yet as fast as YJIT; production-readiness is targeted for Ruby 4.1 (launch post).
  • Ruby Box (experimental, Ruby::Box) — enabled via RUBY_BOX=1, it isolates monkey patches, global / class variables, class / module definitions, and loaded libraries between boxes (Feature #21311).
  • Ractor improvements — a new Ractor::Port synchronization mechanism, Ractor#join / #value, Ractor.shareable_proc, and far less global-lock contention. Ractor.yield and Ractor#take were removed. Ruby-core aims to lift Ractor's “experimental” status in 2026.
  • Set and Pathname were promoted from the standard library to core classes; a new top-level Ruby module was defined; Unicode was updated to 17.0.
  • Logical operators (&&, ||, and, or) at the start of a line now continue the previous line (fluent style); *nil no longer calls nil.to_a.
  • Ships RubyGems 4 and Bundler 4; CGI removed from the default gems; the C-based --rjit implementation was removed.
  • Latest point release as of this writing: Ruby 4.0.5 (May 20, 2026). Released by Yui Naruse. See the 4.0.0 announcement and the NEWS file.
Version
Ruby 3.4
3.x
Normal
EOL ~2028 (TBD)
Dec 25, 2024
it as the default block parameter; Prism becomes the default parser; “chilled” string literals; modular GC.
  • it as a default block parameter[1, 2, 3].map { it * 2 } references the first block argument without naming it; the headline syntax addition.
  • Prism is now the default parser, replacing the long-standing Bison-based parse.y. Prism is a portable, error-tolerant parser shared across Ruby tooling (IRB, RuboCop, Sorbet, TypeProf).
  • “Chilled” strings — string literals in files without a frozen_string_literal comment now warn on mutation, a measured step toward making frozen string literals the default.
  • Modular GC (--with-modular-gc) — a pluggable garbage-collector interface that allows alternative collectors such as MMTk to be loaded at runtime.
  • Happy Eyeballs Version 2 is the default for Socket.tcp / TCPSocket.new; Hash#freeze and Module#set_temporary_name; continued YJIT performance and memory improvements.
  • Last point release: Ruby 3.4.9 (Mar 11, 2026).
Version
Ruby 3.3
3.x
Security
EOL Mar 2027
Dec 25, 2023
Major YJIT performance gains; the pure-Ruby RJIT; the Prism parser introduced; an M:N thread scheduler.
  • YJIT is significantly faster and uses less memory by this release, and is widely deployed in production.
  • RJIT — a new pure-Ruby JIT compiler that replaced the C-based MJIT, primarily as a platform for JIT experimentation.
  • Prism parser introduced — the error-tolerant, portable parser that would become the default in Ruby 3.4.
  • M:N thread scheduler — maps many Ruby threads onto fewer native threads, improving Ractor and Fiber throughput.
  • Range#overlap?; ObjectSpace.dump and IRB improvements; broad performance work.
  • Last point release: Ruby 3.3.11 (Mar 26, 2026).
Version
Ruby 3.2
3.x
EOL
Mar 2026
Dec 25, 2022
YJIT production-ready; WASI-based WebAssembly support; the Data immutable value class; Regexp ReDoS timeouts.
  • YJIT declared production-ready — the Rust-based JIT contributed by Shopify graduated from experimental.
  • WASI-based WebAssembly support — Ruby can be compiled to run in the browser and in WASI runtimes.
  • Data — a new class for simple immutable value objects, a lighter and immutable cousin of Struct.
  • Regexp ReDoS mitigationsRegexp.timeout and linear-time matching improvements guard against catastrophic backtracking.
  • Anonymous rest / keyword-rest / block argument forwarding (*, **, &); Module#const_added; Struct keyword-init by default.
  • Reached end-of-life in early 2026; last point release Ruby 3.2.11 (Mar 27, 2026), which carried a zlib CVE fix.
Version
Ruby 3.1
3.x
EOL
Mar 2025
Dec 25, 2021
YJIT introduced (experimental, from Shopify); the new debug gem; error_highlight; hash literal value omission.
  • YJIT — a new experimental in-process JIT contributed by Shopify; the start of Ruby's modern JIT era.
  • New debug gem — a fast, feature-rich debugger with remote-debugging support, replacing the old lib/debug.rb.
  • error_highlight — pinpoints the exact sub-expression that raised in a backtrace.
  • Hash literal value omission ({x:, y:}); the find pattern and pin-operator improvements in pattern matching; IRB autocompletion with a documentation popup.
  • Integer#ceildiv; MJIT improvements.
Version
Ruby 3.0
3.x
EOL
Mar 2024
Dec 25, 2020
The “Ruby 3x3” release. Ractor parallelism (experimental); Fiber Scheduler; RBS / TypeProf type tooling; one-line pattern matching.
  • Ractor (experimental) — an actor-model abstraction for thread-safe parallel execution that sidesteps the global VM lock.
  • Fiber Scheduler — a non-blocking I/O hook that lets ordinary blocking code run concurrently under an event loop.
  • RBS — a language for describing Ruby type signatures, shipped alongside TypeProf, a type-analysis tool; Ruby's official answer to gradual typing.
  • One-line pattern matching (in / =>); rightward assignment; Hash#except; the find pattern.
  • The capstone of the multi-year “Ruby 3x3” goal — roughly three times faster than Ruby 2.0 on key benchmarks, via MJIT and broad optimization.
Version
Ruby 2.7
2.x
EOL
Mar 2023
Dec 25, 2019
Pattern matching (experimental); numbered block parameters (_1); compaction GC; the keyword-argument separation warnings.
  • Pattern matching (case / in, experimental) — destructuring against arrays, hashes, and objects; the largest new control-flow feature in years.
  • Numbered block parameters (_1, _2); beginless ranges (..10).
  • Compaction GC (GC.compact) — reduces heap fragmentation and improves copy-on-write behavior.
  • Keyword-argument separation warnings — deprecation of the automatic conversion between positional hashes and keyword arguments; the runway for the hard separation in Ruby 3.0.
  • A substantially improved IRB with multi-line editing and syntax highlighting.
Version
Ruby 2.6
2.x
EOL
Mar 2022
Dec 25, 2018
MJIT — the first JIT compiler (experimental); endless ranges; then; Proc composition.
  • MJIT — Ruby's first JIT compiler (experimental), which emits C and uses the system C compiler.
  • Endless ranges ((1..)); Kernel#then (an alias of yield_self).
  • Proc#>> / Proc#<< method and proc composition; Binding#source_location.
  • RubyVM::AbstractSyntaxTree; Comparable#clamp with a range; Bundler folded into the standard library.
Version
Ruby 2.5
2.x
EOL
Mar 2021
Dec 25, 2017
rescue / else / ensure directly in blocks; yield_self; Hash#slice; branch and method coverage.
  • rescue / else / ensure directly inside do...end blocks — no surrounding begin needed.
  • yield_self; Hash#slice and Hash#transform_keys.
  • Top-level constant lookup removed — constants no longer resolve accidentally through Object.
  • Branch coverage and method coverage measurement; pp required by default; roughly 5–10% faster.
Version
Ruby 2.4
2.x
EOL
Mar 2020
Dec 25, 2016
Integer unification (Fixnum + Bignum → Integer); Comparable#clamp; String#unpack1; faster hashes.
  • Integer unificationFixnum and Bignum merged into a single Integer class.
  • Comparable#clamp; String#unpack1; Hash#compact; Enumerable#sum.
  • Hash-table (st_table) rewrite for better speed and memory use.
  • binding.irb — a REPL launchable from inside a running program; Unicode case mapping for String#upcase / downcase.
Version
Ruby 2.3
2.x
EOL
Mar 2019
Dec 25, 2015
Safe navigation operator (&.); frozen string literal magic comment; Hash#dig / Array#dig; did_you_mean.
  • Safe navigation operator &. (the “lonely operator”) — calls a method only on a non-nil receiver.
  • Frozen string literal magic comment# frozen_string_literal: true freezes every string literal in a file.
  • Hash#dig and Array#dig for nested access; Hash#to_proc.
  • did_you_mean bundled — spelling suggestions on NameError / NoMethodError; Array#bsearch_index.
Version
Ruby 2.2
2.x
EOL
Mar 2018
Dec 25, 2014
Incremental GC; symbol garbage collection; Kernel#itself; obsolete libraries removed.
  • Incremental GC — shorter GC pauses, a meaningful responsiveness win for Rails.
  • Symbol GC — symbols are now garbage-collected, closing the long-standing symbol-DoS memory-leak class.
  • Kernel#itself; Method#curry; String#unicode_normalize.
  • Removed obsolete DL and Digest::HMAC; jemalloc support and a faster Process.spawn.
Version
Ruby 2.1
2.x
EOL
Mar 2017
Dec 25, 2013
The first Christmas-day release and the move to semantic versioning. Generational GC (RGenGC); refinements; required keyword arguments.
  • The first annual Christmas-day major, and the switch from patchlevel numbering (-pN) to semantic versioning — the rhythm Ruby has kept ever since.
  • Generational GC (RGenGC) — a major garbage-collector throughput improvement.
  • Refinements promoted from experimental; required keyword arguments (def foo(a:)).
  • "string".freeze literal optimization (deduplicated frozen strings); rational (2r) and complex (2i) literals; def returns the method name as a symbol.
Version
Ruby 2.0
2.x
EOL
Feb 2016
Feb 24, 2013
Keyword arguments; Module#prepend; refinements (experimental); lazy enumerators; UTF-8 default source encoding.
  • Keyword arguments — the first real ones; and Module#prepend for clean method wrapping.
  • Refinements (experimental) — lexically scoped monkey-patching.
  • Enumerator::Lazy — lazy evaluation of large or infinite sequences; %i(...) symbol-array literals.
  • UTF-8 became the default source encoding. Designed to be roughly 99% backward-compatible with 1.9.3, and shipped on February 24, 2013 — Ruby's 20th anniversary.

The 1.9 / YARV break — the modern-era boundary. Above this line: the modern semantic-versioning era, from 2.x through 4.x. Below: the 1.x lineage, from Matz's first public release in 1995 through the 1.9 series. Ruby 1.9 (2007) replaced the original tree-walking interpreter with the YARV bytecode VM and introduced encoding-aware strings — a source-incompatible break that began modern Ruby. The full story is in the prose history below.

Version
Pre-2.0
1.x
EOL
long EOL
1995 – 2011
The origin line: 0.95, 1.0, the 1.6 / 1.8 workhorse releases, and the 1.9 / YARV break. Included for historical completeness.
  • Ruby 1.9.3 (Oct 31, 2011) — the stable, widely adopted 1.9 release; relicensed under the 2-clause BSD plus Ruby license. The final 1.9 patch was 1.9.3-p551 in 2014.
  • Ruby 1.9.0 / 1.9.1 (Dec 25, 2007 / Jan 30, 2009) — the YARV bytecode VM (Koichi Sasada), a large speedup; encoding-aware strings (M17N); the key: value hash syntax; block-local variables; Fiber; the -> lambda literal. 1.9.0 was experimental; 1.9.1 was the first stable 1.9. Source-incompatible with 1.8 — the modern-era boundary.
  • Ruby 1.8.7 (May 31, 2008) — the long-lived 1.8 workhorse, with many enumerator backports. The final patch was 1.8.7-p374 in 2013.
  • Ruby 1.8.0 (Aug 4, 2003) — the release that powered the Ruby on Rails explosion of 2004–2008; a large standard-library expansion.
  • Ruby 1.6 (Sep 2000) — the first Ruby widely distributed outside Japan.
  • Ruby 1.0 (Dec 25, 1996) — the first 1.0 release, itself a Christmas-day ship decades before the tradition was formalized.
  • Ruby 0.95 (Dec 1995) — the first public release, posted by Matz to Japanese newsgroups. Development had begun on February 24, 1993, the day Matz settled on the name “Ruby.”

Pre-1.8 releases predate the public English-language documentation era; they're listed here for historical completeness rather than ongoing relevance. The full pre-1.8 download archive is at ruby-lang.org/en/downloads/releases.

Click any row to expand. Each row has a stable id for sharing — e.g. /software/ruby/versions/#ruby-4-0, #ruby-3-4, #ruby-pre-2-0. Live release and maintenance state is documented at ruby-lang.org/en/downloads/branches.

The 1993 origin and the Japanese years

Ruby was created by Yukihiro “Matz” Matsumoto in Japan. He settled on the name on February 24, 1993 — a deliberate gem-of-a-name follow-on to Perl — and began building a language that blended the parts he liked from Perl, Smalltalk, Lisp, and Ada into something “more powerful than Perl, and more object-oriented than Python.” His guiding principle was programmer happiness: Ruby is designed so that ordinary code reads naturally and the language gets out of your way.

The first public release — Ruby 0.95 — went out to Japanese newsgroups in December 1995, and Ruby 1.0 followed on December 25, 1996. For its first several years Ruby was effectively a Japanese-only language: the mailing lists, the documentation, and nearly the entire community were in Japanese. That changed at the turn of the millennium.

The pickaxe book opens Ruby to the world (2000)

In 2000, Dave Thomas and Andy Hunt published Programming Ruby — universally known as the “pickaxe” book for the tool on its cover — the first comprehensive English-language guide to the language. It was the bridge that let Ruby cross out of Japan. For several years the pickaxe was the canonical reference for English-speaking developers, and it seeded the early international community that would be ready and waiting when Ruby's killer application arrived a few years later.

The Rails moment (2004) — Ruby's killer app

The single biggest accelerant in Ruby's history was Ruby on Rails. Extracted from the Basecamp codebase at 37signals and released by David Heinemeier Hansson (DHH) in 2004, Rails turned Ruby from a beloved-but-niche language into a mainstream web-development platform almost overnight. Its “convention over configuration” philosophy and a famous fifteen-minute blog screencast made it the framework that defined a generation of web startups. For many developers in the mid-2000s, “learning Ruby” and “learning Rails” were the same sentence.

In 2008 the Rails team merged with the competing Merb framework, folding Merb's modularity into Rails 3 and ending a brief fork in the community's energy. Rails has continued on its own annual-ish major cadence (Rails 5, 6, 7, and 8), and remains the reason a large share of Ruby jobs exist. Rails has its own release history distinct from the language's; a dedicated Rails versions page is a natural sibling to this one if and when it ships.

The 1.9 / YARV / encoding overhaul

Ruby's interpreter was originally a tree-walking evaluator — simple, but slow. Ruby 1.9 replaced it with YARV (Yet Another Ruby VM), a bytecode virtual machine written by Koichi Sasada, delivering a large performance jump and setting the architectural foundation for a decade of later optimization. 1.9 also introduced M17N encoding-aware strings (each string carries its own encoding rather than assuming one global encoding), the modern key: value hash syntax, the -> lambda literal, block-local variables, and Fiber. The 1.9.0 release shipped on Christmas Day 2007 as an experimental preview; 1.9.1 (January 2009) was the first stable 1.9, and 1.9.3 (2011) became the widely deployed workhorse. Because 1.9 was deliberately source-incompatible with 1.8, it is the cleanest dividing line between “old” and “modern” Ruby — though, unlike Python's 2-to-3 split, the transition was relatively swift and far less painful for the ecosystem.

The 2.x maturation and the Christmas cadence

Ruby 2.0 (February 2013) was designed to be almost fully backward-compatible with 1.9.3 while adding keyword arguments, refinements, lazy enumerators, and Module#prepend. Later that year, Ruby 2.1 established the rhythm Ruby still keeps: a stable major every December 25, and a switch from patchlevel numbering to semantic versioning. The 2.x line was a steady decade of polish — generational and incremental garbage collection, symbol GC, the safe-navigation operator, frozen string literals, Hash#dig, the first JIT (MJIT in 2.6), and experimental pattern matching in 2.7 — that set the table for the performance-and-concurrency push of the 3.x era.

Ruby 3x3 — Ractor, RBS, and performance (2020)

Ruby 3.0 (December 2020) was the capstone of the multi-year “Ruby 3x3” goal Matz announced in 2015: make Ruby roughly three times faster than Ruby 2.0. Beyond raw speed, 3.0 tackled Ruby's two long-standing gaps. Ractor introduced an actor-model concurrency abstraction for genuine parallelism that sidesteps the global VM lock, and the Fiber Scheduler let ordinary blocking code run concurrently under an event loop. On the typing front, RBS (a separate signature language) and TypeProf gave Ruby an official, gradual answer to static typing without changing the language's syntax. One-line pattern matching, rightward assignment, and Hash#except rounded out the release.

The JIT arc — MJIT to YJIT to ZJIT

Ruby's just-in-time compilation story runs through three generations. MJIT (Ruby 2.6, 2018) was the first attempt — it emitted C and shelled out to the system C compiler, which limited how aggressive it could be. The breakthrough came from Shopify, whose team (led by Maxime Chevalier-Boisvert) built YJIT, a Rust-based in-process JIT introduced experimentally in Ruby 3.1, declared production-ready in 3.2, and substantially faster by 3.3. YJIT made Ruby fast enough that large Rails deployments routinely turn it on. Ruby 4.0 (2025) introduced its successor, ZJIT — a method-based compiler with an SSA intermediate representation, designed to raise the performance ceiling further and to be more approachable for outside contributors. As of 4.0 ZJIT is faster than the interpreter but not yet faster than YJIT; the stated goal is to overtake YJIT and reach production readiness in Ruby 4.1.

Governance and community

Matz remains Ruby's benevolent dictator: the language's direction runs through him and the volunteer ruby-core team. Feature proposals are debated openly on the issue tracker at bugs.ruby-lang.org, and a large decision is often settled at the annual developers' meeting. The non-profit Ruby Association, founded by Matz in Japan, supports the language's development and community, while several committers (Matz, Koichi Sasada, and others) have been employed over the years by companies including Heroku (acquired by Salesforce in 2010) and Shopify specifically to work on Ruby full-time.

Ruby's community has a strong cultural identity around the MINASWAN ethos — “Matz is nice and so we are nice” — which the early conference circuit codified into a norm of welcoming, patient mentorship. It remains one of the language's most-cited distinguishing traits.

Alternative implementations

CRuby (also called MRI, the Matz Ruby Interpreter) is the reference implementation that this page tracks, but several others have shaped the ecosystem:

  • JRuby — Ruby on the JVM, giving access to Java libraries and real OS-thread parallelism. The most mature alternative implementation, with its own multi-year release history.
  • TruffleRuby — a high-performance implementation built on GraalVM / Truffle, capable of very aggressive JIT optimization.
  • mruby — Matz's own lightweight, embeddable Ruby for devices and applications with tight memory budgets.
  • Rubinius — an influential Ruby-in-Ruby implementation with an LLVM-based JIT; less active today but historically important for pushing CRuby's performance conversation forward.

Full per-version coverage of each alternative is out of scope here — JRuby in particular has its own JVM-integration arc that wouldn't fit cleanly under the canonical Ruby page.

People who shaped Ruby

Creator and core: Yukihiro “Matz” Matsumoto (creator and lead), Koichi Sasada (YARV and Ractor), Nobuyoshi Nakada (“nobu”, the prolific committer behind a huge share of CRuby patches), Yui Naruse (release manager), Yusuke Endoh (“mame”), and Aaron Patterson (“tenderlove”, Ruby and Rails core, longtime performance work).

Performance and tooling: Maxime Chevalier-Boisvert and the Shopify team (YJIT / ZJIT), Jeremy Evans (Ruby committer and Sequel / Roda author), and Kevin Newton (Prism parser). Rails lineage: David Heinemeier Hansson (DHH), who created Ruby on Rails and, more than anyone outside Matz, drove Ruby's adoption.

Find your version — in the terminal

The browser cannot detect what version of Ruby is installed on your machine. Run one of these in your terminal to see your real install.

What's installed?

Print the active interpreter and where it lives on disk.

$ ruby --version                       # or the short form: ruby -v
$ ruby -v
$ which ruby                            # where the binary lives
$ ruby -e "puts RUBY_VERSION"           # just the version number
$ ruby -e "puts RUBY_DESCRIPTION"       # version + platform + JIT build info

Pin a project to a specific Ruby

A .ruby-version file is read by every major version manager; the Gemfile can pin the version for Bundler.

# .ruby-version (read by rbenv, chruby, asdf, mise, RVM)
4.0.0

# Gemfile
ruby "4.0.0"

The RUBY VERSION line in Gemfile.lock records the exact Ruby a project was last resolved against — the per-project source of truth for collaborators.

Install or upgrade a version

Multiple Rubies can coexist; installing a new one doesn't remove old ones.

# macOS (Homebrew) — newest stable
$ brew install ruby

# Version managers (any version, any platform)
$ rbenv install 4.0.0
$ mise use ruby@4.0
$ asdf install ruby 4.0.0

# Windows: RubyInstaller (recommended) or winget
> winget install RubyInstallerTeam.Ruby.4.0

Manage multiple Rubies

A version manager picks which Ruby a directory uses; Bundler isolates the gems per project.

# rbenv: list, set the user default, pin per-directory
$ rbenv versions
$ rbenv global 4.0.0
$ rbenv local 3.4.9                     # writes .ruby-version here

# chruby + ruby-install
$ chruby                                # list installed Rubies
$ chruby ruby-4.0.0                     # switch for this shell

# asdf / mise (polyglot version managers)
$ asdf list ruby
$ mise ls ruby

Sources: ruby-lang.org/en/downloads/releases; ruby-lang.org/en/downloads/branches; ruby-lang.org news (per-release announcements); ruby/ruby NEWS files; bugs.ruby-lang.org; and the contemporaneous reporting cited inline. Last updated June 2026.

Mungomash LLC · More software pages

Last refreshed 2026-06-07 by Titan — new page.