Skip to content

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 24 Jun 23:50
· 144 commits to main since this release
86bbf5b

This release adds a web-standard Worker to stock Node and hardens the package manager's compatibility with pnpm, yarn, and bun.

Web Workers

Nub ships the browser-standard Worker — the same new Worker(...) constructor, postMessage, and event surface you write for the web, running on your installed Node. There is no Nub-specific API: it is the WHATWG Web Workers shape (Cloudflare semantics where there is no formal spec), preloaded as a polyfill over node:worker_threads and feature-detected so it installs only when no native global is present.

This closes the most-upvoted open issue on the nodejs/node repository — web Worker support — without waiting for Node to ship it.

const worker = new Worker(new URL("./worker.ts", import.meta.url), { type: "module" });

worker.postMessage({ n: 41 });
worker.onmessage = (ev) => console.log(ev.data); // → 42
// worker.ts — runs directly, no build step
self.onmessage = (ev) => self.postMessage(ev.data.n + 1);

What works:

  • TypeScript and JSX worker entries run directly — Nub transpiles the worker like any other entry, so a .ts worker needs no build step.
  • Inline workers via data: and blob: URLs — the WHATWG inline mechanisms, which node:worker_threads does not expose through a browser-shape constructor.
  • Classic and module workerstype: "module" (the default) and type: "classic", the latter exposing synchronous importScripts(...).
  • { name } surfaces as worker.name (main thread) and self.name (worker).
  • Real MessageEvent / ErrorEvent — inbound messages arrive as MessageEvents; a thrown worker error surfaces as an ErrorEvent with populated filename / lineno / colno.
  • Transferables, MessageChannel / MessagePort, and BroadcastChannel roundtrip correctly.

The polyfill is preloaded on Node 18.19 and up. SharedWorker and ServiceWorker are not part of this release; terminate() returns undefined (the spec shape). A WPT-based conformance harness now guards the surface in CI. (#99, #119)

Package manager

Area What changed PR
yarn Resolve yarn-berry catalogs instead of erroring #130
yarn Honor npmMinimalAgeGate; drop a fabricated bun trustedDependencies gate #131
pnpm Write link: versions for versionless workspace members in pnpm-lock.yaml #115
pnpm Audit pnpm v11.9.0: redact inherited credentials, honor multi-version minimumReleaseAgeExclude #104
general Fix a packageManager URL-form crash and store-open without HOME #116
runtime Recover from the async-loader resolveSync stub on the fast tier (Turbopack / Tailwind crash) #98

Tooling and distribution

Area What changed PR
Docker Official Nub images (node:26 slim + alpine) with a publish workflow #108
Homebrew Auto-bump the tap formula on release; Node-free brew test #121, #125
Build Split nub-native into its own workspace so the CLI builds with panic=abort #112
Build Drop the dead config-TUI (ratatui / crossterm) from the embedded engine #110

Documentation

  • Per-major Node version/tier table on /docs/runtime, with recommended fast-tier versions and a cold-start cost callout. (7a67d39e, 5edbf338)
  • Move WebSocket / EventSource to the unflag list — they are never polyfilled. (905c7f3d)
  • Document the in-package /regex/ multi-script selector for nub run. (#103)
  • List pnpm overrides / packageExtensions / patchedDependencies as supported. (#127)
  • Add the Homebrew install path across the remaining install surfaces; link the official Docker image from the Introduction. (#123, 9be5f5f3)

Testing and internals

  • WPT worker conformance harness + a wpt-worker CI leg. (#119)
  • Node-version matrix smoke for the augmentation surface. (#100)
  • Cover the topological_chunks cycle-handling branch. (#114)
  • Apple Silicon VM-control runbook + a proven Tart Linux loop. (#101)
  • Fix a shift-on-empty bug in the pnpm-conformance harness's run.sh. (#111)
  • A pre-commit guard blocking direct commits to the shared main tree (agents only). (#122, #124)
  • gh-comment verbosity guard and a sharpened issue-comment tone rule. (#128, #129)
  • Fix a Docker build-leg startup_failure from an unquoted YAML scalar; make the nub-native cross-build cache key self-contained. (#126, #132)

Thanks to @jdalton for the dependency trim, build split, and test coverage (#110, #112, #114), and to @morinokami, @iamnafets, @innermatrix-cityblock, and @devharshthakur for the issue reports that drove the package-manager and install-path fixes.

Commits in this release

  • bench: add --quiet/--clean flag to script-runner harnesses (47aa8cad)
  • chore: sync Cargo.lock to v0.1.14 workspace version (fee03cc1)
  • tests/vm: Apple Silicon VM-control runbook + proven Tart Linux loop (#101, 2ce8da5e)
  • test(ci): Node-version matrix smoke for the augmentation surface (#100, 5492d821)
  • ci: fix download-stats argv bug + backfill recoverable npm history (dc60d71f)
  • stats: download snapshot 20260624T143114Z (1ad83c4e)
  • worker: spec-faithful Worker — inline/Blob/data: workers, name, error location, classic mode (#99, 6c528076)
  • docs: per-major Node version/tier table on /docs/runtime (7a67d39e)
  • docs(readme): move WebSocket/EventSource to the unflag list (they're never polyfilled) (905c7f3d)
  • docs(runtime): mark recommended fast-tier Node versions; add cold-start cost callout (5edbf338)
  • site: extend terminal code-block styling to bash/sh shell fences (041e5801)
  • worktree: symlink .fray into worktrees so isolated agents can Edit their own fray thread (1f31fadc)
  • test(pnpm-conformance): fix shift-on-empty-$@ bug in run.sh arg parsing (#111, 1efd7469)
  • Audit pnpm v11.9.0: fix inherited credential leak + multi-version minimumReleaseAgeExclude (#104, fd5abf66)
  • docs(run): document the in-package /regex/ multi-script selector (#103, 80f04ef3)
  • perf(cli): drop the dead config-tui (ratatui/crossterm) from the embedded engine (#110, 4aa96e90)
  • docker: official nub images (node:26 slim + alpine) + publish workflow (#108, 8c6c2a09)
  • test(core): cover topological_chunks cycle-handling branch (#114, 23c720a6)
  • agents: add Non-negotiables quick-ref + elevate PR closing-keyword to non-negotiable (21345246)
  • aube: write link: version for versionless workspace members in pnpm-lock.yaml (#115, 7a8571a1)
  • pm: fix packageManager URL-form crash and store-open without HOME (#116, bbb445a7)
  • Fix formatting issues in README.md (69fd2291)
  • perf(build): split nub-native into its own workspace so the CLI uses panic=abort (#112, 12e38b3c)
  • skills: rename nub-dev skill to dev-loop (drop redundant prefix) (b6d82e57)
  • skills: clean boundaries — point dev-loop at aube-sync for upstreaming, dedupe worktree recipe (b892a17b)
  • docs: correct module-resolution probe order and resolver details (719004cd)
  • ci: bump Homebrew tap formula on release (#121, 245407fe)
  • PROSE.md: codify release-notes/prose principles from Zod 4 style (401e976f)
  • test(worker): WPT conformance harness + wpt-worker CI leg (#119, d06a0846)
  • githooks: add pre-commit guard blocking direct commits to the shared main tree (#122, 13c9c95c)
  • docs: add Homebrew install path to remaining install surfaces (#123, d0de8d2e)
  • githooks: block only AGENT commits to shared main, never the maintainer's terminal (#124, 1381a952)
  • fix(homebrew): make brew test Node-free (path-existence check, not TS transpile) (#125, 1a61e95d)
  • ci(docker): fix startup_failure from unquoted YAML scalar in build leg (#126, b73966a9)
  • skills: add prose skill surfacing PROSE.md as a trigger + index (11797224)
  • docs(install): list pnpm overrides/packageExtensions/patchedDependencies as supported (#127, e8389d4b)
  • hooks: guard gh-comment verbosity + sharpen issue-comment tone rule (#128, f5fa8bc3)
  • hooks: gh-comment guard measures the longest of multiple --body flags (#129, 85dabf35)
  • fix(pm): resolve yarn-berry catalogs instead of erroring (#130, 59dbd77a)
  • v0.2.0 (cdfb4a41)
  • fix(release): make nub-cache-key manifest self-contained for nub-native cross-build (#132, 93026945)
  • docs: link the official Docker image from the Introduction install section (9be5f5f3)
  • fix(pm): honor yarn npmMinimalAgeGate + drop fabricated bun trustedDependencies gate (#131, 86bbf5b4)

Full Changelog: v0.1.14...v0.2.0