workers-best-practices

Cloudflare Workers code review and authoring against production best practices. Retrieves latest Workers APIs, types, and wrangler configuration schema before reviewing or writing code; biases towards live documentation over pre-trained knowledge Covers 40+ best practice rules across configuration, request/response handling, architecture, observability, code patterns, and security Flags 15+ common anti-patterns including unbounded streaming, floating promises, global request state, hardcoded secrets, and unsafe crypto usage Provides structured review workflow: retrieve references, validate types and config, check patterns and security, validate with tools

INSTALLATION
npx skills add https://github.com/cloudflare/skills --skill workers-best-practices
Run in your project or agent environment. Adjust flags if your CLI version differs.

SKILL.md

$2a

# Fetch latest workers types

mkdir -p /tmp/workers-types-latest && \

  npm pack @cloudflare/workers-types --pack-destination /tmp/workers-types-latest && \

  tar -xzf /tmp/workers-types-latest/cloudflare-workers-types-*.tgz -C /tmp/workers-types-latest

# Types at /tmp/workers-types-latest/package/index.d.ts

Reference Documentation

  • references/rules.md — all best practice rules with code examples and anti-patterns
  • references/review.md — type validation, config validation, binding access patterns, review process

Rules Quick Reference

Configuration

Rule

Summary

Compatibility date

Set compatibility_date to today on new projects; update periodically on existing ones

nodejs_compat

Enable the nodejs_compat flag — many libraries depend on Node.js built-ins

wrangler types

Run wrangler types to generate Env — never hand-write binding interfaces

Secrets

Use wrangler secret put, never hardcode secrets in config or source

wrangler.jsonc

Use JSONC config for non-secret settings — newer features are JSON-only

Request & Response Handling

Rule

Summary

Streaming

Stream large/unknown payloads — never await response.text() on unbounded data

waitUntil

Use ctx.waitUntil() for post-response work; do not destructure ctx

Architecture

Rule

Summary

Bindings over REST

Use in-process bindings (KV, R2, D1, Queues) — not the Cloudflare REST API

Queues & Workflows

Move async/background work off the critical path

Service bindings

Use service bindings for Worker-to-Worker calls — not public HTTP

Hyperdrive

Always use Hyperdrive for external PostgreSQL/MySQL connections

Observability

Rule

Summary

Logs & Traces

Enable observability in config with head_sampling_rate; use structured JSON logging

Code Patterns

Rule

Summary

No global request state

Never store request-scoped data in module-level variables

Floating promises

Every Promise must be awaited, returned, voided, or passed to ctx.waitUntil()

Security

Rule

Summary

Web Crypto

Use crypto.randomUUID() / crypto.getRandomValues() — never Math.random() for security

No passThroughOnException

Use explicit try/catch with structured error responses

Anti-Patterns to Flag

Anti-pattern

Why it matters

await response.text() on unbounded data

Memory exhaustion — 128 MB limit

Hardcoded secrets in source or config

Credential leak via version control

Math.random() for tokens/IDs

Predictable, not cryptographically secure

Bare fetch() without await or waitUntil

Floating promise — dropped result, swallowed error

Module-level mutable variables for request state

Cross-request data leaks, stale state, I/O errors

Cloudflare REST API from inside a Worker

Unnecessary network hop, auth overhead, added latency

ctx.passThroughOnException() as error handling

Hides bugs, makes debugging impossible

Hand-written Env interface

Drifts from actual wrangler config bindings

Direct string comparison for secret values

Timing side-channel — use crypto.subtle.timingSafeEqual

Destructuring ctx (const { waitUntil } = ctx)

Loses this binding — throws "Illegal invocation" at runtime

any on Env or handler params

Defeats type safety for all binding access

as unknown as T double-cast

Hides real type incompatibilities — fix the design

implements on platform base classes (instead of extends)

Legacy — loses this.ctx, this.env. Applies to DurableObject, WorkerEntrypoint, Workflow

env.X inside platform base class

Should be this.env.X in classes extending DurableObject, WorkerEntrypoint, etc.

Review Workflow

  • Retrieve — fetch latest best practices page, workers types, and wrangler schema
  • Read full files — not just diffs; context matters for binding access patterns
  • Check types — binding access, handler signatures, no any, no unsafe casts (see references/review.md)
  • Check config — compatibility_date, nodejs_compat, observability, secrets, binding-code consistency
  • Check patterns — streaming, floating promises, global state, serialization boundaries
  • Check security — crypto usage, secret handling, timing-safe comparisons, error handling
  • Validate with toolsnpx tsc --noEmit, lint for no-floating-promises
  • Reference rules — see references/rules.md for each rule's correct pattern

Scope

This skill covers Workers-specific best practices and code review. For related topics:

  • Durable Objects: load the durable-objects skill
  • Wrangler CLI commands: load the wrangler skill

Principles

  • Be certain. Retrieve before flagging. If unsure about an API, config field, or pattern, fetch the docs first.
  • Provide evidence. Reference line numbers, tool output, or docs links.
  • Focus on what developers will copy. Workers code in examples and docs gets pasted into production.
  • Correctness over completeness. A concise example that works beats a comprehensive one with errors.
BrowserAct

Let your agent run on any real-world website

Bypass CAPTCHA & anti-bot for free. Start local, scale to cloud.

Explore BrowserAct Skills →

Stop writing automation&scrapers

Install the CLI. Run your first Skill in 30 seconds. Scale when you're ready.

Start free
free · no credit card