nodejs/node
Lore
The history of nodejs/node told as a sequence of eras. Dates are derived from git tags and the git log; subjective shifts are flagged as such.
The Joyent / Ryan Dahl era (Feb 2009 – Jan 2014)
Ryan Dahl's first commit is dated 2009‑02‑16 (add dependencies). The repo started life under Joyent's stewardship. Through 2009 and 2010 the codebase was "tiny C++ + node-libev + V8" and grew to its first widely-used release v0.4 in early 2011. By 2013 Node was a known web-stack staple but development pace and governance disputes were straining the community.
Notable milestones:
- Feb 2009 — first commit; libev-based event loop.
- Mar 2010 —
v0.1.30; libev → libuv migration begins. - 2011 — npm becomes the default package manager.
- Mar 2013 —
v0.10.0ships streams2 and the modern callback-API surface that defines the next decade.
The io.js fork and reunification (Dec 2014 – Sep 2015)
Frustrated with Joyent's release cadence, contributors created io.js in Dec 2014. After several months of parallel development the io.js Foundation and Joyent agreed to unify under the Node.js Foundation. The reunification commits land in mid-2015 and ship as v4.0.0 on 2015‑09‑07 — the version number jumps from io.js's last v3.x to align with the unified track.
Notable side-effects:
- 2015 — open governance model adopted; Technical Steering Committee created (see
GOVERNANCE.md). - Sep 2015 —
v4.0.0: first LTS line; semver discipline enforced. - 2015 — V8 4.5 brings ES6 features.
The TSC / LTS era (Sep 2015 – Apr 2018)
This is when Node became a "real" governed project. The LTS schedule (every even major) was formalized. The release cadence is now: even majors in April, odd in October.
- Apr 2016 —
v6.0.0("Boron"). - Mar 2017 —
v8.0.0("Carbon"); Node-API (thenn-api) ships experimental. - Mar 2018 —
v10.0.0("Dubnium"); HTTP/2 stable.
The 2017–2018 years are the peak commit activity in the repo's history (~ 4 600 commits per year). Most of the modern internal architecture — internalBinding, BaseObject, BindingData, the snapshot-builder, the centralized error registry — landed in this period.
OpenJS Foundation and the maturity era (Apr 2018 – Apr 2022)
The Node.js Foundation merged with the JS Foundation to form the OpenJS Foundation in 2019. From 2019 on, growth is more about polish than features. Major work:
- Mar 2019 —
v12.0.0("Erbium"); workers move stable,--max-old-space-sizedefaults raised. - Mar 2020 —
v14.0.0("Fermium");Diagnostics Channel,Async Local Storageexperimental,reportstable. - Mar 2021 —
v16.0.0("Gallium"); npm 7. - Mar 2022 —
v18.0.0("Hydrogen");globalThis.fetch(undici),node --testexperimental,--watchexperimental.
Year-over-year commits dipped to ~ 2 600 from the 2017–2018 highs as the project shifts from feature growth to deepening.
The "platform" era (Apr 2023 – present)
Node deliberately broadens its scope: it is now a JS platform, not just a runtime. The releases reflect that:
- Apr 2023 —
v20.0.0("Iron"); Permission Model experimental, SEA experimental,node --testand--watchstable,node:testmocking. - Apr 2024 —
v22.0.0("Jod");require(esm)experimental, WebSocket client,--experimental-strip-types(TypeScript). - Mar 2025 —
v24.0.0; defaultnode:sqlite, mature TS support, removed ageing experimental flags. - Sep 2025 —
v25.0.0;node:ffi, ngtcp2-based QUIC + experimental HTTP/3 broaden. - 2026 (in progress) —
v26.xcontinues the platform strategy:URLPattern, more WHATWG WebStreams stability, default config files.
Longest-standing features
- Streams — the public stream contract has been stable since
v0.10(Mar 2013). The implementation has been rewritten multiple times (streams2 → streams3 → the modern hardened version) but the surface has not changed. process.nextTick— present sincev0.1. It is older than the libuv migration.require— present since the very first commit. The CJS resolver has been generalized for ESM, package exports, andnode:prefixes, but theModuleclass structure is the original Joyent design.fs.readFile/fs.readFileSync—v0.1; the chunked-read context is more recent.http—v0.1; backed byhttp_parseruntil 2019, then byllhttp.
Major rewrites and migrations
- libev → libuv (2010‑2011). Established the cross-platform abstraction Node still uses.
http_parser→llhttp(2019). nodejs/llhttp by Fedor Indutny replaced the old Joyent parser; ~ 116× speed improvement.- WHATWG URL parser (2017‑2024). Hand-rolled JS → C++ URL bindings → ada (vendored 2023).
- OpenSSL 1.1 → 3.0 (2022). Took over a year of work; the migration debt is still visible in
src/crypto/. - ESM loader rewrite (2021‑2024). The single-thread synchronous-resolve loader gave way to the async, hooks-aware, optionally-worker-isolated loader in
lib/internal/modules/esm/. - Snapshots / mksnapshot (2020‑2022). Joyee Cheung led the work that made
Realm::DeserializePropertiesviable; startup got materially faster. require(esm)(2024). After 6 years of "you can't synchronously require an ESM" Node 22 finally allowed it under a flag.- TypeScript via amaro (2025).
--experimental-strip-typesintegrates an SWC-based stripper in Rust, vendored atdeps/amaro/.
Deprecated / removed features
- Domains (
domainmodule). Soft-deprecated in 2014; still present but discouraged. punycode. Deprecated in favor of the globalURLparser; userland alternative recommended.url.parse(legacy URL API). Replaced by the WHATWGURLclass in 2018; still works but flagged "Legacy".process.binding. Most allow-list entries removed;internalBindingreplaces it.vm.Script.runInNewContext(legacy form). Multiple deprecations and arg-shape replacements over the years.fs.exists. Deprecated in favor offs.access.- The legacy
assert(non-strict). Strict mode is now the default; the behavioural difference shrinks each major. http_parser. Removed entirely; the parser is now llhttp.crypto.DEFAULT_ENCODING. Removed.- Event-emitter
errorheuristics. Multiple cycles of stricter behaviour over the years.
Growth trajectory
- First commit: Feb 2009.
- First LTS: Sep 2015 (
v4). - Latest stable:
v26line in development,v25.xCurrent,v24.xActive LTS,v22.xActive LTS,v20.xMaintenance. - Releases per year (since LTS): 2 (one Current + one LTS) plus monthly patch / security releases.
- Working groups under
nodejs/: dozens (build,releasers,streams,tsc,loaders,crypto,http,http2,quic,web-standards,single-executable,typescript,security-wg,inspector,node-api,path,url,config,fs,wasi,ffi,actions,web-infra, …).
Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.