LPM-cli

Compared to npm, pnpm, bun

Side-by-side defaults across the four JavaScript package managers — security, resolution, developer orchestration, publishing, and platform.

A factual comparison of default behavior across npm 11, pnpm 11, bun 1.4, and lpm.

Benchmarks

npmpnpmbunlpm
Cold install, equal footing ¹6,735ms1,124ms823ms957ms
Cold install, reset-each-iter ²7,146ms1,927ms1,207ms945ms
Warm install ³648ms665ms263ms23ms
Up-to-date install ³348ms152ms8ms6ms
Script overhead ⁴67ms107ms6ms9ms
lpm lint vs npx oxlint250ms78ms (3.2×)
lpm fmt vs npx biome264ms13ms (20×)

Security defaults

Axisnpmpnpmbunlpm
Install-time process sandboxDefault: macOS Seatbelt deny-default, Linux landlock V1 filesystem deny-default, Windows AppContainer (Low IL MIC + Job Object fallback if helper absent). Strict: adds outbound network denial; Linux upgrades to landlock V4 + seccomp socket-deny (kernel ≥6.7; refused otherwise unless allow-degraded = true).
Lifecycle scripts (preinstall / install / postinstall)All scripts runBlocked until approved (approve-builds flow)Blocked unless in trustedDependencies; bun ships a built-in 367-package default trusted list that also runs scripts without approvalBlocked by default; opt-in triage policy adds a four-layer gate (greens auto-approve; ambers/reds still blocked)
Sigstore verification on installManual via audit signaturesMints attestations on publish; pnpm audit signatures matches npm; resolve-time trust-evidence rank check refuses installs when current evidence (trustedPublisher / provenance / none) is weaker than any earlier version'sDSSE + Rekor body + Rekor SET + SCT + X.509 chain verified end-to-end on install, including attestations served by npmjs
Minimum release age (cooldown)min-release-age flag, off by default1-day cooldown by defaultOff by default1-day cooldown by default
engines.node enforcementWarn onlyWarn onlyHard-fails install / rebuild / add before any IO
Built-in vulnerability auditnpm security databaseRegistry-side dataProxies to npm audit endpointOSV + behavioral analysis + verdict cache
Approval-gated weakening of security postureWeaker CLI flags can require native approval; pulled repo or config-file weakenings are treated as proposals until a short-lived unlock or persistent signed machine approval exists
Provenance drift detection on republishResolve-time trust-rank downgrade refusal (trustedPublisher → provenance → none)Trust binding per package + drift detection when a publisher identity changes
Pluggable third-party security scanner protocol (register an npm package as a scanner, run it against the lockfile)bunfig.toml > [install.security] scanner = "<pkg>", invoked by bun pm scan— (built-in triage + audit cover a different surface; not pluggable)

Resolver, store, and layout

Axisnpmpnpmbunlpm
ResolverArborist backtrackingHighest-version + workspace-rooted peer resolutionTree resolution + backtrackingGreedy-fusion (PubGrub legacy arm available)
Package storeContent-addressable cacheContent-addressable, versioned virtual storeContent-addressable, hardlinkedContent-addressable, clonefile on macOS (mutation-safe COW)
node_modules layoutHoistedIsolated (symlinked virtual store)Auto: hoisted for single-package, isolated when workspaces detectedAuto: hoisted for single-package, isolated for workspaces or default peer-conflict installs
Phantom-dependency preventionHoisted layout leaks unlisted depsIsolated by defaultIn isolated modeIn isolated mode (default for workspaces and peer-conflict installs)
Lockfilepackage-lock.json v3pnpm-lock.yaml v9bun.lock (JSONC)Dual write: lpm.lock (TOML, git-diffable) + lpm.lockb (binary mmap, zero-parse on warm install)
Patched dependenciespnpm patch workflowbun patch workflowNative patchedDependencies; reads pnpm's shape for migration
Dependency overridesYes (overrides field, npm 8+)YesYesHonors npm and pnpm shapes
Side-effects cache for native builds (cache node-gyp output so sharp / node-sass skip rebuild on re-install)Default on

Developer orchestration and local infrastructure

This is the most lopsided table — three of the four columns are blank for several rows.

Axisnpmpnpmbunlpm
Secrets vault (E2E-encrypted, OS-keychain-backed, cloud sync)Auto-loads .env, no vaultPer-project, per-environment, org-shareable, OIDC CI escrow, platform pushes to Vercel / AWS SSM / Fly / Railway / Coolify / GitHub Actions
Zero-config dev server orchestratorAuto-installs stale deps, loads env, starts services, wires the Node inspector, opens the browser when ready
Remote task cacheUse Turborepo / NxUse Turborepo / NxUse Turborepo / NxLocal task cache + hosted remote cache; signed artifacts, read-only mode, quota / usage status, and env-policy upload guards
Local HTTPS with dev-only certificate authorityUse mkcertUse mkcertUse mkcertBuilt-in CA: status / trust / uninstall / generate. Picked up automatically by the dev server.
Local tunneling (public URL to localhost)Use ngrokUse ngrokUse ngrokStable claimable domains, webhook capture, replay, and audit log
Managed runtime availabilityNode version pinningBun is its own runtimeAuto-installed Node and Bun via lpm.json > runtime; Node also falls back through engines.node, .nvmrc, .node-version
Built-in linter / formatter as install-time toolsFormatter exists in the runtime, not the install surfaceoxlint + biome as lazy-downloaded plugins, pinned via lpm.json > tools
One-off package execution (npx-equivalent)npx, permanent cachepnpm dlx, 1-day cachebunxlpm dlx / lpx, 1-day cache
Built-in bundlerYesNo native bundler; lpm bundle (rolldown) and lpm pack (tsdown) ship as lazy-downloaded plugin engines
Built-in test runnerYes

Code and package operations

Axisnpmpnpmbunlpm
Source-code delivery (copy package files into the project, shadcn-style)lpm add — works for any tarball-shipped package on any reachable registry (lpm.dev, npm, private via .npmrc)
Dependency selector queries (CSS-like syntax over behavioral tags)lpm query:eval, :scripts:not(:built), :root > :network, #express, --assert-none CI gate
Dependency-graph visualizationnpm ls (text)pnpm list (text)bun pm ls (text)lpm graph — HTML / JSON / dot output, depth filter, --why <pkg> reverse-lookup
Interactive upgrade pickerpnpm update -ibun update --interactivelpm upgrade (interactive by default on TTY) — dual-row WithinMajor + AbsoluteLatest, peer-impact analysis
Programmable resolution hooks (intercept readPackage / afterAllResolved at resolve time).pnpmfile.cjs
Workspaces (monorepo)--workspace selectorRich --filter pattern syntax--workspace, --all-workspacesRich filter engine matching pnpm's pattern surface
Catalog version pins for monorepos (one declaration, every member references it)pnpm-workspace.yaml > catalogCatalogs in lockfilepackage.json > catalogs, plus pnpm-style pnpm-workspace.yaml catalogs and cleanup
Workspace-package deploy (extract one member + transitive deps to a deployable dir)pnpm deploylpm deploy
Migration from other package managersReads npm + yarn lockfilesOne command from npm / pnpm / yarn / bun, preserving overrides, patches, and peer rules
Swift Package Manager (SE-0292)SPM resolves lpm packages natively; CMS-signed Swift releases; auto-installs the signing certificate on first use

Publishing and registry

Axisnpmpnpmbunlpm
First-party hosted registrynpmjs.org (public and private packages)lpm.dev (every package security-analyzed and API documentation auto-generated by AI; private packages + monetization via pool or marketplace options)
Sigstore provenance signing on publish--provenance flagAuto in CI when OIDC available--provenance flag + auto-OIDC token exchange
OIDC trusted-publisher token exchangeGitHub ActionsGitHub Actions + GitLab CIGitHub Actions + GitLab CI
2FA on publishOTPOTP--otp flagOTP
.npmrc scope-to-registry routingYesYesYesHonored across npm, lpm.dev, and private registries; per-origin auth tokens
Auth-token storage.npmrc plain text.npmrc plain text.npmrc / bunfig.toml plain textOS keychain (macOS Keychain / Linux Secret Service / Windows Credential Manager); .npmrc honored for tooling compat
Default registry routingnpmjs.orgnpmjs.orgnpmjs.orgDirect to npmjs.org for npm packages; lpm.dev only for @lpm.dev/*

Platform

Axisnpmpnpmbunlpm
macOS (Intel + Apple Silicon)YesYesYesYes
Linux (glibc)YesYesYesYes
Linux (musl / Alpine)YesYesYesYes — detected at runtime, folded into store keys
WindowsYesYesYesYes
FreeBSDYesYes
Self-updatenpm install -g npmpnpm self-updatebun upgradelpm self-update — install-method-aware (npm / Homebrew / Cargo / standalone GitHub Releases); 24-hour banner check
Implementation languageJavaScript (Node.js)TypeScript (Rust port underway)Zig (Rust port underway)Rust

See also