JavaScript, off the browser. Node runs JS on the server with a non-blocking event loop, letting one process juggle thousands of connections at once.
Node's built-in http module is all you need to answer requests. Click Run to "start" the server — the terminal below is a simulation (the JS is real, but real Node runs on a server, not in your tab).
const http = require('node:http'); const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ ok: true, msg: 'Hello from Node' })); }); server.listen(3000, () => console.log('Listening on :3000'));
With the server "running", fire requests at it. The route handler responds with real JSON — exactly how a Node API feels in practice (simulated client + server, all in JS).
The server must be running (Demo 01). 200 = found, 404 = no such route.
Node never waits. Synchronous code runs first, then timers, then I/O callbacks. Click Run to watch the runner sweep the phases and log lands in the famous "non-blocking" order.
console.log('1 · sync'); setTimeout(() => console.log('4 · timer'), 0); Promise.resolve().then(() => console.log('3 · microtask')); console.log('2 · sync');
Because Node doesn't block on I/O, a single process can hold many open connections cheaply. These numbers describe Node's real-world profile.
Node ships with npm. Type a package and "install" it — a simulated install log shows the experience of pulling code from the registry.
http module, the event-loop snippet, npm). But Node executes on a server, not in a browser tab — so the terminal, the request/response console, the event-loop animation and the install log are an interactive simulation written in vanilla JavaScript. The shared CSS shell provides the page styling.