Disclaimer: I am proposing this as part of my employment at Canonical[1]. I am representing an interest of Canonical, but I am not representing Canonical itself.
Intended Improvements
- Send out a Rust Survey asking what actual potential users' expectations are for a prospective Rust LTS in terms of frequency, support duration, cost, et al.
- Revert the "When to use LTS" back to "User Explanation" with two subheadings: "The LTS Target Tier" and the existing "When to use LTS" heading.
- Add illustrative requirements for LTS Tier target support to the technical explanation.
- LTS does not imply MSRV policy. Ecosystem crates, including Rust Project published crates, continue to target stable by default and keep their independent policies on how frequently they expect downstream to update the toolchain to get new library releases.
- Future work: coordinating with distros to deliver rustup managed toolchains through the OS distro mechanisms (optionally).
- Future work: (unbaked) Ecosystem Rust LTS where ecosystem OSS projects can sign up to offer support contracts through the Rust Foundation and receive funding for the LTS work.
I'm very aware of the volume of discussion that has gone into potential LTS releases. The primary purpose of sharing this is to share my documentation of the why behind the requests for LTS
Summary
The Rust stable toolchain has been supported since 2015, and the Rust Project continues to offer support for stable Rust with no current plans for end-of-life. However, the Rust Project acknowledges that stable Rust releasing a new semver-minor release every six weeks can be more update risk than conservatively slow-moving enterprise users are willing to adopt.
As such, each year moving forward the Rust Project will designate the second minor release version of the toolchain that year (e.g. 1.103) for long-term support (LTS). LTS releases will receive security patch releases for at least one year plus one full stable release cycle (i.e. at least 60 weeks or roughly a year plus eight weeks).
This year of LTS is maintained by the Rust Project and licensed identically to the other toolchains distributed through Rustup by the Project without warranty of any kind such that the open source community can coordinate on supporting one LTS target. If you require a longer support term or a formal support contract, contact the Rust Foundation; they will help connect you with organizations able to provide that support.
Motivation
Rust is increasingly getting used to build software that offers long term support (LTS). Of course, an LTS compiler toolchain is not a requirement for building LTS software[2]; if your LTS requirement is just “don’t break user workflows,” it doesn’t matter if the method by which you build your code changes. Rust stable already offers a very strong stability guarantee, meaning that updating the toolchain for an actively developed project is painless.
Unfortunately, when dealing with enterprise-scale software and LTS timelines, Hyrum’s law becomes a problem: every change, no matter how obviously correct, can break something. Rust’s API evolution policy necessarily allows for some changes that have the possibility to break downstream consumers. How confident can you actually be that nowhere in your software or its transitive dependencies relies on an inference quirk that might have a change in its behavior within the next decade?
Using an LTS compiler is a risk mitigation strategy for LTS software which is only receiving security patches to fix CVEs and other issues of similar severity. The underlying value proposition is that it will be less work overall to backport CVE fixes to LTS compiler versions than it would be to update the compiler and then have to diagnose and fix minor breakage issues in code nobody has touched for five years.
Furthermore, certain conformance requirements can require all used software to have defined support and end-of-life timelines. While the Rust Project does not necessarily need to be the one defining those timelines (e.g. a company with such requirements could use the Ferrocene qualified Rust toolchain, which has support timelines defined by Ferrous Systems), having an LTS timeline endorsed by the Rust Project directly improves ecosystem centralization around a single standard timeline, visibility to companies asking for "LTS Rust," and means that security-sensitive users only need to trust the Rust Project and not an independent redistributor providing the LTS they require.
For many companies, using LTS will be a checkbox instead of a genuine need, and the stable toolchain actually fulfills all of their stability and support requirements. The inability of the Rust Project to enter a legally binding support contract might result in the Rust Project provided LTS not being enough for some applications where legal culpability for damages caused by lack of support is required. But even given that, defining an official timeline for long term support provided by the Rust Project serves a legitimate need that is becoming increasingly pressing as more enterprise entities are adopting Rust.
Risk tolerance
(adapted from Julia's release process)
Users of the toolchain fall into one of four risk tolerance categories:
- High risk tolerance: Lives on unstable, helps find bugs when they happen.
- Normal risk tolerance: Wants things to work and likes new performance improvements. Uses stable. Blames the library when a stable update breaks a library; the library was relying on things that the toolchain doesn't guarantee caveat-free stability for.
- Low risk tolerance: Prioritizes minimizing risk over other improvements. Uses LTS. Willing to upgrade to the next LTS release once it has had some time to mature. May blame the toolchain before the library if updating the toolchain (within a given LTS release) breaks something.
- Very low risk tolerance: Never updates anything except for critical fixes, as the stability of never changing anything is preferred over anything else. Uses whatever version they need to think the least about. Willing to either fix things themselves or pay for fixes when they become necessary just as long as they don't need to update anything except to get that one targeted fix.
Our existing release channels serve the first two categories extremely well. The fourth category isn't the type of user the Rust Project necessarily wants to support, and are capable of finding support elsewhere. The third category is the target of our LTS support.
This category of risk tolerance is also the reason we choose this LTS cadence. The LTS support period is deliberately longer than LTS release cadence so that LTS updates can be done before the prior LTS is out of support.
When to use LTS
TL;DR: Don't, unless an external conformance requirement spells out that you MUST NOT use the stable toolchain. If you aren’t sure, use stable. Almost all of the time, you should not be using the LTS toolchain; stable gets bug fixes and performance improvements to both the compiler and to the output compilation artifact (i.e. your application) that will by design never be released to the LTS toolchain.
If you are developing features for your production software, use stable. Update your package.rust-version (and your cargo dependencies) regularly as a normal part of your development process. The risk of a nontrivial upgrade for a project in active development is negligible, especially if you update often.
When you are maintaining LTS for your own application — that software is receiving no development except for patching security issues as they are discovered — then you may want to adopt the LTS toolchain as a risk mitigation strategy. When requirements for delivering your own LTS are to change nothing about your application or its build process except as strictly necessary to stay in support and patch security issues, then you know already you need LTS. If you don't have a strict requirement for an immutable build process — the threat model requiring such is niche[3], and updating the toolchain used to build it has no impact on your application's user-visible LTS guarantees[4] — then you should still use stable.
Libraries deserve a special mention, as they may want to make themselves available to downstream users that are using the lts toolchain and/or offer their own LTS release channels for specific minor release versions. For such cases, we recommend these guidelines:
- NEVER offer LTS or target the LTS toolchain for a package with a major version of zero.
- Updating
[package.rust-version]to exclude a supported LTS toolchain version is a minor-level change. Updates to[package.rust-version]that do not do so are patch-level changes. - Once a minor release series is designated for LTS, further releases in that series MUST NOT contain any minor-level changes (nor major-level changes) as defined by the Cargo Book on SemVer Compatibility, nor any potentially-observable changes to their build configuration.
- Packages with clear documentation of such MAY relax these requirements ONLY IF doing so for the purpose of offering continuing support, such as when the underlying system support changes.
- If the package offering LTS wants to continue feature development, it MUST be performed on a manifest-declared version of the package not in the same minor release series as the LTS.
Note that a package being major version 1 (or higher) does not mean that it provides long term support, nor that the author wants to provide such. Furthermore, the entire point of LTS releases is that they see no development other than security patches. If you want access to the most recent improvements to the Rust toolchain and libraries, you should not be using LTS release of the toolchain.
If you are a consumer of applications built using Rust, whether the Rust toolchain is LTS has no impact on the support of the software. If your software vendor or other requirements require you to compile the application yourself, use whatever version of the toolchain your software vendor tells you to use or latest stable if they don't.
Technical explanation
The support that the Rust Project offers for the LTS toolchains is limited to patching security issues reported to the project. Repackagers of the Rust toolchain are encouraged to build their own LTS offerings on top of this support in accordance with the Rust trademarks.
This policy does not extend the existing toolchain support policies beyond adding the LTS toolchain versions to the list of supported toolchains. Support for components within the toolchain continues to follow the existing support tiers policies, and Rust Project artifacts delivered outside the toolchain (such as libraries delivered via the crates.io Cargo registry) are not covered by this policy. Furthermore, the Rust Project is not a legal entity capable of entering a support contract, and this policy MUST NOT be construed to provide warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement.
No new channels are added to the rustup distribution at this time. Users of the LTS toolchain can use the existing versioned 1.X channel.
Drawbacks
Offering long term support means work spent patching old releases of the toolchain instead of developing the current version. Arguably, nobody should actually use the LTS toolchain, as the stable channel guarantees should be sufficient for building software with long term support.
Officially endorsing an LTS toolchain also runs the risk of delaying adoption of new stable toolchains. The guidelines on when to use the LTS toolchain are designed to mitigate this risk, but external pressures to work with LTS toolchains may develop.
Also, of course, this is signing the Rust Project up for more work backporting security relevant fixes to toolchains up to five years old.
Rationale and Alternatives
LTS outside of the Rust Project
See the motivation section; the benefit of endorsing a timeline as part of the Project is real. Even if the Project doesn't want to provide the LTS for free like all products of the Project are, defining what "Rust LTS" means inside the Project confers benefit to coordination outside the Project.
Furthermore, the customers who want the "LTS" version are those most likely to be willing to pay real money that can go towards supporting both that effort and towards the active development of Rust. Since LTS customers might also require a support contract, one alternative is to provide LTS through the Rust Foundation, since they have the legal framework to both charge for and sign such support contracts.
Charging for LTS licensing
The Project's LTS could be licensed under a non-commercial and/or copyleft license such that the open source community is free to use it while still requiring commercial enterprise customers to pay for LTS. This seems monetarily advantageous to the Project, but may goes against the existing open licensing ethos.
The RFC author explicitly provides no opinion nor guidance on whether this is legally viable.
Reactive instead of proactive support
The support promise as defined above is to backport any security relevant fixes once they're available to the LTS toolchains. An alternative is to instead offer support on demand: guarantee that a backport will be done for security-relevant issues when and if it is requested. This does align better with providing LTS for a fee but giving the support away for free once it exists.
However, it is the author's opinion that it will be less work overall to do the patching proactively. With the above timelines, only a maximum of two toolchains are in LTS at any one time, and backporting proactively means that it's done when the fix is fresher in the minds of those who worked on fixing it.
Aligning LTS to editions
Rust already has an existing multi-year cycle in editions, which are released roughly every three years. We choose here to deliberately not tie LTS to editions, as LTS and editions serve two different orthogonal functions. The edition cadence is not considered stable, and as such we should not tie
That said, releasing LTS versions the year before an edition year and timing edition EoL to edition releases (so LTS every three years supported for four) is a strong alternative for the messaging affordances.
Longer LTS periods
Only providing just over a years' support is chosen to minimize the not-directly-paid-for maintenance burden on the Rust Project. A longer LTS period almost certainly requires sponsoring from customers that want that LTS. Furthermore, once the Rust Project officially designates a release as LTS, the community beyond just the Project can organize around it to provide support if the demand is there.
More granular policy
Node.js defines multiple LTS-related periods. Notably, they separate "Active LTS" from LTS, with the "active" version being the most recent version in LTS, along with keeping the most recent as "current" for six months before promoting it to LTS.
This seems like more effort than it's worth for the Rust Project given Rust stable's already very strong stability promise and release trains. If users want to delay their adoption of an LTS, that's their choice, and the Project doesn't need to tell them to.
Prior art
Other language/toolchains' LTS:
- Java SE: Every 2 years with 5 years' support
- .NET: Every 2 years with 3 years' support
- Node.js: Every year[5] with 3 years' support
- Julia: No defined cadence/timeline yet. In practice, ~3 years with no overlap.
Prior discussion:
- #commercial-network > Long-Term Support (LTS) Rust toolchain (this RFC) (2026.07–)
- pre-RFC: LTS for the Rust Toolchain (this RFC) (2026.07–)
- What if we did LTSs? (2024.02–2024.04)
- Compiler and language stability guarantees instead of LTS (2024.03–2024.05)
- Possible LTS releases tied to editions? (2018.04–2018.05)
- Many others I've forgotten to link
Unresolved questions
- The exact release frequency and support duration of LTS is contentious.
- Would the intended LTS users even want to use the toolchain distributed by rustup?
- What avenues for monetization of LTS are available to the Rust Project?
- How long do prospective enterprise LTS users expect "LTS Rust" to be supported for?
- How much would prospective enterprise LTS users pay for "LTS Rust" without flinching?
- Are the prospective enterprise LTS users willing to put their money where their mouth is?
- How do we create a "pit of success" for choosing between stable and LTS?
- What will actually be the added workload for Rust infrastructure providing LTS?
- Further unknown unknowns abound.
Future possibilities
Nothing within the Project is really enabled by LTS. Support outside the Project also doesn't require us to define LTS, as shown by Ferrocene. The possibilities opened by LTS are ones of further adoption of Rust and the results of such.
However, we can of course choose to extend this policy to provide more and/or longer LTS in the future.
I got hired to help develop the Rust Project on behalf of Canonical! I join the list of people getting paid to work on Rust itself
(along with work on how Ubuntu redistributes and uses Rust) ↩︎Responsibly building LTS software does require that the compiler toolchain be supported. But this only requires support over a long term; it does not require the feature freeze that is implied as part of calling a release LTS. ↩︎
Justifying the use of LTS for security threat model reasoning requires that you trust the releases pushed to the LTS channel but not releases pushed to the stable channel, despite the same entity being responsible for distributing both. Unless you are reviewing every patch to the LTS compiler AND bootstrap-compiling the patched versions yourself, you have extremely weak grounds for using lts for security reasons. ↩︎
It deserves repeating: delivering LTS software does not require using a build process with feature-frozen LTS; it only requires a stable build process with continuing support, which the stable release channel provides. The partial exceptions that can apply with other languages with respect to application "plugins" don't apply to the Rust toolchain, as Rust provides identical stability across both semver-patch and semver-minor updates. ↩︎
Starting with the coming 2027 release; every two years before 2027. ↩︎