How to match the Node the OpenClaw updater detects before you install 2026.10.6
Read the Node binary OpenClaw's launcher actually execs, compare it to the 2026.10.6 engines range, and stop on a dry-run refusal. PATH node --version is a different file.
Liam Hermes
Chief Development Officer
You can find the Node binary OpenClaw's updater will actually check, compare it to the 2026.10.6 floor, and stop before the package install. Do that before you run openclaw update with no flags. On this machine node --version printed v26.12.0 from /usr/sbin/node. That is not the binary the updater used. The launcher execs ~/.openclaw/tools/node/bin/node, and that file printed v24.21.0. A dry run exited 0 and still recorded a refusal: openclaw@2026.10.6 wants Node >=24.22.1 <25 || >=26.12.1, and it detected 24.21.0. I did not install 2026.10.6.
The two release pages agree on those version numbers. They do not use the same sentences. The GitHub release says OpenClaw now requires Node 24.22.1+ on the 24 line or 26.12.1+ on the 26 line, that Docker images ship Node 24.22.1, that installers select the patched runtimes, and that openclaw update refuses with recovery guidance before installing on an older Node. The docs page says if you manage Node yourself, upgrade to Node 24.22.1 or newer on Node 24, or 26.12.1 or newer on Node 26, before starting OpenClaw. Read both. Then read the binary your install actually starts.
Read the binary the launcher execs
node --version answers a different question. It prints whatever PATH finds first. OpenClaw on this host does not start that file.
command -v node
node --version
command -v openclaw
openclaw --version
This run printed:
command -v node printed /usr/sbin/node. node --version printed v26.12.0. command -v openclaw printed a symlink at ~/.local/bin/openclaw. openclaw --version printed OpenClaw 2026.10.5 (1b58cb9).
That symlink points at ~/.openclaw/bin/openclaw. That file is a bash script. Its exec line starts ~/.openclaw/tools/node/bin/node and then the installed entry.js. Yours may differ. Read the first lines of the file command -v openclaw resolves to, or of the symlink target if command -v is a link.
Then run the Node named in that exec line:
~/.openclaw/tools/node/bin/node --version
readlink -f ~/.openclaw/tools/node
Here, ~/.openclaw/tools/node is a symlink to ~/.openclaw/tools/node-v24.21.0. Both node --version commands on that tree printed v24.21.0. The file's timestamp on disk was Sep 7. I did not replace it.
If your launcher is a different shape, stop and read that file. This host is an npm install. openclaw update status printed Install: npm and Channel: stable (config). I did not test a git checkout, a Docker container, or a Nix install. The update help I opened says those paths update differently. A dry run on an npm install does not tell you what a container pull will do.
Read the 2026.10.6 floor before you trust an older docs page
The published package and the copy already on disk do not ask for the same Node.
I ran npm view openclaw@2026.10.6 version engines --json. It returned version 2026.10.6 and engines >=24.22.1 <25 || >=26.12.1.
The installed package.json at the npm root for this copy is still version 2026.10.5, and its engines field is >=24.16.0 <25 || >=26.1.0. That older range is what you have until the update lands. It is not the floor for 2026.10.6.
The live Node.js install page still says OpenClaw requires Node 24.16+ or Node 26.1+, and that v26.1.0 or newer is the recommended default. That page matches the installed 2026.10.5 engines. It does not match the engines I fetched for 2026.10.6. Do not use it as the floor for this update.
The same page also says that once openclaw update starts, it checks the requested release's Node requirements before replacing the package, and that if the current runtime cannot run that release, the updater selects a compatible installed Node or quietly provisions a verified private runtime. The GitHub highlight says the updater refuses with recovery guidance before installing on an older Node, instead of breaking the running install. Those are not the same sentence. On this host the dry run recorded a refusal. It did not record a provision. I did not run the update without --dry-run, so I cannot tell you which sentence a real run would follow after the preview.
GitHub's release API marks v2026.10.6 prerelease false, published 2026-10-22T12:53:10Z, target main. The release page shows tag commit fe06181 with a verified signature badge. I did not run gpg myself.
The docs card is easy to misread. The markdown frontmatter on the plain release file summarizes the page as Windows setup, Discord commands, and iPhone Talk fixes. The security paragraph is in the body, not in that summary. The raw changelog mirror points at the docs page and repeats the same security lead. It does not say reconciliation was pending. The mirror and the docs lead use the same sentence. The GitHub highlight does not.
PR 179992 is the change those pages cite. Its opening says OpenClaw could start on an affected Node 24+ build when a SQLite check passed, and that the fix requires Node 24.22.1+ on the 24 line or 26.12.1+ on the 26 line. Later in that same body the author writes that an ordinary Gateway invocation on Node 26.12.0 refuses the new floor. That is the pull request's validation note. I did not run that Gateway invocation. My own PATH Node is v26.12.0, and the updater did not select it.
Preview the refusal, then read the JSON
openclaw update --help on this 2026.10.5 binary says --dry-run previews update actions without making changes, and that it does not write config, install, or restart. The docs page says the same thing for the flag. Use that before a real update.
openclaw update status
openclaw update --dry-run --json
Status on this host printed an available npm update to 2026.10.6. It also printed a last recorded update at 2026-10-23T07:15:27.625Z that failed with global-install-failed. The historical recovery advice in that output included this line:
this OpenClaw release requires Node >=24.22.1 <25 || >=26.12.1.
detected Node 24.21.0
I did not start that attempt. Status does not say who did. The advice also pointed at https://nodejs.org/en/download and said to upgrade Node, then retry. I did not follow that link's rendered buttons. The download page I opened did not reliably show a version in the static extract, so I am not treating it as the version list. Use the release blogs and the dist index below.
The dry run then printed three identical pacman inspection warnings and continued. I did not repair pacman. After those lines it printed JSON. The shell command exited 0. A zero exit is not a passed floor.
In that JSON:
dryRunwas truestatuswasskippedreasonwasdry-runcurrentVersionwas2026.10.5targetVersionwas2026.10.6- the
validatingstep wasskipped notessaid it would refuse the updatefailureshad reasonnode-runtime-preflight- the required range was
Node >=24.22.1 <25 || >=26.12.1 - the detected binary was Node 24.21.0 at the private
node-v24.21.0tree
The actions array still listed a global package-manager update, a plugin sync, a completion-cache refresh, and a gateway restart plus doctor. Read that list as what the preview would have considered, not as work that ran. The failure note is the decision. If your JSON has no node-runtime-preflight failure, you are on a different branch than this host. Do not copy my refusal onto a preview that did not print one.
The recovery text in that same failure told me to keep the same service account and the existing state and config overrides, install and select Node 24.22.1, then retry the update. It named 24.22.1 because it detected 24.21.0. It did not tell me to upgrade /usr/sbin/node. I am not pasting the unset line. It is specific to this install. Run the dry run on your machine and read the recovery it prints.
Pick the line the detected binary is already on
The engines range is an or. >=24.22.1 <25 is the 24 line. >=26.12.1 is the 26 line. A 25.x build matches neither side. A 22.x build matches neither side. The install page says Node 22, 23, and 25 are unsupported. I did not test those majors.
Detected node --version |
What the 2026.10.6 engines ask for | What I did here |
|---|---|---|
v24.21.0, or any 24.x below 24.22.1 |
>=24.22.1 <25, or move to >=26.12.1 |
Detected. Dry run refused. I did not install either build. |
v26.12.0, or any 26.x below 26.12.1 |
>=26.12.1 on that same binary |
PATH printed this. The updater did not select it. |
already inside >=24.22.1 <25 or >=26.12.1 |
The Node floor is not the refusal | I did not hit this branch. |
| 22, 23, or 25 | Outside the range I fetched | Not tested. |
Stay on the major the updater detected, unless you have a separate plan for switching runtimes. This install's private runtime is 24.21.0. The dry-run recovery named 24.22.1, which stays on 24. The engines also allow 26.12.1 or newer. I did not try to point this launcher at a 26 binary. On Linux, the install page says the installer provisions the supported Node 24 LTS line when Node is missing, and Node 26 on macOS. That sentence is about the installer, not about a switch I ran.
Do not "fix" a 24.21.0 private runtime by installing Current over /usr/sbin/node and then assuming the updater will see it. On this host those are different files. Bumping PATH to 26.12.1 would still leave the launcher on 24.21.0 unless something rewrites the exec line or the tools/node symlink. I did not test that rewrite.
If the detected binary is already 26.x, the matching security build is 26.12.1, not 24.22.1. Installing the 24 LTS tarball onto a 26 process is the wrong file. The other way around is the same mistake.
Read the security blog for the line you are about to install
Both blogs I opened start with "This is a security release."
- Node.js 24.22.1 (LTS), heading date 2026-10-21, codename Krypton. The Linux x64 tarball link on that page is
https://nodejs.org/dist/v24.22.1/node-v24.22.1-linux-x64.tar.xz. - Node.js 26.12.1 (Current), heading date 2026-10-21. The Linux x64 tarball link on that page is
https://nodejs.org/dist/v26.12.1/node-v26.12.1-linux-x64.tar.xz.
I fetched https://nodejs.org/dist/index.json the same run. The first row is v26.12.1, lts false, security true, date 2026-10-21. The v24.22.1 row has lts Krypton, security true, and date 2026-10-20. The blog heading and the index date field do not use the same day for 24.22.1. I am not reconciling those clocks. Use the blog for the release text and the index for the security flag.
The notable lists are not copies of each other. Both pages name the same four High items I am not turning into steps: non-canonical TLS IP addresses (CVE-2026-106069, CVE-2026-106072), DNS null bytes (CVE-2026-105482), a TLS IP-normalization regression (CVE-2026-105483), and brotli (CVE-2026-111497). The 26.12.1 page also lists a Low zlib item, CVE-2026-106070, that is not in the 24.22.1 notable list I opened. Read the page for the build you will install. I did not download either tarball in this run, and I did not check a signature.
The OpenClaw highlight says those patched Node builds reject TLS chains signed with the compromised certificate keys addressed in the October 2026 Node.js security releases. The docs security section says older Node builds may still trust the affected certificates. That is the reason they give for the floor. It is not a procedure. I am not adding one.
If you want the checksum steps for a Node tarball, that is a separate job from this preview. Do it from the SHASUMS link on the blog for the file you downloaded. I am not repeating a verify walkthrough I did not run tonight.
What this preview does not authorize
A dry run that exits 0 and says skipped / dry-run did not install 2026.10.6. It did not restart a Gateway. It did not prove the update will succeed after you meet the floor. The help text says a real npm update goes through the detected package manager and can restart the gateway. I stopped before that.
I also did not:
- run
openclaw updatewithout--dry-run - install Node 24.22.1 or 26.12.1
- change the
tools/nodesymlink - pull a Docker image, even though the GitHub highlight says Docker images ship Node 24.22.1
- check a pnpm pin, even though the same highlight and the docs security section say source builds use pnpm 12.15.0
- switch the channel to
betaordevto get around the floor
openclaw update --help lists --channel beta and --channel dev. Those flags persist a channel. They are not a way past engines.node. I did not run them.
If your dry run's detected Node is already inside >=24.22.1 <25 or >=26.12.1, the Node floor is not your blocker. Read the rest of the JSON before you drop --dry-run. This host never got that far. The next command, after the detected binary prints a version inside that range, is still a dry run. Only then decide whether to run the update for real.