← Blog

Oam.js v0.9.0

August 8, 2026

Oam.js 0.9.0 is a child_process release. The module had no differential coverage against Node until now, so nearly everything on a failure or option-edge path was untested — most of what follows was found by reading it properly for the first time, not by anything failing.

Minor, not patch: several of these change behavior you may depend on. oam is pre-1.0; breaking changes land in minor releases.

The behavior changes

Both halves of extra-fd spawns

oam can now be the child of an extra-fd spawn, not only the parent of one. A descriptor the parent hands us is adopted the first time an fs call names it, so readSync(3, …) and writeSync(4, …) behave as on Node instead of throwing EBADF, and closeSync(4) closes the parent's descriptor so the peer sees EOF instead of hanging. This is the receive half of the CDP pipe transport.

A numbered descriptor in a stdio slot is honored too. stdio: ['ignore', logFd, logFd] — the daemonize-into-a-logfile shape — now hands the child a dup so the output reaches the file; it used to collapse to 'inherit' while child.stdout === null made the redirect look like it had worked.

The failure paths

One release-process fix: the MCP sidecar matrix ran after the GitHub release went live — a "do not ship" verdict on a build the installer could already resolve. It now runs before the release is cut.

Install or update

macOS and Linux:

curl -fsSL https://oamjs.org/install.sh | sh

Windows (PowerShell):

irm https://oamjs.org/install.ps1 | iex

To pin this release, put OAM_VERSION on sh, not on curl:

curl -fsSL https://oamjs.org/install.sh | OAM_VERSION=v0.9.0 sh
$env:OAM_VERSION = "v0.9.0"; irm https://oamjs.org/install.ps1 | iex

An existing install updates itself:

oam self-update

which re-runs the installer with the same verification. Binaries are unsigned; the installer checks them against the published SHA256SUMS and refuses a mismatch. Direct downloads and checksums: the downloads page.