Build1 distinct publisher3 min readPublished
A dev.to post makes the pnpm decision arithmetic on workspace count, since npm can copy one shared devDependency once per package while pnpm keeps a single copy in a global store outside the project.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
Do the arithmetic before you touch the lockfile. Let N be the number of workspace packages that declare the same devDependency. Under npm, each declaration can materialise as a physical copy in the tree [4]. Under pnpm, the bytes land once in a global content-addressable store outside the project, and every node_modules holds a symlink into it [5]. Copies avoided is therefore N minus 1 [2].
In the post's four-app monorepo, that is three of four copies gone, 75 percent of that dependency's bytes [1]. In a repo with a single package.json and no workspaces, N is 1, N minus 1 is zero, and however many dependencies the project has, the store has nothing in the same repo to deduplicate against [3]. That is the whole reason total dependency count is the wrong number to read: the post's fifteen-dependency example shows no noticeable difference either way [15], while duplication tracks package count [2].
The time claim is weaker than the space claim, and the author says so. Disk savings are consistent; install-time savings depend on whether the package is already in the local store, and on a CI run with a cold cache the first download weighs the same under either tool [8]. For an install-time number from someone else's pipeline to transfer to yours, you would need a warm store on the same runner, a cache that actually restored, and comparable network. The author publishes no such benchmark and declines to invent one [12], which is the correct posture and rarer than it should be.
Note the escape hatch on the npm side. npm can flatten those copies with aggressive hoisting, at the price of phantom dependencies, packages your code can import without declaring [4]. So the honest framing is not copies versus symlinks; it is copies, or a resolution graph that resolves things your manifest never asked for.
The adoption cost sits outside the package manager. What breaks is the rest of the stack that assumed npm: CI scripts, Docker images running npm ci, and dependency linters that parse package-lock.json in the format npm documents and have no handler for pnpm-lock.yaml [9]. `pnpm store status` will tell you what the store saved against a non-deduplicated install [7]; it will not tell you what the Dockerfile rewrite costs.
One caveat on sourcing. The two blocks in front of me are the same piece by the same dev.to author, English and Spanish [14], so this is one practitioner's thesis [1] relaying pnpm's own motivation docs for the store model [5], not two independent reads. The mechanism is checkable from the docs and from `pnpm store path` [7]. The thesis about where the payoff lands is an argument, and the author frames his own comparison matrix as rows to start looking at rather than closed conclusions [13].
My context: I would migrate a workspace with three or more packages sharing a toolchain, and leave a single-package service on npm, because there the migration buys a new tool the team has to learn to debug and no measurable saving [10].
Ranked by verification strength, evidence, and original report placement.
The post's thesis is that pnpm wins in monorepos and in CI because of the symlink model, while npm remains the zero-friction choice for small projects where the learning curve is not worth it, and that this is a calculation that changes with repo size rather than an aesthetic preference.
The post states that space and time savings depend on how much duplication the original install had, and that duplication grows with the number of packages in the monorepo, not with the total number of dependencies.
The worked example is a monorepo with four apps sharing internal packages: on npm, the same copy of React, TypeScript and the same devDependencies is repeated four times on disk, once for every workspace package that declares them.
npm installs every dependency as a physical copy inside node_modules; with four workspace packages all depending on [email protected] it can end up with that same version copied in more than one place in the tree, unless aggressive hoisting is used, which brings its own phantom-dependency problems.
According to the official pnpm motivation docs as cited by the post, the package is downloaded once and stored in a global content-addressable store located outside the project, and each node_modules in each package of the monorepo holds a symlink pointing to that shared store rather than a copy.
The practical consequence given: if ten projects on a machine use the same version of a library, that version exists exactly once on disk and all ten node_modules point to the same place.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
2 articles · August 29, 2026
Follow any of these and your For You feed starts watching them — no settings page required.
build
The soft 404 that returns 200, declares lang=ar, and renders English1 distinct publisher
build
752 Nigerian institutions, shipped as a repo instead of an endpoint1 distinct publisher
build
The third answer: a dead-code tool allowed to say "not traced yet"1 distinct publisher
build
Retry budgets are sized against outages, not jitter: 45 seconds lost all sixteen clips1 distinct publisher
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Mechanism sourced, magnitudes never taken
The part that holds is the design: one content-addressable store outside the project, symlinks in each package's node_modules, quoted from pnpm's own motivation docs rather than tested here. The headline arithmetic — four copies become one — is sound because it is arithmetic on the author's own example. Everything a team would actually budget against is absent, and dev.to says why: no install-time benchmark, and none invented. The two entries are the same post in two languages, so a reader gets this reasoning twice rather than a check on it.
No uptake reported anywhere in this coverage
Not one repo, team or pipeline is reported as having switched. `pnpm store status` is offered as a command you could run, never as output someone ran; npm's workspaces support since v7 passes by as background. There is nothing here to measure adoption from, and inferring it from the strength of the argument would be inventing a number.
Claims kept smaller than the pitch would allow
Unusual direction for a tooling post: the argument is pitched below its own ceiling. Disk deduplication is asserted flatly, build-time savings are refused, cold-cache CI is conceded as a wash, and per-symlink native binaries are flagged as uncovered. The one place a reader could over-read it is the four-app framing — eliminating three of four copies is 75 percent of that one dependency's bytes, not 75 percent of a repo, and the post never claims otherwise.
Nothing on sale but reach
No vendor, sponsor or product stands behind this, and neither pnpm nor npm is credited with anything the author appears to benefit from. The one visible interest is audience: the same argument shipped in Spanish and English on dev.to, minutes apart, which doubles the reach of a single piece of work. Worth noting what was left on the table — a flattering before-and-after install table is the cheapest engagement in this genre, and the author explicitly refused to fabricate one.
Narrow parts firm, sized parts open
We would stand behind the narrow claims: the store-and-symlink model, the N-minus-one copy count that follows from it, and the observation that migration pain lands in Docker files and lockfile-parsing linters rather than in `pnpm install`. Anything expressed in seconds or gigabytes stays open, and with a single author on a single platform there is nobody in this coverage positioned to disagree with him.