Benchmarks

Comprehensive performance comparison of Manic vs other React frameworks.

Framework Benchmarks

Manic is purpose-built for maximum performance. These benchmarks compare Manic against leading React frameworks using identical test cases.

Test Environment

ToolVersion
Bun1.3.5+
OSmacOS (Apple Silicon)

Frameworks Tested

FrameworkVersionType
ManiclatestBun-native SPA framework
Next.js16.xFull-stack React framework
Vite7.xBuild tool + React
Astro5.xStatic site generator
React Router7.xFull-stack React (Remix)

Dev Server Startup Time

Time from running dev command to server ready.

Initializing diagram...
FrameworkStartup TimeRelative to Manic
Manic26ms1x (baseline)
Astro164ms6.3x slower
Vite386ms14.8x slower
React Router~400ms~15.4x slower
Next.js1,098ms42.2x slower

Why Manic is Faster

Documented development responsibilities for Vite 7.x and Next.js 16.x below follow the wording on the cited pages. Diagrams show a conceptual order where docs imply sequencing (for example Vite’s first-run pre-bundle before loading the site locally); they are not meant as byte-accurate timelines—internals can overlap or repeat work.

Initializing diagram...

Sources (fact-check):

Manic starts faster because:

  1. Bun's native serve — The dev server is Bun.serve, not a Node script bootstrapping a bundler daemon.
  2. OXC end-to-end — JSX/TS stripping, lint, format, and minify share one Rust parser and AST (oxc-transform, oxlint, oxc-minify). There is no chain of separate tools round-tripping text between processes.
  3. Minimal runtime — No webpack, Vite, or Turbopack process to initialize before your app runs.

Why Turbopack can still carry webpack-era cost. Next’s Turbopack documents a turbopack.rules surface for webpack loaders executed through a subset of the webpack loader API (next.config turbopack). Real apps often depend on loaders, aliases, or fallback to next dev --webpack, all of which keep the overall dev path heavier than a Bun-and-OXC SPA that never emulates webpack.

Why Bun + OXC stays fast. Manic keeps the critical path narrow: Bun owns HTTP and Bun.build owns graphs and hashing; oxc-transform plugs in as the JSX/TS compiler. Production minification runs through oxc-minify in parallel over outputs. Fewer processes, fewer serialized handoffs, and no emulation layer for webpack loaders—so cold dev startup and builds skew lighter than stacks juggling Node entrypoints plus a compatibility-oriented bundler.


Production Build Time

Time for complete production build.

FrameworkBuild TimeRelative to Manic
Manic1.8s1x (baseline)
Astro3.7s2.0x slower
Vite6.1s3.3x slower
React Router8.2s4.5x slower
Next.js25.5s14.0x slower

Build Breakdown (Manic)

Initializing diagram...

Production parallelism (Manic). Bundling runs mostly in order: oxlint → route manifest → Bun.build clienteach API route (Bun.build per entry, sequentially in the CLI) → Bun.build server. Then Promise.all runs oxc-minify over dist/client, dist/api (if present), and server.js at the same time — and inside each folder, .js files are minified concurrently (packages/manic/src/cli/commands/build.ts).

Initializing diagram...

The actual bundling is ~300ms. The rest is process startup overhead that scales poorly with more code in other frameworks.


Build Output Size

Size of production build directory.

FrameworkOutputSizeNotes
Astrodist/20KBStatic HTML only
Vitedist/212KBClient-only SPA
React Routerbuild/372KBClient + Server
Manic.manic/2.5MBFull bundle (unminified)

Output Composition (Manic)

Approximate layout after manic build (exact chunk names are hashed):

index.html
main-[hash].js
server.js

Typical sizes from this benchmark run: client bundle ~1.99MB (before CDN gzip), API + server.js add the remainder of the .manic/ total (~2.5MB unminified in the table above).


Dependencies

FrameworkPackage Countnode_modules Size
Manic39138MB
Vite124108MB
React Router151116MB
Astro258165MB
Next.js286405MB

Why Fewer Dependencies

Manic uses Bun's native APIs instead of external packages:

FeatureOther FrameworksManic
HTTP Serverexpress/ElysiaBun.serve
Bundlerwebpack/vite/rollupBun.build
Minifierterser/esbuildoxc-minify
Testingjest/vitestbun test
Package Managernpm/yarnbun install

Summary Comparison

MetricNext.jsViteAstroReact RouterManicWinner
Dev Startup1,098ms386ms164ms~400ms26msManic
Build Time25.5s6.1s3.7s8.2s1.8sManic
Dependencies28612425815139Manic

When to Choose Manic

Choose Manic when:

  • Maximum DX speed is critical
  • Bun runtime is acceptable
  • Client-side SPA (no SSR needed)
  • Full-stack with Hono API routes

Choose Next.js when:

  • SSR is required
  • Largest ecosystem needed
  • Enterprise support needed

Choose Astro when:

  • Content-focused static site
  • Minimal JavaScript output

Choose Vite when:

  • Quick prototyping
  • Simple React SPA

Running Benchmarks

# Navigate to testbench
cd testbench

# Dev server startup
bun run dev    # Watch for "Ready in Xms"

# Build benchmarks  
time bun run build

# Check output sizes
du -sh .manic

Notes

  • Timings are averages across multiple runs
  • Results may vary ±10-20%
  • Cold starts vs warm starts differ
  • Network doesn't affect local benchmarks

On this page