Rafael Gonzaga
2025-10-15, Version 25.0.0 (Current), @RafaelGSS
Node.js 25 is here! We have upgraded V8 to 14.1, bringing major JSON.stringify performance improvements, built-in Uint8Array base64/hex conversion, and ongoing WebAssembly and JIT pipeline optimizations.
This release doubles down on secure-by-default apps and web-standard APIs: the permission model gains --allow-net, Web Storage is enabled by default, and ErrorEvent is now a global.
We’ve also removed or finalized long-deprecated APIs such as SlowBuffer, and added quality-of-life improvements like a portable compile cache and JSPI for WebAssembly.
Notable Changes
- [8bc7dfd16f] - build: test on Python 3.14 release candidate 3 (Christian Clauss) #59983
- [663554abdf] - (SEMVER-MAJOR) lib: expose global ErrorEvent (Richie Bendall) #58920
- [3312e4e946] - (SEMVER-MAJOR) src: unflag --experimental-webstorage by default (Daniel M Brasil) #57666
- [462c74181d] - (SEMVER-MAJOR) src,permission: add --allow-net permission (Rafael Gonzaga) #58517
Deprecations and Removals
- [d33f4b539a] - (SEMVER-MAJOR) assert: move assert.fail with multiple arguments to eol (James M Snell) #58532
- [b21574d63b] - (SEMVER-MAJOR) assert: move CallTracker to EOL (James M Snell) #58006
- [308b6bc6de] - (SEMVER-MAJOR) async_hooks: move asyncResource property on bound function to EOL (James M Snell) #58618
- [daced4ab98] - (SEMVER-MAJOR) buffer: move SlowBuffer to EOL (Filip Skokan) #58220
- [df16f0fd8d] - (SEMVER-MAJOR) child_process: move _channel to end-of-life (James M Snell) #58527
- [a472745958] - (SEMVER-MAJOR) crypto: runtime-deprecate default shake128/256 output lengths (Filip Skokan) #59008
- [c3b986853c] - (SEMVER-MAJOR) crypto: move deprecated hash and mgf1Hash options to EOL (James M Snell) #58706
- [66632648ba] - (SEMVER-MAJOR) crypto: runtime deprecate ECDH.setPublicKey() (James M Snell) #58620
- [a5f9ca1f77] - (SEMVER-MAJOR) dns: move falsy hostname in lookup to end-of-life (James M Snell) #58619
- [2bb7667475] - (SEMVER-MAJOR) fs: move FileHandle close on GC to EOL (James M Snell) #58536
- [eec0302088] - (SEMVER-MAJOR) fs: move rmdir recursive option to end-of-life (James M Snell) #58616
- [25dd206c29] - (SEMVER-MAJOR) fs: remove fs.F_OK, fs.R_OK, fs.W_OK, fs.X_OK (Livia Medeiros) #55862
- [91dadf2897] - (SEMVER-MAJOR) http: deprecate writeHeader (Sebastian Beltran) #59060
- [4e06a648ff] - (SEMVER-MAJOR) perf_hooks: move deprecated accessors to EOF (James M Snell) #58531
- [a3dfca90d1] - (SEMVER-MAJOR) process: move multipleResolves event to EOL (James M Snell) #58707
- [790acc8689] - (SEMVER-MAJOR) tls: move IP-address servername deprecation to eol (James M Snell) #58533
- [3aaa2ebe19] - (SEMVER-MAJOR) url: move bad port deprecation in legacy url to end-of-life (James M Snell) #58617
Semver-Major Commits
- [7c9fbc15bc] - (SEMVER-MAJOR) assert,util: fail promise comparison in deep equal checks (Ruben Bridgewater) #59448
- [11222f1a27] - (SEMVER-MAJOR) assert,util: handle invalid dates as equal in deep comparison (Ruben Bridgewater) #57627
- [acce2e8f87] - (SEMVER-MAJOR) build: reset embedder string to "-node.0" (Michaël Zasso) #59805
- [8a87ba031b] - (SEMVER-MAJOR) build: bump minimum Clang version to 19 (Michaël Zasso) #59048
- [21b131e93a] - (SEMVER-MAJOR) build: reset embedder string to "-node.0" (Michaël Zasso) #58064
- [f31c88021b] - (SEMVER-MAJOR) build: stop distributing Corepack (Antoine du Hamel) #57617
- [b3238442d8] - (SEMVER-MAJOR) deps: patch V8 for illumos (Dan McDonald) #59805
- [2a1da3260d] - (SEMVER-MAJOR) deps: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) #54077
- [7772a2df9d] - (SEMVER-MAJOR) deps: update V8 to 14.1.146.11 (Michaël Zasso) #59805
- [6d61175db0] - (SEMVER-MAJOR) deps: V8: backport 1d3362c55396 (Shu-yu Guo) #58064
- [974773572e] - (SEMVER-MAJOR) deps: V8: cherry-pick 4f38995c8295 (Shu-yu Guo) #58064
- [70bfc398e9] - (SEMVER-MAJOR) deps: V8: cherry-pick 044b9b6f589d (Rezvan Mahdavi Hezaveh) #58064
- [6bfc525cf0] - (SEMVER-MAJOR) deps: V8: cherry-pick d2ad518a0b57 (Joyee Cheung) #58064
- [754d28e34f] - (SEMVER-MAJOR) deps: V8: revert 6d6c1e680c7b (Michaël Zasso) #58064
- [8c508b9399] - (SEMVER-MAJOR) deps: V8: revert e3cddbedb205 (Michaël Zasso) #58064
- [88ca8287b6] - (SEMVER-MAJOR) deps: use std::map in MSVC STL for EphemeronRememberedSet (Joyee Cheung) #58064
- [838e2332a5] - (SEMVER-MAJOR) deps: patch V8 for illumos (Dan McDonald) #58064
- [3522731d9a] - (SEMVER-MAJOR) deps: remove problematic comment from v8-internal (Michaël Zasso) #58064
- [d234475a33] - (SEMVER-MAJOR) deps: define V8_PRESERVE_MOST as no-op on Windows (Stefan Stojanovic) #58064
- [a738eb4a7f] - (SEMVER-MAJOR) deps: fix FP16 bitcasts.h (Stefan Stojanovic) #58064
- [1744c7d991] - (SEMVER-MAJOR) deps: patch V8 to avoid duplicated zlib symbol (Michaël Zasso) #58064
- [fff0d1554d] - (SEMVER-MAJOR) deps: update V8 to 13.7.152.9 (Michaël Zasso) #58064
- [968e2f47c8] - (SEMVER-MAJOR) dgram: move deprecated APIs to EOL (James M Snell) #58474
- [5623194a6b] - (SEMVER-MAJOR) doc,src,test: replace use of deprecated GetIsolate (Michaël Zasso) #59805
- [823ca6991f] - (SEMVER-MAJOR) fs: make processReadResult() and readSyncRecursive() private (Livia Medeiros) #58672
- [a273674dee] - (SEMVER-MAJOR) fs: move fs stream open method to eol (James M Snell) #58529
- [39d73036e7] - (SEMVER-MAJOR) lib: use validators for argument validation (Nam Yooseong) #59416
- [cd68e35704] - (SEMVER-MAJOR) lib: deprecate _stream_* modules (Dario Piotrowicz) #58337
- [a822a1cbe7] - (SEMVER-MAJOR) lib: deprecate _tls_common and _tls_wrap (Dario Piotrowicz) #57643
- [705bcc2a00] - (SEMVER-MAJOR) module: move Module._debug to end-of-life (James M Snell) #58473
- [5fe7800683] - (SEMVER-MAJOR) node-api: add warning for NAPI_EXPERIMENTAL (Miguel Marcondes Filho) #58280
- [e1d4d6ab49] - (SEMVER-MAJOR) repl: eol deprecate instantiating without new (Aviv Keller) #59495
- [ed94bc48f3] - (SEMVER-MAJOR) src: update crypto.getCipherInfo() to use DictionaryTemplate (James M Snell) #60036
- [37a3df3556] - (SEMVER-MAJOR) src: fix calls to v8::Object::wrap (Andreas Haas) #59805
- [801ae26fa3] - (SEMVER-MAJOR) src: update NODE_MODULE_VERSION to 141 (Michaël Zasso) #59805
- [10df38a38b] - (SEMVER-MAJOR) src: improve performance of dotenv ToObject (James M Snell) #60038
- [075936b413] - (SEMVER-MAJOR) src: use std::string_view from node_report (iknoom) #60006
- [234c26cca3] - (SEMVER-MAJOR) src: store Local for CallbackScope on stack (Anna Henningsen) #59705
- [708fd1945b] - (SEMVER-MAJOR) src: remove node.h APIs to make callback without an async context (Chengzhong Wu) #58471
- [56989d33f5] - (SEMVER-MAJOR) src: remove deprecated node::EmitBeforeExit and node::EmitExit (Chengzhong Wu) #58469
- [d429aa2d17] - (SEMVER-MAJOR) src: remove deprecated node::CreatePlatform and node::FreePlatform (Chengzhong Wu) #58470
- [e0ae14ce73] - (SEMVER-MAJOR) src: remove deprecated node::InitializeNodeWithArgs (Chengzhong Wu) #58470
- [db1700e4b5] - (SEMVER-MAJOR) src: update NODE_MODULE_VERSION to 138 (Michaël Zasso) #58064
- [0a87084150] - (SEMVER-MAJOR) test: update cppgc-object addon config (StefanStojanovic) #59805
- [7dd49d7da4] - (SEMVER-MAJOR) test: spin longer for sequential/test-worker-prof (Michaël Zasso) #59805
- [faba50df96] - (SEMVER-MAJOR) test: remove --always-turbofan flag (Michaël Zasso) #59805
- [496f12dec6] - (SEMVER-MAJOR) test: update snapshot for V8 14.1 (Michaël Zasso) #59805
- [05aa3a1c70] - (SEMVER-MAJOR) test,win: split addon tests (StefanStojanovic) #59805
- [308de27255] - (SEMVER-MAJOR) tools: update V8 gypfiles for 14.0 (Michaël Zasso) #59805
- [b736370c07] - (SEMVER-MAJOR) tools: update V8 gypfiles for 13.9 (Michaël Zasso) #59805
- [085a94ac9b] - (SEMVER-MAJOR) tools: update V8 gypfiles for 13.8 (Michaël Zasso) #59805
- [a71ae18ac8] - (SEMVER-MAJOR) tools: enable leaptiering for aix/ibmi (Abdirahim Musse) #59805
- [a8217a9eb8] - (SEMVER-MAJOR) tools: update V8 gypfiles for 13.7 (Michaël Zasso) #58064
- [fdef0725de] - (SEMVER-MAJOR) util,console: colorize regexp groups, character classes, etc (Ruben Bridgewater) #59710
- [411cc42d22] - (SEMVER-MAJOR) worker: move terminate callback to end-of-life (James M Snell) #58528
Semver-Minor Commits
- [94422e8a40] - (SEMVER-MINOR) src: add an option to make compile cache portable (Aditi) #58797
- [29738c7b42] - (SEMVER-MINOR) src,permission: add --allow-inspector ability (Rafael Gonzaga) #59711
- [f9fcc746f3] - (SEMVER-MINOR) v8: add cpu profile (theanarkh) #59807
- [4396cf2d45] - (SEMVER-MINOR) wasm: enable JSPI (Guy Bedford) #59941
Semver-Patch Commits
- [91f035e597] - assert: resolve TODO and rename function (Antoine du Hamel) #59451
- [2e675c4fa3] - benchmark: use non-deprecated WriteUtf8V2 method (Michaël Zasso) #60173
- [0fb040603b] - build: upgrade Python linter ruff, add rules ASYNC,PERF (Christian Clauss) #59984
- [f468b6c72b] - build: update minimum Xcode version to 16.4 (Michaël Zasso) #60079
- [0eda17ba20] - build: fix flags for ngtcp2 on IBM i (SRAVANI GUNDEPALLI) #60073
- [22a864a275] - build: remove corepack from release tarballs (Jordan Harband) #59835
- [7079041e0a] - build: only mention Apple when on Apple (Michaël Zasso) #59385
- [954d3f44ef] - build: check Apple clang version in configure script (Michaël Zasso) #59358
- [2b4a09ef8b] - build: fix OpenSSL version detection (Richard Lau) #59353
- [af77e4bf2f] - build: update macOS runner and Xcode (Michaël Zasso) #59238
- [86bfdb5528] - build: remove nocorepack vcbuild flag (Antoine du Hamel) #57772
- [b13f24c2da] - build, src: fix include paths for vtune files (Rahul) #59999
- [2216a3b1d5] - deps: V8: cherry-pick 1e190bbb0396 (Richard Lau) #60206
- [1b22f6049a] - deps: upgrade npm to 11.6.2 (npm team) #60168
- [a1b73fe430] - deps: V8: cherry-pick 2abc61361dd4 (Richard Lau) #60177
- [4eb6e6fd79] - deps: V8: cherry-pick 87356585659b (Joyee Cheung) #60069
- [c0b8c80164] - deps: define V8_PRESERVE_MOST as no-op on Windows (Stefan Stojanovic) #56238
- [65a32bac18] - deps: add ngtcp2 test binaries (James M Snell) #59946
- [ebfc28a037] - deps: update nghttp3 to 1.11.0 (James M Snell) #59249
- [dceb1fca40] - deps: update ngtcp2 to 1.14.0 (James M Snell) #59249
- [ee36b86ba3] - deps: patch V8 to 13.7.152.19 (Node.js GitHub Bot) #58713
- [0b3fc0d7a8] - deps: patch V8 to 13.7.152.14 (Node.js GitHub Bot) #58631
- [91b3bd3fe6] - deps: patch V8 to 13.7.152.13 (Node.js GitHub Bot) #58539
- [f77a96cd76] - deps: patch V8 to 13.7.152.10 (Node.js GitHub Bot) #58446
- [1cd16e5355] - doc: improve code snippet alternative of url.parse() using WHATWG URL (Steven) #60209
- [d54e6aec9e] - doc: createSQLTagStore -> createTagStore (Aviv Keller) #60182
- [aef3fc37eb] - doc: use markdown when branch-diff major release (Rafael Gonzaga) #60179
- [a2f088d516] - doc: update teams in collaborator-guide.md and add links (Bart Louwers) #60065
- [75a6fff6be] - doc: disambiguate top-level worker_threads module exports (René) #59890
- [51df7b92bc] - doc: update macOS version used to build releases (Michaël Zasso) #60080
- [910c8796f9] - doc: update BUILDING to reflect Clang 19 changes (Michaël Zasso) #59782
- [34f9b7eab9] - doc: reserve NMV 140 for Electron 39 (David Sanders) #59627
- [3f6f6db43f] - doc: update minimum Xcode and VS versions (Michaël Zasso) #59358
- [d9fe28bd6b] - doc: fix CHANGELOG.md version listing (Antoine du Hamel) #59299
- [0ab50c2768] - doc: reserve NMV 139 for Electron 38 (Calvin) #58779
- [516b4ebd3c] - doc: mark Node.js 23 as End-of-Life (Antoine du Hamel) #58563
- [59b70e5fe3] - http: fix http client leaky with double response (theanarkh) #60062
- [5cf3c3e24c] - http2: rename variable to additionalPseudoHeaders (Tobias Nießen) #60208
- [535efea962] - http2: do not crash on mismatched ping buffer length (René) #60135
- [4bfa387f6d] - lib: fix constructor in _errnoException stack tree (SeokHun) #60156
- [4daeec11b9] - lib: fix typo in QuicSessionStats (SeokHun) #60155
- [15278252bb] - lib: remove redundant destroyHook checks (Gürgün Dayıoğlu) #60120
- [83052ff9ad] - lib: add node: prefix in sys module deprecation warning (Dario Piotrowicz) #58442
- [d5abfbf582] - lib: add module to use in module deprecation warnings (Dario Piotrowicz) #58442
- [db0121bedd] - module: fix directory option in the enableCompileCache() API (Joyee Cheung) #59931
- [822a8c3244] - perf_hooks: fix stack overflow error (Antoine du Hamel) #60084
- [d52cd04591] - quic: continue working on quic api bits (James M Snell) #60123
- [b4af647920] - quic: reduce boilerplate and other minor cleanups (James M Snell) #59342
- [cd9fd09a27] - quic: multiple fixups and updates (James M Snell) #59342
- [a6c5d27739] - quic: update more of the quic to the new compile guard (James M Snell) #59342
- [ee7b8ab29c] - quic: few additional small comment edits in cid.h (James M Snell) #59342
- [c8b64bd023] - quic: fixup NO_ERROR macro conflict on windows (James M Snell) #59381
- [e2fefd78e2] - quic: fixup windows coverage compile error (James M Snell) #59381
- [99c80e3a45] - quic: update the guard to check openssl version (James M Snell) #59249
- [0e754fa5d1] - quic: start re-enabling quic with openssl 3.5 (James M Snell) #59249
- [200fe9e7f4] - repl: move completion logic to internal module (Dario Piotrowicz) #59889
- [3ac88a7a66] - src: use string_view in WriteReport() (Anna Henningsen) #60201
- [a1244f04de] - src: make additional cleanups in node locks impl (James M Snell) #60061
- [fdb6e66227] - src: update locks to use DictionaryTemplate (James M Snell) #60061
- [367bcce6a6] - src: fix usage of deprecated V8 API (Michaël Zasso) #60174
- [23fa18444f] - src: fix small compile warning in quic/streams.cc (James M Snell) #60118
- [0ec1d186f4] - src: always use strong reference to napi_async_context resource (Anna Henningsen) #59828
- [ce748f6cae] - src: use Global for storing resource in Node-API callback scope (Anna Henningsen) #59828
- [36256230b4] - src: cleanup quic TransportParams class (James M Snell) #59884
- [985e2fb383] - Revert "test: ensure message event fires in worker message port test" (Luigi Pinca) #60126
- [da9cd745c8] - test: ensure assertions are reachable in test/client-proxy (Antoine du Hamel) #60175
- [e105e821e9] - test: skip quic tests that IBM i does not support (SRAVANI GUNDEPALLI) #60160
- [bfc81ca228] - test: ensure assertions are reachable in test/async-hooks (Antoine du Hamel) #60150
- [712cee951c] - test: skip tests that cause timeouts on IBM i (SRAVANI GUNDEPALLI) #60148
- [f8a43f6f34] - test: deflake test-fs-promises-watch-iterator (Luigi Pinca) #60060
- [1f95d39997] - test: prepare junit file attribute normalization (sangwook) #59432
- [eb159a8cfd] - test: remove duplicated allocUnsafeSlow test (Michaël Zasso) #58524
- [d93cff5af3] - Revert "test: fix watch tests not including completion messages" (Joyee Cheung) #58190
- [6102159fa1] - test: fix watch tests not including completion messages (Dario Piotrowicz) #58183
- [ad2c1bf62e] - test,doc: skip --max-old-space-size-percentage on 32-bit platforms (Asaf Federman) #60144
- [6dbf7086bb] - test_runner: fix suite timeout (Moshe Atlow) #59853
- [f0aa073907] - test_runner: add junit file attribute support (sangwook) #59432
- [cff138c6b1] - tests: start adding quic test server utilities (James M Snell) #59946
- [20dc4b514a] - tools: use cooldown property correctly (Rafael Gonzaga) #60134
- [ec26b1c01a] - tools: add lint rule to ensure assertions are reached (Antoine du Hamel) #60125
- [bab752d4db] - typings: add buffer internalBinding typing (방진혁) #60163
- [1986ee4b65] - vm: hint module identifier in instantiate errors (Chengzhong Wu) #60199
- [23b834058c] - wasm: revert enable JSPI as already enabled (Guy Bedford) #60014
- [4bfcad1ac5] - Revert "watch: fix watch args not being properly filtered" (Joyee Cheung) #58190
- [4acb854039] - watch: fix watch args not being properly filtered (Dario Piotrowicz) #57936
Windows 64-bit Installer: https://nodejs.org/dist/v25.0.0/node-v25.0.0-x64.msi
Windows ARM 64-bit Installer: https://nodejs.org/dist/v25.0.0/node-v25.0.0-arm64.msi
Windows 64-bit Binary: https://nodejs.org/dist/v25.0.0/win-x64/node.exe
Windows ARM 64-bit Binary: https://nodejs.org/dist/v25.0.0/win-arm64/node.exe
macOS 64-bit Installer: https://nodejs.org/dist/v25.0.0/node-v25.0.0.pkg
macOS Apple Silicon 64-bit Binary: https://nodejs.org/dist/v25.0.0/node-v25.0.0-darwin-arm64.tar.gz
macOS Intel 64-bit Binary: https://nodejs.org/dist/v25.0.0/node-v25.0.0-darwin-x64.tar.gz
Linux 64-bit Binary: https://nodejs.org/dist/v25.0.0/node-v25.0.0-linux-x64.tar.xz
Linux PPC LE 64-bit Binary: https://nodejs.org/dist/v25.0.0/node-v25.0.0-linux-ppc64le.tar.xz
Linux s390x 64-bit Binary: https://nodejs.org/dist/v25.0.0/node-v25.0.0-linux-s390x.tar.xz
AIX 64-bit Binary: https://nodejs.org/dist/v25.0.0/node-v25.0.0-aix-ppc64.tar.gz
ARMv8 64-bit Binary: https://nodejs.org/dist/v25.0.0/node-v25.0.0-linux-arm64.tar.xz
Source Code: https://nodejs.org/dist/v25.0.0/node-v25.0.0.tar.gz
Other release files: https://nodejs.org/dist/v25.0.0/
Documentation: https://nodejs.org/docs/v25.0.0/api/
.png)
