Type to search the fnpm documentation.

Real-project benchmarks

Cold, warm and no-op installs plus physical disk for fnpm, Bun, pnpm, Yarn and npm on pinned open-source repositories, each followed by a project check.

Every repository is installed by fnpm, Bun, pnpm, Yarn and npm. Each bar is the median of three runs, in seconds, including process startup; hover or focus a bar for the exact value and the min–max range. Timed installs disable lifecycle scripts. After the timings, each tool’s tree runs the repository’s own check (a build, a type check or tests) listed under its name.

How each tool gets its lockfile

The repository’s committed lockfile decides what a tool can reuse:

  • Own lockfile: the tool reads the repository’s lockfile as is (pnpm with pnpm-lock.yaml, Yarn with yarn.lock, npm with package-lock.json).
  • Migrated: fnpm and Bun read every format and migrate it, keeping the locked versions.
  • Imported lock: pnpm converts a yarn.lock or package-lock.json with pnpm import.
  • Fresh resolve: the tool has no way to read the repository’s lockfile, so it resolves the manifests’ ranges itself. Its package versions can differ; the version counts under each repository show by how much.

The first install that creates the tool’s own lockfile is untimed. Every timed run then starts from that lockfile: cold with an empty private cache and no node_modules, warm with the cache kept and node_modules removed, no-op with both kept. A tool that cannot install a repository at all keeps its row with the reason, and gets no time.

Summary

Measurement in progress: 2 repositories are complete for all five tools; OpenCode, Excalidraw, Jest, React, Vite, Vue core, webpack, Uptime Kuma are still running and appear here once every tool has finished.

Measured October 26, 2026 on Linux x64 (8 CPU cores, Node v24.22.1), fnpm built from 5e5b347. Each cell counts the repositories where fnpm's median was lower than the other tool's, out of the repositories where both installed.

fnpm lower thanBunpnpmYarnnpm
Cold install1 / 22 / 2——
Warm cache1 / 22 / 2——
No-op2 / 22 / 2——
Disk2 / 21 / 2——

Could not install: yarn on OpenNext Cloudflare, npm on OpenNext Cloudflare, yarn on tRPC, npm on tRPC. These pairs keep their rows in the charts, without a value.

Every completed install passed its repository's project check.

Repositories

OpenNext Cloudflare

opennextjs/opennextjs-cloudflare @ 8ea9eb9· 23 workspaces · original lockfile pnpm-lock.yaml · check cd packages/cloudflare && PATH="$PWD/node_modules/.bin:$PATH" tsc && PATH="$PWD/node_modules/.bin:$PATH" vitest --run

Cold install

Empty package cache · no node_modules · prepared lockfile

fnpmv0.0.2
5.54sfnpm 0.0.2 · 5.5416 s (range 4.7688–5.7745 s) · lock: migrated from pnpm-lock.yaml
bunv1.4.4
5.68sbun 1.4.4 · 5.6774 s (range 4.9622–6.8519 s) · lock: migrated from pnpm-lock.yaml
pnpmv10.33.0
15.24spnpm 10.33.0 · 15.2390 s (range 14.9222–15.8688 s) · lock: the project's own pnpm-lock.yaml
yarnv1.22.22 · fresh resolve
can't install this repository
—yarn 1.22.22: yarn cannot read catalog: dependency specifiers
npmv11.19.1 · fresh resolve
can't install this repository
—npm 11.19.1: npm cannot read workspace: or catalog: dependency specifiers
View data table
OpenNext Cloudflare: Install duration, median of 3 runs
Tool / versionSecondsLockfile
fnpm 0.0.25.5416migrated from pnpm-lock.yaml
bun 1.4.45.6774migrated from pnpm-lock.yaml
pnpm 10.33.015.2390the project's own pnpm-lock.yaml
yarn 1.22.22—yarn cannot read catalog: dependency specifiers
npm 11.19.1—npm cannot read workspace: or catalog: dependency specifiers

1.02× faster than Bun in this snapshot

Warm cache

Packages already cached · node_modules rebuilt

fnpmv0.0.2
781msfnpm 0.0.2 · 0.7809 s (range 0.5714–1.0977 s) · lock: migrated from pnpm-lock.yaml
bunv1.4.4
963msbun 1.4.4 · 0.9632 s (range 0.5732–1.1921 s) · lock: migrated from pnpm-lock.yaml
pnpmv10.33.0
6.19spnpm 10.33.0 · 6.1904 s (range 6.0119–6.3856 s) · lock: the project's own pnpm-lock.yaml
yarnv1.22.22 · fresh resolve
can't install this repository
—yarn 1.22.22: yarn cannot read catalog: dependency specifiers
npmv11.19.1 · fresh resolve
can't install this repository
—npm 11.19.1: npm cannot read workspace: or catalog: dependency specifiers
View data table
OpenNext Cloudflare: Install duration, median of 3 runs
Tool / versionSecondsLockfile
fnpm 0.0.20.7809migrated from pnpm-lock.yaml
bun 1.4.40.9632migrated from pnpm-lock.yaml
pnpm 10.33.06.1904the project's own pnpm-lock.yaml
yarn 1.22.22—yarn cannot read catalog: dependency specifiers
npm 11.19.1—npm cannot read workspace: or catalog: dependency specifiers

1.23× faster than Bun in this snapshot

No-op

Keep cache and node_modules · reinstall after nothing changed

fnpmv0.0.2
6.8msfnpm 0.0.2 · 0.0068 s (range 0.0066–0.0074 s) · lock: migrated from pnpm-lock.yaml
bunv1.4.4
89msbun 1.4.4 · 0.0888 s (range 0.0773–0.0928 s) · lock: migrated from pnpm-lock.yaml
pnpmv10.33.0
2.64spnpm 10.33.0 · 2.6415 s (range 2.636–2.7777 s) · lock: the project's own pnpm-lock.yaml
yarnv1.22.22 · fresh resolve
can't install this repository
—yarn 1.22.22: yarn cannot read catalog: dependency specifiers
npmv11.19.1 · fresh resolve
can't install this repository
—npm 11.19.1: npm cannot read workspace: or catalog: dependency specifiers
View data table
OpenNext Cloudflare: Install duration, median of 3 runs
Tool / versionSecondsLockfile
fnpm 0.0.20.0068migrated from pnpm-lock.yaml
bun 1.4.40.0888migrated from pnpm-lock.yaml
pnpm 10.33.02.6415the project's own pnpm-lock.yaml
yarn 1.22.22—yarn cannot read catalog: dependency specifiers
npm 11.19.1—npm cannot read workspace: or catalog: dependency specifiers

13.06× faster than Bun in this snapshot

Disk

node_modules + private cache/store · hardlinks counted once

fnpmv0.0.2
2.53 GiBfnpm 0.0.2 · 2592.96 MiB · node_modules 2518.90 MiB + store 74.06 MiB · lock: migrated from pnpm-lock.yaml
bunv1.4.4
2.59 GiBbun 1.4.4 · 2653.38 MiB · node_modules 2588.28 MiB + store 65.10 MiB · lock: migrated from pnpm-lock.yaml
pnpmv10.33.0
2.52 GiBpnpm 10.33.0 · 2580.19 MiB · node_modules 2449.55 MiB + store 130.64 MiB · lock: the project's own pnpm-lock.yaml
yarnv1.22.22 · fresh resolve
can't install this repository
—yarn 1.22.22: yarn cannot read catalog: dependency specifiers
npmv11.19.1 · fresh resolve
can't install this repository
—npm 11.19.1: npm cannot read workspace: or catalog: dependency specifiers
View data table
OpenNext Cloudflare: Combined physical disk (node_modules + cache/store)
Tool / versionMiBLockfile
fnpm 0.0.22592.96migrated from pnpm-lock.yaml
bun 1.4.42653.38migrated from pnpm-lock.yaml
pnpm 10.33.02580.19the project's own pnpm-lock.yaml
yarn 1.22.22—yarn cannot read catalog: dependency specifiers
npm 11.19.1—npm cannot read workspace: or catalog: dependency specifiers

fnpm used 2.3% less disk than Bun

All numbers for OpenNext Cloudflare
ToolLockfileCold (s)Warm (s)No-op (s)Disk (MiB)Versionsvs Bun missing / extraCheck
fnpm 0.0.2migrated from pnpm-lock.yaml5.5416
4.7688–5.7745
0.7809
0.5714–1.0977
0.0068
0.0066–0.0074
2592.96
2518.9 + 74.06
16510 / 14pass
bun 1.4.4migrated from pnpm-lock.yaml5.6774
4.9622–6.8519
0.9632
0.5732–1.1921
0.0888
0.0773–0.0928
2653.38
2588.28 + 65.1
16370 / 0pass
pnpm 10.33.0the project's own pnpm-lock.yaml15.239
14.9222–15.8688
6.1904
6.0119–6.3856
2.6415
2.636–2.7777
2580.19
2449.55 + 130.64
16510 / 14pass
yarn 1.22.22could not install: yarn cannot read catalog: dependency specifiers———————
npm 11.19.1could not install: npm cannot read workspace: or catalog: dependency specifiers———————

tRPC

trpc/trpc @ 8d09833· 43 workspaces · original lockfile pnpm-lock.yaml · check cd packages/server && PATH="$PWD/node_modules/.bin:$PATH" tsdown

Cold install

Empty package cache · no node_modules · prepared lockfile

fnpmv0.0.2
5.81sfnpm 0.0.2 · 5.8114 s (range 5.5396–5.8503 s) · lock: migrated from pnpm-lock.yaml
bunv1.4.4
5.69sbun 1.4.4 · 5.6859 s (range 5.2473–6.7252 s) · lock: migrated from pnpm-lock.yaml
pnpmv12.4.1
140.72spnpm 12.4.1 · 140.7165 s (range 140.6582–142.5789 s) · lock: the project's own pnpm-lock.yaml
yarnv1.22.22 · fresh resolve
can't install this repository
—yarn 1.22.22: yarn cannot read catalog: dependency specifiers
npmv11.19.1 · fresh resolve
can't install this repository
—npm 11.19.1: npm cannot read workspace: or catalog: dependency specifiers
View data table
tRPC: Install duration, median of 3 runs
Tool / versionSecondsLockfile
fnpm 0.0.25.8114migrated from pnpm-lock.yaml
bun 1.4.45.6859migrated from pnpm-lock.yaml
pnpm 12.4.1140.7165the project's own pnpm-lock.yaml
yarn 1.22.22—yarn cannot read catalog: dependency specifiers
npm 11.19.1—npm cannot read workspace: or catalog: dependency specifiers

1.02× Bun's duration in this snapshot

Warm cache

Packages already cached · node_modules rebuilt

fnpmv0.0.2
843msfnpm 0.0.2 · 0.8430 s (range 0.7924–0.9986 s) · lock: migrated from pnpm-lock.yaml
bunv1.4.4
796msbun 1.4.4 · 0.7964 s (range 0.7392–0.9276 s) · lock: migrated from pnpm-lock.yaml
pnpmv12.4.1
2.97spnpm 12.4.1 · 2.9687 s (range 2.8707–3.0206 s) · lock: the project's own pnpm-lock.yaml
yarnv1.22.22 · fresh resolve
can't install this repository
—yarn 1.22.22: yarn cannot read catalog: dependency specifiers
npmv11.19.1 · fresh resolve
can't install this repository
—npm 11.19.1: npm cannot read workspace: or catalog: dependency specifiers
View data table
tRPC: Install duration, median of 3 runs
Tool / versionSecondsLockfile
fnpm 0.0.20.8430migrated from pnpm-lock.yaml
bun 1.4.40.7964migrated from pnpm-lock.yaml
pnpm 12.4.12.9687the project's own pnpm-lock.yaml
yarn 1.22.22—yarn cannot read catalog: dependency specifiers
npm 11.19.1—npm cannot read workspace: or catalog: dependency specifiers

1.06× Bun's duration in this snapshot

No-op

Keep cache and node_modules · reinstall after nothing changed

fnpmv0.0.2
9.2msfnpm 0.0.2 · 0.0092 s (range 0.0089–0.0104 s) · lock: migrated from pnpm-lock.yaml
bunv1.4.4
178msbun 1.4.4 · 0.1780 s (range 0.1716–0.1824 s) · lock: migrated from pnpm-lock.yaml
pnpmv12.4.1
385mspnpm 12.4.1 · 0.3851 s (range 0.3794–0.4194 s) · lock: the project's own pnpm-lock.yaml
yarnv1.22.22 · fresh resolve
can't install this repository
—yarn 1.22.22: yarn cannot read catalog: dependency specifiers
npmv11.19.1 · fresh resolve
can't install this repository
—npm 11.19.1: npm cannot read workspace: or catalog: dependency specifiers
View data table
tRPC: Install duration, median of 3 runs
Tool / versionSecondsLockfile
fnpm 0.0.20.0092migrated from pnpm-lock.yaml
bun 1.4.40.1780migrated from pnpm-lock.yaml
pnpm 12.4.10.3851the project's own pnpm-lock.yaml
yarn 1.22.22—yarn cannot read catalog: dependency specifiers
npm 11.19.1—npm cannot read workspace: or catalog: dependency specifiers

19.35× faster than Bun in this snapshot

Disk

node_modules + private cache/store · hardlinks counted once

fnpmv0.0.2
2.43 GiBfnpm 0.0.2 · 2490.89 MiB · node_modules 2382.78 MiB + store 108.11 MiB · lock: migrated from pnpm-lock.yaml
bunv1.4.4
2.50 GiBbun 1.4.4 · 2558.46 MiB · node_modules 2462.47 MiB + store 96.00 MiB · lock: migrated from pnpm-lock.yaml
pnpmv12.4.1
3.30 GiBpnpm 12.4.1 · 3382.89 MiB · node_modules 2361.22 MiB + store 1021.67 MiB · lock: the project's own pnpm-lock.yaml
yarnv1.22.22 · fresh resolve
can't install this repository
—yarn 1.22.22: yarn cannot read catalog: dependency specifiers
npmv11.19.1 · fresh resolve
can't install this repository
—npm 11.19.1: npm cannot read workspace: or catalog: dependency specifiers
View data table
tRPC: Combined physical disk (node_modules + cache/store)
Tool / versionMiBLockfile
fnpm 0.0.22490.89migrated from pnpm-lock.yaml
bun 1.4.42558.46migrated from pnpm-lock.yaml
pnpm 12.4.13382.89the project's own pnpm-lock.yaml
yarn 1.22.22—yarn cannot read catalog: dependency specifiers
npm 11.19.1—npm cannot read workspace: or catalog: dependency specifiers

fnpm used 2.6% less disk than Bun

All numbers for tRPC
ToolLockfileCold (s)Warm (s)No-op (s)Disk (MiB)Versionsvs Bun missing / extraCheck
fnpm 0.0.2migrated from pnpm-lock.yaml5.8114
5.5396–5.8503
0.843
0.7924–0.9986
0.0092
0.0089–0.0104
2490.89
2382.78 + 108.11
34010 / 0pass
bun 1.4.4migrated from pnpm-lock.yaml5.6859
5.2473–6.7252
0.7964
0.7392–0.9276
0.178
0.1716–0.1824
2558.46
2462.47 + 96
34010 / 0pass
pnpm 12.4.1the project's own pnpm-lock.yaml140.7165
140.6582–142.5789
2.9687
2.8707–3.0206
0.3851
0.3794–0.4194
3382.89
2361.22 + 1021.67
34180 / 17pass
yarn 1.22.22could not install: yarn cannot read catalog: dependency specifiers———————
npm 11.19.1could not install: npm cannot read workspace: or catalog: dependency specifiers———————

Script-enabled OpenNext check

An earlier, separate untimed install of OpenNext Cloudflare with fnpm 0.0.1 used the default trusted-dependency policy on Linux with Node 24.22.1. It completed in 240.16 seconds. Three untrusted scripts remained blocked. better-sqlite3 compiled from source, the root build ran with automatic dependency verification disabled, 37 Vitest files / 364 tests passed, and a real SQL query returned {"value":42}. The original pnpm lock remained unchanged. This does not cover Node 26 on macOS, all native modules or arbitrary lifecycle scripts, and its duration is not part of the script-free medians.

Limits

This is one shared Linux machine, with the OS page cache and a local registry mirror warm in every scenario. Three samples per scenario show variation, not statistical certainty; where ranges overlap, the medians’ order can change between runs. Physical disk is measured before project checks; hardlinks count once and shared reflink extents are not identified. Upstream tarball URLs pinned in original lockfiles can bypass the mirror. A passing check means that command succeeded on the installed tree, not that the repository’s entire test suite passes.

The methodology explains isolation and disk accounting. Raw samples, package sets, commands and logs are in the repository’s benchmark results.