|
| 1 | +# ADR [Number]: LTS Strategy and Support Schedule |
| 2 | + |
| 3 | +## Status |
| 4 | + |
| 5 | +Proposed |
| 6 | + |
| 7 | +## Submitters |
| 8 | + |
| 9 | +- @wesleytodd |
| 10 | + |
| 11 | +## Decision Owners |
| 12 | + |
| 13 | +- @expressjs/express-tc |
| 14 | + |
| 15 | +## Context |
| 16 | + |
| 17 | +Conversation about our LTS strategy, support dates for our major release lines, and how we should message this content |
| 18 | +has been spread out across multiple issues, repos, slack channels, and meetings. We have landed a few starter documents, |
| 19 | +and generally have agreed on our goals/strategy but we have not officially documented and centralized that. This ADR is |
| 20 | +both gathering all that context to one place as well as give concrete decisions and next steps. |
| 21 | + |
| 22 | +### Scope: |
| 23 | + |
| 24 | +This ADR applies to, and should cover, all repositories within the Express Projects three orgs (`jshttp`, `pillarjs`, |
| 25 | +`expressjs`). While everything stems from support for the primary `express` package, due to the coupling of many of our |
| 26 | +dependency and middleware packages, we must also address those packages as well. |
| 27 | + |
| 28 | +### ADR Goals: |
| 29 | + |
| 30 | +- Improve documentation on our support goals |
| 31 | +- Document criteria and reasoning for when to release new majors |
| 32 | +- Define life cycle for releases, terminology we will use, |
| 33 | +- Improve documentation on how our LTS relates to Node.js version support |
| 34 | +- Documentation on how our LTS relates to our direct dependencies and other Express project repos/packages |
| 35 | +- Set clear next steps for documenting and publicising the LTS strategy |
| 36 | +- Select dates for known release line support and EOL |
| 37 | +- Create starter language and graphics for our future blog posts, website additions, and other necessary docs |
| 38 | + |
| 39 | +### ADR Non-Goals: |
| 40 | + |
| 41 | +- Create an end-user documentation resource (either for immediate use or future use) |
| 42 | +- Commit to future release dates |
| 43 | + |
| 44 | +**Existing issues/discussions/pull requests related to this:** |
| 45 | + |
| 46 | +- Initial LTS strategy doc: https://github.com/expressjs/discussions/blob/master/docs/LTS-strategy.md |
| 47 | +- Additional LTS doc proposal: https://github.com/expressjs/admin/pull/3 |
| 48 | +- https://github.com/ctcpip/express-release |
| 49 | +- Some other related discussions: |
| 50 | + - https://github.com/expressjs/discussions/issues/196 |
| 51 | + - https://github.com/expressjs/discussions/issues/172 |
| 52 | + - https://github.com/expressjs/discussions/issues/67 |
| 53 | +- TC Slack Discussion: https://openjs-foundation.slack.com/archives/C06KMCETHG9/p1724863852681889 |
| 54 | + |
| 55 | +### Package/Repository Types |
| 56 | + |
| 57 | +We maintain four primary types of packages/repos: |
| 58 | + |
| 59 | +1. `express`: The minimal http framework |
| 60 | +2. `express` dependencies: Libraries which are used directly or transitively within `express` and also by others outside |
| 61 | + of the project |
| 62 | +3. Middleware: Libraries for use *with* `express` but not installed with it directly |
| 63 | +4. Others: Tools, documentation, websites, resources, etc. |
| 64 | + |
| 65 | +While much of this proposal is targeted specifically at `express`, this terminology will be used to differentiate where |
| 66 | +we are not only talking about `express`. |
| 67 | + |
| 68 | +## Decision |
| 69 | + |
| 70 | +The Express project will have a well defined Long Term Support (LTS) strategy and schedule based on the following |
| 71 | +requirements: |
| 72 | + |
| 73 | +- `express` major versions will go through three supported phases: Current, Active, & Maintenance |
| 74 | + - `CURRENT`: A new major version is designated as `CURRENT` upon release. It is available but not the `latest` version |
| 75 | + on npm for a minimum of 3 months. |
| 76 | + - `ACTIVE`: After the minimum 3 month period and the TC agrees it is stable and secure, the `ACTIVE` version is |
| 77 | + tagged `latest` on npm for a minimum of 12 months. |
| 78 | + - `MAINTENANCE`: When a new major version becomes `ACTIVE`, the previous major version enters `MAINTENANCE` for 12 months. |
| 79 | +- After the `MAINTENANCE` time has ended the major version is considered `EOL` and is unsupported. |
| 80 | +- During the 12 month `ACTIVE` period, a new major version may be released but *not* until at least 6 months have passed |
| 81 | + since the `CURRENT` version became `ACTIVE`. |
| 82 | +- Users are required to follow the head/latest of each major release line for support with all packages (`express`, |
| 83 | + dependencies, middleware, & tools/other) |
| 84 | +- If we have no necessary breaking changes, we will not release a new major version. Applies to `express`, |
| 85 | + dependencies, middleware, & tools/other. |
| 86 | +- Dropping old Node.js versions *alone* is not enough of a breaking change to release a new major version. Applies to |
| 87 | + `express`, dependencies, middleware, & tools/other. |
| 88 | +- `express` version 4.x is considered a special case. It will receive a longer `MAINTENENCE` phase of 18 months or until |
| 89 | + the TC agrees we are save cutting support. |
| 90 | +- `express` dependency packages will follow the same timeline and support dates for the `express` version which they are |
| 91 | + included with. |
| 92 | +- Middleware packages should follow the timeline and support dates for the `express` versions they are compatible, but |
| 93 | + should make reasonable and informed decisions which can deviate if necessary. |
| 94 | +- All other packages are suggested to define an appropriate strategy for support. |
| 95 | + |
| 96 | +### Node.js Version Support |
| 97 | + |
| 98 | +- Each major version of all packages (`express`, deps, middleware, etc) will support a minimum of the oldest Node.js LTS |
| 99 | +at the time of release and maintain that support through its entire life cycle. This includes EOL Node.js versions. |
| 100 | +- `express` may choose to continue support for EOL Node.js versions in all three phases if deemed valuable, but will |
| 101 | +strive to cut support before it becomes a drain on progress. |
| 102 | +- All `express` dependency packages must support, at a minimum, the Node.js versions that are supported by the `express` |
| 103 | +major line they are included in while that `express` line is not `EOL`. |
| 104 | +- Middleware packages must at a minimum follow the same Node.js versions as the `CURRENT` and `ACTIVE` release lines of |
| 105 | +`express`. They should attempt to also support `MAINTENANCE` lines as well, but the discretion of the captains is |
| 106 | +important. |
| 107 | +- All other packages are suggested to follow a reasonable Node.js support policy for their needs. |
| 108 | + |
| 109 | +### Life Cycle Phases & Meaning |
| 110 | + |
| 111 | +**CURRENT** |
| 112 | + |
| 113 | +- New majors will go through a short period hardening to ensure stability, security, and ecosystem libraries/resources |
| 114 | + compatibility. |
| 115 | +- We will strive to ensure no breaking changes are included, but reserve the right to make security or high priority |
| 116 | + fixes of breaking nature within this period. |
| 117 | +- `CURRENT` lines will receive all types of active work including: bug fixes, security patches, new features, and |
| 118 | + deprecation notices. |
| 119 | +- Users are recommended to use `CURRENT` lines and to upgrade as quickly as their risk profile allows |
| 120 | + |
| 121 | +**ACTIVE** |
| 122 | + |
| 123 | +- `ACTIVE` lines will receive all types of active work including: bug fixes, security patches, new features, and |
| 124 | + deprecation notices. |
| 125 | +- For users, `ACTIVE` lines are considered the most stable and well supported version at any given time. |
| 126 | + |
| 127 | +**MAINTENANCE** |
| 128 | + |
| 129 | +- `MAINTENANCE` lines will only receive security patches or high priority bug fixes. |
| 130 | +- Users are highly encouraged to upgrade to a `CURRENT` or `ACTIVE` release. |
| 131 | + |
| 132 | +### Guidelines for other packages/repos |
| 133 | + |
| 134 | +**`express` dependencies** |
| 135 | + |
| 136 | +### Schedule |
| 137 | + |
| 138 | +For the existing release lines, we will set the following phase dates: |
| 139 | + |
| 140 | + |
| 141 | +| Major | CURRENT | ACTIVE | MAINTENANCE | EOL | |
| 142 | +| ----- | ------- | ------ | ----------- | --- | |
| 143 | +| 4.x | | | 2025-04-01 | 2026-10-01 or later | |
| 144 | +| 5.x | 2024-09-11 | 2025-03-31 | 2026-04-01 | 2027-04-01 | |
| 145 | +| 6.x | TBD after 2025-10-01 | | | | |
| 146 | + |
| 147 | +### Documentation |
| 148 | + |
| 149 | +The project will maintain two types of documentation for this: |
| 150 | + |
| 151 | +**Project documentation for the maintainers:** |
| 152 | + |
| 153 | +This includes this doc, but also detailed things about the process that are not necessary for anyone but us. This |
| 154 | +documentation will live in one of three places: |
| 155 | + |
| 156 | +1. The `discussions` repo. If the content applies to more than one repo/package in any of the three orgs, is general in |
| 157 | + nature, or otherwise has no logical other place to go it goes here. |
| 158 | +2. The individual repo/package to which it applies. If an individual package has more detailed or different needs the |
| 159 | + docs will live along with the repo as decided by the captains. |
| 160 | + |
| 161 | +**User documentation:** |
| 162 | + |
| 163 | +This will be produced for the website. While the source content of it may live in other places (for example a repo to |
| 164 | +produce an image for the schedule), the users will be directed to the website to view the current updated version. |
| 165 | + |
| 166 | +**Next steps:** |
| 167 | + |
| 168 | +- Update the existing LTS doc with more details from this decision |
| 169 | +- Update website pages with more details from this decision |
| 170 | +- Close out discussions and other PRs related to this |
| 171 | + |
| 172 | +## Changelog |
| 173 | + |
| 174 | +Track changes or updates to this ADR over time. Include the date, author, and a brief description of each change. |
| 175 | + |
| 176 | +- **[2025-02-28]**: [@wesleytodd] - Initial draft |
0 commit comments