zlow

Fast Zig-based polyglot toolkit for the web

One compiler, multiple languages — no Node.js, no JVM, no Gradle in the hot path.

Native binary

One compiler emits a binary directly through zig cc — no Node.js, no JVM, no Gradle in the hot path.

Multiple frontends

TypeScript and Kotlin today, sharing one lowering and backend — not limited to two languages.

No silent wrongness

A construct zlow can't honour is a named, located refusal. Never output that merely looks right.

Verified, not guessed

Every figure on this page comes from a script in this repo, checked against tsc and Kotlin/Native.

11 ms

zod, transpiled

3,181

tsc agrees

182×

faster than Gradle

140×

smaller binary

Numbers

Real, reproducible benchmarks. Run them yourself.

TypeScript: zod, 241 files, 1.7 MB

zlow
11 ms
esbuild
54 ms
bun
56 ms
tsc
1,591 ms
10 ms100 ms1 s
Square-root scale, interleaved rounds — 11 ms and 1,591 ms share no readable linear axis.
Full TypeScript page →

Kotlin: zlow native + zig cc vs. ./gradlew linkReleaseExecutable

zlow
177 ms
gradle
32,223 ms
100 ms1 s10 s
Square-root scale, interleaved rounds — 177 ms and 32.2 s share no readable linear axis.
kernel-app — release build output
zlow-kernel (zig cc -O2 -s)
3.6 KB
gradle-native-kernel-bench.kexe
497.0 KB
Same kernel source, both tools’ own release config: zig cc -O2 -s vs. Kotlin/Native’s linkReleaseExecutableLinuxX64 — both stripped (0 debug sections), both compute the same value.
Full Kotlin page →

API

zlow build src/ --out-dir dist/ --watch
zlow check src/ # type-check only
zlow native . # zlow.json in the current dir

zlow.json: { "language": "kotlin", "entry": "src/main.kt" }. Accepted: Double/Boolean top-level fun,val/var, if/while, arithmetic, calls between functions in the unit. Everything else is a named refusal.

zig build

No silent wrongness, both languages: a construct zlow cannot honour is a named, located error with nothing written — never output that merely looks right.