# Getting Started

> Build web-standard servers with context-based handlers, middleware, and runtime adapters.

## Install

<pm-install name="sevo"></pm-install>

## Quick Start

Create a server entry:

```ts [server.ts]
import { serve } from "sevo";
import { NodeRuntimeAdapter } from "sevo/node";

serve({
  adapter: new NodeRuntimeAdapter(),
  fetch() {
    return Response.json({ hello: "world" });
  },
});
```

Run it with Node.js:

```bash
node --experimental-strip-types server.ts
```

## Quick Start with CLI

Create a default entry file:

```ts [server.ts]
export default {
  fetch() {
    return new Response("Hello from sevo");
  },
};
```

Then run:

<pm-x command="sevo"></pm-x>

Or after installation, run the installed binary directly:

```bash
sevo
```

The CLI will look for common entry names such as:

- `server.ts`
- `server.mjs`
- `src/server.ts`
- `src/server.mjs`

If your entry uses another name or extension, pass it explicitly:

```bash
sevo --entry ./server.tsx --import jiti/register
```

<read-more title="Using the CLI" to="/guide/cli"></read-more>

## Runtime Adapters

`sevo` keeps request handling runtime-agnostic. You provide an adapter for the
host environment you want to run on.

- `sevo/node`
- `sevo/bun`
- `sevo/deno`
- `sevo/stream`

## Main Exports

```ts
import {
  Server,
  ServerServeEvent,
  ServerCloseEvent,
  ServerErrorEvent,
  serve,
  createContextKey,
} from "sevo";
import { log } from "sevo/log";
import { serveStatic } from "sevo/static";
import { StreamRuntimeAdapter } from "sevo/stream";
```

## Examples

The repository includes runnable examples under [`examples/`](https://github.com/hornjs/sevo/tree/main/examples){rel="[\"nofollow\"]"}:

- `examples/basic/node.ts`
- `examples/basic/bun.ts`
- `examples/basic/deno.ts`
- `examples/basic/stream.ts`
- `examples/jsx/server.tsx`
