Head-to-head on the metrics that matter.
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).
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."
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.
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.
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.
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.