Quick Verdict
Three viable JavaScript runtimes for a TypeScript SaaS boilerplate in 2026:
- Node 22 LTS — the safe default. Largest ecosystem, broadest deployment support, most boilerplate compatibility. The right pick when "ecosystem fit" matters more than benchmarks.
- Bun 1.x — fastest cold-starts, fastest install, drop-in for most Node code. The right pick for new projects, monorepos, and CLI-heavy boilerplates.
- Deno 2 — secure-by-default, npm-compatible since v2, JSR-native. The right pick when you want clean TypeScript ergonomics and don't need niche Node-only packages.
For a brand-new SaaS in 2026: Bun for the dev loop and CLI, Node for production deploy is the most common pragmatic answer. Pure-Bun production is now realistic for most apps; Deno production is realistic if your dependency graph is friendly.
Key Takeaways
- All three run modern TypeScript, ESM, and most npm packages.
- Node 22 LTS has the longest support window (Active LTS through 2025, Maintenance through 2027) and the broadest hosting story.
- Bun 1.x has stable APIs and is now the default in many premium boilerplates'
package.jsonpackageManagerfield. - Deno 2 unblocked npm compatibility and is finally a credible alternative for production SaaS, not just scripts.
Decision Table
| Scenario | Pick |
|---|---|
| Existing boilerplate (ShipFast, Makerkit, T3) | Node 22 LTS |
| New monorepo greenfield SaaS | Bun 1.x |
| CLI tool / script-heavy boilerplate | Bun or Deno |
| Edge-deployed app | Cloudflare Workers runtime (separate question) |
| Strict security posture, permission-based execution | Deno 2 |
| Rails/Java-style "boring is good" pick | Node 22 LTS |
| Long-running workers + heavy npm deps | Node 22 LTS |
What Has Actually Changed
The 2024–2025 stretch closed most of the gaps that previously made non-Node runtimes risky for production:
- Bun 1.x stabilized: SQLite built-in, native HTTP server, Bun Test, package manager that works on all the popular monorepo layouts. Most npm modules just work.
- Deno 2 ships full npm compatibility —
deno add npm:reactworks. The DSL-feel that put people off in 2022 is now optional. - Node 22 ships native TypeScript stripping (no transpiler needed for most app code), built-in
--watchmode, nativefetch, and thenode --runscript runner.
The "non-Node is too rough" objection is dated. The remaining tradeoffs are about ecosystem depth, hosting reach, and team familiarity.
Node 22 LTS
Pricing: Free.
Fit: Default for any production SaaS. Universal hosting (Vercel, Railway, Render, Fly, Cloud Run, AWS Lambda, Kubernetes — all first-class).
What's new since the 20.x line:
- Native TypeScript stripping (
node --experimental-strip-types). - Built-in
node --watchfor dev-loop reload. - WebSocket client built-in.
- Stable test runner (
node:test), assertion library, and reporters. - Performance: V8 upgrades, faster startup, better stream throughput.
Where it bites:
- Native TS support strips types but doesn't compile decorators or
enums — pair with tsc or swc for those. - Slower install times than Bun (npm/pnpm/yarn all lag bun install).
- Worker thread ergonomics still rougher than the others.
For most premium boilerplates (ShipFast, Makerkit, Supastarter), Node 22 is the assumed runtime; everything else is a swap.
Bun 1.x
Pricing: Free, MIT.
Fit: Greenfield monorepo SaaS. Boilerplates with heavy CLI tooling, scripts, or test workloads. Backends built on Hono / Elysia. Anywhere bun install (3–10x faster than npm) saves real time.
What you get:
- All-in-one: runtime, package manager, bundler, test runner, formatter (lite).
- Drop-in Node API compatibility for ~95% of common modules.
- Built-in SQLite, password hashing, cookies, FormData.
- Bun.serve — HTTP/WebSocket server faster than Node's defaults.
- Bun Test — Vitest-compatible runner with snapshot, mock, coverage.
// Bun-native HTTP server
Bun.serve({
port: 3000,
routes: {
'/api/health': new Response('ok'),
'/api/users/:id': req => Response.json({ id: req.params.id }),
},
});
Where it bites:
- Some Node-specific packages (older AWS SDK v2, native modules without prebuilds) still trip Bun.
- Hosting reach: Vercel, Railway, Render, Fly, Cloud Run support Bun in 2026, but Lambda support is via custom runtime.
- Bun's bundler is fast but has rougher edges than esbuild for tricky configs.
For Bun-native boilerplates, see the best Bun + Hono SaaS starter kits and Elysia Bun boilerplates.
Deno 2
Pricing: Free, MIT.
Fit: Boilerplates that lean on web standards (fetch, URL, Headers), security-conscious teams (per-task permissions), and JSR-published packages. Edge functions on Deno Deploy.
What you get:
- npm compatibility —
deno add npm:next,import express from 'npm:express'. - Permission flags —
deno run --allow-net=api.example.com server.tsenforces network boundaries. - JSR (JavaScript Registry) — typed, multi-runtime, transparent metadata.
- Built-in test runner, formatter, linter, language server.
- First-class TypeScript without transpiler.
import { serve } from 'https://deno.land/std/http/server.ts';
serve(req => new Response('hello'), { port: 3000 });
Where it bites:
- Some Node-specific packages assume
process.env, dynamicrequire, or NodeBuffersemantics in ways Deno's compatibility layer doesn't fully replicate. - Hosting outside Deno Deploy is improving (Docker images everywhere; Lambda via custom runtime) but isn't as ubiquitous as Node.
- Smaller boilerplate adoption than Node or Bun.
Performance Snapshot
Rough HTTP request/sec on a typical hello-world server (single-process, no framework):
- Bun: ~115k req/s
- Deno 2: ~85k req/s
- Node 22 (built-in fetch + http.createServer): ~70k req/s
Cold start of a typical SaaS boilerplate (Next.js dev mode):
- Bun: ~1–1.5 seconds
- Deno 2: ~2 seconds
- Node 22: ~2.5–3 seconds
Install time on a typical 800-package Next.js + Drizzle + ai-sdk monorepo:
- bun install: 3–6 seconds
- pnpm install: 12–20 seconds
- deno install: 8–15 seconds
These numbers vary; the headline is that Bun's dev-loop story is meaningfully faster, while runtime perf differences between the three are small enough that they rarely drive the decision.
Hosting Compatibility
| Host | Node 22 | Bun 1 | Deno 2 |
|---|---|---|---|
| Vercel | ✅ | ✅ | ✅ via custom |
| Railway | ✅ | ✅ | ✅ |
| Render | ✅ | ✅ | ✅ |
| Fly.io | ✅ | ✅ | ✅ |
| Cloud Run | ✅ | ✅ | ✅ |
| AWS Lambda | ✅ | Custom runtime | Custom runtime |
| Cloudflare Workers | n/a | n/a | n/a (different runtime) |
| Deno Deploy | ❌ | ❌ | ✅ |
Node still wins on universality. Bun caught up enough that production deploys are routine. Deno is fine but constrained to fewer providers without packaging effort.
Boilerplate Adoption
| Boilerplate | Default runtime |
|---|---|
| ShipFast | Node |
| Makerkit | Node (Bun supported) |
| Supastarter | Node |
| T3 Stack | Node |
| Indie Kit | Node (Bun supported) |
| Most Hono / Elysia kits | Bun |
| Encore.ts kits | Node + Encore runtime |
Most premium boilerplates list Bun as the recommended packageManager even when production runs on Node. The dev-loop benefit is real; the deploy story sticks with Node.
For broader backend-runtime context, see Encore.ts vs Hono vs Elysia.
Migration Notes
- Node → Bun (greenfield): just
bun init— most code is identical. Edge cases:__dirnamein ESM (Bun supports it; "modern" Node ESM doesn't),import.meta.dir(Bun extension). - Node → Bun (existing boilerplate): usually trivial for the runtime swap; the bundler swap is more work if you want Bun.build.
- Node → Deno: heavier —
deno.jsoninstead ofpackage.json(or use the npm: specifier), permission flags everywhere. - Bun → Node: easy in reverse if you avoid Bun-specific APIs (
Bun.serve,Bun.password,Bun.file).
What to Pick
- You want the safest production deploy → Node 22 LTS.
- You're starting fresh and want the fastest dev loop → Bun for dev, decide on deploy by host support.
- You ship to AWS Lambda heavily → Node 22.
- You want strict permission boundaries baked into the runtime → Deno 2.
- Your boilerplate is Hono- or Elysia-native → Bun.
For a typical 2026 SaaS boilerplate path: bun install + bun run dev locally, deploy to Vercel/Railway with Node. You get Bun's speed without betting your production on it.
FAQ
Can my premium SaaS boilerplate run on Bun? Probably yes — most do today. Check the README and CI for explicit Bun support; if absent, expect a small package compatibility chase.
Does Next.js officially support Bun? Yes — bun run next dev and bun run next build work. Some plugins assume Node process.binding quirks; verify your specific plugins.
What about pnpm vs Bun for monorepos? Both are excellent. Bun's workspace handling is solid in 1.x; pnpm is more battle-tested for very large monorepos. See the best monorepo boilerplates for repo-shaped guidance.
Will Node 22 LTS still matter in 2027? Maintenance LTS through April 2027. By then Node 24 LTS will be the active line. The ecosystem gravity isn't shifting.
If you're deciding the broader stack, see the ideal tech stack for SaaS in 2026 for how runtime choice fits with framework, ORM, and hosting decisions.