Require Node.js >= 25 (engines, installers, Dockerfile, snap, CI, docs)#7749
Conversation
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
Review Summary by QodoBump documented Node.js minimum version to 25
WalkthroughsDescription• Update Node.js minimum version from 22 to 25 in README • Bump Node.js requirement to >= 25 in npm publishing docs • Update plugin metadata examples to require Node.js >= 25.0.0 • Align documentation with CI matrix already pinned to Node 25 Diagramflowchart LR
A["Documentation Files"] -->|Update Node.js requirement| B["README.md"]
A -->|Update Node.js requirement| C["doc/npm-trusted-publishing.md"]
A -->|Update plugin example| D["doc/plugins.md"]
A -->|Update plugin example| E["doc/plugins.adoc"]
B -->|22 to 25| F["Node.js >= 25"]
C -->|22.12 to 25| F
D -->|12.17.0 to 25.0.0| F
E -->|12.17.0 to 25.0.0| F
File Changes1. README.md
|
Code Review by Qodo
Context used✅ Tickets:
🎫 Ideas for table support 1. engines.node requirement misdocumented
|
| - **Node.js**: >= 25 on the runner. `setup-node@v6 with version: 25` | ||
| resolves to the latest 25.x. The project's `engines.node` requires | ||
| `>=25.0.0`. |
There was a problem hiding this comment.
1. engines.node requirement misdocumented 📘 Rule violation ≡ Correctness
The documentation now claims the project's engines.node requires >=25.0.0 and implies workflows should use Node 25, but the repository still declares >=22.13.0 and the referenced publishing workflow template uses Node 22. This creates a misleading, unnecessary breaking requirement in user-facing guidance about supported Node versions.
Agent Prompt
## Issue description
`doc/npm-trusted-publishing.md` states the project requires `engines.node >=25.0.0` and implies publishing workflows should run on Node 25, but the repository still declares `engines.node >=22.13.0` and the referenced publish workflow template uses Node 22. This inconsistency can mislead users/maintainers and effectively introduces an unnecessary breaking requirement in published guidance.
## Issue Context
The PR updates documentation to Node.js >= 25, but the runtime requirement in `package.json` has not been updated in this PR. Additionally, the documentation references a publishing workflow template (`bin/plugins/lib/npmpublish.yml`) that currently uses `actions/setup-node` with `node-version: 22`, reinforcing that Node 22.x remains the intended baseline in the repo.
## Fix Focus Areas
- doc/npm-trusted-publishing.md[86-90]
- package.json[44-46]
- bin/plugins/lib/npmpublish.yml[0-0]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
There was a problem hiding this comment.
Addressed in c6b6eb5 — package.json is now engines.node: ">=25.0.0" and bin/plugins/lib/npmpublish.yml uses node-version: 25. The doc now matches the enforced minimum and the propagated workflow template.
| ### Requirements | ||
|
|
||
| [Node.js](https://nodejs.org/) >= 22.12. | ||
| [Node.js](https://nodejs.org/) >= 25. |
There was a problem hiding this comment.
2. Readme node minimum inconsistent 📘 Rule violation ≡ Correctness
README.md now states Node.js >= 25 as a requirement, but the repository still declares engines.node as >=22.13.0, making the documentation inconsistent with the enforced constraint. This unnecessarily introduces a breaking-looking requirement and can mislead users (including those on official environments still using Node 22) about what versions actually work today.
Agent Prompt
## Issue description
`README.md` currently claims Node.js `>= 25`, but the repo’s declared/enforced minimum remains `engines.node: >=22.13.0`, which makes the documentation inconsistent and misleading and creates an unnecessary breaking-looking requirement for users (including those on official environments still using Node 22).
## Issue Context
This PR updates documentation only; runtime/infra updates (including changing `package.json` engines, installer version checks, or official build artifacts like Docker base images/snaps) are out of scope. The documentation should therefore not claim a higher Node minimum than the repo currently enforces unless it is clearly marked as future/planned.
## Fix Focus Areas
- README.md[65-68]
- README.md[67-67]
- README.md[159-162]
- package.json[44-46]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
There was a problem hiding this comment.
Addressed in c6b6eb5 — engines.node is now >=25.0.0 and bin/installer.{sh,ps1}, bin/functions.sh, Dockerfile, and snap/snapcraft.yaml all moved to 25. README no longer overstates the requirement relative to what the runtime enforces.
| "contributors": [], | ||
| "dependencies": {"MODULE": "0.3.20"}, | ||
| "engines": {"node": ">=12.17.0"} | ||
| "engines": {"node": ">=25.0.0"} |
There was a problem hiding this comment.
3. Plugin engines example incompatible 🐞 Bug ≡ Correctness
The plugin metadata examples now recommend engines.node: ">=25.0.0", which conflicts with Etherpad’s currently declared support (>=22.13.0) and official Node 22 distributions, encouraging plugin authors to publish plugins that are incompatible with supported installs.
Agent Prompt
### Issue description
The plugin authoring docs update the example `engines.node` to `>=25.0.0`, but Etherpad itself still declares `engines.node >=22.13.0` and ships Node 22 in official packaging (Docker image base, snap). This example will lead plugin authors to declare a higher minimum than the platform they’re targeting.
### Issue Context
Both the Markdown and AsciiDoc versions of the plugin docs include the same example snippet and should be kept consistent.
### Fix Focus Areas
- doc/plugins.md[221-231]
- doc/plugins.adoc[225-235]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
There was a problem hiding this comment.
Addressed in c6b6eb5 — Etherpad now declares engines.node: ">=25.0.0" and ships Node 25 in Docker (node:25-alpine) and snap (NODE_VERSION=25.9.0), so the plugin metadata example is no longer ahead of the platform it targets. doc/plugins.adoc mirrors the same example.
Etherpad is moving its supported Node.js floor to >= 25 (CI matrix is already pinned to 25 across all workflows on the node25-corepack-pnpm11 work). Sync the user-facing documentation so the install instructions, requirements section, and plugin metadata example all reflect the new minimum instead of Node 22 / 12.17. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ether#7747 added Node 25 *support* but left the floor at Node 22. This commit completes the cutover so the runtime requirement matches the documentation bumped in the previous commit. - package.json: engines.node ">=22.13.0" → ">=25.0.0" - bin/functions.sh, bin/installer.sh, bin/installer.ps1: REQUIRED_NODE bumped to 25 (controls the error message users see when they invoke the installer or pnpm scripts on an older Node) - Dockerfile: base image node:22-alpine → node:25-alpine (×2). Corepack comment updated: Node 25 no longer ships corepack at all, so we install it from npm rather than refreshing a stale signing-key list - snap/snapcraft.yaml: pinned NODE_VERSION 22.22.2 → 25.9.0 and the surrounding design notes rewritten to reflect Node 25 instead of 22 - .github/workflows/*.yml: matrix dropped from [22, 24, 25] to just [25] (anything older now fails engines anyway). Stale comments in build-and-deploy-docs.yml referencing vite 8's 22.12 floor cleaned up - bin/plugins/lib/npmpublish.yml: setup-node 22 → 25 so the plugin template propagated to every ether/* plugin matches the new minimum Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
f57abb3 to
c6b6eb5
Compare
node:25-alpine doesn't ship corepack but does pre-install yarn at /usr/local/bin/yarn, so `npm install -g corepack@latest` fails with EEXIST trying to register its yarn shim. Per ether#7747, end-users install pnpm via plain `npm install -g pnpm` on Node 25 — use the same flow in the Dockerfile (and remove the unused yarn binary so it doesn't sit on PATH inside the image). Drops COREPACK_HOME and the related issue-7687 cache-sharing tweak since there's no corepack shim to share. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ueberDB has historically tracked Etherpad's Node floor. With Etherpad now moving to require Node.js >= 25 (ether/etherpad#7749), bump ueberDB's `engines.node` and CI runner Node version to match. This keeps the library in lock-step with its primary consumer so plugin authors and Etherpad installs don't end up on diverging runtimes. External consumers still on Node 22/24 should pin to a 6.0.x release; this commit prepares 6.1.x for the cutover. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Roll Node.js floor back to >= 24 (Active LTS) 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> * docs(plugins): example engines.node = ">=22.0.0", not core's floor 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> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
Completes the move to Node.js 25 as the supported minimum. #7747 added Node 25 support; this PR makes 25 the floor so docs and runtime match.
Runtime / infra
package.json:engines.node">=22.13.0"→">=25.0.0"bin/functions.sh,bin/installer.sh,bin/installer.ps1:REQUIRED_NODE_MAJOR22 → 25 (controls the error message when invoked on an older Node)Dockerfile:node:22-alpine→node:25-alpine(both stages). Corepack comment updated — Node 25 no longer ships corepack at all, so we install it from npm rather than refresh a stale signing-key list.snap/snapcraft.yaml: pinnedNODE_VERSION22.22.2 → 25.9.0 + design notes rewritten for Node 25..github/workflows/*.yml: matrix[22, 24, 25]→[25](older versions would fail engines anyway).bin/plugins/lib/npmpublish.yml:setup-node22 → 25 so the propagated plugin template matches.Docs
README.md: install one-liner + Requirements → Node.js >= 25.doc/npm-trusted-publishing.md: requirements rewritten for Node 25.doc/plugins.md/doc/plugins.adoc: plugin metadata exampleengines.node→">=25.0.0".Companion homepage change: ether/ether.github.com#402.
Out of scope
bin/plugins/lib/npmpublish.ymlis updated here; theupdate-pluginsworkflow will propagate it.Test plan
pnpm i && pnpm run build:etherpad && pnpm run prodon Node 25.docker build .on a host with the new base image.core24withNODE_VERSION=25.9.0.🤖 Generated with Claude Code