← Oam.js

◍ Blog

Engineering posts from the Oam.js runtime. Numbers come with their denominators, and the cases where another runtime wins are named.

setRawMode is not cfmakeraw

Four raw-mode traps, checked against the libuv and kernel source Node actually runs: cfmakeraw is not Node's raw mode, a Windows console read already waiting keeps its old line buffering, an exit listener is not an exit path, and macOS writes back a termios bit you did not set.

What --permission was not checking

An audit of what the flag was actually enforcing: 9 of 47 filesystem ops, and child_process not at all. What changed, and the one place oam is deliberately stricter than Node.

Oam.js: a runtime for TypeScript and MCP servers, with the denominators attached

What Oam.js is, what the conformance and benchmark numbers actually measure, where Bun and Node win, and when to pick something else.

MCP servers as sidecars: what a runtime owes a fleet of small processes

Cold start, idle RSS and first-call latency are costs a sidecar fleet pays over and over. What the benchmarks say — and what they do not.

Running TypeScript without a build step (and where the types actually go)

How oam strips and runs .ts instantly while a warm tsgo sidecar streams full type diagnostics, and the ESM divergence most likely to bite.

Why Oam.js ships unsigned, checksummed binaries

What the installer verifies, what a SHA-256 checksum proves and does not prove, and how to check a download by hand.

Why there is no linux-arm64 build yet

linux-arm64 compiles from the same tree, but the V8 startup snapshot cannot be cross-compiled. Why the installer refuses rather than guesses.

Oam.js v0.9.0

What changed in v0.9.0, leading with the behavior changes.