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.
| Runtime | Minimum Version | Web Request / Response at the server boundary |
|---|---|---|
| Node | 20.x | No — node:http gives you a context object |
| Deno | 1.x | Yes — Deno.serve passes a Request |
| Bun | 1.x | Yes — Bun.serve passes a Request |
| Cloudflare Workers | Current runtime | Yes — 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.