Why this upgrade is mostly boring — and where it isn't
Node 26 becomes the Active LTS on 28 October 2026, and most applications will move to it without changing a line of code. The release is mostly additions: V8 14.6, the Temporal API enabled by default, Map.prototype.getOrInsert(), Iterator.concat() and Undici 8 behind fetch().
The breaking part is a short list of removals — old APIs that printed deprecation warnings for years and are now simply gone — plus a new native-addon ABI. They don't fail quietly: each produces a specific error at startup or the first time the code path runs. Below is each one with the message you'll actually see, so you can match a crash to its cause in seconds. You can also paste your package.json and code into the Node.js 26 Upgrade Checker to find them before you upgrade.
1. node:_stream_* modules are gone (DEP0193)
Error: Cannot find module '_stream_readable'
Error [ERR_UNKNOWN_BUILTIN_MODULE]: No such built-in module: node:_stream_readable
The internal modules _stream_readable, _stream_writable, _stream_duplex, _stream_transform, _stream_passthrough and _stream_wrap were never meant to be public. They printed a runtime deprecation since Node 22.17 / 24.2 and are now removed.
Fix: import from node:stream instead:
// before
const Transform = require("_stream_transform");
// after
const { Transform } = require("node:stream");
If the stack trace points into node_modules, the culprit is an old dependency — update it rather than patching it.
2. response.writeHeader() is gone (DEP0063)
TypeError: res.writeHeader is not a function
writeHeader() was an undocumented alias of writeHead() that survived from the very early days of Node. Rename the call — the arguments are identical. Old middleware and hand-rolled HTTP servers are the usual places it hides.
3. Native addons need a rebuild (NODE_MODULE_VERSION 147)
Error: The module '/app/node_modules/better-sqlite3/build/Release/better_sqlite3.node'
was compiled against a different Node.js version using NODE_MODULE_VERSION 137.
This version of Node.js requires NODE_MODULE_VERSION 147.
Every major Node version changes the ABI for addons that compile against V8 directly. Packages built on Node-API (sharp, sqlite3, most modern addons) keep working; packages that ship one binary per Node version (better-sqlite3, canvas, isolated-vm, re2…) need a release that supports Node 26.
Fix: a clean install on the new version — locally, in CI and in Docker:
rm -rf node_modules
npm ci
The trap is caching. A CI cache keyed only on the lockfile, or a Docker layer that copies node_modules from a build stage on a different Node version, will happily restore the old binaries. Include the Node version in cache keys.
4. --experimental-transform-types is removed
node: bad option: --experimental-transform-types
Node runs .ts files by stripping types — that's on by default and stays. The removed flag also transformed the TypeScript features that generate runtime code: enum, namespace with values, and constructor parameter properties. Without it, those features stop working.
Fix: either rewrite them into erasable syntax (a union type plus an object instead of an enum, explicit fields instead of constructor(private x: number)), or run those files through tsx or a tsc build. The Type-Stripping Checker lists every line that needs it.