Skip to content

Require Node.js >= 25 (engines, installers, Dockerfile, snap, CI, docs)#7749

Merged
JohnMcLear merged 3 commits into
ether:developfrom
JohnMcLear:docs/node-25-minimum
May 15, 2026
Merged

Require Node.js >= 25 (engines, installers, Dockerfile, snap, CI, docs)#7749
JohnMcLear merged 3 commits into
ether:developfrom
JohnMcLear:docs/node-25-minimum

Conversation

@JohnMcLear
Copy link
Copy Markdown
Member

@JohnMcLear JohnMcLear commented May 15, 2026

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_MAJOR 22 → 25 (controls the error message when invoked on an older Node)
  • Dockerfile: node:22-alpinenode: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: pinned NODE_VERSION 22.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-node 22 → 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 example engines.node">=25.0.0".

Companion homepage change: ether/ether.github.com#402.

Out of scope

  • Ongoing plugin template propagation across the ~80 ether/* plugins — the template in bin/plugins/lib/npmpublish.yml is updated here; the update-plugins workflow will propagate it.

Test plan

  • Local pnpm i && pnpm run build:etherpad && pnpm run prod on Node 25.
  • docker build . on a host with the new base image.
  • Snap build on core24 with NODE_VERSION=25.9.0.
  • Installer dry-run on Node 22 — confirm it now fails fast with the new minimum.
  • Confirm all CI workflows run green on Node 25 only.

🤖 Generated with Claude Code

@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

Bump documented Node.js minimum version to 25

📝 Documentation

Grey Divider

Walkthroughs

Description
• 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
Diagram
flowchart 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
Loading

Grey Divider

File Changes

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

Update Node.js minimum to 25 in README

• Update quick install one-liner requirement from Node.js >= 22 to >= 25
• Update Requirements section from Node.js >= 22.12 to >= 25

README.md


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

Update Node.js minimum to 25 in publishing docs

• Update Node.js requirement from >= 22.12 to >= 25
• Simplify requirements text by removing version-specific constraints
• Update engines.node requirement to >= 25.0.0

doc/npm-trusted-publishing.md


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

Update plugin example Node.js requirement to 25

• Update plugin metadata example engines.node from >= 12.17.0 to >= 25.0.0

doc/plugins.md


View more (1)
4. doc/plugins.adoc 📝 Documentation +1/-1

Update plugin example Node.js requirement to 25

• Update plugin metadata example engines.node from >= 12.17.0 to >= 25.0.0

doc/plugins.adoc


Grey Divider

Qodo Logo

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

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

Code Review by Qodo

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

Context used

Grey Divider


Action required

1. engines.node requirement misdocumented 📘 Rule violation ≡ Correctness
Description
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.
Code

doc/npm-trusted-publishing.md[R88-90]

+- **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`.
Evidence
Rule 7 requires avoiding unnecessary or unjustified breaking changes in user-facing configuration
requirements. The updated doc/npm-trusted-publishing.md asserts engines.node >=25.0.0 and
recommends Node 25 for actions/setup-node, but the repo’s package.json still sets engines.node
to >=22.13.0, and the publishing workflow template referenced by the documentation
(bin/plugins/lib/npmpublish.yml) is configured with node-version: 22, demonstrating the
documentation is inconsistent with the repository’s actual supported/runtime configuration.

doc/npm-trusted-publishing.md[88-90]
package.json[44-46]
doc/npm-trusted-publishing.md[86-90]
src/package.json[140-144]
bin/plugins/lib/npmpublish.yml[21-27]
Best Practice: Repository guidelines

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## 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


2. README Node minimum inconsistent 📘 Rule violation ≡ Correctness
Description
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.
Code

README.md[161]

+[Node.js](https://nodejs.org/) >= 25.
Evidence
Rule 7 emphasizes minimizing incompatible/breaking changes to configuration expectations, and the
cited changes show a mismatch between documentation and enforcement: the README was updated to
require Node >= 25, while package.json continues to declare engines.node as >=22.13.0. Because
the repo’s actual minimum remains 22.13.0 (and existing shipped/official environments still target
Node 22.x), the new README requirement is factually inconsistent with the current repository state
and creates an unnecessary breaking expectation for users who already satisfy the real engine
constraint.

README.md[67-67]
README.md[159-162]
package.json[44-46]
README.md[65-68]
src/package.json[140-144]
bin/functions.sh[1-4]
Dockerfile[10-13]
packaging/README.md[91-93]
snap/README.md[70-73]
Best Practice: Repository guidelines

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## 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


3. Plugin engines example incompatible 🐞 Bug ≡ Correctness
Description
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.
Code

doc/plugins.md[229]

+  "engines": {"node": ">=25.0.0"}
Evidence
The plugin docs now show >=25.0.0, but Etherpad core still declares >=22.13.0 and official
artifacts are based on Node 22, demonstrating the new example is inconsistent with the runtime
currently supported and shipped by the project.

doc/plugins.md[221-230]
doc/plugins.adoc[225-235]
package.json[44-46]
src/package.json[140-144]
Dockerfile[10-13]
snap/README.md[70-73]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


Grey Divider

Qodo Logo

Comment on lines +88 to +90
- **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`.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in c6b6eb5package.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.

Comment thread README.md
### Requirements

[Node.js](https://nodejs.org/) >= 22.12.
[Node.js](https://nodejs.org/) >= 25.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in c6b6eb5engines.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.

Comment thread doc/plugins.md
"contributors": [],
"dependencies": {"MODULE": "0.3.20"},
"engines": {"node": ">=12.17.0"}
"engines": {"node": ">=25.0.0"}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

JohnMcLear and others added 2 commits May 15, 2026 09:49
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>
@JohnMcLear JohnMcLear force-pushed the docs/node-25-minimum branch from f57abb3 to c6b6eb5 Compare May 15, 2026 08:51
@JohnMcLear JohnMcLear changed the title docs: bump documented Node.js minimum to 25 Require Node.js >= 25 (engines, installers, Dockerfile, snap, CI, docs) May 15, 2026
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>
@JohnMcLear JohnMcLear merged commit 7d537f3 into ether:develop May 15, 2026
27 checks passed
JohnMcLear added a commit to ether/ueberDB that referenced this pull request May 15, 2026
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>
JohnMcLear added a commit that referenced this pull request May 16, 2026
* 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant