pnpm 12 is stable. It is a rewrite of pnpm in Rust, and it is deliberately not a migration: the commands, flags, settings, and lockfile format of pnpm 11 all carry over, andthe documentationdescribes both versions.
The short list of things that genuinely behave differently is inWhat’s different in pnpm 12. This post covers what pnpm 12 adds that pnpm 11 never shipped.
lateston npm still points at the pnpm 11 line, so pnpm 12 is installed from thenext-12tag:pnpmself-update next-12SeeInstalling pnpm 12for the other ways, including without Node.js. Homebrew, winget, Scoop, and Chocolatey don’t offer it yet.
SeeInstalling pnpm 12for the other ways, including without Node.js. Homebrew, winget, Scoop, and Chocolatey don’t offer it yet.
pnpm shells out togit, so the rewrite applies to all of its git operations. Unknown hosts keep their exact URL, SSH included, and a URL with embedded credentials is kept verbatim and never resolves to a host archive. Details inHow git dependencies are resolved.
A setting pnpm does not recognize used to be ignored in silence — a misspelledminimumReleaseAgedropped the policy it was meant to set, and nothing said so. It is now reported, with the closest real setting name suggested when the key looks like a typo.
Itfailsthe command withERR_PNPM_UNRECOGNIZED_WORKSPACE_SETTINGSwhen the project pins a pnpm version the running pnpm satisfies: with the pin honored, the setting cannot have been 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. Thepnpm configsubcommands never fail on it, so a broken file can still be inspected and repaired.
Dependency cycles are now broken canonically during peer resolution: the members of each cycle are ordered by package id, and the edges that close a cycle are always cut at the same place, wherever the installation walks into the cycle from.
The lockfile therefore becomes a pure function of the dependency graph — reordered importers, reordered dependencies, and repeated installs all produce byte-identical lockfiles, which they could not before (#13846,#13865). On large cycle-heavy workspaces peer resolution is 2–3× faster, uses about 25% less memory, and produces a substantially smaller lockfile.
Existing lockfiles keep working:–frozen-lockfileconsumes them unchanged, and an install that skips resolution leaves them untouched. The first install that actually re-resolves re-keys the walk-order-dependent peer variants of cyclic packages once. SeeHow peers are resolved.
A reflink materializes a new inode and copies extent bookkeeping inside the filesystem’s metadata trees, where a hardlink is one directory entry — on btrfs that roughly halves the time an install spends materializingnode_modulesfrom a warm store. So on Linux,autonow tries the hardlink first.
ext4 is unchanged (cloning was never supported there, soautoalready hardlinked), and macOS keeps clone-first, where APFSclonefileis the platform’s cheap primitive. On Linux, cloning becomes the second rung rather than the first, so a store that refuses a hardlink still gets a clone;packageImportMethod: clonestill asks for one outright.