TypeScript Framework

Build for the edge,
not around it.

Roost brings convention-over-configuration to Cloudflare Workers. Enterprise auth, Drizzle ORM, AI agents, job queues, and Stripe billing — wired together with a framework that stays out of your way.

# Create a new app
$ roost new my-app --with-ai --with-billing

# Generate code
$ roost make:model Post
$ roost make:agent Assistant
$ roost migrate

# Ship it
$ roost deploy

Everything, wired together.

Each package works standalone, but they're designed to compose. Register a provider, and the framework handles the rest.

Background

Job Queues

Typed job classes on Cloudflare Queues with dispatch, retry, chaining, and batching.

DX

CLI Generators

Scaffold projects and generate models, agents, jobs, middleware — all from the terminal.

Revenue

Billing

Abstract billing interface with subscriptions, metering, webhooks, and customer portal. Ships with a Stripe adapter.

Frontend

TanStack Start

Type-safe file routing, SSR, and server functions. React 19 on the edge.

Auth

WorkOS Authentication

SSO, RBAC, organizations, and session management. Enterprise-ready from the first line of code.

Data

Drizzle ORM on D1

Laravel-like model classes with query builders, relationships, hooks, and migrations.

Less ceremony, more building.

Same Cloudflare Workers runtime. Dramatically less boilerplate.

Raw Cloudflare Workers
export default {
  async fetch(request, env) {
    // Parse session from cookies
    const cookie = request.headers
      .get('cookie')?.split(';')
      .find(c => c.includes('session='));
    const userId = await verifySession(cookie);

    // Query D1 with raw SQL
    const rows = await env.DB
      .prepare(
        'SELECT * FROM todos WHERE user_id = ?1 ORDER BY created_at DESC'
      )
      .bind(userId)
      .all();

    return Response.json(rows.results);
  }
}
With Roost
// Auth handled by middleware
const getTodos = createServerFn()
  .handler(async () => {
    const user = await requireUser();

    return Todo
      .where('user_id', user.id)
      .orderBy('created_at', 'desc')
      .all();
  });

Start building.

From zero to deployed in minutes. Enterprise-ready from the first line.