pi-cloudflare 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (410) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +67 -0
  3. package/bin/setup.mjs +103 -0
  4. package/dist/auth-flow.d.ts +15 -0
  5. package/dist/auth-flow.d.ts.map +1 -0
  6. package/dist/auth-flow.js +90 -0
  7. package/dist/auth-flow.js.map +1 -0
  8. package/dist/client.d.ts +18 -0
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +47 -0
  11. package/dist/client.js.map +1 -0
  12. package/dist/config.d.ts +13 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +10 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/index.d.ts +24 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +109 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/oauth.d.ts +44 -0
  21. package/dist/oauth.d.ts.map +1 -0
  22. package/dist/oauth.js +135 -0
  23. package/dist/oauth.js.map +1 -0
  24. package/dist/proxy.d.ts +29 -0
  25. package/dist/proxy.d.ts.map +1 -0
  26. package/dist/proxy.js +39 -0
  27. package/dist/proxy.js.map +1 -0
  28. package/dist/servers.d.ts +19 -0
  29. package/dist/servers.d.ts.map +1 -0
  30. package/dist/servers.js +40 -0
  31. package/dist/servers.js.map +1 -0
  32. package/dist/token-store.d.ts +23 -0
  33. package/dist/token-store.d.ts.map +1 -0
  34. package/dist/token-store.js +47 -0
  35. package/dist/token-store.js.map +1 -0
  36. package/package.json +67 -0
  37. package/skills/agents-sdk/SKILL.md +221 -0
  38. package/skills/agents-sdk/references/browse-the-web.md +63 -0
  39. package/skills/agents-sdk/references/callable.md +92 -0
  40. package/skills/agents-sdk/references/client-sdk.md +110 -0
  41. package/skills/agents-sdk/references/codemode.md +110 -0
  42. package/skills/agents-sdk/references/configuration.md +72 -0
  43. package/skills/agents-sdk/references/durable-execution.md +51 -0
  44. package/skills/agents-sdk/references/email.md +146 -0
  45. package/skills/agents-sdk/references/human-in-the-loop.md +67 -0
  46. package/skills/agents-sdk/references/mcp.md +188 -0
  47. package/skills/agents-sdk/references/observability.md +44 -0
  48. package/skills/agents-sdk/references/queue-retries.md +79 -0
  49. package/skills/agents-sdk/references/routing.md +75 -0
  50. package/skills/agents-sdk/references/server-driven-messages.md +63 -0
  51. package/skills/agents-sdk/references/state-scheduling.md +171 -0
  52. package/skills/agents-sdk/references/streaming-chat.md +198 -0
  53. package/skills/agents-sdk/references/think.md +112 -0
  54. package/skills/agents-sdk/references/voice.md +68 -0
  55. package/skills/agents-sdk/references/webhooks-push.md +86 -0
  56. package/skills/agents-sdk/references/workflows.md +132 -0
  57. package/skills/cloudflare/SKILL.md +248 -0
  58. package/skills/cloudflare/references/agents-sdk/README.md +89 -0
  59. package/skills/cloudflare/references/agents-sdk/api.md +190 -0
  60. package/skills/cloudflare/references/agents-sdk/configuration.md +182 -0
  61. package/skills/cloudflare/references/agents-sdk/gotchas.md +158 -0
  62. package/skills/cloudflare/references/agents-sdk/patterns.md +192 -0
  63. package/skills/cloudflare/references/ai-gateway/README.md +175 -0
  64. package/skills/cloudflare/references/ai-gateway/configuration.md +111 -0
  65. package/skills/cloudflare/references/ai-gateway/dynamic-routing.md +82 -0
  66. package/skills/cloudflare/references/ai-gateway/features.md +96 -0
  67. package/skills/cloudflare/references/ai-gateway/sdk-integration.md +114 -0
  68. package/skills/cloudflare/references/ai-gateway/troubleshooting.md +88 -0
  69. package/skills/cloudflare/references/ai-search/README.md +138 -0
  70. package/skills/cloudflare/references/ai-search/api.md +87 -0
  71. package/skills/cloudflare/references/ai-search/configuration.md +88 -0
  72. package/skills/cloudflare/references/ai-search/gotchas.md +81 -0
  73. package/skills/cloudflare/references/ai-search/patterns.md +85 -0
  74. package/skills/cloudflare/references/analytics-engine/README.md +94 -0
  75. package/skills/cloudflare/references/analytics-engine/api.md +112 -0
  76. package/skills/cloudflare/references/analytics-engine/configuration.md +112 -0
  77. package/skills/cloudflare/references/analytics-engine/gotchas.md +85 -0
  78. package/skills/cloudflare/references/analytics-engine/patterns.md +83 -0
  79. package/skills/cloudflare/references/api/README.md +66 -0
  80. package/skills/cloudflare/references/api/api.md +204 -0
  81. package/skills/cloudflare/references/api/configuration.md +160 -0
  82. package/skills/cloudflare/references/api/gotchas.md +225 -0
  83. package/skills/cloudflare/references/api/patterns.md +204 -0
  84. package/skills/cloudflare/references/api-shield/README.md +44 -0
  85. package/skills/cloudflare/references/api-shield/api.md +141 -0
  86. package/skills/cloudflare/references/api-shield/configuration.md +192 -0
  87. package/skills/cloudflare/references/api-shield/gotchas.md +125 -0
  88. package/skills/cloudflare/references/api-shield/patterns.md +180 -0
  89. package/skills/cloudflare/references/argo-smart-routing/README.md +90 -0
  90. package/skills/cloudflare/references/argo-smart-routing/api.md +240 -0
  91. package/skills/cloudflare/references/argo-smart-routing/configuration.md +197 -0
  92. package/skills/cloudflare/references/argo-smart-routing/gotchas.md +111 -0
  93. package/skills/cloudflare/references/argo-smart-routing/patterns.md +104 -0
  94. package/skills/cloudflare/references/artifacts/README.md +79 -0
  95. package/skills/cloudflare/references/artifacts/api.md +128 -0
  96. package/skills/cloudflare/references/artifacts/configuration.md +92 -0
  97. package/skills/cloudflare/references/bindings/README.md +122 -0
  98. package/skills/cloudflare/references/bindings/api.md +203 -0
  99. package/skills/cloudflare/references/bindings/configuration.md +188 -0
  100. package/skills/cloudflare/references/bindings/gotchas.md +208 -0
  101. package/skills/cloudflare/references/bindings/patterns.md +200 -0
  102. package/skills/cloudflare/references/bot-management/README.md +94 -0
  103. package/skills/cloudflare/references/bot-management/api.md +169 -0
  104. package/skills/cloudflare/references/bot-management/configuration.md +163 -0
  105. package/skills/cloudflare/references/bot-management/gotchas.md +114 -0
  106. package/skills/cloudflare/references/bot-management/patterns.md +182 -0
  107. package/skills/cloudflare/references/browser-rendering/README.md +78 -0
  108. package/skills/cloudflare/references/browser-rendering/api.md +108 -0
  109. package/skills/cloudflare/references/browser-rendering/configuration.md +78 -0
  110. package/skills/cloudflare/references/browser-rendering/gotchas.md +88 -0
  111. package/skills/cloudflare/references/browser-rendering/patterns.md +91 -0
  112. package/skills/cloudflare/references/c3/README.md +111 -0
  113. package/skills/cloudflare/references/c3/api.md +71 -0
  114. package/skills/cloudflare/references/c3/configuration.md +81 -0
  115. package/skills/cloudflare/references/c3/gotchas.md +92 -0
  116. package/skills/cloudflare/references/c3/patterns.md +82 -0
  117. package/skills/cloudflare/references/cache-reserve/README.md +147 -0
  118. package/skills/cloudflare/references/cache-reserve/api.md +194 -0
  119. package/skills/cloudflare/references/cache-reserve/configuration.md +169 -0
  120. package/skills/cloudflare/references/cache-reserve/gotchas.md +132 -0
  121. package/skills/cloudflare/references/cache-reserve/patterns.md +197 -0
  122. package/skills/cloudflare/references/containers/README.md +85 -0
  123. package/skills/cloudflare/references/containers/api.md +187 -0
  124. package/skills/cloudflare/references/containers/configuration.md +188 -0
  125. package/skills/cloudflare/references/containers/gotchas.md +178 -0
  126. package/skills/cloudflare/references/containers/patterns.md +202 -0
  127. package/skills/cloudflare/references/cron-triggers/README.md +99 -0
  128. package/skills/cloudflare/references/cron-triggers/api.md +196 -0
  129. package/skills/cloudflare/references/cron-triggers/configuration.md +180 -0
  130. package/skills/cloudflare/references/cron-triggers/gotchas.md +199 -0
  131. package/skills/cloudflare/references/cron-triggers/patterns.md +190 -0
  132. package/skills/cloudflare/references/d1/README.md +133 -0
  133. package/skills/cloudflare/references/d1/api.md +196 -0
  134. package/skills/cloudflare/references/d1/configuration.md +191 -0
  135. package/skills/cloudflare/references/d1/gotchas.md +98 -0
  136. package/skills/cloudflare/references/d1/patterns.md +189 -0
  137. package/skills/cloudflare/references/ddos/README.md +41 -0
  138. package/skills/cloudflare/references/ddos/api.md +164 -0
  139. package/skills/cloudflare/references/ddos/configuration.md +93 -0
  140. package/skills/cloudflare/references/ddos/gotchas.md +107 -0
  141. package/skills/cloudflare/references/ddos/patterns.md +174 -0
  142. package/skills/cloudflare/references/do-storage/README.md +75 -0
  143. package/skills/cloudflare/references/do-storage/api.md +102 -0
  144. package/skills/cloudflare/references/do-storage/configuration.md +112 -0
  145. package/skills/cloudflare/references/do-storage/gotchas.md +150 -0
  146. package/skills/cloudflare/references/do-storage/patterns.md +194 -0
  147. package/skills/cloudflare/references/do-storage/testing.md +183 -0
  148. package/skills/cloudflare/references/durable-objects/README.md +185 -0
  149. package/skills/cloudflare/references/durable-objects/api.md +187 -0
  150. package/skills/cloudflare/references/durable-objects/configuration.md +160 -0
  151. package/skills/cloudflare/references/durable-objects/gotchas.md +197 -0
  152. package/skills/cloudflare/references/durable-objects/patterns.md +201 -0
  153. package/skills/cloudflare/references/email-routing/README.md +89 -0
  154. package/skills/cloudflare/references/email-routing/api.md +195 -0
  155. package/skills/cloudflare/references/email-routing/configuration.md +186 -0
  156. package/skills/cloudflare/references/email-routing/gotchas.md +196 -0
  157. package/skills/cloudflare/references/email-routing/patterns.md +229 -0
  158. package/skills/cloudflare/references/email-workers/README.md +151 -0
  159. package/skills/cloudflare/references/email-workers/api.md +237 -0
  160. package/skills/cloudflare/references/email-workers/configuration.md +112 -0
  161. package/skills/cloudflare/references/email-workers/gotchas.md +125 -0
  162. package/skills/cloudflare/references/email-workers/patterns.md +102 -0
  163. package/skills/cloudflare/references/flagship/README.md +59 -0
  164. package/skills/cloudflare/references/flagship/api.md +390 -0
  165. package/skills/cloudflare/references/flagship/configuration.md +202 -0
  166. package/skills/cloudflare/references/flagship/gotchas.md +178 -0
  167. package/skills/cloudflare/references/flagship/patterns.md +469 -0
  168. package/skills/cloudflare/references/graphql-api/README.md +147 -0
  169. package/skills/cloudflare/references/graphql-api/api.md +175 -0
  170. package/skills/cloudflare/references/graphql-api/configuration.md +118 -0
  171. package/skills/cloudflare/references/graphql-api/gotchas.md +110 -0
  172. package/skills/cloudflare/references/graphql-api/patterns.md +225 -0
  173. package/skills/cloudflare/references/hyperdrive/README.md +82 -0
  174. package/skills/cloudflare/references/hyperdrive/api.md +143 -0
  175. package/skills/cloudflare/references/hyperdrive/configuration.md +159 -0
  176. package/skills/cloudflare/references/hyperdrive/gotchas.md +77 -0
  177. package/skills/cloudflare/references/hyperdrive/patterns.md +190 -0
  178. package/skills/cloudflare/references/images/README.md +61 -0
  179. package/skills/cloudflare/references/images/api.md +96 -0
  180. package/skills/cloudflare/references/images/configuration.md +211 -0
  181. package/skills/cloudflare/references/images/gotchas.md +99 -0
  182. package/skills/cloudflare/references/images/patterns.md +115 -0
  183. package/skills/cloudflare/references/kv/README.md +89 -0
  184. package/skills/cloudflare/references/kv/api.md +160 -0
  185. package/skills/cloudflare/references/kv/configuration.md +144 -0
  186. package/skills/cloudflare/references/kv/gotchas.md +131 -0
  187. package/skills/cloudflare/references/kv/patterns.md +196 -0
  188. package/skills/cloudflare/references/miniflare/README.md +105 -0
  189. package/skills/cloudflare/references/miniflare/api.md +187 -0
  190. package/skills/cloudflare/references/miniflare/configuration.md +173 -0
  191. package/skills/cloudflare/references/miniflare/gotchas.md +160 -0
  192. package/skills/cloudflare/references/miniflare/patterns.md +181 -0
  193. package/skills/cloudflare/references/network-interconnect/README.md +99 -0
  194. package/skills/cloudflare/references/network-interconnect/api.md +199 -0
  195. package/skills/cloudflare/references/network-interconnect/configuration.md +114 -0
  196. package/skills/cloudflare/references/network-interconnect/gotchas.md +165 -0
  197. package/skills/cloudflare/references/network-interconnect/patterns.md +166 -0
  198. package/skills/cloudflare/references/observability/README.md +88 -0
  199. package/skills/cloudflare/references/observability/api.md +164 -0
  200. package/skills/cloudflare/references/observability/configuration.md +169 -0
  201. package/skills/cloudflare/references/observability/gotchas.md +115 -0
  202. package/skills/cloudflare/references/observability/patterns.md +105 -0
  203. package/skills/cloudflare/references/pages/README.md +88 -0
  204. package/skills/cloudflare/references/pages/api.md +204 -0
  205. package/skills/cloudflare/references/pages/configuration.md +201 -0
  206. package/skills/cloudflare/references/pages/gotchas.md +203 -0
  207. package/skills/cloudflare/references/pages/patterns.md +204 -0
  208. package/skills/cloudflare/references/pages-functions/README.md +98 -0
  209. package/skills/cloudflare/references/pages-functions/api.md +143 -0
  210. package/skills/cloudflare/references/pages-functions/configuration.md +122 -0
  211. package/skills/cloudflare/references/pages-functions/gotchas.md +94 -0
  212. package/skills/cloudflare/references/pages-functions/patterns.md +137 -0
  213. package/skills/cloudflare/references/pipelines/README.md +90 -0
  214. package/skills/cloudflare/references/pipelines/api.md +124 -0
  215. package/skills/cloudflare/references/pipelines/configuration.md +155 -0
  216. package/skills/cloudflare/references/pipelines/gotchas.md +58 -0
  217. package/skills/cloudflare/references/pipelines/patterns.md +130 -0
  218. package/skills/cloudflare/references/pulumi/README.md +100 -0
  219. package/skills/cloudflare/references/pulumi/api.md +200 -0
  220. package/skills/cloudflare/references/pulumi/configuration.md +198 -0
  221. package/skills/cloudflare/references/pulumi/gotchas.md +181 -0
  222. package/skills/cloudflare/references/pulumi/patterns.md +191 -0
  223. package/skills/cloudflare/references/queues/README.md +96 -0
  224. package/skills/cloudflare/references/queues/api.md +206 -0
  225. package/skills/cloudflare/references/queues/configuration.md +144 -0
  226. package/skills/cloudflare/references/queues/gotchas.md +206 -0
  227. package/skills/cloudflare/references/queues/patterns.md +220 -0
  228. package/skills/cloudflare/references/r2/README.md +95 -0
  229. package/skills/cloudflare/references/r2/api.md +200 -0
  230. package/skills/cloudflare/references/r2/configuration.md +165 -0
  231. package/skills/cloudflare/references/r2/gotchas.md +190 -0
  232. package/skills/cloudflare/references/r2/patterns.md +193 -0
  233. package/skills/cloudflare/references/r2-data-catalog/README.md +75 -0
  234. package/skills/cloudflare/references/r2-data-catalog/api.md +122 -0
  235. package/skills/cloudflare/references/r2-data-catalog/configuration.md +98 -0
  236. package/skills/cloudflare/references/r2-data-catalog/gotchas.md +55 -0
  237. package/skills/cloudflare/references/r2-data-catalog/patterns.md +122 -0
  238. package/skills/cloudflare/references/r2-sql/README.md +64 -0
  239. package/skills/cloudflare/references/r2-sql/api.md +121 -0
  240. package/skills/cloudflare/references/r2-sql/configuration.md +50 -0
  241. package/skills/cloudflare/references/r2-sql/gotchas.md +39 -0
  242. package/skills/cloudflare/references/r2-sql/patterns.md +118 -0
  243. package/skills/cloudflare/references/realtime-sfu/README.md +65 -0
  244. package/skills/cloudflare/references/realtime-sfu/api.md +158 -0
  245. package/skills/cloudflare/references/realtime-sfu/configuration.md +137 -0
  246. package/skills/cloudflare/references/realtime-sfu/gotchas.md +133 -0
  247. package/skills/cloudflare/references/realtime-sfu/patterns.md +174 -0
  248. package/skills/cloudflare/references/realtimekit/README.md +113 -0
  249. package/skills/cloudflare/references/realtimekit/api.md +212 -0
  250. package/skills/cloudflare/references/realtimekit/configuration.md +203 -0
  251. package/skills/cloudflare/references/realtimekit/gotchas.md +169 -0
  252. package/skills/cloudflare/references/realtimekit/patterns.md +223 -0
  253. package/skills/cloudflare/references/sandbox/README.md +96 -0
  254. package/skills/cloudflare/references/sandbox/api.md +198 -0
  255. package/skills/cloudflare/references/sandbox/configuration.md +143 -0
  256. package/skills/cloudflare/references/sandbox/gotchas.md +194 -0
  257. package/skills/cloudflare/references/sandbox/patterns.md +201 -0
  258. package/skills/cloudflare/references/secrets-store/README.md +74 -0
  259. package/skills/cloudflare/references/secrets-store/api.md +200 -0
  260. package/skills/cloudflare/references/secrets-store/configuration.md +185 -0
  261. package/skills/cloudflare/references/secrets-store/gotchas.md +97 -0
  262. package/skills/cloudflare/references/secrets-store/patterns.md +207 -0
  263. package/skills/cloudflare/references/smart-placement/README.md +138 -0
  264. package/skills/cloudflare/references/smart-placement/api.md +183 -0
  265. package/skills/cloudflare/references/smart-placement/configuration.md +196 -0
  266. package/skills/cloudflare/references/smart-placement/gotchas.md +174 -0
  267. package/skills/cloudflare/references/smart-placement/patterns.md +183 -0
  268. package/skills/cloudflare/references/snippets/README.md +68 -0
  269. package/skills/cloudflare/references/snippets/api.md +198 -0
  270. package/skills/cloudflare/references/snippets/configuration.md +227 -0
  271. package/skills/cloudflare/references/snippets/gotchas.md +86 -0
  272. package/skills/cloudflare/references/snippets/patterns.md +135 -0
  273. package/skills/cloudflare/references/spectrum/README.md +52 -0
  274. package/skills/cloudflare/references/spectrum/api.md +181 -0
  275. package/skills/cloudflare/references/spectrum/configuration.md +194 -0
  276. package/skills/cloudflare/references/spectrum/gotchas.md +145 -0
  277. package/skills/cloudflare/references/spectrum/patterns.md +196 -0
  278. package/skills/cloudflare/references/static-assets/README.md +65 -0
  279. package/skills/cloudflare/references/static-assets/api.md +199 -0
  280. package/skills/cloudflare/references/static-assets/configuration.md +186 -0
  281. package/skills/cloudflare/references/static-assets/gotchas.md +162 -0
  282. package/skills/cloudflare/references/static-assets/patterns.md +189 -0
  283. package/skills/cloudflare/references/stream/README.md +114 -0
  284. package/skills/cloudflare/references/stream/api-live.md +195 -0
  285. package/skills/cloudflare/references/stream/api.md +199 -0
  286. package/skills/cloudflare/references/stream/configuration.md +141 -0
  287. package/skills/cloudflare/references/stream/gotchas.md +130 -0
  288. package/skills/cloudflare/references/stream/patterns.md +184 -0
  289. package/skills/cloudflare/references/tail-workers/README.md +89 -0
  290. package/skills/cloudflare/references/tail-workers/api.md +200 -0
  291. package/skills/cloudflare/references/tail-workers/configuration.md +176 -0
  292. package/skills/cloudflare/references/tail-workers/gotchas.md +192 -0
  293. package/skills/cloudflare/references/tail-workers/patterns.md +180 -0
  294. package/skills/cloudflare/references/terraform/README.md +102 -0
  295. package/skills/cloudflare/references/terraform/api.md +178 -0
  296. package/skills/cloudflare/references/terraform/configuration.md +197 -0
  297. package/skills/cloudflare/references/terraform/gotchas.md +150 -0
  298. package/skills/cloudflare/references/terraform/patterns.md +174 -0
  299. package/skills/cloudflare/references/tunnel/README.md +129 -0
  300. package/skills/cloudflare/references/tunnel/api.md +193 -0
  301. package/skills/cloudflare/references/tunnel/configuration.md +157 -0
  302. package/skills/cloudflare/references/tunnel/gotchas.md +147 -0
  303. package/skills/cloudflare/references/tunnel/networking.md +168 -0
  304. package/skills/cloudflare/references/tunnel/patterns.md +192 -0
  305. package/skills/cloudflare/references/turn/README.md +82 -0
  306. package/skills/cloudflare/references/turn/api.md +239 -0
  307. package/skills/cloudflare/references/turn/configuration.md +179 -0
  308. package/skills/cloudflare/references/turn/gotchas.md +231 -0
  309. package/skills/cloudflare/references/turn/patterns.md +213 -0
  310. package/skills/cloudflare/references/turnstile/README.md +99 -0
  311. package/skills/cloudflare/references/turnstile/api.md +240 -0
  312. package/skills/cloudflare/references/turnstile/configuration.md +222 -0
  313. package/skills/cloudflare/references/turnstile/gotchas.md +218 -0
  314. package/skills/cloudflare/references/turnstile/patterns.md +193 -0
  315. package/skills/cloudflare/references/vectorize/README.md +133 -0
  316. package/skills/cloudflare/references/vectorize/api.md +88 -0
  317. package/skills/cloudflare/references/vectorize/configuration.md +88 -0
  318. package/skills/cloudflare/references/vectorize/gotchas.md +76 -0
  319. package/skills/cloudflare/references/vectorize/patterns.md +90 -0
  320. package/skills/cloudflare/references/waf/README.md +113 -0
  321. package/skills/cloudflare/references/waf/api.md +202 -0
  322. package/skills/cloudflare/references/waf/configuration.md +203 -0
  323. package/skills/cloudflare/references/waf/gotchas.md +204 -0
  324. package/skills/cloudflare/references/waf/patterns.md +197 -0
  325. package/skills/cloudflare/references/web-analytics/README.md +141 -0
  326. package/skills/cloudflare/references/web-analytics/configuration.md +76 -0
  327. package/skills/cloudflare/references/web-analytics/gotchas.md +82 -0
  328. package/skills/cloudflare/references/web-analytics/integration.md +60 -0
  329. package/skills/cloudflare/references/web-analytics/patterns.md +91 -0
  330. package/skills/cloudflare/references/workerd/README.md +78 -0
  331. package/skills/cloudflare/references/workerd/api.md +185 -0
  332. package/skills/cloudflare/references/workerd/configuration.md +183 -0
  333. package/skills/cloudflare/references/workerd/gotchas.md +139 -0
  334. package/skills/cloudflare/references/workerd/patterns.md +192 -0
  335. package/skills/cloudflare/references/workers/README.md +108 -0
  336. package/skills/cloudflare/references/workers/api.md +195 -0
  337. package/skills/cloudflare/references/workers/configuration.md +185 -0
  338. package/skills/cloudflare/references/workers/frameworks.md +197 -0
  339. package/skills/cloudflare/references/workers/gotchas.md +137 -0
  340. package/skills/cloudflare/references/workers/patterns.md +198 -0
  341. package/skills/cloudflare/references/workers-ai/README.md +197 -0
  342. package/skills/cloudflare/references/workers-ai/api.md +112 -0
  343. package/skills/cloudflare/references/workers-ai/configuration.md +97 -0
  344. package/skills/cloudflare/references/workers-ai/gotchas.md +114 -0
  345. package/skills/cloudflare/references/workers-ai/patterns.md +120 -0
  346. package/skills/cloudflare/references/workers-for-platforms/README.md +89 -0
  347. package/skills/cloudflare/references/workers-for-platforms/api.md +196 -0
  348. package/skills/cloudflare/references/workers-for-platforms/configuration.md +167 -0
  349. package/skills/cloudflare/references/workers-for-platforms/gotchas.md +134 -0
  350. package/skills/cloudflare/references/workers-for-platforms/patterns.md +188 -0
  351. package/skills/cloudflare/references/workers-playground/README.md +127 -0
  352. package/skills/cloudflare/references/workers-playground/api.md +101 -0
  353. package/skills/cloudflare/references/workers-playground/configuration.md +163 -0
  354. package/skills/cloudflare/references/workers-playground/gotchas.md +88 -0
  355. package/skills/cloudflare/references/workers-playground/patterns.md +132 -0
  356. package/skills/cloudflare/references/workers-vpc/README.md +127 -0
  357. package/skills/cloudflare/references/workers-vpc/api.md +202 -0
  358. package/skills/cloudflare/references/workers-vpc/configuration.md +147 -0
  359. package/skills/cloudflare/references/workers-vpc/gotchas.md +167 -0
  360. package/skills/cloudflare/references/workers-vpc/patterns.md +209 -0
  361. package/skills/cloudflare/references/workflows/README.md +77 -0
  362. package/skills/cloudflare/references/workflows/api.md +218 -0
  363. package/skills/cloudflare/references/workflows/configuration.md +152 -0
  364. package/skills/cloudflare/references/workflows/gotchas.md +90 -0
  365. package/skills/cloudflare/references/workflows/patterns.md +175 -0
  366. package/skills/cloudflare/references/wrangler/README.md +135 -0
  367. package/skills/cloudflare/references/wrangler/api.md +188 -0
  368. package/skills/cloudflare/references/wrangler/configuration.md +197 -0
  369. package/skills/cloudflare/references/wrangler/gotchas.md +197 -0
  370. package/skills/cloudflare/references/wrangler/patterns.md +209 -0
  371. package/skills/cloudflare/references/zaraz/IMPLEMENTATION_SUMMARY.md +121 -0
  372. package/skills/cloudflare/references/zaraz/README.md +111 -0
  373. package/skills/cloudflare/references/zaraz/api.md +112 -0
  374. package/skills/cloudflare/references/zaraz/configuration.md +90 -0
  375. package/skills/cloudflare/references/zaraz/gotchas.md +81 -0
  376. package/skills/cloudflare/references/zaraz/patterns.md +74 -0
  377. package/skills/cloudflare-email-service/SKILL.md +103 -0
  378. package/skills/cloudflare-email-service/references/cli-and-mcp.md +125 -0
  379. package/skills/cloudflare-email-service/references/deliverability.md +285 -0
  380. package/skills/cloudflare-email-service/references/rest-api.md +184 -0
  381. package/skills/cloudflare-email-service/references/routing.md +199 -0
  382. package/skills/cloudflare-email-service/references/sending.md +252 -0
  383. package/skills/cloudflare-one/SKILL.md +176 -0
  384. package/skills/cloudflare-one-migrations/SKILL.md +110 -0
  385. package/skills/durable-objects/SKILL.md +186 -0
  386. package/skills/durable-objects/references/rules.md +295 -0
  387. package/skills/durable-objects/references/testing.md +264 -0
  388. package/skills/durable-objects/references/workers.md +346 -0
  389. package/skills/sandbox-migrate-to-next/SKILL.md +185 -0
  390. package/skills/sandbox-next/SKILL.md +91 -0
  391. package/skills/sandbox-next/references/api-quick-ref.md +94 -0
  392. package/skills/sandbox-next/references/examples.md +15 -0
  393. package/skills/sandbox-stable/SKILL.md +110 -0
  394. package/skills/turnstile-spin/README.md +51 -0
  395. package/skills/turnstile-spin/SKILL.md +330 -0
  396. package/skills/turnstile-spin/references/astro.md +199 -0
  397. package/skills/turnstile-spin/references/hugo.md +114 -0
  398. package/skills/turnstile-spin/references/nextjs-app.md +261 -0
  399. package/skills/turnstile-spin/references/nextjs-pages.md +82 -0
  400. package/skills/turnstile-spin/references/sveltekit.md +191 -0
  401. package/skills/turnstile-spin/references/vanilla-html.md +157 -0
  402. package/skills/turnstile-spin/scripts/auth-probe.sh +285 -0
  403. package/skills/turnstile-spin/scripts/persist-skill.sh +114 -0
  404. package/skills/turnstile-spin/scripts/validate.sh +137 -0
  405. package/skills/turnstile-spin/scripts/widget-create.sh +121 -0
  406. package/skills/turnstile-spin/tests/validation.md +62 -0
  407. package/skills/workers-best-practices/SKILL.md +127 -0
  408. package/skills/workers-best-practices/references/review.md +174 -0
  409. package/skills/workers-best-practices/references/rules.md +467 -0
  410. package/skills/wrangler/SKILL.md +922 -0
@@ -0,0 +1,240 @@
1
+ # API Reference
2
+
3
+ ## Client-Side JavaScript API
4
+
5
+ The Turnstile JavaScript API is available at `window.turnstile` after loading the script.
6
+
7
+ ### `turnstile.render(container, options)`
8
+
9
+ Renders a Turnstile widget into a container element.
10
+
11
+ **Parameters:**
12
+ - `container` (string | HTMLElement): CSS selector or DOM element
13
+ - `options` (TurnstileOptions): Configuration object (see [configuration.md](configuration.md))
14
+
15
+ **Returns:** `string` - Widget ID for use with other API methods
16
+
17
+ **Example:**
18
+ ```javascript
19
+ const widgetId = window.turnstile.render('#my-container', {
20
+ sitekey: 'YOUR_SITE_KEY',
21
+ callback: (token) => console.log('Success:', token),
22
+ 'error-callback': (code) => console.error('Error:', code)
23
+ });
24
+ ```
25
+
26
+ ### `turnstile.reset(widgetId)`
27
+
28
+ Resets a widget (clears token, resets challenge state). Useful when form validation fails.
29
+
30
+ **Parameters:**
31
+ - `widgetId` (string): Widget ID from `render()`, or container element
32
+
33
+ **Returns:** `void`
34
+
35
+ **Example:**
36
+ ```javascript
37
+ // Reset on form error
38
+ if (!validateForm()) {
39
+ window.turnstile.reset(widgetId);
40
+ }
41
+ ```
42
+
43
+ ### `turnstile.remove(widgetId)`
44
+
45
+ Removes a widget from the DOM completely.
46
+
47
+ **Parameters:**
48
+ - `widgetId` (string): Widget ID from `render()`
49
+
50
+ **Returns:** `void`
51
+
52
+ **Example:**
53
+ ```javascript
54
+ // Cleanup on navigation
55
+ window.turnstile.remove(widgetId);
56
+ ```
57
+
58
+ ### `turnstile.getResponse(widgetId)`
59
+
60
+ Gets the current token from a widget (if challenge completed).
61
+
62
+ **Parameters:**
63
+ - `widgetId` (string): Widget ID from `render()`, or container element
64
+
65
+ **Returns:** `string | undefined` - Token string, or undefined if not ready
66
+
67
+ **Example:**
68
+ ```javascript
69
+ const token = window.turnstile.getResponse(widgetId);
70
+ if (token) {
71
+ submitForm(token);
72
+ }
73
+ ```
74
+
75
+ ### `turnstile.isExpired(widgetId)`
76
+
77
+ Checks if a widget's token has expired (>5 minutes old).
78
+
79
+ **Parameters:**
80
+ - `widgetId` (string): Widget ID from `render()`
81
+
82
+ **Returns:** `boolean` - True if expired
83
+
84
+ **Example:**
85
+ ```javascript
86
+ if (window.turnstile.isExpired(widgetId)) {
87
+ window.turnstile.reset(widgetId);
88
+ }
89
+ ```
90
+
91
+ ## Callback Signatures
92
+
93
+ ```typescript
94
+ type TurnstileCallback = (token: string) => void;
95
+ type ErrorCallback = (errorCode: string) => void;
96
+ type TimeoutCallback = () => void;
97
+ type ExpiredCallback = () => void;
98
+ type BeforeInteractiveCallback = () => void;
99
+ type AfterInteractiveCallback = () => void;
100
+ type UnsupportedCallback = () => void;
101
+ ```
102
+
103
+ ## Siteverify API (Server-Side)
104
+
105
+ **Endpoint:** `https://challenges.cloudflare.com/turnstile/v0/siteverify`
106
+
107
+ ### Request
108
+
109
+ **Method:** POST
110
+ **Content-Type:** `application/json` or `application/x-www-form-urlencoded`
111
+
112
+ ```typescript
113
+ interface SiteverifyRequest {
114
+ secret: string; // Your secret key (never expose client-side)
115
+ response: string; // Token from cf-turnstile-response
116
+ remoteip?: string; // User's IP (optional but recommended)
117
+ idempotency_key?: string; // Unique key for idempotent validation
118
+ }
119
+ ```
120
+
121
+ **Example:**
122
+ ```javascript
123
+ // Cloudflare Workers
124
+ const result = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
125
+ method: 'POST',
126
+ headers: { 'Content-Type': 'application/json' },
127
+ body: JSON.stringify({
128
+ secret: env.TURNSTILE_SECRET,
129
+ response: token,
130
+ remoteip: request.headers.get('CF-Connecting-IP')
131
+ })
132
+ });
133
+ const data = await result.json();
134
+ ```
135
+
136
+ ### Response
137
+
138
+ ```typescript
139
+ interface SiteverifyResponse {
140
+ success: boolean; // Validation result
141
+ challenge_ts?: string; // ISO timestamp of challenge
142
+ hostname?: string; // Hostname where widget was solved
143
+ 'error-codes'?: string[]; // Error codes if success=false
144
+ action?: string; // Action name from widget config
145
+ cdata?: string; // Custom data from widget config
146
+ }
147
+ ```
148
+
149
+ **Example Success:**
150
+ ```json
151
+ {
152
+ "success": true,
153
+ "challenge_ts": "2024-01-15T10:30:00Z",
154
+ "hostname": "example.com",
155
+ "action": "login",
156
+ "cdata": "user123"
157
+ }
158
+ ```
159
+
160
+ **Example Failure:**
161
+ ```json
162
+ {
163
+ "success": false,
164
+ "error-codes": ["timeout-or-duplicate"]
165
+ }
166
+ ```
167
+
168
+ ## Error Codes
169
+
170
+ | Code | Cause | Solution |
171
+ |------|-------|----------|
172
+ | `missing-input-secret` | Secret key not provided | Include `secret` in request |
173
+ | `invalid-input-secret` | Secret key is wrong | Check secret key in dashboard |
174
+ | `missing-input-response` | Token not provided | Include `response` token |
175
+ | `invalid-input-response` | Token is invalid/malformed | Verify token from widget |
176
+ | `timeout-or-duplicate` | Token expired (>5min) or reused | Generate new token, validate once |
177
+ | `internal-error` | Cloudflare server error | Retry with exponential backoff |
178
+ | `bad-request` | Malformed request | Check JSON/form encoding |
179
+
180
+ ## TypeScript Types
181
+
182
+ ```typescript
183
+ interface TurnstileOptions {
184
+ sitekey: string;
185
+ action?: string;
186
+ cData?: string;
187
+ callback?: (token: string) => void;
188
+ 'error-callback'?: (errorCode: string) => void;
189
+ 'expired-callback'?: () => void;
190
+ 'timeout-callback'?: () => void;
191
+ 'before-interactive-callback'?: () => void;
192
+ 'after-interactive-callback'?: () => void;
193
+ 'unsupported-callback'?: () => void;
194
+ theme?: 'light' | 'dark' | 'auto';
195
+ size?: 'normal' | 'compact' | 'flexible';
196
+ tabindex?: number;
197
+ 'response-field'?: boolean;
198
+ 'response-field-name'?: string;
199
+ retry?: 'auto' | 'never';
200
+ 'retry-interval'?: number;
201
+ language?: string;
202
+ execution?: 'render' | 'execute';
203
+ appearance?: 'always' | 'execute' | 'interaction-only';
204
+ 'refresh-expired'?: 'auto' | 'manual' | 'never';
205
+ }
206
+
207
+ interface Turnstile {
208
+ render(container: string | HTMLElement, options: TurnstileOptions): string;
209
+ reset(widgetId: string): void;
210
+ remove(widgetId: string): void;
211
+ getResponse(widgetId: string): string | undefined;
212
+ isExpired(widgetId: string): boolean;
213
+ execute(container?: string | HTMLElement, options?: TurnstileOptions): void;
214
+ }
215
+
216
+ declare global {
217
+ interface Window {
218
+ turnstile: Turnstile;
219
+ onloadTurnstileCallback?: () => void;
220
+ }
221
+ }
222
+ ```
223
+
224
+ ## Script Loading
225
+
226
+ ```html
227
+ <!-- Standard -->
228
+ <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
229
+
230
+ <!-- Explicit render mode -->
231
+ <script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"></script>
232
+
233
+ <!-- With load callback -->
234
+ <script src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=onloadTurnstileCallback"></script>
235
+ <script>
236
+ window.onloadTurnstileCallback = () => {
237
+ window.turnstile.render('#container', { sitekey: 'YOUR_SITE_KEY' });
238
+ };
239
+ </script>
240
+ ```
@@ -0,0 +1,222 @@
1
+ # Configuration
2
+
3
+ ## Script Loading
4
+
5
+ ### Basic (Implicit Rendering)
6
+ ```html
7
+ <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
8
+ ```
9
+ Automatically renders widgets with `class="cf-turnstile"` on page load.
10
+
11
+ ### Explicit Rendering
12
+ ```html
13
+ <script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit"></script>
14
+ ```
15
+ Manual control over when/where widgets render via `window.turnstile.render()`.
16
+
17
+ ### With Load Callback
18
+ ```html
19
+ <script src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=myCallback"></script>
20
+ <script>
21
+ function myCallback() {
22
+ // API ready
23
+ window.turnstile.render('#container', { sitekey: 'YOUR_SITE_KEY' });
24
+ }
25
+ </script>
26
+ ```
27
+
28
+ ### Compatibility Mode
29
+ ```html
30
+ <script src="https://challenges.cloudflare.com/turnstile/v0/api.js?compat=recaptcha"></script>
31
+ ```
32
+ Provides `grecaptcha` API for Google reCAPTCHA drop-in replacement.
33
+
34
+ ## Widget Configuration
35
+
36
+ ### Complete Options Object
37
+
38
+ ```javascript
39
+ {
40
+ // Required
41
+ sitekey: 'YOUR_SITE_KEY', // Widget sitekey from dashboard
42
+
43
+ // Callbacks
44
+ callback: (token) => {}, // Success - token ready
45
+ 'error-callback': (code) => {}, // Error occurred
46
+ 'expired-callback': () => {}, // Token expired (>5min)
47
+ 'timeout-callback': () => {}, // Challenge timeout
48
+ 'before-interactive-callback': () => {}, // Before showing checkbox
49
+ 'after-interactive-callback': () => {}, // After user interacts
50
+ 'unsupported-callback': () => {}, // Browser doesn't support Turnstile
51
+
52
+ // Appearance
53
+ theme: 'auto', // 'light' | 'dark' | 'auto'
54
+ size: 'normal', // 'normal' | 'compact' | 'flexible'
55
+ tabindex: 0, // Tab order (accessibility)
56
+ language: 'auto', // ISO 639-1 code or 'auto'
57
+
58
+ // Behavior
59
+ execution: 'render', // 'render' (auto) | 'execute' (manual)
60
+ appearance: 'always', // 'always' | 'execute' | 'interaction-only'
61
+ retry: 'auto', // 'auto' | 'never'
62
+ 'retry-interval': 8000, // Retry interval (ms), default 8000
63
+ 'refresh-expired': 'auto', // 'auto' | 'manual' | 'never'
64
+
65
+ // Form Integration
66
+ 'response-field': true, // Add hidden input (default: true)
67
+ 'response-field-name': 'cf-turnstile-response', // Hidden input name
68
+
69
+ // Analytics & Data
70
+ action: 'login', // Action name (for analytics)
71
+ cData: 'user-session-123', // Custom data (returned in siteverify)
72
+ }
73
+ ```
74
+
75
+ ### Key Options Explained
76
+
77
+ **`execution`:**
78
+ - `'render'` (default): Challenge starts immediately on render
79
+ - `'execute'`: Wait for `turnstile.execute()` call
80
+
81
+ **`appearance`:**
82
+ - `'always'` (default): Widget always visible
83
+ - `'execute'`: Hidden until `execute()` called
84
+ - `'interaction-only'`: Hidden until user interaction needed
85
+
86
+ **`refresh-expired`:**
87
+ - `'auto'` (default): Auto-refresh expired tokens
88
+ - `'manual'`: App must call `reset()` after expiry
89
+ - `'never'`: No refresh, expired-callback triggered
90
+
91
+ **`retry`:**
92
+ - `'auto'` (default): Auto-retry failed challenges
93
+ - `'never'`: Don't retry, trigger error-callback
94
+
95
+ ## HTML Data Attributes
96
+
97
+ For implicit rendering, use data attributes on `<div class="cf-turnstile">`:
98
+
99
+ | JavaScript Property | HTML Data Attribute | Example |
100
+ |---------------------|---------------------|---------|
101
+ | `sitekey` | `data-sitekey` | `data-sitekey="YOUR_KEY"` |
102
+ | `action` | `data-action` | `data-action="login"` |
103
+ | `cData` | `data-cdata` | `data-cdata="session-123"` |
104
+ | `callback` | `data-callback` | `data-callback="onSuccess"` |
105
+ | `error-callback` | `data-error-callback` | `data-error-callback="onError"` |
106
+ | `expired-callback` | `data-expired-callback` | `data-expired-callback="onExpired"` |
107
+ | `timeout-callback` | `data-timeout-callback` | `data-timeout-callback="onTimeout"` |
108
+ | `theme` | `data-theme` | `data-theme="dark"` |
109
+ | `size` | `data-size` | `data-size="compact"` |
110
+ | `tabindex` | `data-tabindex` | `data-tabindex="0"` |
111
+ | `response-field` | `data-response-field` | `data-response-field="false"` |
112
+ | `response-field-name` | `data-response-field-name` | `data-response-field-name="token"` |
113
+ | `retry` | `data-retry` | `data-retry="never"` |
114
+ | `retry-interval` | `data-retry-interval` | `data-retry-interval="5000"` |
115
+ | `language` | `data-language` | `data-language="en"` |
116
+ | `execution` | `data-execution` | `data-execution="execute"` |
117
+ | `appearance` | `data-appearance` | `data-appearance="interaction-only"` |
118
+ | `refresh-expired` | `data-refresh-expired` | `data-refresh-expired="manual"` |
119
+
120
+ **Example:**
121
+ ```html
122
+ <div class="cf-turnstile"
123
+ data-sitekey="YOUR_SITE_KEY"
124
+ data-theme="dark"
125
+ data-callback="onTurnstileSuccess"
126
+ data-error-callback="onTurnstileError"></div>
127
+ ```
128
+
129
+ ## Content Security Policy
130
+
131
+ Add these directives to CSP header/meta tag:
132
+
133
+ ```
134
+ script-src https://challenges.cloudflare.com;
135
+ frame-src https://challenges.cloudflare.com;
136
+ ```
137
+
138
+ **Full Example:**
139
+ ```html
140
+ <meta http-equiv="Content-Security-Policy"
141
+ content="default-src 'self';
142
+ script-src 'self' https://challenges.cloudflare.com;
143
+ frame-src https://challenges.cloudflare.com;">
144
+ ```
145
+
146
+ ## Framework-Specific Setup
147
+
148
+ ### React
149
+ ```bash
150
+ npm install @marsidev/react-turnstile
151
+ ```
152
+ ```jsx
153
+ import Turnstile from '@marsidev/react-turnstile';
154
+
155
+ <Turnstile
156
+ siteKey="YOUR_SITE_KEY"
157
+ onSuccess={(token) => console.log(token)}
158
+ />
159
+ ```
160
+
161
+ ### Vue
162
+ ```bash
163
+ npm install vue-turnstile
164
+ ```
165
+ ```vue
166
+ <template>
167
+ <VueTurnstile site-key="YOUR_SITE_KEY" @success="onSuccess" />
168
+ </template>
169
+ <script setup>
170
+ import VueTurnstile from 'vue-turnstile';
171
+ </script>
172
+ ```
173
+
174
+ ### Svelte
175
+ ```bash
176
+ npm install svelte-turnstile
177
+ ```
178
+ ```svelte
179
+ <script>
180
+ import Turnstile from 'svelte-turnstile';
181
+ </script>
182
+ <Turnstile siteKey="YOUR_SITE_KEY" on:turnstile-callback={handleToken} />
183
+ ```
184
+
185
+ ### Next.js (App Router)
186
+ ```tsx
187
+ // app/components/TurnstileWidget.tsx
188
+ 'use client';
189
+ import { useEffect, useRef } from 'react';
190
+
191
+ export default function TurnstileWidget({ sitekey, onSuccess }) {
192
+ const ref = useRef<HTMLDivElement>(null);
193
+
194
+ useEffect(() => {
195
+ if (ref.current && window.turnstile) {
196
+ const widgetId = window.turnstile.render(ref.current, {
197
+ sitekey,
198
+ callback: onSuccess
199
+ });
200
+ return () => window.turnstile.remove(widgetId);
201
+ }
202
+ }, [sitekey, onSuccess]);
203
+
204
+ return <div ref={ref} />;
205
+ }
206
+ ```
207
+
208
+ ## Cloudflare Pages Plugin
209
+
210
+ ```bash
211
+ npm install @cloudflare/pages-plugin-turnstile
212
+ ```
213
+
214
+ ```typescript
215
+ // functions/_middleware.ts
216
+ import turnstilePlugin from '@cloudflare/pages-plugin-turnstile';
217
+
218
+ export const onRequest = turnstilePlugin({
219
+ secret: 'YOUR_SECRET_KEY',
220
+ onError: () => new Response('CAPTCHA failed', { status: 403 })
221
+ });
222
+ ```
@@ -0,0 +1,218 @@
1
+ # Troubleshooting & Gotchas
2
+
3
+ ## Critical Rules
4
+
5
+ ### ❌ Skipping Server-Side Validation
6
+ **Problem:** Client-only validation is easily bypassed.
7
+
8
+ **Solution:** Always validate on server.
9
+ ```javascript
10
+ // CORRECT - Server validates token
11
+ app.post('/submit', async (req, res) => {
12
+ const token = req.body['cf-turnstile-response'];
13
+ const validation = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
14
+ method: 'POST',
15
+ body: JSON.stringify({ secret: SECRET, response: token })
16
+ }).then(r => r.json());
17
+
18
+ if (!validation.success) return res.status(403).json({ error: 'CAPTCHA failed' });
19
+ });
20
+ ```
21
+
22
+ ### ❌ Exposing Secret Key
23
+ **Problem:** Secret key leaked in client-side code.
24
+
25
+ **Solution:** Server-side validation only. Never send secret to client.
26
+
27
+ ### ❌ Reusing Tokens (Single-Use Rule)
28
+ **Problem:** Tokens are single-use. Revalidation fails with `timeout-or-duplicate`.
29
+
30
+ **Solution:** Generate new token for each submission. Reset widget on error.
31
+ ```javascript
32
+ if (!response.ok) window.turnstile.reset(widgetId);
33
+ ```
34
+
35
+ ### ❌ Not Handling Token Expiry
36
+ **Problem:** Tokens expire after 5 minutes.
37
+
38
+ **Solution:** Handle expiry callback or use auto-refresh.
39
+ ```javascript
40
+ window.turnstile.render('#container', {
41
+ sitekey: 'YOUR_SITE_KEY',
42
+ 'refresh-expired': 'auto', // or 'manual' with expired-callback
43
+ 'expired-callback': () => window.turnstile.reset(widgetId)
44
+ });
45
+ ```
46
+
47
+ ## Common Errors
48
+
49
+ | Error | Cause | Solution |
50
+ |-------|-------|----------|
51
+ | **Widget not rendering** | Incorrect sitekey, CSP blocking, file:// protocol | Check sitekey, add CSP for challenges.cloudflare.com, use http:// |
52
+ | **timeout-or-duplicate** | Token expired (>5min) or reused | Generate fresh token, don't cache >5min |
53
+ | **invalid-input-secret** | Wrong secret key | Verify secret from dashboard, check env vars |
54
+ | **missing-input-response** | Token not sent | Check form field name is 'cf-turnstile-response' |
55
+
56
+ ## Framework Gotchas
57
+
58
+ ### React: Widget Re-mounting
59
+ **Problem:** Widget re-renders on state change, losing token.
60
+
61
+ **Solution:** Control lifecycle with useRef.
62
+ ```tsx
63
+ function TurnstileWidget({ onToken }) {
64
+ const containerRef = useRef(null);
65
+ const widgetIdRef = useRef(null);
66
+
67
+ useEffect(() => {
68
+ if (containerRef.current && !widgetIdRef.current) {
69
+ widgetIdRef.current = window.turnstile.render(containerRef.current, {
70
+ sitekey: 'YOUR_SITE_KEY',
71
+ callback: onToken
72
+ });
73
+ }
74
+ return () => {
75
+ if (widgetIdRef.current) {
76
+ window.turnstile.remove(widgetIdRef.current);
77
+ widgetIdRef.current = null;
78
+ }
79
+ };
80
+ }, []);
81
+
82
+ return <div ref={containerRef} />;
83
+ }
84
+ ```
85
+
86
+ ### React StrictMode: Double Render
87
+ **Problem:** Widget renders twice in dev due to StrictMode.
88
+
89
+ **Solution:** Use cleanup function.
90
+ ```tsx
91
+ useEffect(() => {
92
+ const widgetId = window.turnstile.render('#container', { sitekey });
93
+ return () => window.turnstile.remove(widgetId);
94
+ }, []);
95
+ ```
96
+
97
+ ### Next.js: SSR Hydration
98
+ **Problem:** `window.turnstile` undefined during SSR.
99
+
100
+ **Solution:** Use `'use client'` or dynamic import with `ssr: false`.
101
+ ```tsx
102
+ 'use client';
103
+ export default function Turnstile() { /* component */ }
104
+ ```
105
+
106
+ ### SPA: Navigation Without Cleanup
107
+ **Problem:** Navigating leaves orphaned widgets.
108
+
109
+ **Solution:** Remove widget in cleanup.
110
+ ```javascript
111
+ // Vue
112
+ onBeforeUnmount(() => window.turnstile.remove(widgetId));
113
+
114
+ // React
115
+ useEffect(() => () => window.turnstile.remove(widgetId), []);
116
+ ```
117
+
118
+ ## Network & Security
119
+
120
+ ### CSP Blocking
121
+ **Problem:** Content Security Policy blocks script/iframe.
122
+
123
+ **Solution:** Add CSP directives.
124
+ ```html
125
+ <meta http-equiv="Content-Security-Policy"
126
+ content="script-src 'self' https://challenges.cloudflare.com;
127
+ frame-src https://challenges.cloudflare.com;">
128
+ ```
129
+
130
+ ### IP Address Forwarding
131
+ **Problem:** Server receives proxy IP instead of client IP.
132
+
133
+ **Solution:** Use correct header.
134
+ ```javascript
135
+ // Cloudflare Workers
136
+ const ip = request.headers.get('CF-Connecting-IP');
137
+
138
+ // Behind proxy
139
+ const ip = request.headers.get('X-Forwarded-For')?.split(',')[0];
140
+ ```
141
+
142
+ ### CORS (Siteverify)
143
+ **Problem:** CORS error calling siteverify from browser.
144
+
145
+ **Solution:** Never call siteverify client-side. Call your backend, backend calls siteverify.
146
+
147
+ ## Limits & Constraints
148
+
149
+ | Limit | Value | Impact |
150
+ |-------|-------|--------|
151
+ | Token validity | 5 minutes | Must regenerate after expiry |
152
+ | Token use | Single-use | Cannot revalidate same token |
153
+ | Widget size | 300x65px (normal), 130x120px (compact) | Plan layout |
154
+
155
+ ## Debugging
156
+
157
+ ### Console Logging
158
+ ```javascript
159
+ window.turnstile.render('#container', {
160
+ sitekey: 'YOUR_SITE_KEY',
161
+ callback: (token) => console.log('✓ Token:', token),
162
+ 'error-callback': (code) => console.error('✗ Error:', code),
163
+ 'expired-callback': () => console.warn('⏱ Expired'),
164
+ 'timeout-callback': () => console.warn('⏱ Timeout')
165
+ });
166
+ ```
167
+
168
+ ### Check Token State
169
+ ```javascript
170
+ const token = window.turnstile.getResponse(widgetId);
171
+ console.log('Token:', token || 'NOT READY');
172
+ console.log('Expired:', window.turnstile.isExpired(widgetId));
173
+ ```
174
+
175
+ ### Test Keys (Use First)
176
+ Always develop with test keys before production:
177
+ - Site: `1x00000000000000000000AA`
178
+ - Secret: `1x0000000000000000000000000000000AA`
179
+
180
+ ### Network Tab
181
+ - Verify `api.js` loads (200 OK)
182
+ - Check siteverify request/response
183
+ - Look for 4xx/5xx errors
184
+
185
+ ## Misconfigurations
186
+
187
+ ### Wrong Key Pairing
188
+ **Problem:** Site key from one widget, secret from another.
189
+
190
+ **Solution:** Verify site key and secret are from same widget in dashboard.
191
+
192
+ ### Test Keys in Production
193
+ **Problem:** Using test keys in production.
194
+
195
+ **Solution:** Environment-based keys.
196
+ ```javascript
197
+ const SITE_KEY = process.env.NODE_ENV === 'production'
198
+ ? process.env.TURNSTILE_SITE_KEY
199
+ : '1x00000000000000000000AA';
200
+ ```
201
+
202
+ ### Missing Environment Variables
203
+ **Problem:** Secret undefined on server.
204
+
205
+ **Solution:** Check .env and verify loading.
206
+ ```bash
207
+ # .env
208
+ TURNSTILE_SECRET=your_secret_here
209
+
210
+ # Verify
211
+ console.log('Secret loaded:', !!process.env.TURNSTILE_SECRET);
212
+ ```
213
+
214
+ ## Reference
215
+
216
+ - [Turnstile Docs](https://developers.cloudflare.com/turnstile/)
217
+ - [Dashboard](https://dash.cloudflare.com/?to=/:account/turnstile)
218
+ - [Error Codes](https://developers.cloudflare.com/turnstile/troubleshooting/)