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, pnpm, bun, and lpm.

Benchmarks

Install benchmarks use the tracked VitePress docs fixture, a real-world workspace graph with 535 packages.

Benchmarknpmpnpmbunlpmlpm + LPM Firewall monitor
Cold install, equal footing ¹17,354ms6,125ms2,455ms2,945ms3,043ms
Warm install ¹3,819ms3,301ms451ms387ms324ms
Up-to-date install ¹282ms522ms77ms14ms14ms

Dev command benchmarks measure already-installed local scripts, local bins, and built-in tools.

Benchmarknpm / npx / tsxpnpmbun / bunxlpm
Trivial echo script ²74ms161ms15ms10ms
Node startup + tiny script ²101ms185ms33ms27ms
Local bin: esbuild --version ²144ms174ms27ms21ms
Run TSX app, warm cache ³112ms19ms41ms
lpm lint vs npx oxlint273ms3ms
lpm fmt vs npx biome340ms3ms

Security defaults

Axisnpmpnpmbunlpm
Dependency lifecycle-script sandboxDependency lifecycle-script sandbox: approved or triage-selected dependency scripts run under macOS Seatbelt, Linux Landlock, or Windows AppContainer. Default mode contains filesystem access while allowing network. Strict mode denies outbound network on macOS and AppContainer; Linux 6.7+ uses Landlock V4 plus seccomp, with AF_UNIX retained for IPC. Older Linux kernels and Windows installs missing the AppContainer helper refuse strict mode unless allow-degraded = true. Root-project lifecycle scripts are not sandboxed.
Dependency 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 approvalDependencies are blocked by default. Under the opt-in triage policy, green verdicts are eligible to auto-run in the sandbox; an optional advisor can approve amber verdicts for the current run; red verdicts remain blocked. The root project's lifecycle runs on bare lpm install without the dependency sandbox.
Registry package signaturesManual via npm audit signaturesManual via pnpm audit signatureslpm audit signatures; optional install-time fail-closed verification with lpm config signatures --set true
Sigstore provenance verificationPublish-time provenance supportPublish-time provenance supportDSSE + Rekor body + Rekor SET + SCT + X.509 chain verified end-to-end on install for provenance bundles served by npmjs
Minimum release age (cooldown)min-release-age flag, off by default1-day cooldown by defaultOff by default1-day direct/root cooldown by default; strict transitive policy opt-in
engines.node enforcementWarn onlyWarn onlyWhen an effective Node version is available, hard-fails incompatible required root/dependency constraints, skips optional-only incompatible packages, persists dependency constraints for warm/frozen/offline replay, and supports warning-only opt-out
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)Detects publisher-identity drift for stored rich trust bindings; optional trust-policy = "no-downgrade" refuses weaker npm publish trust during resolution and requires continued artifact verification after verified lockfile history
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; prefers APFS clonefile on macOS, with hardlink/copy fallback
node_modules layoutHoistedIsolated (symlinked virtual store)Auto: hoisted for single-package, isolated when workspaces detectedAuto: v2 hoisted virtual-store for single packages, 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)lpm.lock (TOML, authoritative) plus lpm.lockb binary companion when the graph fits the binary format
Patched dependenciespnpm patch workflowbun patch workflowNative patchedDependencies; reads pnpm's shape for migration
Dependency overridesYes (overrides field, npm 8+)YesYesHonors top-level npm overrides, Yarn resolutions, and lpm.overrides; lpm migrate translates pnpm.overrides
Native dependency build-artifact cacheSide-effects cache, enabled by defaultAutomatic for eligible strict-sandbox builds on macOS and Linux; content-addressed artifacts are reused only when package graph, platform, Node runtime/ABI, environment, sandbox, and toolchain inputs match

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, secure-store preferred, cloud sync)Auto-loads .env, no vaultPer-project and per-environment; prefers the OS secure store with encrypted-file fallback; org sharing, OIDC CI escrow, and client-direct Vercel, Coolify, Fly.io, Railway, and GitHub Actions integrations
Zero-config dev server orchestratorAuto-installs stale deps, loads env, starts services, opens the browser when ready, and starts LPM CLI's browser webhook inspector when tunneling
Remote task cacheUse Turborepo / NxUse Turborepo / NxUse Turborepo / NxLocal task cache + hosted remote cache; content hashes always, optional HMAC signing via remoteCache.signature, 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
Managed linter / formatterFormatter 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 uses managed Rolldown, while lpm pack wraps project-local tsdown
Built-in test runnerYesNo native test engine; lpm test orchestrates Vitest / Jest / Mocha

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 / lpm ls — HTML / JSON / dot output, depth filter, lpm why <pkg> reverse-lookup
Interactive upgrade pickerpnpm update -ibun update --interactivelpm upgrade [pkg...] (interactive by default on TTY) — targeted upgrades, peer-impact analysis
License inventory and policy gatethird-party toolingthird-party toolingthird-party toolinglpm licenses — local inventory, --fail-on copyleft,missing, exact --deny <LICENSE> gates
Programmable resolution hooks (intercept readPackage / afterAllResolved at resolve time).pnpmfile.cjs
Install-time policy extensionsLocal package.candidate extensions evaluate resolved packages before fetch/link and return allow, warn, or block; they do not mutate resolution
Workspaces (monorepo)--workspace selectorRich --filter pattern syntax--workspace, --all-workspacespnpm-style filter grammar
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 lockfile migration from npm / pnpm / Yarn / Bun; pnpm migration also translates overrides, patches, and peer rules
Swift Package Manager (SE-0292)SE-0292-compatible after LPM CLI configures the scope; certificate/trust setup occurs on the first Swift install; CMS signing is available on a best-effort basis

Publishing and registry

Axisnpmpnpmbunlpm
First-party hosted registrynpmjs.org (public and private packages)lpm.dev: publish-time security analysis, with optional AI analysis and API-doc extraction; private publishers can opt out of AI processing. Packages are private by default, with pool and marketplace as explicit opt-ins.
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 routingYesYesYesYes — mappings are honored for npm-compatible private registries and JSR mirrors; per-origin authentication is supported
Auth-token storage.npmrc plain text.npmrc plain text.npmrc / bunfig.toml plain textOS keychain preferred; AES-256-GCM encrypted-file fallback; .npmrc honored for compatibility
Default registry routingnpmjs.orgnpmjs.orgnpmjs.orgnpm packages go directly to npmjs.org; native jsr: dependencies go to npm.jsr.io; only @lpm.dev/* always routes through lpm.dev

Platform

Axisnpmpnpmbunlpm
macOS (Intel + Apple Silicon)YesYesYesYes
Linux (glibc)YesYesYesYes
Linux (musl / Alpine)YesYesYesUpcoming official x64 binary through npm, the standalone installer, and GitHub Releases (not included in v0.67.0); ARM64 requires a source build
Windows x64YesYesYesYes
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