JSPM

  • Created
  • Published
  • Downloads 249
  • Score
    100M100P100Q80448F
  • License MIT

A modular Cloudflare Workers framework with dependency injection, queue-based events, and type-safe configuration

Package Exports

  • stratal
  • stratal/cache
  • stratal/config
  • stratal/cron
  • stratal/di
  • stratal/email
  • stratal/errors
  • stratal/events
  • stratal/guards
  • stratal/i18n
  • stratal/i18n/messages/en
  • stratal/i18n/utils
  • stratal/logger
  • stratal/module
  • stratal/openapi
  • stratal/package.json
  • stratal/quarry
  • stratal/queue
  • stratal/router
  • stratal/seeder
  • stratal/storage
  • stratal/storage/providers
  • stratal/validation
  • stratal/websocket
  • stratal/workers

Readme

Stratal

A modular framework for building Cloudflare Workers with dependency injection, OpenAPI documentation, queues, cron jobs, and more.

npm version CI Benchmark License: MIT OpenSSF Scorecard Known Vulnerabilities npm downloads TypeScript Bundle size PRs Welcome GitHub stars

Documentation

Full guides and examples are available at stratal.dev. API reference lives at api-reference.stratal.dev.

Features

  • Dependency Injection — Two-tier DI container (global + request-scoped) powered by tsyringe
  • OpenAPI Documentation — Define Zod schemas once and get a full OpenAPI 3.0 spec with interactive docs
  • Modular Architecture — NestJS-style modules with lifecycle hooks, dynamic configuration, and middleware
  • Hono Routing — Convention-based RESTful controllers with automatic HTTP method mapping
  • Queue Consumers — Typed Cloudflare Queue consumers with message-type filtering
  • Cron Jobs — Scheduled tasks via Cloudflare Workers cron triggers
  • Storage — S3-compatible file storage with presigned URLs and TUS upload support
  • Email — Resend and SMTP providers with React Email template support
  • i18n — Type-safe internationalization with locale detection from request headers
  • Guards and Middleware — Route protection and per-module middleware configuration

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.

Installation

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

AI Agent Skills

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

Quick Start

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 })

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

License

MIT