|
| 1 | +--- |
| 2 | +date: 2026-06-04 |
| 3 | +repo: pnpm/pnpm |
| 4 | +size: L |
| 5 | +title: "pnpm lands pnpr S3 storage and install fixes" |
| 6 | +excerpt: "Big pnpr storage/auth changes, a new catalog auto-save flow, and fixes for concurrent installs and rebuilds." |
| 7 | +commits: 12 |
| 8 | +authors: [zkochan, rubnogueira, shiminshen] |
| 9 | +commit_authors: {"cbfeeef": zkochan, "4e740d5": rubnogueira, "a668224": zkochan, "8e5e764": zkochan, "e7e99f0": shiminshen, "43ad094": zkochan, "5192edf": zkochan} |
| 10 | +--- |
| 11 | + |
| 12 | +### **pnpr can now store hosted packages in S3-compatible object storage** (8e5e764) |
| 13 | +pnpr's authoritative hosted packages can be backed by an S3-compatible object store instead of local disk, with support for AWS S3, R2, MinIO, B2, and similar endpoints. This makes the durable package store easier to scale and back up while keeping the proxy cache and install-accelerator data on local storage. |
| 14 | + |
| 15 | +### **pnpr separates proxy cache from published packages** (43ad094) |
| 16 | +The on-disk layout now splits disposable upstream cache data from the authoritative hosted package store, with the cache moving to a separate `.pnpr-cache` root by default. That removes the old lifecycle coupling, so clearing proxy data no longer risks deleting published packages. |
| 17 | + |
| 18 | +### **pnpr install accelerator now forwards caller credentials** (5192edf) |
| 19 | +The pnpr client and server now forward per-registry auth so the accelerator can resolve and fetch external private dependencies as the caller, not anonymously. This closes a major access gap for private registries and adds per-user grants for content owned by external registries. |
| 20 | + |
| 21 | +### **pnpm add/update can auto-write catalog entries** (a668224) |
| 22 | +Catalog mode's save side is now ported: `add` and `update` can write `catalog:` / `catalog:<name>` specifiers into `package.json`, persist catalog entries in `pnpm-workspace.yaml`, and record resolved snapshots in the lockfile. That makes `save-catalog` and `save-catalog-name` usable end-to-end instead of just enforcing catalog gates. |
| 23 | + |
| 24 | +### **Concurrent installs no longer corrupt partially imported packages** (cbfeeef) |
| 25 | +The fast import path now avoids destructively emptying a shared virtual-store directory when multiple installs target the same workspace at once. This fixes a race where one importer could wipe files another had already written, leaving behind a directory that looked complete but was missing root package files. |
| 26 | + |
| 27 | +### **Global virtual store rebuilds now run build scripts correctly** (4e740d5) |
| 28 | +Dependency rebuilds now resolve package locations through the global virtual store projection when `enableGlobalVirtualStore` is enabled, so lifecycle build scripts can re-link bins into the right place. The fix also serializes concurrent rebuilds of the same shared projection to avoid races. |
| 29 | + |
| 30 | +### **Catalog range specifiers no longer crash updates** (e7e99f0) |
| 31 | +`pnpm update --recursive --lockfile-only` no longer throws `Invalid Version` when a catalog entry is a semver range under `strict` or `prefer` catalog mode. Instead of passing ranges into exact-version comparison, the code now falls through to the normal mismatch handling. |
| 32 | + |
| 33 | +### Other misc changes |
| 34 | +- Release tooling now keys the released-changeset ledger by target branch, and adds a workflow for creating release PRs. |
| 35 | +- Registry-mock tests were updated for pnpr's split proxy cache path. |
| 36 | +- Strict catalog mode no longer catalogs `runtime:` specifiers. |
| 37 | +- Minor lockfile/version bumps and test/docs updates. |
0 commit comments