// LEARN · LANGUAGES & FRAMEWORKS
Node.js
A practical Node.js course from a first script and project setup to HTTP APIs, streams, testing, performance and security. Every example is run on the current LTS release.
Level: Beginner to advanced · For: Developers who know basic JavaScript and want to build command-line tools and services on Node.js.
Syllabus
Beginner
Complete
After this level you can
- Start a Node.js project that runs in the intended module system, with scripts in package.json and configuration from --env-file
- Write a command-line tool that parses arguments with util.parseArgs, reads and writes files with node:fs/promises, and exits with a meaningful code
- Combine callbacks, promises and async/await correctly, including running tasks in parallel and handling rejections
- Write and run unit tests with the built-in node:test runner and node:assert
B1Running Node and project basics5 of 5 written · 5 lessonsRuns on your computer
Start a project that runs, reads config and fails loudly
You build: A small argument-driven CLI
B2npm and packages5 of 5 written · 5 lessonsRuns on your computer
Manage dependencies and scripts reproducibly
You build: A utility package with its own test script
B3Files and paths5 of 5 written · 5 lessonsRuns on your computer
Read, write and organise files safely
You build: A notes CLI that stores JSON on disk
B4Asynchronous Node5 of 5 written · 5 lessonsRuns on your computer
Combine async operations correctly, in sequence and in parallel
You build: A parallel folder-size report
B5Events, input and first tests5 of 5 written · 5 lessonsRuns on your computer
React to events, read user input and test the result
You build: A tested to-do CLI
Beginner project
Logbook CLI
A command-line journal that adds, lists, filters and exports tagged entries in a JSON file, fails clearly on a corrupt file and has a node:test suite.
Runs on your computerSelf-checked against a rubric
Open the project guideIntermediate
Coming soon
After this level you can
- Build a JSON HTTP API with node:http only, including routing, body parsing, status codes and graceful shutdown
- Process large files with streams and pipeline(), respecting backpressure
- Test an HTTP service with node:test, using mocks, fake timers and coverage, and call other services with fetch
- Run TypeScript files directly with Node.js type stripping and type-check them separately with tsc
I1HTTP with node:httpComing soon · 6 lessonsRuns on your computer
Serve and consume JSON over HTTP without a framework
You build: A notes REST API
- I1.1Coming soon
- I1.2Coming soon
- I1.3Coming soon
- I1.4Coming soon
- I1.5Coming soon
- I1.6Coming soon
I2Buffers and streamsComing soon · 5 lessonsRuns on your computer
Process data larger than memory
You build: A streaming CSV-to-NDJSON converter
- I2.1Coming soon
- I2.2Coming soon
- I2.3Coming soon
- I2.4Coming soon
- I2.5Coming soon
I3Testing in depthComing soon · 5 lessonsRuns on your computer
Test services with isolation and coverage
You build: A test suite for the notes API with a coverage threshold
- I3.1Coming soon
- I3.2Coming soon
- I3.3Coming soon
- I3.4Coming soon
- I3.5Coming soon
I4Errors, processes and configurationComing soon · 5 lessonsRuns on your computer
Handle failures and signals like a production service
You build: A task runner that spawns commands
- I4.1Coming soon
- I4.2Coming soon
- I4.3Coming soon
- I4.4Coming soon
- I4.5Coming soon
I5TypeScript on Node.jsComing soon · 5 lessonsRuns on your computer
Run and type-check TypeScript with Node.js
You build: Porting the notes CLI to TypeScript
- I5.1Coming soon
- I5.2Coming soon
- I5.3Coming soon
- I5.4Coming soon
- I5.5Coming soon
Intermediate project
Link-checker API
A node:http service that checks a list of URLs with fetch at limited concurrency, streams results as NDJSON and shuts down cleanly on SIGTERM.
Runs on your computerSelf-checked against a rubric
Advanced
Coming soon
After this level you can
- Find and fix event-loop blocking, memory leaks and hot paths with the inspector, CPU profiles, heap snapshots and perf_hooks
- Move CPU-bound work to worker threads, and explain when cluster or child processes fit better
- Harden a service with the permission model, node:crypto for hashing and tokens, input validation and dependency auditing
- Package and publish a library with conditional exports, and ship a command-line tool as a single executable
A1Event loop and performanceComing soon · 5 lessonsRuns on your computer
Find and remove event-loop blocking
You build: Fixing a slow endpoint and proving it with numbers
- A1.1Coming soon
- A1.2Coming soon
- A1.3Coming soon
- A1.4Coming soon
- A1.5Coming soon
A2ConcurrencyComing soon · 5 lessonsRuns on your computer
Use worker threads and processes where they help
You build: A hashing service off the main thread
- A2.1Coming soon
- A2.2Coming soon
- A2.3Coming soon
- A2.4Coming soon
- A2.5Coming soon
A3Debugging and diagnosticsComing soon · 5 lessonsRuns on your computer
Debug live processes and memory problems
You build: Finding and fixing a leak in a sample service
- A3.1Coming soon
- A3.2Coming soon
- A3.3Coming soon
- A3.4Coming soon
- A3.5Coming soon
A4SecurityComing soon · 6 lessonsRuns on your computer
Harden a Node.js service
You build: A hardened file service
- A4.1Coming soon
- A4.2Coming soon
- A4.3Coming soon
- A4.4Coming soon
- A4.5Coming soon
- A4.6Coming soon
A5Data and distributionComing soon · 5 lessonsRuns on your computer
Store data locally with node:sqlite and ship code to others
You build: Packaging the capstone command-line tool
- A5.1Coming soon
- A5.2Coming soon
- A5.3Coming soon
- A5.4Coming soon
- A5.5Coming soon
Advanced project
Job queue with workers
A service that runs CPU-heavy jobs in a worker pool, stores state in node:sqlite, survives a restart and runs under the permission model.
Runs on your computerSelf-checked against a rubric
Capstone
Capstone
A self-hosted service of your choice
A small service, such as an RSS reader, combining HTTP, streams, storage, tests, TypeScript and security, published as a package or single executable.
Runs on your computerSelf-checked against a rubric
Sources
- Node.js v24 API documentation
- Node.js: Previous releases
- Modules: Packages, package entry points and self-referencing (Node.js v24 documentation)
- Modules: ECMAScript modules, import.meta.dirname (Node.js v24 documentation)
- Modules: CommonJS modules, built-in modules with mandatory node: prefix (Node.js v24 documentation)
- Command-line API: --test, --test-only, --test-name-pattern, --test-reporter (Node.js v24 documentation)
- Process: process.cwd() (Node.js v24 documentation)
- Run Node.js scripts from the command line (Node.js Learn)
- How to use the Node.js REPL (Node.js Learn)
- REPL (Node.js v24 documentation)
- Command-line API: --watch and --watch-path (Node.js v24 documentation)
- Util: util.parseArgs([config]) (Node.js v24 documentation)
- Errors: error propagation and ERR_MULTIPLE_CALLBACK (Node.js v24 documentation)
- Output to the command line using Node.js (Node.js Learn)
- Console: console.log, console.info, console.error, console.warn (Node.js v24 documentation)
- Process: process.stdout, process.stderr and a note on process I/O (Node.js v24 documentation)
- Process: process.exit(), process.exitCode and exit codes (Node.js v24 documentation)
- Stream: writable.write() (Node.js v24 documentation)
- Util: util.parseArgs([config]) (Node.js v24 documentation)
- Command-line API: --env-file and --env-file-if-exists (Node.js v24 documentation)
- Command-line API: --run and its intentional limitations (Node.js v24 documentation)
- Process: process.exitCode and exit codes (Node.js v24 documentation)
- An introduction to the npm package manager (Node.js Learn)
- npm-init (npm Docs, npm 11)
- package.json: files, exports, main and local paths (npm Docs, npm 11)
- scripts (npm Docs, npm 11)
- npm-run (npm Docs, npm 11)
- npm-test (npm Docs, npm 11)
- npm-install: folders and tarballs (npm Docs, npm 11)
- package-lock.json (npm Docs, npm 11)
- npm-ci (npm Docs, npm 11)
- npm-uninstall (npm Docs, npm 11)
- folders (npm Docs, npm 11)
- npx (npm Docs, npm 11)
- About semantic versioning (npm Docs)
- node-semver README: ranges, tilde, caret, X-ranges, prerelease tags (npm, linked from the npm Docs)
- npm-outdated (npm Docs, v11)
- npm-update (npm Docs, v11)
- Modules: ECMAScript modules, import.meta and JSON modules (Node.js v24 documentation)
- Modules: ECMAScript modules, node: imports and built-in modules (Node.js v24 documentation)
- Test runner (Node.js v24 documentation)
- npm-pack (npm Docs, npm 11)
- Node.js File Paths (Node.js Learn)
- Path: path.join(), path.resolve(), path.posix and path.win32 (Node.js v24 documentation)
- URL: url.fileURLToPath() and url.pathToFileURL() (Node.js v24 documentation)
- File system: promise, callback and synchronous forms (Node.js v24 documentation)
- Reading files with Node.js (Node.js Learn)
- File system: fsPromises.readFile() and fs.readFileSync() (Node.js v24 documentation)
- Writing files with Node.js (Node.js Learn)
- File system: fsPromises.writeFile() and fsPromises.appendFile() (Node.js v24 documentation)
- File system: file system flags (Node.js v24 documentation)
- File system: fs.rename(), fsPromises.readdir() and fsPromises.rm() (Node.js v24 documentation)
- Working with folders in Node.js (Node.js Learn)
- Node.js file stats (Node.js Learn)
- File system: fsPromises.readdir() and fs.Stats (Node.js v24 documentation)
- File system: fs.stat(), fsPromises.lstat() and fs.Stats (Node.js v24 documentation)
- File system: fsPromises.access() (Node.js v24 documentation)
- File system: fsPromises.rmdir(), fsPromises.rm() and fsPromises.cp() (Node.js v24 documentation)
- Errors: common system errors (Node.js v24 documentation)
- Process: process.exitCode (Node.js v24 documentation)
- JavaScript Asynchronous Programming and Callbacks (Node.js Learn)
- Asynchronous flow control (Node.js Learn)
- Discover Promises in Node.js: Advanced Promise Methods (Node.js Learn)
- Util: util.promisify(original) (Node.js v24 documentation)
- Timers: Timers Promises API (Node.js v24 documentation)
- File system: Callback API (Node.js v24 documentation)
- Process: Event 'unhandledRejection' and exit codes (Node.js v24 documentation)
- Command-line API: --unhandled-rejections=mode (Node.js v24 documentation)
- Errors: error.cause (Node.js v24 documentation)
- File system: Class FileHandle and filehandle.close() (Node.js v24 documentation)
- Modules: ECMAScript modules, top-level await (Node.js v24 documentation)
- File system: Promises API (Node.js v24 documentation)
- The Node.js Event Loop (Node.js Learn)
- Timers (Node.js v24 documentation)
- Process: process.nextTick() and queueMicrotask() (Node.js v24 documentation)
- The Node.js Event emitter (Node.js Learn)
- Events (Node.js v24 documentation)
- Accept input from the command line in Node.js (Node.js Learn)
- Readline (Node.js v24 documentation)
- Discovering Node.js's test runner (Node.js Learn)
- Assert (Node.js v24 documentation)
- Using Node.js's test runner (Node.js Learn)