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.
Files changed (321) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/template/.opencode/AGENTS.md +209 -77
  3. package/dist/template/.opencode/agent/plan.md +4 -0
  4. package/dist/template/.opencode/command/cloudflare.md +70 -0
  5. package/dist/template/.opencode/package.json +1 -1
  6. package/dist/template/.opencode/skill/cloudflare/SKILL.md +233 -0
  7. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/README.md +35 -0
  8. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/api.md +100 -0
  9. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/configuration.md +99 -0
  10. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/gotchas.md +59 -0
  11. package/dist/template/.opencode/skill/cloudflare/references/agents-sdk/patterns.md +89 -0
  12. package/dist/template/.opencode/skill/cloudflare/references/ai-gateway/README.md +695 -0
  13. package/dist/template/.opencode/skill/cloudflare/references/ai-search/README.md +14 -0
  14. package/dist/template/.opencode/skill/cloudflare/references/ai-search/api.md +38 -0
  15. package/dist/template/.opencode/skill/cloudflare/references/ai-search/configuration.md +52 -0
  16. package/dist/template/.opencode/skill/cloudflare/references/ai-search/gotchas.md +41 -0
  17. package/dist/template/.opencode/skill/cloudflare/references/ai-search/patterns.md +45 -0
  18. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/README.md +14 -0
  19. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/api.md +27 -0
  20. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/configuration.md +45 -0
  21. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/gotchas.md +3 -0
  22. package/dist/template/.opencode/skill/cloudflare/references/analytics-engine/patterns.md +36 -0
  23. package/dist/template/.opencode/skill/cloudflare/references/api/README.md +21 -0
  24. package/dist/template/.opencode/skill/cloudflare/references/api/api.md +31 -0
  25. package/dist/template/.opencode/skill/cloudflare/references/api/configuration.md +20 -0
  26. package/dist/template/.opencode/skill/cloudflare/references/api/gotchas.md +28 -0
  27. package/dist/template/.opencode/skill/cloudflare/references/api/patterns.md +47 -0
  28. package/dist/template/.opencode/skill/cloudflare/references/api-shield/README.md +20 -0
  29. package/dist/template/.opencode/skill/cloudflare/references/api-shield/api.md +78 -0
  30. package/dist/template/.opencode/skill/cloudflare/references/api-shield/configuration.md +128 -0
  31. package/dist/template/.opencode/skill/cloudflare/references/api-shield/gotchas.md +51 -0
  32. package/dist/template/.opencode/skill/cloudflare/references/api-shield/patterns.md +145 -0
  33. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/README.md +16 -0
  34. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/api.md +50 -0
  35. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/configuration.md +53 -0
  36. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/gotchas.md +16 -0
  37. package/dist/template/.opencode/skill/cloudflare/references/argo-smart-routing/patterns.md +45 -0
  38. package/dist/template/.opencode/skill/cloudflare/references/bindings/README.md +14 -0
  39. package/dist/template/.opencode/skill/cloudflare/references/bindings/api.md +3 -0
  40. package/dist/template/.opencode/skill/cloudflare/references/bindings/configuration.md +58 -0
  41. package/dist/template/.opencode/skill/cloudflare/references/bindings/gotchas.md +35 -0
  42. package/dist/template/.opencode/skill/cloudflare/references/bindings/patterns.md +37 -0
  43. package/dist/template/.opencode/skill/cloudflare/references/bot-management/README.md +71 -0
  44. package/dist/template/.opencode/skill/cloudflare/references/bot-management/api.md +168 -0
  45. package/dist/template/.opencode/skill/cloudflare/references/bot-management/configuration.md +114 -0
  46. package/dist/template/.opencode/skill/cloudflare/references/bot-management/gotchas.md +99 -0
  47. package/dist/template/.opencode/skill/cloudflare/references/bot-management/patterns.md +125 -0
  48. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/README.md +16 -0
  49. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/api.md +54 -0
  50. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/configuration.md +47 -0
  51. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/gotchas.md +29 -0
  52. package/dist/template/.opencode/skill/cloudflare/references/browser-rendering/patterns.md +29 -0
  53. package/dist/template/.opencode/skill/cloudflare/references/c3/README.md +264 -0
  54. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/README.md +93 -0
  55. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/api.md +176 -0
  56. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/configuration.md +164 -0
  57. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/gotchas.md +203 -0
  58. package/dist/template/.opencode/skill/cloudflare/references/cache-reserve/patterns.md +180 -0
  59. package/dist/template/.opencode/skill/cloudflare/references/containers/README.md +16 -0
  60. package/dist/template/.opencode/skill/cloudflare/references/containers/api.md +43 -0
  61. package/dist/template/.opencode/skill/cloudflare/references/containers/configuration.md +56 -0
  62. package/dist/template/.opencode/skill/cloudflare/references/containers/gotchas.md +21 -0
  63. package/dist/template/.opencode/skill/cloudflare/references/containers/patterns.md +40 -0
  64. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/README.md +85 -0
  65. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/api.md +198 -0
  66. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/configuration.md +151 -0
  67. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/gotchas.md +129 -0
  68. package/dist/template/.opencode/skill/cloudflare/references/cron-triggers/patterns.md +122 -0
  69. package/dist/template/.opencode/skill/cloudflare/references/d1/README.md +92 -0
  70. package/dist/template/.opencode/skill/cloudflare/references/d1/api.md +141 -0
  71. package/dist/template/.opencode/skill/cloudflare/references/d1/configuration.md +127 -0
  72. package/dist/template/.opencode/skill/cloudflare/references/d1/gotchas.md +70 -0
  73. package/dist/template/.opencode/skill/cloudflare/references/d1/patterns.md +144 -0
  74. package/dist/template/.opencode/skill/cloudflare/references/ddos/README.md +34 -0
  75. package/dist/template/.opencode/skill/cloudflare/references/ddos/api.md +136 -0
  76. package/dist/template/.opencode/skill/cloudflare/references/ddos/configuration.md +67 -0
  77. package/dist/template/.opencode/skill/cloudflare/references/ddos/gotchas.md +114 -0
  78. package/dist/template/.opencode/skill/cloudflare/references/ddos/patterns.md +158 -0
  79. package/dist/template/.opencode/skill/cloudflare/references/do-storage/README.md +62 -0
  80. package/dist/template/.opencode/skill/cloudflare/references/do-storage/api.md +89 -0
  81. package/dist/template/.opencode/skill/cloudflare/references/do-storage/configuration.md +116 -0
  82. package/dist/template/.opencode/skill/cloudflare/references/do-storage/gotchas.md +93 -0
  83. package/dist/template/.opencode/skill/cloudflare/references/do-storage/patterns.md +112 -0
  84. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/README.md +125 -0
  85. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/api.md +152 -0
  86. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/configuration.md +148 -0
  87. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/gotchas.md +158 -0
  88. package/dist/template/.opencode/skill/cloudflare/references/durable-objects/patterns.md +255 -0
  89. package/dist/template/.opencode/skill/cloudflare/references/email-routing/README.md +18 -0
  90. package/dist/template/.opencode/skill/cloudflare/references/email-routing/api.md +46 -0
  91. package/dist/template/.opencode/skill/cloudflare/references/email-routing/configuration.md +63 -0
  92. package/dist/template/.opencode/skill/cloudflare/references/email-routing/gotchas.md +16 -0
  93. package/dist/template/.opencode/skill/cloudflare/references/email-routing/patterns.md +46 -0
  94. package/dist/template/.opencode/skill/cloudflare/references/email-workers/README.md +598 -0
  95. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/README.md +62 -0
  96. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/api.md +137 -0
  97. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/configuration.md +133 -0
  98. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/gotchas.md +184 -0
  99. package/dist/template/.opencode/skill/cloudflare/references/hyperdrive/patterns.md +176 -0
  100. package/dist/template/.opencode/skill/cloudflare/references/images/README.md +14 -0
  101. package/dist/template/.opencode/skill/cloudflare/references/images/api.md +3 -0
  102. package/dist/template/.opencode/skill/cloudflare/references/images/configuration.md +45 -0
  103. package/dist/template/.opencode/skill/cloudflare/references/images/gotchas.md +23 -0
  104. package/dist/template/.opencode/skill/cloudflare/references/images/patterns.md +31 -0
  105. package/dist/template/.opencode/skill/cloudflare/references/kv/README.md +60 -0
  106. package/dist/template/.opencode/skill/cloudflare/references/kv/api.md +114 -0
  107. package/dist/template/.opencode/skill/cloudflare/references/kv/configuration.md +92 -0
  108. package/dist/template/.opencode/skill/cloudflare/references/kv/gotchas.md +117 -0
  109. package/dist/template/.opencode/skill/cloudflare/references/kv/patterns.md +139 -0
  110. package/dist/template/.opencode/skill/cloudflare/references/miniflare/README.md +64 -0
  111. package/dist/template/.opencode/skill/cloudflare/references/miniflare/api.md +144 -0
  112. package/dist/template/.opencode/skill/cloudflare/references/miniflare/configuration.md +203 -0
  113. package/dist/template/.opencode/skill/cloudflare/references/miniflare/gotchas.md +187 -0
  114. package/dist/template/.opencode/skill/cloudflare/references/miniflare/patterns.md +211 -0
  115. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/README.md +60 -0
  116. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/api.md +240 -0
  117. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/configuration.md +127 -0
  118. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/gotchas.md +171 -0
  119. package/dist/template/.opencode/skill/cloudflare/references/network-interconnect/patterns.md +171 -0
  120. package/dist/template/.opencode/skill/cloudflare/references/observability/README.md +18 -0
  121. package/dist/template/.opencode/skill/cloudflare/references/observability/api.md +51 -0
  122. package/dist/template/.opencode/skill/cloudflare/references/observability/configuration.md +60 -0
  123. package/dist/template/.opencode/skill/cloudflare/references/observability/gotchas.md +36 -0
  124. package/dist/template/.opencode/skill/cloudflare/references/observability/patterns.md +42 -0
  125. package/dist/template/.opencode/skill/cloudflare/references/pages/README.md +76 -0
  126. package/dist/template/.opencode/skill/cloudflare/references/pages/api.md +200 -0
  127. package/dist/template/.opencode/skill/cloudflare/references/pages/configuration.md +228 -0
  128. package/dist/template/.opencode/skill/cloudflare/references/pages/gotchas.md +161 -0
  129. package/dist/template/.opencode/skill/cloudflare/references/pages/patterns.md +145 -0
  130. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/README.md +57 -0
  131. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/api.md +201 -0
  132. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/configuration.md +159 -0
  133. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/gotchas.md +151 -0
  134. package/dist/template/.opencode/skill/cloudflare/references/pages-functions/patterns.md +190 -0
  135. package/dist/template/.opencode/skill/cloudflare/references/pipelines/README.md +664 -0
  136. package/dist/template/.opencode/skill/cloudflare/references/pulumi/README.md +107 -0
  137. package/dist/template/.opencode/skill/cloudflare/references/pulumi/api.md +194 -0
  138. package/dist/template/.opencode/skill/cloudflare/references/pulumi/configuration.md +216 -0
  139. package/dist/template/.opencode/skill/cloudflare/references/pulumi/gotchas.md +223 -0
  140. package/dist/template/.opencode/skill/cloudflare/references/pulumi/patterns.md +139 -0
  141. package/dist/template/.opencode/skill/cloudflare/references/queues/README.md +69 -0
  142. package/dist/template/.opencode/skill/cloudflare/references/queues/api.md +138 -0
  143. package/dist/template/.opencode/skill/cloudflare/references/queues/configuration.md +125 -0
  144. package/dist/template/.opencode/skill/cloudflare/references/queues/gotchas.md +112 -0
  145. package/dist/template/.opencode/skill/cloudflare/references/queues/patterns.md +155 -0
  146. package/dist/template/.opencode/skill/cloudflare/references/r2/README.md +61 -0
  147. package/dist/template/.opencode/skill/cloudflare/references/r2/api.md +127 -0
  148. package/dist/template/.opencode/skill/cloudflare/references/r2/configuration.md +76 -0
  149. package/dist/template/.opencode/skill/cloudflare/references/r2/gotchas.md +94 -0
  150. package/dist/template/.opencode/skill/cloudflare/references/r2/patterns.md +127 -0
  151. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/README.md +18 -0
  152. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/api.md +29 -0
  153. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/configuration.md +39 -0
  154. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/gotchas.md +20 -0
  155. package/dist/template/.opencode/skill/cloudflare/references/r2-data-catalog/patterns.md +46 -0
  156. package/dist/template/.opencode/skill/cloudflare/references/r2-sql/README.md +512 -0
  157. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/README.md +21 -0
  158. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/api.md +135 -0
  159. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/configuration.md +63 -0
  160. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/gotchas.md +75 -0
  161. package/dist/template/.opencode/skill/cloudflare/references/realtime-sfu/patterns.md +102 -0
  162. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/README.md +81 -0
  163. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/api.md +164 -0
  164. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/configuration.md +147 -0
  165. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/gotchas.md +172 -0
  166. package/dist/template/.opencode/skill/cloudflare/references/realtimekit/patterns.md +155 -0
  167. package/dist/template/.opencode/skill/cloudflare/references/sandbox/README.md +90 -0
  168. package/dist/template/.opencode/skill/cloudflare/references/sandbox/api.md +178 -0
  169. package/dist/template/.opencode/skill/cloudflare/references/sandbox/configuration.md +131 -0
  170. package/dist/template/.opencode/skill/cloudflare/references/sandbox/gotchas.md +156 -0
  171. package/dist/template/.opencode/skill/cloudflare/references/sandbox/patterns.md +203 -0
  172. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/README.md +58 -0
  173. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/api.md +182 -0
  174. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/configuration.md +140 -0
  175. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/gotchas.md +129 -0
  176. package/dist/template/.opencode/skill/cloudflare/references/secrets-store/patterns.md +218 -0
  177. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/README.md +91 -0
  178. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/api.md +139 -0
  179. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/configuration.md +129 -0
  180. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/gotchas.md +87 -0
  181. package/dist/template/.opencode/skill/cloudflare/references/smart-placement/patterns.md +135 -0
  182. package/dist/template/.opencode/skill/cloudflare/references/snippets/README.md +15 -0
  183. package/dist/template/.opencode/skill/cloudflare/references/snippets/api.md +47 -0
  184. package/dist/template/.opencode/skill/cloudflare/references/snippets/configuration.md +33 -0
  185. package/dist/template/.opencode/skill/cloudflare/references/snippets/gotchas.md +21 -0
  186. package/dist/template/.opencode/skill/cloudflare/references/snippets/patterns.md +34 -0
  187. package/dist/template/.opencode/skill/cloudflare/references/spectrum/README.md +16 -0
  188. package/dist/template/.opencode/skill/cloudflare/references/spectrum/api.md +24 -0
  189. package/dist/template/.opencode/skill/cloudflare/references/spectrum/configuration.md +43 -0
  190. package/dist/template/.opencode/skill/cloudflare/references/spectrum/gotchas.md +42 -0
  191. package/dist/template/.opencode/skill/cloudflare/references/spectrum/patterns.md +40 -0
  192. package/dist/template/.opencode/skill/cloudflare/references/static-assets/README.md +14 -0
  193. package/dist/template/.opencode/skill/cloudflare/references/static-assets/api.md +3 -0
  194. package/dist/template/.opencode/skill/cloudflare/references/static-assets/configuration.md +47 -0
  195. package/dist/template/.opencode/skill/cloudflare/references/static-assets/gotchas.md +44 -0
  196. package/dist/template/.opencode/skill/cloudflare/references/static-assets/patterns.md +42 -0
  197. package/dist/template/.opencode/skill/cloudflare/references/stream/README.md +103 -0
  198. package/dist/template/.opencode/skill/cloudflare/references/stream/api.md +204 -0
  199. package/dist/template/.opencode/skill/cloudflare/references/stream/configuration.md +127 -0
  200. package/dist/template/.opencode/skill/cloudflare/references/stream/gotchas.md +131 -0
  201. package/dist/template/.opencode/skill/cloudflare/references/stream/patterns.md +152 -0
  202. package/dist/template/.opencode/skill/cloudflare/references/tail-workers/README.md +640 -0
  203. package/dist/template/.opencode/skill/cloudflare/references/terraform/README.md +76 -0
  204. package/dist/template/.opencode/skill/cloudflare/references/terraform/api.md +159 -0
  205. package/dist/template/.opencode/skill/cloudflare/references/terraform/configuration.md +156 -0
  206. package/dist/template/.opencode/skill/cloudflare/references/terraform/gotchas.md +207 -0
  207. package/dist/template/.opencode/skill/cloudflare/references/terraform/patterns.md +135 -0
  208. package/dist/template/.opencode/skill/cloudflare/references/tunnel/README.md +82 -0
  209. package/dist/template/.opencode/skill/cloudflare/references/tunnel/api.md +105 -0
  210. package/dist/template/.opencode/skill/cloudflare/references/tunnel/configuration.md +113 -0
  211. package/dist/template/.opencode/skill/cloudflare/references/tunnel/gotchas.md +115 -0
  212. package/dist/template/.opencode/skill/cloudflare/references/tunnel/patterns.md +157 -0
  213. package/dist/template/.opencode/skill/cloudflare/references/turn/README.md +699 -0
  214. package/dist/template/.opencode/skill/cloudflare/references/turnstile/README.md +14 -0
  215. package/dist/template/.opencode/skill/cloudflare/references/turnstile/api.md +3 -0
  216. package/dist/template/.opencode/skill/cloudflare/references/turnstile/configuration.md +19 -0
  217. package/dist/template/.opencode/skill/cloudflare/references/turnstile/gotchas.md +27 -0
  218. package/dist/template/.opencode/skill/cloudflare/references/turnstile/patterns.md +41 -0
  219. package/dist/template/.opencode/skill/cloudflare/references/vectorize/README.md +682 -0
  220. package/dist/template/.opencode/skill/cloudflare/references/waf/README.md +14 -0
  221. package/dist/template/.opencode/skill/cloudflare/references/waf/api.md +3 -0
  222. package/dist/template/.opencode/skill/cloudflare/references/waf/configuration.md +44 -0
  223. package/dist/template/.opencode/skill/cloudflare/references/waf/gotchas.md +24 -0
  224. package/dist/template/.opencode/skill/cloudflare/references/waf/patterns.md +29 -0
  225. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/README.md +19 -0
  226. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/api.md +52 -0
  227. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/configuration.md +31 -0
  228. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/gotchas.md +28 -0
  229. package/dist/template/.opencode/skill/cloudflare/references/web-analytics/patterns.md +52 -0
  230. package/dist/template/.opencode/skill/cloudflare/references/workerd/README.md +47 -0
  231. package/dist/template/.opencode/skill/cloudflare/references/workerd/api.md +199 -0
  232. package/dist/template/.opencode/skill/cloudflare/references/workerd/configuration.md +185 -0
  233. package/dist/template/.opencode/skill/cloudflare/references/workerd/gotchas.md +203 -0
  234. package/dist/template/.opencode/skill/cloudflare/references/workerd/patterns.md +216 -0
  235. package/dist/template/.opencode/skill/cloudflare/references/workers/README.md +96 -0
  236. package/dist/template/.opencode/skill/cloudflare/references/workers/api.md +137 -0
  237. package/dist/template/.opencode/skill/cloudflare/references/workers/configuration.md +147 -0
  238. package/dist/template/.opencode/skill/cloudflare/references/workers/gotchas.md +99 -0
  239. package/dist/template/.opencode/skill/cloudflare/references/workers/patterns.md +149 -0
  240. package/dist/template/.opencode/skill/cloudflare/references/workers-ai/README.md +116 -0
  241. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/README.md +48 -0
  242. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/api.md +169 -0
  243. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/configuration.md +136 -0
  244. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/gotchas.md +130 -0
  245. package/dist/template/.opencode/skill/cloudflare/references/workers-for-platforms/patterns.md +170 -0
  246. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/README.md +16 -0
  247. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/api.md +20 -0
  248. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/configuration.md +3 -0
  249. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/gotchas.md +35 -0
  250. package/dist/template/.opencode/skill/cloudflare/references/workers-playground/patterns.md +42 -0
  251. package/dist/template/.opencode/skill/cloudflare/references/workers-vpc/README.md +579 -0
  252. package/dist/template/.opencode/skill/cloudflare/references/workflows/README.md +62 -0
  253. package/dist/template/.opencode/skill/cloudflare/references/workflows/api.md +125 -0
  254. package/dist/template/.opencode/skill/cloudflare/references/workflows/configuration.md +177 -0
  255. package/dist/template/.opencode/skill/cloudflare/references/workflows/gotchas.md +136 -0
  256. package/dist/template/.opencode/skill/cloudflare/references/workflows/patterns.md +132 -0
  257. package/dist/template/.opencode/skill/cloudflare/references/wrangler/README.md +90 -0
  258. package/dist/template/.opencode/skill/cloudflare/references/wrangler/api.md +140 -0
  259. package/dist/template/.opencode/skill/cloudflare/references/wrangler/configuration.md +128 -0
  260. package/dist/template/.opencode/skill/cloudflare/references/wrangler/gotchas.md +93 -0
  261. package/dist/template/.opencode/skill/cloudflare/references/wrangler/patterns.md +150 -0
  262. package/dist/template/.opencode/skill/cloudflare/references/zaraz/README.md +360 -0
  263. package/dist/template/.opencode/skill/react-best-practices/AGENTS.md +2410 -0
  264. package/dist/template/.opencode/skill/react-best-practices/README.md +123 -0
  265. package/dist/template/.opencode/skill/react-best-practices/SKILL.md +125 -0
  266. package/dist/template/.opencode/skill/react-best-practices/metadata.json +15 -0
  267. package/dist/template/.opencode/skill/react-best-practices/rules/_sections.md +46 -0
  268. package/dist/template/.opencode/skill/react-best-practices/rules/_template.md +28 -0
  269. package/dist/template/.opencode/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  270. package/dist/template/.opencode/skill/react-best-practices/rules/advanced-use-latest.md +49 -0
  271. package/dist/template/.opencode/skill/react-best-practices/rules/async-api-routes.md +38 -0
  272. package/dist/template/.opencode/skill/react-best-practices/rules/async-defer-await.md +80 -0
  273. package/dist/template/.opencode/skill/react-best-practices/rules/async-dependencies.md +36 -0
  274. package/dist/template/.opencode/skill/react-best-practices/rules/async-parallel.md +28 -0
  275. package/dist/template/.opencode/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  276. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  277. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-conditional.md +31 -0
  278. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  279. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  280. package/dist/template/.opencode/skill/react-best-practices/rules/bundle-preload.md +50 -0
  281. package/dist/template/.opencode/skill/react-best-practices/rules/client-event-listeners.md +74 -0
  282. package/dist/template/.opencode/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
  283. package/dist/template/.opencode/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  284. package/dist/template/.opencode/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
  285. package/dist/template/.opencode/skill/react-best-practices/rules/js-batch-dom-css.md +82 -0
  286. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
  287. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
  288. package/dist/template/.opencode/skill/react-best-practices/rules/js-cache-storage.md +70 -0
  289. package/dist/template/.opencode/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
  290. package/dist/template/.opencode/skill/react-best-practices/rules/js-early-exit.md +50 -0
  291. package/dist/template/.opencode/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
  292. package/dist/template/.opencode/skill/react-best-practices/rules/js-index-maps.md +37 -0
  293. package/dist/template/.opencode/skill/react-best-practices/rules/js-length-check-first.md +49 -0
  294. package/dist/template/.opencode/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
  295. package/dist/template/.opencode/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
  296. package/dist/template/.opencode/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  297. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-activity.md +26 -0
  298. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  299. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
  300. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
  301. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  302. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  303. package/dist/template/.opencode/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
  304. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
  305. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
  306. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
  307. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  308. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  309. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-memo.md +44 -0
  310. package/dist/template/.opencode/skill/react-best-practices/rules/rerender-transitions.md +40 -0
  311. package/dist/template/.opencode/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
  312. package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-lru.md +41 -0
  313. package/dist/template/.opencode/skill/react-best-practices/rules/server-cache-react.md +76 -0
  314. package/dist/template/.opencode/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
  315. package/dist/template/.opencode/skill/react-best-practices/rules/server-serialization.md +38 -0
  316. package/dist/template/.opencode/skill/supabase/SKILL.md +120 -0
  317. package/dist/template/.opencode/skill/supabase/mcp.json +27 -0
  318. package/dist/template/.opencode/skill/vercel-deploy-claimable/SKILL.md +112 -0
  319. package/dist/template/.opencode/skill/vercel-deploy-claimable/scripts/deploy.sh +249 -0
  320. package/dist/template/.opencode/skill/web-design-guidelines/SKILL.md +39 -0
  321. 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
+ ```