Stable Language Evolution
The Rust Release Cycle
Rust uses a predictable 6-week "train model" release cycle inspired by modern browser release engineering. Every six weeks (on a Thursday), a new minor version of Rust (1.84.0, 1.85.0, 1.86.0, ...) is released to the Stable channel, while the current Nightly branch forks to become the next Beta candidate.
The 6-Week Rust Release Train:
Time (Every 6 Weeks) ---> Cycle N Cycle N + 1
---------------------------------------------------------------------------
Nightly (`master`) [ 1.86.0-nightly ] ----> [ 1.87.0-nightly ]
\ (Branch!)
Beta (6-week soak) +------------> [ 1.86.0-beta ]
\ (Promote!)
Stable (Production) +--> [ 1.86.0 ]
Why the Train Model Works
Instead of delaying a release until a specific feature is ready ("feature-based releases", which cause high pressure to rush unfinished features before a deadline), the release train leaves the station every 6 weeks on schedule:
- If a feature stabilization PR isn't quite ready before the branch date, there is zero pressure to rush it—the very next train leaves in just 6 weeks!
- During the 6-week Beta window, only bug fixes and regression backports are accepted into the beta branch while CI systems across the ecosystem test against
+beta. - If a critical compiler regression or security issue is discovered shortly after a
.0stable release, a point release (1.85.1) is published out-of-band containing only targeted fixes.
Managing Channels and Pinned Releases with rustup
rustup is the official Rust toolchain multiplexer. It allows you to install and switch between stable, beta, nightly, and exact historical versions (1.80.0, 1.85.0) side by side:
rustup Command |
Description |
|---|---|
rustup update |
Updates all installed toolchains (stable, beta, nightly) to their latest releases. |
rustup toolchain install 1.85.0 |
Installs the exact historical compiler version 1.85.0. |
rustup toolchain install nightly-2025-02-20 |
Installs the nightly build from a specific calendar date. |
cargo +beta test |
Runs cargo test using the beta toolchain without changing your default toolchain. |
cargo +1.85.0 check |
Verifies that your crate compiles cleanly on rustc 1.85.0 (MSRV check). |
rustup target add wasm32-wasip1 |
Installs the standard library cross-compilation target for WebAssembly WASI. |
#[derive(Debug, PartialEq, Eq)]
pub struct RustVersion {
pub major: u32,
pub minor: u32,
pub patch: u32,
}
impl RustVersion {
/// Calculates the calendar weeks elapsed between two 1.x.0 minor Rust releases
/// under the 6-week release train schedule.
pub const fn weeks_between_minor_releases(from_minor: u32, to_minor: u32) -> u32 {
to_minor.abs_diff(from_minor) * 6
}
}
fn main() {
// 8 minor releases = 8 * 6 = 48 weeks (~1 year of Rust releases):
let weeks = RustVersion::weeks_between_minor_releases(1_77, 1_85);
assert_eq!(weeks, 48);
println!("8 minor Rust releases span {weeks} weeks on the 6-week train schedule");
}
8 minor Rust releases span 48 weeks on the 6-week train schedule