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,184 @@
|
|
|
1
|
+
# Cache Reserve API
|
|
2
|
+
|
|
3
|
+
## Workers Integration
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
┌────────────────────────────────────────────────────────────────┐
|
|
7
|
+
│ CRITICAL: Workers Cache API ≠ Cache Reserve │
|
|
8
|
+
│ │
|
|
9
|
+
│ • Workers caches.default / cache.put() → edge cache ONLY │
|
|
10
|
+
│ • Cache Reserve → zone-level setting, automatic, no per-req │
|
|
11
|
+
│ • You CANNOT selectively write to Cache Reserve from Workers │
|
|
12
|
+
│ • Cache Reserve works with standard fetch(), not cache.put() │
|
|
13
|
+
└────────────────────────────────────────────────────────────────┘
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Cache Reserve is a **zone-level configuration**, not a per-request API. It works automatically when enabled for the zone:
|
|
17
|
+
|
|
18
|
+
### Standard Fetch (Recommended)
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// Cache Reserve works automatically via standard fetch
|
|
22
|
+
export default {
|
|
23
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
24
|
+
// Standard fetch uses Cache Reserve automatically
|
|
25
|
+
return await fetch(request)
|
|
26
|
+
},
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Cache API Limitations
|
|
31
|
+
|
|
32
|
+
**IMPORTANT**: `cache.put()` is **NOT compatible** with Cache Reserve or Tiered Cache.
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// ❌ WRONG: cache.put() bypasses Cache Reserve
|
|
36
|
+
const cache = caches.default
|
|
37
|
+
let response = await cache.match(request)
|
|
38
|
+
if (!response) {
|
|
39
|
+
response = await fetch(request)
|
|
40
|
+
await cache.put(request, response.clone()) // Bypasses Cache Reserve!
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ✅ CORRECT: Use standard fetch for Cache Reserve compatibility
|
|
44
|
+
return await fetch(request)
|
|
45
|
+
|
|
46
|
+
// ✅ CORRECT: Use Cache API only for custom cache namespaces
|
|
47
|
+
const customCache = await caches.open('my-custom-cache')
|
|
48
|
+
let response = await customCache.match(request)
|
|
49
|
+
if (!response) {
|
|
50
|
+
response = await fetch(request)
|
|
51
|
+
await customCache.put(request, response.clone()) // Custom cache OK
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Purging and Cache Management
|
|
56
|
+
|
|
57
|
+
### Purge by URL (Instant)
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
// Purge specific URL from Cache Reserve immediately
|
|
61
|
+
const purgeCacheReserveByURL = async (zoneId: string, apiToken: string, urls: string[]) => {
|
|
62
|
+
const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
|
|
63
|
+
method: 'POST',
|
|
64
|
+
headers: {
|
|
65
|
+
Authorization: `Bearer ${apiToken}`,
|
|
66
|
+
'Content-Type': 'application/json',
|
|
67
|
+
},
|
|
68
|
+
body: JSON.stringify({ files: urls }),
|
|
69
|
+
})
|
|
70
|
+
return await response.json()
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Example usage
|
|
74
|
+
await purgeCacheReserveByURL('zone123', 'token456', [
|
|
75
|
+
'https://example.com/image.jpg',
|
|
76
|
+
'https://example.com/video.mp4',
|
|
77
|
+
])
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Purge by Tag/Host/Prefix (Revalidation)
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
// Purge by cache tag - forces revalidation, not immediate removal
|
|
84
|
+
await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
headers: { Authorization: `Bearer ${apiToken}`, 'Content-Type': 'application/json' },
|
|
87
|
+
body: JSON.stringify({ tags: ['tag1', 'tag2'] }),
|
|
88
|
+
})
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Purge behavior:**
|
|
92
|
+
|
|
93
|
+
- **By URL**: Immediate removal from Cache Reserve + edge cache
|
|
94
|
+
- **By tag/host/prefix**: Revalidation only, assets remain in storage (costs continue)
|
|
95
|
+
|
|
96
|
+
### Clear All Cache Reserve Data
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
// Requires Cache Reserve OFF first
|
|
100
|
+
await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/cache/cache_reserve_clear`, {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
headers: { Authorization: `Bearer ${apiToken}` },
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
// Check status: GET same endpoint returns { state: "In-progress" | "Completed" }
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Process**: Disable Cache Reserve → Call clear endpoint → Wait up to 24hr → Re-enable
|
|
109
|
+
|
|
110
|
+
## Monitoring and Analytics
|
|
111
|
+
|
|
112
|
+
### Dashboard Analytics
|
|
113
|
+
|
|
114
|
+
Navigate to **Caching > Cache Reserve** to view:
|
|
115
|
+
|
|
116
|
+
- **Egress Savings**: Total bytes served from Cache Reserve vs origin egress cost saved
|
|
117
|
+
- **Requests Served**: Cache Reserve hits vs misses breakdown
|
|
118
|
+
- **Storage Used**: Current GB stored in Cache Reserve (billed monthly)
|
|
119
|
+
- **Operations**: Class A (writes) and Class B (reads) operation counts
|
|
120
|
+
- **Cost Tracking**: Estimated monthly costs based on current usage
|
|
121
|
+
|
|
122
|
+
### Logpush Integration
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
// Logpush field: CacheReserveUsed (boolean) - filter for Cache Reserve hits
|
|
126
|
+
// Query Cache Reserve hits in analytics
|
|
127
|
+
const logpushQuery = `
|
|
128
|
+
SELECT
|
|
129
|
+
ClientRequestHost,
|
|
130
|
+
COUNT(*) as requests,
|
|
131
|
+
SUM(EdgeResponseBytes) as bytes_served,
|
|
132
|
+
COUNT(CASE WHEN CacheReserveUsed = true THEN 1 END) as cache_reserve_hits,
|
|
133
|
+
COUNT(CASE WHEN CacheReserveUsed = false THEN 1 END) as cache_reserve_misses
|
|
134
|
+
FROM http_requests
|
|
135
|
+
WHERE Timestamp >= NOW() - INTERVAL '24 hours'
|
|
136
|
+
GROUP BY ClientRequestHost
|
|
137
|
+
ORDER BY requests DESC
|
|
138
|
+
`
|
|
139
|
+
|
|
140
|
+
// Filter only Cache Reserve hits
|
|
141
|
+
const crHitsQuery = `
|
|
142
|
+
SELECT ClientRequestHost, COUNT(*) as requests, SUM(EdgeResponseBytes) as bytes
|
|
143
|
+
FROM http_requests
|
|
144
|
+
WHERE CacheReserveUsed = true AND Timestamp >= NOW() - INTERVAL '7 days'
|
|
145
|
+
GROUP BY ClientRequestHost
|
|
146
|
+
ORDER BY bytes DESC
|
|
147
|
+
`
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### GraphQL Analytics
|
|
151
|
+
|
|
152
|
+
```graphql
|
|
153
|
+
query CacheReserveAnalytics($zoneTag: string, $since: string, $until: string) {
|
|
154
|
+
viewer {
|
|
155
|
+
zones(filter: { zoneTag: $zoneTag }) {
|
|
156
|
+
httpRequests1dGroups(filter: { datetime_geq: $since, datetime_leq: $until }, limit: 1000) {
|
|
157
|
+
dimensions {
|
|
158
|
+
date
|
|
159
|
+
}
|
|
160
|
+
sum {
|
|
161
|
+
cachedBytes
|
|
162
|
+
cachedRequests
|
|
163
|
+
bytes
|
|
164
|
+
requests
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Pricing
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
// Storage: $0.015/GB-month | Class A (writes): $4.50/M | Class B (reads): $0.36/M
|
|
176
|
+
// Cache miss: 1A + 1B | Cache hit: 1B | Assets >1GB: proportionally more ops
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## See Also
|
|
180
|
+
|
|
181
|
+
- [README](./README.md) - Overview and core concepts
|
|
182
|
+
- [Configuration](./configuration.md) - Setup and Cache Rules
|
|
183
|
+
- [Patterns](./patterns.md) - Best practices and optimization
|
|
184
|
+
- [Gotchas](./gotchas.md) - Common issues and troubleshooting
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Cache Reserve Configuration
|
|
2
|
+
|
|
3
|
+
## Dashboard Setup
|
|
4
|
+
|
|
5
|
+
**Minimum steps to enable:**
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Navigate to dashboard
|
|
9
|
+
https://dash.cloudflare.com/caching/cache-reserve
|
|
10
|
+
|
|
11
|
+
# Click "Enable Storage Sync" or "Purchase" button
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**Prerequisites:**
|
|
15
|
+
|
|
16
|
+
- Paid Cache Reserve plan or Smart Shield Advanced required
|
|
17
|
+
- Tiered Cache **required** for Cache Reserve to function optimally
|
|
18
|
+
|
|
19
|
+
## API Configuration
|
|
20
|
+
|
|
21
|
+
### REST API
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Enable
|
|
25
|
+
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/cache/cache_reserve" \
|
|
26
|
+
-H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \
|
|
27
|
+
-d '{"value": "on"}'
|
|
28
|
+
|
|
29
|
+
# Check status
|
|
30
|
+
curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/cache/cache_reserve" \
|
|
31
|
+
-H "Authorization: Bearer $API_TOKEN"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### TypeScript SDK
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install cloudflare
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import Cloudflare from 'cloudflare'
|
|
42
|
+
|
|
43
|
+
const client = new Cloudflare({
|
|
44
|
+
apiToken: process.env.CLOUDFLARE_API_TOKEN,
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
// Enable Cache Reserve
|
|
48
|
+
await client.cache.cacheReserve.edit({
|
|
49
|
+
zone_id: 'abc123',
|
|
50
|
+
value: 'on',
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
// Get Cache Reserve status
|
|
54
|
+
const status = await client.cache.cacheReserve.get({
|
|
55
|
+
zone_id: 'abc123',
|
|
56
|
+
})
|
|
57
|
+
console.log(status.value) // 'on' or 'off'
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Python SDK
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
pip install cloudflare
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```python
|
|
67
|
+
from cloudflare import Cloudflare
|
|
68
|
+
|
|
69
|
+
client = Cloudflare(api_token=os.environ.get("CLOUDFLARE_API_TOKEN"))
|
|
70
|
+
|
|
71
|
+
# Enable Cache Reserve
|
|
72
|
+
client.cache.cache_reserve.edit(
|
|
73
|
+
zone_id="abc123",
|
|
74
|
+
value="on"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
# Get Cache Reserve status
|
|
78
|
+
status = client.cache.cache_reserve.get(zone_id="abc123")
|
|
79
|
+
print(status.value) # 'on' or 'off'
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Terraform
|
|
83
|
+
|
|
84
|
+
```hcl
|
|
85
|
+
terraform {
|
|
86
|
+
required_providers {
|
|
87
|
+
cloudflare = {
|
|
88
|
+
source = "cloudflare/cloudflare"
|
|
89
|
+
version = "~> 4.0"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
provider "cloudflare" {
|
|
95
|
+
api_token = var.cloudflare_api_token
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
resource "cloudflare_zone_cache_reserve" "example" {
|
|
99
|
+
zone_id = var.zone_id
|
|
100
|
+
enabled = true
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
# Tiered Cache is required for Cache Reserve
|
|
104
|
+
resource "cloudflare_tiered_cache" "example" {
|
|
105
|
+
zone_id = var.zone_id
|
|
106
|
+
cache_type = "smart"
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Pulumi
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
import * as cloudflare from '@pulumi/cloudflare'
|
|
114
|
+
|
|
115
|
+
// Enable Cache Reserve
|
|
116
|
+
const cacheReserve = new cloudflare.ZoneCacheReserve('example', {
|
|
117
|
+
zoneId: zoneId,
|
|
118
|
+
enabled: true,
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
// Enable Tiered Cache (required)
|
|
122
|
+
const tieredCache = new cloudflare.TieredCache('example', {
|
|
123
|
+
zoneId: zoneId,
|
|
124
|
+
cacheType: 'smart',
|
|
125
|
+
})
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Required API Token Permissions
|
|
129
|
+
|
|
130
|
+
- `Zone Settings Read`
|
|
131
|
+
- `Zone Settings Write`
|
|
132
|
+
- `Zone Read`
|
|
133
|
+
- `Zone Write`
|
|
134
|
+
|
|
135
|
+
## Cache Rules Integration
|
|
136
|
+
|
|
137
|
+
Control Cache Reserve eligibility via Cache Rules:
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
// Enable for static assets
|
|
141
|
+
{
|
|
142
|
+
action: 'set_cache_settings',
|
|
143
|
+
action_parameters: {
|
|
144
|
+
cache_reserve: { eligible: true, minimum_file_ttl: 86400 },
|
|
145
|
+
edge_ttl: { mode: 'override_origin', default: 86400 },
|
|
146
|
+
cache: true
|
|
147
|
+
},
|
|
148
|
+
expression: '(http.request.uri.path matches "\\.(jpg|png|webp|pdf|zip)$")'
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Disable for APIs
|
|
152
|
+
{
|
|
153
|
+
action: 'set_cache_settings',
|
|
154
|
+
action_parameters: { cache_reserve: { eligible: false } },
|
|
155
|
+
expression: '(http.request.uri.path matches "^/api/")'
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Create via API: PUT to zones/{zone_id}/rulesets/phases/http_request_cache_settings/entrypoint
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Wrangler Integration
|
|
162
|
+
|
|
163
|
+
Cache Reserve works automatically with Workers deployed via Wrangler. No special wrangler.jsonc configuration needed - enable Cache Reserve via Dashboard or API for the zone.
|
|
164
|
+
|
|
165
|
+
## See Also
|
|
166
|
+
|
|
167
|
+
- [README](./README.md) - Overview and core concepts
|
|
168
|
+
- [API Reference](./api.md) - Purging and monitoring APIs
|
|
169
|
+
- [Patterns](./patterns.md) - Best practices and optimization
|
|
170
|
+
- [Gotchas](./gotchas.md) - Common issues and troubleshooting
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Cache Reserve Gotchas
|
|
2
|
+
|
|
3
|
+
## Common Errors
|
|
4
|
+
|
|
5
|
+
### "Assets Not Being Cached in Cache Reserve"
|
|
6
|
+
|
|
7
|
+
**Cause:** Asset is not cacheable, TTL < 10 hours, Content-Length header missing, or blocking headers present (Set-Cookie, Vary: _)
|
|
8
|
+
**Solution:** Ensure minimum TTL of 10+ hours (`Cache-Control: public, max-age=36000`), add Content-Length header, remove Set-Cookie header, and set `Vary: Accept-Encoding` (not _)
|
|
9
|
+
|
|
10
|
+
### "Range Requests Not Working" (Video Seeking Fails)
|
|
11
|
+
|
|
12
|
+
**Cause:** Cache Reserve does **NOT** support range requests (HTTP 206 Partial Content)
|
|
13
|
+
**Solution:** Range requests bypass Cache Reserve entirely. For video streaming with seeking:
|
|
14
|
+
|
|
15
|
+
- Use edge cache only (shorter TTLs)
|
|
16
|
+
- Consider R2 with direct access for range-heavy workloads
|
|
17
|
+
- Accept that seekable content won't benefit from Cache Reserve persistence
|
|
18
|
+
|
|
19
|
+
### "Origin Bandwidth Higher Than Expected"
|
|
20
|
+
|
|
21
|
+
**Cause:** Cache Reserve fetches **uncompressed** content from origin, even though it serves compressed to visitors
|
|
22
|
+
**Solution:**
|
|
23
|
+
|
|
24
|
+
- If origin charges by bandwidth, factor in uncompressed transfer costs
|
|
25
|
+
- Cache Reserve compresses for visitors automatically (saves visitor bandwidth)
|
|
26
|
+
- Compare: origin egress savings vs higher uncompressed fetch costs
|
|
27
|
+
|
|
28
|
+
### "Cloudflare Images Not Caching with Cache Reserve"
|
|
29
|
+
|
|
30
|
+
**Cause:** Cloudflare Images with `Vary: Accept` header (format negotiation) is incompatible with Cache Reserve
|
|
31
|
+
**Solution:**
|
|
32
|
+
|
|
33
|
+
- Cache Reserve silently skips images with Vary for format negotiation
|
|
34
|
+
- Original images (non-transformed) may still be eligible
|
|
35
|
+
- Use Cloudflare Images variants or edge cache for transformed images
|
|
36
|
+
|
|
37
|
+
### "High Class A Operations Costs"
|
|
38
|
+
|
|
39
|
+
**Cause:** Frequent cache misses, short TTLs, or frequent revalidation
|
|
40
|
+
**Solution:** Increase TTL for stable content (24+ hours), enable Tiered Cache to reduce direct Cache Reserve misses, or use stale-while-revalidate
|
|
41
|
+
|
|
42
|
+
### "Purge Not Working as Expected"
|
|
43
|
+
|
|
44
|
+
**Cause:** Purge by tag only triggers revalidation but doesn't remove from Cache Reserve storage
|
|
45
|
+
**Solution:** Use purge by URL for immediate removal, or disable Cache Reserve then clear all data for complete removal
|
|
46
|
+
|
|
47
|
+
### "O2O (Orange-to-Orange) Assets Not Caching"
|
|
48
|
+
|
|
49
|
+
**Cause:** Orange-to-Orange (proxied zone requesting another proxied zone on Cloudflare) bypasses Cache Reserve
|
|
50
|
+
**Solution:**
|
|
51
|
+
|
|
52
|
+
- **What is O2O**: Zone A (proxied) → Zone B (proxied), both on Cloudflare
|
|
53
|
+
- **Detection**: Check `cf-cache-status` for `BYPASS` and review request path
|
|
54
|
+
- **Workaround**: Use R2 or direct origin access instead of O2O proxy chains
|
|
55
|
+
|
|
56
|
+
### "Cache Reserve must be OFF before clearing data"
|
|
57
|
+
|
|
58
|
+
**Cause:** Attempting to clear Cache Reserve data while it's still enabled
|
|
59
|
+
**Solution:** Disable Cache Reserve first, wait briefly for propagation (5s), then clear data (can take up to 24 hours)
|
|
60
|
+
|
|
61
|
+
## Limits
|
|
62
|
+
|
|
63
|
+
| Limit | Value | Notes |
|
|
64
|
+
| --------------------- | ---------------------------------- | ---------------------------------------------- |
|
|
65
|
+
| Minimum TTL | 10 hours (36000 seconds) | Assets with shorter TTL not eligible |
|
|
66
|
+
| Default retention | 30 days (2592000 seconds) | Configurable |
|
|
67
|
+
| Maximum file size | Same as R2 limits | No practical limit |
|
|
68
|
+
| Purge/clear time | Up to 24 hours | Complete propagation time |
|
|
69
|
+
| Plan requirement | Paid Cache Reserve or Smart Shield | Not available on free plans |
|
|
70
|
+
| Content-Length header | Required | Must be present for eligibility |
|
|
71
|
+
| Set-Cookie header | Blocks caching | Must not be present (or use private directive) |
|
|
72
|
+
| Vary header | Cannot be \* | Can use Vary: Accept-Encoding |
|
|
73
|
+
| Image transformations | Variants not eligible | Original images only |
|
|
74
|
+
| Range requests | NOT supported | HTTP 206 bypasses Cache Reserve |
|
|
75
|
+
| Compression | Fetches uncompressed | Serves compressed to visitors |
|
|
76
|
+
| Worker control | Zone-level only | Cannot control per-request |
|
|
77
|
+
| O2O requests | Bypassed | Orange-to-Orange not eligible |
|
|
78
|
+
|
|
79
|
+
## Additional Resources
|
|
80
|
+
|
|
81
|
+
- **Official Docs**: https://developers.cloudflare.com/cache/advanced-configuration/cache-reserve/
|
|
82
|
+
- **API Reference**: https://developers.cloudflare.com/api/resources/cache/subresources/cache_reserve/
|
|
83
|
+
- **Cache Rules**: https://developers.cloudflare.com/cache/how-to/cache-rules/
|
|
84
|
+
- **Workers Cache API**: https://developers.cloudflare.com/workers/runtime-apis/cache/
|
|
85
|
+
- **R2 Documentation**: https://developers.cloudflare.com/r2/
|
|
86
|
+
- **Smart Shield**: https://developers.cloudflare.com/smart-shield/
|
|
87
|
+
- **Tiered Cache**: https://developers.cloudflare.com/cache/how-to/tiered-cache/
|
|
88
|
+
|
|
89
|
+
## Troubleshooting Flowchart
|
|
90
|
+
|
|
91
|
+
Asset not caching in Cache Reserve?
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
1. Is Cache Reserve enabled for zone?
|
|
95
|
+
→ No: Enable via Dashboard or API
|
|
96
|
+
→ Yes: Continue to step 2
|
|
97
|
+
|
|
98
|
+
2. Is Tiered Cache enabled?
|
|
99
|
+
→ No: Enable Tiered Cache (required!)
|
|
100
|
+
→ Yes: Continue to step 3
|
|
101
|
+
|
|
102
|
+
3. Does asset have TTL ≥ 10 hours?
|
|
103
|
+
→ No: Increase via Cache Rules (edge_ttl override)
|
|
104
|
+
→ Yes: Continue to step 4
|
|
105
|
+
|
|
106
|
+
4. Is Content-Length header present?
|
|
107
|
+
→ No: Fix origin to include Content-Length
|
|
108
|
+
→ Yes: Continue to step 5
|
|
109
|
+
|
|
110
|
+
5. Is Set-Cookie header present?
|
|
111
|
+
→ Yes: Remove Set-Cookie or scope appropriately
|
|
112
|
+
→ No: Continue to step 6
|
|
113
|
+
|
|
114
|
+
6. Is Vary header set to *?
|
|
115
|
+
→ Yes: Change to specific value (e.g., Accept-Encoding)
|
|
116
|
+
→ No: Continue to step 7
|
|
117
|
+
|
|
118
|
+
7. Is this a range request?
|
|
119
|
+
→ Yes: Range requests bypass Cache Reserve (not supported)
|
|
120
|
+
→ No: Continue to step 8
|
|
121
|
+
|
|
122
|
+
8. Is this an O2O (Orange-to-Orange) request?
|
|
123
|
+
→ Yes: O2O bypasses Cache Reserve
|
|
124
|
+
→ No: Continue to step 9
|
|
125
|
+
|
|
126
|
+
9. Check Logpush CacheReserveUsed field
|
|
127
|
+
→ Filter logs to see if assets ever hit Cache Reserve
|
|
128
|
+
→ Verify cf-cache-status header (should be HIT after first request)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## See Also
|
|
132
|
+
|
|
133
|
+
- [README](./README.md) - Overview and core concepts
|
|
134
|
+
- [Configuration](./configuration.md) - Setup and Cache Rules
|
|
135
|
+
- [API Reference](./api.md) - Purging and monitoring
|
|
136
|
+
- [Patterns](./patterns.md) - Best practices and optimization
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Cache Reserve Patterns
|
|
2
|
+
|
|
3
|
+
## Best Practices
|
|
4
|
+
|
|
5
|
+
### 1. Always Enable Tiered Cache
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// Cache Reserve is designed for use WITH Tiered Cache
|
|
9
|
+
const configuration = {
|
|
10
|
+
tieredCache: 'enabled', // Required for optimal performance
|
|
11
|
+
cacheReserve: 'enabled', // Works best with Tiered Cache
|
|
12
|
+
|
|
13
|
+
hierarchy: [
|
|
14
|
+
'Lower-Tier Cache (visitor)',
|
|
15
|
+
'Upper-Tier Cache (origin region)',
|
|
16
|
+
'Cache Reserve (persistent)',
|
|
17
|
+
'Origin',
|
|
18
|
+
],
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### 2. Set Appropriate Cache-Control Headers
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// Origin response headers for Cache Reserve eligibility
|
|
26
|
+
const originHeaders = {
|
|
27
|
+
'Cache-Control': 'public, max-age=86400', // 24hr (minimum 10hr)
|
|
28
|
+
'Content-Length': '1024000', // Required
|
|
29
|
+
'Cache-Tag': 'images,product-123', // Optional: purging
|
|
30
|
+
ETag: '"abc123"', // Optional: revalidation
|
|
31
|
+
// Avoid: 'Set-Cookie' and 'Vary: *' prevent caching
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 3. Use Cache Rules for Fine-Grained Control
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// Different TTLs for different content types
|
|
39
|
+
const cacheRules = [
|
|
40
|
+
{
|
|
41
|
+
description: 'Long-term cache for immutable assets',
|
|
42
|
+
expression: '(http.request.uri.path matches "^/static/.*\\.[a-f0-9]{8}\\.")',
|
|
43
|
+
action_parameters: {
|
|
44
|
+
cache_reserve: { eligible: true },
|
|
45
|
+
edge_ttl: { mode: 'override_origin', default: 2592000 }, // 30 days
|
|
46
|
+
cache: true,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
description: 'Moderate cache for regular images',
|
|
51
|
+
expression: '(http.request.uri.path matches "\\.(jpg|png|webp)$")',
|
|
52
|
+
action_parameters: {
|
|
53
|
+
cache_reserve: { eligible: true },
|
|
54
|
+
edge_ttl: { mode: 'override_origin', default: 86400 }, // 24 hours
|
|
55
|
+
cache: true,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
description: 'Exclude API from Cache Reserve',
|
|
60
|
+
expression: '(http.request.uri.path matches "^/api/")',
|
|
61
|
+
action_parameters: { cache_reserve: { eligible: false }, cache: false },
|
|
62
|
+
},
|
|
63
|
+
]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 4. Making Assets Cache Reserve Eligible from Workers
|
|
67
|
+
|
|
68
|
+
**Note**: This modifies response headers to meet eligibility criteria but does NOT directly control Cache Reserve storage (which is zone-level automatic).
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
export default {
|
|
72
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
73
|
+
const response = await fetch(request)
|
|
74
|
+
if (!response.ok) return response
|
|
75
|
+
|
|
76
|
+
const headers = new Headers(response.headers)
|
|
77
|
+
headers.set('Cache-Control', 'public, max-age=36000') // 10hr minimum
|
|
78
|
+
headers.delete('Set-Cookie') // Blocks caching
|
|
79
|
+
|
|
80
|
+
// Ensure Content-Length present
|
|
81
|
+
if (!headers.has('Content-Length')) {
|
|
82
|
+
const blob = await response.blob()
|
|
83
|
+
headers.set('Content-Length', blob.size.toString())
|
|
84
|
+
return new Response(blob, { status: response.status, headers })
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return new Response(response.body, { status: response.status, headers })
|
|
88
|
+
},
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 5. Hostname Best Practices
|
|
93
|
+
|
|
94
|
+
Use Worker's hostname for efficient caching - avoid overriding hostname unnecessarily.
|
|
95
|
+
|
|
96
|
+
## Architecture Patterns
|
|
97
|
+
|
|
98
|
+
### Multi-Tier Caching + Immutable Assets
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// Optimal: L1 (visitor) → L2 (region) → L3 (Cache Reserve) → Origin
|
|
102
|
+
export default {
|
|
103
|
+
async fetch(request: Request, env: Env): Promise<Response> {
|
|
104
|
+
const url = new URL(request.url)
|
|
105
|
+
const isImmutable = /\.[a-f0-9]{8,}\.(js|css|jpg|png|woff2)$/.test(url.pathname)
|
|
106
|
+
const response = await fetch(request)
|
|
107
|
+
|
|
108
|
+
if (isImmutable) {
|
|
109
|
+
const headers = new Headers(response.headers)
|
|
110
|
+
headers.set('Cache-Control', 'public, max-age=31536000, immutable')
|
|
111
|
+
return new Response(response.body, { status: response.status, headers })
|
|
112
|
+
}
|
|
113
|
+
return response
|
|
114
|
+
},
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Cost Optimization
|
|
119
|
+
|
|
120
|
+
### Cost Calculator
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
interface CacheReserveEstimate {
|
|
124
|
+
avgAssetSizeGB: number
|
|
125
|
+
uniqueAssets: number
|
|
126
|
+
monthlyReads: number
|
|
127
|
+
monthlyWrites: number
|
|
128
|
+
originEgressCostPerGB: number // e.g., AWS: $0.09/GB
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function estimateMonthlyCost(input: CacheReserveEstimate) {
|
|
132
|
+
// Cache Reserve pricing
|
|
133
|
+
const storageCostPerGBMonth = 0.015
|
|
134
|
+
const classAPerMillion = 4.5 // writes
|
|
135
|
+
const classBPerMillion = 0.36 // reads
|
|
136
|
+
|
|
137
|
+
// Calculate Cache Reserve costs
|
|
138
|
+
const totalStorageGB = input.avgAssetSizeGB * input.uniqueAssets
|
|
139
|
+
const storageCost = totalStorageGB * storageCostPerGBMonth
|
|
140
|
+
const writeCost = (input.monthlyWrites / 1_000_000) * classAPerMillion
|
|
141
|
+
const readCost = (input.monthlyReads / 1_000_000) * classBPerMillion
|
|
142
|
+
|
|
143
|
+
const cacheReserveCost = storageCost + writeCost + readCost
|
|
144
|
+
|
|
145
|
+
// Calculate origin egress cost (what you'd pay without Cache Reserve)
|
|
146
|
+
const totalTrafficGB = input.monthlyReads * input.avgAssetSizeGB
|
|
147
|
+
const originEgressCost = totalTrafficGB * input.originEgressCostPerGB
|
|
148
|
+
|
|
149
|
+
// Savings calculation
|
|
150
|
+
const savings = originEgressCost - cacheReserveCost
|
|
151
|
+
const savingsPercent = ((savings / originEgressCost) * 100).toFixed(1)
|
|
152
|
+
|
|
153
|
+
return {
|
|
154
|
+
cacheReserveCost: `$${cacheReserveCost.toFixed(2)}`,
|
|
155
|
+
originEgressCost: `$${originEgressCost.toFixed(2)}`,
|
|
156
|
+
monthlySavings: `$${savings.toFixed(2)}`,
|
|
157
|
+
savingsPercent: `${savingsPercent}%`,
|
|
158
|
+
breakdown: {
|
|
159
|
+
storage: `$${storageCost.toFixed(2)}`,
|
|
160
|
+
writes: `$${writeCost.toFixed(2)}`,
|
|
161
|
+
reads: `$${readCost.toFixed(2)}`,
|
|
162
|
+
},
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Example: Media library
|
|
167
|
+
const mediaLibrary = estimateMonthlyCost({
|
|
168
|
+
avgAssetSizeGB: 0.005, // 5MB images
|
|
169
|
+
uniqueAssets: 10_000,
|
|
170
|
+
monthlyReads: 5_000_000,
|
|
171
|
+
monthlyWrites: 50_000,
|
|
172
|
+
originEgressCostPerGB: 0.09, // AWS S3
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
console.log(mediaLibrary)
|
|
176
|
+
// {
|
|
177
|
+
// cacheReserveCost: "$9.98",
|
|
178
|
+
// originEgressCost: "$25.00",
|
|
179
|
+
// monthlySavings: "$15.02",
|
|
180
|
+
// savingsPercent: "60.1%",
|
|
181
|
+
// breakdown: { storage: "$0.75", writes: "$0.23", reads: "$9.00" }
|
|
182
|
+
// }
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Optimization Guidelines
|
|
186
|
+
|
|
187
|
+
- **Set appropriate TTLs**: 10hr minimum, 24hr+ optimal for stable content, 30d max cautiously
|
|
188
|
+
- **Cache high-value stable assets**: Images, media, fonts, archives, documentation
|
|
189
|
+
- **Exclude frequently changing**: APIs, user-specific content, real-time data
|
|
190
|
+
- **Compression note**: Cache Reserve fetches uncompressed from origin, serves compressed to visitors - factor in origin egress costs
|
|
191
|
+
|
|
192
|
+
## See Also
|
|
193
|
+
|
|
194
|
+
- [README](./README.md) - Overview and core concepts
|
|
195
|
+
- [Configuration](./configuration.md) - Setup and Cache Rules
|
|
196
|
+
- [API Reference](./api.md) - Purging and monitoring
|
|
197
|
+
- [Gotchas](./gotchas.md) - Common issues and troubleshooting
|