Every day, Bun gets closer to 100% Node.js API compatibility. Today, popular frameworks like Next.js, Express, and millions of npm
packages intended for Node just work with Bun. To ensure compatibility, we run thousands of tests from Node.js' test suite before every release of Bun.
If a package works in Node.js but doesn't work in Bun, we consider it a bug in Bun. Please open an issue and we'll fix it.
This page is updated regularly to reflect compatibility status of the latest version of Bun. The information below reflects Bun's compatibility with Node.js v23.
Built-in Node.js modules
node:assert
🟢 Fully implemented.
node:buffer
🟢 Fully implemented.
node:console
🟢 Fully implemented.
node:dgram
🟢 Fully implemented. > 90% of Node.js's test suite passes.
node:diagnostics_channel
🟢 Fully implemented.
node:dns
🟢 Fully implemented. > 90% of Node.js's test suite passes.
node:events
🟢 Fully implemented. EventEmitterAsyncResource
uses AsyncResource
underneath. 100% of Node.js's test suite for EventEmitter passes.
node:http
🟢 Fully implemented. Outgoing client request body is currently buffered instead of streamed.
node:https
🟢 APIs are implemented, but Agent
is not always used yet.
node:os
🟢 Fully implemented. 100% of Node.js's test suite passes.
node:path
🟢 Fully implemented. 100% of Node.js's test suite passes.
node:punycode
🟢 Fully implemented. 100% of Node.js's test suite passes, deprecated by Node.js.
node:querystring
🟢 Fully implemented. 100% of Node.js's test suite passes.
node:readline
🟢 Fully implemented.
node:stream
🟢 Fully implemented.
node:string_decoder
🟢 Fully implemented. 100% of Node.js's test suite passes.
node:timers
🟢 Recommended to use global setTimeout
, et. al. instead.
node:tty
🟢 Fully implemented.
node:url
🟢 Fully implemented.
node:zlib
🟢 Fully implemented. 98% of Node.js's test suite passes.
node:async_hooks
🟡 AsyncLocalStorage
, and AsyncResource
are implemented. AsyncResource
is missing bind
. v8 hooks are stubbed.
node:child_process
🟡 Missing proc.gid
proc.uid
. Stream
class not exported. IPC cannot send socket handles. Node.js <> Bun IPC can be used with JSON serialization.
node:cluster
🟡 Handles and file descriptors cannot be passed between workers, which means load-balancing HTTP requests across processes is only supported on Linux at this time (via SO_REUSEPORT
). Otherwise, implemented but not battle-tested.
node:crypto
🟡 Missing ECDH
checkPrime
checkPrimeSync
generatePrime
generatePrimeSync
hkdf
hkdfSync
secureHeapUsed
setEngine
setFips
Some methods are not optimized yet.
node:domain
🟡 Missing Domain
active
node:fs
🟡 Missing statfs
statfsSync
, opendirSync
. Dir
is partially implemented.
node:http2
🟡 Client & server are implemented (95.25% of gRPC's test suite passes). Missing options.allowHTTP1
, options.enableConnectProtocol
, ALTSVC extension, and http2stream.pushStream
.
node:module
🟡 Missing runMain
syncBuiltinESMExports
, Module#load()
. Overriding require.cache
is supported for ESM & CJS modules. module._extensions
, module._pathCache
, module._cache
are no-ops. module.register
is not implemented and we recommend using a Bun.plugin
in the meantime.
node:net
🟡 SocketAddress
class not exposed (but implemented). BlockList
exists but is a no-op.
node:perf_hooks
🟡 Missing createHistogram
monitorEventLoopDelay
. It's recommended to use performance
global instead of perf_hooks.performance
.
node:process
🟡 See process
Global.
node:sys
🟡 See node:util
.
node:tls
🟡 Missing tls.createSecurePair
.
node:util
🟡 Missing MIMEParams
MIMEType
debug
getSystemErrorMap
transferableAbortController
transferableAbortSignal
stripVTControlCharacters
node:v8
🟡 writeHeapSnapshot
and getHeapSnapshot
are implemented. serialize
and deserialize
use JavaScriptCore's wire format instead of V8's. Other methods are not implemented. For profiling, use bun:jsc
instead.
node:vm
🟡 Core functionality works, but experimental VM ES modules are not implemented, including vm.Module
, vm.SourceTextModule
, vm.SyntheticModule
,importModuleDynamically
, and vm.measureMemory
. Options like timeout
, breakOnSigint
, cachedData
are not implemented yet.
node:wasi
🟡 Partially implemented.
node:worker_threads
🟡 Worker
doesn't support the following options: stdin
stdout
stderr
trackedUnmanagedFds
resourceLimits
. Missing markAsUntransferable
moveMessagePortToContext
getHeapSnapshot
.
node:inspector
🔴 Not implemented.
node:repl
🔴 Not implemented.
node:sqlite
🔴 Not implemented.
node:test
🔴 Not implemented. Use bun:test
instead.
node:trace_events
🔴 Not implemented.
Node.js globals
The table below lists all globals implemented by Node.js and Bun's current compatibility status.
AbortController
🟢 Fully implemented.
AbortSignal
🟢 Fully implemented.
Blob
🟢 Fully implemented.
Buffer
🟢 Fully implemented.
ByteLengthQueuingStrategy
🟢 Fully implemented.
__dirname
🟢 Fully implemented.
__filename
🟢 Fully implemented.
atob()
🟢 Fully implemented.
BroadcastChannel
🟢 Fully implemented.
btoa()
🟢 Fully implemented.
clearImmediate()
🟢 Fully implemented.
clearInterval()
🟢 Fully implemented.
clearTimeout()
🟢 Fully implemented.
CompressionStream
🔴 Not implemented.
console
🟢 Fully implemented.
CountQueuingStrategy
🟢 Fully implemented.
Crypto
🟢 Fully implemented.
SubtleCrypto (crypto)
🟢 Fully implemented.
CryptoKey
🟢 Fully implemented.
CustomEvent
🟢 Fully implemented.
DecompressionStream
🔴 Not implemented.
Event
🟢 Fully implemented.
EventTarget
🟢 Fully implemented.
exports
🟢 Fully implemented.
fetch
🟢 Fully implemented.
FormData
🟢 Fully implemented.
global
🟢 Implemented. This is an object containing all objects in the global namespace. It's rarely referenced directly, as its contents are available without an additional prefix, e.g. __dirname
instead of global.__dirname
.
globalThis
🟢 Aliases to global
.
Headers
🟢 Fully implemented.
MessageChannel
🟢 Fully implemented.
MessageEvent
🟢 Fully implemented.
MessagePort
🟢 Fully implemented.
module
🟢 Fully implemented.
PerformanceEntry
🟢 Fully implemented.
PerformanceMark
🟢 Fully implemented.
PerformanceMeasure
🟢 Fully implemented.
PerformanceObserver
🟢 Fully implemented.
PerformanceObserverEntryList
🟢 Fully implemented.
PerformanceResourceTiming
🟢 Fully implemented.
performance
🟢 Fully implemented.
process
🟡 Mostly implemented. process.binding
(internal Node.js bindings some packages rely on) is partially implemented. process.title
is a currently a no-op on macOS & Linux. getActiveResourcesInfo
setActiveResourcesInfo
, getActiveResources
and setSourceMapsEnabled
are stubs. Newer APIs like process.loadEnvFile
and process.getBuiltinModule
are not implemented yet.
queueMicrotask()
🟢 Fully implemented.
ReadableByteStreamController
🟢 Fully implemented.
ReadableStream
🟢 Fully implemented.
ReadableStreamBYOBReader
🟢 Fully implemented.
ReadableStreamBYOBRequest
🟢 Fully implemented.
ReadableStreamDefaultController
🟢 Fully implemented.
ReadableStreamDefaultReader
🟢 Fully implemented.
require()
🟢 Fully implemented, including require.main
, require.cache
, require.resolve
. require.extensions
is a stub.
Response
🟢 Fully implemented.
Request
🟢 Fully implemented.
setImmediate()
🟢 Fully implemented.
setInterval()
🟢 Fully implemented.
setTimeout()
🟢 Fully implemented.
structuredClone()
🟢 Fully implemented.
SubtleCrypto
🟢 Fully implemented.
DOMException
🟢 Fully implemented.
TextDecoder
🟢 Fully implemented.
TextDecoderStream
🟢 Fully implemented.
TextEncoder
🟢 Fully implemented.
TextEncoderStream
🟢 Fully implemented.
TransformStream
🟢 Fully implemented.
TransformStreamDefaultController
🟢 Fully implemented.
URL
🟢 Fully implemented.
URLSearchParams
🟢 Fully implemented.
WebAssembly
🟢 Fully implemented.
WritableStream
🟢 Fully implemented.
WritableStreamDefaultController
🟢 Fully implemented.
WritableStreamDefaultWriter
🟢 Fully implemented.