Serverless-first Deno framework

Build type-safe APIs at the speed of thought

Thunder is a serverless-first, full-stack framework for Deno with file-based routing, Zod-validated schemas, a powerful hooks system, and instant CRUD - so you ship product, not boilerplate.

12k+validated req/s
1 cmdto add auth + RBAC
100%end-to-end typed
terminal
git clone https://github.com/Huruf-Tech/thunder.git my-appcd my-app && deno task initdeno task dev

Ship in hours, not weeks

Thunder collapses the work between idea and production API. The plugin system, instant CRUD, and zero-config routing do the heavy lifting for you.

1 command

Plugins instead of plumbing

Every Thunder project is a plugin. Install thunder-core to get auth, RBAC, CORS, security headers, and an admin panel - in a single command.

1 function

Instant CRUD

createCRUD generates create, read, update, delete, and count endpoints for any model - fully validated, with pagination and filters built in.

0 config

File-based routing

Drop a file in routes/ and it becomes an endpoint. No registries, no wiring - convention over configuration from the first line.

Free

Generated OpenAPI + SDK

Your routes already describe their types. Thunder turns them into an OpenAPI spec and a typed client SDK with one task.

Less boilerplate. More shipping.

Define a validated route, generate a full CRUD API, or intercept requests with hooks - all with end-to-end type safety.

routes/users.ts

A fully validated route

import { Router } from "@/core/http/router.ts";import { bodyAsJson } from "@/core/http/utils.ts";import z from "zod";export default new Router("/api", function users(router) {  router.post("/users", function createUser() {    const $body = z.object({      name: z.string().min(1),      email: z.string().email(),    });    const $return = z.object({ id: z.string() });    return {      shape: () => ({ body: $body, return: $return }),      handler: async (req) => {        const body = $body.parse(await bodyAsJson(req));        return Response.created({ id: "123" });      },    };  });}).group("Users");
routes/todos.ts

A complete CRUD API in one call

import { Router } from "@/core/http/router.ts";import { createCRUD } from "@/core/utils/createCRUD.ts";import { todoModel, $todo, $todoInput } from "@/schemas/todo.ts";export default new Router("/", function todos(router) {  createCRUD({    router,    schema: $todo,    model: todoModel,    insertSchema: $todoInput,  });}).group("Todos");
hooks/auth.ts

Intercept requests with hooks

import type { THook } from "@/core/http/hooks.ts";import { Response } from "@/core/http/response.ts";export default {  priority: 100, // higher runs first  pre: async ({ req }) => {    const token = req.headers.get("Authorization");    if (!token) return Response.unauthorized();  },} satisfies THook;
Benchmarks

Fast where it counts

A validated POST /users endpoint under load (50 connections, no database). Thunder leads on the Deno runtime and outpaces popular Node frameworks like Express - while doing full Zod validation on every request.

POST /usersrequests / second · higher is better
ThunderDeno
12,384
OakDeno
11,091
ExpressNode
8,148

Everything you need, nothing you don't

File-based Routing

Drop a file in routes/ and it becomes an endpoint. Convention over configuration, with zero wiring.

End-to-end Type Safety

Zod validates params, query, body, and response - and TypeScript enforces your return shape at compile time.

Serverless-first

Stateless requests, fast cold starts, and predictable performance designed for serverless from day one.

Powerful Hooks

Pre and post interceptors with priorities for auth, logging, and rate limiting - no tangled middleware.

Instant CRUD

Generate create, read, update, delete, and count endpoints for any model with a single createCRUD call.

Plugin Ecosystem

Any Thunder project is a plugin. Install thunder-core for auth, RBAC, and security in one command.

© 2026 Thunder. All rights reserved.