Latest commit

History

208 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Stratal

Stratal

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

npm versionCIBenchmarkLicense: MITOpenSSF ScorecardKnown Vulnerabilitiesnpm downloadsTypeScriptBundle sizePRs WelcomeGitHub stars

Features

  • Dependency Injection - Two-tier DI container (global + request-scoped) with built-in decorator support
  • 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 - SMTP provider 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

npm install stratal
# or
yarn add stratal

Packages

PackagenpmDescription
stratalnpmCore framework — modules, DI, routing, OpenAPI, queues, cron, storage, email, i18n
@stratal/testingnpmTesting utilities and mocks
@stratal/frameworknpmAuth (Better Auth), database ORM (ZenStack), RBAC (Casbin), guards, factories

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
SkillDescription
stratalBuild 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,typeRouterContext}from'stratal/router'import{z}from'stratal/validation'// Define a controller
@Controller('/api/greetings')classGreetingsController{
@Route({summary: 'Say hello',response: z.object({message: z.string()}),})asyncindex(ctx: RouterContext){returnctx.json({message: 'Hello from Stratal!'})}}// Create the root module
@Module({controllers: [GreetingsController],})classAppModule{}// Worker entry pointexportdefaultnewStratal({module: AppModule})

Documentation

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

Benchmarks

Request / Response (e2e)

Full request lifecycle: DI resolution → middleware → routing → validation → response serialization.

Benchmarkops/sec±%MedianP99
simple GET - 20099,191±0.73%10.1 µs17.8 µs
GET with route params - 20080,096±0.74%12.5 µs19.5 µs
POST with JSON body - 20149,954±0.74%20.0 µs31.9 µs
POST invalid body - validation error23,587±3.19%42.4 µs71.8 µs
GET unknown route - 40443,228±0.69%23.1 µs34.8 µs

DI Container - Registration

Benchmarkops/sec±%MedianP99
register class provider5,396,472±0.91%0.20 µs0.30 µs
registerSingleton5,061,380±0.63%0.20 µs0.30 µs
registerValue5,264,393±0.58%0.20 µs0.30 µs
registerFactory4,966,905±0.67%0.20 µs0.30 µs

DI Container - Resolution

Benchmarkops/sec±%MedianP99
resolve class token2,259,399±0.73%0.40 µs0.60 µs
resolve symbol token2,085,313±0.88%0.50 µs0.70 µs
resolve value token2,252,901±0.45%0.40 µs0.60 µs
resolve singleton token2,180,625±0.53%0.50 µs0.60 µs
isRegistered check2,786,645±0.51%0.40 µs0.50 µs

DI Container - Conditional Binding

Benchmarkops/sec±%MedianP99
when().use().give().otherwise()1,545,062±3.07%0.50 µs1.10 µs
when() with cached predicate1,630,576±2.65%0.50 µs1.00 µs

Module Registry - Registration

Benchmarkops/sec±%MedianP99
register single module2,155,261±0.95%0.50 µs0.60 µs
register 3-level module tree1,028,422±0.41%1.00 µs1.30 µs
register dynamic module (forRoot)2,107,991±1.60%0.50 µs1.00 µs

Module Registry - Initialization

Benchmarkops/sec±%MedianP99
initialize with lifecycle hooks1,657,987±0.12%0.60 µs0.80 µs

Module Registry - Collection

Benchmarkops/sec±%MedianP99
getAllControllers983,234±0.72%1.00 µs2.30 µs
getAllConsumers1,000,669±0.46%1.00 µs1.30 µs
getAllJobs1,003,687±0.46%1.00 µs1.30 µs

Route Registration

Benchmarkops/sec±%MedianP99
controller with 5 OpenAPI routes42,263±4.73%21.9 µs42.2 µs
single-route controller215,349±3.33%4.60 µs8.00 µs
register multiple controllers38,840±3.69%19.8 µs51.8 µs

Application

Benchmarkops/sec±%MedianP99
constructor only312,943±1.69%2.70 µs7.70 µs
full initialize()48,051±4.92%16.3 µs43.1 µs
resolve service after bootstrap45,913±5.33%16.2 µs42.7 µs

Benchmarks ran on: Apple M3 Max (16-core), 48 GB RAM, macOS 26.2, Node.js v22.12.0

Contributing

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

License

MIT

About

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

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

208 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Stratal

Stratal

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

npm versionCIBenchmarkLicense: MITOpenSSF ScorecardKnown Vulnerabilitiesnpm downloadsTypeScriptBundle sizePRs WelcomeGitHub stars

Features

  • Dependency Injection - Two-tier DI container (global + request-scoped) with built-in decorator support
  • 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 - SMTP provider 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

npm install stratal
# or
yarn add stratal

Packages

PackagenpmDescription
stratalnpmCore framework — modules, DI, routing, OpenAPI, queues, cron, storage, email, i18n
@stratal/testingnpmTesting utilities and mocks
@stratal/frameworknpmAuth (Better Auth), database ORM (ZenStack), RBAC (Casbin), guards, factories

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
SkillDescription
stratalBuild 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,typeRouterContext}from'stratal/router'import{z}from'stratal/validation'// Define a controller
@Controller('/api/greetings')classGreetingsController{
@Route({summary: 'Say hello',response: z.object({message: z.string()}),})asyncindex(ctx: RouterContext){returnctx.json({message: 'Hello from Stratal!'})}}// Create the root module
@Module({controllers: [GreetingsController],})classAppModule{}// Worker entry pointexportdefaultnewStratal({module: AppModule})

Documentation

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

Benchmarks

Request / Response (e2e)

Full request lifecycle: DI resolution → middleware → routing → validation → response serialization.

Benchmarkops/sec±%MedianP99
simple GET - 20099,191±0.73%10.1 µs17.8 µs
GET with route params - 20080,096±0.74%12.5 µs19.5 µs
POST with JSON body - 20149,954±0.74%20.0 µs31.9 µs
POST invalid body - validation error23,587±3.19%42.4 µs71.8 µs
GET unknown route - 40443,228±0.69%23.1 µs34.8 µs

DI Container - Registration

Benchmarkops/sec±%MedianP99
register class provider5,396,472±0.91%0.20 µs0.30 µs
registerSingleton5,061,380±0.63%0.20 µs0.30 µs
registerValue5,264,393±0.58%0.20 µs0.30 µs
registerFactory4,966,905±0.67%0.20 µs0.30 µs

DI Container - Resolution

Benchmarkops/sec±%MedianP99
resolve class token2,259,399±0.73%0.40 µs0.60 µs
resolve symbol token2,085,313±0.88%0.50 µs0.70 µs
resolve value token2,252,901±0.45%0.40 µs0.60 µs
resolve singleton token2,180,625±0.53%0.50 µs0.60 µs
isRegistered check2,786,645±0.51%0.40 µs0.50 µs

DI Container - Conditional Binding

Benchmarkops/sec±%MedianP99
when().use().give().otherwise()1,545,062±3.07%0.50 µs1.10 µs
when() with cached predicate1,630,576±2.65%0.50 µs1.00 µs

Module Registry - Registration

Benchmarkops/sec±%MedianP99
register single module2,155,261±0.95%0.50 µs0.60 µs
register 3-level module tree1,028,422±0.41%1.00 µs1.30 µs
register dynamic module (forRoot)2,107,991±1.60%0.50 µs1.00 µs

Module Registry - Initialization

Benchmarkops/sec±%MedianP99
initialize with lifecycle hooks1,657,987±0.12%0.60 µs0.80 µs

Module Registry - Collection

Benchmarkops/sec±%MedianP99
getAllControllers983,234±0.72%1.00 µs2.30 µs
getAllConsumers1,000,669±0.46%1.00 µs1.30 µs
getAllJobs1,003,687±0.46%1.00 µs1.30 µs

Route Registration

Benchmarkops/sec±%MedianP99
controller with 5 OpenAPI routes42,263±4.73%21.9 µs42.2 µs
single-route controller215,349±3.33%4.60 µs8.00 µs
register multiple controllers38,840±3.69%19.8 µs51.8 µs

Application

Benchmarkops/sec±%MedianP99
constructor only312,943±1.69%2.70 µs7.70 µs
full initialize()48,051±4.92%16.3 µs43.1 µs
resolve service after bootstrap45,913±5.33%16.2 µs42.7 µs

Benchmarks ran on: Apple M3 Max (16-core), 48 GB RAM, macOS 26.2, Node.js v22.12.0

Contributing

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

License

MIT

About

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

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

208 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Stratal

Stratal

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

npm versionCIBenchmarkLicense: MITOpenSSF ScorecardKnown Vulnerabilitiesnpm downloadsTypeScriptBundle sizePRs WelcomeGitHub stars

Features

  • Dependency Injection - Two-tier DI container (global + request-scoped) with built-in decorator support
  • 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 - SMTP provider 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

npm install stratal
# or
yarn add stratal

Packages

PackagenpmDescription
stratalnpmCore framework — modules, DI, routing, OpenAPI, queues, cron, storage, email, i18n
@stratal/testingnpmTesting utilities and mocks
@stratal/frameworknpmAuth (Better Auth), database ORM (ZenStack), RBAC (Casbin), guards, factories

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
SkillDescription
stratalBuild 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,typeRouterContext}from'stratal/router'import{z}from'stratal/validation'// Define a controller
@Controller('/api/greetings')classGreetingsController{
@Route({summary: 'Say hello',response: z.object({message: z.string()}),})asyncindex(ctx: RouterContext){returnctx.json({message: 'Hello from Stratal!'})}}// Create the root module
@Module({controllers: [GreetingsController],})classAppModule{}// Worker entry pointexportdefaultnewStratal({module: AppModule})

Documentation

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

Benchmarks

Request / Response (e2e)

Full request lifecycle: DI resolution → middleware → routing → validation → response serialization.

Benchmarkops/sec±%MedianP99
simple GET - 20099,191±0.73%10.1 µs17.8 µs
GET with route params - 20080,096±0.74%12.5 µs19.5 µs
POST with JSON body - 20149,954±0.74%20.0 µs31.9 µs
POST invalid body - validation error23,587±3.19%42.4 µs71.8 µs
GET unknown route - 40443,228±0.69%23.1 µs34.8 µs

DI Container - Registration

Benchmarkops/sec±%MedianP99
register class provider5,396,472±0.91%0.20 µs0.30 µs
registerSingleton5,061,380±0.63%0.20 µs0.30 µs
registerValue5,264,393±0.58%0.20 µs0.30 µs
registerFactory4,966,905±0.67%0.20 µs0.30 µs

DI Container - Resolution

Benchmarkops/sec±%MedianP99
resolve class token2,259,399±0.73%0.40 µs0.60 µs
resolve symbol token2,085,313±0.88%0.50 µs0.70 µs
resolve value token2,252,901±0.45%0.40 µs0.60 µs
resolve singleton token2,180,625±0.53%0.50 µs0.60 µs
isRegistered check2,786,645±0.51%0.40 µs0.50 µs

DI Container - Conditional Binding

Benchmarkops/sec±%MedianP99
when().use().give().otherwise()1,545,062±3.07%0.50 µs1.10 µs
when() with cached predicate1,630,576±2.65%0.50 µs1.00 µs

Module Registry - Registration

Benchmarkops/sec±%MedianP99
register single module2,155,261±0.95%0.50 µs0.60 µs
register 3-level module tree1,028,422±0.41%1.00 µs1.30 µs
register dynamic module (forRoot)2,107,991±1.60%0.50 µs1.00 µs

Module Registry - Initialization

Benchmarkops/sec±%MedianP99
initialize with lifecycle hooks1,657,987±0.12%0.60 µs0.80 µs

Module Registry - Collection

Benchmarkops/sec±%MedianP99
getAllControllers983,234±0.72%1.00 µs2.30 µs
getAllConsumers1,000,669±0.46%1.00 µs1.30 µs
getAllJobs1,003,687±0.46%1.00 µs1.30 µs

Route Registration

Benchmarkops/sec±%MedianP99
controller with 5 OpenAPI routes42,263±4.73%21.9 µs42.2 µs
single-route controller215,349±3.33%4.60 µs8.00 µs
register multiple controllers38,840±3.69%19.8 µs51.8 µs

Application

Benchmarkops/sec±%MedianP99
constructor only312,943±1.69%2.70 µs7.70 µs
full initialize()48,051±4.92%16.3 µs43.1 µs
resolve service after bootstrap45,913±5.33%16.2 µs42.7 µs

Benchmarks ran on: Apple M3 Max (16-core), 48 GB RAM, macOS 26.2, Node.js v22.12.0

Contributing

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

License

MIT

About

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

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

208 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Stratal

Stratal

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

npm versionCIBenchmarkLicense: MITOpenSSF ScorecardKnown Vulnerabilitiesnpm downloadsTypeScriptBundle sizePRs WelcomeGitHub stars

Features

  • Dependency Injection - Two-tier DI container (global + request-scoped) with built-in decorator support
  • 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 - SMTP provider 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

npm install stratal
# or
yarn add stratal

Packages

PackagenpmDescription
stratalnpmCore framework — modules, DI, routing, OpenAPI, queues, cron, storage, email, i18n
@stratal/testingnpmTesting utilities and mocks
@stratal/frameworknpmAuth (Better Auth), database ORM (ZenStack), RBAC (Casbin), guards, factories

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
SkillDescription
stratalBuild 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,typeRouterContext}from'stratal/router'import{z}from'stratal/validation'// Define a controller
@Controller('/api/greetings')classGreetingsController{
@Route({summary: 'Say hello',response: z.object({message: z.string()}),})asyncindex(ctx: RouterContext){returnctx.json({message: 'Hello from Stratal!'})}}// Create the root module
@Module({controllers: [GreetingsController],})classAppModule{}// Worker entry pointexportdefaultnewStratal({module: AppModule})

Documentation

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

Benchmarks

Request / Response (e2e)

Full request lifecycle: DI resolution → middleware → routing → validation → response serialization.

Benchmarkops/sec±%MedianP99
simple GET - 20099,191±0.73%10.1 µs17.8 µs
GET with route params - 20080,096±0.74%12.5 µs19.5 µs
POST with JSON body - 20149,954±0.74%20.0 µs31.9 µs
POST invalid body - validation error23,587±3.19%42.4 µs71.8 µs
GET unknown route - 40443,228±0.69%23.1 µs34.8 µs

DI Container - Registration

Benchmarkops/sec±%MedianP99
register class provider5,396,472±0.91%0.20 µs0.30 µs
registerSingleton5,061,380±0.63%0.20 µs0.30 µs
registerValue5,264,393±0.58%0.20 µs0.30 µs
registerFactory4,966,905±0.67%0.20 µs0.30 µs

DI Container - Resolution

Benchmarkops/sec±%MedianP99
resolve class token2,259,399±0.73%0.40 µs0.60 µs
resolve symbol token2,085,313±0.88%0.50 µs0.70 µs
resolve value token2,252,901±0.45%0.40 µs0.60 µs
resolve singleton token2,180,625±0.53%0.50 µs0.60 µs
isRegistered check2,786,645±0.51%0.40 µs0.50 µs

DI Container - Conditional Binding

Benchmarkops/sec±%MedianP99
when().use().give().otherwise()1,545,062±3.07%0.50 µs1.10 µs
when() with cached predicate1,630,576±2.65%0.50 µs1.00 µs

Module Registry - Registration

Benchmarkops/sec±%MedianP99
register single module2,155,261±0.95%0.50 µs0.60 µs
register 3-level module tree1,028,422±0.41%1.00 µs1.30 µs
register dynamic module (forRoot)2,107,991±1.60%0.50 µs1.00 µs

Module Registry - Initialization

Benchmarkops/sec±%MedianP99
initialize with lifecycle hooks1,657,987±0.12%0.60 µs0.80 µs

Module Registry - Collection

Benchmarkops/sec±%MedianP99
getAllControllers983,234±0.72%1.00 µs2.30 µs
getAllConsumers1,000,669±0.46%1.00 µs1.30 µs
getAllJobs1,003,687±0.46%1.00 µs1.30 µs

Route Registration

Benchmarkops/sec±%MedianP99
controller with 5 OpenAPI routes42,263±4.73%21.9 µs42.2 µs
single-route controller215,349±3.33%4.60 µs8.00 µs
register multiple controllers38,840±3.69%19.8 µs51.8 µs

Application

Benchmarkops/sec±%MedianP99
constructor only312,943±1.69%2.70 µs7.70 µs
full initialize()48,051±4.92%16.3 µs43.1 µs
resolve service after bootstrap45,913±5.33%16.2 µs42.7 µs

Benchmarks ran on: Apple M3 Max (16-core), 48 GB RAM, macOS 26.2, Node.js v22.12.0

Contributing

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

License

MIT

About

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

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

208 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Stratal

Stratal

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

npm versionCIBenchmarkLicense: MITOpenSSF ScorecardKnown Vulnerabilitiesnpm downloadsTypeScriptBundle sizePRs WelcomeGitHub stars

Features

  • Dependency Injection - Two-tier DI container (global + request-scoped) with built-in decorator support
  • 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 - SMTP provider 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

npm install stratal
# or
yarn add stratal

Packages

PackagenpmDescription
stratalnpmCore framework — modules, DI, routing, OpenAPI, queues, cron, storage, email, i18n
@stratal/testingnpmTesting utilities and mocks
@stratal/frameworknpmAuth (Better Auth), database ORM (ZenStack), RBAC (Casbin), guards, factories

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
SkillDescription
stratalBuild 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,typeRouterContext}from'stratal/router'import{z}from'stratal/validation'// Define a controller
@Controller('/api/greetings')classGreetingsController{
@Route({summary: 'Say hello',response: z.object({message: z.string()}),})asyncindex(ctx: RouterContext){returnctx.json({message: 'Hello from Stratal!'})}}// Create the root module
@Module({controllers: [GreetingsController],})classAppModule{}// Worker entry pointexportdefaultnewStratal({module: AppModule})

Documentation

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

Benchmarks

Request / Response (e2e)

Full request lifecycle: DI resolution → middleware → routing → validation → response serialization.

Benchmarkops/sec±%MedianP99
simple GET - 20099,191±0.73%10.1 µs17.8 µs
GET with route params - 20080,096±0.74%12.5 µs19.5 µs
POST with JSON body - 20149,954±0.74%20.0 µs31.9 µs
POST invalid body - validation error23,587±3.19%42.4 µs71.8 µs
GET unknown route - 40443,228±0.69%23.1 µs34.8 µs

DI Container - Registration

Benchmarkops/sec±%MedianP99
register class provider5,396,472±0.91%0.20 µs0.30 µs
registerSingleton5,061,380±0.63%0.20 µs0.30 µs
registerValue5,264,393±0.58%0.20 µs0.30 µs
registerFactory4,966,905±0.67%0.20 µs0.30 µs

DI Container - Resolution

Benchmarkops/sec±%MedianP99
resolve class token2,259,399±0.73%0.40 µs0.60 µs
resolve symbol token2,085,313±0.88%0.50 µs0.70 µs
resolve value token2,252,901±0.45%0.40 µs0.60 µs
resolve singleton token2,180,625±0.53%0.50 µs0.60 µs
isRegistered check2,786,645±0.51%0.40 µs0.50 µs

DI Container - Conditional Binding

Benchmarkops/sec±%MedianP99
when().use().give().otherwise()1,545,062±3.07%0.50 µs1.10 µs
when() with cached predicate1,630,576±2.65%0.50 µs1.00 µs

Module Registry - Registration

Benchmarkops/sec±%MedianP99
register single module2,155,261±0.95%0.50 µs0.60 µs
register 3-level module tree1,028,422±0.41%1.00 µs1.30 µs
register dynamic module (forRoot)2,107,991±1.60%0.50 µs1.00 µs

Module Registry - Initialization

Benchmarkops/sec±%MedianP99
initialize with lifecycle hooks1,657,987±0.12%0.60 µs0.80 µs

Module Registry - Collection

Benchmarkops/sec±%MedianP99
getAllControllers983,234±0.72%1.00 µs2.30 µs
getAllConsumers1,000,669±0.46%1.00 µs1.30 µs
getAllJobs1,003,687±0.46%1.00 µs1.30 µs

Route Registration

Benchmarkops/sec±%MedianP99
controller with 5 OpenAPI routes42,263±4.73%21.9 µs42.2 µs
single-route controller215,349±3.33%4.60 µs8.00 µs
register multiple controllers38,840±3.69%19.8 µs51.8 µs

Application

Benchmarkops/sec±%MedianP99
constructor only312,943±1.69%2.70 µs7.70 µs
full initialize()48,051±4.92%16.3 µs43.1 µs
resolve service after bootstrap45,913±5.33%16.2 µs42.7 µs

Benchmarks ran on: Apple M3 Max (16-core), 48 GB RAM, macOS 26.2, Node.js v22.12.0

Contributing

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

License

MIT

About

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

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

208 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Stratal

Stratal

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

npm versionCIBenchmarkLicense: MITOpenSSF ScorecardKnown Vulnerabilitiesnpm downloadsTypeScriptBundle sizePRs WelcomeGitHub stars

Features

  • Dependency Injection - Two-tier DI container (global + request-scoped) with built-in decorator support
  • 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 - SMTP provider 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

npm install stratal
# or
yarn add stratal

Packages

PackagenpmDescription
stratalnpmCore framework — modules, DI, routing, OpenAPI, queues, cron, storage, email, i18n
@stratal/testingnpmTesting utilities and mocks
@stratal/frameworknpmAuth (Better Auth), database ORM (ZenStack), RBAC (Casbin), guards, factories

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
SkillDescription
stratalBuild 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,typeRouterContext}from'stratal/router'import{z}from'stratal/validation'// Define a controller
@Controller('/api/greetings')classGreetingsController{
@Route({summary: 'Say hello',response: z.object({message: z.string()}),})asyncindex(ctx: RouterContext){returnctx.json({message: 'Hello from Stratal!'})}}// Create the root module
@Module({controllers: [GreetingsController],})classAppModule{}// Worker entry pointexportdefaultnewStratal({module: AppModule})

Documentation

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

Benchmarks

Request / Response (e2e)

Full request lifecycle: DI resolution → middleware → routing → validation → response serialization.

Benchmarkops/sec±%MedianP99
simple GET - 20099,191±0.73%10.1 µs17.8 µs
GET with route params - 20080,096±0.74%12.5 µs19.5 µs
POST with JSON body - 20149,954±0.74%20.0 µs31.9 µs
POST invalid body - validation error23,587±3.19%42.4 µs71.8 µs
GET unknown route - 40443,228±0.69%23.1 µs34.8 µs

DI Container - Registration

Benchmarkops/sec±%MedianP99
register class provider5,396,472±0.91%0.20 µs0.30 µs
registerSingleton5,061,380±0.63%0.20 µs0.30 µs
registerValue5,264,393±0.58%0.20 µs0.30 µs
registerFactory4,966,905±0.67%0.20 µs0.30 µs

DI Container - Resolution

Benchmarkops/sec±%MedianP99
resolve class token2,259,399±0.73%0.40 µs0.60 µs
resolve symbol token2,085,313±0.88%0.50 µs0.70 µs
resolve value token2,252,901±0.45%0.40 µs0.60 µs
resolve singleton token2,180,625±0.53%0.50 µs0.60 µs
isRegistered check2,786,645±0.51%0.40 µs0.50 µs

DI Container - Conditional Binding

Benchmarkops/sec±%MedianP99
when().use().give().otherwise()1,545,062±3.07%0.50 µs1.10 µs
when() with cached predicate1,630,576±2.65%0.50 µs1.00 µs

Module Registry - Registration

Benchmarkops/sec±%MedianP99
register single module2,155,261±0.95%0.50 µs0.60 µs
register 3-level module tree1,028,422±0.41%1.00 µs1.30 µs
register dynamic module (forRoot)2,107,991±1.60%0.50 µs1.00 µs

Module Registry - Initialization

Benchmarkops/sec±%MedianP99
initialize with lifecycle hooks1,657,987±0.12%0.60 µs0.80 µs

Module Registry - Collection

Benchmarkops/sec±%MedianP99
getAllControllers983,234±0.72%1.00 µs2.30 µs
getAllConsumers1,000,669±0.46%1.00 µs1.30 µs
getAllJobs1,003,687±0.46%1.00 µs1.30 µs

Route Registration

Benchmarkops/sec±%MedianP99
controller with 5 OpenAPI routes42,263±4.73%21.9 µs42.2 µs
single-route controller215,349±3.33%4.60 µs8.00 µs
register multiple controllers38,840±3.69%19.8 µs51.8 µs

Application

Benchmarkops/sec±%MedianP99
constructor only312,943±1.69%2.70 µs7.70 µs
full initialize()48,051±4.92%16.3 µs43.1 µs
resolve service after bootstrap45,913±5.33%16.2 µs42.7 µs

Benchmarks ran on: Apple M3 Max (16-core), 48 GB RAM, macOS 26.2, Node.js v22.12.0

Contributing

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

License

MIT

About

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

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

208 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Stratal

Stratal

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

npm versionCIBenchmarkLicense: MITOpenSSF ScorecardKnown Vulnerabilitiesnpm downloadsTypeScriptBundle sizePRs WelcomeGitHub stars

Features

  • Dependency Injection - Two-tier DI container (global + request-scoped) with built-in decorator support
  • 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 - SMTP provider 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

npm install stratal
# or
yarn add stratal

Packages

PackagenpmDescription
stratalnpmCore framework — modules, DI, routing, OpenAPI, queues, cron, storage, email, i18n
@stratal/testingnpmTesting utilities and mocks
@stratal/frameworknpmAuth (Better Auth), database ORM (ZenStack), RBAC (Casbin), guards, factories

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
SkillDescription
stratalBuild 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,typeRouterContext}from'stratal/router'import{z}from'stratal/validation'// Define a controller
@Controller('/api/greetings')classGreetingsController{
@Route({summary: 'Say hello',response: z.object({message: z.string()}),})asyncindex(ctx: RouterContext){returnctx.json({message: 'Hello from Stratal!'})}}// Create the root module
@Module({controllers: [GreetingsController],})classAppModule{}// Worker entry pointexportdefaultnewStratal({module: AppModule})

Documentation

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

Benchmarks

Request / Response (e2e)

Full request lifecycle: DI resolution → middleware → routing → validation → response serialization.

Benchmarkops/sec±%MedianP99
simple GET - 20099,191±0.73%10.1 µs17.8 µs
GET with route params - 20080,096±0.74%12.5 µs19.5 µs
POST with JSON body - 20149,954±0.74%20.0 µs31.9 µs
POST invalid body - validation error23,587±3.19%42.4 µs71.8 µs
GET unknown route - 40443,228±0.69%23.1 µs34.8 µs

DI Container - Registration

Benchmarkops/sec±%MedianP99
register class provider5,396,472±0.91%0.20 µs0.30 µs
registerSingleton5,061,380±0.63%0.20 µs0.30 µs
registerValue5,264,393±0.58%0.20 µs0.30 µs
registerFactory4,966,905±0.67%0.20 µs0.30 µs

DI Container - Resolution

Benchmarkops/sec±%MedianP99
resolve class token2,259,399±0.73%0.40 µs0.60 µs
resolve symbol token2,085,313±0.88%0.50 µs0.70 µs
resolve value token2,252,901±0.45%0.40 µs0.60 µs
resolve singleton token2,180,625±0.53%0.50 µs0.60 µs
isRegistered check2,786,645±0.51%0.40 µs0.50 µs

DI Container - Conditional Binding

Benchmarkops/sec±%MedianP99
when().use().give().otherwise()1,545,062±3.07%0.50 µs1.10 µs
when() with cached predicate1,630,576±2.65%0.50 µs1.00 µs

Module Registry - Registration

Benchmarkops/sec±%MedianP99
register single module2,155,261±0.95%0.50 µs0.60 µs
register 3-level module tree1,028,422±0.41%1.00 µs1.30 µs
register dynamic module (forRoot)2,107,991±1.60%0.50 µs1.00 µs

Module Registry - Initialization

Benchmarkops/sec±%MedianP99
initialize with lifecycle hooks1,657,987±0.12%0.60 µs0.80 µs

Module Registry - Collection

Benchmarkops/sec±%MedianP99
getAllControllers983,234±0.72%1.00 µs2.30 µs
getAllConsumers1,000,669±0.46%1.00 µs1.30 µs
getAllJobs1,003,687±0.46%1.00 µs1.30 µs

Route Registration

Benchmarkops/sec±%MedianP99
controller with 5 OpenAPI routes42,263±4.73%21.9 µs42.2 µs
single-route controller215,349±3.33%4.60 µs8.00 µs
register multiple controllers38,840±3.69%19.8 µs51.8 µs

Application

Benchmarkops/sec±%MedianP99
constructor only312,943±1.69%2.70 µs7.70 µs
full initialize()48,051±4.92%16.3 µs43.1 µs
resolve service after bootstrap45,913±5.33%16.2 µs42.7 µs

Benchmarks ran on: Apple M3 Max (16-core), 48 GB RAM, macOS 26.2, Node.js v22.12.0

Contributing

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

License

MIT

About

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

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

208 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Stratal

Stratal

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

npm versionCIBenchmarkLicense: MITOpenSSF ScorecardKnown Vulnerabilitiesnpm downloadsTypeScriptBundle sizePRs WelcomeGitHub stars

Features

  • Dependency Injection - Two-tier DI container (global + request-scoped) with built-in decorator support
  • 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 - SMTP provider 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

npm install stratal
# or
yarn add stratal

Packages

PackagenpmDescription
stratalnpmCore framework — modules, DI, routing, OpenAPI, queues, cron, storage, email, i18n
@stratal/testingnpmTesting utilities and mocks
@stratal/frameworknpmAuth (Better Auth), database ORM (ZenStack), RBAC (Casbin), guards, factories

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
SkillDescription
stratalBuild 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,typeRouterContext}from'stratal/router'import{z}from'stratal/validation'// Define a controller
@Controller('/api/greetings')classGreetingsController{
@Route({summary: 'Say hello',response: z.object({message: z.string()}),})asyncindex(ctx: RouterContext){returnctx.json({message: 'Hello from Stratal!'})}}// Create the root module
@Module({controllers: [GreetingsController],})classAppModule{}// Worker entry pointexportdefaultnewStratal({module: AppModule})

Documentation

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

Benchmarks

Request / Response (e2e)

Full request lifecycle: DI resolution → middleware → routing → validation → response serialization.

Benchmarkops/sec±%MedianP99
simple GET - 20099,191±0.73%10.1 µs17.8 µs
GET with route params - 20080,096±0.74%12.5 µs19.5 µs
POST with JSON body - 20149,954±0.74%20.0 µs31.9 µs
POST invalid body - validation error23,587±3.19%42.4 µs71.8 µs
GET unknown route - 40443,228±0.69%23.1 µs34.8 µs

DI Container - Registration

Benchmarkops/sec±%MedianP99
register class provider5,396,472±0.91%0.20 µs0.30 µs
registerSingleton5,061,380±0.63%0.20 µs0.30 µs
registerValue5,264,393±0.58%0.20 µs0.30 µs
registerFactory4,966,905±0.67%0.20 µs0.30 µs

DI Container - Resolution

Benchmarkops/sec±%MedianP99
resolve class token2,259,399±0.73%0.40 µs0.60 µs
resolve symbol token2,085,313±0.88%0.50 µs0.70 µs
resolve value token2,252,901±0.45%0.40 µs0.60 µs
resolve singleton token2,180,625±0.53%0.50 µs0.60 µs
isRegistered check2,786,645±0.51%0.40 µs0.50 µs

DI Container - Conditional Binding

Benchmarkops/sec±%MedianP99
when().use().give().otherwise()1,545,062±3.07%0.50 µs1.10 µs
when() with cached predicate1,630,576±2.65%0.50 µs1.00 µs

Module Registry - Registration

Benchmarkops/sec±%MedianP99
register single module2,155,261±0.95%0.50 µs0.60 µs
register 3-level module tree1,028,422±0.41%1.00 µs1.30 µs
register dynamic module (forRoot)2,107,991±1.60%0.50 µs1.00 µs

Module Registry - Initialization

Benchmarkops/sec±%MedianP99
initialize with lifecycle hooks1,657,987±0.12%0.60 µs0.80 µs

Module Registry - Collection

Benchmarkops/sec±%MedianP99
getAllControllers983,234±0.72%1.00 µs2.30 µs
getAllConsumers1,000,669±0.46%1.00 µs1.30 µs
getAllJobs1,003,687±0.46%1.00 µs1.30 µs

Route Registration

Benchmarkops/sec±%MedianP99
controller with 5 OpenAPI routes42,263±4.73%21.9 µs42.2 µs
single-route controller215,349±3.33%4.60 µs8.00 µs
register multiple controllers38,840±3.69%19.8 µs51.8 µs

Application

Benchmarkops/sec±%MedianP99
constructor only312,943±1.69%2.70 µs7.70 µs
full initialize()48,051±4.92%16.3 µs43.1 µs
resolve service after bootstrap45,913±5.33%16.2 µs42.7 µs

Benchmarks ran on: Apple M3 Max (16-core), 48 GB RAM, macOS 26.2, Node.js v22.12.0

Contributing

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

License

MIT

About

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

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages