Node API Compatibility Surface: How Real Is It?
Bun 1.4's most concrete evidence: it passed 1,517 new tests in Node.js 26.3.0's own test suite (bun.sh/blog/bun-v1.4, August 20, 2026). That's the real data point behind the claim that "Bun now runs Express/Fastify/NestJS/Next.js without issues" — but compatibility has two layers. The first layer: the pure JavaScript/TypeScript API surface (fs, http, path, stream, worker_threads). Bun is advancing fast on this layer. The second layer: native N-API addons — sharp compiled with node-gyp, native bcrypt, some database drivers. Because Bun uses JavaScriptCore (WebKit) instead of V8, this layer forms a structural boundary; the Rust rewrite increased JS-API compatibility but didn't eliminate native addon incompatibility. If you want a definitive answer: run your dependency list through bun install and test it one by one, don't move to production on a "probably works" assumption. On the Node side, compatibility isn't an issue at all because it is the reference implementation — but that doesn't mean every Node API is "modern"; some older APIs (e.g., callback-based fs methods) are still supported but not recommended.
Native TypeScript: Two Different Approaches
In Bun you run TypeScript and JSX files directly — bun run server.ts requires no transpile step, and type checking is a separate step (Bun doesn't use tsc, it just strips the syntax). On the Node.js side, native type-stripping arrived experimentally in v22.6 and has been stable since v24.12.0/v25.2.0 — but according to the official docs (nodejs.org/api/typescript.html) it only supports "erasable syntax" and completely ignores tsconfig.json. That means runtime-affecting TypeScript features like enums, namespaces, parameter properties, or path aliases don't work in Node's native mode; those still need third-party tools like tsx or ts-node. Bottom line: for small scripts and simple services, both runtimes largely deliver on the "zero-config TS" promise, but in large codebases that depend on complex tsconfig settings (path mapping, decorators), Node's native mode falls short and needs extra tooling — this is where Bun's experience is more frictionless.
Package Installation and HTTP: Where Is the Speed Real?
According to the official docs, bun install promises installs "up to 25x" faster than npm; the "global virtual store" added in Bun 1.4 also brought a "7x faster installs" improvement — these are two separate claims that shouldn't be conflated (bun.sh/docs/cli/install). In practice, this difference is felt most on cold installs (clean node_modules, empty cache); in CI's warm-cache/lockfile scenarios, the gap with npm/pnpm narrows. On the HTTP side, Bun.serve() has supported native HTTP/2 since v1.4.1 (September 4, 2026) — Node.js's built-in http2 module has existed for years, but Bun's integration is offered under a single API surface (fetch-compatible Request/Response). Synthetic "echo" benchmarks (HTTP response only, no DB/ORM/auth layer) generally put Bun ahead; but once DB+ORM+auth are added to a real production stack (database queries, ORM, auth middleware, logging), the performance gap narrows significantly. Basing capacity planning solely on a synthetic "req/s" figure is misleading — test your own endpoint with your own load profile.
Built-in Tools: Bun's Platform Claim
Bun's most distinctive trait is going beyond the runtime: bun test as a built-in test runner, bun build as a built-in bundler, bun install as a built-in package manager, a built-in shell scripting API, and Bun.WebView (headless browser automation), Bun.Image (image processing), Bun.markdown, and cron APIs added in Bun 1.4 (bun.sh/blog/bun-v1.4, August 20, 2026). This means it comes as a single binary instead of installing jest/webpack/npm/node-cron/puppeteer separately — noticeably reducing the dependency count in small and medium projects. On the Node.js side, the philosophy is the opposite: the core is kept small, and outside minimal built-in tools like node --test, the ecosystem (Jest/Vitest, webpack/esbuild, npm/pnpm, node-cron) is provided by third-party packages. This offers flexibility and mature, independently updated tools but requires more configuration and dependency management. Which is right: in fast prototyping and small teams, Bun's "all-included" approach saves time; in large enterprise projects, the flexibility to choose and swap each layer independently is generally preferred.
Production Deployment, Hosting, and Enterprise Risk
Node.js has had first-class support in the systemd/Docker/PaaS ecosystem continuously since 2009: Vercel, AWS Lambda, Railway, Fly.io, Google Cloud Run — all officially list the Node runtime and update images according to the LTS release calendar. On the Bun side, there is an official, metric-backed production case: the "Production" section of Bun's v1.4 announcement writes, with a chart, that production CPU usage dropped 2× — p99 from 24% to 10%, p50 from 5.8% to 2.5% — at Claude Code, a large, long-running application built on Bun (bun.sh/blog/bun-v1.4). When weighing this, keep in mind the source is Bun's own blog, not an independent third-party audit. Node.js's official LTS model (Active + Maintenance totaling 30 months, with an annual-LTS plan from v27 onward) makes the security patch calendar predictable; on the Bun side, the rapid succession of v1.4 → v1.4.1 → v1.4.2 within two weeks is both evidence of active development and a sign that it hasn't yet settled at the "set and forget" level.
Memory, Cold Start, and Realistic Expectations
Bun's JavaScriptCore foundation provides a measurable advantage in cold start: on Linux, hello.js starts in 5.1 ms on Bun 1.4 versus 27.2 ms on Node.js 26; peak memory is 14.6 MB versus 44.5 MB. On Windows, the same test is 15.5 ms versus 40.1 ms. Under load, in peak memory (1,000,000 requests, 64 connections), fastify is 120 MB on Bun versus 156 MB on Node; Express is 92 MB versus 145 MB; node:http is 81 MB versus 107 MB; Next.js is 285 MB versus 342 MB. In Next.js App Router SSR across 4,000 pages, Bun sits at 238 MB versus Node's 410 MB. There's also a line that flips the table: on the Vite dev server, Bun is 233 MB and Node is 214 MB — there, Node wins. Critical caveat: all of these figures are Bun's own (vendor) measurements, not a neutral third-party benchmark; the measurement conditions may not match your workload exactly. Practical takeaway: for short-lived, frequently restarting workloads (CLI, cron, serverless), Bun's startup advantage is real and large; for long-running API servers with native module dependencies, you should weigh Node's broad native module support and mature ecosystem in its favor.