Skip to content

Roll Node.js floor back to >= 24 (Active LTS) — closes #7779#7781

Merged
JohnMcLear merged 2 commits into
developfrom
chore/node-24-floor
May 16, 2026
Merged

Roll Node.js floor back to >= 24 (Active LTS) — closes #7779#7781
JohnMcLear merged 2 commits into
developfrom
chore/node-24-floor

Conversation

@JohnMcLear
Copy link
Copy Markdown
Member

Summary

Closes #7779.

#7779 originally proposed bumping past the Node 25 stop-gap to Node 26. After re-checking the release schedule, the cleaner LTS target is actually Node 24:

So this PR reverts the Node 25 ratchet from those three PRs and lands on Node 24 — Etherpad's runtime floor stays on a supported LTS for the next ~2 years.

Runtime / infra

  • package.json + src/package.json: engines.node >=25.0.0 -> >=24.0.0
  • bin/functions.sh, bin/installer.sh, bin/installer.ps1: REQUIRED_NODE_MAJOR 25 -> 24
  • Dockerfile: node:25-alpine -> node:24-alpine (both stages). Corepack-via-npm workaround is intentionally kept: it works on Node 24 (which still ships corepack) and on Node 25+ (which doesn't), so the same recipe survives the next LTS bump without churn. Comments reworded accordingly.
  • snap/snapcraft.yaml: pinned NODE_VERSION 25.9.0 -> 24.15.0; design notes + corepack comment adjusted
  • packaging/nfpm.yaml: nodejs (>= 25) -> nodejs (>= 24) in top-level depends + deb/rpm overrides
  • packaging/bin/etherpad: comment matches the new pin
  • packaging/README.md: build prereqs + apt install snippet point at node_24.x; the long-stale "engines.node floor is 20" line is fixed while we're here
  • .github/workflows/*.yml: setup-node node-version 25 -> 24 across every workflow; backend / frontend-admin / upgrade matrices [25] -> [24]
  • .github/workflows/deb-package.yml: NODE_MAJOR=25 + node_25.x smoke-test installer -> 24
  • bin/plugins/lib/npmpublish.yml: 25 -> 24 (template propagates to the ~80 ether/* plugins via update-plugins workflow)

Docs

  • README.md: install one-liner + Requirements -> Node.js >= 24
  • doc/npm-trusted-publishing.md: runner requirement -> Node 24
  • doc/plugins.md / doc/plugins.adoc: plugin metadata example engines.node -> ">=24.0.0"

Notes

  • @types/node left at ^25.8.0 — newer type definitions cover Node 24 runtime fine and avoid an unnecessary lockfile churn.
  • Source code reads the floor dynamically from engines.node (src/node/utils/NodeVersion.ts), so no source changes are needed.
  • Companion homepage one-liner change to follow on ether/ether.github.com.
  • In-flight plugin engines.node sweep: I'll retarget it so plugins float on a permissive >=22 floor (or keep their existing one if already higher) rather than tightly tracking core — this leaves plugins installable on older Etherpad/Node combinations and reduces churn.

Test plan

  • All CI workflows go green on Node 24 only (backend, frontend, frontend-admin, docker, deb-package, installer-test, perform-type-check, upgrade-from-latest-release).
  • docker build . succeeds against node:24-alpine.
  • Snap build on core24 with NODE_VERSION=24.15.0.
  • apt-get install nodejs inside deb-package smoke step pulls 24.x via NodeSource node_24.x.
  • Installer one-liner on Node 22 fails fast with the new minimum.

🤖 Generated with Claude Code

Closes #7779.

#7779 originally proposed bumping past the Node 25 stop-gap to Node 26.
After re-checking the release schedule, the cleaner LTS target is
actually Node 24:

- Node 24 (Krypton) is currently in Active LTS, supported until ~May 2028.
- Node 25 hit end-of-life on April 10 2026 — the floor merged in
  #7752 / #7749 / #7754 a day ago ships an already-EOL major.
- Node 26 was released May 5 2026 and does not enter Active LTS until
  October 2026.

So this PR reverts the Node 25 ratchet from those three PRs and lands
on Node 24 — Etherpad's runtime floor stays on a supported LTS for the
next ~2 years.

Runtime / infra
- `package.json` + `src/package.json`: `engines.node` `>=25.0.0` -> `>=24.0.0`
- `bin/functions.sh`, `bin/installer.sh`, `bin/installer.ps1`:
  `REQUIRED_NODE_MAJOR` 25 -> 24
- `Dockerfile`: `node:25-alpine` -> `node:24-alpine` (both stages).
  Corepack-via-npm workaround is intentionally kept: it works on
  Node 24 (which still ships corepack) and on Node 25+ (which doesn't),
  so the same recipe survives the next LTS bump without churn. Comments
  reworded accordingly.
- `snap/snapcraft.yaml`: pinned `NODE_VERSION` 25.9.0 -> 24.15.0; design
  notes + corepack comment adjusted
- `packaging/nfpm.yaml`: `nodejs (>= 25)` -> `nodejs (>= 24)` in
  top-level depends + deb/rpm overrides
- `packaging/bin/etherpad`: comment matches the new pin
- `packaging/README.md`: build prereqs + apt install snippet point at
  `node_24.x`; the long-stale "engines.node floor is 20" line is fixed
  while we're here
- `.github/workflows/*.yml`: setup-node `node-version` 25 -> 24 across
  every workflow; backend / frontend-admin / upgrade matrices
  `[25]` -> `[24]`
- `.github/workflows/deb-package.yml`: `NODE_MAJOR=25` + `node_25.x`
  smoke-test installer -> 24
- `bin/plugins/lib/npmpublish.yml`: 25 -> 24 (template propagates to
  the ~80 ether/* plugins via update-plugins workflow)

Docs
- `README.md`: install one-liner + Requirements -> Node.js >= 24
- `doc/npm-trusted-publishing.md`: runner requirement -> Node 24
- `doc/plugins.md` / `doc/plugins.adoc`: plugin metadata example
  `engines.node` -> `">=24.0.0"`

@types/node is left at ^25.8.0 — newer type definitions cover Node 24
runtime fine and avoid an unnecessary lockfile churn.

Companion homepage one-liner change to follow on ether/ether.github.com.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@qodo-code-review
Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@qodo-free-for-open-source-projects
Copy link
Copy Markdown

Review Summary by Qodo

Downgrade Node.js floor to >= 24 (Active LTS) — closes #7779

✨ Enhancement

Grey Divider

Walkthroughs

Description
• Downgrade Node.js minimum from 25 to 24 (Active LTS)
• Update all CI workflows to test against Node 24
• Revise Docker, Snap, and package configs for Node 24
• Fix stale documentation references to Node version
Diagram
flowchart LR
  A["Node 25<br/>EOL Apr 2026"] -->|"Revert to"| B["Node 24<br/>Active LTS<br/>until May 2028"]
  B -->|"Update"| C["Runtime Config<br/>package.json<br/>Dockerfile<br/>Snap/nfpm"]
  B -->|"Update"| D["CI Workflows<br/>All test matrices<br/>setup-node versions"]
  B -->|"Update"| E["Documentation<br/>README<br/>Plugin examples<br/>Build guides"]
Loading

Grey Divider

File Changes

1. bin/functions.sh ⚙️ Configuration changes +1/-1

Update required Node major version to 24

bin/functions.sh


2. bin/installer.sh ⚙️ Configuration changes +1/-1

Update required Node major version to 24

bin/installer.sh


3. bin/installer.ps1 ⚙️ Configuration changes +1/-1

Update required Node major version to 24

bin/installer.ps1


View more (27)
4. .github/workflows/backend-tests.yml ⚙️ Configuration changes +7/-7

Update test matrix and comments to Node 24

.github/workflows/backend-tests.yml


5. .github/workflows/build-and-deploy-docs.yml ⚙️ Configuration changes +2/-2

Update setup-node version to 24

.github/workflows/build-and-deploy-docs.yml


6. .github/workflows/deb-package.yml ⚙️ Configuration changes +6/-6

Update Node version and apt repo references to 24

.github/workflows/deb-package.yml


7. .github/workflows/docker.yml ⚙️ Configuration changes +1/-1

Update setup-node version to 24

.github/workflows/docker.yml


8. .github/workflows/frontend-admin-tests.yml ⚙️ Configuration changes +2/-2

Update test matrix to Node 24

.github/workflows/frontend-admin-tests.yml


9. .github/workflows/frontend-tests.yml ⚙️ Configuration changes +4/-4

Update setup-node version to 24

.github/workflows/frontend-tests.yml


10. .github/workflows/handleRelease.yml ⚙️ Configuration changes +1/-1

Update setup-node version to 24

.github/workflows/handleRelease.yml


11. .github/workflows/installer-test.yml ⚙️ Configuration changes +2/-2

Update setup-node version to 24

.github/workflows/installer-test.yml


12. .github/workflows/load-test.yml ⚙️ Configuration changes +3/-3

Update setup-node version to 24

.github/workflows/load-test.yml


13. .github/workflows/perform-type-check.yml ⚙️ Configuration changes +1/-1

Update setup-node version to 24

.github/workflows/perform-type-check.yml


14. .github/workflows/rate-limit.yml ⚙️ Configuration changes +1/-1

Update setup-node version to 24

.github/workflows/rate-limit.yml


15. .github/workflows/release.yml ⚙️ Configuration changes +1/-1

Update setup-node version to 24

.github/workflows/release.yml


16. .github/workflows/releaseEtherpad.yml ⚙️ Configuration changes +2/-2

Update setup-node version and comments to 24

.github/workflows/releaseEtherpad.yml


17. .github/workflows/update-plugins.yml ⚙️ Configuration changes +1/-1

Update setup-node version to 24

.github/workflows/update-plugins.yml


18. .github/workflows/upgrade-from-latest-release.yml ⚙️ Configuration changes +2/-2

Update test matrix to Node 24

.github/workflows/upgrade-from-latest-release.yml


19. Dockerfile ⚙️ Configuration changes +10/-8

Update base image to node:24-alpine, revise comments

Dockerfile


20. README.md 📝 Documentation +2/-2

Update Node.js requirement to >= 24

README.md


21. bin/plugins/lib/npmpublish.yml ⚙️ Configuration changes +2/-2

Update Node version to 24 in plugin template

bin/plugins/lib/npmpublish.yml


22. doc/npm-trusted-publishing.md 📝 Documentation +3/-3

Update Node.js requirement to >= 24

doc/npm-trusted-publishing.md


23. doc/plugins.adoc 📝 Documentation +1/-1

Update plugin example engines.node to >= 24

doc/plugins.adoc


24. doc/plugins.md 📝 Documentation +1/-1

Update plugin example engines.node to >= 24

doc/plugins.md


25. package.json ⚙️ Configuration changes +1/-1

Update engines.node to >= 24.0.0

package.json


26. packaging/README.md 📝 Documentation +5/-6

Update Node version and apt repo references to 24

packaging/README.md


27. packaging/bin/etherpad 📝 Documentation +1/-1

Update comment to reflect Node 24 dependency

packaging/bin/etherpad


28. packaging/nfpm.yaml ⚙️ Configuration changes +3/-3

Update nodejs dependency to >= 24

packaging/nfpm.yaml


29. snap/snapcraft.yaml ⚙️ Configuration changes +9/-8

Update Node version to 24.15.0 and design notes

snap/snapcraft.yaml


30. src/package.json ⚙️ Configuration changes +1/-1

Update engines.node to >= 24.0.0

src/package.json


Grey Divider

Qodo Logo

@qodo-free-for-open-source-projects
Copy link
Copy Markdown

qodo-free-for-open-source-projects Bot commented May 16, 2026

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider

Great, no issues found!

Qodo reviewed your code and found no material issues that require review

Grey Divider

Qodo Logo

Plugin code is overwhelmingly ace-hook glue and rarely uses Node-version-
specific APIs, so plugin engines.node should reflect the plugin's own
requirements, not track core. Showing core's 24-floor in the example
encouraged plugin authors to blindly copy a tighter pin than necessary
and locked plugins out of being installable on older Etherpad/Node
deployments. Use the most-recent Node LTS that has actually reached EOL
(20 -> EOL April 2026) as the example floor, i.e. >=22.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@JohnMcLear
Copy link
Copy Markdown
Member Author

CI green across the board (17 pass, 0 failures, 10 path-ignored skips on doc-only paths) — including with plugins (24) backend, all four Playwright variants, snap build with NODE_VERSION=24.15.0, deb-package smoke, and installer-test on Linux/macOS/Windows. Ready for review.

@JohnMcLear JohnMcLear merged commit 04045fe into develop May 16, 2026
27 checks passed
@JohnMcLear JohnMcLear deleted the chore/node-24-floor branch May 16, 2026 12:08
JohnMcLear added a commit to ether/ether.github.com that referenced this pull request May 16, 2026
Companion to ether/etherpad#7781 (closes ether/etherpad#7779).

Node 25 hit end-of-life on April 10 2026, so the runtime floor #402 set
on the homepage points at an already-EOL major. Roll back to Node 24,
which is the current Active LTS (supported until ~May 2028).

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
JohnMcLear added a commit to ether/ueberDB that referenced this pull request May 16, 2026
Etherpad has settled back on Node 24 as its minimum supported runtime
(ether/etherpad#7781), so ueberDB's recent bump to >=25 (#961) is now
ahead of its primary consumer. Lower `engines.node` and the CI runner
back to 24 to keep the library in lock-step.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Instead of node25 we can go node26 to get LTS or back to 24 for LTS

1 participant