# pnpm v12.0.0-rc.9 — pnpm 12 RC 9 - Product: pnpm (https://whatsnew.fyi/product/pnpm) - Vendor: pnpm - Date: 2026-08-23 - Version: v12.0.0-rc.9 - Original notes: https://github.com/pnpm/pnpm/releases/tag/v12.0.0-rc.9 - Permalink: https://whatsnew.fyi/product/pnpm/releases/v12.0.0-rc.9 - Labels: Pre-release What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **changed** — pnpm-workspace.yaml now reports unrecognized settings as an error when the project pins a pnpm version that the running pnpm satisfies, and as a warning elsewhere, with suggestions for likely typos - **added** — Global build approvals feature - **added** — Recursive global outdated checks - **changed** — pnpm config get and pnpm config list now show settings under their documented names, including merged registries, effective audit and update sections, resolved catalogs, and merged registry routes - **added** — Support for configuring stateDir in the Rust pnpm CLI - **added** — Bounded workspace concurrency for recursive run and exec commands - **added** — @pnpm/napi gained reporter output, reverse dependency queries via getDependents and renderDependents, and lockfile access via readLockfile, writeLockfile, filterLockfileByImporters, and readModulesManifest - **changed** — Lockfile top-level keys that pnpm does not define are no longer dropped when a lockfile is loaded and saved - **added** — Per-branch lockfiles support with gitBranchLockfile, mergeGitBranchLockfiles, and mergeGitBranchLockfilesBranchPattern options - **added** — Support for PNPM_CONFIG_VIRTUAL_STORE_ONLY and PNPM_CONFIG_ENABLE_MODULES_DIR environment variables in the Rust pnpm CLI - **added** — Support for lockfileDir setting and --lockfile-dir flag to place pnpm-lock.yaml, node_modules, and config dependencies in a specified directory, allowing multiple projects to share one lockfile - **added** — Support for preferSymlinkedExecutables setting to create node_modules/.bin entries as symlinks on POSIX systems instead of shell shims - **added** — Six CLI flags to the Rust CLI: --stream and others that the TypeScript pnpm CLI accepts ##### Major Changes - A project's `pnpm-workspace.yaml` may no longer carry a setting pnpm does not recognize. Such a setting used to be ignored in silence — a misspelled `minimumReleaseAge` dropped the policy it was meant to set, and nothing said so. Now it is reported, suggesting the closest real setting name when the key looks like a typo, and it fails the command with `ERR_PNPM_UNRECOGNIZED_WORKSPACE_SETTINGS` when the project pins a pnpm version the running pnpm satisfies: with the pin honored, the setting cannot be meant for a different pnpm version, so it is a mistake to fix rather than a key to ignore. Everywhere else it is a warning, so a project that has yet to be cleaned up keeps working. The `pnpm config` subcommands never fail on such a setting, so a broken file can still be inspected and repaired, and `pnpm config get ` prints the value with no warnings at all. Keys the global config file cannot set are likewise split between workspace-only settings (still directed to `pnpm-workspace.yaml`) and settings unknown to this version. ##### Minor Changes - Added global build approvals [pnpm/pnpm#14101](https://github.com/pnpm/pnpm/issues/14101). - Added recursive global outdated checks [pnpm/pnpm#14101](https://github.com/pnpm/pnpm/issues/14101). - `pnpm config get` and `pnpm config list` now show the settings pnpm acts on under their documented names: - `registries` shows the registries pnpm resolves from, merged across every source (`.npmrc`, `pnpm-workspace.yaml`, the global config, CLI flags), in the shape the setting is written in: keyed by registry URL, with the default registry declared as the bare `@` scope. Built-in routes are included — the `@jsr` scope and the `npmjs` and `gh` prefixes — unless pointed elsewhere. Previously `pnpm config get registries` printed `undefined`. - `update` and `audit` show the effective sections, whichever spelling set them. The deprecated internal spellings (`updateConfig`, `auditConfig`, `auditLevel`) are no longer listed. - `catalogs` shows the complete resolved catalog set — the singular `catalog` block is its `default` entry — whichever spelling declared it. - The `registry` and `@scope:registry` entries show the merged routes rather than raw `.npmrc` values, so they always agree with the `registries` view. - Added support for configuring `stateDir` in the Rust pnpm CLI [pnpm/pnpm#12042](https://github.com/pnpm/pnpm/issues/12042). - Added bounded workspace concurrency for recursive run and exec commands [pnpm/pnpm#14101](https://github.com/pnpm/pnpm/issues/14101). - `@pnpm/napi` gained reporter output, reverse dependency queries, and lockfile access. `install` and `rebuild` accept `options.reporter` and render pnpm's terminal output — progress line, packages-diff summary, lifecycle output, and the `Done in …` footer. Rendered output goes to stdout, or to an `onOutput` callback for a host that writes its own output through JavaScript. New reporting options: `hideLifecycleOutput`, `ignoredBuildsInstructionText`, and `hideLinkedPkgsDiff`. `getDependents` returns the reverse dependency trees behind `pnpm why`, annotated with the `package.json` fields named in `manifestFields`. `renderDependents` returns those trees rendered as tree, parseable, or JSON output. `readLockfile` and `writeLockfile` read and write `pnpm-lock.yaml` (or the current lockfile under the virtual store). `filterLockfileByImporters` returns a lockfile narrowed to what the named importers reach. `readModulesManifest` returns the `.modules.yaml` state of an installed `node_modules`. Top-level lockfile keys pnpm does not define are no longer dropped when a lockfile is loaded and saved, so state a tool records beside pnpm's own keys survives a rewrite. - `pnpm` now supports per-branch lockfiles in its Rust engine: - `gitBranchLockfile` gives each git branch its own `pnpm-lock..yaml`, so two branches can hold different resolutions wi _[Truncated at 4000 characters — full notes: https://github.com/pnpm/pnpm/releases/tag/v12.0.0-rc.9]_