History of Node.js

From a frustrated developer's insight about blocking I/O to the runtime that powers the modern web. 15 years of revolution.

Born from Frustration

In 2009, Ryan Dahl was frustrated. He was watching a file upload progress bar on Flickr and realized the browser had no way to know how much of the file had been uploaded — because web servers like Apache used blocking I/O. Each connection consumed a thread, and threads were expensive. The server couldn't push real-time progress updates.

Dahl had been experimenting with event-driven, non-blocking I/O servers in C, Lua, and Haskell. But none of these languages had the right combination of a fast VM, no existing I/O libraries (that would be blocking), and a massive developer base. Then he realized: JavaScript had all three. V8 was blazing fast, JavaScript had no server-side I/O conventions to break, and millions of web developers already knew the language.

He built a prototype in just a few weeks: a C++ wrapper around Google's V8 engine, with a custom event loop based on libev (later libuv), and non-blocking bindings for file I/O, networking, and DNS. He called it Node.

The Evolution of Node.js
November 2009
JSConf EU — Node.js is Born
Ryan Dahl presents Node.js at JSConf EU in Berlin. The demo shows a real-time IRC chat server in ~40 lines of JavaScript. The audience gives a standing ovation. The talk goes viral and the GitHub repo explodes with stars.
January 2010
npm is Created
Isaac Z. Schlueter releases npm (Node Package Manager), giving Node.js a package ecosystem. npm's flat dependency model and package.json convention make sharing and reusing code trivially easy. This single tool would become the world's largest software registry.
2010
Joyent Sponsors Node.js
Cloud computing company Joyent hires Ryan Dahl and takes stewardship of the Node.js project. Joyent provides infrastructure, funding, and corporate credibility. Dahl works on Node full-time.
June 2011
Windows Support & libuv
Node.js 0.6 adds native Windows support via libuv, a new cross-platform async I/O library that replaces libev. Microsoft contributes to the Windows port. libuv becomes one of Node's most important architectural components.
2012
Ryan Dahl Steps Down
Dahl hands the project over to Isaac Z. Schlueter (npm creator) and moves on to other interests. He later says Node.js was "done" in his mind — the core architecture was complete. He would spend years reflecting on what he got wrong.
2013 – 2014
Growing Pains
The community grows frustrated with Joyent's slow release cadence and centralized governance. Contributors want faster V8 updates, better ES6 support, and a more open decision-making process. Tensions build.
December 2014
The io.js Fork
Key contributors fork Node.js as io.js, an open-governance alternative. io.js ships rapidly, updating V8 frequently and adding ES6 features. The fork creates chaos in the ecosystem — packages must decide which runtime to support.
September 2015
Node.js Foundation — Reunification
io.js and Node.js merge under the newly formed Node.js Foundation (under the Linux Foundation). The merged project adopts io.js's open governance model, its rapid release schedule, and its modern V8. Node.js 4.0 is the first unified release.
2016 – 2017
Enterprise Adoption Explodes
Netflix, PayPal, Uber, LinkedIn, Walmart, NASA, and hundreds of Fortune 500 companies adopt Node.js for production workloads. The LTS (Long-Term Support) release schedule gives enterprises the stability they need.
June 2018
Ryan Dahl Returns with Deno
Dahl gives a talk titled "10 Things I Regret About Node.js" at JSConf EU and announces Deno, a new runtime built on V8 with TypeScript support, secure-by-default permissions, and no node_modules. It's both a critique and a spiritual successor.
March 2019
OpenJS Foundation
The Node.js Foundation merges with the JS Foundation to form the OpenJS Foundation, consolidating governance of Node.js, jQuery, webpack, ESLint, Electron, and other JavaScript projects under one umbrella.
2023 – 2024
Node.js 20 & 22 LTS
Modern Node.js adds native test runner, --watch mode, single executable applications, built-in .env file support, and experimental TypeScript stripping. Node.js 22 becomes the current LTS with stable WebSocket client support.
The io.js Split & Reunification

The io.js fork of 2014 was one of the most dramatic events in open-source JavaScript history. The core issue was governance: Joyent controlled the project, releases were slow, and V8 updates lagged months behind Chrome. Contributors felt locked out of decision-making.

io.js adopted an open governance model with a Technical Committee (TC) where decisions were made by consensus among active contributors, not by a corporate sponsor. It shipped weekly releases, updated V8 aggressively, and added ES6 features (arrow functions, generators, template literals) months before Node.js did.

The reunification in September 2015 was a victory for the community. Node.js adopted io.js's governance, its codebase, and its release cadence. The result was a project that was both enterprise-stable (via LTS releases) and community-driven (via open governance). The fork, while painful, ultimately made Node.js stronger.

"I think Node is not the best system to ever be created. It's just the right amount of bad ideas and the right amount of good ideas to be a useful tool."
— Ryan Dahl, creator of Node.js
Node.js LTS & Current Releases
VersionCodenameRelease DateStatusKey Additions
v0.12009HistoricalInitial release, event loop, HTTP server
v4.0ArgonSep 2015End of LifeFirst merged io.js + Node.js release, ES6 support
v6.0BoronApr 2016End of Life93% ES6 coverage, inspector protocol
v8.0CarbonMay 2017End of Lifeasync/await, N-API, npm 5
v10.0DubniumApr 2018End of Lifefs.promises, HTTP/2 stable, Worker Threads experimental
v12.0ErbiumApr 2019End of LifeWorker Threads stable, ES modules, V8 7.4
v14.0FermiumApr 2020End of LifeDiagnostic reports, optional chaining, nullish coalescing
v16.0GalliumApr 2021End of LifeTimers Promises API, Web Crypto API, Apple Silicon builds
v18.0HydrogenApr 2022Maintenancefetch API, test runner, watch mode, Web Streams
v20.0IronApr 2023LTS ActivePermission model, stable test runner, V8 11.3
v22.0JodApr 2024LTS ActiveWebSocket client, require(esm), glob/globSync, V8 12.4

Even-numbered releases become LTS (Long-Term Support) with 30 months of maintenance. Odd-numbered releases are short-lived "Current" releases for early adopters.