pnpm 12.9.1 separates WebContainers version into @pnpm/wasm, main package returns to approximately 4MB

pnpm 12.9.1 separates WebContainers version into @pnpm/wasm, main package returns to approximately 4MB

pnpm 12.9.0 bundled a WebAssembly build for WebContainer, increasing size to ~55MB. 12.9.1 split it into @pnpm/wasm, reverting to ~4MB. Verified via tarball and notes on @pnpm/wasm latest tag.
2026.10.11

This page has been translated by machine translation. View original

Hi there! I'm Yuji Nishimura from the Operations Department!

In pnpm 12.9.0, a WebAssembly build for StackBlitz WebContainers, which runs Node.js in the browser, was bundled into the main package, temporarily increasing the unpacked size of the pnpm package. In the subsequent pnpm 12.9.1, this WebAssembly build was separated into a separate package @pnpm/wasm, and the main package size returned to normal.

To see exactly how much the size changed, I downloaded and unpacked the package (tarball) for each version and measured it. I also checked the tags for the separated @pnpm/wasm package.

Changes in This Release

  • Target versions / dates: pnpm 12.9.0 (2026-10-03), pnpm 12.9.1 (2026-10-04) *Japan Standard Time
  • Key changes:
    • In 12.9.0, StackBlitz WebContainers automatically uses the WebAssembly build. The WebAssembly build works even when install scripts are disabled. Meanwhile, in native environments where scripts are enabled, it continues to use the native executable as before.
    • In 12.9.1, the WebAssembly build for WebContainers was split into a separate package @pnpm/wasm. pnpm and the standalone executable @pnpm/exe no longer include it, and according to the official release notes, the unpacked size returned from approximately 55 MB to approximately 4 MB. Inside WebContainers, you install @pnpm/wasm via npm to use it (officially treated as experimental, requiring Node.js 22.13 or later; tag behavior is described below).
  • Official links: pnpm 12.9.0 release notes, pnpm 12.9.1 release notes, WebContainers official page

Points Worth Noting

  • What to watch out for: If you have 12.9.0, even if you don't use WebContainers, you'll be downloading a large package that includes the WebAssembly build. The pnpm installed in Docker images goes from about 4 MB to about 55 MB, and the tarball downloaded from the registry goes from about 1 MB to about 18 MB.
  • What to check in your own environment: Whether the pinned pnpm version has been set to 12.9.0, and whether you can upgrade to 12.9.1 or later.
  • What remains undetermined: The behavior when actually running pnpm from @pnpm/wasm inside a WebContainer was not verified this time.

Trying It Out

Environment

  • Docker container for verification (Ubuntu 24.04 arm64)
  • Node.js v24.21.0, npm 11.19.0
  • Targets: pnpm / @pnpm/exe versions 12.8.2, 12.9.0, 12.9.1, and @pnpm/wasm versions 12.9.1 and 0.0.0

1. Comparing the Size of the Main Package

The unpacked size registered in the registry (unpackedSize) can be retrieved with npm view.

npm view pnpm@12.9.0 dist.unpackedSize
npm view pnpm@12.9.1 dist.unpackedSize

Here are the results including 12.8.2, the version preceding 12.9.0, and the separated @pnpm/wasm@12.9.1.

unpackedSize for each version

In addition to just the metadata, I also downloaded the actual tarballs with npm pack <pkg>@<version> and measured the total size of the unpacked files. The following image shows the table output by the measurement script.

Measured size and file count after extracting tarballs

extracted is the total file size after extraction, tarball is the size of the downloaded tarball, both in bytes. files is the file count. The summary is as follows:

Package / Version Unpacked size (bytes) Converted Tarball
pnpm@12.8.2 4,102,446 approx. 4.1 MB approx. 1.0 MB
pnpm@12.9.0 54,965,084 approx. 55.0 MB approx. 17.9 MB
pnpm@12.9.1 4,107,858 approx. 4.1 MB approx. 1.0 MB
@pnpm/exe@12.8.2 3,725,223 approx. 3.7 MB approx. 0.9 MB
@pnpm/exe@12.9.0 54,573,504 approx. 54.6 MB approx. 17.7 MB
@pnpm/exe@12.9.1 3,713,798 approx. 3.7 MB approx. 0.9 MB

In 12.9.0, both pnpm and @pnpm/exe grew to approximately 55 MB (approximately 1,040 files). In 12.9.1, they returned to approximately 4 MB (approximately 450 files), the same as 12.8.2. The tarball size also increased from about 1 MB to about 18 MB in 12.9.0, and returned to about 1 MB in 12.9.1.

2. Examining the Added Content and the Separated @pnpm/wasm

Comparing the files between pnpm@12.9.0 and pnpm@12.9.1, only 12.9.0 had 593 files under dist/wasm/, totaling 50,860,874 bytes. The largest file was dist/wasm/pnpm.wasm (47,527,756 bytes).

The separated @pnpm/wasm@12.9.1 has an unpacked size of 45,222,425 bytes (approximately 45.2 MB) with 595 files, the majority of which is dist/pnpm.wasm (41,893,876 bytes). It provides four commands: pnpm, pnpx, pn, and pnx. This pnpm.wasm was approximately 12% smaller than the one bundled in 12.9.0 (47,527,756 bytes). Note that the "approximately 10% smaller" mentioned in the 12.9.1 release notes refers to the native executable, with no mention of the WebAssembly build.

Next, I checked the tags for @pnpm/wasm (as of 2026-10-11).

npm view @pnpm/wasm dist-tags

latest pointed to 0.0.0, and next-12 pointed to 12.12.0 (a newer version than pnpm's latest of 12.11.2).

I installed without specifying a version and checked the installed version and its contents.

npm install @pnpm/wasm --ignore-scripts --silent
node -e 'const p=require("./node_modules/@pnpm/wasm/package.json");console.log("installed @pnpm/wasm", p.version)'
ls -la node_modules/@pnpm/wasm
installed @pnpm/wasm 0.0.0
total 4
drwxr-xr-x 4 pwuser pwuser 128 Oct 11 04:54 .
drwxr-xr-x 3 pwuser pwuser  96 Oct 11 04:54 ..
-rw-r--r-- 1 pwuser pwuser   0 Oct 11 04:54 index.js
-rw-r--r-- 1 pwuser pwuser 372 Oct 11 04:54 package.json

The installed version was 0.0.0, containing only an empty index.js and package.json.

Analysis of Verification Results

  • What was confirmed: The increase in 12.9.0 was due to the WebAssembly build under dist/wasm/, which in 12.9.1 was moved to @pnpm/wasm (approximately 45.2 MB).
  • What was cross-referenced with official information: The three sources matched: the 12.9.1 release note stating "returned from about 55 MB to about 4 MB," the registry's unpackedSize, and the measured values from extracting tarballs.
  • Scope of verification: Sizes were measured for 12.8.2, 12.9.0, and 12.9.1. I also confirmed that the latest 12.11.2 (4,155,529 bytes) is approximately 4 MB.

How to Handle This in Practice

  • Cases where immediate action is recommended: If you have pinned pnpm to 12.9.0 in CI or Docker. Since the download size remains large, consider updating to 12.9.1 or later.
  • Cases where you can wait and see: If you are tracking the latest version of pnpm and are already on 12.9.1 or later. Since the main package size has returned to normal, no additional action is needed.
  • What to decide as a team: If you have a setup that uses pnpm on WebContainers (StackBlitz), explicitly specifying the @pnpm/wasm version will prevent accidentally pulling the placeholder 0.0.0.

Summary

The WebAssembly build bundled into the main package in pnpm 12.9.0 was separated into @pnpm/wasm in 12.9.1. As a result, the unpacked size of pnpm and @pnpm/exe has returned from approximately 55 MB to approximately 4 MB. For environments that do not use WebContainers, 12.9.0 is a version that downloads an unnecessary WebAssembly build, so when reviewing version pinning, please avoid 12.9.0. Also, if you install @pnpm/wasm for WebContainers, as of 2026-10-11, you need to specify a version.

I hope this is helpful to someone.


Reference links:

Share this article