Skip to content

Node.js 24.19.0 LTS: What I Ran on 24.18.0 and 24.19.0

Node.js 24.19.0 adds blob.textStream(), a readFile buffer option and an httpValidation switch. I ran each on 24.18.0 and 24.19.0 to see what changes.

· · 6 min read
A row of server racks in a dim server room

Quick Take

Node.js 24.19.0 (August 3, 2026) is a feature-heavy LTS minor: thirteen notable changes, twelve of them SEMVER-MINOR, none breaking. I ran the new APIs against 24.18.0 and 24.19.0. blob.textStream() and the readFile buffer option work only on 24.19.0, import-text needs a flag, and a control character in a header value gets a 400 by default but passes with httpValidation set to relaxed. Upgrade, but install the newest 24.x (24.22.0 on October 14), not 24.19.0 itself.

Thirteen notable changes in one LTS minor is a lot. Node.js 24.19.0 shipped on August 3, 2026, and the usual advice for an LTS update ("it's a patch, install it") undersells it.

So I installed 24.18.0 and 24.19.0 side by side from nodejs.org and ran the new APIs against both. I'll say plainly what I did and didn't test: the five things below I ran on a Linux x64 container; the rest I read in the changelog and the v24 docs and haven't executed.

What Is Actually New in Node.js 24.19.0?

The notable-changes list in the v24 changelog, trimmed to what an application developer might touch:

ChangeFlagI ran it
blob.textStream()noneyes
fs.readFile() with a caller-supplied buffernoneyes
--experimental-import-textyesyes
httpValidation option on http.createServer()noneyes
socket.setKeepAlive() with interval and countnoneread only
stream.compose marked stable (docs)noneread only
ReadableStreamTee exportednoneread only
perf_hooks per-iteration event loop delay samplingnoneread only
TLS: certificateCompression, negotiated groups reportednoneread only

Everything in the left column was added in a SEMVER-MINOR commit except the stream.compose documentation change. None of the entries is SEMVER-MAJOR. That's the headline: lots of surface, no removals.

Does blob.textStream() Work on 24.18.0?

No. That's the cleanest before-and-after in the release.

const b = new Blob(['cafe ', 'ok']);
let s = '';
for await (const chunk of b.textStream()) {
  s += chunk;
}
console.log(s);

On 24.19.0 this prints cafe ok. On 24.18.0 it throws b.textStream(...) is not a function or its return value is not async iterable. The docs describe it as the same thing as piping blob.stream() through a UTF-8 TextDecoderStream, which you've probably written by hand once or twice. Small win. Real one.

What Does the readFile Buffer Option Change?

fs.readFile() can now write into a buffer you hand it, instead of allocating a fresh one. The docs show readFile(path, { buffer: buf }), and a function form, buffer: (size) => Buffer.alloc(size).

I read a 25-byte file with a 16 KiB preallocated buffer on both versions. The contents were right on both, because 24.18.0 silently ignores the unknown option. The difference is where the bytes live. On 24.19.0 the returned buffer shares memory with mine (result.buffer === buf.buffer was true). On 24.18.0 it was false, a new allocation every call.

Does that matter? For a script that reads one config file, no. For a server that reads thousands of small files a second, reusing one buffer takes pressure off the allocator and the garbage collector. I haven't benchmarked that, so I won't give you a percentage.

One trap: the same code runs on 24.18.0 without an error and just doesn't reuse memory. If you rely on the sharing (say, you reuse buf immediately after), pin your minimum version in engines.

Is Importing a .txt File Ready to Use?

Not yet. My honest take: this is the feature I'd least build on right now.

import message from './message.txt' with { type: 'text' };
console.log(message);

Without a flag on 24.19.0 I got ERR_UNKNOWN_FILE_EXTENSION. With node --experimental-import-text, it printed the file contents plus an ExperimentalWarning. On 24.18.0 the flag doesn't exist at all (bad option). The docs label it Stability 1.0, early development, and say the module exposes only a default export. It's a nice syntax for SQL snippets or prompt templates. A flag plus a warning on every start is not something to ship in production.

An LTS minor that adds thirteen features is still safe to install, but it isn't a patch, and the safe habit is to read the notable list before the upgrade instead of after the first odd bug.

Share this Post on X Bluesky

What Does httpValidation Do to Incoming Headers?

This is the one I'd read twice if you run a public HTTP server. http.createServer() takes a new httpValidation option with three values per the docs: 'strict' (the default), 'relaxed' (aligns with the Fetch spec) and 'insecure' (same as insecureHTTPParser: true, and you can't combine the two).

I sent a raw request over a TCP socket with a single 0x01 byte inside a header value, against a server in each mode:

Mode24.18.024.19.0
default400400
strict400400
relaxed400200
insecure400200

On 24.18.0 the option is ignored, so every row is a 400. On 24.19.0 the default stayed strict, and only relaxed and insecure let the control character through. Good: nothing tightened under you.

There was one surprise. The docs say strict mode rejects any non-ASCII character in a header value. A single latin-1 0xE9 byte (the "e" with an acute accent) got a 200 in every mode, strict included. I didn't dig into why, so treat that doc sentence as looser than it reads and don't use strict mode as your only filter for non-ASCII input.

What About Keep-Alive, Streams and TLS?

Read, not run, so take these as the changelog's word. socket.setKeepAlive() now accepts interval and count, which map to TCP_KEEPINTVL and TCP_KEEPCNT, and has an options-object form: socket.setKeepAlive({ enable: true, initialDelay: 1000, interval: 1000, count: 10 }). Values are in milliseconds but applied in whole seconds, rounded down. If you've ever lost a long-lived connection to a cloud load balancer that drops idle flows, those two knobs are the reason to care.

stream.compose is now documented as stable, which matters if you build pipelines like the ones in our streams and backpressure guide. The TLS additions (certificate compression, reporting negotiated groups) are for people running their own TLS termination.

Should You Upgrade, and to What?

Yes, but not to 24.19.0 itself. By October 14, 2026 the 24.x line had reached 24.22.0, and the in-between releases kept adding things like updated root certificates (NSS 3.126 in 24.21.0) and an OpenSSL bump to 3.5.8. Install the newest 24.x.

The calendar matters more than any single feature. Per the official release schedule, Node 24 moves to maintenance on October 20, 2026, Node 26 is scheduled to become LTS on October 28, 2026, and Node 22 reaches end of life on April 30, 2027. If you're still on Node 20, support ended on April 30, 2026, and the Node.js 20 to 24 migration guide is the place to start. For the earlier line, see the notes on 24.18.0, and for the feature side of the v24 line, our Node 24 features guide.

My rule for an LTS minor: upgrade a branch, run the suite, grep your code for anything touching the APIs above, merge. That's an afternoon, not a project.

Frequently Asked Questions

Is Node.js 24.19.0 safe to upgrade to from 24.18.x?
Yes. It is a minor release inside an LTS line, and the changelog lists thirteen notable entries, twelve SEMVER-MINOR and one docs change, and no SEMVER-MAJOR ones. In my runs the existing behavior I tried stayed the same. The one default worth a glance is header validation: a control character in an incoming header value was rejected with a 400 on both 24.18.0 and 24.19.0, so nothing tightened.
Should I install 24.19.0 specifically or the latest 24.x?
Install the latest 24.x. 24.19.0 was followed by 24.20.0, 24.21.0 and 24.22.0 (October 14, 2026), and the later builds carry newer root certificates and OpenSSL and Undici updates. Pin 24.19.0 only if a lockfile policy forces it.
Does Node.js 24.19.0 make import of .txt files stable?
No. Importing text with `with { type: 'text' }` needs the --experimental-import-text flag, the docs mark it Stability 1.0 (early development), and Node prints an ExperimentalWarning when it runs. Without the flag, my import failed with ERR_UNKNOWN_FILE_EXTENSION.
When does Node.js 24 leave active LTS?
According to the official release schedule, Node 24 enters maintenance on October 20, 2026 and reaches end of life on April 30, 2028. Node 26 is scheduled to become LTS on October 28, 2026, and Node 22 reaches end of life on April 30, 2027.