void 0.20.2 → 0.21.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 (310) hide show
  1. package/README.md +2 -2
  2. package/dist/agents-gni4eqBu.mjs +111 -0
  3. package/dist/auth-3sGB0zJ1.mjs +22 -0
  4. package/dist/{auth-DPl6kck4.mjs → auth-B9_D6ygs.mjs} +6 -241
  5. package/dist/auth-CAw7zHqj.mjs +2 -0
  6. package/dist/auth-client-BWBT8HLp.mjs +6 -0
  7. package/dist/auth-client-Bawdj38n.d.mts +7 -0
  8. package/dist/auth-client-react-7GFffu8R.d.mts +7 -0
  9. package/dist/auth-client-react-CMLwT2xI.mjs +6 -0
  10. package/dist/auth-client-solid-DyTFL4cq.d.mts +7 -0
  11. package/dist/auth-client-solid-UoreJWZG.mjs +6 -0
  12. package/dist/auth-client-svelte-Cv_WvrRk.mjs +6 -0
  13. package/dist/auth-client-svelte-zetW0KIH.d.mts +7 -0
  14. package/dist/auth-client-vue-CFk7Xbv3.mjs +6 -0
  15. package/dist/auth-client-vue-bChShbQP.d.mts +7 -0
  16. package/dist/{auth-cmd-gniL2fNt.mjs → auth-cmd-MkBG2u1f.mjs} +5 -5
  17. package/dist/{auth-link-NZdjCmSc.mjs → auth-link-Devmv96E.mjs} +5 -5
  18. package/dist/{better-auth-shared-DSCeohOK.d.mts → better-auth-shared-BoVwA5Vm.d.mts} +1 -6
  19. package/dist/{better-auth-shared-CYw1T3k4.mjs → better-auth-shared-syGYYmnY.mjs} +1 -1
  20. package/dist/{build-cmd-sI18tX_O.mjs → build-cmd-DsBGwtfs.mjs} +6 -4
  21. package/dist/{cache-IHn5MwBC.mjs → cache-BMw8eMyF.mjs} +6 -4
  22. package/dist/{cancel-deploy-C5qTOdLi.mjs → cancel-deploy-B3_s9NIN.mjs} +5 -3
  23. package/dist/cf-access-rAZxzMkL.mjs +181 -0
  24. package/dist/cf-build-output-CTdlo6Rt.mjs +520 -0
  25. package/dist/cli/cf-compat.d.mts +1 -0
  26. package/dist/cli/cf-compat.mjs +934 -0
  27. package/dist/cli/cli.mjs +61 -38
  28. package/dist/cli/env-schema-probe.mjs +3 -3
  29. package/dist/client-DAAivdid.mjs +2 -0
  30. package/dist/{client-dHfSJvAN.mjs → client-PdAJ-F0t.mjs} +148 -89
  31. package/dist/{cloudflare-auth-6M5llVPC.mjs → cloudflare-auth-BCmTc1X_.mjs} +13 -44
  32. package/dist/{cloudflare-cmd-4RPGN3KB.mjs → cloudflare-cmd-D6PrKn7o.mjs} +4 -7
  33. package/dist/{cloudflare-connect-t1UU5svD.mjs → cloudflare-connect-DloREDlc.mjs} +6 -6
  34. package/dist/cloudflare-operations-BHNJVDbN.mjs +2 -0
  35. package/dist/{cloudflare-operations-BzWnlC1_.mjs → cloudflare-operations-CPEdHYhM.mjs} +37 -39
  36. package/dist/cloudflare-user-output-Q-k0QoNQ.mjs +20 -0
  37. package/dist/collect-DAUItMDS.mjs +2 -0
  38. package/dist/collect-DXHNWHcT.mjs +48 -0
  39. package/dist/config--T87TD8T.mjs +2 -0
  40. package/dist/{config-NOG_U1aK.mjs → config-BSe70f4T.mjs} +4 -6
  41. package/dist/config-DDIFxQYx.mjs +2 -0
  42. package/dist/{config-uNGuFsI2.mjs → config-Dxr6cTXn.mjs} +22 -37
  43. package/dist/config-DywxBLQC.d.mts +185 -0
  44. package/dist/config-entry.d.mts +6 -0
  45. package/dist/config-entry.mjs +7 -0
  46. package/dist/config-uP7ZDtVZ.mjs +21 -0
  47. package/dist/config-write-y3CBI_ux.mjs +60 -0
  48. package/dist/{connect-Bfk31O_8.mjs → connect-BvC9kolB.mjs} +8 -6
  49. package/dist/{create-project-Bk9Z0-Jg.mjs → create-project-C9lQhRzj.mjs} +9 -25
  50. package/dist/create-project-CI-17RVJ.mjs +2 -0
  51. package/dist/database-provider-Cx525bwX.mjs +6 -0
  52. package/dist/database-provider.mjs +1 -5
  53. package/dist/{db-BkRoptAt.mjs → db-R7IQgOv5.mjs} +48 -44
  54. package/dist/{delete-DouASY9P.mjs → delete-CghI_NXn.mjs} +6 -4
  55. package/dist/deploy-CYPymbtG.mjs +2 -0
  56. package/dist/{deploy-DTaWUS1S.mjs → deploy-H968Lo4T.mjs} +765 -197
  57. package/dist/discover-BBzDZe_o.mjs +2 -0
  58. package/dist/{discover-xvfrgJeo.mjs → discover-C4O6YxVS.mjs} +3 -8
  59. package/dist/{dist-BrsS7cai.mjs → dist-4WkAWhWx.mjs} +1 -15
  60. package/dist/{dist-m40_XgNh.mjs → dist-Bn8Kodjp.mjs} +1 -1
  61. package/dist/dist-C5fND3R0.mjs +2 -0
  62. package/dist/dist-D7-nEOXi.mjs +2 -0
  63. package/dist/{output-B0cfNSx5.mjs → dist-Dn6nn2IU.mjs} +3 -926
  64. package/dist/{domain-1RhhOVrC.mjs → domain-CITt8lC-.mjs} +7 -5
  65. package/dist/{route-types-Da-DpyUp.mjs → drizzle-Beb2Am5S.mjs} +1 -280
  66. package/dist/{email-Ce6SQq-i.mjs → email-C5kaZXzJ.mjs} +2 -2
  67. package/dist/{email-C-lGh51B.mjs → email-_8VmyX7V.mjs} +14 -12
  68. package/dist/{entry-DU3oDoQ3.mjs → entry-DdRFGK0y.mjs} +2 -2
  69. package/dist/{env-DJHsPE7Z.mjs → env-DV4r3nHz.mjs} +9 -7
  70. package/dist/{env-DBKmK4vc.mjs → env-DX_v-Q-v.mjs} +1 -1
  71. package/dist/env-Yz4HcvHs.mjs +78 -0
  72. package/dist/env-helpers--wFmQ_5Q.mjs +136 -0
  73. package/dist/{env-types-BNPhro-M.mjs → env-types-CWDtqHgw.mjs} +6 -2
  74. package/dist/{env-validation-CF6KvTRf.mjs → env-validation-BsFEXps5.mjs} +19 -28
  75. package/dist/env-validation-DIDGM7h4.mjs +2 -0
  76. package/dist/fetch-CXDChK7B.mjs +18 -0
  77. package/dist/fetch-_SeGZao9.d.mts +57 -0
  78. package/dist/fetch-stream-AOByI7Ki.mjs +81 -0
  79. package/dist/fetch-stream-Bjf0hoZb.d.mts +49 -0
  80. package/dist/gen-BBiIZw6g.mjs +2 -0
  81. package/dist/{gen-B_wPnVTK.mjs → gen-CFOEEc-t.mjs} +13 -11
  82. package/dist/{generate-RTK8_kK1.mjs → generate-C0VY6RVf.mjs} +2 -2
  83. package/dist/{github-cmd-PW7ZnWTp.mjs → github-cmd-jYjha2LO.mjs} +18 -22
  84. package/dist/{handler-D1hLsObx.d.mts → handler-BXJTXd02.d.mts} +6 -1
  85. package/dist/handler-DghKr6dU.mjs +150 -0
  86. package/dist/head-D_QRR5Yd.mjs +112 -0
  87. package/dist/head-client-DzmJGN4C.mjs +90 -0
  88. package/dist/{headers-BAHwgHdW.mjs → headers-B_HBMgi0.mjs} +2 -2
  89. package/dist/{help-CwOX-zmI.mjs → help-C46mnlUS.mjs} +17 -12
  90. package/dist/help-CS_nAsWu.mjs +2 -0
  91. package/dist/index.d.mts +2 -20
  92. package/dist/index.mjs +116 -60
  93. package/dist/{init-BWZ7q5Z4.mjs → init-CSXmvxKu.mjs} +49 -50
  94. package/dist/{link-Rmvu2Wl_.mjs → link-DxMOALXk.mjs} +7 -5
  95. package/dist/{list-DEE2S6mY.mjs → list-0wQs0oYg.mjs} +7 -5
  96. package/dist/live-CB1y5IuC.mjs +411 -0
  97. package/dist/live-CKiJilLr.d.mts +105 -0
  98. package/dist/local-d1-DzykTWY8.mjs +104 -0
  99. package/dist/{login-Uvferzmm.mjs → login-CKk5NX4d.mjs} +6 -11
  100. package/dist/login-Ch9cgWRF.mjs +2 -0
  101. package/dist/{logs-27FenuiC.mjs → logs-hxWBSoej.mjs} +6 -4
  102. package/dist/migrate-CLty4mZR.mjs +2 -0
  103. package/dist/migrate-DcW8F2W8.mjs +285 -0
  104. package/dist/migration-handler-DM4clYj5.d.mts +51 -0
  105. package/dist/{neon-DHwd2zvC.mjs → neon-n74ta1Pr.mjs} +1 -1
  106. package/dist/{node-Ez5KW5rn.mjs → node-Cupyf7-s.mjs} +6 -6
  107. package/dist/{operator-auth-B3e08unv.mjs → operator-auth-BkVgJqv-.mjs} +2 -2
  108. package/dist/{operator-client-LUZnlnYk.mjs → operator-client-A0iex2yi.mjs} +2 -1
  109. package/dist/{operator-cmd-CjOTmAYE.mjs → operator-cmd-BEUYhaHB.mjs} +6 -6
  110. package/dist/output-urU86XeT.mjs +146 -0
  111. package/dist/{package-json-CPoWX79C.mjs → package-json-iCbMg5XF.mjs} +1 -1
  112. package/dist/pages/client.d.mts +5 -2
  113. package/dist/pages/client.mjs +5 -3
  114. package/dist/pages/head-client.mjs +1 -89
  115. package/dist/pages/head.mjs +1 -111
  116. package/dist/pages/index.d.mts +2 -3
  117. package/dist/pages/index.mjs +7 -7
  118. package/dist/pages/islands-plugin.mjs +2 -2
  119. package/dist/pages/prefetch.d.mts +2 -30
  120. package/dist/pages/prefetch.mjs +1 -89
  121. package/dist/pages/protocol.d.mts +2 -2
  122. package/dist/pages/protocol.mjs +3 -3
  123. package/dist/pages/serialize.d.mts +2 -9
  124. package/dist/pages/serialize.mjs +1 -13
  125. package/dist/plan-BEZ8VJW0.mjs +256 -0
  126. package/dist/plan-DpuOr14e.mjs +2 -0
  127. package/dist/{platform-auth-config-DrbQXXiW.mjs → platform-auth-config-Df6yVw-e.mjs} +6 -6
  128. package/dist/{platform-auth-protection-Bhtvp0B_.mjs → platform-auth-protection-Jb0yftay.mjs} +7 -5
  129. package/dist/{platform-auth-recovery-CeOKGVeJ.mjs → platform-auth-recovery-DmRyIfW0.mjs} +6 -5
  130. package/dist/platform-cmd-C9Vt7m-d.mjs +2 -0
  131. package/dist/{platform-cmd-BFhieCdV.mjs → platform-cmd-DRxCOTwy.mjs} +8 -5
  132. package/dist/{platform-domain-C74PULqV.mjs → platform-domain-IjiXgrXJ.mjs} +4 -3
  133. package/dist/{platform-lifecycle-BwAIgz-t.mjs → platform-lifecycle-BquAaU-5.mjs} +263 -56
  134. package/dist/platform-lifecycle-CuJIZNvA.mjs +2 -0
  135. package/dist/{platform-management-COogu_Se.mjs → platform-management-CCQKGsq4.mjs} +12 -7
  136. package/dist/platform-management-Cgyed0WY.mjs +2 -0
  137. package/dist/{platform-recovery-ewqLefp1.mjs → platform-recovery-DS8ih1SW.mjs} +3 -3
  138. package/dist/platform-registry-BJbgZLS1.mjs +431 -0
  139. package/dist/{plugin-inference-BDRfZngg.mjs → plugin-inference-DsvtJLll.mjs} +4 -4
  140. package/dist/prefetch-Bsc_Pb6c.mjs +90 -0
  141. package/dist/prefetch-Ce6la4EI.d.mts +31 -0
  142. package/dist/{prepare-blNRQvQl.mjs → prepare-CaUxODOU.mjs} +3 -2
  143. package/dist/prepare-D4CkM3_v.mjs +2 -0
  144. package/dist/{prepare-CtDJjoOj.mjs → prepare-pcWcxSCh.mjs} +13 -11
  145. package/dist/prerender-render-Cf_WDE9W.mjs +111 -0
  146. package/dist/prerender-render.mjs +1 -110
  147. package/dist/{preset-lAy0B0BQ.mjs → preset-Dowh9tTt.mjs} +16 -118
  148. package/dist/project-BEBFDFLz.mjs +2 -0
  149. package/dist/project-CWNIPoXc.mjs +209 -0
  150. package/dist/{project-cmd-DmZK9Hxf.mjs → project-cmd-2lN--YAX.mjs} +18 -16
  151. package/dist/{project-paths-SK8nMHPp.mjs → project-paths-CKQ-Q5JS.mjs} +47 -14
  152. package/dist/project-slug-23TpquG4.mjs +8 -0
  153. package/dist/project-slug-DofjTFd-.mjs +2 -0
  154. package/dist/{project-team-D8jOJMUJ.mjs → project-team-Dapn9HZn.mjs} +9 -5
  155. package/dist/{project-token-DA34bf-C.mjs → project-token-C90v9SJK.mjs} +6 -4
  156. package/dist/{project-tsconfig-Ql2XsSQp.mjs → project-tsconfig-CwfqUnVp.mjs} +2 -2
  157. package/dist/{protocol-C-pqYJjE.d.mts → protocol-ZH3jP4a7.d.mts} +1 -1
  158. package/dist/providers-BNKRacMr.d.mts +7 -0
  159. package/dist/provision-CNgEBkVA.mjs +3 -0
  160. package/dist/{provision-CSJOjjQk.mjs → provision-Cck2m3jJ.mjs} +11 -25
  161. package/dist/queues-BWKt1Xo4.d.mts +7 -0
  162. package/dist/{requests-CUExwGQQ.mjs → requests-CzX46I0i.mjs} +5 -3
  163. package/dist/resolve-project-BTotl8Nn.mjs +2 -0
  164. package/dist/{resolve-project--Vxawf7z.mjs → resolve-project-Xvis70DG.mjs} +2 -8
  165. package/dist/response-Tn7rU0MV.mjs +30 -0
  166. package/dist/{rollback-CDNGU1gr.mjs → rollback-BEeyc73H.mjs} +6 -4
  167. package/dist/{rolldown-runtime-rQ84J-ij.mjs → rolldown-runtime-DXIUcv95.mjs} +1 -10
  168. package/dist/route-types-Id82-veQ.mjs +280 -0
  169. package/dist/{local-d1-D2I6Ox5F.mjs → runner-BGVsGgkb.mjs} +6 -114
  170. package/dist/runner-CQs_cDSG.mjs +2 -0
  171. package/dist/runner-mysql-1o47achK.mjs +2 -0
  172. package/dist/{runner-mysql-7BPUNGmL.mjs → runner-mysql-BhwMk2Bm.mjs} +2 -9
  173. package/dist/{runner-pg-BkEza-dX.mjs → runner-pg-CJ_JeGF6.mjs} +2 -9
  174. package/dist/runner-pg-D7z01mQS.mjs +2 -0
  175. package/dist/runtime/ai.mjs +1 -1
  176. package/dist/runtime/auth-client-react.d.mts +2 -6
  177. package/dist/runtime/auth-client-react.mjs +1 -5
  178. package/dist/runtime/auth-client-solid.d.mts +2 -6
  179. package/dist/runtime/auth-client-solid.mjs +1 -5
  180. package/dist/runtime/auth-client-svelte.d.mts +2 -6
  181. package/dist/runtime/auth-client-svelte.mjs +1 -5
  182. package/dist/runtime/auth-client-vue.d.mts +2 -6
  183. package/dist/runtime/auth-client-vue.mjs +1 -5
  184. package/dist/runtime/auth-client.d.mts +2 -6
  185. package/dist/runtime/auth-client.mjs +1 -5
  186. package/dist/runtime/auth.mjs +1 -21
  187. package/dist/runtime/better-auth-mysql.d.mts +1 -1
  188. package/dist/runtime/better-auth-mysql.mjs +1 -1
  189. package/dist/runtime/better-auth-pg.d.mts +1 -1
  190. package/dist/runtime/better-auth-pg.mjs +1 -1
  191. package/dist/runtime/better-auth.d.mts +1 -1
  192. package/dist/runtime/better-auth.mjs +1 -1
  193. package/dist/runtime/client-react.d.mts +3 -3
  194. package/dist/runtime/client-react.mjs +3 -3
  195. package/dist/runtime/client-solid.d.mts +3 -3
  196. package/dist/runtime/client-solid.mjs +3 -3
  197. package/dist/runtime/client-svelte.d.mts +3 -3
  198. package/dist/runtime/client-svelte.mjs +3 -3
  199. package/dist/runtime/client-vue.d.mts +3 -3
  200. package/dist/runtime/client-vue.mjs +3 -3
  201. package/dist/runtime/client.d.mts +3 -3
  202. package/dist/runtime/client.mjs +3 -3
  203. package/dist/runtime/db.mjs +1 -1
  204. package/dist/runtime/durable.mjs +1 -1
  205. package/dist/runtime/email/testing.mjs +1 -1
  206. package/dist/runtime/env-helpers.mjs +1 -135
  207. package/dist/runtime/env-public-client.mjs +1 -1
  208. package/dist/runtime/env-public.mjs +2 -2
  209. package/dist/runtime/env.mjs +1 -77
  210. package/dist/runtime/fetch-stream.d.mts +2 -49
  211. package/dist/runtime/fetch-stream.mjs +2 -80
  212. package/dist/runtime/fetch.d.mts +2 -57
  213. package/dist/runtime/fetch.mjs +2 -17
  214. package/dist/runtime/handler.d.mts +1 -1
  215. package/dist/runtime/handler.mjs +1 -149
  216. package/dist/runtime/kv.mjs +1 -1
  217. package/dist/runtime/live-client.d.mts +1 -1
  218. package/dist/runtime/live-server.mjs +2 -2
  219. package/dist/runtime/live.d.mts +2 -104
  220. package/dist/runtime/live.mjs +1 -410
  221. package/dist/runtime/migration-handler-mysql.d.mts +1 -1
  222. package/dist/runtime/migration-handler-pg.d.mts +1 -1
  223. package/dist/runtime/migration-handler.d.mts +2 -50
  224. package/dist/runtime/queues.d.mts +2 -6
  225. package/dist/runtime/queues.mjs +1 -1
  226. package/dist/runtime/remote/index.mjs +49 -8
  227. package/dist/runtime/response.mjs +1 -29
  228. package/dist/runtime/sandbox.d.mts +4 -56
  229. package/dist/runtime/sandbox.mjs +82 -221
  230. package/dist/runtime/sse.mjs +1 -171
  231. package/dist/runtime/storage.mjs +1 -1
  232. package/dist/runtime/validator.d.mts +1 -1
  233. package/dist/runtime/validator.mjs +1 -71
  234. package/dist/runtime/ws-server.d.mts +2 -2
  235. package/dist/runtime/ws-server.mjs +2 -2
  236. package/dist/runtime/ws.d.mts +2 -121
  237. package/dist/{scan-CpK-57ug.mjs → scan-DJbooZm2.mjs} +3 -3
  238. package/dist/{scan-BMH4rzlv.mjs → scan-DdDvRCU1.mjs} +8 -26
  239. package/dist/{secret-Bzzi2e9E.mjs → secret-wnTel5Yw.mjs} +8 -6
  240. package/dist/serialize-BPvnNQuA.mjs +14 -0
  241. package/dist/serialize-CfSwWfF2.d.mts +10 -0
  242. package/dist/{skills-C0RvGjeE.mjs → skills-B-690E7h.mjs} +3 -2
  243. package/dist/sse-BaC1jXko.mjs +172 -0
  244. package/dist/{subcommand-prompt-Bmyn5Rlc.mjs → subcommand-prompt-Gj3VzLIh.mjs} +2 -1
  245. package/dist/sveltekit.d.mts +2 -1
  246. package/dist/sveltekit.mjs +3 -2
  247. package/dist/validate-DqJ33oHj.mjs +2 -0
  248. package/dist/validate-qNhV00PD.mjs +180 -0
  249. package/dist/validator-BTOu0fB0.mjs +72 -0
  250. package/dist/{wrangler--imS8n0d.mjs → wrangler-D01qs6VB.mjs} +259 -71
  251. package/dist/ws-BwcqizuH.d.mts +122 -0
  252. package/dist/{yarn-pnp-DxSInkzL.mjs → yarn-pnp-CVEc3gE7.mjs} +1 -1
  253. package/package.json +19 -8
  254. package/skills/void/SKILL.md +7 -5
  255. package/skills/void/docs/guide/ai.md +3 -3
  256. package/skills/void/docs/guide/app-types.md +12 -11
  257. package/skills/void/docs/guide/auth.md +2 -2
  258. package/skills/void/docs/guide/database/d1.md +1 -1
  259. package/skills/void/docs/guide/database/mysql.md +1 -1
  260. package/skills/void/docs/guide/database/postgresql.md +3 -3
  261. package/skills/void/docs/guide/deployment.md +16 -16
  262. package/skills/void/docs/guide/durable-state.md +2 -2
  263. package/skills/void/docs/guide/edge/headers.md +3 -3
  264. package/skills/void/docs/guide/edge/prerendering.md +1 -1
  265. package/skills/void/docs/guide/edge/redirects.md +4 -4
  266. package/skills/void/docs/guide/edge/revalidation.md +6 -6
  267. package/skills/void/docs/guide/edge/rewrites.md +28 -27
  268. package/skills/void/docs/guide/edge/static-assets.md +1 -1
  269. package/skills/void/docs/guide/email.md +27 -25
  270. package/skills/void/docs/guide/env-migration.md +1 -1
  271. package/skills/void/docs/guide/index.md +1 -1
  272. package/skills/void/docs/guide/pages-routing/head.md +1 -1
  273. package/skills/void/docs/guide/platform/administration/access.md +171 -0
  274. package/skills/void/docs/guide/platform/administration/email.md +121 -0
  275. package/skills/void/docs/guide/platform/administration/operations.md +97 -0
  276. package/skills/void/docs/guide/platform/administration/projects.md +56 -0
  277. package/skills/void/docs/guide/platform/development/local.md +119 -0
  278. package/skills/void/docs/guide/platform/development/runtime.md +124 -0
  279. package/skills/void/docs/guide/platform/development/schema-ci.md +95 -0
  280. package/skills/void/docs/guide/platform/installation/ci.md +58 -0
  281. package/skills/void/docs/guide/platform/installation/credentials.md +90 -0
  282. package/skills/void/docs/guide/platform/installation/domains.md +68 -0
  283. package/skills/void/docs/guide/platform/installation/first-deployment.md +82 -0
  284. package/skills/void/docs/guide/platform/installation/maintenance.md +137 -0
  285. package/skills/void/docs/guide/platform/installation/prerequisites.md +88 -0
  286. package/skills/void/docs/guide/platform/installation/setup.md +169 -0
  287. package/skills/void/docs/guide/platform/installation/uninstall.md +54 -0
  288. package/skills/void/docs/guide/platform-administration.md +6 -414
  289. package/skills/void/docs/guide/platform-development.md +5 -316
  290. package/skills/void/docs/guide/project-collaboration.md +1 -1
  291. package/skills/void/docs/guide/remote-dev.md +2 -2
  292. package/skills/void/docs/guide/sandboxes.md +10 -25
  293. package/skills/void/docs/guide/self-hosted-platform.md +11 -694
  294. package/skills/void/docs/guide/ssg.md +1 -1
  295. package/skills/void/docs/guide/websockets.md +1 -1
  296. package/skills/void/docs/integrations/cloudflare.md +86 -84
  297. package/skills/void/docs/integrations/frameworks/analog.md +14 -9
  298. package/skills/void/docs/integrations/frameworks/astro.md +14 -10
  299. package/skills/void/docs/integrations/frameworks/nuxt.md +14 -9
  300. package/skills/void/docs/integrations/frameworks/overview.md +35 -29
  301. package/skills/void/docs/integrations/frameworks/react-router.md +1 -1
  302. package/skills/void/docs/integrations/frameworks/sveltekit.md +33 -30
  303. package/skills/void/docs/integrations/frameworks/tanstack-start.md +1 -1
  304. package/skills/void/docs/integrations/nodejs-bun-deno.md +5 -5
  305. package/skills/void/docs/reference/api.md +55 -38
  306. package/skills/void/docs/reference/cli.md +60 -34
  307. package/skills/void/docs/reference/config.md +57 -34
  308. package/skills/void/docs/reference/resource-inference.md +10 -10
  309. package/skills/void/docs/reference/structure.md +2 -2
  310. package/dist/validate-tBBN_dXH.mjs +0 -505
@@ -0,0 +1,56 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # Users and Projects
6
+
7
+ ## Managing Users and Projects
8
+
9
+ Start by finding the user you want to inspect:
10
+
11
+ ```sh
12
+ void platform user list --search teammate
13
+ void platform user show <user-id>
14
+ ```
15
+
16
+ Use the ID from the list in the second command. The detail view shows the user's projects and usage. You can change their plan or list just their projects:
17
+
18
+ ```sh
19
+ void platform user plan <user-id> pro
20
+ void platform project list --user <user-id>
21
+ void platform project show <project-id>
22
+ ```
23
+
24
+ Project details include resources, domains, and recent builds and deployments. The [command reference](/reference/cli#operator-commands) also covers suspending and restoring users, deleting projects, and removing accounts.
25
+
26
+ In the admin dashboard, open a project to view its team. Search for a platform user and choose a role to add them immediately; an email address is not required. You can also change or remove existing members. Pending invitations created through other project workflows remain visible until accepted or revoked. If email is unavailable for a pending invitation, share its ID so the user can accept it with `void project team accept <invitation-id>`. The owner cannot be removed from the team; transfer ownership first.
27
+
28
+ ### Transferring Project Ownership
29
+
30
+ Only an installation administrator can change a project's owner. The new owner must already have an account on this platform. In the dashboard, search for the new owner on the project page and preview the transfer before applying it. The CLI accepts a user ID:
31
+
32
+ ```sh
33
+ void platform project owner <project-id> <new-owner-user-id> --plan
34
+ void platform project owner <project-id> <new-owner-user-id> --yes
35
+ ```
36
+
37
+ The preview shows both owners, their plans and suspension state, blockers, and the changes to routing and usage counters. Wait for active rollbacks and builds to finish. For an ordinary active deployment, wait or use `void platform deployment cancel <id>`; rollback deployments cannot be canceled. A managed Sandbox controller also blocks transfer until its cleanup completes, even if no Sandbox container is running; the preview identifies the deployment that owns it.
38
+
39
+ After the transfer, the former owner becomes a project administrator. Existing project-scoped CI deploy credentials are revoked; create replacements as the new owner. The new owner's plan and limits apply immediately. Usage before the transfer remains charged to the former owner; later usage is charged to the new owner. If an apply reports partial convergence, inspect the project and operator event log before repeating it.
40
+
41
+ New users on a self-hosted installation start with the `custom` profile, which
42
+ does not cap application requests, AI usage, deployment frequency, or retained
43
+ Worker deployments. Named profiles such as `pro` apply the platform's quota and
44
+ retention policies; they do not purchase Cloudflare services or bill your users.
45
+ Storage figures are not a hard storage-quota boundary. Set an operating budget
46
+ and retention policy before opening signup beyond your invited team.
47
+
48
+ The last active administrator cannot be deleted or suspended, including through
49
+ the browser admin UI. Another administrator must still have access. Automatic
50
+ usage limits do not remove administrator access and do not count as a manual
51
+ suspension.
52
+
53
+ When removing another administrator, Void revokes their administrator access
54
+ before changing application traffic or deleting resources. If cleanup fails,
55
+ access stays revoked and the error describes the partial result. A remaining
56
+ administrator can inspect it and retry cleanup.
@@ -0,0 +1,119 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # Local Development
6
+
7
+ ## Setting Up the Repository
8
+
9
+ Clone your fork and install the workspace dependencies with Vite+:
10
+
11
+ ```sh
12
+ git clone https://github.com/your-org/void.git
13
+ cd void
14
+ vp install
15
+ vpr install:void-dev
16
+ void-dev --help
17
+ ```
18
+
19
+ Use the Node.js version recorded in `.node-version`. The workspace uses public npm packages; a GitHub Packages token is not required.
20
+
21
+ `install:void-dev` builds the CLI, shared packages, and platform runtime, then makes this checkout's built CLI globally available as `void-dev`. Public packages export their built files, so run `vp run build:core` after later source changes to refresh the alias. The installer refuses to replace an unrelated global command. Remove only this checkout's alias with `vpr uninstall:void-dev`. The commands on these development pages run from the repository root.
22
+
23
+ ## Finding the Implementation
24
+
25
+ | Directory | Purpose |
26
+ | ---------------------------------------------------- | -------------------------------------------------------------------- |
27
+ | `packages/void` | Framework, application runtime, and CLI |
28
+ | `packages/platform` | Installer contracts, packaged Workers, and platform migrations |
29
+ | `packages/deploy-core`, `packages/deploy-cloudflare` | Shared deployment contracts and Cloudflare upload code |
30
+ | `platform/packages/api` | Users, projects, deployments, provisioning, and administrator API/UI |
31
+ | `platform/packages/dispatch` | Application routing and static assets |
32
+ | `platform/packages/proxy` | AI, remote bindings, and revalidation |
33
+ | `platform/packages/email-gateway` | Inbound mail routing and tenant delivery |
34
+ | `platform/packages/tail` | Runtime log ingestion |
35
+ | `platform/packages/dashboard` | Dashboard source and local UI components in `ui/` |
36
+
37
+ The `@voidcloud/*` names identify workspace implementation packages. Their `private: true` flags prevent publishing those packages to npm. Deployable core Workers are bundled into the public `@void/platform` package.
38
+
39
+ The core installer creates the API, dispatch, proxy, and tail Workers. The dashboard and managed GitHub build services are available in the source tree but are not included in that installation. Adding an optional service requires its infrastructure, bindings, authentication, and capability configuration together.
40
+
41
+ ## Running the API Locally
42
+
43
+ Start a local PostgreSQL server and make `psql` and `pg_isready` available on your path. Then create the development database, apply its migrations, and seed an administrator:
44
+
45
+ ```sh
46
+ vp run --filter @voidcloud/api setup --admin-email dev@example.com
47
+ vp run --filter @voidcloud/api dev --local --enable-containers=false --host localhost --port 8787
48
+ ```
49
+
50
+ The command disables the optional build containers, so basic API and admin work
51
+ does not require Docker. To develop managed builds, install Docker and run the
52
+ API with containers enabled.
53
+
54
+ Open `http://localhost:8787/admin/`. Setup writes local development values to the API and dashboard `.dev.vars` files, including the development authentication bypass and local database connection. Those files are ignored by Git. Production installations get separate credentials through the installer.
55
+
56
+ The API's development bypass lets you work on the browser admin UI without setting up OAuth. Operator CLI sessions still require administrator authentication; they do not use the browser bypass.
57
+
58
+ ## Running the Dashboard Locally
59
+
60
+ The dashboard is a separate source app. After API setup, start it in another terminal:
61
+
62
+ ```sh
63
+ vp run --filter @voidcloud/dashboard dev
64
+ ```
65
+
66
+ Its local `.dev.vars` should point to the API you started:
67
+
68
+ ```dotenv
69
+ API_URL=http://localhost:8787
70
+ SITE_DOMAIN=apps.example.com
71
+ ```
72
+
73
+ Open the Vite URL and choose **Dev login (local API)**. That button appears for a localhost API and uses the local development sign-in endpoint.
74
+
75
+ You can also point the dashboard at an API that you operate. If Cloudflare Access protects that API, install `cloudflared` and opt into the dashboard's local token helper with matching origins:
76
+
77
+ ```dotenv
78
+ API_URL=https://platform.example.com
79
+ CF_ACCESS_APP_URL=https://platform.example.com
80
+ SITE_DOMAIN=apps.example.com
81
+ ```
82
+
83
+ The helper refreshes an Access session before the dev server starts. Human
84
+ dashboard requests require the user's Access session as well as their Void login;
85
+ a service token does not represent that user. Service-token pairs are for scoped
86
+ machine operations. This is dashboard development configuration; Access
87
+ credentials are separate from platform login credentials.
88
+
89
+ For a deployed dashboard, bind its `API` service to your platform API, configure
90
+ `DASHBOARD_URL` on both the dashboard and API, and include that exact dashboard origin in the
91
+ platform's Access protection application. The dashboard passes the browser's
92
+ company identity to the API using that service binding. Its login page shows
93
+ the platform's currently enabled methods, and **Account** supports adding an
94
+ additional login identity.
95
+
96
+ ## Testing Changes
97
+
98
+ Run tests for the area you changed while developing:
99
+
100
+ ```sh
101
+ vp test run platform/packages/api/test/integration/operator-auth.test.ts
102
+ vp run check
103
+ ```
104
+
105
+ Before preparing a release, build the packages and run the complete checks:
106
+
107
+ ```sh
108
+ vp run build:all
109
+ vp run check
110
+ vp lint
111
+ vp run lint:platform
112
+ vp fmt --check
113
+ vp test run
114
+ vp run build:docs
115
+ ```
116
+
117
+ Platform integration tests use their local test database by default. To test against PostgreSQL, set `VOID_TEST_DATABASE_URL` to a disposable database: these tests clear tables between cases.
118
+
119
+ To exercise a deployed application, deploy a disposable copy of `playground/kitchen-sink` and pass its URL as `SMOKE_URL` to the smoke test described in `platform/scripts/kitchen-sink-smoke-test.md`. That test creates and removes application data.
@@ -0,0 +1,124 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # Runtime and Source Builds
6
+
7
+ ## Deploying Your Runtime
8
+
9
+ Build the runtime. From a Git checkout, the build automatically records the current commit in the runtime manifest. An uncommitted checkout is recorded with a `-dirty` suffix:
10
+
11
+ ```sh
12
+ vp run build:core
13
+ ```
14
+
15
+ Build systems may set `VOID_PLATFORM_SOURCE_REVISION` when they need to override automatic detection with another immutable revision. A source archive without Git metadata builds normally but leaves the revision unrecorded.
16
+
17
+ The runtime is written to `packages/platform/dist/runtime`. Use the built CLI to preview a new installation from those files:
18
+
19
+ ```sh
20
+ void-dev platform install \
21
+ --name my-team \
22
+ --application-domain example.app \
23
+ --zone example.app \
24
+ --runtime packages/platform/dist/runtime \
25
+ --plan
26
+ ```
27
+
28
+ Before applying the plan, complete the [installation guides](/guide/self-hosted-platform). Run the command without `--plan` to install. For testing before your domain is ready, replace `--application-domain` and `--zone` with `--workers-dev`; PostgreSQL and the runtime/GitHub/R2 credentials are still needed. Use `void-dev` in place of `void` and keep `--runtime packages/platform/dist/runtime` on install and resume commands. For an interrupted installation, keep that runtime build available until it completes.
29
+
30
+ Later, run `void-dev platform domain set example.app`. Domain setup uses the existing installed runtime and needs no `--runtime`, rebuild, or app redeploy. It keeps the platform API URL and original workers.dev app URLs available.
31
+
32
+ For an existing installation, preview an upgrade using its connection ID:
33
+
34
+ ```sh
35
+ void-dev platform upgrade <installation-id> \
36
+ --runtime packages/platform/dist/runtime --plan
37
+ ```
38
+
39
+ Then run it without `--plan` to apply the upgrade. Source-built runtimes go through the same artifact, database, ownership, and health checks as released runtimes. The CLI preserves a disabled installation's state and records the source revision in its installation checkpoint.
40
+
41
+ ## Optional GitHub Webhook Ingress for Access-Protected APIs
42
+
43
+ The core installer does not deploy the dashboard, GitHub App, build Containers,
44
+ or webhook ingress. Passing a source build with `--runtime` does not provision
45
+ their infrastructure, bindings, credentials, or platform capabilities. The
46
+ repository's hosted deployment scripts target Void Cloud; they are not a
47
+ general setup procedure for adding these services to a self-hosted platform.
48
+ Use the core CLI deployment workflow unless your fork supplies and maintains
49
+ that optional integration.
50
+
51
+ If your fork has added managed GitHub builds and Cloudflare Access protects its API hostname, GitHub cannot deliver directly
52
+ to `/webhooks/github`: GitHub does not present your Access credentials. Do not add
53
+ an Everyone or bypass policy to the API application.
54
+
55
+ The API source package includes an optional, path-isolated Worker for this case.
56
+ It accepts only `POST /github`, validates GitHub's signature over the raw body,
57
+ and forwards one authenticated internal operation over an API service binding.
58
+ The API independently verifies both that internal proof and GitHub's signature
59
+ before running the normal webhook handler. Installations without perimeter
60
+ protection can continue using the API's direct `/webhooks/github` endpoint.
61
+
62
+ To deploy the optional ingress:
63
+
64
+ 1. Provision the GitHub App, build executors, API bindings, credentials, and
65
+ managed-build capability in your fork, then deploy its source API runtime
66
+ with the internal operation. A core install or upgrade alone does not add
67
+ managed builds.
68
+ 2. Edit `platform/packages/api/wrangler.github-webhook-ingress.jsonc`. Give the
69
+ ingress a name unique to the installation and set its `API` service binding to
70
+ the exact installed API Worker name. Keep its public hostname separate from
71
+ every human/API hostname covered by Access.
72
+ 3. Deploy it from the repository root:
73
+
74
+ ```sh
75
+ vp run --filter @voidcloud/api deploy:github-webhook-ingress --env production
76
+ ```
77
+
78
+ Use `--env staging` for the staging entries in the same config.
79
+
80
+ 4. In the Cloudflare dashboard, add encrypted Worker secrets. Set the GitHub
81
+ App's existing `GITHUB_WEBHOOK_SECRET` on both the API and ingress Workers.
82
+ Generate a separate high-entropy value, such as `openssl rand -base64 32`,
83
+ and set it as `GITHUB_WEBHOOK_INGRESS_SECRET` on both Workers. Do not reuse a
84
+ platform management, JWT, Access, or GitHub webhook credential for that value.
85
+ 5. In the GitHub App settings, keep **Content type** set to `application/json`,
86
+ keep the same webhook secret, and change **Webhook URL** to the isolated
87
+ ingress URL ending in `/github`. Use GitHub's test delivery and confirm a 2xx
88
+ response before relying on push builds.
89
+
90
+ The ingress has no login, dashboard, project, operator, proxy, or arbitrary
91
+ forwarding route. It does not make the GitHub integration part of the core
92
+ installer, provision build executors, create a GitHub App, configure Cloudflare
93
+ Access, or manage either Worker's secrets. Its body limit is 25 MiB, based on
94
+ GitHub's [documented 25 MB webhook payload cap](https://docs.github.com/en/webhooks/webhook-events-and-payloads#payload-cap);
95
+ malformed or larger deliveries are rejected before event processing.
96
+
97
+ ## Deploying Source Builds from CI
98
+
99
+ Build `@void/platform` from your checkout and pass its runtime directory to `install`, `upgrade`, `repair`, `enable`, or `rollback` with `--runtime`. Custom runtimes get the same integrity, migration, health, and rollback checks as packaged releases.
100
+
101
+ Void records the runtime's manifest digest, whether it was packaged or custom, and its source revision. A build from a Git checkout automatically records `HEAD`, or `<HEAD>-dirty` when the checkout has uncommitted files. Build systems can set `VOID_PLATFORM_SOURCE_REVISION` to override automatic detection.
102
+
103
+ A fresh CI runner can discover the installation each time. Set `CLOUDFLARE_API_TOKEN` and `VOID_PLATFORM_DATABASE_URL` through its protected environment, then:
104
+
105
+ ::: details CI commands and recovery inputs
106
+
107
+ ```sh
108
+ vp run build:core
109
+
110
+ export VOID_PLATFORM_REGISTRY_DIR="$RUNNER_TEMP/void-platform-registry"
111
+ export VOID_PLATFORM_RECOVERY_KEY="$(openssl rand -base64 32)"
112
+ node packages/void/dist/cli/cli.mjs platform discover --account "$CLOUDFLARE_ACCOUNT_ID" \
113
+ --installation "$VOID_PLATFORM_INSTALLATION"
114
+ node packages/void/dist/cli/cli.mjs platform upgrade "$VOID_PLATFORM_INSTALLATION" \
115
+ --runtime packages/platform/dist/runtime --plan
116
+ node packages/void/dist/cli/cli.mjs platform upgrade "$VOID_PLATFORM_INSTALLATION" \
117
+ --runtime packages/platform/dist/runtime --yes
118
+ ```
119
+
120
+ Omit the installation selector only if the account has one discoverable installation. Run one deployment per installation at a time, and let it finish before starting the next. Cancelling during migrations or Worker rollout can leave an installation waiting for recovery.
121
+
122
+ Keep the management token, database URL, JWT signing secret, email signing secret for email-enabled installations, and complete project-encryption keyring in a protected CI environment. Upgrades inherit deployed Worker secrets. The original values are needed when recreating a missing Worker; configuration credentials are also needed when explicitly rotating them.
123
+
124
+ :::
@@ -0,0 +1,95 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # Schema and CI
6
+
7
+ ## Changing the Platform Schema
8
+
9
+ The schema lives in `platform/packages/api/src/schema.ts`. Generate a migration after changing it:
10
+
11
+ ```sh
12
+ vp run --filter @voidcloud/api db:generate
13
+ ```
14
+
15
+ Review the generated SQL and migration journal before committing them. Released migrations are append-only. An upgrade applies new migrations while the previous Workers may still serve requests, so schema changes must remain compatible with that code.
16
+
17
+ `platform/packages/api/drizzle/compatibility.json` records which earlier runtimes have been verified against the new schema. Add an edge only after testing that compatibility. The runtime build checks that the migration files and recorded schema history agree. See `packages/platform/README.md` for the manifest contract.
18
+
19
+ ## CI in a Fork
20
+
21
+ The uncredentialed test workflows use GitHub-hosted runners in forks. They build and test the workspace without requiring Void Cloud accounts, tokens, or deployment access.
22
+
23
+ If your fork has a released platform version, set the repository variable
24
+ `VOID_PLATFORM_PRODUCTION_REF` to its immutable 40-character commit SHA. Platform
25
+ pull requests then create that version's database, seed representative user,
26
+ project, and encrypted-secret records, and apply the proposed migrations. The
27
+ check verifies existing data and runs the previous runtime against the upgraded
28
+ schema. Mutable branch or tag names are rejected.
29
+
30
+ Without an explicit SHA, required compatibility checks use the latest successful
31
+ GitHub deployment to `Prod` (or `VOID_PLATFORM_PRODUCTION_ENV`). They require
32
+ read access to deployment history and stop if no completed deployment is found.
33
+ Advancing the production branch does not change the selected baseline. Fork
34
+ workflows that call platform CI must grant `deployments: read` alongside
35
+ `contents: read`.
36
+
37
+ The upstream repository also contains workflows for deploying Void Cloud and publishing the official npm packages. Forks should configure their own release workflow around the built CLI and `platform upgrade --runtime`; the [source-build CI example](/guide/platform/development/runtime#deploying-source-builds-from-ci) shows the required inputs. Keep production credentials in protected environments restricted to the appropriate release refs.
38
+
39
+ Public releases use matching versions for the CLI, scaffolder, adapters, and
40
+ packaged platform. The publish workflow rejects mismatched versions and previously
41
+ unpublished `void` versions that npm cannot reuse. Stable versions use `latest`;
42
+ prereleases use their named channel, such as `beta` or `rc`. Numeric prereleases
43
+ use `next`. The scaffolder installs its exact matching CLI version, so
44
+ `create-void@beta` cannot silently select the stable CLI. Packaged platform
45
+ runtimes record the release commit as their source revision.
46
+
47
+ The npm release job uses [trusted publishing](https://docs.npmjs.com/trusted-publishers/)
48
+ from GitHub-hosted runners, with `id-token: write` and no stored npm publishing
49
+ token. Configure a trusted publisher for each public package using this
50
+ repository, `publish.yml`, and the `Release` environment, allowing direct
51
+ `npm publish`. A brand-new package
52
+ needs an initial authenticated publication before its trusted publisher can be
53
+ configured; subsequent releases use OIDC.
54
+
55
+ The managed build fallback CLI also derives its version from
56
+ `packages/void/package.json`; there are no separate version pins to update.
57
+ Build its image from the repository root with
58
+ `docker build --file platform/packages/api/container/Dockerfile .`.
59
+ The root `.dockerignore` limits that build context to the agent, Dockerfile,
60
+ and public SDK manifest.
61
+
62
+ Publishing requires both SDK CI and platform CI, including the platform unit and
63
+ API integration suites. Release tags also run the Windows SDK checks; a passing
64
+ SDK-only build cannot publish a changed control plane.
65
+
66
+ ### Retrying a Release
67
+
68
+ To retry a failed release without moving an existing tag, add `+retry.N` to a
69
+ new Git tag, with `N` starting at `1`. Keep the package versions unchanged:
70
+
71
+ | Git tag | Package version | npm channel |
72
+ | ------------------------ | --------------- | ----------- |
73
+ | `v0.21.0` | `0.21.0` | `latest` |
74
+ | `v0.21.0+retry.1` | `0.21.0` | `latest` |
75
+ | `v0.21.0-beta.1+retry.2` | `0.21.0-beta.1` | `beta` |
76
+
77
+ For example, when the packages are at `0.21.0`, commit the release fix and tag
78
+ that commit:
79
+
80
+ ```sh
81
+ git tag -a 'v0.21.0+retry.1' -m 'Retry 0.21.0 publication.'
82
+ git push origin 'refs/tags/v0.21.0+retry.1'
83
+ ```
84
+
85
+ The retry suffix belongs only in the Git tag, not in `package.json`. A `-1`
86
+ suffix is a distinct prerelease version, not a retry. Tag and package versions
87
+ are checked before dependency installation and the full CI jobs; retries still
88
+ run the normal release checks.
89
+
90
+ Retries publish only package versions that are still missing from npm. They
91
+ cannot replace an already-published version. If an earlier attempt partially
92
+ published the release and you changed its package contents, bump the version
93
+ instead of combining different contents under the same version.
94
+
95
+ For implementation history, use the design archive at `platform/meta/design-docs/README.md`. Its proposals explain earlier decisions; the source and current guides define the supported behavior.
@@ -0,0 +1,58 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # Install from CI
6
+
7
+ For your first installation, follow the [interactive setup](/guide/platform/installation/setup). Use this page when automating a configured installation.
8
+
9
+ ::: details Non-interactive inputs
10
+
11
+ Inject the following values from protected CI secrets. Do not commit them in a workflow or a plaintext secrets file.
12
+
13
+ | Environment variable | Value from the interactive setup |
14
+ | -------------------------------------------- | ------------------------------------------------------------------------------------------- |
15
+ | `CLOUDFLARE_API_TOKEN` | Management API token |
16
+ | `VOID_PLATFORM_RUNTIME_CLOUDFLARE_API_TOKEN` | Runtime API token |
17
+ | `VOID_PLATFORM_DATABASE_URL` | Dedicated PostgreSQL URL |
18
+ | `VOID_PLATFORM_HYPERDRIVE_ID` | Existing externally managed Hyperdrive ID, when applicable |
19
+ | `VOID_PLATFORM_HYPERDRIVE_ORIGIN_HOST` | Origin host of that Hyperdrive; set with its ID and user |
20
+ | `VOID_PLATFORM_HYPERDRIVE_ORIGIN_USER` | Runtime database user of that Hyperdrive; set with its ID and host |
21
+ | `VOID_PLATFORM_R2_ACCESS_KEY_ID` | R2 Access Key ID |
22
+ | `VOID_PLATFORM_R2_SECRET_ACCESS_KEY` | R2 Secret Access Key |
23
+ | `VOID_PLATFORM_JWT_SECRET` | Original JWT signing secret |
24
+ | `VOID_PLATFORM_EMAIL_SIGNING_SECRET` | Dedicated email signing secret when email is enabled |
25
+ | `VOID_PLATFORM_PROJECT_SECRET_KEY` | Original base64-encoded project-encryption key |
26
+ | `VOID_PLATFORM_RECOVERY_KEY` | Base64-encoded 32-byte key for local encrypted recovery state when no keychain is available |
27
+ | `VOID_EMAIL_SENDER_DOMAIN` | Optional shared mail domain; requires `VOID_EMAIL_SHARED_ZONE_ID` |
28
+ | `VOID_EMAIL_SHARED_ZONE_ID` | Cloudflare zone ID for that mail domain; requires `VOID_EMAIL_SENDER_DOMAIN` |
29
+
30
+ For the default GitHub-only login, also set `VOID_PLATFORM_GITHUB_CLIENT_ID`,
31
+ `VOID_PLATFORM_GITHUB_CLIENT_SECRET`, and `VOID_PLATFORM_ADMIN_GITHUB_LOGIN`.
32
+ For Google, OIDC, or Access login, pass `--auth-config <path>` using the
33
+ [configuration format](/guide/platform/installation/setup#choose-login-methods).
34
+ Inject each `clientSecretEnv` named in that file from your CI secret manager.
35
+ Automatic Access protection may also need `VOID_PLATFORM_ACCESS_SETUP_TOKEN`
36
+ with the [setup permissions](/guide/platform/installation/setup#cloudflare-access).
37
+
38
+ Use that installation's saved signing and encryption keys on every resume or repair that needs them. After a keyring rotation, use the [complete keyring recovery inputs](/guide/platform/installation/maintenance#manage-an-installation-from-another-machine). The database claim and tables remain after uninstall; use a fresh database for a different installation.
39
+
40
+ Set both email values to enable email during install or upgrade. Later upgrades reuse the recorded values. If an email-enabled installation has no recorded values, supply both before upgrading.
41
+
42
+ ```sh
43
+ void platform install \
44
+ --name team \
45
+ --display-name "Team Void" \
46
+ --account <account-id> \
47
+ --application-domain example.app \
48
+ --zone example.app \
49
+ --yes
50
+ ```
51
+
52
+ Mutations require `--yes` in CI; a read-only `--plan` does not. Custom runtimes also require `--runtime <directory>`. For a new installation, run `--plan` with the same account, name, and domain options as the unattended install. If you use `--auth-config`, pass the same file to both commands. Register the printed callback when creating a login provider's OAuth or OIDC client manually; automatic Access setup manages its own application. A custom API hostname is optional.
53
+
54
+ :::
55
+
56
+ ## Customize the Platform
57
+
58
+ To change the platform's implementation or deploy your own build, follow [Platform Development](/guide/platform-development). It covers local development, source builds, and CI for a fork.
@@ -0,0 +1,90 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # Credentials
6
+
7
+ Keep one password-manager entry for this platform. Paste the saved values into the installer when asked; most do not need shell environment variables.
8
+
9
+ ## Cloudflare API Tokens {#runtime-token-permissions}
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.
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.
14
+
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.
16
+
17
+ 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
+
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/).
20
+
21
+ ::: details Permissions to select for each token
22
+
23
+ Use the following permissions for the core platform. Cloudflare may label write access as **Edit** or **Write**, depending on the token screen; see its [permission reference](https://developers.cloudflare.com/fundamentals/api/reference/permissions/).
24
+
25
+ | Scope | Permission | Management | Runtime |
26
+ | ------- | ------------------ | ---------- | --------------------------------------- |
27
+ | Account | Account Settings | Read | Read |
28
+ | Account | Workers Scripts | Edit | Edit |
29
+ | Account | Workers Tail | Read | Read |
30
+ | Account | D1 | Edit | Edit |
31
+ | Account | Workers KV Storage | Edit | Edit |
32
+ | Account | Workers R2 Storage | Edit | Edit |
33
+ | Account | Queues | Edit | Edit |
34
+ | Account | Hyperdrive | Write | Write |
35
+ | Account | Account Analytics | Read | Read |
36
+ | Account | AI Gateway | Edit | Edit when installing with browser login |
37
+ | Zone | Zone | Read | — |
38
+ | Zone | DNS | Edit | — |
39
+ | Zone | Workers Routes | Edit | — |
40
+ | Zone | Cache Purge | — | Purge |
41
+
42
+ 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
+
44
+ Void checks access before provisioning. If it reports a missing permission, update the token's permissions for the selected account or zone and retry.
45
+
46
+ :::
47
+
48
+ ## Enable Email {#enable-email}
49
+
50
+ Choose a shared sender domain and its Cloudflare zone ID. The mail zone may differ from the application zone, but it must belong to the platform's Cloudflare account. To enable email on an existing installation, run:
51
+
52
+ ```sh
53
+ VOID_EMAIL_SENDER_DOMAIN=mail.example.com \
54
+ VOID_EMAIL_SHARED_ZONE_ID=your-zone-id \
55
+ void platform upgrade your-installation-id
56
+ ```
57
+
58
+ 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
+
60
+ 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
+
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>`.
63
+
64
+ ## R2 Upload Credentials
65
+
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/).
67
+
68
+ ## Signing and Encryption Keys {#signing-and-encryption-keys}
69
+
70
+ The **JWT signing key** signs platform login tokens. The **Project encryption key** encrypts app secrets stored by your platform. Generate a separate key for each by running this command twice:
71
+
72
+ ```sh
73
+ openssl rand -base64 32
74
+ ```
75
+
76
+ Save each result in your password manager, then paste it into the corresponding installer prompt. The command generates 32 random bytes encoded as base64, suitable for either field. Keep the two original keys for recovery; do not regenerate them when resuming or upgrading.
77
+
78
+ ::: details Generate the keys without printing them to your terminal
79
+
80
+ On macOS, this copies a suitable random value to the clipboard:
81
+
82
+ ```sh
83
+ openssl rand -base64 32 | pbcopy
84
+ ```
85
+
86
+ Paste it into your password manager as **JWT signing key**. Run the command again and save the second value as **Project encryption key**. On PowerShell, use `Set-Clipboard` instead of `pbcopy`. If OpenSSL is unavailable, use your secret manager's secure generator for 32 random bytes in base64, or `node -e 'process.stdout.write(require("node:crypto").randomBytes(32).toString("base64"))'`.
87
+
88
+ :::
89
+
90
+ When email is enabled, Void also creates an independent **Email signing key** for confirmation links and service-to-service email requests. The installer keeps it in encrypted recovery state. Set `VOID_PLATFORM_EMAIL_SIGNING_SECRET` to a separate value of at least 32 random bytes when you need an externally custodied copy, including a headless installation whose local recovery files will not persist.
@@ -0,0 +1,68 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # Domains and Resources
6
+
7
+ ## Adding a Domain
8
+
9
+ When your domain is ready, run:
10
+
11
+ ```sh
12
+ void platform domain set example.app --plan
13
+ void platform domain set example.app
14
+ ```
15
+
16
+ The command selects your installed platform (or offers a picker), finds or creates its zone, sets up DNS and routing, and verifies HTTPS before publishing the new application URLs. Set the management token as described in [installation setup](/guide/platform/installation/setup) when creating DNS or a zone. Grant the existing runtime token **Cache Purge: Purge** on the new zone; Void checks that permission through the running platform without asking you to paste its token again.
17
+
18
+ If nameservers or certificates are pending, follow the printed guidance and rerun the same command. Your workers.dev app URLs continue working during and after setup. Projects, deployments, secrets, and the platform API URL stay the same, so developers do not reconnect and configured login callbacks do not change. DNS and configuration changes may take time to propagate.
19
+
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
+
22
+ 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
+
24
+ ### What Changes in Testing Mode?
25
+
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.
27
+
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.
29
+
30
+ ## Other Domain Options
31
+
32
+ ::: details Custom API hostname
33
+
34
+ Pass `--control-plane-domain platform.example.net` during installation. The hostname must belong to a zone the selected account and management token can manage. Omitting it keeps the API on `workers.dev`.
35
+
36
+ :::
37
+
38
+ ### Using a Nested Application Domain
39
+
40
+ ::: details Use apps.example.com within an existing company zone
41
+
42
+ An app at `my-app.apps.example.com` needs a certificate for `*.apps.example.com`. Universal SSL for `example.com` only covers first-level hostnames. Configure an active wildcard certificate with [Advanced Certificate Manager](https://developers.cloudflare.com/ssl/edge-certificates/advanced-certificate-manager/), a paid add-on, or use an existing custom wildcard certificate before installation:
43
+
44
+ ```sh
45
+ void platform install --application-domain apps.example.com --zone example.com --plan
46
+ ```
47
+
48
+ The management token needs **SSL and Certificates: Read** (or Edit) on that zone for the certificate check. Void does not order certificates or enable paid products automatically. Leave `--dedicated-zone` off: that flag is only for installations whose application domain is the entire zone and adds catch-all routes for otherwise unmatched traffic.
49
+
50
+ :::
51
+
52
+ ## Cloudflare footprint
53
+
54
+ 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.
55
+
56
+ | Resource | Count | Purpose |
57
+ | ----------------------------------------- | ------------------------------------: | --------------------------------------------------------------------------------------------- |
58
+ | Workers | 5, plus one per app using workers.dev | API/control plane, proxy, tail ingestion, dispatch, email gateway, and test-origin forwarders |
59
+ | KV namespaces | 3 | Routing, ISR cache, and static asset storage |
60
+ | R2 buckets | 1 | Static and deployment assets |
61
+ | Queues | 2 | Usage events and cron firing |
62
+ | Workers for Platforms dispatch namespaces | 1 | User application Workers |
63
+ | Hyperdrive configurations | 1 | External platform PostgreSQL |
64
+ | AI Gateways | 1 | Installation-isolated AI routing and metering |
65
+ | Proxied wildcard DNS records | 0 or 1 | Created only when an application domain is configured |
66
+ | Zones | 0 or 1 | Created only when the requested application zone is absent |
67
+
68
+ The API Worker uses four Durable Object classes for usage, cron scheduling, error monitoring, and concurrency. Worker bindings create the request and log datasets in Analytics Engine. The core installation doesn't create Container applications, a GitHub App, a dashboard Worker, or build Workers.