Skip to content

Processes & servers

Terminal window
$ 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.js
listening on 3000
$ curl http://127.0.0.1:3000/
ok from another isolate

That 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.