← Blog
The Nub Team

Nub 0.8.0

Reworks environment-file configuration, ships a round of package-manager correctness fixes, and adds garbage collection for the package store.

Nub 0.8.0 reworks how environment files are configured, fixes a batch of package-manager correctness defects, and teaches nub store prune to collect the whole store. It carries a small set of breaking changes, listed first.

Nub is an all-in-one toolkit for Node.js written in Rust. The nub command is flag-for-flag compatible with node, while adding full support for TypeScript, JSX, tsconfig.json, .env loading, and modern Web and ECMAScript APIs. It also includes a fast script runner (nub run), package runner (nubx), Node version manager (nub node), and pnpm-compatible package manager.

Breaking changes

File paths in envFile go in an array. "envFile": ".env" is now an error naming [".env"]; a string value is reserved for mode names, and "varlock" is the only one. This makes envFile consistent with the other list-valued config fields. (#735)

A declared envFile displaces a .env.schema hand-over, at every scope. A .env.schema file decides the environment only when no envFile is declared. Previously the two together were a hard error, and envFile: false in a schema project loaded the schema anyway. Now declared intent wins: envFile: false loads nothing, a list loads those files, and envFile: "varlock" keeps the hand-over explicitly — including against a machine-wide envFile: false. (#735, #774)

An unreadable tsconfig refuses the run. A project tsconfig whose extends target is missing previously ran under options its author never wrote. Nub now stops with the read error, as tsc does (TS5083). Fix the config, or run with --node. (#778)

Another package manager's config no longer directs the node_modules layout. The layout is configured in nub.jsonc under every project identity; pnpm 11's pnpm-workspace.yaml layout keys are no longer read, and npm's install-strategy=nested no longer aborts the install. (#698)

Version-gated feature flags moved out of NODE_OPTIONS. Flags matched to the host Node aborted any descendant process on an older Node — Electron apps exited at startup. Feature flags now ride argv instead, so an Electron dev server runs under nub run again. (#777)

The first install after upgrading also relinks each warm tree once: hidden-hoist names are now claimed shallowest-first, matching pnpm's depth ordering. (#775)

Package manager

PRWhat changed
#737A build failure in an optionalDependencies entry skips the package with a warning instead of failing the install, matching npm and pnpm.
#720nub store prune garbage-collects the global virtual store and extracted-tree tiers, not just the content store.
#743nub outdated applies minimumReleaseAge to both reported columns, marks a held version with the time it becomes installable, and exits 0 when every pending upgrade is held.
#644A store-dir override moves every store tier together, so phantom-dependency protection keeps working in a relocated store.
#741A package whose bin shares its interpreter's name no longer produces a .bin wrapper that resolves to itself — nub install node used to hang.
#717Workspace aliases and relative-path workspace specs resolve.
#754A member-scoped nub update resolves in the workspace-root frame.
#763An empty lockfile importer reads as drift, not as a specifier-less format.
#723A stalled registry metadata fetch is bounded and surfaced instead of hanging the install.
#740NUB_CACHE_DIR moves the engine cache, and nub config get reports values set through the environment.
#752The shim directories honor XDG_DATA_HOME on a fresh install.
#761A source build fails loudly when a build prerequisite is missing instead of shipping a quietly degraded binary.

Runtime and CLI

PRWhat changed
#770Deferred module evaluation (import defer) is enabled on Node 26.4+.
#742A user loader delivered through NODE_OPTIONS is seen by the CommonJS-sync guard.
#707The fetch cache-evict builtins load synchronously, closing a startup race.
#734@nubjs/types covers the six polyfilled proposals an es2024 lib can't reach.
#701nub.exe reserves an 8 MB main-thread stack on Windows, matching node.exe.
#739A help flag after the verb works in the pm and node command groups.
#744Ctrl-C signals every concurrent child of nub run, and --color takes effect.

The full release notes list every change in this release.

Get started

Or paste this "Get Started" prompt into an agent. It will install Nub and explain how it can be used in your project. (It won't make any changes without permission.)