Software 44881 Published by

Node.js 26.9.0 shipped September 16, 2026, most notably enabling its Foreign Function Interface by default so JavaScript can call into native libraries without a C/C++ addon. A new node:bench module landed, only for the team to quietly move it behind an --experimental-bench flag after review raised concerns about benchmark integrity. The release also brings first-class Web Workers in thread contexts, an experimental DTLS API, and crypto upgrades like a generic MAC API and OpenSSL provider discovery. Since Node 26 is still in "Current" and won't reach LTS until October 2026, treat this as a testing build rather than a production upgrade.



Node.js 26.9.0 ships FFI by default, a new node:bench module, and Web Workers

Node.js 26.9.0 went out on September 16, 2026, and quietly makes one of the platform's most powerful features impossible to ignore. Foreign Function Interface is now enabled by default, so JavaScript can call straight into shared native libraries without you writing a C or C++ addon. That's been possible for a while behind a flag. Now it's just there.

The release landed under maintainer Antoine du Hamel and marks another patch in the Node 26 "Current" line, which, for the record, still hasn't hit LTS. Node 26 is expected to go Active LTS in October 2026. Until then it's the version for people who like living on the edge a bit.

Nodejs

FFI goes mainstream

FFI lets JS import and call functions straight from an existing .so, .dylib, or .dll file. You describe the memory layout and Node handles the marshalling. No build step, no native compilation, no node-gyp headaches. Matteo Collina, a core Node maintainer behind Fastify and pino, has been pushing this native-interop story hard. This release hardens it too, with validation added on missing memory-helper arguments and DynamicLibrary receivers.

It's a meaningful shift. Native interop stops being a "turn on if you're brave" option and becomes the path of least resistance for anything performance-sensitive. The trade-off is that it's now always on. There's nothing for you to opt into. For most projects that's fine, though teams running odd native stacks might want to eyeball things first.

The node:bench retcon

Here's the interesting bit. A brand-new built-in node:bench module shipped in this release, then got quietly moved behind an --experimental-bench flag a little while later. James M Snell, who authored the module, folded it back under the experimental gate after review surfaced concerns about its "significance policy" and how benchmark measurements hold up under scrutiny.

So you end up with a first-class benchmarking API that the maintainers simply weren't comfortable leaving on by default. Fair call, honestly. In-process benchmarks are shockingly easy to game, and timing your own hot path against itself tends to produce numbers you'll want to take with a grain of salt. The APIs are all still there, runFile, createRunner, the bench:plan event, diagnostic output,  but you'll need the flag to use them.

On the concurrency front, Web Workers now get first-class support inside worker threads. That's the familiar browser-style postMessage/onmessage model, so real parallelism for CPU-heavy work doesn't require learning anything new. There's also an experimental DTLS API riding alongside the existing QUIC work. DTLS is TLS over UDP, which matters for low-latency streaming, gaming, and IoT. Experimental means preview-level, so don't build your transport layer on it yet.

Crypto gets a generic MAC API and provider-driven cipher/hash discovery, which means Node now asks the loaded OpenSSL providers which ciphers and hashes are actually available instead of reading from a static list. Filip Skokan drove much of the crypto hardening this cycle, including a fix that stops Hmac.digest() from handing back uninitialized memory.

The through-line here is that Node keeps inching toward systems-language territory. FFI by default, the virtual file system wired into the module loaders for Single Executable Applications, and native addons resolvable from that same VFS all point the same direction: wrap your whole app in one binary and talk to native code without a build toolchain.

Upgrade caution still applies, though. Node 26 is "Current," not LTS, and the major line already stripped several legacy APIs in v26.0.0,  writeHeader() is gone in favor of writeHead(), legacy _stream_* modules are gone, and module.register() is deprecated. If something important runs on it, wait for Active LTS before migrating. This is a perfectly good build for testing.

Grab it while it's hot. Direct binaries shipped September 16 for Linux (x64, arm64, ppc64le, s390x, musl), macOS (x64 and apple-silicon), Windows (x64 and arm64, in .msi, zip, and 7z formats), and AIX.

Here's the one-liner for Linux x64:

curl -LO https://nodejs.org/dist/v26.9.0/node-v26.9.0-linux-x64.tar.xz

Head here for the full change log.