"Bun runs your .ts files. Deno does too. No compile step. No tsc."
What they are
Bun (bun.sh) — JavaScript runtime built on JavaScriptCore. Drop-in replacement for Node for many use cases, with built-in TypeScript support, fast startup, and a comprehensive standard library. bun run script.ts just works.
Deno (deno.com) — JavaScript/TypeScript runtime built on V8. Security-first (explicit permission model), TS-native, built-in linter/formatter/test runner. deno run script.ts just works.
Both eliminate the .ts → .js compile step. The runtime handles transpilation internally on import; you ship .ts files directly. The reduction in tooling is significant for scripts, CLIs, and small services.
Type checking still matters
Both Bun and Deno transpile-but-don't-typecheck by default — they strip the types and run the JavaScript. To run type checks, you still want tsc --noEmit (or in Deno, deno check). The performance trade-off is: transpile fast at runtime, type-check separately when needed.
When to use which
Bun for Node-compatible projects that want speed and simplicity. Npm packages work, the standard library is rich, the dev experience is unified (test runner, bundler, package manager all built in).
Deno when you value the security model (explicit --allow-net, --allow-read, etc.), prefer Web Standards (Deno uses URL imports and Fetch by default), or want a tighter standard library.
Node + tsc + bundler when you need a specific Node version, a specific Node-only library, or are working in a large existing codebase where switching cost outweighs benefit.