Stable Release in branch 24.x (LTS)
24.18.0
Released 23 Jun 2026
(17 days ago)
SoftwareNode.js
Version24.x (LTS)
StatusLTS
Supported
CodenameKrypton
Initial release24.0.0
06 May 2025
(1 year ago)
Latest release24.18.0
23 Jun 2026
(17 days ago)
End of bug fixes20 Oct 2026
(Ends in 3 months)
End of security fixes30 Apr 2028
(Ends in 1 year, 9 months)
Release noteshttps://github.com/nodejs/node/releases/tag/v24.18.0
Source codehttps://github.com/nodejs/node/tree/v24.18.0
Documentationhttps://nodejs.org/dist/latest-v24.x/
Downloadhttps://nodejs.org/download/release/latest-v24.x/
Node.js 24.x (LTS) ReleasesView full list

What Is New in Node.js 24?

Category Highlights
New Features V8 13.6 engine with Float16Array, explicit resource management, RegExp.escape, WebAssembly Memory64, Error.isError; URLPattern exposed as a global; npm 11 bundled; Undici 7 HTTP client; AsyncLocalStorage defaulting to AsyncContextFrame; worker.getHeapStatistics(); Global test runner setup/teardown; HTTP proxy support for fetch via NODE_USE_ENV_PROXY; SQLite aggregate functions, timeout options, setReturnArrays, location method; REPL multiline history support; assert.partialDeepStrictEqual() stabilized
Improvements Permission Model flag changed from --experimental-permission to --permission; Test runner auto-waits for subtests -- no more manual await; AsyncLocalStorage now accepts defaultValue and name options; ESM import.meta properties (filename, dirname) graduated to stable; Top-level WebAssembly support without package type; HTTP/2 graceful server close and session tracking; assert deep comparison performance improvements; fs.globSync performance improvements; buffer.byteLength performance improvements; ERR_ACCESS_DENIED errors now more descriptive
Bug Fixes AbortSignal.any() with timeout signals fixed; DNS query cache TTL restored; os.getCIDR netmask format check corrected; util.parseEnv handling of invalid lines and multiple '=' in values fixed; HTTP/2 graceful session close fix; fs missing uv_fs_req_cleanup call fixed; zlib pointer alignment fix
Breaking Changes MSVC support dropped -- ClangCL now required on Windows; macOS minimum bumped to 13.5, Xcode minimum to 16.1; AsyncLocalStorage defaults to AsyncContextFrame (behavior change for some edge cases); http.OutgoingMessage _headers and _headerNames removed; fs.truncate() with file descriptor removed; tls.createSecurePair() removed; fs.dirent.path removed (replaced by parentPath); test() and t.test() no longer return Promises; Python 3.8 support dropped for build tooling; ppc 32-bit and s390 32-bit support removed
Deprecations url.parse() -- runtime deprecation (use WHATWG URL API); SlowBuffer -- runtime deprecation; REPL instantiation without new; Zlib classes without new; child_process: passing args to spawn/execFile; fs.F_OK, fs.R_OK, fs.W_OK, fs.X_OK from fs module; tls.Server.prototype.setOptions EOL; net._setSimultaneousAccepts() EOL; Several timers methods EOL; repl.builtinModules deprecated

What JavaScript Engine Changes Come with Node.js 24?

Node.js 24 ships V8 13.6, one of the most feature-rich engine upgrades in recent memory. This single update unlocks several long-awaited language proposals that were previously only available behind flags or polyfills.

The most impactful additions for production code:

  • Explicit Resource Management -- the using and await using keywords from TC39, enabling deterministic cleanup of resources without try/finally boilerplate.
  • Float16Array -- a new typed array for 16-bit floating point data, useful for ML inference workloads and GPU-adjacent compute tasks.
  • RegExp.escape() -- finally a built-in way to escape a string for use inside a regular expression, replacing years of hand-rolled utility functions.
  • Error.isError() -- a reliable cross-realm check for Error instances, removing the need for instanceof hacks in sandboxed or VM contexts.
  • WebAssembly Memory64 -- Wasm modules can now address more than 4 GB of linear memory, unblocking large-scale Wasm workloads.

In practice, the using keyword is the change most teams will reach for immediately. Database connections, file handles, and lock objects are all natural fits. Watch out for TypeScript configs that may need "lib": ["ES2025"] or equivalent to recognize the syntax without errors.

// Explicit resource management -- now native in Node.js 24
class DatabaseConnection {
  [Symbol.dispose]() {
    this.close();
  }
}

{
  using conn = new DatabaseConnection();
  // conn.close() is called automatically at the end of this block
  await conn.query('SELECT 1');
}

How Does AsyncLocalStorage Change in Node.js 24?

AsyncLocalStorage now defaults to using AsyncContextFrame as its underlying implementation, replacing the previous async_hooks-based approach. For most applications this is transparent, but the performance and correctness improvements are meaningful in high-throughput services.

The new default is more efficient because context propagation no longer relies on the async hooks infrastructure for every async operation. In practice, teams running request-tracing or per-request logging middleware in Express or Fastify should see lower overhead at scale.

Two new constructor options have also been added: defaultValue sets the value when no store is active, and name gives the instance a label useful for debugging and heap snapshots. These small additions make multi-store setups -- common in layered middleware architectures -- considerably easier to reason about.

import { AsyncLocalStorage } from 'node:async_hooks';

const requestContext = new AsyncLocalStorage({
  name: 'requestContext',
  defaultValue: { requestId: 'unknown' }
});

// Context flows correctly through async boundaries without any
// manual propagation -- now backed by AsyncContextFrame by default
app.use((req, res, next) => {
  requestContext.run({ requestId: req.headers['x-request-id'] }, next);
});

What Breaking Changes and Removals Should You Audit Before Upgrading to Node.js 24?

Node.js 24 ships a significant number of removals that have been deprecated for multiple releases. Any upgrade plan should include a dedicated audit pass against these items before moving to production.

The highest-risk removals for existing codebases:

  • tls.createSecurePair() removed -- this has been deprecated since Node.js 0.11. If anything in your dependency tree still calls it, the process will throw at startup.
  • http.OutgoingMessage._headers and ._headerNames removed -- these undocumented properties were used by some older middleware. Replace with getHeaders(), getHeader(), and setHeader().
  • fs.truncate() with a file descriptor -- passing an fd to fs.truncate() is gone. Use fs.ftruncate(fd, len) instead.
  • fs.dirent.path removed -- replaced by dirent.parentPath, which was introduced in Node.js 21.4.
  • test() and t.test() no longer return Promises -- if any test suite awaits the return value of a top-level test() call, that code must be updated. The runner now handles subtest sequencing automatically.
  • MSVC dropped on Windows -- native addon authors targeting Windows must switch to ClangCL. Pre-built binaries via node-pre-gyp are unaffected, but any CI pipeline that compiles addons on Windows needs updating.

The runtime deprecation of url.parse() is worth calling out separately. It will emit a DeprecationWarning on every call now. Teams with high-traffic services that parse URLs in hot paths will want to migrate to new URL(input) before upgrading, to avoid log noise and prepare for eventual removal.

// Before -- now triggers DeprecationWarning at runtime in Node.js 24
const parsed = require('url').parse('https://example.com/path?q=1');

// After -- use the WHATWG URL API
const parsed = new URL('https://example.com/path?q=1');
console.log(parsed.pathname); // '/path'
console.log(parsed.searchParams.get('q')); // '1'

How Has the Built-in Test Runner Improved in Node.js 24?

The built-in test runner received several developer-experience improvements that reduce the gap between it and third-party frameworks. The most impactful change is that subtests now automatically complete before the parent test finishes -- you no longer need to await t.test(...) everywhere, and forgetting to do so no longer causes silent failures.

Global setup and teardown are now supported via a dedicated API, making it practical to use the built-in runner for integration test suites that need shared infrastructure like database connections or test servers spun up once per run. Per-test timeout via --test-timeout is now applied on a per-test basis rather than globally, giving finer-grained control over slow tests. JSON module mocking is also now supported.

// node:test -- global setup/teardown, new in Node.js 24
import { before, after, test } from 'node:test';
import assert from 'node:assert/strict';

let db;

before(async () => {
  db = await connectToTestDatabase();
});

after(async () => {
  await db.close();
});

test('user lookup returns correct record', async (t) => {
  // Subtests no longer need explicit await -- runner handles ordering
  t.test('by id', async () => {
    const user = await db.findById(1);
    assert.equal(user.name, 'Alice');
  });

  t.test('by email', async () => {
    const user = await db.findByEmail('[email protected]');
    assert.equal(user.id, 1);
  });
});

What Improvements Come to the SQLite and HTTP APIs in Node.js 24?

The built-in SQLite module, introduced experimentally in Node.js 22, continues to mature rapidly in the 24.x branch. This release adds support for custom aggregate functions via createAggregateFunction(), a location method to retrieve the database file path, timeout options on DatabaseSync to handle lock contention gracefully, and a setReturnArrays() method on prepared statements for scenarios where array-indexed results are more convenient than objects.

On the HTTP side, fetch() now respects proxy configuration through the NODE_USE_ENV_PROXY environment variable. This is a frequently requested feature for teams operating behind corporate or infrastructure proxies. Undici, Node.js's underlying HTTP client, was upgraded to version 7.x bringing further improvements to connection handling and HTTP feature support.

import { DatabaseSync } from 'node:sqlite';

const db = new DatabaseSync(':memory:', { timeout: 5000 });

db.exec('CREATE TABLE sales (region TEXT, amount REAL)');

// New in Node.js 24 -- custom aggregate functions
db.createAggregateFunction('sum_region', {
  start: 0,
  step: (acc, val) => acc + val,
  result: (acc) => acc
});

const stmt = db.prepare('SELECT region, sum_region(amount) FROM sales GROUP BY region');
// New in Node.js 24 -- return arrays instead of objects
stmt.setReturnArrays(true);
for (const row of stmt.iterate()) {
  console.log(row); // ['APAC', 42000]
}

People Also Ask about Node.js 24

Does upgrading to Node.js 24 require changes to existing test suites that use node:test?
Most test files will work unchanged, but any code that awaits the return value of a top-level test() call or t.test() will need to be updated, because those functions no longer return Promises in Node.js 24 -- the runner now handles subtest sequencing automatically.

Is the --permission flag in Node.js 24 the same as --experimental-permission from earlier versions?
Yes, it is the same Permission Model but the flag was renamed from --experimental-permission to --permission to signal increased stability. Existing scripts using the old flag need to update the argument name before running on Node.js 24.

Will code that uses url.parse() break immediately in Node.js 24?
It will not throw, but it will emit a DeprecationWarning to stderr on every call. The function is still present and functional in Node.js 24, but it is scheduled for eventual removal, so migrating to new URL() is strongly recommended before upgrading services with high call volumes where log noise matters.

Does switching AsyncLocalStorage to AsyncContextFrame by default require code changes?
For the vast majority of applications no changes are needed, as the API surface is identical. Edge cases that directly interacted with the async_hooks infrastructure in combination with AsyncLocalStorage may behave differently, and native addons that hook into async context propagation at the C++ level should be tested carefully before upgrading.

How do you use the new using keyword for resource cleanup in Node.js 24?
Add a Symbol.dispose method to any class, then declare instances with using instead of const inside a block scope, like: using conn = new DbConnection(); -- the runtime will automatically call conn[Symbol.dispose]() when the block exits, even if an error is thrown. For async cleanup use Symbol.asyncDispose with await using.

What is the NODE_USE_ENV_PROXY environment variable added in Node.js 24?
Setting NODE_USE_ENV_PROXY=1 tells the built-in fetch() and undici HTTP client to respect the HTTP_PROXY and HTTPS_PROXY environment variables when making outbound requests, enabling fetch to work transparently behind corporate or infrastructure proxies without third-party libraries.

Releases In Branch 24.x (LTS)

VersionRelease datenpm version
24.18.023 Jun 2026
(17 days ago)
11.16.0
24.17.017 Jun 2026
(23 days ago)
11.13.0
24.16.021 May 2026
(1 month ago)
11.13.0
24.15.015 Apr 2026
(2 months ago)
11.12.1
24.14.124 Mar 2026
(3 months ago)
11.11.0
24.14.024 Feb 2026
(4 months ago)
11.9.0
24.13.109 Feb 2026
(5 months ago)
11.8.0
24.13.012 Jan 2026
(5 months ago)
11.6.2
24.12.010 Dec 2025
(7 months ago)
11.6.2
24.11.111 Nov 2025
(7 months ago)
11.6.2
24.11.028 Oct 2025
(8 months ago)
11.6.1
24.10.008 Oct 2025
(9 months ago)
11.6.1
24.9.025 Sep 2025
(9 months ago)
11.6.0
24.8.010 Sep 2025
(10 months ago)
11.6.0
24.7.027 Aug 2025
(10 months ago)
11.5.1
24.6.014 Aug 2025
(10 months ago)
11.5.1
24.5.031 Jul 2025
(11 months ago)
11.5.1
24.4.115 Jul 2025
(11 months ago)
11.4.2
24.4.009 Jul 2025
(1 year ago)
11.4.2
24.3.024 Jun 2025
(1 year ago)
11.4.2
24.2.009 Jun 2025
(1 year ago)
11.3.0
24.1.020 May 2025
(1 year ago)
11.3.0
24.0.214 May 2025
(1 year ago)
11.3.0
24.0.108 May 2025
(1 year ago)
11.3.0
24.0.006 May 2025
(1 year ago)
11.3.0