A modular framework for building Cloudflare Workers with dependency injection, OpenAPI documentation, queues, cron jobs, and more.
Full guides and examples are available at stratal.dev. API reference lives at api-reference.stratal.dev.
Note: Stratal is in active development and APIs may change before v1. It is okay to use in projects, but consider pinning your dependency version so that a new patch does not break your existing code.
Scaffold a new project from an official template:
npm create stratal my-app
# or
yarn create stratal my-app
# or
pnpm create stratal my-app
Available templates:
| Template | Description | Example |
|---|---|---|
hello-world |
A minimal Stratal app with a single GET endpoint | Source |
crud-api |
RESTful notes API with full CRUD operations and DI | Source |
testing |
Vitest + @stratal/testing with Cloudflare worker pool | Source |
guards |
Route protection with @UseGuards and CanActivate | Source |
middleware |
Middleware configuration with apply/exclude/forRoutes | Source |
queues |
Queue producer/consumer pattern with Cloudflare Queues | Source |
scheduled-tasks |
Cron job scheduling with the CronJob interface | Source |
openapi |
OpenAPI docs with Swagger UI and Zod schema integration | Source |
For benchmarks, see the main README.
You can also specify a template directly:
npm create stratal my-app -- -t crud-api
Or add Stratal to an existing project:
npm install stratal
Stratal provides Agent Skills for AI coding assistants like Claude Code and Cursor. Install to give your AI agent knowledge of Stratal patterns, conventions, and APIs:
npx skills add strataljs/stratal
| Skill | Description |
|---|---|
stratal |
Build Cloudflare Workers apps with the Stratal framework — modules, DI, controllers, routing, OpenAPI, queues, cron, events, seeders, CLI, auth, database, RBAC, testing, and more |
Define a module with a controller and wire it up as a Cloudflare Worker:
import { Stratal } from 'stratal'
import { Module } from 'stratal/module'
import { Controller, Route, type RouterContext } from 'stratal/router'
import { z } from 'stratal/validation'
// Define a controller
@Controller('/api/greetings')
class GreetingsController {
@Route({
summary: 'Say hello',
response: z.object({ message: z.string() }),
})
async index(ctx: RouterContext) {
return ctx.json({ message: 'Hello from Stratal!' })
}
}
// Create the root module
@Module({
controllers: [GreetingsController],
})
class AppModule {}
// Worker entry point
export default new Stratal({ module: AppModule })
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
MIT