merjs

The web doesn't need
another JavaScript
framework. It needs
no runtime at all.

vs Next.js — at a glance

Head-to-head on the metrics that matter.

merjs
Next.js
Cold Start
< 5 ms
merjs
Next.js
Throughput
115,093 req/s
merjs
Next.js
Avg Latency
40.86 ms
merjs
Next.js
Binary Size
260 KB
merjs
Next.js
Build Time
~5.1 s
merjs
Next.js

Throughput and latency measured locally on Apple M-series with wrk -t4 -c50. Next.js numbers from CI (GitHub Actions). merjs is an early experiment — Next.js is mature and production-grade. Binary size is the release-stripped native binary (-Doptimize=ReleaseSmall).


01
Node.js solved the wrong problem.

It unified the language, not the stack. You still ship a 400MB runtime to run a hello world. You still wait 30 seconds for npm install. You still debug dependency conflicts that have nothing to do with your product. The problem was never "which language" — it was "why do we need a runtime at all."

02
WASM closes the last gap.

The real reason JS won the server: it already ran in the browser. That moat is gone. WebAssembly is a compile target for any language. Zig compiles to wasm32-freestanding in a single step. Write client logic in Zig, compile to .wasm, ship it directly. No transpiler. No bundler. The browser runs it natively.

03
One language. Two targets.

The server compiles to a native binary. The client compiles to .wasm. File-based routing, SSR, type-safe APIs, hot reload — everything Next.js does, in Zig. Zero node_modules. A single zig build serve.

04
Type safety without a build step.

Validation constraints are comptime. API schemas are Zig structs. JSON serialization is std.json. No codegen. No schema files. No runtime overhead. The compiler catches it, or it doesn't compile.

05
This is early proof.

merjs is a bet — that systems languages, WASM, and file-based routing can meet in one place and produce something better than what we have today. The node_modules folder had a good run. It's time to move on.