Performance model

Why Manic is fast architecturally, how that differs from typical JS bundlers, and where benchmarks vs caveats apply.

Performance model

Manic optimizes for time-to-first-byte in dev, wall-clock production builds, and small serverless/API graphs. Concrete numbers live in Framework benchmarks (fixture descriptions, hardware, and methodology are listed there — treat them as representative, not universal).


Architectural advantages

Initializing diagram...
LayerManic choiceTypical effect
RuntimeBun.serve, Bun.spawn, Bun.build, Bun.GlobFewer processes, lower startup overhead than Node-based CLI stacks
Transform / lint / minifyOXC (Rust) across stagesShared semantics; avoids shipping AST across unrelated tools
Dev serverbun --watch ~manic.ts + on-demand transformNo separate dev-bundler process wrapping webpack/vite
Route loadingBuild-time manifest + lazy import() per routeBrowser downloads only visited route graphs
API packagingOne Bun.build entry per app/api/**/index.tsSmaller deploy units vs monolithic API bundles

Compared conceptually

DimensionManicVite / Rollup ecosystemsNext.js-class stacks
Bundler ownershipBun.build onlyOwn bundler graph + pluginsMultiple compilers + caching layers
JS transformoxc-transform via BunPluginUsually esbuild/swc + pluginsSWC/Turbopack/webpack mixes
Lint gateoxlint before manic buildSeparate toolingMixed (eslint-next, etc.)
SSR modelSPA + optional fullstack Hono APIVariesDeep framework runtime

Why benchmarks show large gaps (usually)

When benchmarks show Manic finishing dev startup or production builds faster, the dominant factors tend to be:

  1. Less process nestingmanic dev ultimately runs one watched Bun server, not a Node parent supervising a Rust/Webpack child graph.
  2. OXC throughput — transform + minify + lint share one toolchain tuned for batch speed.
  3. Fewer intermediate artifacts — production pipeline writes directly to <outdir> without framework-owned incremental caches (trade-off: fewer incremental shortcuts vs giant repos).

What “fast” does not guarantee

TopicReality
tsc --noEmitManic transforms strip types — typechecking is separate work your CI should still run
Cold cachesFirst build after deleting node_modules or /.manic pays full discovery + bundle cost everywhere
Massive appsThousands of routes still mean thousands of lazy chunks — browser concurrency limits apply
Plugin costHeavy build() plugins can dominate wall time regardless of bundler

Operational knobs

KnobEffect
build.minify: falseSkip oxc-minify rewrite pass — faster iteration when debugging output
mode: 'frontend'Skips API Bun.build subtree entirely
server.hmrToggle Fast Refresh injection path (oxc.refresh)

See also

On this page