void 0.23.0 → 0.25.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 (169) hide show
  1. package/AGENTS_TEMPLATE.md +1 -1
  2. package/README.md +19 -106
  3. package/dist/{account-cmd-C84Ee8cO.mjs → account-cmd-DcR1ywt8.mjs} +5 -5
  4. package/dist/{auth-CSkdO2Bb.mjs → auth-7wuZ5ob8.mjs} +22 -49
  5. package/dist/auth-CdgZ9uag.mjs +2 -0
  6. package/dist/{auth-link-CioEg6uY.mjs → auth-link-Z6E5DYvM.mjs} +5 -6
  7. package/dist/{auth-router-BsR981d4.mjs → auth-router-BdM4avI8.mjs} +7 -7
  8. package/dist/{build-cmd-LzvNJORH.mjs → build-cmd-CEE7D-hM.mjs} +7 -8
  9. package/dist/{cache-C4MvnrMH.mjs → cache-TcZnBLtH.mjs} +6 -7
  10. package/dist/{cancel-deploy-abUxpP2n.mjs → cancel-deploy-CYoZmcmR.mjs} +4 -6
  11. package/dist/{cf-access-P0iZnu0q.mjs → cf-access-AHKBzmuu.mjs} +4 -48
  12. package/dist/{cf-access-DRsQRe6k.mjs → cf-access-TWNzXltp.mjs} +3 -11
  13. package/dist/cf-build-output-ChY6-XWP.mjs +2 -0
  14. package/dist/cli/cli.mjs +49 -46
  15. package/dist/cli/cloudflare-operation-process.mjs +16 -7
  16. package/dist/cli/env-schema-probe.mjs +3 -3
  17. package/dist/client-B4Me-9HE.mjs +2 -0
  18. package/dist/{client-RV8NVeB8.mjs → client-RsPo8wsP.mjs} +129 -33
  19. package/dist/{cloudflare-cmd-BcrVyTmJ.mjs → cloudflare-cmd-bhwCxAN6.mjs} +2 -2
  20. package/dist/{cloudflare-connect-B8uPZ4nx.mjs → cloudflare-connect-CuhRgk3k.mjs} +2 -2
  21. package/dist/{cloudflare-operations-AiWashgg.mjs → cloudflare-operations-BhbK6yTq.mjs} +1 -1
  22. package/dist/{cloudflare-operations-fxHb-byx.mjs → cloudflare-operations-CjaV4lZi.mjs} +2 -2
  23. package/dist/{connect-Bd4kJd9U.mjs → connect-DCvUmPXY.mjs} +13 -10
  24. package/dist/{create-project-Boczwj5r.mjs → create-project-C734I-Mu.mjs} +1 -1
  25. package/dist/{create-project-bMf6ffLZ.mjs → create-project-eAPgYq35.mjs} +13 -13
  26. package/dist/{db-8uG64XLl.mjs → db-C07GEdKF.mjs} +27 -30
  27. package/dist/{delete-NvbiyeJf.mjs → delete-pKMVsrpJ.mjs} +5 -6
  28. package/dist/deploy-BDu1vhSH.mjs +2 -0
  29. package/dist/{deploy-DzAIwqNU.mjs → deploy-DfsAe-T0.mjs} +9567 -9215
  30. package/dist/{dev-inbox-P0u4tM8Y.mjs → dev-inbox-D64ZKUod.mjs} +5 -6
  31. package/dist/{domain-y5Tvydvo.mjs → domain-D3uA9ize.mjs} +8 -8
  32. package/dist/{email-B3umsW75.mjs → email-z3o2cwjH.mjs} +8 -8
  33. package/dist/{env-BS6qYHDb.mjs → env-3Q8-_2IH.mjs} +7 -9
  34. package/dist/{env-types-C2_bIk_b.mjs → env-types-D5kds_OZ.mjs} +1 -1
  35. package/dist/{env-validation-DbTg7-ar.mjs → env-validation-cZBvGWaP.mjs} +1 -1
  36. package/dist/{env-validation-BPn7vk-V.mjs → env-validation-vBSQ8gw5.mjs} +3 -3
  37. package/dist/gen-ById9r2j.mjs +2 -0
  38. package/dist/{gen-B580--vC.mjs → gen-NjwoG9FK.mjs} +2 -4
  39. package/dist/{github-cmd-v45BdfKX.mjs → github-cmd-DquUq-b1.mjs} +15 -24
  40. package/dist/{headers-DWi2IXWx.mjs → headers-2rKda9Y6.mjs} +1 -1
  41. package/dist/help-DPGBwomV.mjs +2 -0
  42. package/dist/{help-daGKjXGk.mjs → help-DRZXC4fj.mjs} +8 -4
  43. package/dist/{inbound-aVHEUhKo.mjs → inbound-fRkqcXaC.mjs} +1 -1
  44. package/dist/index.d.mts +18 -14
  45. package/dist/index.mjs +2176 -2110
  46. package/dist/{info-B97bTX9N.mjs → info-BmA3_IFZ.mjs} +1 -3
  47. package/dist/{init-Bvy7zrBo.mjs → init-DT7yuuyl.mjs} +28 -27
  48. package/dist/{link-CDqqCjFl.mjs → link-CXOlqh2F.mjs} +6 -7
  49. package/dist/{list-CZj0dzKY.mjs → list-eEWVJEPn.mjs} +8 -9
  50. package/dist/{local-d1-2CMnpuW_.mjs → local-d1-Df4XpwhW.mjs} +1 -1
  51. package/dist/log-vqY3pqwI.mjs +29 -0
  52. package/dist/login-C98-sw79.mjs +2 -0
  53. package/dist/{login-UZKFM_u7.mjs → login-pWQHYVu2.mjs} +12 -10
  54. package/dist/{logs-CUZ6t9t3.mjs → logs-DnxVX7TR.mjs} +11 -13
  55. package/dist/migrate-CEu2X5DB.mjs +2 -0
  56. package/dist/{migrate-DHul7PRV.mjs → migrate-CV1on-yJ.mjs} +2 -4
  57. package/dist/{operator-args-CLgKGlwU.mjs → operator-args-CAVcmwUt.mjs} +12 -5
  58. package/dist/{operator-auth-8KnOVXVd.mjs → operator-auth-CkmTE3rt.mjs} +2 -2
  59. package/dist/{operator-client-DUwumHpQ.mjs → operator-client-LmwjxT6q.mjs} +3 -3
  60. package/dist/{operator-cmd-DBA6dl0m.mjs → operator-cmd-d-IEKgNk.mjs} +6 -6
  61. package/dist/{output-Dm_A4Tbv.mjs → output-BBsUwdyT.mjs} +22 -14
  62. package/dist/pages/client.d.mts +3 -0
  63. package/dist/pages/client.mjs +120 -29
  64. package/dist/pages/index.mjs +1 -1
  65. package/dist/{platform-args-BJdRtlLq.mjs → platform-args-Bzf8JPc2.mjs} +11 -3
  66. package/dist/platform-args-Cq6EjQro.mjs +2 -0
  67. package/dist/{platform-auth-config-B56E9YP1.mjs → platform-auth-config-0V0lA3pF.mjs} +7 -7
  68. package/dist/{platform-auth-protection-BDWO_aER.mjs → platform-auth-protection-DFeJ-JkK.mjs} +9 -9
  69. package/dist/{platform-auth-recovery-1gg4CSRe.mjs → platform-auth-recovery-ICy4muq6.mjs} +7 -7
  70. package/dist/{platform-cmd-Bt-1w6pY.mjs → platform-cmd-BPySFOew.mjs} +1 -1
  71. package/dist/{platform-cmd-DMcQStSc.mjs → platform-cmd-D7vSWMvV.mjs} +38 -28
  72. package/dist/platform-discovery-DDDUvnqp.mjs +27 -0
  73. package/dist/{platform-domain-BNkcz0OB.mjs → platform-domain-CUdY064e.mjs} +5 -5
  74. package/dist/{platform-lifecycle-BE6C_jxh.mjs → platform-lifecycle-BaUdTRPU.mjs} +1 -1
  75. package/dist/{platform-lifecycle-9OyBALhH.mjs → platform-lifecycle-Dm09JNkn.mjs} +4404 -3297
  76. package/dist/{platform-management-CjwLVQwN.mjs → platform-management-BSEc_ZeG.mjs} +48 -11
  77. package/dist/platform-management-Bp6aoH2C.mjs +2 -0
  78. package/dist/{platform-plans-config-BNGKGr4P.mjs → platform-plans-config-B0pOVQyW.mjs} +3 -3
  79. package/dist/{platform-recovery-D6KSpuFm.mjs → platform-recovery-WOZ95Uze.mjs} +4 -4
  80. package/dist/{platform-registry-QBa4DK32.mjs → platform-registry-KfNEF84O.mjs} +3 -3
  81. package/dist/{prepare-B5Mkic5u.mjs → prepare-39EvOhI6.mjs} +2 -4
  82. package/dist/prepare-CnjcTV2s.mjs +2 -0
  83. package/dist/{prepare-DOsL0CC9.mjs → prepare-DnaKBi--.mjs} +1 -1
  84. package/dist/{project-C0Fqu05O.mjs → project-BkbfDs0V.mjs} +15 -82
  85. package/dist/project-IOjBU8R6.mjs +2 -0
  86. package/dist/{project-cmd-CNzrqvBv.mjs → project-cmd-Bs5A392E.mjs} +21 -22
  87. package/dist/{project-team-DQOWPfQT.mjs → project-team-ohAWWaew.mjs} +8 -9
  88. package/dist/{project-token-CTDYU0Cc.mjs → project-token-CP01Jna6.mjs} +6 -9
  89. package/dist/{project-zero-trust-BNAkW-_0.mjs → project-zero-trust-BzkVgx35.mjs} +5 -6
  90. package/dist/prompts-6OSVA7DJ.mjs +2087 -0
  91. package/dist/prompts-ZAuJlyCj.mjs +2 -0
  92. package/dist/{provision-C4ORE7G7.mjs → provision-BEv0k-qz.mjs} +1 -1
  93. package/dist/{provision-CJFgTZY8.mjs → provision-Btj1jppf.mjs} +5 -7
  94. package/dist/{requests-MhxYnau8.mjs → requests-B3PBuGlX.mjs} +5 -6
  95. package/dist/{rollback-CJ6iSDoU.mjs → rollback-DDub9GsO.mjs} +9 -10
  96. package/dist/runtime/ai.mjs +3 -5
  97. package/dist/runtime/email/testing.mjs +2 -2
  98. package/dist/runtime/email.mjs +36 -18
  99. package/dist/runtime/remote/index.mjs +2 -2
  100. package/dist/runtime/routing.mjs +1 -1
  101. package/dist/{secret-Dli5fP0B.mjs → secret-3c72lY1U.mjs} +15 -16
  102. package/dist/{skills-D1II1Juz.mjs → skills-BPQUGClu.mjs} +1 -1
  103. package/dist/{subcommand-prompt-CY1C4fvl.mjs → subcommand-prompt-Dhom39bd.mjs} +40 -32
  104. package/dist/sveltekit.d.mts +1 -1
  105. package/dist/sveltekit.mjs +4 -9
  106. package/dist/{wrangler-7K-bW_DL.mjs → wrangler-DhUerFkW.mjs} +10 -15
  107. package/package.json +22 -23
  108. package/sandbox.Dockerfile +1 -1
  109. package/skills/void/SKILL.md +6 -1
  110. package/skills/void/docs/guide/ai.md +24 -86
  111. package/skills/void/docs/guide/auth.md +0 -2
  112. package/skills/void/docs/guide/database/d1.md +7 -7
  113. package/skills/void/docs/guide/deployment.md +58 -102
  114. package/skills/void/docs/guide/edge/headers.md +1 -1
  115. package/skills/void/docs/guide/email/domains.md +5 -1
  116. package/skills/void/docs/guide/email/sending.md +1 -1
  117. package/skills/void/docs/guide/env-vars.md +1 -5
  118. package/skills/void/docs/guide/index.md +19 -18
  119. package/skills/void/docs/guide/kv.md +0 -2
  120. package/skills/void/docs/guide/pages-routing/actions-and-forms.md +49 -47
  121. package/skills/void/docs/guide/pages-routing/overview.md +2 -2
  122. package/skills/void/docs/guide/platform/administration/email.md +0 -2
  123. package/skills/void/docs/guide/platform/administration/operations.md +11 -22
  124. package/skills/void/docs/guide/platform/administration/plans.md +1 -5
  125. package/skills/void/docs/guide/platform/administration/zero-trust.md +24 -9
  126. package/skills/void/docs/guide/platform/development/schema-ci.md +7 -1
  127. package/skills/void/docs/guide/platform/installation/ci.md +1 -1
  128. package/skills/void/docs/guide/platform/installation/credentials.md +10 -3
  129. package/skills/void/docs/guide/platform/installation/domains.md +8 -3
  130. package/skills/void/docs/guide/platform/installation/first-deployment.md +2 -2
  131. package/skills/void/docs/guide/platform/installation/maintenance.md +37 -5
  132. package/skills/void/docs/guide/platform/installation/prerequisites.md +87 -14
  133. package/skills/void/docs/guide/platform/installation/setup.md +80 -10
  134. package/skills/void/docs/guide/quickstart.md +37 -80
  135. package/skills/void/docs/guide/remote-dev.md +1 -1
  136. package/skills/void/docs/guide/sandboxes.md +36 -46
  137. package/skills/void/docs/guide/self-hosted-platform.md +20 -0
  138. package/skills/void/docs/guide/websockets.md +0 -2
  139. package/skills/void/docs/integrations/frameworks/overview.md +2 -2
  140. package/skills/void/docs/integrations/frameworks/sveltekit.md +40 -25
  141. package/skills/void/docs/integrations/nodejs-bun-deno.md +7 -2
  142. package/skills/void/docs/reference/api/resources.md +27 -0
  143. package/skills/void/docs/reference/api.md +1 -1
  144. package/skills/void/docs/reference/cli/auth.md +4 -3
  145. package/skills/void/docs/reference/cli/database.md +1 -1
  146. package/skills/void/docs/reference/cli/deploy.md +21 -1
  147. package/skills/void/docs/reference/cli/platform-installation.md +42 -27
  148. package/skills/void/docs/reference/cli/platform-operations.md +4 -8
  149. package/skills/void/docs/reference/cli/platform-zero-trust.md +14 -0
  150. package/skills/void/docs/reference/cli/platform.md +5 -0
  151. package/skills/void/docs/reference/config.md +1 -1
  152. package/skills/void/docs/reference/resource-inference.md +11 -8
  153. package/dist/auth-CCjt0hcq.mjs +0 -2
  154. package/dist/cf-build-output-_0HNWysu.mjs +0 -2
  155. package/dist/client-Cu7jWiF1.mjs +0 -2
  156. package/dist/deploy-bjXdFCtn.mjs +0 -2
  157. package/dist/dist-BuDuKZJv.mjs +0 -2
  158. package/dist/dist-CTBk70IR.mjs +0 -1310
  159. package/dist/gen-BVaUUumi.mjs +0 -2
  160. package/dist/help-DofyZuY7.mjs +0 -2
  161. package/dist/log-ChfPKsVd.mjs +0 -26
  162. package/dist/login-DYt_An22.mjs +0 -2
  163. package/dist/migrate-8_2u55MD.mjs +0 -2
  164. package/dist/platform-args-D3RXyR6h.mjs +0 -2
  165. package/dist/platform-management-CnyTdcWX.mjs +0 -2
  166. package/dist/prepare-cgvDMtSb.mjs +0 -2
  167. package/dist/project-BuUwfj6f.mjs +0 -2
  168. package/skills/void/docs/guide/env-migration.md +0 -109
  169. package/dist/{cf-build-output-BPqOT964.mjs → cf-build-output-U8o1Gl6X.mjs} +1 -1
@@ -8,6 +8,14 @@ Project Zero Trust puts Cloudflare Access in front of the hostnames of projects
8
8
 
9
9
  This is separate from the Access login and protection for the platform API. Projects deployed directly to Cloudflare are not affected.
10
10
 
11
+ Choose app access during `void platform install`, or configure it later using this page. The installer reuses the platform policy or helps you select separate company rules, and finishes setup before opening traffic.
12
+
13
+ If you choose public apps in an account with Default-Deny, Void manages scoped
14
+ public rules instead. New projects and custom domains remain public automatically.
15
+ Keep these rules enabled while Default-Deny is on; removing them can block traffic.
16
+ Public-only installations need no identity providers or company policies until you
17
+ choose to protect apps. To renew their token in Admin, leave the policy fields blank.
18
+
11
19
  ## Requirements
12
20
 
13
21
  - A Cloudflare Zero Trust organization in the account that hosts the platform, with the identity providers and reusable Access policies you want to use. Select at least one Allow policy that matches people by identity. Void rejects Bypass and Service Auth policies, and rules that allow Everyone or any service token.
@@ -116,22 +124,29 @@ If a project must accept such requests:
116
124
 
117
125
  Void creates and owns these self-hosted applications in your Zero Trust organization:
118
126
 
119
- | Application | Covers | Policy | Exists |
120
- | -------------------------- | ------------------------------------------------------------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------ |
121
- | Shared project application | `*.<your domain>` and this installation's `workers.dev` testing URLs | Your selected policies and identity providers | Once, while Zero Trust is enabled |
122
- | Public exception | One public project's `<slug>.<your domain>` and `workers.dev` testing URL | A Bypass policy for Everyone, named `Void project is public` | One for each public project |
123
- | Custom domain application | All custom domains of one protected project | Your selected policies and identity providers | One for each protected project that has custom domains |
124
- | Health check exception | `void-platform-health.<your domain>/health` | A Bypass policy for Everyone, named `Void platform health check` | Once, while Zero Trust is enabled on an installation with a domain |
127
+ | Application | Covers | Policy | Exists |
128
+ | --------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------ |
129
+ | Shared project application | `*.<your domain>` and this installation's `workers.dev` testing URLs | Your selected policies and identity providers | Once for protected-app configurations |
130
+ | Public app management check | A reserved, unused dispatch check path | Deny Everyone; verifies management permissions without opening hostnames | Once, instead of the shared wildcard in public-only mode |
131
+ | Public exception | One public project's `<slug>.<your domain>` and `workers.dev` testing URL | A Bypass policy for Everyone, named `Void project is public` | One for each public project |
132
+ | Custom domain application | All managed custom domains of one project | Company policies for protected projects; Bypass for public ones | One for each project with managed custom domains |
133
+ | Health check exception | `void-platform-health.<your domain>/health` | A Bypass policy for Everyone, named `Void platform health check` | Once, while Zero Trust is enabled on an installation with a domain |
134
+
135
+ Installations configured through the installer also manage public custom-domain
136
+ rules. Their custom-domain application changes policy when a project switches
137
+ between public and protected access.
125
138
 
126
- Custom domains of a public project need no Access application.
139
+ If the installer already configured the same health-check exception, Zero Trust
140
+ reuses it. Disabling project Zero Trust leaves that existing exception in place
141
+ so platform health checks continue to work.
127
142
 
128
143
  The number of applications Void needs is:
129
144
 
130
145
  ```text
131
- 2 + public projects + protected projects that have custom domains
146
+ 1 + health-check applications + public projects + projects with managed custom domains
132
147
  ```
133
148
 
134
- Use 1 instead of 2 on an installation without a domain. For example, 40 projects with 10 public and 5 protected projects that have custom domains need 2 + 10 + 5 = 17 applications. Void stops with an error when the account has more than 500 Access applications.
149
+ The first application is the shared company policy or the public-app management check. Count a health exception once, including when it is shared with the installer. For example, 40 projects with one health exception, 10 public projects, and 5 projects with managed custom domains need 1 + 1 + 10 + 5 = 17 applications. Void stops with an error when the account has more than 500 Access applications.
135
150
 
136
151
  #### Recognizing Void's Applications
137
152
 
@@ -14,7 +14,13 @@ vp run --filter @voidcloud/api db:generate
14
14
 
15
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
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.
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.
18
+
19
+ ## Runtime artifact contract
20
+
21
+ `@void/platform` contains installation manifests, resource naming, discovery contracts, Worker configuration, and deployable bundles under the `./installer` export. Platform source lives in `platform/packages/`.
22
+
23
+ Runtime artifacts include migration SQL, its journal, and a rollback compatibility manifest. Drizzle authoring snapshots remain in the source tree. Migrations are forward-only; compatibility edges in `platform/packages/api/drizzle/compatibility.json` must be tested against the earlier runtime before publication. The build verifies schema lineage and hashes the journal and SQL files.
18
24
 
19
25
  ## CI in a Fork
20
26
 
@@ -49,7 +49,7 @@ void platform install \
49
49
  --yes
50
50
  ```
51
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.
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 `<platform-api-url>/auth/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
53
 
54
54
  :::
55
55
 
@@ -8,15 +8,20 @@ Keep one password-manager entry for this platform. Paste the saved values into t
8
8
 
9
9
  ## Cloudflare API Tokens {#runtime-token-permissions}
10
10
 
11
- For a domain installation, create two custom tokens using Cloudflare's [API token setup](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/). Name them **Void Platform Management** and **Void Platform Runtime**. Scope them to your selected account and application zone.
11
+ For a domain installation or Cloudflare Access setup, the installer guides you through creating separate management and runtime tokens using Cloudflare's [API token setup](https://developers.cloudflare.com/fundamentals/api/get-started/create-token/). Its links preselect the permissions and suggest names based on your platform's display name. Scope the tokens to your selected account and, when using a domain, its zone, save them in your password manager, and paste them into the masked CLI prompts.
12
12
 
13
- For workers.dev testing with the default API hostname, browser login can authorize installation: you only need to create the runtime token and R2 credentials below. Skip the zone permissions until you add a domain.
13
+ For workers.dev testing with the default API hostname, browser login can authorize
14
+ infrastructure setup. Void also checks account-wide Access requirements; if the
15
+ current credential cannot read them, the installer asks for a scoped Access token.
16
+ Protected apps and public apps under Default-Deny need an ongoing app-management
17
+ token, stored encrypted. Access setup requires a management token even on
18
+ workers.dev. Skip zone permissions until you add a domain.
14
19
 
15
20
  Browser login does not grant AI Gateway access. Include **Account → AI Gateway → Edit** on the runtime token so Void can verify and create that resource.
16
21
 
17
22
  The management token lets your CLI install and maintain the platform. The runtime token is stored as a Worker secret so the platform can deploy apps after you close your terminal. They are separate credentials.
18
23
 
19
- The installer’s runtime-token link preselects required account permissions. Compare the form with the checklist shown beside the link, and select the indicated zone for a domain installation.
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.
@@ -66,9 +66,14 @@ void platform repair <installation-id> --dashboard-url https://dash.example.com
66
66
 
67
67
  The origin must contain no credentials, path, query, or fragment. Void saves it
68
68
  for login callbacks and keeps it across upgrades and repairs. The command does
69
- not create a dashboard Worker or DNS records; deploy that app separately. Omit
70
- the option to keep the saved origin. The dashboard provides sign-in, linked
71
- login methods, and sign-out; use the CLI for user project and team management.
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.
72
77
 
73
78
  If Access protects the platform, its application must cover this dashboard
74
79
  origin too. Configure the origin when installing protection. To change it on an
@@ -33,8 +33,8 @@ void project token create --name ci --expires-in 30
33
33
  ```
34
34
 
35
35
  Store the printed `VOID_TOKEN` and `VOID_API_URL` in the CI secret manager, then
36
- use `void connect <url> --no-login` in a fresh checkout if connection metadata
37
- is not committed. Rotate with `void project token renew <id>` and revoke with
36
+ run `void connect "$VOID_API_URL" --no-login` before deploying in each fresh CI
37
+ environment. Project files do not replace this connection step. Rotate with `void project token renew <id>` and revoke with
38
38
  `void project token revoke <id>`. A human login token is not a CI credential.
39
39
 
40
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
@@ -56,7 +63,7 @@ Repair recreates missing infrastructure that the installer owns. It does not res
56
63
 
57
64
  ### Upgrade the platform
58
65
 
59
- 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.
66
+ Keep the platform runtime current when updating the Void CLI.
60
67
 
61
68
  Use the installed CLI's packaged runtime to upgrade:
62
69
 
@@ -80,10 +87,6 @@ manager so they can also restore a missing Worker during repair.
80
87
 
81
88
  Database migrations only move forward. Void checks compatibility before upgrading and tells you if an intermediate release is needed. If deployment fails, it attempts to restore the previous Workers against the compatible database schema. Retrying does not repeat completed migrations.
82
89
 
83
- 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.
84
-
85
- 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.
86
-
87
90
  After a successful upgrade, you can restore a declared-compatible earlier runtime without reversing migrations:
88
91
 
89
92
  ```sh
@@ -95,6 +98,35 @@ Keep the earlier runtime files if you need rollback. If the installed version is
95
98
 
96
99
  :::
97
100
 
101
+ ### Follow upgrade and rollback progress
102
+
103
+ Watching progress is optional: a running upgrade or rollback proceeds through
104
+ the CLI without action on the status page. During maintenance, navigating the
105
+ admin UI automatically redirects to `/admin/status`. You can also open it
106
+ directly on your platform API origin and sign in as an administrator.
107
+
108
+ The read-only page shows the saved operation, source and target versions, and
109
+ the traffic state reported by the API. It refreshes automatically every five
110
+ seconds while visible. If updates fail, it keeps the last confirmed snapshot
111
+ and marks it as out of date. Normal administrator changes remain paused.
112
+
113
+ Sign-in and status remain available while the API and authentication database
114
+ are reachable. An operation completing
115
+ does not confirm every project's health. A disabled installation keeps traffic
116
+ paused after an upgrade or rollback.
117
+
118
+ If an operation fails or waits for DNS or Sandbox drain work, the CLI prints
119
+ the recovery instructions and command needed to resume. Resolve the reported
120
+ problem, then resume with the same runtime files. For a custom rollback, retain
121
+ the source runtime files too. `void platform status <id>` also prints locally saved progress
122
+ before checking the live API; this local checkpoint can be out of date if another
123
+ administrator changed the installation.
124
+
125
+ When application traffic is paused, visitors receive a temporary-unavailability
126
+ page with a **Try again** link. API requests and form submissions still receive
127
+ HTTP 503 responses. Void does not automatically replay requests; visitors who
128
+ submitted a form should check its result before submitting it again.
129
+
98
130
  ### Manage an installation from another machine
99
131
 
100
132
  Use `discover` to restore the administrator's local installation records:
@@ -8,7 +8,7 @@ To run a Void platform, you need:
8
8
 
9
9
  - A Cloudflare account with Workers for Platforms and R2 enabled.
10
10
  - An empty hosted PostgreSQL database.
11
- - An account with your chosen login provider. GitHub is the default; Google, OIDC, and Cloudflare Access are also supported.
11
+ - An account with your chosen login provider: GitHub, Google, OIDC, or Cloudflare Access.
12
12
  - A domain for your apps, or `workers.dev` for testing. You can [add a domain later](/guide/platform/installation/domains#adding-a-domain).
13
13
 
14
14
  Void creates the Workers, storage, queues, routing, and database tables through the CLI.
@@ -19,9 +19,10 @@ Workers for Platforms requires a paid plan. Your database and Cloudflare usage a
19
19
 
20
20
  In the [Cloudflare dashboard](https://dash.cloudflare.com/), select the account where you want the platform to live:
21
21
 
22
- 1. Open **Workers for Platforms** and enable its plan. Review [Workers for Platforms pricing](https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/platform/pricing/) before confirming.
23
- 2. Open **R2 Object Storage** and complete its activation. Void creates the bucket later.
24
- 3. For a domain installation, choose a domain you own, such as `example.app`. If you need one, register it with your preferred registrar. Use a spare domain's root: apps will be served at `my-app.example.app`. For workers.dev testing, skip this step and the DNS setup below.
22
+ 1. Open **Workers & Pages** once to let Cloudflare provision Workers for the account.
23
+ 2. Open **Workers for Platforms** and enable its plan. Review [Workers for Platforms pricing](https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/platform/pricing/) before confirming.
24
+ 3. Open **R2 Object Storage** and complete its activation. Void creates the bucket later.
25
+ 4. For a domain installation, choose a domain you own, such as `example.app`. If you need one, register it with your preferred registrar. Use a spare domain's root: apps will be served at `my-app.example.app`. For workers.dev testing, skip this step and the DNS setup below.
25
26
 
26
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.
27
28
 
@@ -36,7 +37,7 @@ pnpm add --global void
36
37
  void platform install --plan
37
38
  ```
38
39
 
39
- Sign in to Cloudflare when prompted, then choose an installation name and account. `--plan` previews the resources without changing them or requiring runtime secrets.
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.
40
41
 
41
42
  For a domain installation, use these answers. Testing mode skips the application domain, zone, and catch-all questions:
42
43
 
@@ -51,7 +52,7 @@ For a domain installation, use these answers. Testing mode skips the application
51
52
 
52
53
  Choose an unused installation name in your account. For example, `team` creates resources such as `void-team-api` and `void-team-proxy`.
53
54
 
54
- The preview includes your login callback URL and links for creating credentials. Keep it open while following [Credentials](/guide/platform/installation/credentials), then run the install command printed at the end.
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.
55
56
 
56
57
  You can select either path directly:
57
58
 
@@ -72,22 +73,94 @@ Use any PostgreSQL provider that accepts connections from your computer and Clou
72
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.
73
74
  3. Copy the PostgreSQL connection URL, including the password and SSL settings, into your password manager. Paste only the URL—not a surrounding `psql` command—into Void's `PostgreSQL DATABASE_URL` prompt, as the provider gives it, including SSL settings such as `sslmode=verify-full`. A Hyperdrive that Void creates trusts only public certificate authorities, so if your database uses a private certificate authority, use a separately managed Hyperdrive, as described below.
74
75
 
75
- | Provider | Connection setup |
76
- | ---------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
77
- | [PlanetScale Postgres](https://planetscale.com/docs/postgres/connecting) | Choose **Postgres**, not Vitess/MySQL. Open **Connect**, create role credentials, and use the direct primary connection on port `5432`, not PgBouncer on `6432`. |
78
- | [Neon](https://neon.com/docs/get-started-with-neon/connect-neon) | Open **Connect**, select the database and owner role, and turn **connection pooling off**. |
79
- | [Supabase](https://supabase.com/docs/guides/database/connecting-to-postgres) | Open **Connect** and use the direct connection where IPv6 is available, or the **Session pooler** on port `5432` for IPv4 connectivity. Do not select the transaction pooler on `6543`. Replace the password placeholder with your database password. |
80
-
81
- For a dedicated Supabase project, [disable the Data API](https://supabase.com/docs/guides/api/securing-your-api#disable-the-data-api) so the platform's tables are not exposed through Supabase's auto-generated endpoints. Void uses the PostgreSQL connection, not Supabase API keys.
76
+ | Provider | Connection setup |
77
+ | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
78
+ | [PlanetScale Postgres](https://planetscale.com/docs/postgres/connecting) | Choose **Postgres**, not Vitess/MySQL. Open **Connect**, create role credentials, and use the direct primary connection on port `5432`, not PgBouncer on `6432`. |
79
+ | [Neon](https://neon.com/docs/get-started-with-neon/connect-neon) | Open **Connect**, select the database and owner role, and turn **connection pooling off**. |
82
80
 
83
81
  Once installation claims the database, continue using that same database for resume and maintenance commands. Uninstall never deletes external PostgreSQL.
84
82
 
83
+ ### Use a provider CLI
84
+
85
+ You can create the database and retrieve its connection URL from either provider's CLI instead of its dashboard.
86
+
87
+ ::: details PlanetScale Postgres
88
+
89
+ Install the latest [PlanetScale CLI](https://planetscale.com/docs/cli/planetscale-environment-setup). On macOS, use `brew install pscale`; the installation guide also covers Linux and Windows.
90
+
91
+ Sign in and list your organizations and regions:
92
+
93
+ ```sh
94
+ pscale auth login
95
+ pscale org list
96
+ pscale region list --org <organization>
97
+ ```
98
+
99
+ Replace `<organization>` with your organization slug and choose a region. List the available Postgres cluster sizes and their prices for that region:
100
+
101
+ ```sh
102
+ pscale size cluster list --org <organization> --engine postgresql --region <region>
103
+ ```
104
+
105
+ Create a dedicated Postgres database with your chosen cluster size, then create a role with permission to create and migrate Void's tables:
106
+
107
+ ```sh
108
+ pscale database create void-platform \
109
+ --org <organization> \
110
+ --engine postgresql \
111
+ --region <region> \
112
+ --cluster-size <cluster-size> \
113
+ --wait
114
+
115
+ pscale role create void-platform main void_owner \
116
+ --org <organization> \
117
+ --inherited-roles postgres
118
+ ```
119
+
120
+ Save the **DATABASE URL** printed by the role-creation command in your password manager and paste it into Void's `PostgreSQL DATABASE_URL` prompt. Use the direct primary connection on port `5432` with `sslmode=verify-full`. The role's password is shown when it is created, so save it before closing the terminal.
121
+
122
+ See PlanetScale's [database commands](https://planetscale.com/docs/cli/database) and [role commands](https://planetscale.com/docs/cli/role) for more options.
123
+
124
+ :::
125
+
126
+ ::: details Neon
127
+
128
+ Install the latest [Neon CLI](https://neon.com/docs/cli/install) and sign in:
129
+
130
+ ```sh
131
+ pnpm add --global neon@latest
132
+ neon login
133
+ ```
134
+
135
+ Create a dedicated project, database, and owner role. Replace `<region-id>` with one of Neon's [supported regions](https://neon.com/docs/cli/projects#create), such as `aws-us-east-2`:
136
+
137
+ ```sh
138
+ neon projects create --name void-platform \
139
+ --database void_platform \
140
+ --role void_owner \
141
+ --region-id <region-id>
142
+ ```
143
+
144
+ Use the project ID from the output to retrieve a direct primary connection URL with TLS certificate verification:
145
+
146
+ ```sh
147
+ neon connection-string --project-id <project-id> \
148
+ --database-name void_platform \
149
+ --role-name void_owner \
150
+ --endpoint-type read_write \
151
+ --ssl verify-full
152
+ ```
153
+
154
+ Save the printed URL in your password manager and paste it into Void's `PostgreSQL DATABASE_URL` prompt. Keep this connection unpooled. See Neon's [connection-string command](https://neon.com/docs/cli/connection-string) for more options.
155
+
156
+ :::
157
+
85
158
  ### Use an existing Hyperdrive
86
159
 
87
160
  The installer can create Hyperdrive for you or use one you manage separately. For an existing configuration:
88
161
 
89
162
  1. Point it at the dedicated platform database using a runtime user, and disable SQL result caching.
90
- 2. Select it in the installer and confirm the database, host, port, and runtime user.
163
+ 2. Select it in the installer and review the database, host, port, and runtime user.
91
164
  3. Supply a database owner connection at the PostgreSQL URL prompt so Void can apply migrations.
92
165
 
93
166
  To create one first, choose **Set up a separately managed Hyperdrive** and follow the printed instructions or [Cloudflare’s setup guide](https://developers.cloudflare.com/hyperdrive/get-started/). Rerun the installer once it is ready. Void leaves its configuration under your control. For unattended setup, use the Hyperdrive variables in [Install from CI](/guide/platform/installation/ci).
@@ -4,13 +4,19 @@ outline: deep
4
4
 
5
5
  # Install and Configure Login
6
6
 
7
+ Press Enter to accept a suggested zone or display name, or type to replace it. Enter your own installation name and application domain; examples such as `company` and `example.com` are placeholders.
8
+
7
9
  For workers.dev testing, start the interactive install and choose your login method below:
8
10
 
9
11
  ```sh
10
12
  void platform install --workers-dev
11
13
  ```
12
14
 
13
- For a domain installation, the management token is the one value the interactive installer needs in the shell. Browser login cannot create the application's DNS record. In Bash or zsh, read the token without displaying it or putting its value in command history:
15
+ For a domain installation or Access setup, Void guides you to create a management API token and paste it into a masked prompt. Browser login can preview DNS, but cannot change it or configure Access. The token-creation link preselects the permissions for your choices; scope the token to your account and, when using a domain, its zone. No shell environment variable is needed for interactive installation.
16
+
17
+ ::: details Use an existing management token from the shell
18
+
19
+ Set `CLOUDFLARE_API_TOKEN` to use an existing token instead of the prompt. In Bash or zsh, read it without displaying it or putting its value in command history:
14
20
 
15
21
  ```sh
16
22
  printf 'Cloudflare management API token: '
@@ -20,7 +26,7 @@ export CLOUDFLARE_API_TOKEN
20
26
  void platform install
21
27
  ```
22
28
 
23
- ::: details PowerShell equivalent
29
+ In PowerShell:
24
30
 
25
31
  ```powershell
26
32
  $env:CLOUDFLARE_API_TOKEN = [System.Net.NetworkCredential]::new('', (Read-Host 'Cloudflare management API token' -AsSecureString)).Password
@@ -29,14 +35,66 @@ void platform install
29
35
 
30
36
  :::
31
37
 
32
- After reviewing `--plan`, run the command printed under **Next step: run this command to install**. It carries your choices into installation. Confirm the plan, then follow the credential prompts. Void opens the relevant setup pages and provides fallback links in the terminal. It reuses values you have already supplied.
38
+ After reviewing `--plan`, run `void platform install` and select your saved plan, or run the command printed under **Next, run this command to install the platform**. Both carry your choices into installation and check the current Cloudflare state. Review the refreshed plan. At **Apply this plan?**, **Yes** is selected; press Enter to continue to the credential prompts, or choose **No** to stop. Void opens the relevant setup pages and provides fallback links in the terminal. It reuses values you have already supplied.
39
+
40
+ Saved plans contain your installation choices, including paths to any authentication configuration or custom runtime. They contain no secrets or approval to install. Declining the plan or cancelling management-token setup keeps those choices for your next attempt.
33
41
 
34
42
  ## Choose login methods
35
43
 
36
- The installer offers GitHub, Google, generic OIDC, and Cloudflare Access login.
44
+ The installer offers GitHub, Google, generic OIDC, and Cloudflare Access login. Select all methods you want to enable; none are selected initially.
37
45
  Cloudflare Access protection is a separate choice from Access login. The
38
46
  GitHub OAuth steps below apply when you select GitHub login.
39
47
 
48
+ ## Choose who can access apps
49
+
50
+ The installer asks **Who should be able to access deployed apps?**
51
+
52
+ - **Same people allowed by the platform’s Access policy** reuses your selected company identities and policies. This is recommended when platform Access protection is enabled.
53
+ - **Anyone — public apps** allows public visits.
54
+ - **Choose a different Access policy** selects separate company rules for apps. Without platform protection, this option is **Set up Cloudflare Access protection**.
55
+
56
+ The plan shows the default app access. Void finishes and verifies app access before
57
+ opening application traffic; new projects inherit the selected default automatically.
58
+ If setup stops, use the printed resume command. Existing installations retain their
59
+ administrator settings during upgrades.
60
+
61
+ App protection uses the account hosting your platform. If platform login or
62
+ protection uses another account, select equivalent identity providers and policies
63
+ in the hosting account when prompted. Use the app domain’s apex or a workers.dev
64
+ hostname for the API so it stays outside the app wildcard.
65
+
66
+ Void checks account-wide Default-Deny during setup. For public apps in an account
67
+ that requires Access rules, it creates rules for each app and its verified custom
68
+ domains. Other subdomains keep their existing access rules. It leaves account-wide
69
+ Default-Deny enabled and does not bypass the platform API or proxy.
70
+
71
+ App rules need **Access: Apps and Policies Edit** and **Organizations, Identity
72
+ Providers, and Groups Read**. Void stores this management token encrypted for future
73
+ apps and domain changes. The installer asks before retaining a setup-only token for
74
+ that purpose, or guides you to create a dedicated token. Public apps without
75
+ Default-Deny need no ongoing Access-management credential.
76
+
77
+ For scripts, use `--app-access public|platform|custom`. Supply
78
+ `VOID_PLATFORM_APP_ACCESS_TOKEN` when app rules are needed, or add an `appAccess`
79
+ section to your `--auth-config` file:
80
+
81
+ ```json
82
+ {
83
+ "appAccess": {
84
+ "mode": "custom",
85
+ "identityProviderIds": ["hosting-account-identity-provider-id"],
86
+ "policyIds": ["hosting-account-company-policy-id"],
87
+ "tokenEnv": "APP_ACCESS_API_TOKEN"
88
+ }
89
+ }
90
+ ```
91
+
92
+ Keep the file’s existing `connections` configuration. For `mode: "platform"`,
93
+ same-account identity and policy selections are reused. Headless setup requires an
94
+ explicit app-management token; it never silently retains an installer-only token.
95
+
96
+ ## Finish login configuration
97
+
40
98
  For Google, create an OAuth client and register the printed callback URL. You
41
99
  can restrict it to named Google Workspace domains. For OIDC or Access login,
42
100
  provide the issuer URL, client ID, and client secret. Select **Company-approved
@@ -86,6 +144,10 @@ with GitHub or another login method. With company-approved signup, a colleague
86
144
  who passes the company gate can create an ordinary account using GitHub even
87
145
  when their GitHub email differs from their company email.
88
146
 
147
+ Your identity provider determines how employees sign in, such as through Okta or
148
+ Google Workspace. Your Access policies determine who can reach the platform and
149
+ which MFA or device requirements apply.
150
+
89
151
  Automatic setup uses an existing Zero Trust organization, selected identity
90
152
  providers, and existing company policies. Void creates dedicated applications
91
153
  and a scoped service token for protected installation checks. It preserves your
@@ -94,9 +156,13 @@ company policies, including device and MFA requirements.
94
156
  The setup credential needs **Access: Apps and Policies Write** and
95
157
  **Access: Organizations, Identity Providers, and Groups Read** in the identity
96
158
  account. Creating protection also needs **Access: Service Tokens Write**.
97
- Provide a separate setup token through `VOID_PLATFORM_ACCESS_SETUP_TOKEN` if
98
- your Cloudflare management credential lacks these permissions. These permissions
99
- are not required by the platform's runtime token. See Cloudflare's
159
+ For setup in the installation account, the initial management-token link includes
160
+ these permissions. Void checks Access reads before provisioning and reuses that
161
+ management token during Access setup, so you do not need a second API token.
162
+ For applications in another account, provide a token scoped to that identity
163
+ account when asked. Scripts can supply an explicit override through
164
+ `VOID_PLATFORM_ACCESS_SETUP_TOKEN`. The platform's runtime token does not need
165
+ Access management permissions. See Cloudflare's
100
166
  [Access API](https://developers.cloudflare.com/api/resources/zero_trust/subresources/access/subresources/applications/)
101
167
  and [service-token permissions](https://developers.cloudflare.com/api/resources/zero_trust/subresources/access/subresources/service_tokens/methods/create/).
102
168
 
@@ -117,7 +183,9 @@ Keep the file's `connections` list from the example above, or use a connection
117
183
  with `{"id":"access","kind":"cloudflare-access","label":"Company Access"}`
118
184
  to create Access login as well. Omit `protection` for login-only setup.
119
185
 
120
- To connect applications managed elsewhere, select **Connect existing applications**.
186
+ To connect applications managed elsewhere, select **Use Access applications your company already manages**.
187
+ Enter the account that owns the Access applications; it can differ from the
188
+ account hosting Void.
121
189
  Scripts use `mode: "existing"`, optional `accountId`, and `loginApplicationId`
122
190
  and/or `protectionApplicationId`. For login, set `loginClientSecretEnv`. For
123
191
  protection, supply `serviceToken` with `id`, `clientIdEnv`, and `clientSecretEnv`
@@ -148,7 +216,7 @@ The installer collects your runtime token, PostgreSQL URL, login-provider creden
148
216
 
149
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).
150
218
 
151
- Remove the management token from the shell when finished:
219
+ If you supplied a management token through the shell, remove it when finished:
152
220
 
153
221
  ```sh
154
222
  unset CLOUDFLARE_API_TOKEN
@@ -164,10 +232,12 @@ If Void created a zone, it stops in `waiting-for-dns` and prints nameservers. Se
164
232
  void platform install --resume --name <installation-id>
165
233
  ```
166
234
 
167
- Keep the management token available for any remaining DNS changes. When using a source build, also pass the same `--runtime` directory. Resume uses the saved checkpoint and original secrets; do not start a second installation or generate replacement keys. If setup failed before a checkpoint was saved, rerun the original command.
235
+ Resume reuses the saved management token and asks for one if it is missing or rejected by Cloudflare. You can override it through `CLOUDFLARE_API_TOKEN`. When using a source build, also pass the same `--runtime` directory. Resume uses the saved checkpoint and original secrets; do not start a second installation or generate replacement keys. If setup stopped before a checkpoint was saved, rerun `void platform install` and select your saved plan, or rerun the original command.
168
236
 
169
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`.
170
238
 
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.
240
+
171
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.
172
242
 
173
243
  :::