v0.2.0
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
.tsworker needs no build step. - Inline workers via
data:andblob:URLs — the WHATWG inline mechanisms, whichnode:worker_threadsdoes not expose through a browser-shape constructor. - Classic and module workers —
type: "module"(the default) andtype: "classic", the latter exposing synchronousimportScripts(...). { name }surfaces asworker.name(main thread) andself.name(worker).- Real
MessageEvent/ErrorEvent— inbound messages arrive asMessageEvents; a thrown worker error surfaces as anErrorEventwith populatedfilename/lineno/colno. - Transferables,
MessageChannel/MessagePort, andBroadcastChannelroundtrip 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 fornub run. (#103) - List pnpm
overrides/packageExtensions/patchedDependenciesas 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-workerCI leg. (#119) - Node-version matrix smoke for the augmentation surface. (#100)
- Cover the
topological_chunkscycle-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'srun.sh. (#111) - A pre-commit guard blocking direct commits to the shared
maintree (agents only). (#122, #124) gh-comment verbosity guard and a sharpened issue-comment tone rule. (#128, #129)- Fix a Docker build-leg
startup_failurefrom an unquoted YAML scalar; make thenub-nativecross-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