void 0.22.0 → 0.24.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 (301) hide show
  1. package/AGENTS_TEMPLATE.md +1 -1
  2. package/README.md +5 -1
  3. package/dist/{account-cmd-CjyxcGkM.mjs → account-cmd-vJhh5lrb.mjs} +5 -5
  4. package/dist/{scan-ClYmX3sa.mjs → application-analysis-BVsVqc11.mjs} +135 -18
  5. package/dist/application-routing-B7QEjqSR.mjs +27 -0
  6. package/dist/{auth-DLNN0D3Z.mjs → auth-CQkSDS50.mjs} +26 -96
  7. package/dist/auth-DX3JURcX.mjs +2 -0
  8. package/dist/{auth-link-BLO4ptzo.mjs → auth-link-D75t9wO2.mjs} +5 -5
  9. package/dist/{auth-router-ZUg9MF_U.mjs → auth-router-ClfhL1J7.mjs} +7 -7
  10. package/dist/{better-auth-shared-rsBGBvWJ.mjs → better-auth-shared-hy6RPh9W.mjs} +13 -2
  11. package/dist/{build-cmd-BxR5FROK.mjs → build-cmd-zMi1iFnS.mjs} +21 -9
  12. package/dist/{cache-D0sWhgKI.mjs → cache-ZtQmyxVV.mjs} +5 -5
  13. package/dist/{cancel-deploy-D4NUqFbi.mjs → cancel-deploy-Box0kkEV.mjs} +5 -5
  14. package/dist/{cf-access-P0iZnu0q.mjs → cf-access-BGe5sWXF.mjs} +4 -48
  15. package/dist/{cf-access-DRsQRe6k.mjs → cf-access-TWNzXltp.mjs} +3 -11
  16. package/dist/{cf-build-output-BJ6yGEIS.mjs → cf-build-output-BPqOT964.mjs} +2 -1
  17. package/dist/cf-build-output-_0HNWysu.mjs +2 -0
  18. package/dist/cli/cli.mjs +89 -461
  19. package/dist/cli/{cf-compat.mjs → cloudflare-operation-process.mjs} +454 -424
  20. package/dist/cli/env-schema-probe.d.mts +2 -1
  21. package/dist/cli/env-schema-probe.mjs +4 -4
  22. package/dist/client-B9UBI03V.mjs +2 -0
  23. package/dist/{client-BTZ3XkrB.mjs → client-DKAsFA4X.mjs} +161 -24
  24. package/dist/{cloudflare-auth-DQkqoMYa.mjs → cloudflare-auth-Qdc7tw8F.mjs} +41 -38
  25. package/dist/{cloudflare-cmd-BKlfGHAy.mjs → cloudflare-cmd-CmY8dGkd.mjs} +6 -6
  26. package/dist/cloudflare-config-Bktvwtpf.mjs +182 -0
  27. package/dist/{cloudflare-connect-Ctmrw579.mjs → cloudflare-connect-IiR3ZieC.mjs} +4 -4
  28. package/dist/{cloudflare-operations-BT6OWFBk.mjs → cloudflare-operations-BCdXSsmo.mjs} +1 -1
  29. package/dist/{cloudflare-operations-B9tzgjmf.mjs → cloudflare-operations-DzH-A966.mjs} +116 -172
  30. package/dist/{preset-UHj9ARyP.mjs → cloudflare-process-B-wekeR6.mjs} +93 -6
  31. package/dist/{config-VavjpDnp.d.mts → config-BMHb8RCj.d.mts} +1 -0
  32. package/dist/config-C_XRIPx2.mjs +89 -0
  33. package/dist/config-entry.d.mts +1 -1
  34. package/dist/{connect-Dg-WkW-C.mjs → connect-B-usTnlF.mjs} +9 -9
  35. package/dist/{create-project-l9J7pbtm.mjs → create-project-CYOOAYcn.mjs} +12 -12
  36. package/dist/{create-project-DdoqwFLF.mjs → create-project-FWbf5Olo.mjs} +1 -1
  37. package/dist/{db-gp2sCXyN.mjs → db-Ck2eZ2iB.mjs} +26 -26
  38. package/dist/{delete-TTedbH6B.mjs → delete-sK56qtzZ.mjs} +5 -5
  39. package/dist/{deploy-CH-o2CaZ.mjs → deploy-gCVaiJbS.mjs} +984 -616
  40. package/dist/{deploy-B19L2Bra.mjs → deploy-irP5q0-x.mjs} +1 -1
  41. package/dist/{domain-JRF59P_r.mjs → domain-DFfQE8jg.mjs} +6 -6
  42. package/dist/{email-Bo6G9LOZ.mjs → email-CdnhUHvJ.mjs} +15 -30
  43. package/dist/{env-BYOrWQnv.mjs → env-DmGdHi5i.mjs} +8 -8
  44. package/dist/{env-public-BxU_0yTL.d.mts → env-public-BX_r8HR6.d.mts} +1 -1
  45. package/dist/{env-types-C2_bIk_b.mjs → env-types-D5kds_OZ.mjs} +1 -1
  46. package/dist/{env-validation-BB4GkLxn.mjs → env-validation-C_8tPdhs.mjs} +20 -73
  47. package/dist/{env-validation-BXge7uyK.mjs → env-validation-zZOCcQVZ.mjs} +1 -1
  48. package/dist/{fetch-CXDChK7B.mjs → fetch-BIZJh7vR.mjs} +2 -2
  49. package/dist/{fetch-stream-AOByI7Ki.mjs → fetch-stream-IvCYKyQL.mjs} +24 -4
  50. package/dist/{gen-sCtlCOdA.mjs → gen-CshAkukR.mjs} +4 -4
  51. package/dist/gen-DvQTWzDU.mjs +2 -0
  52. package/dist/{github-cmd-0-7PexDq.mjs → github-cmd-DftuEvIt.mjs} +13 -13
  53. package/dist/{handler-HEcZsaij.d.mts → handler-CZ4nAylQ.d.mts} +1 -1
  54. package/dist/{headers-DWi2IXWx.mjs → headers-2rKda9Y6.mjs} +1 -1
  55. package/dist/{help-GKtwl07I.mjs → help-Dotbf6iz.mjs} +236 -750
  56. package/dist/help-mabuIV98.mjs +2 -0
  57. package/dist/{inbound-aVHEUhKo.mjs → inbound-fRkqcXaC.mjs} +1 -1
  58. package/dist/index.d.mts +1 -1
  59. package/dist/index.mjs +299 -1517
  60. package/dist/info-B97bTX9N.mjs +113 -0
  61. package/dist/{init-FZx3Elvz.mjs → init-BTQEZZGJ.mjs} +61 -27
  62. package/dist/limits-Bq5LG8Id.d.mts +27 -0
  63. package/dist/limits-Cjuk2VPm.mjs +68 -0
  64. package/dist/{link-BrQfb_CU.mjs → link-B46sYH0K.mjs} +6 -6
  65. package/dist/{list-D44jmIAM.mjs → list-BnPrIsU_.mjs} +6 -6
  66. package/dist/{live-CKJlvlNp.d.mts → live-Chw1eIMv.d.mts} +1 -1
  67. package/dist/{local-d1-Bg9OzEEO.mjs → local-d1-2CMnpuW_.mjs} +2 -2
  68. package/dist/log-vqY3pqwI.mjs +29 -0
  69. package/dist/{login-CAsAsQ-_.mjs → login-BuiMyUrx.mjs} +8 -8
  70. package/dist/login-DIy9Sb-U.mjs +2 -0
  71. package/dist/{logs-BjKvFnVM.mjs → logs-CZG9d-ic.mjs} +10 -11
  72. package/dist/migrate-BCiJ8w0f.mjs +2 -0
  73. package/dist/{migrate-BPITvDJN.mjs → migrate-q4_njtaW.mjs} +4 -3
  74. package/dist/{node-Dt7z256D.mjs → node-BkyRWRx8.mjs} +1 -1
  75. package/dist/operator-args-B3BTmSoi.mjs +697 -0
  76. package/dist/{operator-auth-8KnOVXVd.mjs → operator-auth-7erYc6Lt.mjs} +2 -2
  77. package/dist/{operator-client-DUwumHpQ.mjs → operator-client-CpHjTd0t.mjs} +3 -3
  78. package/dist/{operator-cmd-BK5CCiT9.mjs → operator-cmd-DGqPJUD3.mjs} +70 -24
  79. package/dist/{output-Dm_A4Tbv.mjs → output-CbM85T4k.mjs} +18 -10
  80. package/dist/pages/client.d.mts +34 -2
  81. package/dist/pages/client.mjs +59 -3
  82. package/dist/pages/index.d.mts +1 -1
  83. package/dist/pages/index.mjs +2 -2
  84. package/dist/pages/islands-plugin.mjs +1 -1
  85. package/dist/pages/protocol.d.mts +2 -2
  86. package/dist/pages/protocol.mjs +2 -308
  87. package/dist/{parse-filename-DioPHiR9.mjs → parse-filename-CUbj-1MP.mjs} +35 -1
  88. package/dist/plan-D1Q5rf-r.mjs +2 -0
  89. package/dist/plan-NPpwZ_kc.mjs +58 -0
  90. package/dist/platform-args-3k8X9-H_.mjs +514 -0
  91. package/dist/platform-args-DdnM6WIf.mjs +2 -0
  92. package/dist/{platform-auth-config-BlN8xTdD.mjs → platform-auth-config-DDrxUy4m.mjs} +6 -6
  93. package/dist/{platform-auth-protection-7d5aV2Jg.mjs → platform-auth-protection-BLadnnct.mjs} +8 -8
  94. package/dist/{platform-auth-recovery-Dxij8ZbR.mjs → platform-auth-recovery-CmCzX2Fl.mjs} +6 -6
  95. package/dist/{platform-cmd-B3hwKrFK.mjs → platform-cmd-DMDEc9uS.mjs} +29 -8
  96. package/dist/{platform-cmd-E0FuL212.mjs → platform-cmd-pMTRhvYs.mjs} +1 -1
  97. package/dist/{platform-domain-D6Xcy9ZX.mjs → platform-domain-Di6EYrQl.mjs} +5 -5
  98. package/dist/{platform-lifecycle-k0E0xoxx.mjs → platform-lifecycle-BBoNzojY.mjs} +1541 -572
  99. package/dist/{platform-lifecycle-DMh_qrry.mjs → platform-lifecycle-BFdSi9Qt.mjs} +1 -1
  100. package/dist/{platform-management-Brz_BDiT.mjs → platform-management-CWOQOWXm.mjs} +10 -7
  101. package/dist/{platform-management-DOtss0BN.mjs → platform-management-DG47jys8.mjs} +1 -1
  102. package/dist/platform-plans-config-Vl9BP3H4.mjs +359 -0
  103. package/dist/{platform-recovery-BvtcXON5.mjs → platform-recovery-BJnQJEtQ.mjs} +4 -4
  104. package/dist/{platform-registry-QBa4DK32.mjs → platform-registry-DkPPXfp_.mjs} +2 -2
  105. package/dist/{plugin-inference-BMfKRSqE.mjs → plugin-inference-CXWnn79A.mjs} +174 -64
  106. package/dist/{prepare-C-6YZyyg.mjs → prepare-CBLT3CHH.mjs} +3 -3
  107. package/dist/prepare-CnjcTV2s.mjs +2 -0
  108. package/dist/{prepare-CRhJbVrG.mjs → prepare-DnaKBi--.mjs} +5 -21
  109. package/dist/{project-C0Fqu05O.mjs → project-DKG5Ra8p.mjs} +15 -82
  110. package/dist/project-DsblYifa.mjs +2 -0
  111. package/dist/{project-cmd-BZLCqOqw.mjs → project-cmd-DxnXstAq.mjs} +19 -19
  112. package/dist/{project-team-BvgM0WoX.mjs → project-team-BmHcaALJ.mjs} +5 -5
  113. package/dist/{project-token-l5DqK6Az.mjs → project-token-GionZlBI.mjs} +5 -5
  114. package/dist/{project-zero-trust-v6Mvpp8y.mjs → project-zero-trust-JLCjVQA7.mjs} +5 -5
  115. package/dist/prompts-2TGE6oXx.mjs +2 -0
  116. package/dist/prompts-BNUoTiaf.mjs +2044 -0
  117. package/dist/{protocol-BBa6cstI.d.mts → protocol-CjF_iI9X.d.mts} +2 -2
  118. package/dist/protocol-U7bfjHmA.mjs +331 -0
  119. package/dist/{provision-Fr9pRqce.mjs → provision-CVku1JFU.mjs} +1 -1
  120. package/dist/{provision-C4IGqkBf.mjs → provision-CaoxO_U7.mjs} +90 -199
  121. package/dist/{requests-DN-BbNiM.mjs → requests-BOjIVAeF.mjs} +5 -5
  122. package/dist/resource-name-C7LVpcRm.mjs +11 -0
  123. package/dist/{rollback-D7rzSaZM.mjs → rollback-CwR3pLj3.mjs} +6 -6
  124. package/dist/route-url-CG7U-cRN.mjs +15 -0
  125. package/dist/{runner-B8wXwWlo.mjs → runner-CXA9Fh8h.mjs} +1 -1
  126. package/dist/{runner-p-dMs2UN.mjs → runner-Ol0TNjk6.mjs} +2 -2
  127. package/dist/runtime/ai.d.mts +12 -8
  128. package/dist/runtime/ai.mjs +87 -22
  129. package/dist/runtime/better-auth-mysql.mjs +1 -1
  130. package/dist/runtime/better-auth-pg.mjs +1 -1
  131. package/dist/runtime/better-auth.mjs +1 -1
  132. package/dist/runtime/client-react.mjs +2 -2
  133. package/dist/runtime/client-solid.mjs +2 -2
  134. package/dist/runtime/client-svelte.mjs +2 -2
  135. package/dist/runtime/client-vue.mjs +2 -2
  136. package/dist/runtime/client.mjs +2 -2
  137. package/dist/runtime/durable.d.mts +3 -1
  138. package/dist/runtime/durable.mjs +4 -1
  139. package/dist/runtime/email/testing.mjs +2 -2
  140. package/dist/runtime/email.mjs +1 -1
  141. package/dist/runtime/env-public.d.mts +1 -1
  142. package/dist/runtime/fetch-stream.mjs +1 -1
  143. package/dist/runtime/fetch.mjs +1 -1
  144. package/dist/runtime/handler.d.mts +1 -1
  145. package/dist/runtime/kv.mjs +0 -1
  146. package/dist/runtime/limits.d.mts +2 -0
  147. package/dist/runtime/limits.mjs +2 -0
  148. package/dist/runtime/live-client.d.mts +1 -1
  149. package/dist/runtime/live-server.mjs +25 -16
  150. package/dist/runtime/live.d.mts +1 -1
  151. package/dist/runtime/migration-handler.mjs +62 -42
  152. package/dist/runtime/remote/index.mjs +2 -2
  153. package/dist/runtime/route-url.d.mts +4 -0
  154. package/dist/runtime/route-url.mjs +2 -0
  155. package/dist/runtime/routing.d.mts +180 -0
  156. package/dist/runtime/routing.mjs +1082 -0
  157. package/dist/runtime/sandbox-container.d.mts +1 -1
  158. package/dist/runtime/sandbox-container.mjs +1 -1
  159. package/dist/runtime/sandbox.d.mts +3 -3
  160. package/dist/runtime/sandbox.mjs +75 -45
  161. package/dist/runtime/sse.mjs +1 -1
  162. package/dist/runtime/validator.d.mts +1 -1
  163. package/dist/runtime/ws-server.d.mts +4 -2
  164. package/dist/runtime/ws-server.mjs +27 -2
  165. package/dist/runtime/ws.d.mts +2 -2
  166. package/dist/runtime/ws.mjs +8 -6
  167. package/dist/{sandbox-qpNBT8a3.d.mts → sandbox-XZAqzFlG.d.mts} +11 -8
  168. package/dist/{sandbox-container-DdNEBfCc.d.mts → sandbox-container-Bo0eiFKz.d.mts} +2 -1
  169. package/dist/{sandbox-container-4fdqLnyb.mjs → sandbox-container-C6ItmVuN.mjs} +4 -2
  170. package/dist/{scan-4tfN-PSn.mjs → scan-C7okrLyM.mjs} +4 -35
  171. package/dist/{secret-BOtOl_cb.mjs → secret-ByWJWBUG.mjs} +7 -7
  172. package/dist/{skills-D1II1Juz.mjs → skills-C1PlclPt.mjs} +1 -1
  173. package/dist/{sse-BaC1jXko.mjs → sse-CQNaDFFV.mjs} +6 -3
  174. package/dist/{subcommand-prompt-CY1C4fvl.mjs → subcommand-prompt-klFCfcor.mjs} +40 -32
  175. package/dist/validate-Dq_L3s0S.mjs +2 -0
  176. package/dist/{validate-CIUwFpjB.mjs → validate-ctOrgiS3.mjs} +2 -1
  177. package/dist/{wrangler-DQF1vKyf.mjs → wrangler-7K-bW_DL.mjs} +8 -239
  178. package/dist/{ws-BoY7vQML.d.mts → ws-CL1w7GXU.d.mts} +13 -2
  179. package/package.json +16 -10
  180. package/skills/migrate-vite-cloudflare-to-void/SKILL.md +34 -157
  181. package/skills/void/SKILL.md +55 -135
  182. package/skills/void/docs/guide/ai.md +94 -84
  183. package/skills/void/docs/guide/app-types.md +3 -32
  184. package/skills/void/docs/guide/auth.md +12 -116
  185. package/skills/void/docs/guide/database/d1.md +9 -54
  186. package/skills/void/docs/guide/database/mysql.md +1 -1
  187. package/skills/void/docs/guide/database/postgresql.md +5 -26
  188. package/skills/void/docs/guide/database.md +23 -75
  189. package/skills/void/docs/guide/deployment.md +48 -112
  190. package/skills/void/docs/guide/durable-state.md +43 -18
  191. package/skills/void/docs/guide/edge/headers.md +4 -48
  192. package/skills/void/docs/guide/edge/prerendering.md +5 -20
  193. package/skills/void/docs/guide/edge/redirects.md +11 -64
  194. package/skills/void/docs/guide/edge/revalidation.md +5 -18
  195. package/skills/void/docs/guide/edge/rewrites.md +56 -284
  196. package/skills/void/docs/guide/edge/static-assets.md +22 -72
  197. package/skills/void/docs/guide/email/domains.md +116 -0
  198. package/skills/void/docs/guide/email/receiving.md +139 -0
  199. package/skills/void/docs/guide/email/sending.md +231 -0
  200. package/skills/void/docs/guide/email.md +13 -619
  201. package/skills/void/docs/guide/env-migration.md +11 -11
  202. package/skills/void/docs/guide/env-vars.md +9 -29
  203. package/skills/void/docs/guide/index.md +0 -15
  204. package/skills/void/docs/guide/jobs.md +3 -18
  205. package/skills/void/docs/guide/kv.md +5 -11
  206. package/skills/void/docs/guide/live.md +5 -56
  207. package/skills/void/docs/guide/pages-routing/actions-and-forms.md +78 -125
  208. package/skills/void/docs/guide/pages-routing/head.md +10 -10
  209. package/skills/void/docs/guide/pages-routing/islands.md +6 -36
  210. package/skills/void/docs/guide/pages-routing/layouts.md +6 -128
  211. package/skills/void/docs/guide/pages-routing/loaders.md +3 -19
  212. package/skills/void/docs/guide/pages-routing/markdown.md +13 -171
  213. package/skills/void/docs/guide/pages-routing/overview.md +7 -17
  214. package/skills/void/docs/guide/pages-routing/view-transitions.md +1 -1
  215. package/skills/void/docs/guide/platform/administration/access.md +1 -4
  216. package/skills/void/docs/guide/platform/administration/email.md +35 -8
  217. package/skills/void/docs/guide/platform/administration/operations.md +26 -4
  218. package/skills/void/docs/guide/platform/administration/plans.md +126 -0
  219. package/skills/void/docs/guide/platform/administration/projects.md +5 -2
  220. package/skills/void/docs/guide/platform/administration/zero-trust.md +49 -160
  221. package/skills/void/docs/guide/platform/development/runtime.md +3 -13
  222. package/skills/void/docs/guide/platform/development/schema-ci.md +0 -58
  223. package/skills/void/docs/guide/platform/installation/ci.md +1 -1
  224. package/skills/void/docs/guide/platform/installation/credentials.md +15 -6
  225. package/skills/void/docs/guide/platform/installation/domains.md +35 -2
  226. package/skills/void/docs/guide/platform/installation/first-deployment.md +4 -2
  227. package/skills/void/docs/guide/platform/installation/maintenance.md +15 -1
  228. package/skills/void/docs/guide/platform/installation/prerequisites.md +24 -18
  229. package/skills/void/docs/guide/platform/installation/setup.md +88 -14
  230. package/skills/void/docs/guide/platform-administration.md +1 -0
  231. package/skills/void/docs/guide/queues.md +7 -9
  232. package/skills/void/docs/guide/quickstart.md +38 -37
  233. package/skills/void/docs/guide/remote-dev.md +5 -10
  234. package/skills/void/docs/guide/sandboxes.md +29 -21
  235. package/skills/void/docs/guide/server-routing.md +9 -72
  236. package/skills/void/docs/guide/sse.md +4 -18
  237. package/skills/void/docs/guide/ssg.md +3 -15
  238. package/skills/void/docs/guide/ssr.md +14 -62
  239. package/skills/void/docs/guide/storage.md +9 -4
  240. package/skills/void/docs/guide/type-safety.md +3 -14
  241. package/skills/void/docs/guide/typed-fetch.md +3 -7
  242. package/skills/void/docs/guide/websockets.md +68 -40
  243. package/skills/void/docs/integrations/agents.md +3 -3
  244. package/skills/void/docs/integrations/cloudflare.md +85 -316
  245. package/skills/void/docs/integrations/frameworks/analog.md +5 -64
  246. package/skills/void/docs/integrations/frameworks/astro.md +4 -73
  247. package/skills/void/docs/integrations/frameworks/nuxt.md +5 -62
  248. package/skills/void/docs/integrations/frameworks/overview.md +11 -54
  249. package/skills/void/docs/integrations/frameworks/react-router.md +5 -60
  250. package/skills/void/docs/integrations/frameworks/sveltekit.md +6 -65
  251. package/skills/void/docs/integrations/frameworks/tanstack-start.md +4 -62
  252. package/skills/void/docs/integrations/nodejs-bun-deno.md +5 -69
  253. package/skills/void/docs/reference/api/auth.md +156 -0
  254. package/skills/void/docs/reference/api/client.md +87 -0
  255. package/skills/void/docs/reference/api/database.md +95 -0
  256. package/skills/void/docs/reference/api/durable.md +46 -0
  257. package/skills/void/docs/reference/api/env.md +50 -0
  258. package/skills/void/docs/reference/api/handlers.md +254 -0
  259. package/skills/void/docs/reference/api/pages.md +241 -0
  260. package/skills/void/docs/reference/api/plugin.md +39 -0
  261. package/skills/void/docs/reference/api/resources.md +109 -0
  262. package/skills/void/docs/reference/api/rewrites.md +76 -0
  263. package/skills/void/docs/reference/api/types.md +92 -0
  264. package/skills/void/docs/reference/api.md +56 -1218
  265. package/skills/void/docs/reference/cli/auth.md +89 -0
  266. package/skills/void/docs/reference/cli/database.md +128 -0
  267. package/skills/void/docs/reference/cli/deploy.md +105 -0
  268. package/skills/void/docs/reference/cli/domains.md +41 -0
  269. package/skills/void/docs/reference/cli/email.md +129 -0
  270. package/skills/void/docs/reference/cli/generate.md +116 -0
  271. package/skills/void/docs/reference/cli/github.md +189 -0
  272. package/skills/void/docs/reference/cli/platform-config.md +92 -0
  273. package/skills/void/docs/reference/cli/platform-email.md +81 -0
  274. package/skills/void/docs/reference/cli/platform-installation.md +142 -0
  275. package/skills/void/docs/reference/cli/platform-operations.md +90 -0
  276. package/skills/void/docs/reference/cli/platform-users.md +89 -0
  277. package/skills/void/docs/reference/cli/platform-zero-trust.md +59 -0
  278. package/skills/void/docs/reference/cli/platform.md +70 -0
  279. package/skills/void/docs/reference/cli/project.md +214 -0
  280. package/skills/void/docs/reference/cli/secrets.md +76 -0
  281. package/skills/void/docs/reference/cli/setup.md +70 -0
  282. package/skills/void/docs/reference/cli.md +32 -1682
  283. package/skills/void/docs/reference/config.md +12 -18
  284. package/skills/void/docs/reference/resource-inference.md +3 -58
  285. package/skills/void/docs/reference/structure.md +14 -41
  286. package/dist/auth-CZuiVsFh.mjs +0 -2
  287. package/dist/canonical-json-DuDiiUsQ.mjs +0 -13
  288. package/dist/client-Czz8o5jP.mjs +0 -2
  289. package/dist/dist-BuDuKZJv.mjs +0 -2
  290. package/dist/dist-CTBk70IR.mjs +0 -1310
  291. package/dist/gen-CNJ62MM7.mjs +0 -2
  292. package/dist/help-CmZzxUba.mjs +0 -2
  293. package/dist/log-ChfPKsVd.mjs +0 -26
  294. package/dist/login-CGcRKEoi.mjs +0 -2
  295. package/dist/migrate-CYfbKkXh.mjs +0 -2
  296. package/dist/plan-BEZ8VJW0.mjs +0 -256
  297. package/dist/plan-DpuOr14e.mjs +0 -2
  298. package/dist/prepare-Bm3iq-u4.mjs +0 -2
  299. package/dist/project-BuUwfj6f.mjs +0 -2
  300. package/dist/validate-EKmJWxmy.mjs +0 -2
  301. /package/dist/cli/{cf-compat.d.mts → cloudflare-operation-process.d.mts} +0 -0
@@ -8,15 +8,20 @@ Keep one password-manager entry for this platform. Paste the saved values into t
8
8
 
9
9
  ## Cloudflare API Tokens {#runtime-token-permissions}
10
10
 
11
- For a domain installation, create two custom tokens using Cloudflare's [API token setup](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/). Name them **Void Platform Management** and **Void Platform Runtime**. Scope them to your selected account and application zone.
11
+ For a domain installation or Cloudflare Access setup, the installer guides you through creating separate management and runtime tokens using Cloudflare's [API token setup](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/). Its links preselect the permissions and suggest names based on your platform's display name. Scope the tokens to your selected account and, when using a domain, its zone, save them in your password manager, and paste them into the masked CLI prompts.
12
12
 
13
- For workers.dev testing with the default API hostname, browser login can authorize installation: you only need to create the runtime token and R2 credentials below. Skip the zone permissions until you add a domain.
13
+ For workers.dev testing with the default API hostname, browser login can authorize
14
+ infrastructure setup. Void also checks account-wide Access requirements; if the
15
+ current credential cannot read them, the installer asks for a scoped Access token.
16
+ Protected apps and public apps under Default-Deny need an ongoing app-management
17
+ token, stored encrypted. Access setup requires a management token even on
18
+ workers.dev. Skip zone permissions until you add a domain.
14
19
 
15
- Browser login does not grant AI Gateway access. A preview can therefore show **inspect ai-gateway**: Void verifies that resource with the runtime token after you confirm installation, before creating any resources. Include **Account → AI Gateway → Edit** on that token. Other infrastructure continues using your browser login, and a normal API-token installation keeps using its management token when that token already has access.
20
+ Browser login does not grant AI Gateway access. Include **Account → AI Gateway → Edit** on the runtime token so Void can verify and create that resource.
16
21
 
17
22
  The management token lets your CLI install and maintain the platform. The runtime token is stored as a Worker secret so the platform can deploy apps after you close your terminal. They are separate credentials.
18
23
 
19
- The runtime-token link preselects all required account permissions, including Workers Tail, Hyperdrive, and AI Gateway when needed. Review them against the short summary beside the link before creating the token. If the form differs, use that summary to correct it. For a domain installation, also select the indicated zone. See [Cloudflare's token template documentation](https://developers.cloudflare.com/fundamentals/api/how-to/account-owned-token-template/).
24
+ Compare each token's form with the permission checklist below, and select the indicated account and zone for a domain installation. The installer saves a management token entered at the prompt in this installation’s encrypted local checkpoint and reuses it on resume. Upgrades, repairs, and other lifecycle maintenance also use that saved management token. During installation, a rejected token can be replaced at the prompt. An explicit `CLOUDFLARE_API_TOKEN` or `CF_API_TOKEN` takes precedence. Keep your password-manager copy for maintenance or another machine; scripts supply it through `CLOUDFLARE_API_TOKEN`.
20
25
 
21
26
  ::: details Permissions to select for each token
22
27
 
@@ -39,6 +44,8 @@ Use the following permissions for the core platform. Cloudflare may label write
39
44
  | Zone | Workers Routes | Edit | — |
40
45
  | Zone | Cache Purge | — | Purge |
41
46
 
47
+ When Void configures Access in the installation account, the initial management-token link also selects **Account → Access: Apps and Policies → Edit** and **Account → Access: Organizations, Identity Providers, and Groups → Read**. Protection adds **Account → Access: Service Tokens → Edit**. When the authentication configuration or saved setup selects existing applications, the link requests Read access instead of Edit. These permissions belong to the management token; the runtime token does not need them.
48
+
42
49
  The management token also needs **Zone Edit** with authority to create zones if you ask Void to create the zone. If it already exists, use the selected zone with Zone Read and DNS Edit. Nested application domains additionally need **SSL and Certificates: Read** on the management token. A custom runtime that enables custom project domains needs **SSL and Certificates: Edit** on the runtime token; the core runtime does not enable that feature.
43
50
 
44
51
  Void checks access before provisioning. If it reports a missing permission, update the token's permissions for the selected account or zone and retry.
@@ -57,13 +64,15 @@ void platform upgrade your-installation-id
57
64
 
58
65
  Set the same two variables before `void platform install` to enable email during a new installation. Void records the pair for later upgrades; an ordinary upgrade cannot replace it.
59
66
 
67
+ Before installing, enable [Cloudflare Email Routing](https://developers.cloudflare.com/email-service/get-started/route-emails/) for the exact shared sender domain and confirm that its MX records point to Cloudflare. For a subdomain, add that name under the zone's **Email Routing → Settings → Subdomains**. Cloudflare adds the required MX and SPF records. The installer's shared-mail bootstrap verifies those records; it does not add them. Keep existing mail-provider records on other domain names in place.
68
+
60
69
  Enabling email lets administrators [register email domains for projects](/guide/platform/administration/email#registering-email-domains-for-projects) and lets projects register destination addresses through the runtime token. That needs **Email Routing Addresses: Edit** and **Email Sending: Edit** on the account, plus **Zone: Read**, **Zone Settings: Edit** and **Email Routing Rules: Edit** on the zones that will carry mail. The runtime-token link preselects them when email is enabled. Email Sending onboarding for arbitrary recipients needs Workers Paid.
61
70
 
62
- The installer deploys the email gateway, prepares the shared mail route, and verifies inbound readiness before opening platform traffic. If setup fails, correct the reported permission, mail-zone configuration, or routing conflict, then rerun the same install or upgrade command. A fresh install resumes with `void platform install --resume --name <installation-id>`.
71
+ The installer deploys the email gateway, prepares the shared mail route, and verifies inbound readiness before opening platform traffic. If setup fails, correct the reported permission, exact-domain MX records, or routing conflict, then rerun the same install or upgrade command. A fresh install resumes with `void platform install --resume --name <installation-id>`; it continues the recorded email operation after the configuration is corrected.
63
72
 
64
73
  ## R2 Upload Credentials
65
74
 
66
- The installer opens the **R2 token creation** form directly, requesting an account token (or a user token if your role cannot create account tokens). Select **Object Read & Write**—the form starts with read-only access—and keep **Apply to all buckets in this account (including newly created buckets)** selected. This lets the token access the buckets Void creates afterward. Create the token and save its **Access Key ID** and **Secret Access Key**. These are different from the management/runtime tokens above. See [R2's token instructions](https://developers.cloudflare.com/r2/api/tokens/).
75
+ In the **R2 token creation** form opened by the installer, select **Object Read & Write** and **Apply to all buckets in this account (including newly created buckets)**. Create an account token, or a user token if your role requires it. Save its **Access Key ID** and **Secret Access Key** in your password manager. These differ from the management and runtime API tokens. See [R2’s token instructions](https://developers.cloudflare.com/r2/api/tokens/).
67
76
 
68
77
  ## Signing and Encryption Keys {#signing-and-encryption-keys}
69
78
 
@@ -19,13 +19,15 @@ If nameservers, certificates, or project Zero Trust protection are pending, foll
19
19
 
20
20
  Use `--installation <id>` to select an installation explicitly, `--zone example.com` for an app domain such as `apps.example.com`, or `--dedicated-zone` for catch-all routing on a dedicated zone. Nested domains still need the wildcard certificate described below. This command adds the first domain; replacing an existing application domain is not currently supported. It uses the installed runtime and does not require `--runtime` or an app redeploy.
21
21
 
22
+ Choose an application domain whose wildcard leaves existing Worker Custom Domains reachable. Existing more-specific routes covering all requests can preserve those hostnames. If Void reports a conflict, choose another application domain; for a new installation, you can start with `void platform install --workers-dev` and add a suitable domain later.
23
+
22
24
  Browser login sessions are specific to each origin. Apps using their own OAuth providers may need to register their new callback URLs. Void's built-in auth uses the request origin automatically unless the app overrides that configuration.
23
25
 
24
26
  ### What Changes in Testing Mode?
25
27
 
26
- Each deployed app gets a small forwarding Worker and its own `workers.dev` origin. It forwards requests, including WebSockets and SSE, through the same platform router. Names include installation and project IDs; a later project with the same slug cannot inherit a deleted project's test URL.
28
+ In testing mode, each app gets a `workers.dev` URL. These URLs continue working after you add a domain; new apps then use the domain.
27
29
 
28
- Testing origins use shared ISR storage but bypass the extra edge response cache because you cannot use your zone's purge API for `workers.dev`. Custom-domain requests use the normal edge cache after activation. Existing test URLs and forwarding Workers are retained when you add a domain; new apps then use the domain without creating more forwarding Workers. Like other platform Workers, forwarders are retained for manual cleanup on uninstall; platform disablement and project suspension still apply to their traffic.
30
+ Testing URLs support WebSockets, SSE, and shared ISR storage, but skip the extra edge response cache. Their forwarding Workers remain for manual cleanup after uninstall. Platform disablement and project suspension still block their traffic.
29
31
 
30
32
  ## Other Domain Options
31
33
 
@@ -49,6 +51,37 @@ The management token needs **SSL and Certificates: Read** (or Edit) on that zone
49
51
 
50
52
  :::
51
53
 
54
+ ## Optional Dashboard
55
+
56
+ The API's `/admin/` pages are included in the core installation. You can deploy
57
+ the optional user dashboard separately and configure its HTTPS origin during
58
+ installation with `--dashboard-url https://dash.example.com`.
59
+
60
+ For an existing installation, preview and apply the configuration with:
61
+
62
+ ```sh
63
+ void platform repair <installation-id> --dashboard-url https://dash.example.com --plan
64
+ void platform repair <installation-id> --dashboard-url https://dash.example.com --yes
65
+ ```
66
+
67
+ The origin must contain no credentials, path, query, or fragment. Void saves it
68
+ for login callbacks and keeps it across upgrades and repairs. The command does
69
+ not create a dashboard Worker or DNS records. Follow the source app’s
70
+ [standalone dashboard preparation](https://github.com/voidzero-dev/void/tree/main/platform/packages/dashboard#standalone-deployment)
71
+ to deploy your own copy with an unused Worker name, your dashboard hostname,
72
+ and the installed API Worker’s service binding. Set its `API_URL` to the public
73
+ API origin, `DASHBOARD_URL` to the dashboard origin, and `SITE_DOMAIN` to the
74
+ installation’s application domain. Omit the option to keep the saved origin.
75
+ The dashboard provides sign-in, linked login methods, and sign-out; use the CLI
76
+ for user project and team management.
77
+
78
+ If Access protects the platform, its application must cover this dashboard
79
+ origin too. Configure the origin when installing protection. To change it on an
80
+ already protected platform, deliberately remove protection through authentication
81
+ configuration, apply the origin, then enable protection again. Choose a separate
82
+ admission rule first if signup depends on the Access gate. Maintenance stops if
83
+ the configured origin is outside the active coverage.
84
+
52
85
  ## Cloudflare footprint
53
86
 
54
87
  New platform resources use deterministic `void-<installation-name>-<role>` names where Cloudflare allows them, such as `void-team-api`. Choose an unused installation name in the account; Void stops on an unowned name conflict instead of replacing that resource. Existing installations keep their recorded names, including older names with suffixes.
@@ -21,6 +21,8 @@ void deploy --platform void --project my-first-app
21
21
 
22
22
  `void connect` validates the platform and signs you in when needed. Confirm project creation when deploy asks. To use a project that already exists, run `void project link` instead. An app already linked to another platform keeps its existing destination; use a fresh app directory for your first test.
23
23
 
24
+ Once accepted by the platform, a deployment continues independently of the CLI connection. The CLI reconnects automatically after a connection failure. Use `void project status` to inspect a deployment after closing the CLI, or `void project cancel` to request cancellation.
25
+
24
26
  The CLI stores login credentials in your system keychain, separately for each platform URL. With no URL, `void connect` offers Cloudflare or a Void platform; `void connect --platform void` offers saved platforms and an option to enter another URL.
25
27
 
26
28
  For CI, create a bounded, project-scoped deploy credential while signed in as
@@ -31,8 +33,8 @@ void project token create --name ci --expires-in 30
31
33
  ```
32
34
 
33
35
  Store the printed `VOID_TOKEN` and `VOID_API_URL` in the CI secret manager, then
34
- use `void connect <url> --no-login` in a fresh checkout if connection metadata
35
- is not committed. Rotate with `void project token renew <id>` and revoke with
36
+ run `void connect "$VOID_API_URL" --no-login` before deploying in each fresh CI
37
+ environment. Project files do not replace this connection step. Rotate with `void project token renew <id>` and revoke with
36
38
  `void project token revoke <id>`. A human login token is not a CI credential.
37
39
 
38
40
  If Cloudflare Access protects the platform, Access proof and the project
@@ -28,6 +28,13 @@ existing gate, verify that its service policy admits the installation token and
28
28
  that the application covers the printed API and proxy origins. A Cloudflare
29
29
  management API token does not authenticate an Access-protected HTTP request.
30
30
 
31
+ For automatic setup, resuming also creates or verifies an Access exception
32
+ limited to `/health` on the reserved dispatch health hostname. Void still requires
33
+ its private probe token on that endpoint; requests without it cannot reach an
34
+ application. This lets installation check routing while employee protection and
35
+ account-wide Default-Deny remain enabled. It does not bypass Access for an entire
36
+ Worker or for deployed apps.
37
+
31
38
  For externally supplied credentials, set `VOID_ACCESS_CREDENTIALS` from your
32
39
  secret manager to an object keyed by each exact API/proxy origin, with
33
40
  `CF_ACCESS_CLIENT_ID` and `CF_ACCESS_CLIENT_SECRET` in each entry. Then rerun
@@ -35,6 +42,11 @@ secret manager to an object keyed by each exact API/proxy origin, with
35
42
  and stops if the gate still rejects its checks. Account-wide Default-Deny and
36
43
  deployed-application policies remain your responsibility.
37
44
 
45
+ If **System Status** reports `proxy HTTP 302 (redirect)` on an older Access-protected
46
+ installation, upgrade with `void platform upgrade <id>`. Current installations use
47
+ a private connection for the dashboard's proxy health check. Keep the proxy's
48
+ Access protection enabled.
49
+
38
50
  ### Expired administrator setup code
39
51
 
40
52
  Resume an unfinished installation with `void platform install --resume --name <id>`.
@@ -56,6 +68,8 @@ Repair recreates missing infrastructure that the installer owns. It does not res
56
68
 
57
69
  ### Upgrade the platform
58
70
 
71
+ Keep the platform runtime current when updating the Void CLI. If a developer's CLI reports that project lookup requires an upgrade, upgrade the platform before retrying.
72
+
59
73
  Use the installed CLI's packaged runtime to upgrade:
60
74
 
61
75
  ```sh
@@ -80,7 +94,7 @@ Database migrations only move forward. Void checks compatibility before upgradin
80
94
 
81
95
  Upgrades automatically enable managed Sandboxes. The platform runtime token needs Account / Containers: Edit and Account / Cloudchamber: Edit, and the Cloudflare account must use Workers Paid before its first Sandbox application deploy. The upgrade itself does not probe Containers access, so platforms that do not deploy Sandbox applications need no additional plan or permissions.
82
96
 
83
- When upgrading from a release that used tenant-owned Sandbox containers, the upgrade may first ask you to finish the legacy cleanup. Follow the [`sandbox-drain` instructions](/reference/cli#operator-system), then rerun the upgrade. Administrator login remains available during that maintenance step.
97
+ When upgrading from a release that used tenant-owned Sandbox containers, the upgrade may first ask you to finish the legacy cleanup. Follow the [`sandbox-drain` instructions](../../../reference/cli/platform-operations.md#operator-system), then rerun the upgrade. Administrator login remains available during that maintenance step.
84
98
 
85
99
  After a successful upgrade, you can restore a declared-compatible earlier runtime without reversing migrations:
86
100
 
@@ -4,19 +4,25 @@ outline: deep
4
4
 
5
5
  # Prerequisites
6
6
 
7
- Start with a Cloudflare account you can administer, an account with your chosen login provider, and an empty hosted PostgreSQL database. GitHub is the default and is optional when another method is selected. A domain is recommended. If yours is not ready, choose **Use workers.dev for testing** during installation and [add a domain later](/guide/platform/installation/domains#adding-a-domain). The steps below explain how to get the credentials the installer asks for.
7
+ To run a Void platform, you need:
8
+
9
+ - A Cloudflare account with Workers for Platforms and R2 enabled.
10
+ - An empty hosted PostgreSQL database.
11
+ - An account with your chosen login provider: GitHub, Google, OIDC, or Cloudflare Access.
12
+ - A domain for your apps, or `workers.dev` for testing. You can [add a domain later](/guide/platform/installation/domains#adding-a-domain).
8
13
 
9
14
  Void creates the Workers, storage, queues, routing, and database tables through the CLI.
10
15
 
11
- This setup has costs: Workers for Platforms requires a paid plan, and your database and Cloudflare usage have their own pricing. External PostgreSQL is required in either mode.
16
+ Workers for Platforms requires a paid plan. Your database and Cloudflare usage are billed separately.
12
17
 
13
18
  ## Prepare Your Cloudflare Account and Domain
14
19
 
15
20
  In the [Cloudflare dashboard](https://dash.cloudflare.com/), select the account where you want the platform to live:
16
21
 
17
- 1. Open **Workers for Platforms** and enable its plan. Review [Workers for Platforms pricing](https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/platform/pricing/) before confirming.
18
- 2. Open **R2 Object Storage** and complete its activation. Void creates the bucket later.
19
- 3. For a domain installation, choose a domain you own, such as `example.app`. If you need one, register it with your preferred registrar. Use a spare domain's root: apps will be served at `my-app.example.app`. For workers.dev testing, skip this step and the DNS setup below.
22
+ 1. Open **Workers & Pages** once to let Cloudflare provision Workers for the account.
23
+ 2. Open **Workers for Platforms** and enable its plan. Review [Workers for Platforms pricing](https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/platform/pricing/) before confirming.
24
+ 3. Open **R2 Object Storage** and complete its activation. Void creates the bucket later.
25
+ 4. For a domain installation, choose a domain you own, such as `example.app`. If you need one, register it with your preferred registrar. Use a spare domain's root: apps will be served at `my-app.example.app`. For workers.dev testing, skip this step and the DNS setup below.
20
26
 
21
27
  If that domain is already in this Cloudflare account, use its existing zone. Otherwise, [add the domain to Cloudflare](https://developers.cloudflare.com/dns/zone-setups/full-setup/setup/) and follow the nameserver instructions until the zone is active. A zone is Cloudflare's DNS configuration for a domain; creating one does not buy the domain.
22
28
 
@@ -31,15 +37,7 @@ pnpm add --global void
31
37
  void platform install --plan
32
38
  ```
33
39
 
34
- Void checks your saved Cloudflare login while you enter the installation name. If sign-in is needed, it opens your browser after you submit the name; press Ctrl+C to cancel. The plan command then asks for the account and basic configuration and shows the resources it would create. It does not require the database or runtime secrets and does not change Cloudflare resources.
35
-
36
- The installer first offers these choices, with the domain option selected:
37
-
38
- ```text
39
- Where should your apps live?
40
- Use a domain — recommended
41
- Use workers.dev for testing — add a domain later
42
- ```
40
+ Sign in to Cloudflare when prompted, then choose an installation name and account. `--plan` previews the resources without changing them or requiring runtime secrets. Completed plans save your choices locally. Run `void platform install` again to select a saved plan; Void checks the current Cloudflare state before asking you to apply it.
43
41
 
44
42
  For a domain installation, use these answers. Testing mode skips the application domain, zone, and catch-all questions:
45
43
 
@@ -52,9 +50,9 @@ For a domain installation, use these answers. Testing mode skips the application
52
50
  | Optional custom API hostname | Leave empty to use `workers.dev` |
53
51
  | Dedicate all unmatched traffic to Void? | Yes only if this whole zone belongs to the platform |
54
52
 
55
- Platform resources use your installation name: `team` creates names such as `void-team-api`, `void-team-proxy`, and `void-team-routing`, with no random suffix. Use a different installation name for another platform in the same account. If a required resource already exists and belongs to another installation, Void stops without overwriting it. Existing installations keep their recorded resource names.
53
+ Choose an unused installation name in your account. For example, `team` creates resources such as `void-team-api` and `void-team-proxy`.
56
54
 
57
- The preview shows the actual resource names and login callback URL that installation will use with the same configuration. It also links directly to the runtime-token form and the account's R2 token page. When you select GitHub login, it links to GitHub OAuth registration. It does not open credential setup pages or save an installation draft; Cloudflare browser login still opens when needed.
55
+ The preview lists the credentials you will need. Review [Credentials](/guide/platform/installation/credentials), then run the install command printed at the end. The guided installation provides setup links and the login callback when needed.
58
56
 
59
57
  You can select either path directly:
60
58
 
@@ -69,7 +67,7 @@ void platform install --workers-dev --plan
69
67
 
70
68
  Use an empty PostgreSQL database dedicated to this platform. It stores users, projects, and deployments; individual apps can still use D1. Void creates the tables and the Hyperdrive connection, but does not provision the PostgreSQL server.
71
69
 
72
- Void does not require a particular database provider. Use an existing PostgreSQL host or choose a service such as **PlanetScale Postgres**, **Neon**, **Supabase**, or others.
70
+ Use any PostgreSQL provider that accepts connections from your computer and Cloudflare:
73
71
 
74
72
  1. Create a fresh database or project dedicated to the platform, with no existing application tables. Use a database role that can create and manage its tables and schemas.
75
73
  2. Open the provider's connection details and select the primary database. Use a direct connection or a session-mode pooler, not transaction pooling. The connection must work from both your computer and Cloudflare.
@@ -85,4 +83,12 @@ For a dedicated Supabase project, [disable the Data API](https://supabase.com/do
85
83
 
86
84
  Once installation claims the database, continue using that same database for resume and maintenance commands. Uninstall never deletes external PostgreSQL.
87
85
 
88
- During interactive installation, choose whether Void creates Hyperdrive or uses an existing configuration in your Cloudflare account. Select an existing configuration by name and confirm its database, host, port, runtime user, and disabled SQL result caching. If you need a new separately managed configuration, choose **Set up a separately managed Hyperdrive**; Void pauses and gives you setup instructions. Create it with any unused name, point it at the dedicated PostgreSQL database using a runtime user, and disable SQL result caching. See [Cloudflare's Hyperdrive setup guide](https://developers.cloudflare.com/hyperdrive/get-started/), or ask your organization's Hyperdrive administrator to create it. Rerun the installer and select it. Paste a database owner connection into the PostgreSQL URL prompt for installation and migrations. Void verifies the selected Hyperdrive against that database, records its identity for later maintenance, and leaves its configuration under your external manager's control. For unattended installation, supply the existing Hyperdrive ID, origin host, and runtime user through the environment variables in [Install from CI](/guide/platform/installation/ci).
86
+ ### Use an existing Hyperdrive
87
+
88
+ The installer can create Hyperdrive for you or use one you manage separately. For an existing configuration:
89
+
90
+ 1. Point it at the dedicated platform database using a runtime user, and disable SQL result caching.
91
+ 2. Select it in the installer and review the database, host, port, and runtime user.
92
+ 3. Supply a database owner connection at the PostgreSQL URL prompt so Void can apply migrations.
93
+
94
+ To create one first, choose **Set up a separately managed Hyperdrive** and follow the printed instructions or [Cloudflare’s setup guide](https://developers.cloudflare.com/hyperdrive/get-started/). Rerun the installer once it is ready. Void leaves its configuration under your control. For unattended setup, use the Hyperdrive variables in [Install from CI](/guide/platform/installation/ci).
@@ -4,13 +4,19 @@ outline: deep
4
4
 
5
5
  # Install and Configure Login
6
6
 
7
+ Press Enter to accept a suggested zone or display name, or type to replace it. Enter your own installation name and application domain; examples such as `company` and `example.com` are placeholders.
8
+
7
9
  For workers.dev testing, start the interactive install and choose your login method below:
8
10
 
9
11
  ```sh
10
12
  void platform install --workers-dev
11
13
  ```
12
14
 
13
- For a domain installation, the management token is the one value the interactive installer needs in the shell. Browser login cannot create the application's DNS record. In Bash or zsh, read the token without displaying it or putting its value in command history:
15
+ For a domain installation or Access setup, Void guides you to create a management API token and paste it into a masked prompt. Browser login can preview DNS, but cannot change it or configure Access. The token-creation link preselects the permissions for your choices; scope the token to your account and, when using a domain, its zone. No shell environment variable is needed for interactive installation.
16
+
17
+ ::: details Use an existing management token from the shell
18
+
19
+ Set `CLOUDFLARE_API_TOKEN` to use an existing token instead of the prompt. In Bash or zsh, read it without displaying it or putting its value in command history:
14
20
 
15
21
  ```sh
16
22
  printf 'Cloudflare management API token: '
@@ -20,7 +26,7 @@ export CLOUDFLARE_API_TOKEN
20
26
  void platform install
21
27
  ```
22
28
 
23
- ::: details PowerShell equivalent
29
+ In PowerShell:
24
30
 
25
31
  ```powershell
26
32
  $env:CLOUDFLARE_API_TOKEN = [System.Net.NetworkCredential]::new('', (Read-Host 'Cloudflare management API token' -AsSecureString)).Password
@@ -29,14 +35,66 @@ void platform install
29
35
 
30
36
  :::
31
37
 
32
- After `--plan`, run the install command printed at the end of the preview. Void recalculates the plan and asks you to confirm it; choose the same login methods again if you selected them interactively. Void then saves a local setup draft and opens the runtime-token page when that token is missing. Paste the token into the masked prompt. As you continue, it opens GitHub and R2 at their respective steps. Each page has a short checklist and a clickable fallback link in the terminal. Values already supplied through the environment or saved setup are reused without opening their pages again.
38
+ After reviewing `--plan`, run `void platform install` and select your saved plan, or run the command printed under **Next, run this command to install the platform**. Both carry your choices into installation and check the current Cloudflare state. Review the refreshed plan. At **Apply this plan?**, **Yes** is selected; press Enter to continue to the credential prompts, or choose **No** to stop. Void opens the relevant setup pages and provides fallback links in the terminal. It reuses values you have already supplied.
39
+
40
+ Saved plans contain your installation choices, including paths to any authentication configuration or custom runtime. They contain no secrets or approval to install. Declining the plan or cancelling management-token setup keeps those choices for your next attempt.
33
41
 
34
42
  ## Choose login methods
35
43
 
36
- The installer offers GitHub, Google, generic OIDC, and Cloudflare Access login.
44
+ The installer offers GitHub, Google, generic OIDC, and Cloudflare Access login. Select all methods you want to enable; none are selected initially.
37
45
  Cloudflare Access protection is a separate choice from Access login. The
38
46
  GitHub OAuth steps below apply when you select GitHub login.
39
47
 
48
+ ## Choose who can access apps
49
+
50
+ The installer asks **Who should be able to access deployed apps?**
51
+
52
+ - **Same people allowed by the platform’s Access policy** reuses your selected company identities and policies. This is recommended when platform Access protection is enabled.
53
+ - **Anyone — public apps** allows public visits.
54
+ - **Choose a different Access policy** selects separate company rules for apps. Without platform protection, this option is **Set up Cloudflare Access protection**.
55
+
56
+ The plan shows the default app access. Void finishes and verifies app access before
57
+ opening application traffic; new projects inherit the selected default automatically.
58
+ If setup stops, use the printed resume command. Existing installations retain their
59
+ administrator settings during upgrades.
60
+
61
+ App protection uses the account hosting your platform. If platform login or
62
+ protection uses another account, select equivalent identity providers and policies
63
+ in the hosting account when prompted. Use the app domain’s apex or a workers.dev
64
+ hostname for the API so it stays outside the app wildcard.
65
+
66
+ Void checks account-wide Default-Deny during setup. For public apps in an account
67
+ that requires Access rules, it creates rules for each app and its verified custom
68
+ domains. Other subdomains keep their existing access rules. It leaves account-wide
69
+ Default-Deny enabled and does not bypass the platform API or proxy.
70
+
71
+ App rules need **Access: Apps and Policies Edit** and **Organizations, Identity
72
+ Providers, and Groups Read**. Void stores this management token encrypted for future
73
+ apps and domain changes. The installer asks before retaining a setup-only token for
74
+ that purpose, or guides you to create a dedicated token. Public apps without
75
+ Default-Deny need no ongoing Access-management credential.
76
+
77
+ For scripts, use `--app-access public|platform|custom`. Supply
78
+ `VOID_PLATFORM_APP_ACCESS_TOKEN` when app rules are needed, or add an `appAccess`
79
+ section to your `--auth-config` file:
80
+
81
+ ```json
82
+ {
83
+ "appAccess": {
84
+ "mode": "custom",
85
+ "identityProviderIds": ["hosting-account-identity-provider-id"],
86
+ "policyIds": ["hosting-account-company-policy-id"],
87
+ "tokenEnv": "APP_ACCESS_API_TOKEN"
88
+ }
89
+ }
90
+ ```
91
+
92
+ Keep the file’s existing `connections` configuration. For `mode: "platform"`,
93
+ same-account identity and policy selections are reused. Headless setup requires an
94
+ explicit app-management token; it never silently retains an installer-only token.
95
+
96
+ ## Finish login configuration
97
+
40
98
  For Google, create an OAuth client and register the printed callback URL. You
41
99
  can restrict it to named Google Workspace domains. For OIDC or Access login,
42
100
  provide the issuer URL, client ID, and client secret. Select **Company-approved
@@ -86,6 +144,10 @@ with GitHub or another login method. With company-approved signup, a colleague
86
144
  who passes the company gate can create an ordinary account using GitHub even
87
145
  when their GitHub email differs from their company email.
88
146
 
147
+ Your identity provider determines how employees sign in, such as through Okta or
148
+ Google Workspace. Your Access policies determine who can reach the platform and
149
+ which MFA or device requirements apply.
150
+
89
151
  Automatic setup uses an existing Zero Trust organization, selected identity
90
152
  providers, and existing company policies. Void creates dedicated applications
91
153
  and a scoped service token for protected installation checks. It preserves your
@@ -94,9 +156,13 @@ company policies, including device and MFA requirements.
94
156
  The setup credential needs **Access: Apps and Policies Write** and
95
157
  **Access: Organizations, Identity Providers, and Groups Read** in the identity
96
158
  account. Creating protection also needs **Access: Service Tokens Write**.
97
- Provide a separate setup token through `VOID_PLATFORM_ACCESS_SETUP_TOKEN` if
98
- your Cloudflare management credential lacks these permissions. These permissions
99
- are not required by the platform's runtime token. See Cloudflare's
159
+ For setup in the installation account, the initial management-token link includes
160
+ these permissions. Void checks Access reads before provisioning and reuses that
161
+ management token during Access setup, so you do not need a second API token.
162
+ For applications in another account, provide a token scoped to that identity
163
+ account when asked. Scripts can supply an explicit override through
164
+ `VOID_PLATFORM_ACCESS_SETUP_TOKEN`. The platform's runtime token does not need
165
+ Access management permissions. See Cloudflare's
100
166
  [Access API](https://developers.cloudflare.com/api/resources/zero_trust/subresources/access/subresources/applications/)
101
167
  and [service-token permissions](https://developers.cloudflare.com/api/resources/zero_trust/subresources/access/subresources/service_tokens/methods/create/).
102
168
 
@@ -117,7 +183,9 @@ Keep the file's `connections` list from the example above, or use a connection
117
183
  with `{"id":"access","kind":"cloudflare-access","label":"Company Access"}`
118
184
  to create Access login as well. Omit `protection` for login-only setup.
119
185
 
120
- To connect applications managed elsewhere, select **Connect existing applications**.
186
+ To connect applications managed elsewhere, select **Use Access applications your company already manages**.
187
+ Enter the account that owns the Access applications; it can differ from the
188
+ account hosting Void.
121
189
  Scripts use `mode: "existing"`, optional `accountId`, and `loginApplicationId`
122
190
  and/or `protectionApplicationId`. For login, set `loginClientSecretEnv`. For
123
191
  protection, supply `serviceToken` with `id`, `clientIdEnv`, and `clientSecretEnv`
@@ -131,7 +199,9 @@ ID, and secret, without a `cloudflareAccess` block or Cloudflare management toke
131
199
  Follow Cloudflare's [OIDC application guide](https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/saas-apps/generic-oidc-saas/)
132
200
  and register the exact callback printed by Void.
133
201
 
134
- For the default GitHub-only setup:
202
+ ### GitHub
203
+
204
+ For GitHub login:
135
205
 
136
206
  1. The installer opens [GitHub's new OAuth App form](https://github.com/settings/applications/new) when it needs OAuth credentials. Sign in as the account that will own the login integration.
137
207
  2. Set **Application name** to your platform's display name and **Homepage URL** to the API URL Void just printed.
@@ -140,11 +210,13 @@ For the default GitHub-only setup:
140
210
 
141
211
  This OAuth App handles sign-in.
142
212
 
143
- For the default GitHub-only setup, the prompts collect the runtime token, administrator GitHub username, PostgreSQL URL, GitHub client ID and secret, R2 credentials, and signing/encryption keys. Other login methods collect their configured provider credentials and use the one-time administrator setup code described above. Secret values are masked and setup progress is encrypted locally using the system keychain. Keep a password-manager copy for recovery on another machine.
213
+ ## Finish installation
214
+
215
+ The installer collects your runtime token, PostgreSQL URL, login-provider credentials, R2 credentials, and signing and encryption keys. It masks secret values and saves setup progress encrypted through your system keychain. Keep a password-manager copy for recovery on another machine.
144
216
 
145
- Void shows installation progress while it prepares the database, provisions Cloudflare resources, deploys the services, and verifies platform health. Progress is checkpointed for recovery. When installation finishes, follow the printed administrator sign-in instructions and open the admin dashboard link. GitHub-only setup creates the first admin user when the selected GitHub account signs in; configurable setup uses the one-time `/setup` code and selected administrator login method. No app or CLI login is required. Void also prints the API URL to use when you [connect and deploy an app](/guide/platform/installation/first-deployment).
217
+ Once installation finishes, open the printed admin dashboard link. For GitHub-only setup, sign in as the administrator selected during installation. For configurable login, use the one-time `/setup` code to confirm the administrator’s identity. Use the printed API URL to [connect and deploy an app](/guide/platform/installation/first-deployment).
146
218
 
147
- Remove the management token from the shell when finished:
219
+ If you supplied a management token through the shell, remove it when finished:
148
220
 
149
221
  ```sh
150
222
  unset CLOUDFLARE_API_TOKEN
@@ -160,9 +232,11 @@ If Void created a zone, it stops in `waiting-for-dns` and prints nameservers. Se
160
232
  void platform install --resume --name <installation-id>
161
233
  ```
162
234
 
163
- Keep the management token available for any remaining DNS changes. When using a source build, also pass the same `--runtime` directory. Resume uses the saved checkpoint and original secrets; do not start a second installation or generate replacement keys. If setup failed before a checkpoint was saved, rerun the original command.
235
+ Resume reuses the saved management token and asks for one if it is missing or rejected by Cloudflare. You can override it through `CLOUDFLARE_API_TOKEN`. When using a source build, also pass the same `--runtime` directory. Resume uses the saved checkpoint and original secrets; do not start a second installation or generate replacement keys. If setup stopped before a checkpoint was saved, rerun `void platform install` and select your saved plan, or rerun the original command.
236
+
237
+ You can also rerun `void platform install` and choose **Continue setup** for an unfinished installation. For non-interactive recovery, use `--resume --name <id>`. Manage completed platforms with `platform status`, `repair`, or `upgrade`.
164
238
 
165
- If setup stops or fails, rerun `void platform install`. It lists unfinished installations, including those that reached provisioning, and offers **Continue setup** or **Start a new platform install**. Entering an existing unfinished name also asks whether to resume it; declining lets you enter another name. Continuing restores your saved answers and checkpoints. Starting new does not reuse or delete previous credentials or resources. `--resume --name <id>` continues directly and is required for non-interactive recovery. Read-only `--plan` runs do not save drafts. Completed platforms are managed with `platform status`, `repair`, or `upgrade`, not reinstalled.
239
+ Resume restores your selected Hyperdrive. If that selection is missing from the saved checkpoint, add `--hyperdrive <existing-id>` when resuming, using the same configuration you originally selected.
166
240
 
167
241
  If Cloudflare rejects a saved runtime token during continued credential setup, Void opens the token page and asks for a replacement in the same run. Network or service failures do not discard saved tokens. Tokens supplied through the environment must be corrected there instead.
168
242
 
@@ -12,6 +12,7 @@ The operator commands for users, projects, deployments, and system status requir
12
12
 
13
13
  - [Sign-in and Access](/guide/platform/administration/access)
14
14
  - [Users and Projects](/guide/platform/administration/projects)
15
+ - [Plans and Limits](/guide/platform/administration/plans)
15
16
  - [Project Zero Trust](/guide/platform/administration/zero-trust)
16
17
  - [Email](/guide/platform/administration/email)
17
18
  - [Operations](/guide/platform/administration/operations)
@@ -8,13 +8,11 @@ Use queues to process work asynchronously, such as sending emails or handling up
8
8
 
9
9
  ## Defining queues
10
10
 
11
- Create files in `queues/**/*.ts`; `.mts`, `.js`, and `.mjs` also work. The queue name is inferred from its path, with nested path segments joined by `-`. For example, `queues/emails.ts` creates a queue named `"emails"`, and `queues/order/notifications.ts` creates `"order-notifications"`. A nested path must not normalize to the same name as another file: `queues/order/notifications.ts` and `queues/order-notifications.ts` conflict, so Void reports the collision and asks you to rename one.
11
+ Create a consumer in `queues/`. TypeScript and JavaScript files are supported (`.ts`, `.mts`, `.js`, `.mjs`). Its path determines the queue name: `queues/emails.ts` creates `emails`, and `queues/order/notifications.ts` creates `order-notifications`. Each queue must have a unique name.
12
12
 
13
13
  The resulting name must follow Cloudflare's queue naming rules: 1–63 characters, only letters, digits, and `-`, beginning and ending with a letter or digit.
14
14
 
15
- If you previously used a nested queue locally, update producer calls from `queues['order/notifications']` to `queues['order-notifications']`. The derived binding remains `QUEUE_ORDER_NOTIFICATIONS`.
16
-
17
- Each queue file should export a default handler wrapped with [`defineQueue`](../reference/api.md#definequeue-t-handler). The generic `<T>` parameter defines the message body type. That is the type of each `msg.body` in the batch, and it is also used by the typed `queues` proxy for `send()` calls.
15
+ Export a default handler wrapped with [`defineQueue<T>`](../reference/api/handlers.md#definequeue-t-handler). `T` defines the message body for both the consumer and calls to `send()`:
18
16
 
19
17
  ```ts
20
18
  // queues/emails.ts
@@ -56,8 +54,6 @@ export const POST = defineHandler(async (c) => {
56
54
  });
57
55
  ```
58
56
 
59
- The binding name is derived automatically: `QUEUE_` + queue name uppercased with non-alphanumeric characters replaced by `_`. For example, `queues/emails.ts` creates binding `QUEUE_EMAILS`, while `queues/order/notifications.ts` creates binding `QUEUE_ORDER_NOTIFICATIONS`.
60
-
61
57
  ## Per-message acknowledgment
62
58
 
63
59
  Each message in the batch has `ack()` and `retry()` methods matching the [Cloudflare Queues API](https://developers.cloudflare.com/queues/configuration/consumer-concurrency/):
@@ -111,12 +107,14 @@ export default defineQueue<Message>(async (batch, env) => {
111
107
 
112
108
  - `maxBatchSize`: maximum number of messages per batch (default `10`)
113
109
  - `maxBatchTimeout`: maximum seconds to wait before delivering an incomplete batch (default `5`)
114
- - `maxRetries`: maximum number of retries before a message is dead-lettered (default `3`)
110
+ - `maxRetries`: maximum number of retries before delivery is exhausted (default `3`)
115
111
  - `retryDelay`: seconds to wait between retries (default `0`)
116
112
 
117
- ## Deployment behavior
113
+ Void-managed queues do not configure a dead-letter queue. Cloudflare permanently
114
+ deletes messages that exhaust their retries without one; see
115
+ [Cloudflare's dead-letter queue guide](https://developers.cloudflare.com/queues/configuration/dead-letter-queues/).
118
116
 
119
- On deploy, Void includes all discovered queues in the deploy manifest. The platform provisions Cloudflare Queues, configures producer bindings on the user worker, and registers the dispatch worker as the queue consumer for relay delivery.
117
+ Void provisions queues and connects their producers and consumers when you deploy.
120
118
 
121
119
  ## Local development
122
120