opencodekit 0.15.4 → 0.15.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/template/.opencode/command/cloudflare.md +70 -0
- package/dist/template/.opencode/package.json +1 -1
- package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
- package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
- package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
- package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
- package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
- package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
- package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
- package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
- package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
- package/package.json +1 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Cloudflare Workers Smart Placement
|
|
2
|
+
|
|
3
|
+
Automatic workload placement optimization to minimize latency by running Workers closer to backend infrastructure rather than end users.
|
|
4
|
+
|
|
5
|
+
## Core Concept
|
|
6
|
+
|
|
7
|
+
Smart Placement automatically analyzes Worker request duration across Cloudflare's global network and intelligently routes requests to optimal data center locations. Instead of defaulting to the location closest to the end user, Smart Placement can forward requests to locations closer to backend infrastructure when this reduces overall request duration.
|
|
8
|
+
|
|
9
|
+
### When to Use
|
|
10
|
+
|
|
11
|
+
**Enable Smart Placement when:**
|
|
12
|
+
- Worker makes multiple round trips to backend services/databases
|
|
13
|
+
- Backend infrastructure is geographically concentrated
|
|
14
|
+
- Request duration dominated by backend latency rather than network latency from user
|
|
15
|
+
- Running backend logic in Workers (APIs, data aggregation, SSR with DB calls)
|
|
16
|
+
|
|
17
|
+
**Do NOT enable for:**
|
|
18
|
+
- Workers serving only static content or cached responses
|
|
19
|
+
- Workers without significant backend communication
|
|
20
|
+
- Pure edge logic (auth checks, redirects, simple transformations)
|
|
21
|
+
- Workers without fetch event handlers
|
|
22
|
+
|
|
23
|
+
### Key Architecture Pattern
|
|
24
|
+
|
|
25
|
+
**Recommended:** Split full-stack applications into separate Workers:
|
|
26
|
+
```
|
|
27
|
+
User → Frontend Worker (at edge, close to user)
|
|
28
|
+
↓ Service Binding
|
|
29
|
+
Backend Worker (Smart Placement enabled, close to DB/API)
|
|
30
|
+
↓
|
|
31
|
+
Database/Backend Service
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
This maintains fast, reactive frontends while optimizing backend latency.
|
|
35
|
+
|
|
36
|
+
## Quick Start
|
|
37
|
+
|
|
38
|
+
```toml
|
|
39
|
+
# wrangler.toml
|
|
40
|
+
[placement]
|
|
41
|
+
mode = "smart"
|
|
42
|
+
hint = "wnam" # Optional: West North America
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Deploy and wait 15 minutes for analysis. Check status via API or dashboard metrics.
|
|
46
|
+
|
|
47
|
+
## Requirements
|
|
48
|
+
|
|
49
|
+
- Wrangler 2.20.0+
|
|
50
|
+
- Analysis time: Up to 15 minutes after enabling
|
|
51
|
+
- Traffic requirements: Consistent traffic from multiple global locations
|
|
52
|
+
- Available on all Workers plans (Free, Paid, Enterprise)
|
|
53
|
+
|
|
54
|
+
## Placement Status Values
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
type PlacementStatus =
|
|
58
|
+
| undefined // Not yet analyzed
|
|
59
|
+
| 'SUCCESS' // Successfully optimized
|
|
60
|
+
| 'INSUFFICIENT_INVOCATIONS' // Not enough traffic
|
|
61
|
+
| 'UNSUPPORTED_APPLICATION'; // Made Worker slower (reverted)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## CLI Commands
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# Deploy with Smart Placement
|
|
68
|
+
wrangler deploy
|
|
69
|
+
|
|
70
|
+
# Check placement status
|
|
71
|
+
curl -H "Authorization: Bearer $TOKEN" \
|
|
72
|
+
https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/workers/services/$WORKER_NAME \
|
|
73
|
+
| jq .result.placement_status
|
|
74
|
+
|
|
75
|
+
# Monitor
|
|
76
|
+
wrangler tail your-worker-name --header cf-placement
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## In This Reference
|
|
80
|
+
|
|
81
|
+
- [configuration.md](./configuration.md) - wrangler.toml setup, placement hints, dashboard config
|
|
82
|
+
- [api.md](./api.md) - Placement Status API, cf-placement header, monitoring
|
|
83
|
+
- [patterns.md](./patterns.md) - Frontend/backend split, database workers, SSR patterns
|
|
84
|
+
- [gotchas.md](./gotchas.md) - Troubleshooting INSUFFICIENT_INVOCATIONS, performance issues
|
|
85
|
+
|
|
86
|
+
## See Also
|
|
87
|
+
|
|
88
|
+
- [workers](../workers/) - Worker runtime and fetch handlers
|
|
89
|
+
- [d1](../d1/) - D1 database that benefits from Smart Placement
|
|
90
|
+
- [durable-objects](../durable-objects/) - Durable Objects with backend logic
|
|
91
|
+
- [bindings](../bindings/) - Service bindings for frontend/backend split
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# Smart Placement API
|
|
2
|
+
|
|
3
|
+
## Placement Status API
|
|
4
|
+
|
|
5
|
+
Query Worker placement status via Cloudflare API:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
curl -X GET "https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/workers/services/{WORKER_NAME}" \
|
|
9
|
+
-H "Authorization: Bearer <TOKEN>" \
|
|
10
|
+
-H "Content-Type: application/json"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Response includes `placement_status` field:
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
type PlacementStatus =
|
|
17
|
+
| undefined // Not yet analyzed
|
|
18
|
+
| 'SUCCESS' // Successfully optimized
|
|
19
|
+
| 'INSUFFICIENT_INVOCATIONS' // Not enough traffic
|
|
20
|
+
| 'UNSUPPORTED_APPLICATION'; // Made Worker slower (reverted)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Status Meanings
|
|
24
|
+
|
|
25
|
+
**`undefined` (not present)**
|
|
26
|
+
- Worker not yet analyzed
|
|
27
|
+
- Always runs at default edge location closest to user
|
|
28
|
+
|
|
29
|
+
**`SUCCESS`**
|
|
30
|
+
- Analysis complete, Smart Placement active
|
|
31
|
+
- Worker runs in optimal location (may be edge or remote)
|
|
32
|
+
|
|
33
|
+
**`INSUFFICIENT_INVOCATIONS`**
|
|
34
|
+
- Not enough requests to make placement decision
|
|
35
|
+
- Requires consistent multi-region traffic
|
|
36
|
+
- Always runs at default edge location
|
|
37
|
+
|
|
38
|
+
**`UNSUPPORTED_APPLICATION`** (rare, <1% of Workers)
|
|
39
|
+
- Smart Placement made Worker slower
|
|
40
|
+
- Placement decision reverted
|
|
41
|
+
- Always runs at edge location
|
|
42
|
+
- Won't be re-analyzed until redeployed
|
|
43
|
+
|
|
44
|
+
## cf-placement Header (Beta)
|
|
45
|
+
|
|
46
|
+
Smart Placement adds response header indicating routing decision:
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// Remote placement (Smart Placement routed request)
|
|
50
|
+
"cf-placement: remote-LHR" // Routed to London
|
|
51
|
+
|
|
52
|
+
// Local placement (default edge routing)
|
|
53
|
+
"cf-placement: local-EWR" // Stayed at Newark edge
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Format: `{placement-type}-{IATA-code}`
|
|
57
|
+
- `remote-*` = Smart Placement routed to remote location
|
|
58
|
+
- `local-*` = Stayed at default edge location
|
|
59
|
+
- IATA code = nearest airport to data center
|
|
60
|
+
|
|
61
|
+
**Warning:** Beta feature, may be removed before GA.
|
|
62
|
+
|
|
63
|
+
## Detecting Smart Placement in Code
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
export default {
|
|
67
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
68
|
+
const placementHeader = request.headers.get('cf-placement');
|
|
69
|
+
|
|
70
|
+
if (placementHeader?.startsWith('remote-')) {
|
|
71
|
+
const location = placementHeader.split('-')[1];
|
|
72
|
+
console.log(`Smart Placement routed to ${location}`);
|
|
73
|
+
} else if (placementHeader?.startsWith('local-')) {
|
|
74
|
+
const location = placementHeader.split('-')[1];
|
|
75
|
+
console.log(`Running at edge location ${location}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return new Response('OK');
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Request Duration Metrics
|
|
84
|
+
|
|
85
|
+
Available in Cloudflare dashboard when Smart Placement enabled:
|
|
86
|
+
|
|
87
|
+
**Workers & Pages → [Your Worker] → Metrics → Request Duration**
|
|
88
|
+
|
|
89
|
+
Shows histogram comparing:
|
|
90
|
+
- Request duration WITH Smart Placement (99% of traffic)
|
|
91
|
+
- Request duration WITHOUT Smart Placement (1% baseline)
|
|
92
|
+
|
|
93
|
+
**Request Duration vs Execution Duration:**
|
|
94
|
+
- **Request duration:** Total time from request arrival to response delivery (includes network latency)
|
|
95
|
+
- **Execution duration:** Time Worker code actively executing (excludes network waits)
|
|
96
|
+
|
|
97
|
+
Use request duration to measure Smart Placement impact.
|
|
98
|
+
|
|
99
|
+
## Monitoring Commands
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# Tail Worker logs
|
|
103
|
+
wrangler tail your-worker-name
|
|
104
|
+
|
|
105
|
+
# Tail with filters
|
|
106
|
+
wrangler tail your-worker-name --status error
|
|
107
|
+
wrangler tail your-worker-name --header cf-placement
|
|
108
|
+
|
|
109
|
+
# Check placement status via API
|
|
110
|
+
curl -H "Authorization: Bearer $TOKEN" \
|
|
111
|
+
https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/workers/services/$WORKER_NAME \
|
|
112
|
+
| jq .result.placement_status
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## TypeScript Types
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
type PlacementStatus =
|
|
119
|
+
| 'SUCCESS'
|
|
120
|
+
| 'INSUFFICIENT_INVOCATIONS'
|
|
121
|
+
| 'UNSUPPORTED_APPLICATION'
|
|
122
|
+
| undefined;
|
|
123
|
+
|
|
124
|
+
interface WorkerMetadata {
|
|
125
|
+
placement_mode?: 'smart';
|
|
126
|
+
placement_status?: PlacementStatus;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
interface Env {
|
|
130
|
+
BACKEND_SERVICE: Fetcher;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export default {
|
|
134
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
135
|
+
const response = await env.BACKEND_SERVICE.fetch(request);
|
|
136
|
+
return response;
|
|
137
|
+
}
|
|
138
|
+
} satisfies ExportedHandler<Env>;
|
|
139
|
+
```
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Smart Placement Configuration
|
|
2
|
+
|
|
3
|
+
## wrangler.toml Setup
|
|
4
|
+
|
|
5
|
+
```toml
|
|
6
|
+
# Basic Smart Placement
|
|
7
|
+
[placement]
|
|
8
|
+
mode = "smart"
|
|
9
|
+
|
|
10
|
+
# With placement hint (preferred region)
|
|
11
|
+
[placement]
|
|
12
|
+
mode = "smart"
|
|
13
|
+
hint = "wnam" # West North America
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## wrangler.json/wrangler.jsonc
|
|
17
|
+
|
|
18
|
+
```jsonc
|
|
19
|
+
{
|
|
20
|
+
"$schema": "./node_modules/wrangler/config-schema.json",
|
|
21
|
+
"placement": {
|
|
22
|
+
"mode": "smart",
|
|
23
|
+
"hint": "wnam" // Optional region hint
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Placement Mode Values
|
|
29
|
+
|
|
30
|
+
- `"smart"` - Enable Smart Placement optimization
|
|
31
|
+
- Not specified - Default behavior (run at edge closest to user)
|
|
32
|
+
|
|
33
|
+
## Placement Hints
|
|
34
|
+
|
|
35
|
+
Optional region hints guide Smart Placement decisions:
|
|
36
|
+
- `"wnam"` - West North America
|
|
37
|
+
- `"enam"` - East North America
|
|
38
|
+
- `"weur"` - Western Europe
|
|
39
|
+
- `"eeur"` - Eastern Europe
|
|
40
|
+
- `"apac"` - Asia Pacific
|
|
41
|
+
|
|
42
|
+
**Note:** Hints are suggestions, not guarantees. Smart Placement makes final decision based on performance data.
|
|
43
|
+
|
|
44
|
+
## Frontend + Backend Split Configuration
|
|
45
|
+
|
|
46
|
+
### Frontend Worker (No Smart Placement)
|
|
47
|
+
|
|
48
|
+
```toml
|
|
49
|
+
# frontend-worker/wrangler.toml
|
|
50
|
+
name = "frontend"
|
|
51
|
+
main = "frontend-worker.ts"
|
|
52
|
+
|
|
53
|
+
# No [placement] - runs at edge
|
|
54
|
+
|
|
55
|
+
[[services]]
|
|
56
|
+
binding = "BACKEND"
|
|
57
|
+
service = "backend-api"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Backend Worker (Smart Placement Enabled)
|
|
61
|
+
|
|
62
|
+
```toml
|
|
63
|
+
# backend-api/wrangler.toml
|
|
64
|
+
name = "backend-api"
|
|
65
|
+
main = "backend-worker.ts"
|
|
66
|
+
|
|
67
|
+
[placement]
|
|
68
|
+
mode = "smart"
|
|
69
|
+
|
|
70
|
+
[[d1_databases]]
|
|
71
|
+
binding = "DATABASE"
|
|
72
|
+
database_id = "xxx"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Requirements & Limitations
|
|
76
|
+
|
|
77
|
+
### Requirements
|
|
78
|
+
- **Wrangler version:** 2.20.0+
|
|
79
|
+
- **Analysis time:** Up to 15 minutes
|
|
80
|
+
- **Traffic requirements:** Consistent multi-location traffic
|
|
81
|
+
- **Workers plan:** All plans (Free, Paid, Enterprise)
|
|
82
|
+
|
|
83
|
+
### What Smart Placement Affects
|
|
84
|
+
- ✅ **Affects:** `fetch` event handlers only
|
|
85
|
+
- ❌ **Does NOT affect:** RPC methods, named entrypoints, Workers without fetch handlers
|
|
86
|
+
|
|
87
|
+
### Baseline Traffic
|
|
88
|
+
Smart Placement automatically routes 1% of requests WITHOUT optimization as baseline for performance comparison.
|
|
89
|
+
|
|
90
|
+
## Dashboard Configuration
|
|
91
|
+
|
|
92
|
+
**Enable via Dashboard:**
|
|
93
|
+
1. Navigate to **Workers & Pages** in Cloudflare dashboard
|
|
94
|
+
2. Select your Worker
|
|
95
|
+
3. Go to **Settings** → **General**
|
|
96
|
+
4. Under **Placement**, select **Smart**
|
|
97
|
+
5. Wait 15 minutes for analysis
|
|
98
|
+
6. Check **Metrics** tab for request duration charts
|
|
99
|
+
|
|
100
|
+
## TypeScript Environment Types
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
interface Env {
|
|
104
|
+
// Backend Worker binding (Smart Placement enabled)
|
|
105
|
+
BACKEND: Fetcher;
|
|
106
|
+
DATABASE: D1Database;
|
|
107
|
+
CACHE: KVNamespace;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export default {
|
|
111
|
+
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
|
112
|
+
const data = await env.DATABASE.prepare('SELECT * FROM table').all();
|
|
113
|
+
return Response.json(data);
|
|
114
|
+
}
|
|
115
|
+
} satisfies ExportedHandler<Env>;
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Local Development
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
# Smart Placement does NOT affect local development
|
|
122
|
+
wrangler dev
|
|
123
|
+
|
|
124
|
+
# Local dev always runs in single location
|
|
125
|
+
# Test Smart Placement by deploying to staging
|
|
126
|
+
wrangler deploy --env staging
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Smart Placement only activates in production deployments.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Smart Placement Gotchas
|
|
2
|
+
|
|
3
|
+
## "INSUFFICIENT_INVOCATIONS" Status
|
|
4
|
+
|
|
5
|
+
**Problem:** Not enough traffic for Smart Placement to analyze.
|
|
6
|
+
|
|
7
|
+
**Solutions:**
|
|
8
|
+
- Ensure Worker receives consistent global traffic
|
|
9
|
+
- Wait longer (analysis takes up to 15 minutes)
|
|
10
|
+
- Send test traffic from multiple global locations
|
|
11
|
+
- Check Worker has fetch event handler
|
|
12
|
+
|
|
13
|
+
## Smart Placement Making Things Slower
|
|
14
|
+
|
|
15
|
+
**Problem:** `placement_status: "UNSUPPORTED_APPLICATION"`
|
|
16
|
+
|
|
17
|
+
**Likely Causes:**
|
|
18
|
+
- Worker doesn't make backend calls (runs faster at edge)
|
|
19
|
+
- Backend calls are cached (network latency to user more important)
|
|
20
|
+
- Backend service has poor global distribution
|
|
21
|
+
|
|
22
|
+
**Solutions:**
|
|
23
|
+
- Disable Smart Placement for this Worker
|
|
24
|
+
- Review whether Worker actually benefits from Smart Placement
|
|
25
|
+
- Consider caching strategy to reduce backend calls
|
|
26
|
+
|
|
27
|
+
## No Request Duration Metrics
|
|
28
|
+
|
|
29
|
+
**Problem:** Request duration chart not showing in dashboard.
|
|
30
|
+
|
|
31
|
+
**Solutions:**
|
|
32
|
+
- Ensure Smart Placement enabled in config
|
|
33
|
+
- Wait 15+ minutes after deployment
|
|
34
|
+
- Verify Worker has sufficient traffic
|
|
35
|
+
- Check `placement_status` is `SUCCESS`
|
|
36
|
+
|
|
37
|
+
## cf-placement Header Missing
|
|
38
|
+
|
|
39
|
+
**Problem:** Header not present in responses.
|
|
40
|
+
|
|
41
|
+
**Possible Causes:**
|
|
42
|
+
- Smart Placement not enabled
|
|
43
|
+
- Beta feature removed (check latest docs)
|
|
44
|
+
- Worker hasn't been analyzed yet
|
|
45
|
+
|
|
46
|
+
## Monolithic Full-Stack Worker
|
|
47
|
+
|
|
48
|
+
**Problem:** Frontend and backend logic in single Worker with Smart Placement enabled.
|
|
49
|
+
|
|
50
|
+
**Impact:** Smart Placement optimizes for backend latency but hurts frontend response time to users.
|
|
51
|
+
|
|
52
|
+
**Solution:** Split into two Workers:
|
|
53
|
+
- Frontend Worker (no Smart Placement) - runs at edge
|
|
54
|
+
- Backend Worker (Smart Placement) - runs near database
|
|
55
|
+
|
|
56
|
+
## Local Development Confusion
|
|
57
|
+
|
|
58
|
+
**Issue:** Smart Placement doesn't work in `wrangler dev`.
|
|
59
|
+
|
|
60
|
+
**Explanation:** Smart Placement only activates in production deployments, not local development.
|
|
61
|
+
|
|
62
|
+
**Solution:** Test Smart Placement in staging environment: `wrangler deploy --env staging`
|
|
63
|
+
|
|
64
|
+
## Baseline 1% Traffic
|
|
65
|
+
|
|
66
|
+
**Note:** Smart Placement automatically routes 1% of requests WITHOUT optimization for performance comparison. This is expected behavior.
|
|
67
|
+
|
|
68
|
+
## Analysis Time
|
|
69
|
+
|
|
70
|
+
**Issue:** Smart Placement takes up to 15 minutes after enabling to complete analysis.
|
|
71
|
+
|
|
72
|
+
**Impact:** During analysis, Worker runs at default edge location. Be patient and monitor `placement_status`.
|
|
73
|
+
|
|
74
|
+
## Requirements
|
|
75
|
+
|
|
76
|
+
- **Wrangler 2.20.0+** required
|
|
77
|
+
- **Consistent multi-region traffic** needed for analysis
|
|
78
|
+
- **Only affects fetch handlers** - RPC methods and named entrypoints not affected
|
|
79
|
+
|
|
80
|
+
## When NOT to Use
|
|
81
|
+
|
|
82
|
+
- Workers serving only static content or cached responses
|
|
83
|
+
- Workers without significant backend communication
|
|
84
|
+
- Pure edge logic (auth checks, redirects, simple transformations)
|
|
85
|
+
- Workers without fetch event handlers
|
|
86
|
+
|
|
87
|
+
These scenarios won't benefit and may perform worse with Smart Placement.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Smart Placement Patterns
|
|
2
|
+
|
|
3
|
+
## Backend Worker with Database Access
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// Smart Placement runs close to database - multiple round trips benefit
|
|
7
|
+
export default {
|
|
8
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
9
|
+
const user = await env.DATABASE.prepare('SELECT * FROM users WHERE id = ?').bind(userId).first();
|
|
10
|
+
const orders = await env.DATABASE.prepare('SELECT * FROM orders WHERE user_id = ?').bind(userId).all();
|
|
11
|
+
return Response.json({ user, orders });
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
```toml
|
|
17
|
+
name = "backend-api"; [placement]; mode = "smart"; [[d1_databases]]; binding = "DATABASE"
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Frontend + Backend Split
|
|
21
|
+
|
|
22
|
+
**Frontend (no Smart Placement):** Runs at edge for fast user response
|
|
23
|
+
**Backend (Smart Placement):** Runs close to database
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
// Frontend - forwards API requests to backend
|
|
27
|
+
export default {
|
|
28
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
29
|
+
if (new URL(request.url).pathname.startsWith('/api/')) return env.BACKEND.fetch(request);
|
|
30
|
+
return env.ASSETS.fetch(request);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Backend - database operations
|
|
35
|
+
export default {
|
|
36
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
37
|
+
return Response.json(await env.DATABASE.prepare('SELECT * FROM table').all());
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## External API Integration
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// Smart Placement runs closer to external API - multiple calls benefit
|
|
46
|
+
export default {
|
|
47
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
48
|
+
const apiUrl = 'https://api.partner.com';
|
|
49
|
+
const headers = { 'Authorization': `Bearer ${env.API_KEY}` };
|
|
50
|
+
const [profile, transactions] = await Promise.all([
|
|
51
|
+
fetch(`${apiUrl}/profile`, { headers }),
|
|
52
|
+
fetch(`${apiUrl}/transactions`, { headers })
|
|
53
|
+
]);
|
|
54
|
+
return Response.json({ profile: await profile.json(), transactions: await transactions.json() });
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```toml
|
|
60
|
+
[placement]; mode = "smart"; hint = "enam" # If API in East North America
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Multi-Service Aggregation
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
// Aggregates data from multiple services in same region
|
|
67
|
+
export default {
|
|
68
|
+
async fetch(request: Request, env: Env) {
|
|
69
|
+
const [orders, inventory, shipping] = await Promise.all([
|
|
70
|
+
fetch('https://orders.internal.api'), fetch('https://inventory.internal.api'), fetch('https://shipping.internal.api')
|
|
71
|
+
]);
|
|
72
|
+
return Response.json({ orders: await orders.json(), inventory: await inventory.json(), shipping: await shipping.json() });
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## SSR with Backend Data
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
// Frontend SSR (edge) - render close to user
|
|
81
|
+
export default {
|
|
82
|
+
async fetch(request: Request, env: Env) {
|
|
83
|
+
const data = await env.BACKEND.fetch('/api/page-data');
|
|
84
|
+
return new Response(renderPage(await data.json()), { headers: { 'Content-Type': 'text/html' } });
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// Backend (Smart Placement) - fetch data close to database
|
|
89
|
+
export default {
|
|
90
|
+
async fetch(request: Request, env: Env) {
|
|
91
|
+
return Response.json(await env.DATABASE.prepare('SELECT * FROM pages WHERE id = ?').bind(pageId).first());
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## API Gateway
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
// Gateway at edge - quick auth, forward to backend
|
|
100
|
+
export default {
|
|
101
|
+
async fetch(request: Request, env: Env) {
|
|
102
|
+
if (!request.headers.get('Authorization')) return new Response('Unauthorized', { status: 401 });
|
|
103
|
+
return env.BACKEND_API.fetch(request);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// Backend with Smart Placement - heavy DB operations
|
|
108
|
+
export default {
|
|
109
|
+
async fetch(request: Request, env: Env) {
|
|
110
|
+
return Response.json(await performDatabaseOperations(env.DATABASE));
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Best Practices
|
|
116
|
+
|
|
117
|
+
1. **Split Full-Stack Apps:** Frontend at edge, backend with Smart Placement
|
|
118
|
+
2. **Use Service Bindings:** Connect frontend/backend Workers efficiently
|
|
119
|
+
3. **Monitor Request Duration:** Compare before/after metrics
|
|
120
|
+
4. **Enable for Backend Logic:** APIs, data aggregation, server-side processing
|
|
121
|
+
5. **Don't Enable for Pure Edge:** Auth, redirects, static content
|
|
122
|
+
6. **Test Before Production:** Deploy to staging, verify metrics
|
|
123
|
+
7. **Consider Placement Hints:** Guide Smart Placement if you know backend location
|
|
124
|
+
8. **Wait for Analysis:** 15+ minutes after enabling
|
|
125
|
+
9. **Check Placement Status:** Verify `SUCCESS` via API
|
|
126
|
+
10. **Combine with Caching:** Cache frequently accessed data
|
|
127
|
+
|
|
128
|
+
## Anti-Patterns
|
|
129
|
+
|
|
130
|
+
❌ **Enabling on static content Workers**
|
|
131
|
+
❌ **Monolithic full-stack Worker with Smart Placement** (hurts frontend performance)
|
|
132
|
+
❌ **Not monitoring placement status** after deploy
|
|
133
|
+
|
|
134
|
+
✅ **Split architecture:** Frontend (edge) + Backend (Smart Placement)
|
|
135
|
+
✅ **Verify status** via API and metrics
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Cloudflare Snippets Skill Reference
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
Expert guidance for **Cloudflare Snippets ONLY** - a lightweight JavaScript-based edge logic platform for modifying HTTP requests and responses. Snippets run as part of the Ruleset Engine and are included at no additional cost on paid plans (Pro, Business, Enterprise)....
|
|
5
|
+
|
|
6
|
+
## In This Reference
|
|
7
|
+
|
|
8
|
+
- **[configuration.md](./configuration.md)** - Setup, deployment, configuration
|
|
9
|
+
- **[api.md](./api.md)** - API endpoints, methods, interfaces
|
|
10
|
+
- **[patterns.md](./patterns.md)** - Common patterns, use cases, examples
|
|
11
|
+
- **[gotchas.md](./gotchas.md)** - Troubleshooting, best practices, limitations
|
|
12
|
+
|
|
13
|
+
## See Also
|
|
14
|
+
|
|
15
|
+
- [Cloudflare Docs](https://developers.cloudflare.com/)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
### HTTP Methods
|
|
2
|
+
```javascript
|
|
3
|
+
request.method // GET, POST, PUT, DELETE, etc.
|
|
4
|
+
```
|
|
5
|
+
|
|
6
|
+
### Response Constructors
|
|
7
|
+
```javascript
|
|
8
|
+
// Plain text
|
|
9
|
+
new Response("Hello", { status: 200 })
|
|
10
|
+
|
|
11
|
+
// JSON
|
|
12
|
+
Response.json({ key: "value" })
|
|
13
|
+
|
|
14
|
+
// HTML
|
|
15
|
+
new Response("<h1>Hi</h1>", {
|
|
16
|
+
headers: { "Content-Type": "text/html" }
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
// Redirect
|
|
20
|
+
Response.redirect("https://example.com", 301)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Header Operations
|
|
24
|
+
```javascript
|
|
25
|
+
// Request headers
|
|
26
|
+
request.headers.get("X-Header")
|
|
27
|
+
request.headers.has("X-Header")
|
|
28
|
+
request.headers.set("X-Header", "value")
|
|
29
|
+
request.headers.delete("X-Header")
|
|
30
|
+
|
|
31
|
+
// Response headers (must clone first)
|
|
32
|
+
const res = new Response(response.body, response);
|
|
33
|
+
res.headers.set("X-Header", "value")
|
|
34
|
+
res.headers.append("Set-Cookie", "value")
|
|
35
|
+
res.headers.delete("X-Header")
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### URL Operations
|
|
39
|
+
```javascript
|
|
40
|
+
const url = new URL(request.url);
|
|
41
|
+
url.hostname // "example.com"
|
|
42
|
+
url.pathname // "/path/to/page"
|
|
43
|
+
url.search // "?query=value"
|
|
44
|
+
url.searchParams.get("query") // "value"
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Cloudflare Pr
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
## Configuration Methods
|
|
2
|
+
|
|
3
|
+
### 1. Dashboard (GUI)
|
|
4
|
+
```
|
|
5
|
+
1. Go to zone → Rules → Snippets
|
|
6
|
+
2. Create Snippet or select template
|
|
7
|
+
3. Enter snippet name (a-z, 0-9, _ only, cannot change later)
|
|
8
|
+
4. Write JavaScript code (32KB max)
|
|
9
|
+
5. Configure snippet rule:
|
|
10
|
+
- Expression Builder or Expression Editor
|
|
11
|
+
- Use Ruleset Engine filter expressions
|
|
12
|
+
6. Deploy or Save as Draft
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### 2. API
|
|
16
|
+
```bash
|
|
17
|
+
# Create/update snippet
|
|
18
|
+
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/snippets/$SNIPPET_NAME" \
|
|
19
|
+
--request PUT \
|
|
20
|
+
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
|
|
21
|
+
--form "files=@example.js" \
|
|
22
|
+
--form "metadata={\"main_module\": \"example.js\"}"
|
|
23
|
+
|
|
24
|
+
# Create snippet rule
|
|
25
|
+
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/snippets/snippet_rules" \
|
|
26
|
+
--request PUT \
|
|
27
|
+
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
|
|
28
|
+
--json '{
|
|
29
|
+
"rules": [
|
|
30
|
+
{
|
|
31
|
+
"description": "Trigger snippet on specific cookie",
|
|
32
|
+
"enabled": true,
|
|
33
|
+
"expression": "http.cookie eq
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
## Best Practices
|
|
2
|
+
|
|
3
|
+
### Performance
|
|
4
|
+
1. **Keep code minimal**: 32KB limit, but aim for <10KB
|
|
5
|
+
2. **Avoid blocking operations**: 5ms execution limit
|
|
6
|
+
3. **Clone only when needed**: `new Request(request)` creates copy
|
|
7
|
+
4. **Cache strategically**: Use `caches.default` for repeated data
|
|
8
|
+
5. **Limit subrequests**: Plan-based limits (2-5)
|
|
9
|
+
|
|
10
|
+
### Security
|
|
11
|
+
1. **Validate input**: Never trust user data
|
|
12
|
+
2. **Use Web Crypto API**: For cryptographic operations
|
|
13
|
+
3. **Sanitize headers**: Remove sensitive information
|
|
14
|
+
4. **Check bot scores**: Use `request.cf.botManagement.score`
|
|
15
|
+
5. **Rate limit carefully**: Snippets run on every matching request
|
|
16
|
+
|
|
17
|
+
### Debugging
|
|
18
|
+
1. **Test in dashboard**: Use HTTP/Preview tabs
|
|
19
|
+
2. **Start simple**: Test with basic logic first
|
|
20
|
+
3. **Use custom headers**: Add debug headers to responses
|
|
21
|
+
4.
|