bun
Use when building, testing, and deploying JavaScript/TypeScript applications. Reach for Bun when you need to run scripts, manage dependencies, bundle code, or test applications with a unified toolkit that replaces Node.js, npm, and other tools.
- 3,663
- installs
- 0 up / 0 down, score 0.00
- votes
- In the catalog since
- 1 Oct 2026
- From
- bun.sh
Skill instructions
Rendered from the published SKILL.md, 249 lines.
Bun Skill Reference
Product Summary
Bun is an all-in-one JavaScript/TypeScript toolkit written in Rust and powered by JavaScriptCore. It replaces Node.js, npm, and other tools with a single binary. Key components:
- Runtime: Execute
.js,.ts,.jsx,.tsxfiles directly with native transpilation (4x faster startup than Node.js) - Package Manager:
bun installis 25x faster than npm with global caching and workspace support - Test Runner: Jest-compatible
bun testwith TypeScript, snapshots, mocks, and watch mode - Bundler:
bun buildfor browser and server bundles with code splitting and plugins
Key files: bunfig.toml (configuration), package.json (scripts and dependencies), bun.lock (lockfile)
Primary docs: https://bun.com/docs
When to Use
Reach for Bun when:
- Running scripts: Execute TypeScript/JSX files without compilation step (
bun run script.ts) - Managing dependencies: Install packages faster with
bun installin any Node.js project - Testing: Write Jest-compatible tests with
bun testand run them in parallel - Bundling: Build optimized bundles for browsers or servers with
bun build - Package scripts: Run
package.jsonscripts 28x faster than npm (bun run dev) - Development: Use
--watchor--hotfor file watching and hot reloading - Monorepos: Manage workspaces with
bun install --filterand workspace commands
Do not use Bun for: type checking (use tsc separately), generating type declarations, or projects requiring Node.js-only APIs not yet implemented in Bun.
Quick Reference
Essential Commands
| Task | Command |
|---|---|
| Run a file | bun run script.ts or bun script.ts |
| Run a script | bun run dev (from package.json) |
| Install dependencies | bun install or bun i |
| Add a package | bun add react or bun add -d @types/node |
| Remove a package | bun remove react |
| Run tests | bun test |
| Build a bundle | bun build ./index.ts --outdir ./dist |
| Watch files | bun --watch run script.ts or bun build --watch |
| Hot reload | bun --hot run server.ts |
| Execute a package | bunx cowsay "Hello" |
Configuration Files
| File | Purpose |
|---|---|
bunfig.toml |
Bun-specific settings (runtime, test, install, bundler) |
package.json |
Scripts, dependencies, workspaces, metadata |
tsconfig.json |
TypeScript compiler options (Bun reads this) |
.env |
Environment variables (auto-loaded) |
bun.lock |
Lockfile (text-based, replaces package-lock.json) |
Common bunfig.toml Sections
[install]
linker = "hoisted" # or "isolated" for strict dependency isolation
dev = true
optional = true
production = false
[test]
root = "."
preload = ["./setup.ts"]
coverage = false
[serve]
port = 3000
[run]
shell = "system" # or "bun" on Windows
bun = true # alias node to bun in scripts
Decision Guidance
When to Use Hoisted vs. Isolated Installs
| Scenario | Use | Reason |
|---|---|---|
| New monorepo/workspace | isolated |
Prevents phantom dependencies, strict isolation |
| New single-package project | hoisted |
Traditional npm behavior, simpler |
| Existing project (pre-v1.3.2) | hoisted |
Backward compatibility |
| Migrating from pnpm | isolated |
Similar to pnpm's approach |
Set with: bun install --linker isolated or in bunfig.toml under [install].
When to Use --watch vs. --hot
| Use Case | Flag | Behavior |
|---|---|---|
| File changes trigger re-run | --watch |
Full process restart, clean state |
| HTTP server development | --hot |
Soft reload, preserves global state, faster |
| Test development | --watch |
Better isolation between runs |
| Library bundling | bun build --watch |
Incremental rebuilds |
When to Use bun run vs. Direct Execution
| Scenario | Command | Why |
|---|---|---|
Run a script from package.json |
bun run dev |
Respects lifecycle hooks (pre/post) |
| Run a file directly | bun script.ts |
Faster, no script lookup |
| Run a local CLI tool | bun run eslint |
Resolves from node_modules/.bin |
| Run a system command | bun run ls |
Only works with bun run |
Workflow
1. Initialize a Project
Show the whole skill (129 more lines)
bun init my-app
# Choose template: Blank, React, or Library
cd my-app
This creates package.json, tsconfig.json, index.ts, and .gitignore.
2. Install Dependencies
bun install
# or add specific packages
bun add react
bun add -d typescript @types/node
Bun creates bun.lock (text-based lockfile) and node_modules/.
3. Write and Run Code
# Create index.ts with TypeScript/JSX (no compilation needed)
bun run index.ts
# Or add to package.json scripts
# "scripts": { "dev": "bun run index.ts" }
bun run dev
4. Write Tests
# Create math.test.ts
import { test, expect } from "bun:test";
test("2 + 2 = 4", () => {
expect(2 + 2).toBe(4);
});
# Run tests
bun test
bun test --watch
bun test --coverage
5. Bundle for Production
# Build for browser
bun build ./index.tsx --outdir ./dist --target browser
# Build for Node.js
bun build ./server.ts --outdir ./dist --target node --format cjs
# Build with minification
bun build ./index.ts --outdir ./dist --minify
6. Configure bunfig.toml (Optional)
[install]
linker = "isolated"
[test]
coverage = true
coverageThreshold = 0.8
[serve]
port = 3000
Common Gotchas
Lifecycle scripts disabled by default: Bun doesn't run
postinstallscripts for security. Add packages totrustedDependenciesinpackage.jsonto allow them.Flags go after
bun, not after the command: Usebun --watch run dev, notbun run dev --watch. Flags at the end are passed to the script itself.bun runprefers scripts over files: If both a script and file have the same name,bun runruns the script. Usebun run ./file.tsto force file execution.Environment variables must be literal:
process.env.FOOworks in bundler, butconst env = process.env; env.FOOdoes not. Useprocess.env.FOOdirectly.Auto-install only works without node_modules: If
node_modulesexists, Bun uses it. Deletenode_modulesto enable auto-install from global cache.Bun.lock is text-based by default: Prior to v1.2, lockfiles were binary (
bun.lockb). Upgrade withbun install --save-text-lockfile --frozen-lockfile --lockfile-only.TypeScript 6+ requires explicit types: Add
"types": ["bun"]totsconfig.jsoncompilerOptions if using TypeScript 6 or later.Phantom dependencies in hoisted mode: With
linker: "hoisted", packages can import undeclared dependencies. Uselinker: "isolated"to prevent this.Test files must match patterns: Bun only discovers
*.test.ts,*_test.ts,*.spec.ts,*_spec.ts. Adjust withpathIgnorePatternsinbunfig.toml.Bundler doesn't type-check: Use
tsc --noEmitseparately for type checking. Bun's bundler only transpiles.
Verification Checklist
Before submitting work with Bun:
- Dependencies installed:
bun installruns without errors - Scripts work:
bun run <script>executes correctly - Tests pass:
bun testshows all tests passing - No TypeScript errors: Run
tsc --noEmitif type checking is needed - Bundle builds:
bun buildcompletes without errors - Environment variables set:
.envfile exists with required variables - Lockfile committed:
bun.lockis in version control - No deprecated APIs: Check Bun docs for Node.js compatibility status
- Watch mode works:
bun --watch run devdetects file changes - Hot reload functional:
bun --hot run server.tsupdates without restart
Resources
Comprehensive navigation: https://bun.com/docs/llms.txt
Critical pages:
- Runtime — Running files and scripts
- Package Manager — Installing and managing dependencies
- Test Runner — Writing and running tests
- Bundler — Building and bundling code
For additional documentation and navigation, see: https://bun.com/docs/llms.txt