Basic Usage
terminal
bun
CLI contains a Node.js-compatible package manager designed to be a dramatically faster replacement for npm
, yarn
, and pnpm
. It’s a standalone tool that will work in pre-existing Node.js projects; if your project has a package.json
, bun install
can help you speed up your workflow.
⚡️ 25x faster — Switch from 
npm install
to bun install
in any Node.js project to make your installations up to 25x faster.
For Linux users
For Linux users
The recommended minimum Linux Kernel version is 5.6. If you’re on Linux kernel 5.1 - 5.5,
bun install
will work, but HTTP requests will be slow due to a lack of support for io_uring’s connect()
operation.If you’re using Ubuntu 20.04, here’s how to install a newer kernel:terminal
terminal
bun install
will:
- Install all
dependencies
,devDependencies
, andoptionalDependencies
. Bun will installpeerDependencies
by default. - Run your project’s
{pre|post}install
and{pre|post}prepare
scripts at the appropriate time. For security reasons Bun does not execute lifecycle scripts of installed dependencies. - Write a
bun.lock
lockfile to the project root.
Logging
To modify logging verbosity:terminal
Lifecycle scripts
Unlike other npm clients, Bun does not execute arbitrary lifecycle scripts likepostinstall
for installed dependencies. Executing arbitrary scripts represents a potential security risk.
To tell Bun to allow lifecycle scripts for a particular package, add the package to trustedDependencies
in your package.json.
package.json
my-trusted-package
.
Lifecycle scripts will run in parallel during installation. To adjust the maximum number of concurrent scripts, use the --concurrent-scripts
flag. The default is two times the reported cpu count or GOMAXPROCS.
terminal
Workspaces
Bun supports"workspaces"
in package.json. For complete documentation refer to Package manager > Workspaces.
package.json
Installing dependencies for specific packages
In a monorepo, you can install the dependencies for a subset of packages using the--filter
flag.
terminal
bun install
, refer to Package Manager > Filtering
Overrides and resolutions
Bun supports npm’s"overrides"
and Yarn’s "resolutions"
in package.json
. These are mechanisms for specifying a version range for metadependencies—the dependencies of your dependencies. Refer to Package manager > Overrides and resolutions for complete documentation.
package.json
Global packages
To install a package globally, use the-g
/--global
flag. Typically this is used for installing command-line tools.
terminal
Production mode
To install in production mode (i.e. withoutdevDependencies
or optionalDependencies
):
terminal
--frozen-lockfile
. This will install the exact versions of each package specified in the lockfile. If your package.json
disagrees with bun.lock
, Bun will exit with an error. The lockfile will not be updated.
terminal
bun.lock
, refer to Package manager > Lockfile.
Omitting dependencies
To omit dev, peer, or optional dependencies use the--omit
flag.
terminal
Dry run
To perform a dry run (i.e. don’t actually install anything):terminal
Non-npm dependencies
Bun supports installing dependencies from Git, GitHub, and local or remotely-hosted tarballs. For complete documentation refer to Package manager > Git, GitHub, and tarball dependencies.package.json
Installation strategies
Bun supports two package installation strategies that determine how dependencies are organized innode_modules
:
Hoisted installs (default for single projects)
The traditional npm/Yarn approach that flattens dependencies into a sharednode_modules
directory:
terminal
Isolated installs
A pnpm-like approach that creates strict dependency isolation to prevent phantom dependencies:terminal
node_modules/.bun/
with symlinks in the top-level node_modules
. This ensures packages can only access their declared dependencies.
For complete documentation on isolated installs, refer to Package manager > Isolated installs.
Minimum release age
To protect against supply chain attacks where malicious packages are quickly published, you can configure a minimum age requirement for npm packages. Package versions published more recently than the specified threshold (in seconds) will be filtered out during installation.terminal
bunfig.toml
:
bunfig.toml
- Only affects new package resolution - existing packages in
bun.lock
remain unchanged - All dependencies (direct and transitive) are filtered to meet the age requirement when being resolved
- When versions are blocked by the age gate, a stability check detects rapid bugfix patterns
- If multiple versions were published close together just outside your age gate, it extends the filter to skip those potentially unstable versions and selects an older, more mature version
- Searches up to 7 days after the age gate, however if still finding rapid releases it ignores stability check
- Exact version requests (like
package@1.1.1
) still respect the age gate but bypass the stability check
- Versions without a
time
field are treated as passing the age check (npm registry should always provide timestamps)
Configuration
The default behavior ofbun install
can be configured in bunfig.toml
. The default values are shown below.
bunfig.toml
CI/CD
Use the officialoven-sh/setup-bun
action to install bun
in a GitHub Actions pipeline:
.github/workflows/release.yml
bun ci
to fail the build if the package.json is out of sync with the lockfile:
terminal
bun install --frozen-lockfile
. It installs exact versions from bun.lock
and fails if package.json
doesn’t match the lockfile. To use bun ci
or bun install --frozen-lockfile
, you must commit bun.lock
to version control.
And instead of running bun install
, run bun ci
.
.github/workflows/release.yml
pnpm migration
Bun automatically migrates projects from pnpm to bun. When apnpm-lock.yaml
file is detected and no bun.lock
file exists, Bun will automatically migrate the lockfile to bun.lock
during installation. The original pnpm-lock.yaml
file remains unmodified.
terminal
bun.lock
is absent. There is currently no opt-out flag for pnpm migration.
The migration process handles:
Lockfile Migration
- Converts
pnpm-lock.yaml
tobun.lock
format - Preserves package versions and resolution information
- Maintains dependency relationships and peer dependencies
- Handles patched dependencies with integrity hashes
Workspace Configuration
When apnpm-workspace.yaml
file exists, Bun migrates workspace settings to your root package.json
:
pnpm-workspace.yaml
workspaces
field in package.json
:
package.json
Catalog Dependencies
Dependencies using pnpm’scatalog:
protocol are preserved:
package.json
Configuration Migration
The following pnpm configuration is migrated from bothpnpm-lock.yaml
and pnpm-workspace.yaml
:
- Overrides: Moved from
pnpm.overrides
to root-leveloverrides
inpackage.json
- Patched Dependencies: Moved from
pnpm.patchedDependencies
to root-levelpatchedDependencies
inpackage.json
- Workspace Overrides: Applied from
pnpm-workspace.yaml
to rootpackage.json
Requirements
- Requires pnpm lockfile version 7 or higher
- Workspace packages must have a
name
field in theirpackage.json
- All catalog entries referenced by dependencies must exist in the catalogs definition
pnpm-lock.yaml
and pnpm-workspace.yaml
files.
CLI Usage
terminal
General Configuration
Specify path to config file (bunfig.toml)
Set a specific cwd
Dependency Scope & Management
Don’t install devDependencies
Don’t update package.json or save a lockfile
Save to package.json
Exclude ‘dev’, ‘optional’, or ‘peer’ dependencies from install
Only add dependencies to package.json if they are not already present
Dependency Type & Versioning
Add dependency to “devDependencies”
Add dependency to “optionalDependencies”
Add dependency to “peerDependencies”
Add the exact version instead of the ^range
Lockfile Control
Write a yarn.lock file (yarn v1)
Disallow changes to lockfile
Save a text-based lockfile
Generate a lockfile without installing dependencies
Network & Registry Settings
Provide a Certificate Authority signing certificate
File path to Certificate Authority signing certificate
Use a specific registry by default, overriding .npmrc, bunfig.toml and environment variables
Installation Process Control
Don’t install anything
Always request the latest versions from the registry & reinstall all dependencies
Install globally
Platform-specific optimizations: “clonefile”, “hardlink”, “symlink”, “copyfile”
Install packages for the matching workspaces
Analyze & install all dependencies of files passed as arguments recursively
Caching Options
Store & load cached data from a specific directory path
Ignore manifest cache entirely
Output & Logging
Don’t log anything
Excessively verbose logging
Disable the progress bar
Don’t print a summary
Security & Integrity
Skip verifying integrity of newly downloaded packages
Add to trustedDependencies in the project’s package.json and install the package(s)
Concurrency & Performance
Maximum number of concurrent jobs for lifecycle scripts
Maximum number of concurrent network requests
Lifecycle Script Management
Skip lifecycle scripts in the project’s package.json (dependency scripts are never run)
Help Information
Print this help menu