# pnpm v11.23.0 — pnpm 11.23 - Product: pnpm (https://whatsnew.fyi/product/pnpm) - Vendor: pnpm - Date: 2026-08-23 - Version: v11.23.0 - Original notes: https://github.com/pnpm/pnpm/releases/tag/v11.23.0 - Permalink: https://whatsnew.fyi/product/pnpm/releases/v11.23.0 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 config get and pnpm config list now show settings under their documented names, with registries showing merged configuration across all sources and the deprecated internal spellings no longer listed - **changed** — Unrecognized settings in config files now display version-specific warnings indicating which pnpm version recognizes the setting and suggesting the closest real setting name for potential typos - **deprecated** — The importPackage pnpmfile hook is deprecated and will be removed in the next major version - **changed** — node_modules/.modules.yaml no longer records registries from installation, and recorded copies are dropped on the first install that rewrites the file - **changed** — When enableGlobalVirtualStore is on, spawned processes now receive NODE_PATH and NODE_OPTIONS with a resolve hook for ESM imports to access hoisted node_modules without requiring the @pnpm/plugin-esm-node-path dependency - **added** — A registry can now declare that its abbreviated metadata carries the time field via supportsTimeField option to optimize time-based resolution - **changed** — The resolutionMode time-based resolution now checks the time field declaration per registry instead of all-or-nothing, allowing mixed registries to optimize metadata fetching - **changed** — A pnpr resolve request now carries the client's registries keyed by URL with scopes and serverType information instead of a prefix map ##### Minor Changes * `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. * Settings that no supported pnpm version recognizes get their own warning. A key in the global config file that this version of pnpm does not read is no longer reported with advice to move it to a project-level `pnpm-workspace.yaml` (where it would be ignored too); the warning now says the setting is not recognized by this version of pnpm, names the pnpm version that does read it when there is one (for example, `globalShims` is a pnpm v12 setting), and suggests the closest real setting name when the key looks like a typo. Unrecognized and non-camelCase keys in a project's `pnpm-workspace.yaml`, previously ignored silently, are now reported the same way. `pnpm config get ` and `pnpm get ` no longer print config-load warnings, so a script capturing the value gets the value alone. * The `importPackage` pnpmfile hook is deprecated. pnpm now prints a warning when a pnpmfile defines it, and the hook will be removed in the next major version. It also opts the installation out of the parallel package importer, making installation slower. If you rely on this hook, comment on [#14101](https://github.com/pnpm/pnpm/issues/14101). * `node_modules/.modules.yaml` no longer records the registries an install resolved from, and the recorded copy is dropped from the file on the first install that rewrites it. It dated from the lockfile format that spelled a dependency's path relative to its registry, where reading an installed tree meant knowing the registries it was installed with. Dependency paths have not carried a registry for several major versions, and the recorded copy outlived its use: `pnpm list`, `pnpm why`, and single-project installs preferred it over the project's own configuration, so a project whose registry had changed since its last install was still read through the old one. They now use the configured registries, like every other command already did. * When `enableGlobalVirtualStore` is on, every process pnpm spawns for the project (`pnpm run`, `pnpm exec`, lifecycle scripts) now receives a `NODE_PATH` pointing at the project's hoisted `node_modules`, plus a `NODE_OPTIONS` `--import` flag that registers a resolve hook restoring `NODE_PATH` lookups for ESM imports. Dependencies that import undeclared ("phantom") packages keep resolving under the global virtual store — for both CommonJS and ESM — without installing the `@pnpm/plugin-esm-node-path` config dependency [pnpm/pnpm#9618](https://github.com/pnpm/pnpm/issues/9618). Tools run by `pnpm dlx` resolve such dependencies too: the JS CLI passes them the same environment, while the Rust CLI's dlx cache is self-contained, so its layout already exposes them. * A registry can now declare that its abbreviated metadata carries the `time` field, so `resolutionMode: time-based` reads the full metadata document only from the registries that need it: ```yaml resolutionMode: time-based registries: _[Truncated at 4000 characters — full notes: https://github.com/pnpm/pnpm/releases/tag/v11.23.0]_