V8-based ECMAScript runtime for the server. WinterTC-compliant, 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}`);
Tests with DOM parity, real-browser runs, watch, HMR, plugins.
A Rust core around V8, scripted in JavaScript and TypeScript.
Choosing a runtime? How esrun compares to Node.js, Bun and Deno →
Durable workers: addressable state that outlives the process.
Calls to one worker queue and run in order, so two customers cannot both take the last item. No lock to take, no row to contend for.
A result is released only after the writes behind it have committed. A crash is a call that never returned, never one that returned a lie.
An alarm is stored beside the state and runs after a restart: retries, abandoned carts, a nightly roll-up, without a scheduler service.
State lives in embedded SQLite, one file per worker, under the same read and write grants as everything else. No Redis, no queue, no database server.
Killed with SIGKILL under load, the example shop loses no order it acknowledged.
Plaintext hello-world over loopback, driven by oha at 100 connections — best of three runs. Elysia is measured on the esdev bundle every runtime serves (esrun is ESM-only), and Node serves both frameworks through the same @hono/node-server glue, so the delta is route handling, not the adapter. How it is measured →
A run reaches what the command line named, and nothing else.
Eleven capabilities: read, write, imports, net, listen, env, run, signals, workers, diagnostics, diagnostics-detail. The gate is the op, not the import.
esrun runs your service and nothing else — no watcher, no debugger port, no transform. That narrowness is what a capability flag is worth.
esdev pays for it on your machine: same runtime, same flags, plus the toolchain to get there.
esdev, not in productionInstall both binaries with one command, and run your first module. Standards-based, fast, ESM-only.
Nothing is granted unless the command line says so. Build the deploy line that states exactly what your service may touch.