Getting Started

Build HTTP servers with web standard APIs like fetch, Request, and Response.

Quick Start (CLI)

Create a server entry:

server.ts
export default {
  fetch(req: Request) {
    return Response.json({ hello: "world!" });
  },
};

Then, run the server using your favorite runtime:

npx srvx
Read more in Using CLI.
You can also try examples in the online playground

Quick Start (API)

Instead of using the srvx CLI, you can directly import the serve method to define a self-listening server entry.

Create a server entry:

server.ts
import { serve } from "srvx";

const server = serve({
  fetch(request) {
    return Response.json({ hello: "world!" });
  },
});

Install srvx as a dependency:

npm i srvx

Then, run the server using your favorite runtime:

node server.mjs

TypeScript

srvx ships self-contained types: they reference no runtime type packages, so tsc passes with only @types/node (or none at all) and without skipLibCheck, whichever runtime you target.

Runtime objects such as server.bun?.server, server.deno?.server, request.runtime?.cloudflare?.context or request.runtime?.awsLambda?.event are described by minimal interfaces covering what srvx itself uses. They accept the official types, so passing a real Bun.Server or Lambda event still type checks. To reach the full surface of a runtime object, install that runtime's type package and cast:

import type { Server } from "bun";

const bunServer = server.bun?.server as Server | undefined;
bunServer?.publish("channel", "hello");

To type Cloudflare Workers bindings, augment CloudflareEnv:

The declare module block only augments CloudflareEnv in a file that is a module. In a standalone .d.ts with no imports or exports it would declare a whole new srvx module instead, so add export {} there.

import { serve } from "srvx";

declare module "srvx" {
  interface CloudflareEnv {
    MY_KV: KVNamespace;
  }
}

serve({
  fetch: (request) => {
    const kv = request.runtime?.cloudflare?.env.MY_KV;
    // ...
  },
});

Starter Examples

ExampleSourceTry
aws-lambdaexamples/aws-lambdanpx giget gh:h3js/srvx/examples/aws-lambda srvx-aws-lambda
elysiaexamples/elysianpx giget gh:h3js/srvx/examples/elysia srvx-elysia
expressexamples/expressnpx giget gh:h3js/srvx/examples/express srvx-express
fastifyexamples/fastifynpx giget gh:h3js/srvx/examples/fastify srvx-fastify
h3examples/h3npx giget gh:h3js/srvx/examples/h3 srvx-h3
hello-worldexamples/hello-worldnpx giget gh:h3js/srvx/examples/hello-world srvx-hello-world
honoexamples/hononpx giget gh:h3js/srvx/examples/hono srvx-hono
jsxexamples/jsxnpx giget gh:h3js/srvx/examples/jsx srvx-jsx
node-handlerexamples/node-handlernpx giget gh:h3js/srvx/examples/node-handler srvx-node-handler
service-workerexamples/service-workernpx giget gh:h3js/srvx/examples/service-worker srvx-service-worker
streamingexamples/streamingnpx giget gh:h3js/srvx/examples/streaming srvx-streaming
tracingexamples/tracingnpx giget gh:h3js/srvx/examples/tracing srvx-tracing
websocketexamples/websocketnpx giget gh:h3js/srvx/examples/websocket srvx-websocket