Bun
// Build with Bun runtime avoiding Node.js compatibility traps, bundler pitfalls, and package manager gotchas.
$ git log --oneline --stat
stars:1,933
forks:367
updated:March 4, 2026
SKILL.mdreadonly
SKILL.md Frontmatter
nameBun
slugbun
version1.0.0
descriptionBuild with Bun runtime avoiding Node.js compatibility traps, bundler pitfalls, and package manager gotchas.
metadata[object Object]
When to Use
User needs Bun expertise — fast JavaScript/TypeScript runtime, bundler, and package manager. Agent handles migration from Node, bundling for web/server, and troubleshooting compatibility issues.
Quick Reference
| Topic | File |
|---|---|
| Node.js API differences | node-compat.md |
| Bundler configuration | bundler.md |
| Package management | packages.md |
Runtime Compatibility Traps
process.nextTicktiming differs from Node — race conditions appear that didn't exist before, usequeueMicrotaskfor cross-runtime code__dirnameand__filenamedon't exist in ESM — useimport.meta.dirandimport.meta.file, forgetting causes ReferenceErrorfs.watchmisses events that Node catches — file watcher scripts silently miss changes, add polling fallbackchild_process.spawnoptions subset — some stdio configurations silently ignored, test subprocess code explicitlyclustermodule not supported — app crashes immediately if code uses cluster, must refactor to workersvmmodule partial — sandboxed code may escape or behave differently, security implications
Bundler Traps
--target=browserstrips Node APIs silently — build succeeds, then runtime crashes onfs,path, etc.--splittingrequires--format=esm— error message doesn't mention this, just fails cryptically- Everything bundled by default — server code bundles node_modules, use
--external:packagefor server deps - Tree-shaking assumes no side effects — code with side effects may be removed, add
"sideEffects": falseto package.json or lose code - CSS imports work differently than webpack —
url()paths resolve wrong, test in actual browser --minifymangles names aggressively — debugging production crashes is harder, use--minify-syntaxfor safer minification
Package Manager Traps
bun.lockbis binary format — can't diff, can't merge, Git conflicts require delete and regenerate- Peer dependencies auto-installed unlike npm — version conflicts appear silently, different versions than npm would pick
bun installresolves differently than npm — "works on my machine" when teammate uses npm- Workspaces
link:protocol behaves differently — imports from workspace packages may fail bun addmodifiespackage.jsonformatting — unwanted diff noise in commits- No
npm auditequivalent — security vulnerabilities not surfaced automatically
TypeScript Traps
- Bun runs TypeScript directly without
tsc— type errors don't stop execution, bugs ship to production - Type-only imports may be kept — bundle size larger than expected
tsconfig.jsonpaths work differently — imports that worked in Node+tsc may fail- Decorators experimental — behavior may differ from tsc, especially with legacy decorators
Testing Traps
bun testhas different assertion API — tests written for Jest need adaptation- Mock timing differs — tests that pass in Jest may fail or flake
- No native coverage like c8/nyc — need different tooling
- Snapshot format incompatible with Jest — can't share snapshots between runners
Hot Reload Traps
bun --hotdoesn't reload native modules — changes require restart- State preserved across reloads — bugs from stale state hard to debug
- WebSocket connections not re-established — clients appear connected but dead