Node.js 26 LTS: What Changes and How to Upgrade
Table of contents
Node.js 26 becomes the new LTS line on October 28, 2026. According to the official Node.js release schedule, version 26 moves from Current to Active LTS that day, while Node.js 24 already left Active LTS on October 20 and is now in maintenance until April 2028. Even in a PHP shop, Node is everywhere: Vite builds for Laravel, Nuxt front ends, Magento PWA tooling, CI runners. So here is what Node.js 26 LTS changes for me, and how I plan the upgrade on client projects.
Why the LTS date matters
Node.js 26.0.0 shipped on May 5, 2026, but I never put a Current release on a production server or a CI image. Current lines move fast and can still change behaviour. The LTS promotion is the signal that the line is stable and will get fixes for a long time: per the schedule, Node.js 26 stays in Active LTS until October 2027 and gets security fixes until April 30, 2029.
The dates for the lines you probably run today:
- Node.js 24: maintenance since October 20, 2026, end of life on April 30, 2028. Safe for now, but only critical fixes from here.
- Node.js 25: already end of life since June 1, 2026. If you jumped on it, move off it now.
- Node.js 22 and older: check endoflife.date for your exact line. Anything out of support should go straight to 26.
There is also a bigger change coming. Node.js 26 is the last line released on the old "even numbers become LTS" model. From Node.js 27, which enters an Alpha phase on October 28, every major release goes through Alpha, then Current, and every line becomes LTS, with a 30-month Active LTS and no separate maintenance phase. Fewer versions to think about, which suits agencies that maintain many projects.
What's new in Node.js 26
The Node.js 26.0.0 release notes list a lot of changes. These are the ones I actually care about:
- Temporal is enabled by default. The modern date and time API is available without a flag. No more reaching for a library just to add three days to a date in the right time zone.
- V8 14.6 (the engine of Chromium 146), with
Map.prototype.getOrInsert(),getOrInsertComputed()andIterator.concat(). - Undici 8, the HTTP client behind the global
fetch(). - A new
NODE_MODULE_VERSION(147). Every native addon must be rebuilt.
Temporal is the one I'll use first. Code like this now runs on a stock Node.js 26:
const start = Temporal.PlainDate.from('2026-10-28');
const nextReview = start.add({ months: 6 });
console.log(nextReview.toString()); // 2027-04-28
const paris = Temporal.Now.zonedDateTimeISO('Europe/Paris');
console.log(paris.hour);
Front-end code that runs in browsers still needs to check browser support or keep a polyfill. In Node scripts, build tools and server code, you can drop the extra dependency.
Breaking changes to check before you upgrade
Most applications will upgrade without touching code, but a few removals can bite, especially in older dependencies:
http.Server.prototype.writeHeader()is removed. UsewriteHead().- The legacy internal stream modules (
_stream_readable,_stream_writable,_stream_duplex,_stream_transform,_stream_passthrough,_stream_wrap) are gone. Old packages sometimes still import them. module.register()is now runtime-deprecated, so custom loaders will print warnings.- The
--experimental-transform-typesflag is removed. - Native addons (image processing, bcrypt bindings, database drivers) must be rebuilt for the new ABI.
A quick way to spot the risky packages in a project before switching versions:
grep -rlE "_stream_(readable|writable|duplex|transform|passthrough|wrap)|writeHeader\(" node_modules --include=*.js | cut -d/ -f2 | sort -u
find node_modules -name "*.node" -not -path "*/.bin/*" | cut -d/ -f2 | sort -u
The first command lists packages that use removed APIs, the second lists packages with compiled addons. Both lists are usually short, and an update of those packages fixes most of them.
How I upgrade a Laravel or Nuxt project
On my projects, Node is mostly a build tool. The upgrade is short if you do it in this order:
- Pin the version in the repository. Put
26in.nvmrcand set"engines": { "node": ">=26" }inpackage.json, so every developer and every CI job agrees. - Reinstall from scratch.
rm -rf node_modules && npm cirebuilds native addons for the new ABI. - Build and test locally.
npm run buildfor Vite or Nuxt, then the test suite. Watch the output for deprecation warnings. - Update CI and Docker images. Change
node-versionin your GitHub Actions workflows and theFROM node:26line in Dockerfiles. - Update the servers last. On Laravel Forge or any VPS, install Node 26 next to the old version, switch the default, redeploy, and restart anything that runs Node in the background (SSR servers, queue workers that call Node, Playwright crawlers).
For Nuxt SSR or any long-running Node process, that last restart is the step people forget: the old process keeps running the old binary until it is restarted.
When should you upgrade?
My rule of thumb:
- New projects: start on Node.js 26 from October 28.
- Projects on Node.js 24: plan the upgrade in the next few months. There is no emergency, since 24 is supported until April 2028, but maintenance only brings critical fixes.
- Projects on Node.js 25 or an end-of-life line: upgrade now. You are not getting security fixes.
Give the ecosystem a couple of weeks if you depend on many native addons, since some maintainers wait for the LTS date to publish prebuilt binaries.
Conclusion
Node.js 26 LTS is a calm upgrade for most PHP-centric teams: rebuild native addons, check a handful of removed APIs, update CI and servers, restart long-running processes. In return you get Temporal without a library and a line supported until 2029. And with Node.js 27 making every release an LTS, this is the last time the release calendar will be this confusing. If you maintain several client projects, now is a good time to put an .nvmrc in each of them.