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.
- package/AGENTS_TEMPLATE.md +1 -1
- package/README.md +5 -1
- package/dist/{account-cmd-CjyxcGkM.mjs → account-cmd-vJhh5lrb.mjs} +5 -5
- package/dist/{scan-ClYmX3sa.mjs → application-analysis-BVsVqc11.mjs} +135 -18
- package/dist/application-routing-B7QEjqSR.mjs +27 -0
- package/dist/{auth-DLNN0D3Z.mjs → auth-CQkSDS50.mjs} +26 -96
- package/dist/auth-DX3JURcX.mjs +2 -0
- package/dist/{auth-link-BLO4ptzo.mjs → auth-link-D75t9wO2.mjs} +5 -5
- package/dist/{auth-router-ZUg9MF_U.mjs → auth-router-ClfhL1J7.mjs} +7 -7
- package/dist/{better-auth-shared-rsBGBvWJ.mjs → better-auth-shared-hy6RPh9W.mjs} +13 -2
- package/dist/{build-cmd-BxR5FROK.mjs → build-cmd-zMi1iFnS.mjs} +21 -9
- package/dist/{cache-D0sWhgKI.mjs → cache-ZtQmyxVV.mjs} +5 -5
- package/dist/{cancel-deploy-D4NUqFbi.mjs → cancel-deploy-Box0kkEV.mjs} +5 -5
- package/dist/{cf-access-P0iZnu0q.mjs → cf-access-BGe5sWXF.mjs} +4 -48
- package/dist/{cf-access-DRsQRe6k.mjs → cf-access-TWNzXltp.mjs} +3 -11
- package/dist/{cf-build-output-BJ6yGEIS.mjs → cf-build-output-BPqOT964.mjs} +2 -1
- package/dist/cf-build-output-_0HNWysu.mjs +2 -0
- package/dist/cli/cli.mjs +89 -461
- package/dist/cli/{cf-compat.mjs → cloudflare-operation-process.mjs} +454 -424
- package/dist/cli/env-schema-probe.d.mts +2 -1
- package/dist/cli/env-schema-probe.mjs +4 -4
- package/dist/client-B9UBI03V.mjs +2 -0
- package/dist/{client-BTZ3XkrB.mjs → client-DKAsFA4X.mjs} +161 -24
- package/dist/{cloudflare-auth-DQkqoMYa.mjs → cloudflare-auth-Qdc7tw8F.mjs} +41 -38
- package/dist/{cloudflare-cmd-BKlfGHAy.mjs → cloudflare-cmd-CmY8dGkd.mjs} +6 -6
- package/dist/cloudflare-config-Bktvwtpf.mjs +182 -0
- package/dist/{cloudflare-connect-Ctmrw579.mjs → cloudflare-connect-IiR3ZieC.mjs} +4 -4
- package/dist/{cloudflare-operations-BT6OWFBk.mjs → cloudflare-operations-BCdXSsmo.mjs} +1 -1
- package/dist/{cloudflare-operations-B9tzgjmf.mjs → cloudflare-operations-DzH-A966.mjs} +116 -172
- package/dist/{preset-UHj9ARyP.mjs → cloudflare-process-B-wekeR6.mjs} +93 -6
- package/dist/{config-VavjpDnp.d.mts → config-BMHb8RCj.d.mts} +1 -0
- package/dist/config-C_XRIPx2.mjs +89 -0
- package/dist/config-entry.d.mts +1 -1
- package/dist/{connect-Dg-WkW-C.mjs → connect-B-usTnlF.mjs} +9 -9
- package/dist/{create-project-l9J7pbtm.mjs → create-project-CYOOAYcn.mjs} +12 -12
- package/dist/{create-project-DdoqwFLF.mjs → create-project-FWbf5Olo.mjs} +1 -1
- package/dist/{db-gp2sCXyN.mjs → db-Ck2eZ2iB.mjs} +26 -26
- package/dist/{delete-TTedbH6B.mjs → delete-sK56qtzZ.mjs} +5 -5
- package/dist/{deploy-CH-o2CaZ.mjs → deploy-gCVaiJbS.mjs} +984 -616
- package/dist/{deploy-B19L2Bra.mjs → deploy-irP5q0-x.mjs} +1 -1
- package/dist/{domain-JRF59P_r.mjs → domain-DFfQE8jg.mjs} +6 -6
- package/dist/{email-Bo6G9LOZ.mjs → email-CdnhUHvJ.mjs} +15 -30
- package/dist/{env-BYOrWQnv.mjs → env-DmGdHi5i.mjs} +8 -8
- package/dist/{env-public-BxU_0yTL.d.mts → env-public-BX_r8HR6.d.mts} +1 -1
- package/dist/{env-types-C2_bIk_b.mjs → env-types-D5kds_OZ.mjs} +1 -1
- package/dist/{env-validation-BB4GkLxn.mjs → env-validation-C_8tPdhs.mjs} +20 -73
- package/dist/{env-validation-BXge7uyK.mjs → env-validation-zZOCcQVZ.mjs} +1 -1
- package/dist/{fetch-CXDChK7B.mjs → fetch-BIZJh7vR.mjs} +2 -2
- package/dist/{fetch-stream-AOByI7Ki.mjs → fetch-stream-IvCYKyQL.mjs} +24 -4
- package/dist/{gen-sCtlCOdA.mjs → gen-CshAkukR.mjs} +4 -4
- package/dist/gen-DvQTWzDU.mjs +2 -0
- package/dist/{github-cmd-0-7PexDq.mjs → github-cmd-DftuEvIt.mjs} +13 -13
- package/dist/{handler-HEcZsaij.d.mts → handler-CZ4nAylQ.d.mts} +1 -1
- package/dist/{headers-DWi2IXWx.mjs → headers-2rKda9Y6.mjs} +1 -1
- package/dist/{help-GKtwl07I.mjs → help-Dotbf6iz.mjs} +236 -750
- package/dist/help-mabuIV98.mjs +2 -0
- package/dist/{inbound-aVHEUhKo.mjs → inbound-fRkqcXaC.mjs} +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +299 -1517
- package/dist/info-B97bTX9N.mjs +113 -0
- package/dist/{init-FZx3Elvz.mjs → init-BTQEZZGJ.mjs} +61 -27
- package/dist/limits-Bq5LG8Id.d.mts +27 -0
- package/dist/limits-Cjuk2VPm.mjs +68 -0
- package/dist/{link-BrQfb_CU.mjs → link-B46sYH0K.mjs} +6 -6
- package/dist/{list-D44jmIAM.mjs → list-BnPrIsU_.mjs} +6 -6
- package/dist/{live-CKJlvlNp.d.mts → live-Chw1eIMv.d.mts} +1 -1
- package/dist/{local-d1-Bg9OzEEO.mjs → local-d1-2CMnpuW_.mjs} +2 -2
- package/dist/log-vqY3pqwI.mjs +29 -0
- package/dist/{login-CAsAsQ-_.mjs → login-BuiMyUrx.mjs} +8 -8
- package/dist/login-DIy9Sb-U.mjs +2 -0
- package/dist/{logs-BjKvFnVM.mjs → logs-CZG9d-ic.mjs} +10 -11
- package/dist/migrate-BCiJ8w0f.mjs +2 -0
- package/dist/{migrate-BPITvDJN.mjs → migrate-q4_njtaW.mjs} +4 -3
- package/dist/{node-Dt7z256D.mjs → node-BkyRWRx8.mjs} +1 -1
- package/dist/operator-args-B3BTmSoi.mjs +697 -0
- package/dist/{operator-auth-8KnOVXVd.mjs → operator-auth-7erYc6Lt.mjs} +2 -2
- package/dist/{operator-client-DUwumHpQ.mjs → operator-client-CpHjTd0t.mjs} +3 -3
- package/dist/{operator-cmd-BK5CCiT9.mjs → operator-cmd-DGqPJUD3.mjs} +70 -24
- package/dist/{output-Dm_A4Tbv.mjs → output-CbM85T4k.mjs} +18 -10
- package/dist/pages/client.d.mts +34 -2
- package/dist/pages/client.mjs +59 -3
- package/dist/pages/index.d.mts +1 -1
- package/dist/pages/index.mjs +2 -2
- package/dist/pages/islands-plugin.mjs +1 -1
- package/dist/pages/protocol.d.mts +2 -2
- package/dist/pages/protocol.mjs +2 -308
- package/dist/{parse-filename-DioPHiR9.mjs → parse-filename-CUbj-1MP.mjs} +35 -1
- package/dist/plan-D1Q5rf-r.mjs +2 -0
- package/dist/plan-NPpwZ_kc.mjs +58 -0
- package/dist/platform-args-3k8X9-H_.mjs +514 -0
- package/dist/platform-args-DdnM6WIf.mjs +2 -0
- package/dist/{platform-auth-config-BlN8xTdD.mjs → platform-auth-config-DDrxUy4m.mjs} +6 -6
- package/dist/{platform-auth-protection-7d5aV2Jg.mjs → platform-auth-protection-BLadnnct.mjs} +8 -8
- package/dist/{platform-auth-recovery-Dxij8ZbR.mjs → platform-auth-recovery-CmCzX2Fl.mjs} +6 -6
- package/dist/{platform-cmd-B3hwKrFK.mjs → platform-cmd-DMDEc9uS.mjs} +29 -8
- package/dist/{platform-cmd-E0FuL212.mjs → platform-cmd-pMTRhvYs.mjs} +1 -1
- package/dist/{platform-domain-D6Xcy9ZX.mjs → platform-domain-Di6EYrQl.mjs} +5 -5
- package/dist/{platform-lifecycle-k0E0xoxx.mjs → platform-lifecycle-BBoNzojY.mjs} +1541 -572
- package/dist/{platform-lifecycle-DMh_qrry.mjs → platform-lifecycle-BFdSi9Qt.mjs} +1 -1
- package/dist/{platform-management-Brz_BDiT.mjs → platform-management-CWOQOWXm.mjs} +10 -7
- package/dist/{platform-management-DOtss0BN.mjs → platform-management-DG47jys8.mjs} +1 -1
- package/dist/platform-plans-config-Vl9BP3H4.mjs +359 -0
- package/dist/{platform-recovery-BvtcXON5.mjs → platform-recovery-BJnQJEtQ.mjs} +4 -4
- package/dist/{platform-registry-QBa4DK32.mjs → platform-registry-DkPPXfp_.mjs} +2 -2
- package/dist/{plugin-inference-BMfKRSqE.mjs → plugin-inference-CXWnn79A.mjs} +174 -64
- package/dist/{prepare-C-6YZyyg.mjs → prepare-CBLT3CHH.mjs} +3 -3
- package/dist/prepare-CnjcTV2s.mjs +2 -0
- package/dist/{prepare-CRhJbVrG.mjs → prepare-DnaKBi--.mjs} +5 -21
- package/dist/{project-C0Fqu05O.mjs → project-DKG5Ra8p.mjs} +15 -82
- package/dist/project-DsblYifa.mjs +2 -0
- package/dist/{project-cmd-BZLCqOqw.mjs → project-cmd-DxnXstAq.mjs} +19 -19
- package/dist/{project-team-BvgM0WoX.mjs → project-team-BmHcaALJ.mjs} +5 -5
- package/dist/{project-token-l5DqK6Az.mjs → project-token-GionZlBI.mjs} +5 -5
- package/dist/{project-zero-trust-v6Mvpp8y.mjs → project-zero-trust-JLCjVQA7.mjs} +5 -5
- package/dist/prompts-2TGE6oXx.mjs +2 -0
- package/dist/prompts-BNUoTiaf.mjs +2044 -0
- package/dist/{protocol-BBa6cstI.d.mts → protocol-CjF_iI9X.d.mts} +2 -2
- package/dist/protocol-U7bfjHmA.mjs +331 -0
- package/dist/{provision-Fr9pRqce.mjs → provision-CVku1JFU.mjs} +1 -1
- package/dist/{provision-C4IGqkBf.mjs → provision-CaoxO_U7.mjs} +90 -199
- package/dist/{requests-DN-BbNiM.mjs → requests-BOjIVAeF.mjs} +5 -5
- package/dist/resource-name-C7LVpcRm.mjs +11 -0
- package/dist/{rollback-D7rzSaZM.mjs → rollback-CwR3pLj3.mjs} +6 -6
- package/dist/route-url-CG7U-cRN.mjs +15 -0
- package/dist/{runner-B8wXwWlo.mjs → runner-CXA9Fh8h.mjs} +1 -1
- package/dist/{runner-p-dMs2UN.mjs → runner-Ol0TNjk6.mjs} +2 -2
- package/dist/runtime/ai.d.mts +12 -8
- package/dist/runtime/ai.mjs +87 -22
- package/dist/runtime/better-auth-mysql.mjs +1 -1
- package/dist/runtime/better-auth-pg.mjs +1 -1
- package/dist/runtime/better-auth.mjs +1 -1
- package/dist/runtime/client-react.mjs +2 -2
- package/dist/runtime/client-solid.mjs +2 -2
- package/dist/runtime/client-svelte.mjs +2 -2
- package/dist/runtime/client-vue.mjs +2 -2
- package/dist/runtime/client.mjs +2 -2
- package/dist/runtime/durable.d.mts +3 -1
- package/dist/runtime/durable.mjs +4 -1
- package/dist/runtime/email/testing.mjs +2 -2
- package/dist/runtime/email.mjs +1 -1
- package/dist/runtime/env-public.d.mts +1 -1
- package/dist/runtime/fetch-stream.mjs +1 -1
- package/dist/runtime/fetch.mjs +1 -1
- package/dist/runtime/handler.d.mts +1 -1
- package/dist/runtime/kv.mjs +0 -1
- package/dist/runtime/limits.d.mts +2 -0
- package/dist/runtime/limits.mjs +2 -0
- package/dist/runtime/live-client.d.mts +1 -1
- package/dist/runtime/live-server.mjs +25 -16
- package/dist/runtime/live.d.mts +1 -1
- package/dist/runtime/migration-handler.mjs +62 -42
- package/dist/runtime/remote/index.mjs +2 -2
- package/dist/runtime/route-url.d.mts +4 -0
- package/dist/runtime/route-url.mjs +2 -0
- package/dist/runtime/routing.d.mts +180 -0
- package/dist/runtime/routing.mjs +1082 -0
- package/dist/runtime/sandbox-container.d.mts +1 -1
- package/dist/runtime/sandbox-container.mjs +1 -1
- package/dist/runtime/sandbox.d.mts +3 -3
- package/dist/runtime/sandbox.mjs +75 -45
- package/dist/runtime/sse.mjs +1 -1
- package/dist/runtime/validator.d.mts +1 -1
- package/dist/runtime/ws-server.d.mts +4 -2
- package/dist/runtime/ws-server.mjs +27 -2
- package/dist/runtime/ws.d.mts +2 -2
- package/dist/runtime/ws.mjs +8 -6
- package/dist/{sandbox-qpNBT8a3.d.mts → sandbox-XZAqzFlG.d.mts} +11 -8
- package/dist/{sandbox-container-DdNEBfCc.d.mts → sandbox-container-Bo0eiFKz.d.mts} +2 -1
- package/dist/{sandbox-container-4fdqLnyb.mjs → sandbox-container-C6ItmVuN.mjs} +4 -2
- package/dist/{scan-4tfN-PSn.mjs → scan-C7okrLyM.mjs} +4 -35
- package/dist/{secret-BOtOl_cb.mjs → secret-ByWJWBUG.mjs} +7 -7
- package/dist/{skills-D1II1Juz.mjs → skills-C1PlclPt.mjs} +1 -1
- package/dist/{sse-BaC1jXko.mjs → sse-CQNaDFFV.mjs} +6 -3
- package/dist/{subcommand-prompt-CY1C4fvl.mjs → subcommand-prompt-klFCfcor.mjs} +40 -32
- package/dist/validate-Dq_L3s0S.mjs +2 -0
- package/dist/{validate-CIUwFpjB.mjs → validate-ctOrgiS3.mjs} +2 -1
- package/dist/{wrangler-DQF1vKyf.mjs → wrangler-7K-bW_DL.mjs} +8 -239
- package/dist/{ws-BoY7vQML.d.mts → ws-CL1w7GXU.d.mts} +13 -2
- package/package.json +16 -10
- package/skills/migrate-vite-cloudflare-to-void/SKILL.md +34 -157
- package/skills/void/SKILL.md +55 -135
- package/skills/void/docs/guide/ai.md +94 -84
- package/skills/void/docs/guide/app-types.md +3 -32
- package/skills/void/docs/guide/auth.md +12 -116
- package/skills/void/docs/guide/database/d1.md +9 -54
- package/skills/void/docs/guide/database/mysql.md +1 -1
- package/skills/void/docs/guide/database/postgresql.md +5 -26
- package/skills/void/docs/guide/database.md +23 -75
- package/skills/void/docs/guide/deployment.md +48 -112
- package/skills/void/docs/guide/durable-state.md +43 -18
- package/skills/void/docs/guide/edge/headers.md +4 -48
- package/skills/void/docs/guide/edge/prerendering.md +5 -20
- package/skills/void/docs/guide/edge/redirects.md +11 -64
- package/skills/void/docs/guide/edge/revalidation.md +5 -18
- package/skills/void/docs/guide/edge/rewrites.md +56 -284
- package/skills/void/docs/guide/edge/static-assets.md +22 -72
- package/skills/void/docs/guide/email/domains.md +116 -0
- package/skills/void/docs/guide/email/receiving.md +139 -0
- package/skills/void/docs/guide/email/sending.md +231 -0
- package/skills/void/docs/guide/email.md +13 -619
- package/skills/void/docs/guide/env-migration.md +11 -11
- package/skills/void/docs/guide/env-vars.md +9 -29
- package/skills/void/docs/guide/index.md +0 -15
- package/skills/void/docs/guide/jobs.md +3 -18
- package/skills/void/docs/guide/kv.md +5 -11
- package/skills/void/docs/guide/live.md +5 -56
- package/skills/void/docs/guide/pages-routing/actions-and-forms.md +78 -125
- package/skills/void/docs/guide/pages-routing/head.md +10 -10
- package/skills/void/docs/guide/pages-routing/islands.md +6 -36
- package/skills/void/docs/guide/pages-routing/layouts.md +6 -128
- package/skills/void/docs/guide/pages-routing/loaders.md +3 -19
- package/skills/void/docs/guide/pages-routing/markdown.md +13 -171
- package/skills/void/docs/guide/pages-routing/overview.md +7 -17
- package/skills/void/docs/guide/pages-routing/view-transitions.md +1 -1
- package/skills/void/docs/guide/platform/administration/access.md +1 -4
- package/skills/void/docs/guide/platform/administration/email.md +35 -8
- package/skills/void/docs/guide/platform/administration/operations.md +26 -4
- package/skills/void/docs/guide/platform/administration/plans.md +126 -0
- package/skills/void/docs/guide/platform/administration/projects.md +5 -2
- package/skills/void/docs/guide/platform/administration/zero-trust.md +49 -160
- package/skills/void/docs/guide/platform/development/runtime.md +3 -13
- package/skills/void/docs/guide/platform/development/schema-ci.md +0 -58
- package/skills/void/docs/guide/platform/installation/ci.md +1 -1
- package/skills/void/docs/guide/platform/installation/credentials.md +15 -6
- package/skills/void/docs/guide/platform/installation/domains.md +35 -2
- package/skills/void/docs/guide/platform/installation/first-deployment.md +4 -2
- package/skills/void/docs/guide/platform/installation/maintenance.md +15 -1
- package/skills/void/docs/guide/platform/installation/prerequisites.md +24 -18
- package/skills/void/docs/guide/platform/installation/setup.md +88 -14
- package/skills/void/docs/guide/platform-administration.md +1 -0
- package/skills/void/docs/guide/queues.md +7 -9
- package/skills/void/docs/guide/quickstart.md +38 -37
- package/skills/void/docs/guide/remote-dev.md +5 -10
- package/skills/void/docs/guide/sandboxes.md +29 -21
- package/skills/void/docs/guide/server-routing.md +9 -72
- package/skills/void/docs/guide/sse.md +4 -18
- package/skills/void/docs/guide/ssg.md +3 -15
- package/skills/void/docs/guide/ssr.md +14 -62
- package/skills/void/docs/guide/storage.md +9 -4
- package/skills/void/docs/guide/type-safety.md +3 -14
- package/skills/void/docs/guide/typed-fetch.md +3 -7
- package/skills/void/docs/guide/websockets.md +68 -40
- package/skills/void/docs/integrations/agents.md +3 -3
- package/skills/void/docs/integrations/cloudflare.md +85 -316
- package/skills/void/docs/integrations/frameworks/analog.md +5 -64
- package/skills/void/docs/integrations/frameworks/astro.md +4 -73
- package/skills/void/docs/integrations/frameworks/nuxt.md +5 -62
- package/skills/void/docs/integrations/frameworks/overview.md +11 -54
- package/skills/void/docs/integrations/frameworks/react-router.md +5 -60
- package/skills/void/docs/integrations/frameworks/sveltekit.md +6 -65
- package/skills/void/docs/integrations/frameworks/tanstack-start.md +4 -62
- package/skills/void/docs/integrations/nodejs-bun-deno.md +5 -69
- package/skills/void/docs/reference/api/auth.md +156 -0
- package/skills/void/docs/reference/api/client.md +87 -0
- package/skills/void/docs/reference/api/database.md +95 -0
- package/skills/void/docs/reference/api/durable.md +46 -0
- package/skills/void/docs/reference/api/env.md +50 -0
- package/skills/void/docs/reference/api/handlers.md +254 -0
- package/skills/void/docs/reference/api/pages.md +241 -0
- package/skills/void/docs/reference/api/plugin.md +39 -0
- package/skills/void/docs/reference/api/resources.md +109 -0
- package/skills/void/docs/reference/api/rewrites.md +76 -0
- package/skills/void/docs/reference/api/types.md +92 -0
- package/skills/void/docs/reference/api.md +56 -1218
- package/skills/void/docs/reference/cli/auth.md +89 -0
- package/skills/void/docs/reference/cli/database.md +128 -0
- package/skills/void/docs/reference/cli/deploy.md +105 -0
- package/skills/void/docs/reference/cli/domains.md +41 -0
- package/skills/void/docs/reference/cli/email.md +129 -0
- package/skills/void/docs/reference/cli/generate.md +116 -0
- package/skills/void/docs/reference/cli/github.md +189 -0
- package/skills/void/docs/reference/cli/platform-config.md +92 -0
- package/skills/void/docs/reference/cli/platform-email.md +81 -0
- package/skills/void/docs/reference/cli/platform-installation.md +142 -0
- package/skills/void/docs/reference/cli/platform-operations.md +90 -0
- package/skills/void/docs/reference/cli/platform-users.md +89 -0
- package/skills/void/docs/reference/cli/platform-zero-trust.md +59 -0
- package/skills/void/docs/reference/cli/platform.md +70 -0
- package/skills/void/docs/reference/cli/project.md +214 -0
- package/skills/void/docs/reference/cli/secrets.md +76 -0
- package/skills/void/docs/reference/cli/setup.md +70 -0
- package/skills/void/docs/reference/cli.md +32 -1682
- package/skills/void/docs/reference/config.md +12 -18
- package/skills/void/docs/reference/resource-inference.md +3 -58
- package/skills/void/docs/reference/structure.md +14 -41
- package/dist/auth-CZuiVsFh.mjs +0 -2
- package/dist/canonical-json-DuDiiUsQ.mjs +0 -13
- package/dist/client-Czz8o5jP.mjs +0 -2
- package/dist/dist-BuDuKZJv.mjs +0 -2
- package/dist/dist-CTBk70IR.mjs +0 -1310
- package/dist/gen-CNJ62MM7.mjs +0 -2
- package/dist/help-CmZzxUba.mjs +0 -2
- package/dist/log-ChfPKsVd.mjs +0 -26
- package/dist/login-CGcRKEoi.mjs +0 -2
- package/dist/migrate-CYfbKkXh.mjs +0 -2
- package/dist/plan-BEZ8VJW0.mjs +0 -256
- package/dist/plan-DpuOr14e.mjs +0 -2
- package/dist/prepare-Bm3iq-u4.mjs +0 -2
- package/dist/project-BuUwfj6f.mjs +0 -2
- package/dist/validate-EKmJWxmy.mjs +0 -2
- /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,
|
|
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
|
|
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.
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
35
|
-
|
|
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](
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
18
|
-
2. Open **
|
|
19
|
-
3.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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 **
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
117
|
+
Void provisions queues and connects their producers and consumers when you deploy.
|
|
120
118
|
|
|
121
119
|
## Local development
|
|
122
120
|
|