Bun

Node.js compatibility

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.