Skip to Content
Drash v3 is in beta. APIs may change.

Better web apps
without the framework tax

Built for people. Programmable by agents. Native to the web.

app.js
class Home extends Resource {
  paths = ["/"];

  GET(request) {
    return new Response("Oh so easy");
  }
}

const app = Application
  .builder()
  .resources(Home)
  .build();

// Your runtime owns the socket.
createServer((request, response) => {
  return app.handle({
    url: `http://localhost:1447${request.url}`,
    method: request.method,
    request,
    response,
  });
}).listen(1447);

Runtime agnostic

Drash runs with Deno.serve, node:http, Bun.serve, and a Cloudflare Worker fetch. Build once. Run everywhere.

Zero dependencies

Built for a minimal footprint, seamless portability, transparent behavior, and a reliable core.

Structure by default

Strict interfaces forces separation of concerns — keeping you and your code focused on clean architecture.

Built on Web Standards

Resources take a Request and return a Response — no framework-specific request wrapper.

Let your agent set it up

terminal
$ claude

> Read https://drash.crookse.com/agents.md and set up a Drash project.

Works With

Drash targets the runtime you already have. The only thing that changes between them is the entry point you import and how your server hands it a request.

RuntimeMinimum VersionWeb Request / Response at the server boundary
Node20.xNo — node:http gives you a context object
Deno1.xYes — Deno.serve passes a Request
Bun1.xYes — Bun.serve passes a Request
Cloudflare WorkersCurrent runtimeYes — the Worker fetch handler passes a Request

Where to Next

The docs walk you through building an application, the examples are finished apps you can run, and the reference documents the API surface.