Skip to Content

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.