Processes & servers
$ cat > server.js <<'EOF'require('http').createServer((req, res) => res.end('ok from another isolate')) .listen(3000, () => console.log('listening on 3000'));EOF$ node server.jslistening on 3000$ curl http://127.0.0.1:3000/ok from another isolateThat curl crossed an isolate boundary. Each process runs in its own V8
isolate: the platform caps every isolate at 128 MiB, which is a per-process
segment, not the whole machine’s memory. The supervisor joins processes
through its port registry. Start a server and it automatically becomes
resident, with a keyed isolate and registered port. No flags are needed.
One-shot processes run, stream their writes back, and exit. Residents survive
across requests and own ports. Attached TTYs are residents with an interactive
tab (terminal & shell, alpha). The supervisor owns
the process table, so ps is accurate after a facet eviction. If a process
can’t be restored, it is marked dead with a reason, so there are no zombies.
Logs are durable and bounded. Node supports child_process.spawn, exec, and
execFile with piped stdio.
Listening ports open and focus preview tabs. The path uses real
Request/Response objects and streams as data arrives. SSE ticks, chunked
bodies, and curl output stay live; Ctrl+C cancels.
Vite HMR measures 302 ms median end to end.
Outbound access is open. fetch, Node HTTP clients, npm, pip, gem, and git
use it. WASI binaries get TCP through /dev/tcp/<host>/<port>. Inbound access
is HTTP(S) through session routes. The platform has no raw public TCP inbound.
Loopback lets one app span cooperating isolates. The opencode server and TUI
pair is alpha. fork() is proven research, but it isn’t a shipped syscall;
the evidence is here.