opencodekit 0.15.3 → 0.15.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/template/.opencode/AGENTS.md +209 -77
- package/dist/template/.opencode/agent/plan.md +4 -0
- package/dist/template/.opencode/command/cloudflare.md +70 -0
- package/dist/template/.opencode/package.json +1 -1
- package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
- package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
- package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
- package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
- package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
- package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
- package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
- package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
- package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
- package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
- package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
- package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
- package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
- package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
- package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
- package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
- package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
- package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
- package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
- package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
- package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
- package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
- package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
- package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
- package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
- package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
- package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
- package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
- package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
- package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
- package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
- package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
- package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
- package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
- package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
- package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
- package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
- package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
- package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
- package/package.json +1 -1
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
# Cloudflare R2 SQL Skill
|
|
2
|
+
|
|
3
|
+
Guide for using Cloudflare R2 SQL - serverless distributed query engine for Apache Iceberg tables in R2 Data Catalog.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
R2 SQL is Cloudflare's serverless distributed analytics query engine for querying Apache Iceberg tables in R2 Data Catalog. Features:
|
|
8
|
+
- Serverless - no clusters to manage
|
|
9
|
+
- Distributed - leverages Cloudflare's global network
|
|
10
|
+
- Zero egress fees - query from any cloud/region
|
|
11
|
+
- Open beta - free during beta (standard R2 storage costs apply)
|
|
12
|
+
|
|
13
|
+
## Core Concepts
|
|
14
|
+
|
|
15
|
+
### Apache Iceberg Table Format
|
|
16
|
+
- Open table format for large-scale analytics datasets
|
|
17
|
+
- ACID transactions for reliable concurrent reads/writes
|
|
18
|
+
- Schema evolution - add/rename/drop columns without rewriting data
|
|
19
|
+
- Optimized metadata - avoids full table scans via indexed metadata
|
|
20
|
+
- Supported by Spark, Trino, Snowflake, DuckDB, ClickHouse, PyIceberg
|
|
21
|
+
|
|
22
|
+
### R2 Data Catalog
|
|
23
|
+
- Managed Apache Iceberg catalog built into R2 bucket
|
|
24
|
+
- Exposes standard Iceberg REST catalog interface
|
|
25
|
+
- Single source of truth for table metadata
|
|
26
|
+
- Tracks table state via immutable snapshots
|
|
27
|
+
- Supports multiple query engines safely accessing same tables
|
|
28
|
+
|
|
29
|
+
### Architecture
|
|
30
|
+
**Query Planner**:
|
|
31
|
+
- Top-down metadata investigation
|
|
32
|
+
- Multi-layer pruning (partition-level, column-level, row-group level)
|
|
33
|
+
- Streaming pipeline - execution starts before planning completes
|
|
34
|
+
- Early termination - stops when result complete without full scan
|
|
35
|
+
- Uses partition stats and column stats (min/max, null counts)
|
|
36
|
+
|
|
37
|
+
**Query Execution**:
|
|
38
|
+
- Coordinator distributes work to workers across Cloudflare network
|
|
39
|
+
- Workers run Apache DataFusion for parallel query execution
|
|
40
|
+
- Arrow IPC format for inter-process communication
|
|
41
|
+
- Parquet column pruning - reads only required columns
|
|
42
|
+
- Ranged reads from R2 for efficiency
|
|
43
|
+
|
|
44
|
+
**Aggregation Strategies**:
|
|
45
|
+
- Scatter-gather - for simple aggregations (sum, count, avg)
|
|
46
|
+
- Shuffling - for ORDER BY/HAVING on aggregates via hash partitioning
|
|
47
|
+
|
|
48
|
+
## Setup & Configuration
|
|
49
|
+
|
|
50
|
+
### 1. Enable R2 Data Catalog
|
|
51
|
+
|
|
52
|
+
CLI:
|
|
53
|
+
```bash
|
|
54
|
+
npx wrangler r2 bucket catalog enable <bucket-name>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Note the Warehouse name and Catalog URI from output.
|
|
58
|
+
|
|
59
|
+
Dashboard:
|
|
60
|
+
1. R2 Object Storage → Select bucket
|
|
61
|
+
2. Settings tab → R2 Data Catalog → Enable
|
|
62
|
+
3. Note Catalog URI and Warehouse name
|
|
63
|
+
|
|
64
|
+
### 2. Create API Token
|
|
65
|
+
|
|
66
|
+
Required permissions: R2 Admin Read & Write (includes R2 SQL Read)
|
|
67
|
+
|
|
68
|
+
Dashboard:
|
|
69
|
+
1. R2 Object Storage → Manage API tokens
|
|
70
|
+
2. Create API token → Admin Read & Write
|
|
71
|
+
3. Save token value
|
|
72
|
+
|
|
73
|
+
### 3. Configure Environment
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
export WRANGLER_R2_SQL_AUTH_TOKEN=<your-token>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Or `.env` file:
|
|
80
|
+
```
|
|
81
|
+
WRANGLER_R2_SQL_AUTH_TOKEN=<your-token>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Common Code Patterns
|
|
85
|
+
|
|
86
|
+
### Wrangler CLI Query
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npx wrangler r2 sql query "<warehouse-name>" "
|
|
90
|
+
SELECT *
|
|
91
|
+
FROM namespace.table_name
|
|
92
|
+
WHERE condition
|
|
93
|
+
LIMIT 10"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### PyIceberg Setup
|
|
97
|
+
|
|
98
|
+
```python
|
|
99
|
+
from pyiceberg.catalog.rest import RestCatalog
|
|
100
|
+
|
|
101
|
+
catalog = RestCatalog(
|
|
102
|
+
name="my_catalog",
|
|
103
|
+
warehouse="<WAREHOUSE>",
|
|
104
|
+
uri="<CATALOG_URI>",
|
|
105
|
+
token="<TOKEN>",
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Create namespace
|
|
109
|
+
catalog.create_namespace_if_not_exists("default")
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Create Table
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
import pyarrow as pa
|
|
116
|
+
|
|
117
|
+
# Define schema
|
|
118
|
+
df = pa.table({
|
|
119
|
+
"id": [1, 2, 3],
|
|
120
|
+
"name": ["Alice", "Bob", "Charlie"],
|
|
121
|
+
"score": [80.0, 92.5, 88.0],
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
# Create table
|
|
125
|
+
table = catalog.create_table(
|
|
126
|
+
("default", "people"),
|
|
127
|
+
schema=df.schema,
|
|
128
|
+
)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Append Data
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
table.append(df)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Query Table
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
# Scan and convert to Pandas
|
|
141
|
+
scanned = table.scan().to_arrow()
|
|
142
|
+
print(scanned.to_pandas())
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## SQL Reference
|
|
146
|
+
|
|
147
|
+
### Query Structure
|
|
148
|
+
|
|
149
|
+
```sql
|
|
150
|
+
SELECT column_list | aggregation_function
|
|
151
|
+
FROM table_name
|
|
152
|
+
WHERE conditions
|
|
153
|
+
[GROUP BY column_list]
|
|
154
|
+
[HAVING conditions]
|
|
155
|
+
[ORDER BY partition_key [DESC | ASC]]
|
|
156
|
+
[LIMIT number]
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Schema Discovery
|
|
160
|
+
|
|
161
|
+
```sql
|
|
162
|
+
-- List namespaces
|
|
163
|
+
SHOW DATABASES;
|
|
164
|
+
SHOW NAMESPACES;
|
|
165
|
+
|
|
166
|
+
-- List tables
|
|
167
|
+
SHOW TABLES IN namespace_name;
|
|
168
|
+
|
|
169
|
+
-- Describe table
|
|
170
|
+
DESCRIBE namespace_name.table_name;
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### SELECT Patterns
|
|
174
|
+
|
|
175
|
+
```sql
|
|
176
|
+
-- All columns
|
|
177
|
+
SELECT * FROM ns.table;
|
|
178
|
+
|
|
179
|
+
-- Specific columns
|
|
180
|
+
SELECT user_id, timestamp, status FROM ns.table;
|
|
181
|
+
|
|
182
|
+
-- With conditions
|
|
183
|
+
SELECT * FROM ns.table
|
|
184
|
+
WHERE timestamp BETWEEN '2025-01-01T00:00:00Z' AND '2025-01-31T23:59:59Z'
|
|
185
|
+
AND status = 200
|
|
186
|
+
LIMIT 100;
|
|
187
|
+
|
|
188
|
+
-- Complex conditions
|
|
189
|
+
SELECT * FROM ns.table
|
|
190
|
+
WHERE (status = 404 OR status = 500)
|
|
191
|
+
AND method = 'POST'
|
|
192
|
+
AND user_agent IS NOT NULL
|
|
193
|
+
ORDER BY timestamp DESC;
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Aggregations
|
|
197
|
+
|
|
198
|
+
Supported functions: COUNT(*), SUM(col), AVG(col), MIN(col), MAX(col)
|
|
199
|
+
|
|
200
|
+
```sql
|
|
201
|
+
-- Count by group
|
|
202
|
+
SELECT department, COUNT(*)
|
|
203
|
+
FROM ns.sales_data
|
|
204
|
+
GROUP BY department;
|
|
205
|
+
|
|
206
|
+
-- Multiple aggregates
|
|
207
|
+
SELECT region, MIN(price), MAX(price), AVG(price)
|
|
208
|
+
FROM ns.products
|
|
209
|
+
GROUP BY region
|
|
210
|
+
ORDER BY AVG(price) DESC;
|
|
211
|
+
|
|
212
|
+
-- With HAVING filter
|
|
213
|
+
SELECT category, SUM(amount)
|
|
214
|
+
FROM ns.sales
|
|
215
|
+
WHERE sale_date >= '2024-01-01'
|
|
216
|
+
GROUP BY category
|
|
217
|
+
HAVING SUM(amount) > 10000
|
|
218
|
+
LIMIT 10;
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Data Types
|
|
222
|
+
|
|
223
|
+
| Type | Description | Example |
|
|
224
|
+
|------|-------------|---------|
|
|
225
|
+
| integer | Whole numbers | 1, 42, -10 |
|
|
226
|
+
| float | Decimals | 1.5, 3.14 |
|
|
227
|
+
| string | Text (quoted) | 'hello', 'GET' |
|
|
228
|
+
| boolean | true/false | true, false |
|
|
229
|
+
| timestamp | RFC3339 | '2025-01-01T00:00:00Z' |
|
|
230
|
+
| date | YYYY-MM-DD | '2025-01-01' |
|
|
231
|
+
|
|
232
|
+
### Operators
|
|
233
|
+
|
|
234
|
+
Comparison: =, !=, <, <=, >, >=, LIKE, BETWEEN, IS NULL, IS NOT NULL
|
|
235
|
+
Logical: AND (higher precedence), OR (lower precedence)
|
|
236
|
+
|
|
237
|
+
### ORDER BY Limitations
|
|
238
|
+
|
|
239
|
+
**CRITICAL**: ORDER BY only supports partition key columns
|
|
240
|
+
|
|
241
|
+
```sql
|
|
242
|
+
-- Valid if timestamp is partition key
|
|
243
|
+
SELECT * FROM ns.logs ORDER BY timestamp DESC LIMIT 100;
|
|
244
|
+
|
|
245
|
+
-- Invalid if column not in partition key
|
|
246
|
+
SELECT * FROM ns.logs ORDER BY user_id; -- ERROR
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### LIMIT Defaults
|
|
250
|
+
|
|
251
|
+
- Range: 1 to 10,000
|
|
252
|
+
- Default: 500 if not specified
|
|
253
|
+
|
|
254
|
+
## Pipelines Integration
|
|
255
|
+
|
|
256
|
+
### Create Pipeline with Data Catalog Sink
|
|
257
|
+
|
|
258
|
+
Schema file (`schema.json`):
|
|
259
|
+
```json
|
|
260
|
+
{
|
|
261
|
+
"fields": [
|
|
262
|
+
{"name": "user_id", "type": "string", "required": true},
|
|
263
|
+
{"name": "event_type", "type": "string", "required": true},
|
|
264
|
+
{"name": "amount", "type": "float64", "required": false}
|
|
265
|
+
]
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
Setup:
|
|
270
|
+
```bash
|
|
271
|
+
npx wrangler pipelines setup
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Configuration:
|
|
275
|
+
- Pipeline name: ecommerce
|
|
276
|
+
- Enable HTTP endpoint: yes
|
|
277
|
+
- Schema: Load from file → schema.json
|
|
278
|
+
- Destination: Data Catalog Table
|
|
279
|
+
- R2 bucket: your-bucket
|
|
280
|
+
- Namespace: default
|
|
281
|
+
- Table name: events
|
|
282
|
+
- Catalog token: <your-token>
|
|
283
|
+
- Compression: zstd
|
|
284
|
+
- Roll file time: 10 seconds (dev), 300+ (prod)
|
|
285
|
+
|
|
286
|
+
### Send Data to Pipeline
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
curl -X POST https://{stream-id}.ingest.cloudflare.com \
|
|
290
|
+
-H "Content-Type: application/json" \
|
|
291
|
+
-d '[
|
|
292
|
+
{
|
|
293
|
+
"user_id": "user_123",
|
|
294
|
+
"event_type": "purchase",
|
|
295
|
+
"amount": 29.99
|
|
296
|
+
}
|
|
297
|
+
]'
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## Common Use Cases
|
|
301
|
+
|
|
302
|
+
### Log Analytics
|
|
303
|
+
- Ingest logs via Pipelines to Iceberg table
|
|
304
|
+
- Partition by day(timestamp) for efficient queries
|
|
305
|
+
- Query specific time ranges with automatic pruning
|
|
306
|
+
- Aggregate by status codes, endpoints, user agents
|
|
307
|
+
|
|
308
|
+
```sql
|
|
309
|
+
SELECT status, COUNT(*)
|
|
310
|
+
FROM logs.http_requests
|
|
311
|
+
WHERE timestamp BETWEEN '2025-01-01T00:00:00Z' AND '2025-01-31T23:59:59Z'
|
|
312
|
+
AND method = 'GET'
|
|
313
|
+
GROUP BY status
|
|
314
|
+
ORDER BY COUNT(*) DESC;
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
### Fraud Detection
|
|
318
|
+
- Stream transaction events to catalog
|
|
319
|
+
- Query suspicious patterns with WHERE filters
|
|
320
|
+
- Aggregate by location, merchant, time windows
|
|
321
|
+
|
|
322
|
+
```sql
|
|
323
|
+
SELECT location, COUNT(*), AVG(amount)
|
|
324
|
+
FROM fraud.transactions
|
|
325
|
+
WHERE is_fraud = true
|
|
326
|
+
AND transaction_timestamp >= '2025-01-01'
|
|
327
|
+
GROUP BY location
|
|
328
|
+
HAVING COUNT(*) > 10;
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### Business Intelligence
|
|
332
|
+
- ETL data into partitioned Iceberg tables
|
|
333
|
+
- Run analytical queries across large datasets
|
|
334
|
+
- Generate reports with GROUP BY aggregations
|
|
335
|
+
- No egress fees when querying from BI tools
|
|
336
|
+
|
|
337
|
+
```sql
|
|
338
|
+
SELECT
|
|
339
|
+
department,
|
|
340
|
+
SUM(revenue) as total_revenue,
|
|
341
|
+
AVG(revenue) as avg_revenue
|
|
342
|
+
FROM sales.transactions
|
|
343
|
+
WHERE sale_date >= '2024-01-01'
|
|
344
|
+
GROUP BY department
|
|
345
|
+
ORDER BY SUM(revenue) DESC
|
|
346
|
+
LIMIT 10;
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## Performance Optimization
|
|
350
|
+
|
|
351
|
+
### Partitioning Strategy
|
|
352
|
+
- Choose partition key based on common query patterns
|
|
353
|
+
- Typical: day(timestamp), hour(timestamp), region, category
|
|
354
|
+
- Enables metadata pruning to skip entire partitions
|
|
355
|
+
- Required for ORDER BY optimization
|
|
356
|
+
|
|
357
|
+
### Query Optimization
|
|
358
|
+
- Use WHERE filters to leverage partition/column stats
|
|
359
|
+
- Specify LIMIT to enable early termination
|
|
360
|
+
- ORDER BY partition key columns only
|
|
361
|
+
- Filter on high-selectivity columns first
|
|
362
|
+
|
|
363
|
+
### Data Organization
|
|
364
|
+
- Smaller files → slower queries (overhead)
|
|
365
|
+
- Larger files → better compression, fewer metadata ops
|
|
366
|
+
- Recommended: 100-500MB Parquet files after compression
|
|
367
|
+
- Use appropriate roll intervals in Pipelines (300+ seconds for prod)
|
|
368
|
+
|
|
369
|
+
### File Pruning
|
|
370
|
+
Automatic at three levels:
|
|
371
|
+
1. Partition-level: Skip manifests not matching query
|
|
372
|
+
2. File-level: Skip Parquet files via column stats
|
|
373
|
+
3. Row-group level: Skip row groups within files
|
|
374
|
+
|
|
375
|
+
## Iceberg Metadata Structure
|
|
376
|
+
|
|
377
|
+
```
|
|
378
|
+
bucket/
|
|
379
|
+
metadata/
|
|
380
|
+
snap-{id}.avro # Snapshot (points to manifest list)
|
|
381
|
+
{uuid}-m0.avro # Manifest file (lists data files + stats)
|
|
382
|
+
version-hint.text # Current metadata version
|
|
383
|
+
v{n}.metadata.json # Table metadata (schema, snapshots)
|
|
384
|
+
data/
|
|
385
|
+
00000-0-{uuid}.parquet # Data files
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
**Metadata hierarchy**:
|
|
389
|
+
1. Table metadata JSON - schema, partition spec, snapshot log
|
|
390
|
+
2. Snapshot - points to manifest list
|
|
391
|
+
3. Manifest list - partition stats for each manifest
|
|
392
|
+
4. Manifest files - column stats for each data file
|
|
393
|
+
5. Parquet files - row group stats in footer
|
|
394
|
+
|
|
395
|
+
## Limitations & Best Practices
|
|
396
|
+
|
|
397
|
+
### Current Limitations (Open Beta)
|
|
398
|
+
- ORDER BY only on partition key columns
|
|
399
|
+
- COUNT(*) only - COUNT(column) not supported
|
|
400
|
+
- No aliases in SELECT
|
|
401
|
+
- No subqueries, joins, or CTEs
|
|
402
|
+
- No nested column access
|
|
403
|
+
- LIMIT max 10,000
|
|
404
|
+
|
|
405
|
+
### Best Practices
|
|
406
|
+
- Partition by time dimension for time-series data
|
|
407
|
+
- Use BETWEEN for time ranges (leverages partition pruning)
|
|
408
|
+
- Combine filters with AND for better pruning
|
|
409
|
+
- Set appropriate LIMIT based on use case
|
|
410
|
+
- Use compression (zstd recommended)
|
|
411
|
+
- Monitor query performance and adjust partitioning
|
|
412
|
+
|
|
413
|
+
### Type Safety
|
|
414
|
+
- Quote string values: 'value'
|
|
415
|
+
- Use RFC3339 for timestamps: '2025-01-01T00:00:00Z'
|
|
416
|
+
- Use YYYY-MM-DD for dates: '2025-01-01'
|
|
417
|
+
- No implicit type conversions
|
|
418
|
+
|
|
419
|
+
## Connecting Other Engines
|
|
420
|
+
|
|
421
|
+
R2 Data Catalog supports standard Iceberg REST catalog API.
|
|
422
|
+
|
|
423
|
+
### Spark (Scala)
|
|
424
|
+
```scala
|
|
425
|
+
val spark = SparkSession.builder()
|
|
426
|
+
.config("spark.sql.catalog.my_catalog", "org.apache.iceberg.spark.SparkCatalog")
|
|
427
|
+
.config("spark.sql.catalog.my_catalog.catalog-impl", "org.apache.iceberg.rest.RESTCatalog")
|
|
428
|
+
.config("spark.sql.catalog.my_catalog.uri", catalogUri)
|
|
429
|
+
.config("spark.sql.catalog.my_catalog.token", token)
|
|
430
|
+
.config("spark.sql.catalog.my_catalog.warehouse", warehouse)
|
|
431
|
+
.getOrCreate()
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### Snowflake
|
|
435
|
+
- Create external Iceberg catalog connection
|
|
436
|
+
- Configure with Catalog URI and R2 credentials
|
|
437
|
+
- Query tables via SQL interface
|
|
438
|
+
|
|
439
|
+
### DuckDB, Trino, ClickHouse
|
|
440
|
+
- Supported via Iceberg REST catalog protocol
|
|
441
|
+
- Refer to engine-specific documentation for configuration
|
|
442
|
+
|
|
443
|
+
## Pricing (Future)
|
|
444
|
+
|
|
445
|
+
Currently in open beta - no charges beyond standard R2 costs.
|
|
446
|
+
|
|
447
|
+
Planned future pricing:
|
|
448
|
+
- R2 storage: $0.015/GB-month
|
|
449
|
+
- Class A operations: $4.50/million
|
|
450
|
+
- Class B operations: $0.36/million
|
|
451
|
+
- Catalog operations: $9.00/million (create table, get metadata, etc)
|
|
452
|
+
- Compaction: $0.05/GB + $4.00/million objects processed
|
|
453
|
+
- Egress: $0 (always free)
|
|
454
|
+
|
|
455
|
+
30+ days notice before billing begins.
|
|
456
|
+
|
|
457
|
+
## Troubleshooting
|
|
458
|
+
|
|
459
|
+
### Common Errors
|
|
460
|
+
|
|
461
|
+
**"ORDER BY column not in partition key"**
|
|
462
|
+
- Only partition key columns can be used in ORDER BY
|
|
463
|
+
- Check table partition spec with DESCRIBE
|
|
464
|
+
- Remove ORDER BY or adjust table partitioning
|
|
465
|
+
|
|
466
|
+
**"Token authentication failed"**
|
|
467
|
+
- Verify WRANGLER_R2_SQL_AUTH_TOKEN is set
|
|
468
|
+
- Ensure token has R2 Admin Read & Write + SQL Read permissions
|
|
469
|
+
- Token may be expired - create new one
|
|
470
|
+
|
|
471
|
+
**"Table not found"**
|
|
472
|
+
- Verify namespace exists: SHOW DATABASES
|
|
473
|
+
- Check table name: SHOW TABLES IN namespace
|
|
474
|
+
- Ensure catalog enabled on bucket
|
|
475
|
+
|
|
476
|
+
**"No data returned"**
|
|
477
|
+
- Check WHERE conditions match data
|
|
478
|
+
- Verify time range in BETWEEN clause
|
|
479
|
+
- Try removing filters to confirm data exists
|
|
480
|
+
|
|
481
|
+
### Performance Issues
|
|
482
|
+
|
|
483
|
+
**Slow queries**:
|
|
484
|
+
- Check partition pruning effectiveness
|
|
485
|
+
- Reduce LIMIT if scanning too much data
|
|
486
|
+
- Ensure filters on partition key columns
|
|
487
|
+
- Review Parquet file sizes (aim for 100-500MB)
|
|
488
|
+
|
|
489
|
+
**Query timeout**:
|
|
490
|
+
- Add more restrictive WHERE filters
|
|
491
|
+
- Reduce LIMIT
|
|
492
|
+
- Consider better partitioning strategy
|
|
493
|
+
|
|
494
|
+
## Resources
|
|
495
|
+
|
|
496
|
+
- Docs: https://developers.cloudflare.com/r2-sql/
|
|
497
|
+
- Data Catalog: https://developers.cloudflare.com/r2/data-catalog/
|
|
498
|
+
- Blog: https://blog.cloudflare.com/r2-sql-deep-dive/
|
|
499
|
+
- Discord: https://discord.cloudflare.com/
|
|
500
|
+
|
|
501
|
+
## Key Reminders
|
|
502
|
+
|
|
503
|
+
1. R2 SQL queries ONLY Apache Iceberg tables in R2 Data Catalog
|
|
504
|
+
2. Enable catalog on bucket before use
|
|
505
|
+
3. Create API token with R2 + catalog permissions
|
|
506
|
+
4. Partition by time for time-series data
|
|
507
|
+
5. ORDER BY limited to partition key columns
|
|
508
|
+
6. Use LIMIT and WHERE for optimal performance
|
|
509
|
+
7. Zero egress fees - query from anywhere
|
|
510
|
+
8. Open beta - free during testing phase
|
|
511
|
+
9. Serverless - no infrastructure management
|
|
512
|
+
10. Leverage Cloudflare's global network for distributed execution
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Cloudflare Realtime SFU Reference
|
|
2
|
+
|
|
3
|
+
Expert guidance for building real-time audio/video/data applications using Cloudflare Realtime SFU (Selective Forwarding Unit).
|
|
4
|
+
|
|
5
|
+
## In This Reference
|
|
6
|
+
|
|
7
|
+
- **[configuration.md](./configuration.md)** - Setup, deployment, environment variables, Wrangler config
|
|
8
|
+
- **[api.md](./api.md)** - Sessions, tracks, endpoints, request/response patterns
|
|
9
|
+
- **[patterns.md](./patterns.md)** - Architecture patterns, use cases, integration examples
|
|
10
|
+
- **[gotchas.md](./gotchas.md)** - Common issues, debugging, performance, security
|
|
11
|
+
|
|
12
|
+
## Quick Start
|
|
13
|
+
|
|
14
|
+
Cloudflare Realtime SFU: WebRTC infrastructure on global network (310+ cities). Anycast routing, no regional constraints, pub/sub model.
|
|
15
|
+
|
|
16
|
+
## See Also
|
|
17
|
+
|
|
18
|
+
- [Orange Meets Demo](https://demo.orange.cloudflare.dev/)
|
|
19
|
+
- [Orange Source](https://github.com/cloudflare/orange)
|
|
20
|
+
- [Calls Examples](https://github.com/cloudflare/calls-examples)
|
|
21
|
+
- [API Reference](https://developers.cloudflare.com/api/resources/calls/)
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# API Reference
|
|
2
|
+
|
|
3
|
+
## Authentication
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
curl -X POST 'https://rtc.live/v1/apps/${CALLS_APP_ID}/sessions/new' \
|
|
7
|
+
-H "Authorization: Bearer ${CALLS_APP_SECRET}"
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Core Concepts
|
|
11
|
+
|
|
12
|
+
**Sessions:** PeerConnection to Cloudflare edge
|
|
13
|
+
**Tracks:** Media/data channels (audio/video/datachannel)
|
|
14
|
+
**No rooms:** Build presence via track sharing
|
|
15
|
+
|
|
16
|
+
## Endpoints
|
|
17
|
+
|
|
18
|
+
### Create Session
|
|
19
|
+
```http
|
|
20
|
+
POST /v1/apps/{appId}/sessions/new
|
|
21
|
+
→ {sessionId, sessionDescription}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Add Track (Publish)
|
|
25
|
+
```http
|
|
26
|
+
POST /v1/apps/{appId}/sessions/{sessionId}/tracks/new
|
|
27
|
+
Body: {
|
|
28
|
+
sessionDescription: {sdp, type: "offer"},
|
|
29
|
+
tracks: [{location: "local", trackName: "my-video"}]
|
|
30
|
+
}
|
|
31
|
+
→ {sessionDescription, tracks: [{trackName}]}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Add Track (Subscribe)
|
|
35
|
+
```http
|
|
36
|
+
POST /v1/apps/{appId}/sessions/{sessionId}/tracks/new
|
|
37
|
+
Body: {
|
|
38
|
+
tracks: [{
|
|
39
|
+
location: "remote",
|
|
40
|
+
trackName: "remote-track-id",
|
|
41
|
+
sessionId: "other-session-id"
|
|
42
|
+
}]
|
|
43
|
+
}
|
|
44
|
+
→ {sessionDescription} (server offer)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Renegotiate
|
|
48
|
+
```http
|
|
49
|
+
PUT /v1/apps/{appId}/sessions/{sessionId}/renegotiate
|
|
50
|
+
Body: {sessionDescription: {sdp, type: "answer"}}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Close Tracks
|
|
54
|
+
```http
|
|
55
|
+
PUT /v1/apps/{appId}/sessions/{sessionId}/tracks/close
|
|
56
|
+
Body: {tracks: [{trackName}]}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Get Session
|
|
60
|
+
```http
|
|
61
|
+
GET /v1/apps/{appId}/sessions/{sessionId}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## WebRTC Flow
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// 1. Create PeerConnection
|
|
68
|
+
const pc = new RTCPeerConnection({
|
|
69
|
+
iceServers: [{urls: 'stun:stun.cloudflare.com:3478'}]
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// 2. Add tracks
|
|
73
|
+
const stream = await navigator.mediaDevices.getUserMedia({video: true, audio: true});
|
|
74
|
+
stream.getTracks().forEach(track => pc.addTrack(track, stream));
|
|
75
|
+
|
|
76
|
+
// 3. Create offer
|
|
77
|
+
const offer = await pc.createOffer();
|
|
78
|
+
await pc.setLocalDescription(offer);
|
|
79
|
+
|
|
80
|
+
// 4. Send to backend → Cloudflare API
|
|
81
|
+
const response = await fetch('/api/new-session', {
|
|
82
|
+
method: 'POST',
|
|
83
|
+
body: JSON.stringify({sdp: offer.sdp})
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// 5. Set remote answer
|
|
87
|
+
const {sessionDescription} = await response.json();
|
|
88
|
+
await pc.setRemoteDescription(sessionDescription);
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Publishing
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
const offer = await pc.createOffer();
|
|
95
|
+
await pc.setLocalDescription(offer);
|
|
96
|
+
|
|
97
|
+
const res = await fetch(`/api/sessions/${sessionId}/tracks`, {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
body: JSON.stringify({
|
|
100
|
+
sdp: offer.sdp,
|
|
101
|
+
tracks: [{location: 'local', trackName: 'my-video'}]
|
|
102
|
+
})
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const {sessionDescription, tracks} = await res.json();
|
|
106
|
+
await pc.setRemoteDescription(sessionDescription);
|
|
107
|
+
const publishedTrackId = tracks[0].trackName; // Share with others
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Subscribing
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
const res = await fetch(`/api/sessions/${sessionId}/tracks`, {
|
|
114
|
+
method: 'POST',
|
|
115
|
+
body: JSON.stringify({
|
|
116
|
+
tracks: [{location: 'remote', trackName: remoteTrackId, sessionId: remoteSessionId}]
|
|
117
|
+
})
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
const {sessionDescription} = await res.json();
|
|
121
|
+
await pc.setRemoteDescription(sessionDescription);
|
|
122
|
+
|
|
123
|
+
const answer = await pc.createAnswer();
|
|
124
|
+
await pc.setLocalDescription(answer);
|
|
125
|
+
|
|
126
|
+
await fetch(`/api/sessions/${sessionId}/renegotiate`, {
|
|
127
|
+
method: 'PUT',
|
|
128
|
+
body: JSON.stringify({sdp: answer.sdp})
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
pc.ontrack = (event) => {
|
|
132
|
+
const [remoteStream] = event.streams;
|
|
133
|
+
videoElement.srcObject = remoteStream;
|
|
134
|
+
};
|
|
135
|
+
```
|