Runtimes

Node.js compatibility

This reference covers supported Node.js lines, why the minimum versions exist, and how they changed across OpenClaw releases. For installation steps, see Node.js; for macOS companion app requirements, see macOS.

Supported versions

Line Status Minimum Notes
Node 26 Recommended >=26.1.0 Faster Gateway startup and lower memory use than Node 24.
Node 24 Supported >=24.16.0 <25 LTS line used by CI and the Linux installer.
Node 25 Unsupported Excluded by the current TEXT decoder floor.
Node 23 Unsupported Excluded earlier for incompatible node:sqlite behavior.
Node 22 Unsupported Unsupported since the 24.16.0/26.1.0 floor.

The exact engines expression is >=24.16.0 <25 || >=26.1.0. It remains the documented support policy and the package.json engine range used by package managers.

How the gate decides

Startup, doctor, Gateway runtime selection, update preflight, and installer runtime validation check the actual node:sqlite binding: it must be present, load a WAL-safe SQLite library, and preserve embedded and trailing NULs through TEXT, BLOB, and JSON round trips. The probe uses an in-memory database and caches the current process result; checks of another executable run the same probe in that executable with a bounded timeout. A build within the supported version table is refused if the probe fails.

The running package's startup guard and Gateway runtime selection admit a Node 24 or newer release outside the table when the probe passes, with the note unsupported version, capability probe passed. Its capabilities meet this package's correctness gate, but it remains outside the tested support policy. This permits vendor backports without claiming support for their version. Node 22 and 23 remain excluded, and package manager engine checks still apply.

Installers retain the numeric Node requirement and add the probe as a second gate. Package and Git update preflight also require the selected target's engines.node range numerically, including any fallback runtime. A passing probe cannot relax another package's requirements: an older release may still enforce its version table at startup.

Why the floors exist

The SQLite WAL-reset corruption bug requires a safe loaded library: SQLite 3.51.3+, 3.50.7+ within 3.50.x, or 3.44.6+ within 3.44.x. OpenClaw validates the library actually loaded because Node builds linked to shared system SQLite can use a different version from Node's own metadata.

Separately, the node:sqlite TEXT decoder in Node 22.23.x, 24.15.0, 25.9.0, and 26.0.0 silently truncates values at embedded NUL characters. The first fixed releases are Node 24.16.0 and 26.1.0; a WAL-safe SQLite library does not fix this decoder. Node 23 was excluded earlier for incompatible node:sqlite behavior.

Platform consequences

Official Node 24+ binaries require macOS 13.5+, so macOS 11 through 13.4 no longer support the Node-based CLI or Gateway. The companion app has separate macOS requirements.

Supported Node lines have no official Linux ARMv7 builds. Use a 64-bit operating system on compatible ARM hardware, or another supported host.

On RPM-based distributions, the installer preserves a supported distro-owned Node package that links unsafe system SQLite and provisions a separate user-space runtime for OpenClaw.

What the installer provisions

Recommended, supported, and provisioned are three different things.

Platform Installer path Node provisioned
Linux install.sh: apt/dnf/yum via NodeSource Node 24.x LTS.
Linux and macOS Rootless install-cli.sh Node 24.19.0 by default; existing runtime reuse and explicit version selection can differ.
macOS install.sh: Homebrew node Node 26; no exact patch pinned, and an existing supported Node can be retained.
Windows install.ps1: Chocolatey, Scoop, or winget LTS package; no exact patch pinned, validated after installation.
Windows install.ps1: portable fallback Latest 26.x Windows zip.

See Installer internals for provisioning details.

Check your runtime

bash
node -v

Use a supported Node release for the recommended installation path. A broken TEXT decoder is refused with this diagnostic:

Node <v>: node:sqlite truncates TEXT at embedded NUL (nodejs/node#61954); use 24.16+/26.1+ or a build with the fix

History across releases

Rows identify the first effective release, including a beta when applicable. Recommendation and installer changes are listed even when the numeric requirement stayed the same.

Release Node requirement What changed and why
Unreleased (main) Unchanged support policy Replaces decoder version-only admission with an in-memory NUL round-trip probe; capable vendor builds on Node 24+ may run with an unsupported-version note. Node 22/23 remain excluded.
v2026.9.3 >=24.16.0 <25 || >=26.1.0 Raises the Node 24 floor and drops Node 22 and 25 to prevent embedded-NUL TEXT truncation; Node 23 remains excluded. Official Node-based support for macOS 11–13.4 and Linux ARMv7 provisioning ends. #140672
v2026.8.2 >=22.22.3 <23 || >=24.15.0 <25 || >=25.9.0 Preserves supported RPM-owned Node packages with unsafe system SQLite and provisions a separate user-space runtime. The numeric range and loaded-library safety requirement stay unchanged. #134166
v2026.8.1 >=22.22.3 <23 || >=24.15.0 <25 || >=25.9.0 Rootless defaults advance to 24.19.0, or 22.23.2 on ARMv7. Linux package provisioning returns to Node 24 LTS to avoid prerelease repository builds. #130369
v2026.8.1-beta.3; stable v2026.8.1 >=22.22.3 <23 || >=24.15.0 <25 || >=25.9.0 Centralizes release classification in node-version.mjs, rejecting prerelease, nightly, and malformed version labels. #124812
v2026.7.2-beta.5; stable v2026.8.1 >=22.22.3 <23 || >=24.15.0 <25 || >=25.9.0 Recommends Node 26 for faster Gateway startup and lower memory use than Node 24. CI and release workflows retain Node 24. #114399
v2026.7.1; main v2026.7.2-beta.1 >=22.22.3 <23 || >=24.15.0 <25 || >=25.9.0 Requires builds carrying the SQLite WAL-reset fix, validates the actual loaded SQLite library, and excludes all Node 23. Shipped through a release cherry-pick. #106065
v2026.7.1-beta.2 >=22.19.0 <23 || >=23.11.0 Excludes Node 23.0–23.10 for incompatible SQLite behavior in the dialect's StatementSync.columns() path. Superseded before stable v2026.7.1. #99832
v2026.5.16-beta.7; stable v2026.5.18 >=22.19.0 Raises the floor with the Pi dependencies' update to 0.75.1. Node 24 remains recommended.
v2026.5.9-beta.1; stable v2026.5.12 >=22.16.0 Raises the floor for the native SQLite Kysely dialect's use of StatementSync.columns() to identify result-producing statements. #78921
v2026.3.24-beta.2; stable v2026.3.24 >=22.14.0 Lowers the floor from 22.16 so npm installs and self-updates do not strand existing Node 22.14 users.
v2026.3.12 >=22.16.0 Raises the floor from 22.12 and makes Node 24 the default/recommended line for installs, CI, and releases. The recorded change does not identify a specific missing API.
v2026.2.6 >=22.12.0 Aligns the startup guard with the package requirement because Matrix's SDK requires 22.12 and older runtimes produce misleading module-not-found errors. #5370
v2026.1.5 (earlier v2.0.0-beta3) Package >=22.12.0; startup >=22.0.0 Raises the package floor from 22.0 to 22.12 without a recorded API-specific reason. Startup validation temporarily retains the older minimum.
Before 2026 >=22.0.0 The earliest package engine declaration requires Node 22; no narrower runtime-feature justification is recorded.
Was this useful?
On this page

On this page