memory-journal-mcp 7.7.0 → 8.0.0
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/README.md +126 -56
- package/dist/chunk-6OHRCNYW.js +3231 -0
- package/dist/chunk-JFMITANR.js +5168 -0
- package/dist/{chunk-QCQPAF4I.js → chunk-MWNLAEHR.js} +301 -4321
- package/dist/{chunk-ARLYSFSI.js → chunk-UHSO65A4.js} +4242 -6092
- package/dist/cli.js +21 -3
- package/dist/index.d.ts +16 -13
- package/dist/index.js +4 -2
- package/dist/resources-IJVKDFGS.js +2 -0
- package/dist/tools-44DGXE3V.js +2 -0
- package/dist/worker-script.js +201 -20
- package/package.json +7 -4
- package/skills/README.md +62 -25
- package/skills/adversarial-performance/SKILL.md +139 -0
- package/skills/adversarial-performance/references/audit-categories.md +462 -0
- package/skills/adversarial-performance/references/copilot-performance-prompts.md +44 -0
- package/skills/adversarial-performance/references/copilot-usage.md +16 -0
- package/skills/adversarial-performance/references/feedback-loop.md +177 -0
- package/skills/adversarial-performance/references/multi-pass-performance-protocol.md +398 -0
- package/skills/adversarial-planner/SKILL.md +23 -54
- package/skills/adversarial-planner/references/copilot-integration.md +25 -40
- package/skills/adversarial-planner/references/copilot-usage.md +16 -0
- package/skills/adversarial-planner/references/multi-pass-protocol.md +4 -0
- package/skills/adversarial-security/SKILL.md +149 -0
- package/skills/adversarial-security/references/adversarial-base-protocol.md +44 -0
- package/skills/adversarial-security/references/audit-categories.md +723 -0
- package/skills/adversarial-security/references/copilot-security-prompts.md +142 -0
- package/skills/adversarial-security/references/copilot-usage.md +16 -0
- package/skills/adversarial-security/references/feedback-loop.md +206 -0
- package/skills/adversarial-security/references/journal-opt-out.md +7 -0
- package/skills/adversarial-security/references/multi-pass-security-protocol.md +403 -0
- package/skills/adversarial-skill-audit/SKILL.md +118 -0
- package/skills/adversarial-skill-audit/references/audit-categories.md +308 -0
- package/skills/adversarial-skill-audit/references/copilot-skill-prompts.md +68 -0
- package/skills/adversarial-skill-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-skill-audit/references/feedback-loop.md +155 -0
- package/skills/adversarial-skill-audit/references/multi-pass-skill-protocol.md +367 -0
- package/skills/adversarial-skill-audit/scripts/check-skills.ps1 +48 -0
- package/skills/adversarial-skill-audit/scripts/run-copilot.ps1 +52 -0
- package/skills/adversarial-workflow-audit/SKILL.md +82 -0
- package/skills/adversarial-workflow-audit/references/audit-categories.md +28 -0
- package/skills/adversarial-workflow-audit/references/copilot-usage.md +16 -0
- package/skills/adversarial-workflow-audit/scripts/check-workflows.ps1 +24 -0
- package/skills/agents-sdk/SKILL.md +220 -0
- package/skills/agents-sdk/references/callable.md +92 -0
- package/skills/agents-sdk/references/codemode.md +209 -0
- package/skills/agents-sdk/references/email.md +144 -0
- package/skills/agents-sdk/references/mcp/SKILL.md +65 -0
- package/skills/agents-sdk/references/mcp/code-mode-reference.md +245 -0
- package/skills/agents-sdk/references/mcp/oauth-reference.md +359 -0
- package/skills/agents-sdk/references/mcp/references/architecture-reference.md +208 -0
- package/skills/agents-sdk/references/mcp/references/cloudflare-quickstart.md +156 -0
- package/skills/agents-sdk/references/mcp/references/error-handling.md +343 -0
- package/skills/agents-sdk/references/mcp/references/http-security.md +164 -0
- package/skills/agents-sdk/references/mcp/references/implementation-guide.md +507 -0
- package/skills/agents-sdk/references/mcp/references/testing-reference.md +171 -0
- package/skills/agents-sdk/references/mcp.md +157 -0
- package/skills/agents-sdk/references/state-scheduling.md +164 -0
- package/skills/agents-sdk/references/streaming-chat.md +168 -0
- package/skills/agents-sdk/references/workflows.md +136 -0
- package/skills/auth-identity/SKILL.md +48 -0
- package/skills/autonomous-dev/SKILL.md +46 -23
- package/skills/autonomous-dev/references/workflow_orchestration.md +22 -0
- package/skills/aws/SKILL.md +39 -0
- package/skills/azure/SKILL.md +38 -0
- package/skills/bin/sync.js +7 -1
- package/skills/biome/SKILL.md +59 -0
- package/skills/bun/SKILL.md +8 -2
- package/skills/cloudflare/SKILL.md +37 -0
- package/skills/cloudflare/references/agents-sdk/README.md +95 -0
- package/skills/cloudflare/references/agents-sdk/api.md +195 -0
- package/skills/cloudflare/references/agents-sdk/configuration.md +178 -0
- package/skills/cloudflare/references/agents-sdk/gotchas.md +173 -0
- package/skills/cloudflare/references/agents-sdk/patterns.md +215 -0
- package/skills/cloudflare/references/ai-gateway/README.md +176 -0
- package/skills/cloudflare/references/ai-gateway/configuration.md +117 -0
- package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +88 -0
- package/skills/cloudflare/references/ai-gateway/features.md +96 -0
- package/skills/cloudflare/references/ai-gateway/sdk-integration.md +110 -0
- package/skills/cloudflare/references/ai-gateway/troubleshooting.md +90 -0
- package/skills/cloudflare/references/ai-search/README.md +145 -0
- package/skills/cloudflare/references/ai-search/api.md +87 -0
- package/skills/cloudflare/references/ai-search/configuration.md +91 -0
- package/skills/cloudflare/references/ai-search/gotchas.md +92 -0
- package/skills/cloudflare/references/ai-search/patterns.md +87 -0
- package/skills/cloudflare/references/analytics-engine/README.md +96 -0
- package/skills/cloudflare/references/analytics-engine/api.md +112 -0
- package/skills/cloudflare/references/analytics-engine/configuration.md +107 -0
- package/skills/cloudflare/references/analytics-engine/gotchas.md +87 -0
- package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
- package/skills/cloudflare/references/api/README.md +66 -0
- package/skills/cloudflare/references/api/api.md +205 -0
- package/skills/cloudflare/references/api/configuration.md +158 -0
- package/skills/cloudflare/references/api/gotchas.md +231 -0
- package/skills/cloudflare/references/api/patterns.md +208 -0
- package/skills/cloudflare/references/api-shield/README.md +44 -0
- package/skills/cloudflare/references/api-shield/api.md +153 -0
- package/skills/cloudflare/references/api-shield/configuration.md +210 -0
- package/skills/cloudflare/references/api-shield/gotchas.md +132 -0
- package/skills/cloudflare/references/api-shield/patterns.md +185 -0
- package/skills/cloudflare/references/argo-smart-routing/README.md +96 -0
- package/skills/cloudflare/references/argo-smart-routing/api.md +253 -0
- package/skills/cloudflare/references/argo-smart-routing/configuration.md +205 -0
- package/skills/cloudflare/references/argo-smart-routing/gotchas.md +115 -0
- package/skills/cloudflare/references/argo-smart-routing/patterns.md +107 -0
- package/skills/cloudflare/references/bindings/README.md +127 -0
- package/skills/cloudflare/references/bindings/api.md +214 -0
- package/skills/cloudflare/references/bindings/configuration.md +200 -0
- package/skills/cloudflare/references/bindings/gotchas.md +210 -0
- package/skills/cloudflare/references/bindings/patterns.md +205 -0
- package/skills/cloudflare/references/bot-management/README.md +95 -0
- package/skills/cloudflare/references/bot-management/api.md +175 -0
- package/skills/cloudflare/references/bot-management/configuration.md +175 -0
- package/skills/cloudflare/references/bot-management/gotchas.md +116 -0
- package/skills/cloudflare/references/bot-management/patterns.md +181 -0
- package/skills/cloudflare/references/browser-rendering/README.md +84 -0
- package/skills/cloudflare/references/browser-rendering/api.md +108 -0
- package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
- package/skills/cloudflare/references/browser-rendering/gotchas.md +91 -0
- package/skills/cloudflare/references/browser-rendering/patterns.md +93 -0
- package/skills/cloudflare/references/c3/README.md +111 -0
- package/skills/cloudflare/references/c3/api.md +71 -0
- package/skills/cloudflare/references/c3/configuration.md +85 -0
- package/skills/cloudflare/references/c3/gotchas.md +97 -0
- package/skills/cloudflare/references/c3/patterns.md +84 -0
- package/skills/cloudflare/references/cache-reserve/README.md +150 -0
- package/skills/cloudflare/references/cache-reserve/api.md +184 -0
- package/skills/cloudflare/references/cache-reserve/configuration.md +170 -0
- package/skills/cloudflare/references/cache-reserve/gotchas.md +136 -0
- package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
- package/skills/cloudflare/references/containers/README.md +87 -0
- package/skills/cloudflare/references/containers/api.md +197 -0
- package/skills/cloudflare/references/containers/configuration.md +191 -0
- package/skills/cloudflare/references/containers/gotchas.md +182 -0
- package/skills/cloudflare/references/containers/patterns.md +204 -0
- package/skills/cloudflare/references/cron-triggers/README.md +101 -0
- package/skills/cloudflare/references/cron-triggers/api.md +224 -0
- package/skills/cloudflare/references/cron-triggers/configuration.md +190 -0
- package/skills/cloudflare/references/cron-triggers/gotchas.md +207 -0
- package/skills/cloudflare/references/cron-triggers/patterns.md +274 -0
- package/skills/cloudflare/references/d1/README.md +137 -0
- package/skills/cloudflare/references/d1/api.md +213 -0
- package/skills/cloudflare/references/d1/configuration.md +198 -0
- package/skills/cloudflare/references/d1/gotchas.md +98 -0
- package/skills/cloudflare/references/d1/patterns.md +240 -0
- package/skills/cloudflare/references/ddos/README.md +42 -0
- package/skills/cloudflare/references/ddos/api.md +158 -0
- package/skills/cloudflare/references/ddos/configuration.md +94 -0
- package/skills/cloudflare/references/ddos/gotchas.md +114 -0
- package/skills/cloudflare/references/ddos/patterns.md +220 -0
- package/skills/cloudflare/references/decision-trees.md +95 -0
- package/skills/cloudflare/references/do-storage/README.md +79 -0
- package/skills/cloudflare/references/do-storage/api.md +107 -0
- package/skills/cloudflare/references/do-storage/configuration.md +114 -0
- package/skills/cloudflare/references/do-storage/gotchas.md +153 -0
- package/skills/cloudflare/references/do-storage/patterns.md +210 -0
- package/skills/cloudflare/references/do-storage/testing.md +186 -0
- package/skills/cloudflare/references/durable-objects/README.md +194 -0
- package/skills/cloudflare/references/durable-objects/api.md +205 -0
- package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
- package/skills/cloudflare/references/durable-objects/gotchas.md +200 -0
- package/skills/cloudflare/references/durable-objects/patterns.md +205 -0
- package/skills/cloudflare/references/email-routing/README.md +89 -0
- package/skills/cloudflare/references/email-routing/api.md +192 -0
- package/skills/cloudflare/references/email-routing/configuration.md +187 -0
- package/skills/cloudflare/references/email-routing/gotchas.md +203 -0
- package/skills/cloudflare/references/email-routing/patterns.md +241 -0
- package/skills/cloudflare/references/email-workers/README.md +153 -0
- package/skills/cloudflare/references/email-workers/api.md +227 -0
- package/skills/cloudflare/references/email-workers/configuration.md +115 -0
- package/skills/cloudflare/references/email-workers/gotchas.md +133 -0
- package/skills/cloudflare/references/email-workers/patterns.md +108 -0
- package/skills/cloudflare/references/graphql-api/README.md +147 -0
- package/skills/cloudflare/references/graphql-api/api.md +175 -0
- package/skills/cloudflare/references/graphql-api/configuration.md +151 -0
- package/skills/cloudflare/references/graphql-api/gotchas.md +111 -0
- package/skills/cloudflare/references/graphql-api/patterns.md +276 -0
- package/skills/cloudflare/references/hyperdrive/README.md +84 -0
- package/skills/cloudflare/references/hyperdrive/api.md +149 -0
- package/skills/cloudflare/references/hyperdrive/configuration.md +166 -0
- package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
- package/skills/cloudflare/references/hyperdrive/patterns.md +203 -0
- package/skills/cloudflare/references/images/README.md +65 -0
- package/skills/cloudflare/references/images/api.md +101 -0
- package/skills/cloudflare/references/images/configuration.md +206 -0
- package/skills/cloudflare/references/images/gotchas.md +106 -0
- package/skills/cloudflare/references/images/patterns.md +126 -0
- package/skills/cloudflare/references/kv/README.md +90 -0
- package/skills/cloudflare/references/kv/api.md +163 -0
- package/skills/cloudflare/references/kv/configuration.md +148 -0
- package/skills/cloudflare/references/kv/gotchas.md +133 -0
- package/skills/cloudflare/references/kv/patterns.md +195 -0
- package/skills/cloudflare/references/miniflare/README.md +113 -0
- package/skills/cloudflare/references/miniflare/api.md +204 -0
- package/skills/cloudflare/references/miniflare/configuration.md +174 -0
- package/skills/cloudflare/references/miniflare/gotchas.md +179 -0
- package/skills/cloudflare/references/miniflare/patterns.md +187 -0
- package/skills/cloudflare/references/network-interconnect/README.md +104 -0
- package/skills/cloudflare/references/network-interconnect/api.md +220 -0
- package/skills/cloudflare/references/network-interconnect/configuration.md +123 -0
- package/skills/cloudflare/references/network-interconnect/gotchas.md +175 -0
- package/skills/cloudflare/references/network-interconnect/patterns.md +174 -0
- package/skills/cloudflare/references/observability/README.md +93 -0
- package/skills/cloudflare/references/observability/api.md +168 -0
- package/skills/cloudflare/references/observability/configuration.md +178 -0
- package/skills/cloudflare/references/observability/gotchas.md +125 -0
- package/skills/cloudflare/references/observability/patterns.md +105 -0
- package/skills/cloudflare/references/pages/README.md +92 -0
- package/skills/cloudflare/references/pages/api.md +205 -0
- package/skills/cloudflare/references/pages/configuration.md +216 -0
- package/skills/cloudflare/references/pages/gotchas.md +218 -0
- package/skills/cloudflare/references/pages/patterns.md +215 -0
- package/skills/cloudflare/references/pages-functions/README.md +104 -0
- package/skills/cloudflare/references/pages-functions/api.md +159 -0
- package/skills/cloudflare/references/pages-functions/configuration.md +130 -0
- package/skills/cloudflare/references/pages-functions/gotchas.md +102 -0
- package/skills/cloudflare/references/pages-functions/patterns.md +148 -0
- package/skills/cloudflare/references/pipelines/README.md +109 -0
- package/skills/cloudflare/references/pipelines/api.md +214 -0
- package/skills/cloudflare/references/pipelines/configuration.md +98 -0
- package/skills/cloudflare/references/pipelines/gotchas.md +84 -0
- package/skills/cloudflare/references/pipelines/patterns.md +87 -0
- package/skills/cloudflare/references/product-index.md +112 -0
- package/skills/cloudflare/references/pulumi/README.md +113 -0
- package/skills/cloudflare/references/pulumi/api.md +230 -0
- package/skills/cloudflare/references/pulumi/configuration.md +213 -0
- package/skills/cloudflare/references/pulumi/gotchas.md +205 -0
- package/skills/cloudflare/references/pulumi/patterns.md +260 -0
- package/skills/cloudflare/references/queues/README.md +99 -0
- package/skills/cloudflare/references/queues/api.md +211 -0
- package/skills/cloudflare/references/queues/configuration.md +151 -0
- package/skills/cloudflare/references/queues/gotchas.md +210 -0
- package/skills/cloudflare/references/queues/patterns.md +220 -0
- package/skills/cloudflare/references/r2/README.md +97 -0
- package/skills/cloudflare/references/r2/api.md +235 -0
- package/skills/cloudflare/references/r2/configuration.md +176 -0
- package/skills/cloudflare/references/r2/gotchas.md +190 -0
- package/skills/cloudflare/references/r2/patterns.md +203 -0
- package/skills/cloudflare/references/r2-data-catalog/README.md +157 -0
- package/skills/cloudflare/references/r2-data-catalog/api.md +199 -0
- package/skills/cloudflare/references/r2-data-catalog/configuration.md +205 -0
- package/skills/cloudflare/references/r2-data-catalog/gotchas.md +170 -0
- package/skills/cloudflare/references/r2-data-catalog/patterns.md +191 -0
- package/skills/cloudflare/references/r2-sql/README.md +138 -0
- package/skills/cloudflare/references/r2-sql/SKILL.md.backup +512 -0
- package/skills/cloudflare/references/r2-sql/api.md +159 -0
- package/skills/cloudflare/references/r2-sql/configuration.md +152 -0
- package/skills/cloudflare/references/r2-sql/gotchas.md +228 -0
- package/skills/cloudflare/references/r2-sql/patterns.md +230 -0
- package/skills/cloudflare/references/realtime-sfu/README.md +66 -0
- package/skills/cloudflare/references/realtime-sfu/api.md +164 -0
- package/skills/cloudflare/references/realtime-sfu/configuration.md +141 -0
- package/skills/cloudflare/references/realtime-sfu/gotchas.md +138 -0
- package/skills/cloudflare/references/realtime-sfu/patterns.md +187 -0
- package/skills/cloudflare/references/realtimekit/README.md +118 -0
- package/skills/cloudflare/references/realtimekit/api.md +234 -0
- package/skills/cloudflare/references/realtimekit/configuration.md +226 -0
- package/skills/cloudflare/references/realtimekit/gotchas.md +206 -0
- package/skills/cloudflare/references/realtimekit/patterns.md +240 -0
- package/skills/cloudflare/references/sandbox/README.md +104 -0
- package/skills/cloudflare/references/sandbox/api.md +200 -0
- package/skills/cloudflare/references/sandbox/configuration.md +154 -0
- package/skills/cloudflare/references/sandbox/gotchas.md +201 -0
- package/skills/cloudflare/references/sandbox/patterns.md +195 -0
- package/skills/cloudflare/references/secrets-store/README.md +77 -0
- package/skills/cloudflare/references/secrets-store/api.md +199 -0
- package/skills/cloudflare/references/secrets-store/configuration.md +187 -0
- package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
- package/skills/cloudflare/references/secrets-store/patterns.md +218 -0
- package/skills/cloudflare/references/smart-placement/README.md +143 -0
- package/skills/cloudflare/references/smart-placement/api.md +192 -0
- package/skills/cloudflare/references/smart-placement/configuration.md +202 -0
- package/skills/cloudflare/references/smart-placement/gotchas.md +180 -0
- package/skills/cloudflare/references/smart-placement/patterns.md +190 -0
- package/skills/cloudflare/references/snippets/README.md +74 -0
- package/skills/cloudflare/references/snippets/api.md +214 -0
- package/skills/cloudflare/references/snippets/configuration.md +239 -0
- package/skills/cloudflare/references/snippets/gotchas.md +104 -0
- package/skills/cloudflare/references/snippets/patterns.md +135 -0
- package/skills/cloudflare/references/spectrum/README.md +52 -0
- package/skills/cloudflare/references/spectrum/api.md +184 -0
- package/skills/cloudflare/references/spectrum/configuration.md +203 -0
- package/skills/cloudflare/references/spectrum/gotchas.md +155 -0
- package/skills/cloudflare/references/spectrum/patterns.md +206 -0
- package/skills/cloudflare/references/static-assets/README.md +65 -0
- package/skills/cloudflare/references/static-assets/api.md +201 -0
- package/skills/cloudflare/references/static-assets/configuration.md +186 -0
- package/skills/cloudflare/references/static-assets/gotchas.md +164 -0
- package/skills/cloudflare/references/static-assets/patterns.md +189 -0
- package/skills/cloudflare/references/stream/README.md +123 -0
- package/skills/cloudflare/references/stream/api-live.md +202 -0
- package/skills/cloudflare/references/stream/api.md +206 -0
- package/skills/cloudflare/references/stream/configuration.md +151 -0
- package/skills/cloudflare/references/stream/gotchas.md +139 -0
- package/skills/cloudflare/references/stream/patterns.md +217 -0
- package/skills/cloudflare/references/tail-workers/README.md +92 -0
- package/skills/cloudflare/references/tail-workers/api.md +203 -0
- package/skills/cloudflare/references/tail-workers/configuration.md +178 -0
- package/skills/cloudflare/references/tail-workers/gotchas.md +206 -0
- package/skills/cloudflare/references/tail-workers/patterns.md +190 -0
- package/skills/cloudflare/references/terraform/README.md +100 -0
- package/skills/cloudflare/references/terraform/api.md +178 -0
- package/skills/cloudflare/references/terraform/configuration.md +197 -0
- package/skills/cloudflare/references/terraform/gotchas.md +150 -0
- package/skills/cloudflare/references/terraform/patterns.md +174 -0
- package/skills/cloudflare/references/tunnel/README.md +137 -0
- package/skills/cloudflare/references/tunnel/api.md +205 -0
- package/skills/cloudflare/references/tunnel/configuration.md +163 -0
- package/skills/cloudflare/references/tunnel/gotchas.md +159 -0
- package/skills/cloudflare/references/tunnel/networking.md +174 -0
- package/skills/cloudflare/references/tunnel/patterns.md +199 -0
- package/skills/cloudflare/references/turn/README.md +86 -0
- package/skills/cloudflare/references/turn/api.md +236 -0
- package/skills/cloudflare/references/turn/configuration.md +181 -0
- package/skills/cloudflare/references/turn/gotchas.md +236 -0
- package/skills/cloudflare/references/turn/patterns.md +228 -0
- package/skills/cloudflare/references/turnstile/README.md +102 -0
- package/skills/cloudflare/references/turnstile/api.md +253 -0
- package/skills/cloudflare/references/turnstile/configuration.md +242 -0
- package/skills/cloudflare/references/turnstile/gotchas.md +253 -0
- package/skills/cloudflare/references/turnstile/patterns.md +195 -0
- package/skills/cloudflare/references/vectorize/README.md +133 -0
- package/skills/cloudflare/references/vectorize/api.md +89 -0
- package/skills/cloudflare/references/vectorize/configuration.md +91 -0
- package/skills/cloudflare/references/vectorize/gotchas.md +83 -0
- package/skills/cloudflare/references/vectorize/patterns.md +92 -0
- package/skills/cloudflare/references/waf/README.md +125 -0
- package/skills/cloudflare/references/waf/api.md +203 -0
- package/skills/cloudflare/references/waf/configuration.md +215 -0
- package/skills/cloudflare/references/waf/gotchas.md +208 -0
- package/skills/cloudflare/references/waf/patterns.md +236 -0
- package/skills/cloudflare/references/web-analytics/README.md +149 -0
- package/skills/cloudflare/references/web-analytics/configuration.md +81 -0
- package/skills/cloudflare/references/web-analytics/gotchas.md +86 -0
- package/skills/cloudflare/references/web-analytics/integration.md +63 -0
- package/skills/cloudflare/references/web-analytics/patterns.md +98 -0
- package/skills/cloudflare/references/workerd/README.md +85 -0
- package/skills/cloudflare/references/workerd/api.md +219 -0
- package/skills/cloudflare/references/workerd/configuration.md +200 -0
- package/skills/cloudflare/references/workerd/gotchas.md +151 -0
- package/skills/cloudflare/references/workerd/patterns.md +205 -0
- package/skills/cloudflare/references/workers/README.md +110 -0
- package/skills/cloudflare/references/workers/api.md +197 -0
- package/skills/cloudflare/references/workers/configuration.md +184 -0
- package/skills/cloudflare/references/workers/frameworks.md +200 -0
- package/skills/cloudflare/references/workers/gotchas.md +145 -0
- package/skills/cloudflare/references/workers/patterns.md +220 -0
- package/skills/cloudflare/references/workers-ai/README.md +206 -0
- package/skills/cloudflare/references/workers-ai/api.md +115 -0
- package/skills/cloudflare/references/workers-ai/configuration.md +98 -0
- package/skills/cloudflare/references/workers-ai/gotchas.md +130 -0
- package/skills/cloudflare/references/workers-ai/patterns.md +122 -0
- package/skills/cloudflare/references/workers-for-platforms/README.md +95 -0
- package/skills/cloudflare/references/workers-for-platforms/api.md +212 -0
- package/skills/cloudflare/references/workers-for-platforms/configuration.md +178 -0
- package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
- package/skills/cloudflare/references/workers-for-platforms/patterns.md +210 -0
- package/skills/cloudflare/references/workers-playground/README.md +131 -0
- package/skills/cloudflare/references/workers-playground/api.md +101 -0
- package/skills/cloudflare/references/workers-playground/configuration.md +169 -0
- package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
- package/skills/cloudflare/references/workers-playground/patterns.md +134 -0
- package/skills/cloudflare/references/workers-vpc/README.md +130 -0
- package/skills/cloudflare/references/workers-vpc/api.md +196 -0
- package/skills/cloudflare/references/workers-vpc/configuration.md +151 -0
- package/skills/cloudflare/references/workers-vpc/gotchas.md +171 -0
- package/skills/cloudflare/references/workers-vpc/patterns.md +235 -0
- package/skills/cloudflare/references/workflows/README.md +72 -0
- package/skills/cloudflare/references/workflows/api.md +237 -0
- package/skills/cloudflare/references/workflows/configuration.md +158 -0
- package/skills/cloudflare/references/workflows/gotchas.md +97 -0
- package/skills/cloudflare/references/workflows/patterns.md +245 -0
- package/skills/cloudflare/references/wrangler/README.md +143 -0
- package/skills/cloudflare/references/wrangler/api.md +188 -0
- package/skills/cloudflare/references/wrangler/configuration.md +198 -0
- package/skills/cloudflare/references/wrangler/gotchas.md +212 -0
- package/skills/cloudflare/references/wrangler/patterns.md +211 -0
- package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +131 -0
- package/skills/cloudflare/references/zaraz/README.md +114 -0
- package/skills/cloudflare/references/zaraz/api.md +118 -0
- package/skills/cloudflare/references/zaraz/configuration.md +94 -0
- package/skills/cloudflare/references/zaraz/gotchas.md +88 -0
- package/skills/cloudflare/references/zaraz/patterns.md +77 -0
- package/skills/docker/SKILL.md +7 -101
- package/skills/docker/references/advanced-examples.md +71 -0
- package/skills/docker/references/templates.md +34 -0
- package/skills/docs-marketer/SKILL.md +178 -0
- package/skills/docs-marketer/references/audit-categories.md +328 -0
- package/skills/docs-marketer/references/copilot-docs-prompts.md +88 -0
- package/skills/docs-marketer/references/copilot-usage.md +16 -0
- package/skills/docs-marketer/references/feedback-loop.md +155 -0
- package/skills/docs-marketer/references/multi-pass-docs-protocol.md +410 -0
- package/skills/drizzle-orm/SKILL.md +82 -0
- package/skills/durable-objects/SKILL.md +167 -0
- package/skills/durable-objects/references/advanced_features.md +29 -0
- package/skills/durable-objects/references/rules.md +300 -0
- package/skills/durable-objects/references/testing.md +261 -0
- package/skills/durable-objects/references/workers.md +336 -0
- package/skills/gcp/SKILL.md +37 -0
- package/skills/github-actions/SKILL.md +5 -58
- package/skills/github-actions/references/templates.md +65 -0
- package/skills/github-commander/SKILL.md +13 -21
- package/skills/github-commander/workflows/copilot-audit.md +12 -12
- package/skills/github-copilot-cli/SKILL.md +21 -26
- package/skills/github-repo-setup/SKILL.md +136 -0
- package/skills/github-repo-setup/references/community-standards.md +136 -0
- package/skills/github-repo-setup/references/github-automation.md +490 -0
- package/skills/github-repo-setup/references/inline-templates.md +205 -0
- package/skills/github-repo-setup/references/project-config.md +320 -0
- package/skills/gitlab/SKILL.md +7 -2
- package/skills/gitlab/package-lock.json +389 -389
- package/skills/golang/SKILL.md +8 -1
- package/skills/graphql/SKILL.md +30 -0
- package/skills/hono/SKILL.md +82 -0
- package/skills/journal-optimizer/SKILL.md +206 -0
- package/skills/journal-optimizer/references/optimizer-scripts.md +169 -0
- package/skills/llm-app-engineering/SKILL.md +18 -0
- package/skills/monorepo/SKILL.md +56 -0
- package/skills/multi-agent-orchestration/SKILL.md +14 -0
- package/skills/mysql/SKILL.md +6 -2
- package/skills/next-best-practices/SKILL.md +86 -0
- package/skills/next-best-practices/references/cache-components-examples.md +234 -0
- package/skills/next-best-practices/references/cache-components.md +210 -0
- package/skills/next-best-practices/references/upgrade-decision-tree.md +33 -0
- package/skills/next-best-practices/references/upgrade.md +43 -0
- package/skills/next-cache-components/SKILL.md +441 -0
- package/skills/next-upgrade/SKILL.md +43 -0
- package/skills/next-upgrade/references/decision-tree.md +33 -0
- package/skills/nodejs/SKILL.md +46 -0
- package/skills/opentelemetry/SKILL.md +62 -0
- package/skills/package.json +39 -4
- package/skills/playwright-standard/SKILL.md +6 -11
- package/skills/playwright-standard/references/locators.md +7 -0
- package/skills/postgres/SKILL.md +6 -1
- package/skills/python/SKILL.md +8 -70
- package/skills/python/references/advanced-patterns.md +37 -0
- package/skills/python/references/config-templates.md +48 -0
- package/skills/rag-pipelines/SKILL.md +14 -0
- package/skills/redis/SKILL.md +31 -0
- package/skills/render/SKILL.md +35 -0
- package/skills/rust/SKILL.md +15 -25
- package/skills/rust/references/borrow-checker.md +13 -0
- package/skills/rust/references/ecosystem.md +11 -0
- package/skills/sandbox-sdk/SKILL.md +186 -0
- package/skills/sandbox-sdk/references/api-quick-ref.md +113 -0
- package/skills/sandbox-sdk/references/examples.md +52 -0
- package/skills/shadcn-ui/SKILL.md +22 -57
- package/skills/skill-builder/SKILL.md +23 -424
- package/skills/skill-builder/references/tutorial.md +457 -0
- package/skills/sqlite/SKILL.md +16 -5
- package/skills/table.md +59 -0
- package/skills/tailwind-css/SKILL.md +11 -60
- package/skills/tailwind-css/references/component-patterns.md +52 -0
- package/skills/trpc/SKILL.md +56 -0
- package/skills/typescript/SKILL.md +30 -433
- package/skills/typescript/references/tutorial.md +453 -0
- package/skills/vercel-ai-sdk/SKILL.md +48 -0
- package/skills/vitest-standard/SKILL.md +5 -11
- package/skills/vitest-standard/references/assertions.md +11 -0
- package/skills/web-perf/SKILL.md +207 -0
- package/skills/workers-best-practices/SKILL.md +120 -0
- package/skills/workers-best-practices/references/anti-patterns.md +18 -0
- package/skills/workers-best-practices/references/review.md +174 -0
- package/skills/workers-best-practices/references/rules.md +485 -0
- package/skills/wrangler/SKILL.md +43 -0
- package/skills/wrangler/references/cli-commands.md +861 -0
- package/skills/zod/SKILL.md +48 -0
- package/dist/tools-P4VGG4FH.js +0 -1
- package/skills/react-best-practices/AGENTS.md +0 -2883
- package/skills/react-best-practices/SKILL.md +0 -138
- /package/skills/{react-best-practices → next-best-practices}/README.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/metadata.json +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_sections.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/_template.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-event-handler-refs.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-init-once.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/advanced-use-latest.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-api-routes.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-defer-await.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-parallel.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/async-suspense-boundaries.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-barrel-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-conditional.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-defer-third-party.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-dynamic-imports.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/bundle-preload.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-localstorage-schema.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-passive-event-listeners.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/client-swr-dedup.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-batch-dom-css.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-function-results.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-property-access.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-cache-storage.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-combine-iterations.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-early-exit.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-hoist-regexp.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-index-maps.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-length-check-first.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-min-max-loop.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-set-map-lookups.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/js-tosorted-immutable.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-activity.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-animate-svg-wrapper.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-conditional-render.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-content-visibility.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hoist-jsx.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-no-flicker.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-hydration-suppress-warning.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-svg-precision.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rendering-usetransition-loading.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-defer-reads.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-dependencies.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state-no-effect.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-derived-state.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-functional-setstate.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-lazy-state-init.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo-with-default-value.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-move-effect-to-event.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-simple-expression-in-memo.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-transitions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/rerender-use-ref-transient-values.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-after-nonblocking.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-auth-actions.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-lru.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-cache-react.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-dedup-props.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-parallel-fetching.md +0 -0
- /package/skills/{react-best-practices → next-best-practices}/rules/server-serialization.md +0 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
## Configuration Patterns
|
|
2
|
+
|
|
3
|
+
### Enable Workers Logs
|
|
4
|
+
|
|
5
|
+
```jsonc
|
|
6
|
+
{
|
|
7
|
+
"observability": {
|
|
8
|
+
"enabled": true,
|
|
9
|
+
"head_sampling_rate": 1, // 100% sampling (default)
|
|
10
|
+
},
|
|
11
|
+
}
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**Best Practice**: Use structured JSON logging for better indexing
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
// Good - structured logging
|
|
18
|
+
console.log({
|
|
19
|
+
user_id: 123,
|
|
20
|
+
action: 'login',
|
|
21
|
+
status: 'success',
|
|
22
|
+
duration_ms: 45,
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
// Avoid - unstructured string
|
|
26
|
+
console.log('user_id: 123 logged in successfully in 45ms')
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Enable Workers Traces
|
|
30
|
+
|
|
31
|
+
```jsonc
|
|
32
|
+
{
|
|
33
|
+
"observability": {
|
|
34
|
+
"traces": {
|
|
35
|
+
"enabled": true,
|
|
36
|
+
"head_sampling_rate": 0.05, // 5% sampling
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Note**: Default sampling is 100%. For high-traffic Workers, use lower sampling (0.01-0.1).
|
|
43
|
+
|
|
44
|
+
### Configure Analytics Engine
|
|
45
|
+
|
|
46
|
+
**Bind to Worker**:
|
|
47
|
+
|
|
48
|
+
```toml
|
|
49
|
+
# wrangler.toml
|
|
50
|
+
analytics_engine_datasets = [
|
|
51
|
+
{ binding = "ANALYTICS", dataset = "api_metrics" }
|
|
52
|
+
]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Write Data Points**:
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
export interface Env {
|
|
59
|
+
ANALYTICS: AnalyticsEngineDataset
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export default {
|
|
63
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
64
|
+
// Track metrics
|
|
65
|
+
env.ANALYTICS.writeDataPoint({
|
|
66
|
+
blobs: ['customer_123', 'POST', '/api/v1/users'],
|
|
67
|
+
doubles: [1, 245.5], // request_count, response_time_ms
|
|
68
|
+
indexes: ['customer_123'], // for efficient filtering
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
return new Response('OK')
|
|
72
|
+
},
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Configure Tail Workers
|
|
77
|
+
|
|
78
|
+
Tail Workers receive logs/traces from other Workers for filtering, transformation, or export.
|
|
79
|
+
|
|
80
|
+
**Setup**:
|
|
81
|
+
|
|
82
|
+
```toml
|
|
83
|
+
# wrangler.toml
|
|
84
|
+
name = "log-processor"
|
|
85
|
+
main = "src/tail.ts"
|
|
86
|
+
|
|
87
|
+
[[tail_consumers]]
|
|
88
|
+
service = "my-worker" # Worker to tail
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Tail Worker Example**:
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
export default {
|
|
95
|
+
async tail(events: TraceItem[], env: Env, ctx: ExecutionContext) {
|
|
96
|
+
// Filter errors only
|
|
97
|
+
const errors = events.filter(
|
|
98
|
+
(event) => event.outcome === 'exception' || event.outcome === 'exceededCpu'
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
if (errors.length > 0) {
|
|
102
|
+
// Send to external monitoring
|
|
103
|
+
ctx.waitUntil(
|
|
104
|
+
fetch('https://monitoring.example.com/errors', {
|
|
105
|
+
method: 'POST',
|
|
106
|
+
body: JSON.stringify(errors),
|
|
107
|
+
})
|
|
108
|
+
)
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Configure Logpush
|
|
115
|
+
|
|
116
|
+
Send logs to external storage (S3, R2, GCS, Azure, Datadog, etc.). Requires Business/Enterprise plan.
|
|
117
|
+
|
|
118
|
+
**Via Dashboard**:
|
|
119
|
+
|
|
120
|
+
1. Navigate to Analytics → Logs → Logpush
|
|
121
|
+
2. Select destination type
|
|
122
|
+
3. Provide credentials and bucket/endpoint
|
|
123
|
+
4. Choose dataset (e.g., Workers Trace Events)
|
|
124
|
+
5. Configure filters and fields
|
|
125
|
+
|
|
126
|
+
**Via API**:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
curl -X POST "https://api.cloudflare.com/client/v4/accounts/{account_id}/logpush/jobs" \
|
|
130
|
+
-H "Authorization: Bearer <API_TOKEN>" \
|
|
131
|
+
-H "Content-Type: application/json" \
|
|
132
|
+
-d '{
|
|
133
|
+
"name": "workers-logs-to-s3",
|
|
134
|
+
"destination_conf": "s3://my-bucket/logs?region=us-east-1",
|
|
135
|
+
"dataset": "workers_trace_events",
|
|
136
|
+
"enabled": true,
|
|
137
|
+
"frequency": "high",
|
|
138
|
+
"filter": "{\"where\":{\"and\":[{\"key\":\"ScriptName\",\"operator\":\"eq\",\"value\":\"my-worker\"}]}}"
|
|
139
|
+
}'
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Environment-Specific Configuration
|
|
143
|
+
|
|
144
|
+
**Development** (verbose logs, full sampling):
|
|
145
|
+
|
|
146
|
+
```jsonc
|
|
147
|
+
// wrangler.dev.jsonc
|
|
148
|
+
{
|
|
149
|
+
"observability": {
|
|
150
|
+
"enabled": true,
|
|
151
|
+
"head_sampling_rate": 1.0,
|
|
152
|
+
"traces": {
|
|
153
|
+
"enabled": true,
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
**Production** (reduced sampling, structured logs):
|
|
160
|
+
|
|
161
|
+
```jsonc
|
|
162
|
+
// wrangler.prod.jsonc
|
|
163
|
+
{
|
|
164
|
+
"observability": {
|
|
165
|
+
"enabled": true,
|
|
166
|
+
"head_sampling_rate": 0.1, // 10% sampling
|
|
167
|
+
"traces": {
|
|
168
|
+
"enabled": true,
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Deploy with env-specific config:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
wrangler deploy --config wrangler.prod.jsonc --env production
|
|
178
|
+
```
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
## Common Errors
|
|
2
|
+
|
|
3
|
+
### "Logs not appearing"
|
|
4
|
+
|
|
5
|
+
**Cause:** Observability disabled, Worker not redeployed, no traffic, low sampling rate, or log size exceeds 256 KB
|
|
6
|
+
**Solution:**
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
# Verify config
|
|
10
|
+
cat wrangler.jsonc | jq '.observability'
|
|
11
|
+
|
|
12
|
+
# Check deployment
|
|
13
|
+
wrangler deployments list <WORKER_NAME>
|
|
14
|
+
|
|
15
|
+
# Test with curl
|
|
16
|
+
curl https://your-worker.workers.dev
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Ensure `observability.enabled = true`, redeploy Worker, check `head_sampling_rate`, verify traffic
|
|
20
|
+
|
|
21
|
+
### "Traces not being captured"
|
|
22
|
+
|
|
23
|
+
**Cause:** Traces not enabled, incorrect sampling rate, Worker not redeployed, or destination unavailable
|
|
24
|
+
**Solution:**
|
|
25
|
+
|
|
26
|
+
```jsonc
|
|
27
|
+
// Temporarily set to 100% sampling for debugging
|
|
28
|
+
{
|
|
29
|
+
"observability": {
|
|
30
|
+
"enabled": true,
|
|
31
|
+
"head_sampling_rate": 1.0,
|
|
32
|
+
"traces": {
|
|
33
|
+
"enabled": true,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Ensure `observability.traces.enabled = true`, set `head_sampling_rate` to 1.0 for testing, redeploy, check destination status
|
|
40
|
+
|
|
41
|
+
## Limits
|
|
42
|
+
|
|
43
|
+
| Resource/Limit | Value | Notes |
|
|
44
|
+
| --------------------------- | ----------------- | --------------------------------- |
|
|
45
|
+
| Max log size | 256 KB | Logs exceeding this are truncated |
|
|
46
|
+
| Default sampling rate | 1.0 (100%) | Reduce for high-traffic Workers |
|
|
47
|
+
| Max destinations | Varies by plan | Check dashboard |
|
|
48
|
+
| Trace context propagation | 100 spans max | Deep call chains may lose spans |
|
|
49
|
+
| Analytics Engine write rate | 25 writes/request | Excess writes dropped silently |
|
|
50
|
+
|
|
51
|
+
## Performance Gotchas
|
|
52
|
+
|
|
53
|
+
### Spectre Mitigation Timing
|
|
54
|
+
|
|
55
|
+
**Problem:** `Date.now()` and `performance.now()` have reduced precision (coarsened to 100μs)
|
|
56
|
+
**Cause:** Spectre vulnerability mitigation in V8
|
|
57
|
+
**Solution:** Accept reduced precision or use Workers Traces for accurate timing
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// Date.now() is coarsened - trace spans are accurate
|
|
61
|
+
export default {
|
|
62
|
+
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
|
|
63
|
+
// For user-facing timing, Date.now() is fine
|
|
64
|
+
const start = Date.now()
|
|
65
|
+
const response = await processRequest(request)
|
|
66
|
+
const duration = Date.now() - start
|
|
67
|
+
|
|
68
|
+
// For detailed performance analysis, use Workers Traces instead
|
|
69
|
+
return response
|
|
70
|
+
},
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Analytics Engine \_sample_interval Aggregation
|
|
75
|
+
|
|
76
|
+
**Problem:** Queries return incorrect totals when not multiplying by `_sample_interval`
|
|
77
|
+
**Cause:** Analytics Engine stores sampled data points, each representing multiple events
|
|
78
|
+
**Solution:** Always multiply counts/sums by `_sample_interval` in aggregations
|
|
79
|
+
|
|
80
|
+
```sql
|
|
81
|
+
-- WRONG: Undercounts actual events
|
|
82
|
+
SELECT blob1 AS customer_id, COUNT(*) AS total_calls
|
|
83
|
+
FROM api_usage GROUP BY customer_id;
|
|
84
|
+
|
|
85
|
+
-- CORRECT: Accounts for sampling
|
|
86
|
+
SELECT blob1 AS customer_id, SUM(_sample_interval) AS total_calls
|
|
87
|
+
FROM api_usage GROUP BY customer_id;
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Trace Context Propagation Limits
|
|
91
|
+
|
|
92
|
+
**Problem:** Deep call chains lose trace context after 100 spans
|
|
93
|
+
**Cause:** Cloudflare limits trace depth to prevent performance impact
|
|
94
|
+
**Solution:** Design for flatter architectures or use custom correlation IDs for deep chains
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
// For deep call chains, add custom correlation ID
|
|
98
|
+
const correlationId = crypto.randomUUID()
|
|
99
|
+
console.log({ correlationId, event: 'request_start' })
|
|
100
|
+
|
|
101
|
+
// Pass correlationId through headers to downstream services
|
|
102
|
+
await fetch('https://api.example.com', {
|
|
103
|
+
headers: { 'X-Correlation-ID': correlationId },
|
|
104
|
+
})
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Pricing (2026)
|
|
108
|
+
|
|
109
|
+
### Workers Traces
|
|
110
|
+
|
|
111
|
+
- **GA Pricing (starts March 1, 2026):**
|
|
112
|
+
- $0.10 per 1M trace spans captured
|
|
113
|
+
- Retention: 14 days included
|
|
114
|
+
- **Free tier:** 10M trace spans/month
|
|
115
|
+
- **Note:** Beta usage (before March 1, 2026) is free
|
|
116
|
+
|
|
117
|
+
### Workers Logs
|
|
118
|
+
|
|
119
|
+
- **Included:** Free for all Workers
|
|
120
|
+
- **Logpush:** Requires Business/Enterprise plan
|
|
121
|
+
|
|
122
|
+
### Analytics Engine
|
|
123
|
+
|
|
124
|
+
- **Included:** 10M writes/month on Paid Workers plan
|
|
125
|
+
- **Additional:** $0.25 per 1M writes beyond included quota
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Observability Patterns
|
|
2
|
+
|
|
3
|
+
## Usage-Based Billing
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
env.ANALYTICS.writeDataPoint({
|
|
7
|
+
blobs: [customerId, request.url, request.method],
|
|
8
|
+
doubles: [1], // request_count
|
|
9
|
+
indexes: [customerId],
|
|
10
|
+
})
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
```sql
|
|
14
|
+
SELECT blob1 AS customer_id, SUM(_sample_interval * double1) AS total_calls
|
|
15
|
+
FROM api_usage WHERE timestamp >= DATE_TRUNC('month', NOW())
|
|
16
|
+
GROUP BY customer_id
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Performance Monitoring
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
const start = Date.now()
|
|
23
|
+
const response = await fetch(url)
|
|
24
|
+
env.ANALYTICS.writeDataPoint({
|
|
25
|
+
blobs: [url, response.status.toString()],
|
|
26
|
+
doubles: [Date.now() - start, response.status],
|
|
27
|
+
})
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```sql
|
|
31
|
+
SELECT blob1 AS url, AVG(double1) AS avg_ms, percentile(double1, 0.95) AS p95_ms
|
|
32
|
+
FROM fetch_metrics WHERE timestamp >= NOW() - INTERVAL '1' HOUR
|
|
33
|
+
GROUP BY url
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Error Tracking
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
env.ANALYTICS.writeDataPoint({
|
|
40
|
+
blobs: [error.name, request.url, request.method],
|
|
41
|
+
doubles: [1],
|
|
42
|
+
indexes: [error.name],
|
|
43
|
+
})
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Multi-Tenant Tracking
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
env.ANALYTICS.writeDataPoint({
|
|
50
|
+
indexes: [tenantId], // efficient filtering
|
|
51
|
+
blobs: [tenantId, url.pathname, method, status],
|
|
52
|
+
doubles: [1, duration, bytesSize],
|
|
53
|
+
})
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Tail Worker Log Filtering
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
export default {
|
|
60
|
+
async tail(events, env, ctx) {
|
|
61
|
+
const critical = events.filter((e) => e.exceptions.length > 0 || e.event.wallTime > 1000000)
|
|
62
|
+
if (critical.length === 0) return
|
|
63
|
+
|
|
64
|
+
ctx.waitUntil(
|
|
65
|
+
fetch('https://logging.example.com/ingest', {
|
|
66
|
+
method: 'POST',
|
|
67
|
+
headers: { Authorization: `Bearer ${env.API_KEY}` },
|
|
68
|
+
body: JSON.stringify(
|
|
69
|
+
critical.map((e) => ({
|
|
70
|
+
outcome: e.event.outcome,
|
|
71
|
+
cpu_ms: e.event.cpuTime / 1000,
|
|
72
|
+
errors: e.exceptions,
|
|
73
|
+
}))
|
|
74
|
+
),
|
|
75
|
+
})
|
|
76
|
+
)
|
|
77
|
+
},
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## OpenTelemetry Export
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
export default {
|
|
85
|
+
async tail(events, env, ctx) {
|
|
86
|
+
const otelSpans = events.map((e) => ({
|
|
87
|
+
traceId: generateId(32),
|
|
88
|
+
spanId: generateId(16),
|
|
89
|
+
name: e.scriptName || 'worker.request',
|
|
90
|
+
attributes: [
|
|
91
|
+
{ key: 'worker.outcome', value: { stringValue: e.event.outcome } },
|
|
92
|
+
{ key: 'worker.cpu_time_us', value: { intValue: String(e.event.cpuTime) } },
|
|
93
|
+
],
|
|
94
|
+
}))
|
|
95
|
+
|
|
96
|
+
ctx.waitUntil(
|
|
97
|
+
fetch('https://api.honeycomb.io/v1/traces', {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
headers: { 'X-Honeycomb-Team': env.HONEYCOMB_KEY },
|
|
100
|
+
body: JSON.stringify({ resourceSpans: [{ scopeSpans: [{ spans: otelSpans }] }] }),
|
|
101
|
+
})
|
|
102
|
+
)
|
|
103
|
+
},
|
|
104
|
+
}
|
|
105
|
+
```
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Cloudflare Pages
|
|
2
|
+
|
|
3
|
+
JAMstack platform for full-stack apps on Cloudflare's global network.
|
|
4
|
+
|
|
5
|
+
## Key Features
|
|
6
|
+
|
|
7
|
+
- **Git-based deploys**: Auto-deploy from GitHub/GitLab
|
|
8
|
+
- **Preview deployments**: Unique URL per branch/PR
|
|
9
|
+
- **Pages Functions**: File-based serverless routing (Workers runtime)
|
|
10
|
+
- **Static + dynamic**: Smart asset caching + edge compute
|
|
11
|
+
- **Smart Placement**: Automatic function optimization based on traffic patterns
|
|
12
|
+
- **Framework optimized**: SvelteKit, Astro, Nuxt, Qwik, Solid Start
|
|
13
|
+
|
|
14
|
+
## Deployment Methods
|
|
15
|
+
|
|
16
|
+
### 1. Git Integration (Production)
|
|
17
|
+
|
|
18
|
+
Dashboard → Workers & Pages → Create → Connect to Git → Configure build
|
|
19
|
+
|
|
20
|
+
### 2. Direct Upload
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npx wrangler pages deploy ./dist --project-name=my-project
|
|
24
|
+
npx wrangler pages deploy ./dist --project-name=my-project --branch=staging
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 3. C3 CLI
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm create cloudflare@latest my-app
|
|
31
|
+
# Select framework → auto-setup + deploy
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## vs Workers
|
|
35
|
+
|
|
36
|
+
- **Pages**: Static sites, JAMstack, frameworks, git workflow, file-based routing
|
|
37
|
+
- **Workers**: Pure APIs, complex routing, WebSockets, scheduled tasks, email handlers
|
|
38
|
+
- **Combine**: Pages Functions use Workers runtime, can bind to Workers
|
|
39
|
+
|
|
40
|
+
## Quick Start
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Create
|
|
44
|
+
npm create cloudflare@latest
|
|
45
|
+
|
|
46
|
+
# Local dev
|
|
47
|
+
npx wrangler pages dev ./dist
|
|
48
|
+
|
|
49
|
+
# Deploy
|
|
50
|
+
npx wrangler pages deploy ./dist --project-name=my-project
|
|
51
|
+
|
|
52
|
+
# Types
|
|
53
|
+
npx wrangler types --path='./functions/types.d.ts'
|
|
54
|
+
|
|
55
|
+
# Secrets
|
|
56
|
+
echo "value" | npx wrangler pages secret put KEY --project-name=my-project
|
|
57
|
+
|
|
58
|
+
# Logs
|
|
59
|
+
npx wrangler pages deployment tail --project-name=my-project
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Resources
|
|
63
|
+
|
|
64
|
+
- [Pages Docs](https://developers.cloudflare.com/pages/)
|
|
65
|
+
- [Functions API](https://developers.cloudflare.com/pages/functions/api-reference/)
|
|
66
|
+
- [Framework Guides](https://developers.cloudflare.com/pages/framework-guides/)
|
|
67
|
+
- [Discord #functions](https://discord.com/channels/595317990191398933/910978223968518144)
|
|
68
|
+
|
|
69
|
+
## Reading Order
|
|
70
|
+
|
|
71
|
+
**New to Pages?** Start here:
|
|
72
|
+
|
|
73
|
+
1. README.md (you are here) - Overview & quick start
|
|
74
|
+
2. [configuration.md](./configuration.md) - Project setup, wrangler.jsonc, bindings
|
|
75
|
+
3. [api.md](./api.md) - Functions API, routing, context
|
|
76
|
+
4. [patterns.md](./patterns.md) - Common implementations
|
|
77
|
+
5. [gotchas.md](./gotchas.md) - Troubleshooting & pitfalls
|
|
78
|
+
|
|
79
|
+
**Quick reference?** Jump to relevant file above.
|
|
80
|
+
|
|
81
|
+
## In This Reference
|
|
82
|
+
|
|
83
|
+
- [configuration.md](./configuration.md) - wrangler.jsonc, build, env vars, Smart Placement
|
|
84
|
+
- [api.md](./api.md) - Functions API, bindings, context, advanced mode
|
|
85
|
+
- [patterns.md](./patterns.md) - Full-stack patterns, framework integration
|
|
86
|
+
- [gotchas.md](./gotchas.md) - Build issues, limits, debugging, framework warnings
|
|
87
|
+
|
|
88
|
+
## See Also
|
|
89
|
+
|
|
90
|
+
- [pages-functions](../pages-functions/) - File-based routing, middleware
|
|
91
|
+
- [d1](../d1/) - SQL database for Pages Functions
|
|
92
|
+
- [kv](../kv/) - Key-value storage for caching/state
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# Functions API
|
|
2
|
+
|
|
3
|
+
## File-Based Routing
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
/functions/index.ts → example.com/
|
|
7
|
+
/functions/api/users.ts → example.com/api/users
|
|
8
|
+
/functions/api/users/[id].ts → example.com/api/users/:id
|
|
9
|
+
/functions/api/users/[[path]].ts → example.com/api/users/* (catchall)
|
|
10
|
+
/functions/_middleware.ts → Runs before all routes
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
**Rules**: `[param]` = single segment, `[[param]]` = multi-segment catchall, more specific wins.
|
|
14
|
+
|
|
15
|
+
## Request Handlers
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import type { PagesFunction } from '@cloudflare/workers-types'
|
|
19
|
+
|
|
20
|
+
interface Env {
|
|
21
|
+
DB: D1Database
|
|
22
|
+
KV: KVNamespace
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// All methods
|
|
26
|
+
export const onRequest: PagesFunction<Env> = async (context) => {
|
|
27
|
+
return new Response('All methods')
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Method-specific
|
|
31
|
+
export const onRequestGet: PagesFunction<Env> = async (context) => {
|
|
32
|
+
const { request, env, params, data } = context
|
|
33
|
+
|
|
34
|
+
const user = await env.DB.prepare('SELECT * FROM users WHERE id = ?').bind(params.id).first()
|
|
35
|
+
|
|
36
|
+
return Response.json(user)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const onRequestPost: PagesFunction<Env> = async (context) => {
|
|
40
|
+
const body = await context.request.json()
|
|
41
|
+
return Response.json({ success: true })
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Also: onRequestPut, onRequestPatch, onRequestDelete, onRequestHead, onRequestOptions
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Context Object
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
interface EventContext<Env, Params, Data> {
|
|
51
|
+
request: Request // HTTP request
|
|
52
|
+
env: Env // Bindings (KV, D1, R2, etc.)
|
|
53
|
+
params: Params // Route parameters
|
|
54
|
+
data: Data // Middleware-shared data
|
|
55
|
+
waitUntil: (promise: Promise<any>) => void // Background tasks
|
|
56
|
+
next: () => Promise<Response> // Next handler
|
|
57
|
+
passThroughOnException: () => void // Error fallback (not in advanced mode)
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Dynamic Routes
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
// Single segment: functions/users/[id].ts
|
|
65
|
+
export const onRequestGet: PagesFunction = async ({ params }) => {
|
|
66
|
+
// /users/123 → params.id = "123"
|
|
67
|
+
return Response.json({ userId: params.id })
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Multi-segment: functions/files/[[path]].ts
|
|
71
|
+
export const onRequestGet: PagesFunction = async ({ params }) => {
|
|
72
|
+
// /files/docs/api/v1.md → params.path = ["docs", "api", "v1.md"]
|
|
73
|
+
const filePath = (params.path as string[]).join('/')
|
|
74
|
+
return new Response(filePath)
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Middleware
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
// functions/_middleware.ts
|
|
82
|
+
// Single
|
|
83
|
+
export const onRequest: PagesFunction = async (context) => {
|
|
84
|
+
const response = await context.next()
|
|
85
|
+
response.headers.set('X-Custom-Header', 'value')
|
|
86
|
+
return response
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Chained (runs in order)
|
|
90
|
+
const errorHandler: PagesFunction = async (context) => {
|
|
91
|
+
try {
|
|
92
|
+
return await context.next()
|
|
93
|
+
} catch (err) {
|
|
94
|
+
return new Response(err.message, { status: 500 })
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const auth: PagesFunction = async (context) => {
|
|
99
|
+
const token = context.request.headers.get('Authorization')
|
|
100
|
+
if (!token) return new Response('Unauthorized', { status: 401 })
|
|
101
|
+
context.data.userId = await verifyToken(token)
|
|
102
|
+
return context.next()
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export const onRequest = [errorHandler, auth]
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Scope**: `functions/_middleware.ts` → all; `functions/api/_middleware.ts` → `/api/*` only
|
|
109
|
+
|
|
110
|
+
## Bindings Usage
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
export const onRequestGet: PagesFunction<Env> = async ({ env }) => {
|
|
114
|
+
// KV
|
|
115
|
+
const cached = await env.KV.get('key', 'json')
|
|
116
|
+
await env.KV.put('key', JSON.stringify({ data: 'value' }), { expirationTtl: 3600 })
|
|
117
|
+
|
|
118
|
+
// D1
|
|
119
|
+
const result = await env.DB.prepare('SELECT * FROM users WHERE id = ?').bind(userId).first()
|
|
120
|
+
|
|
121
|
+
// R2, Queue, AI - see respective reference docs
|
|
122
|
+
|
|
123
|
+
return Response.json({ success: true })
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Advanced Mode
|
|
128
|
+
|
|
129
|
+
Full Workers API, bypasses file-based routing:
|
|
130
|
+
|
|
131
|
+
```javascript
|
|
132
|
+
// functions/_worker.js
|
|
133
|
+
export default {
|
|
134
|
+
async fetch(request, env, ctx) {
|
|
135
|
+
const url = new URL(request.url)
|
|
136
|
+
|
|
137
|
+
// Custom routing
|
|
138
|
+
if (url.pathname.startsWith('/api/')) {
|
|
139
|
+
return new Response('API response')
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// REQUIRED: Serve static assets
|
|
143
|
+
return env.ASSETS.fetch(request)
|
|
144
|
+
},
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**When to use**: WebSockets, complex routing, scheduled handlers, email handlers.
|
|
149
|
+
|
|
150
|
+
## Smart Placement
|
|
151
|
+
|
|
152
|
+
Automatically optimizes function execution location based on traffic patterns.
|
|
153
|
+
|
|
154
|
+
**Configuration** (in wrangler.jsonc):
|
|
155
|
+
|
|
156
|
+
```jsonc
|
|
157
|
+
{
|
|
158
|
+
"placement": {
|
|
159
|
+
"mode": "smart", // Enables optimization (default: off)
|
|
160
|
+
},
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**How it works**: Analyzes traffic patterns over time and places functions closer to users or data sources (e.g., D1 databases). Requires no code changes.
|
|
165
|
+
|
|
166
|
+
**Trade-offs**: Initial requests may see slightly higher latency during learning period (hours-days). Performance improves as system optimizes.
|
|
167
|
+
|
|
168
|
+
**When to use**: Global apps with centralized databases or geographically concentrated traffic sources.
|
|
169
|
+
|
|
170
|
+
## getRequestContext (Framework SSR)
|
|
171
|
+
|
|
172
|
+
Access bindings in framework code:
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
// SvelteKit
|
|
176
|
+
import type { RequestEvent } from '@sveltejs/kit'
|
|
177
|
+
export async function load({ platform }: RequestEvent) {
|
|
178
|
+
const data = await platform.env.DB.prepare('SELECT * FROM users').all()
|
|
179
|
+
return { users: data.results }
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Astro
|
|
183
|
+
const { DB } = Astro.locals.runtime.env
|
|
184
|
+
const data = await DB.prepare('SELECT * FROM users').all()
|
|
185
|
+
|
|
186
|
+
// Solid Start (server function)
|
|
187
|
+
import { getRequestEvent } from 'solid-js/web'
|
|
188
|
+
const event = getRequestEvent()
|
|
189
|
+
const data = await event.locals.runtime.env.DB.prepare('SELECT * FROM users').all()
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
**✅ Supported adapters** (2026):
|
|
193
|
+
|
|
194
|
+
- **SvelteKit**: `@sveltejs/adapter-cloudflare`
|
|
195
|
+
- **Astro**: Built-in Cloudflare adapter
|
|
196
|
+
- **Nuxt**: Set `nitro.preset: 'cloudflare-pages'` in `nuxt.config.ts`
|
|
197
|
+
- **Qwik**: Built-in Cloudflare adapter
|
|
198
|
+
- **Solid Start**: `@solidjs/start-cloudflare-pages`
|
|
199
|
+
|
|
200
|
+
**❌ Deprecated/Unsupported**:
|
|
201
|
+
|
|
202
|
+
- **Next.js**: Official adapter (`@cloudflare/next-on-pages`) deprecated. Use Vercel or self-host on Workers.
|
|
203
|
+
- **Remix**: Official adapter (`@remix-run/cloudflare-pages`) deprecated. Migrate to supported frameworks.
|
|
204
|
+
|
|
205
|
+
See [gotchas.md](./gotchas.md#framework-specific) for migration guidance.
|