Alpha

A secure, standards-based server runtime.

V8-based ECMAScript runtime, WinterTC-compliant, I/O-injectable, capability-secured.

import { serve } from "runtime:http";

const server = serve({ port: 8080 }, (req) => {
  return new Response("👋 Hello from ESRun!");
});

const { hostname, port } = await server.addr;
console.log(`listening on http://${hostname}:${port}`);

Benchmarks

HTTP requests/sec · Hono hello-worldhigher is better
Deno
82.4k / 86MB
Bun
137.6k / 48MB
esrun
61.9k / 46MB
Node.js
79.0k / 154MB
Cold startlower is better
esrun
7.1ms / 20MB
Bun
9.2ms / 30MB
Node.js
17.4ms / 41MB
Deno
24ms / 54MB
LLRT
3.3ms / 11MB
Peak memorylower is better
esrun
20MB
Bun
30MB
Node.js
41MB
Deno
54MB
LLRT
11MB
WebCryptolower is better
esrun
32.3ms / 32MB
Bun
83.6ms / 45MB
Node.js
188.9ms / 56MB
Deno
140.3ms / 67MB
LLRT
24.9ms / 11MB
SubtleCrypto SHA-256lower is better
esrun
340.1ms / 29MB
Bun
456.9ms / 48MB
Node.js
574.1ms / 56MB
Deno
501.2ms / 69MB
LLRT
335.2ms / 11MB
fetch (local server)lower is better
esrun
37ms / 32MB
Bun
19ms / 41MB
Node.js
88.5ms / 87MB
Deno
34.3ms / 64MB
LLRT
18.3ms / 13MB
setTimeout churnlower is better
esrun
5.2ms / 32MB
Bun
8ms / 38MB
Node.js
6.1ms / 60MB
Deno
23.9ms / 80MB
LLRT
3.8ms / 18MB
ReadableStream pipinglower is better
esrun
9.6ms / 37MB
Bun
20.3ms / 77MB
Node.js
22.7ms / 59MB
Deno
14.6ms / 70MB
LLRT
async/await throughputlower is better
esrun
29.6ms / 33MB
Bun
49.3ms / 73MB
Node.js
58.8ms / 53MB
Deno
32.6ms / 66MB
LLRT
682.3ms / 11MB
File read (small)lower is better
esrun
45ms / 37MB
Bun
34.4ms / 46MB
Node.js
125ms / 56MB
Deno
41ms / 64MB
LLRT
File read (large)lower is better
esrun
0.6ms / 89MB
Bun
8.2ms / 63MB
Node.js
21.2ms / 94MB
Deno
23.6ms / 109MB
LLRT
File write (small)lower is better
esrun
78.7ms / 28MB
Bun
12.3ms / 41MB
Node.js
182.5ms / 56MB
Deno
87ms / 64MB
LLRT
File write (large)lower is better
esrun
21.1ms / 27MB
Bun
18.1ms / 42MB
Node.js
56.7ms / 92MB
Deno
40ms / 103MB
LLRT
File append (small)lower is better
esrun
33.4ms / 28MB
Bun
34.2ms / 41MB
Node.js
107.7ms / 56MB
Deno
41.6ms / 64MB
LLRT
File append (large)lower is better
esrun
14.5ms / 37MB
Bun
19.8ms / 42MB
Node.js
47.1ms / 93MB
Deno
30.9ms / 103MB
LLRT
File stat (small)lower is better
esrun
74ms / 29MB
Bun
54.4ms / 43MB
Node.js
72.7ms / 48MB
Deno
95.9ms / 62MB
LLRT
File exists (small)lower is better
esrun
58ms / 28MB
Bun
56.9ms / 45MB
Node.js
74ms / 50MB
Deno
95.7ms / 62MB
LLRT
Glob scanlower is better
esrun
51.5ms / 30MB
Bun
32.6ms / 55MB
Node.js
215.8ms / 68MB
Deno
LLRT
JSON parse/stringifylower is better
esrun
190.8ms / 48MB
Bun
203.1ms / 93MB
Node.js
278.2ms / 79MB
Deno
205.3ms / 79MB
LLRT
652.2ms / 11MB
JSON (large documents)lower is better
esrun
598.2ms / 153MB
Bun
619.5ms / 163MB
Node.js
681ms / 157MB
Deno
536.1ms / 162MB
LLRT
1865.1ms / 139MB
URL parsinglower is better
esrun
87.1ms / 41MB
Bun
76.3ms / 94MB
Node.js
48.4ms / 63MB
Deno
101.6ms / 73MB
LLRT
113.1ms / 11MB
TextEncoder/TextDecoderlower is better
esrun
70.3ms / 42MB
Bun
23ms / 64MB
Node.js
69.7ms / 64MB
Deno
70ms / 76MB
LLRT
73.1ms / 11MB
base64 (atob/btoa)lower is better
esrun
29.4ms / 32MB
Bun
14.2ms / 65MB
Node.js
7.1ms / 53MB
Deno
7.5ms / 66MB
LLRT
32.9ms / 11MB
structuredClonelower is better
esrun
311.5ms / 35MB
Bun
262.4ms / 88MB
Node.js
223.4ms / 54MB
Deno
262.3ms / 68MB
LLRT
326.4ms / 12MB
Tight compute looplower is better
esrun
236.1ms / 31MB
Bun
110.5ms / 40MB
Node.js
194.2ms / 53MB
Deno
211.5ms / 64MB
LLRT
2027.2ms / 11MB
Parse + run ~100 KBlower is better
esrun
18.2ms / 21MB
Bun
20.7ms / 33MB
Node.js
29.2ms / 40MB
Deno
32.4ms / 55MB
LLRT
11.2ms / 11MB
Cold startlower is better
esrun
7.1ms / 20MB
Bun
9.2ms / 30MB
Node.js
17.4ms / 41MB
Deno
24ms / 54MB
LLRT
3.3ms / 11MB
Peak memorylower is better
esrun
20MB
Bun
30MB
Node.js
41MB
Deno
54MB
LLRT
11MB
WebCryptolower is better
esrun
32.3ms / 32MB
Bun
83.6ms / 45MB
Node.js
188.9ms / 56MB
Deno
140.3ms / 67MB
LLRT
24.9ms / 11MB
SubtleCrypto SHA-256lower is better
esrun
340.1ms / 29MB
Bun
456.9ms / 48MB
Node.js
574.1ms / 56MB
Deno
501.2ms / 69MB
LLRT
335.2ms / 11MB
fetch (local server)lower is better
esrun
37ms / 32MB
Bun
19ms / 41MB
Node.js
88.5ms / 87MB
Deno
34.3ms / 64MB
LLRT
18.3ms / 13MB
setTimeout churnlower is better
esrun
5.2ms / 32MB
Bun
8ms / 38MB
Node.js
6.1ms / 60MB
Deno
23.9ms / 80MB
LLRT
3.8ms / 18MB
ReadableStream pipinglower is better
esrun
9.6ms / 37MB
Bun
20.3ms / 77MB
Node.js
22.7ms / 59MB
Deno
14.6ms / 70MB
LLRT
async/await throughputlower is better
esrun
29.6ms / 33MB
Bun
49.3ms / 73MB
Node.js
58.8ms / 53MB
Deno
32.6ms / 66MB
LLRT
682.3ms / 11MB
File read (small)lower is better
esrun
45ms / 37MB
Bun
34.4ms / 46MB
Node.js
125ms / 56MB
Deno
41ms / 64MB
LLRT
File read (large)lower is better
esrun
0.6ms / 89MB
Bun
8.2ms / 63MB
Node.js
21.2ms / 94MB
Deno
23.6ms / 109MB
LLRT
File write (small)lower is better
esrun
78.7ms / 28MB
Bun
12.3ms / 41MB
Node.js
182.5ms / 56MB
Deno
87ms / 64MB
LLRT
File write (large)lower is better
esrun
21.1ms / 27MB
Bun
18.1ms / 42MB
Node.js
56.7ms / 92MB
Deno
40ms / 103MB
LLRT
File append (small)lower is better
esrun
33.4ms / 28MB
Bun
34.2ms / 41MB
Node.js
107.7ms / 56MB
Deno
41.6ms / 64MB
LLRT
File append (large)lower is better
esrun
14.5ms / 37MB
Bun
19.8ms / 42MB
Node.js
47.1ms / 93MB
Deno
30.9ms / 103MB
LLRT
File stat (small)lower is better
esrun
74ms / 29MB
Bun
54.4ms / 43MB
Node.js
72.7ms / 48MB
Deno
95.9ms / 62MB
LLRT
File exists (small)lower is better
esrun
58ms / 28MB
Bun
56.9ms / 45MB
Node.js
74ms / 50MB
Deno
95.7ms / 62MB
LLRT
Glob scanlower is better
esrun
51.5ms / 30MB
Bun
32.6ms / 55MB
Node.js
215.8ms / 68MB
Deno
LLRT
JSON parse/stringifylower is better
esrun
190.8ms / 48MB
Bun
203.1ms / 93MB
Node.js
278.2ms / 79MB
Deno
205.3ms / 79MB
LLRT
652.2ms / 11MB
JSON (large documents)lower is better
esrun
598.2ms / 153MB
Bun
619.5ms / 163MB
Node.js
681ms / 157MB
Deno
536.1ms / 162MB
LLRT
1865.1ms / 139MB
URL parsinglower is better
esrun
87.1ms / 41MB
Bun
76.3ms / 94MB
Node.js
48.4ms / 63MB
Deno
101.6ms / 73MB
LLRT
113.1ms / 11MB
TextEncoder/TextDecoderlower is better
esrun
70.3ms / 42MB
Bun
23ms / 64MB
Node.js
69.7ms / 64MB
Deno
70ms / 76MB
LLRT
73.1ms / 11MB
base64 (atob/btoa)lower is better
esrun
29.4ms / 32MB
Bun
14.2ms / 65MB
Node.js
7.1ms / 53MB
Deno
7.5ms / 66MB
LLRT
32.9ms / 11MB
structuredClonelower is better
esrun
311.5ms / 35MB
Bun
262.4ms / 88MB
Node.js
223.4ms / 54MB
Deno
262.3ms / 68MB
LLRT
326.4ms / 12MB
Tight compute looplower is better
esrun
236.1ms / 31MB
Bun
110.5ms / 40MB
Node.js
194.2ms / 53MB
Deno
211.5ms / 64MB
LLRT
2027.2ms / 11MB
Parse + run ~100 KBlower is better
esrun
18.2ms / 21MB
Bun
20.7ms / 33MB
Node.js
29.2ms / 40MB
Deno
32.4ms / 55MB
LLRT
11.2ms / 11MB
See full benchmarks →

Why ES-Runtime?

Standard web APIs

fetch, URL, URLPattern, streams, WebCrypto, encoding, timers, and events — the WinterTC Minimum Common Web Platform API. What you learn here is what runs in the browser.

Batteries in the binary

HTTP and WebSocket servers, filesystem, sockets, subprocesses, WASM/WASI, and XML, YAML, TOML, JSONL, MessagePack, and Protobuf parsers — all behind runtime: imports, nothing to install.

ESM everywhere

Static imports, dynamic import(), top-level await, import.meta, and JSON modules. One module system, no CommonJS interop rules to learn.

Written in Rust

The runtime around the engine is safe Rust: no data races, no use-after-free, no buffer overruns to reach for under hostile input.

Powered by V8

The engine behind Chrome and Node.js, embedded from Rust. A baked startup snapshot opens a full realm in about 7 ms.

Embeddable & capability-gated

The library form is deny-by-default — the host grants exactly the powers code needs — and its event loop has no owned thread: tick it from your own.

Simple Runtime Architecture

How your JavaScript code interacts with the system.

V8

JavaScript

Executes your JS/ESM code at lightning speed.

Op Layer

Drives the event loop and low-cost boundary calls.

Runtime Modules

Standard Web APIs like fetch, crypto, and streams.

OS Level

Kernel networking, file system, and raw system I/O.

A focused scope.

A runtime, not a toolchain — and not a Node.js drop-in. Package management, building, and testing are left to other tools.

Read the scope & non-goals →
  • Node.js compatibility
  • CommonJS
  • TypeScript
  • JSX
  • Package installer
  • Bundler / linter / formatter
  • Test runner
  • Watch mode
  • FFI
  • Workers
  • Native addons

Ship a runtime you can trust.

Standard Server Runtime

A standard-based, full-capability, fast and optimal runtime for general workloads.

Embeddable Engine

Embedded for ultimate control & untrusted code execution. Inject standard APIs or create your own custom capabilities from Rust.