void 0.21.0 → 0.21.2

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 (71) hide show
  1. package/README.md +3 -2
  2. package/dist/{auth-cmd-MkBG2u1f.mjs → account-cmd-D8OC-U7y.mjs} +8 -8
  3. package/dist/{auth-link-Devmv96E.mjs → auth-link-BYFeMJAp.mjs} +3 -3
  4. package/dist/auth-router-OHZNmrb_.mjs +74 -0
  5. package/dist/{build-cmd-DsBGwtfs.mjs → build-cmd-Bft7EY51.mjs} +2 -2
  6. package/dist/{cache-BMw8eMyF.mjs → cache-CKV1Gz2w.mjs} +2 -2
  7. package/dist/{cancel-deploy-B3_s9NIN.mjs → cancel-deploy-BAKmkX4f.mjs} +2 -2
  8. package/dist/cli/cf-compat.mjs +13 -3
  9. package/dist/cli/cli.mjs +112 -60
  10. package/dist/{connect-BvC9kolB.mjs → connect-DLx1pRYk.mjs} +3 -3
  11. package/dist/{create-project-C9lQhRzj.mjs → create-project-BZBl_gQ0.mjs} +1 -1
  12. package/dist/{create-project-CI-17RVJ.mjs → create-project-JV9-6ICF.mjs} +1 -1
  13. package/dist/{db-R7IQgOv5.mjs → db-B98_UV4H.mjs} +8 -8
  14. package/dist/{delete-CghI_NXn.mjs → delete-BEEyqlwd.mjs} +2 -2
  15. package/dist/{deploy-H968Lo4T.mjs → deploy-Bsymb0_c.mjs} +85 -48
  16. package/dist/{deploy-CYPymbtG.mjs → deploy-CsjbRNyv.mjs} +1 -1
  17. package/dist/{domain-CITt8lC-.mjs → domain-Av2AkLQP.mjs} +2 -2
  18. package/dist/{email-_8VmyX7V.mjs → email-CUqa6TtH.mjs} +3 -3
  19. package/dist/{env-DV4r3nHz.mjs → env-D4RIGEzz.mjs} +2 -2
  20. package/dist/gen-B87rlalt.mjs +2 -0
  21. package/dist/{gen-CFOEEc-t.mjs → gen-pg-Ojg8Y.mjs} +1 -1
  22. package/dist/{github-cmd-jYjha2LO.mjs → github-cmd-BEK4VprE.mjs} +4 -4
  23. package/dist/{help-C46mnlUS.mjs → help-iQOt7WHk.mjs} +40 -9
  24. package/dist/help-r_vrpH_d.mjs +2 -0
  25. package/dist/index.mjs +5 -5
  26. package/dist/{init-CSXmvxKu.mjs → init-D5niUPAz.mjs} +5 -5
  27. package/dist/{link-DxMOALXk.mjs → link-3lGrfXzd.mjs} +3 -3
  28. package/dist/{list-0wQs0oYg.mjs → list-CVjGr_C6.mjs} +2 -2
  29. package/dist/{login-CKk5NX4d.mjs → login-BgQJzxAl.mjs} +3 -3
  30. package/dist/login-Bz0zEPoy.mjs +2 -0
  31. package/dist/{logs-hxWBSoej.mjs → logs-DbzD-QDf.mjs} +2 -2
  32. package/dist/{migrate-DcW8F2W8.mjs → migrate-BV8qHiCb.mjs} +1 -1
  33. package/dist/migrate-BXY3B3m7.mjs +2 -0
  34. package/dist/{operator-cmd-BEUYhaHB.mjs → operator-cmd-CR6Lxzt0.mjs} +3 -3
  35. package/dist/{output-urU86XeT.mjs → output-CCH48AMM.mjs} +4 -4
  36. package/dist/{platform-auth-config-Df6yVw-e.mjs → platform-auth-config-De7BqRJm.mjs} +2 -2
  37. package/dist/{platform-auth-protection-Jb0yftay.mjs → platform-auth-protection-Dcat-6zu.mjs} +2 -2
  38. package/dist/{platform-auth-recovery-DmRyIfW0.mjs → platform-auth-recovery-C9gsM640.mjs} +2 -2
  39. package/dist/{platform-cmd-C9Vt7m-d.mjs → platform-cmd-Cl9Uhzru.mjs} +1 -1
  40. package/dist/{platform-cmd-DRxCOTwy.mjs → platform-cmd-CudokNIg.mjs} +4 -4
  41. package/dist/{platform-domain-IjiXgrXJ.mjs → platform-domain-Ckpd2kXw.mjs} +2 -2
  42. package/dist/{platform-lifecycle-BquAaU-5.mjs → platform-lifecycle-DVzM2T4j.mjs} +8 -8
  43. package/dist/{platform-lifecycle-CuJIZNvA.mjs → platform-lifecycle-DlpiGcjr.mjs} +1 -1
  44. package/dist/{platform-management-Cgyed0WY.mjs → platform-management-44Bxd3YC.mjs} +1 -1
  45. package/dist/{platform-management-CCQKGsq4.mjs → platform-management-ibuS1as0.mjs} +2 -2
  46. package/dist/{platform-recovery-DS8ih1SW.mjs → platform-recovery-D_KmvdSk.mjs} +2 -2
  47. package/dist/{prepare-CaUxODOU.mjs → prepare-_T-Haxrr.mjs} +1 -1
  48. package/dist/{project-cmd-2lN--YAX.mjs → project-cmd-BuF9doku.mjs} +14 -14
  49. package/dist/{project-team-Dapn9HZn.mjs → project-team-B1Tia8vd.mjs} +3 -3
  50. package/dist/{project-token-C90v9SJK.mjs → project-token-Bwxjf4y6.mjs} +1 -1
  51. package/dist/{requests-CzX46I0i.mjs → requests-CphRF98D.mjs} +2 -2
  52. package/dist/{rollback-BEeyc73H.mjs → rollback-BYHJV2yD.mjs} +2 -2
  53. package/dist/{secret-wnTel5Yw.mjs → secret-Rt9c4Ttw.mjs} +2 -2
  54. package/dist/{subcommand-prompt-Gj3VzLIh.mjs → subcommand-prompt-BuGYkAkC.mjs} +1 -1
  55. package/package.json +7 -7
  56. package/skills/migrate-vite-cloudflare-to-void/SKILL.md +1 -1
  57. package/skills/void/SKILL.md +4 -2
  58. package/skills/void/docs/guide/deployment.md +6 -13
  59. package/skills/void/docs/guide/email.md +53 -59
  60. package/skills/void/docs/guide/index.md +15 -41
  61. package/skills/void/docs/guide/platform/administration/access.md +1 -1
  62. package/skills/void/docs/guide/project-collaboration.md +1 -1
  63. package/skills/void/docs/guide/quickstart.md +11 -78
  64. package/skills/void/docs/index.md +17 -17
  65. package/skills/void/docs/integrations/cloudflare.md +16 -23
  66. package/skills/void/docs/reference/cli.md +38 -17
  67. package/skills/void/docs/reference/config.md +7 -7
  68. package/dist/gen-BBiIZw6g.mjs +0 -2
  69. package/dist/help-CS_nAsWu.mjs +0 -2
  70. package/dist/login-Ch9cgWRF.mjs +0 -2
  71. package/dist/migrate-CLty4mZR.mjs +0 -2
@@ -3,9 +3,9 @@ layout: home
3
3
  theme: dark
4
4
 
5
5
  hero:
6
- name: Void.
7
- text: Ship Vite apps at warp speed
8
- tagline: A deployment platform designed for Vite. A powerful backend SDK to make your Vite apps truly full-stack.
6
+ name: Void
7
+ text: Full-stack apps with Vite
8
+ tagline: Add server routes, data, and Cloudflare resources to your app. Deploy with one command.
9
9
  actions:
10
10
  - theme: brand
11
11
  text: Get Started
@@ -16,26 +16,26 @@ hero:
16
16
 
17
17
  features:
18
18
  - iconify: lucide:terminal
19
- title: One Command to Production
20
- details: '`void deploy` builds your app, runs migrations, provisions resources, and deploys it.'
19
+ title: Deploy with One Command
20
+ details: '`void deploy` builds your app, provisions resources, applies migrations, and deploys it.'
21
21
  - iconify: lucide:layers
22
- title: Truly Full-Stack
23
- details: Database, KV storage, object storage, AI inference, authentication, queues, and cron jobs. All built-in. Import what you need, skip what you don't.
22
+ title: Full-Stack Features
23
+ details: Use a database, KV, object storage, AI, authentication, queues, and cron jobs as your app needs them.
24
24
  - iconify: lucide:wand-sparkles
25
- title: Your Code is Your Infra
26
- details: Void detects supported resources from your code and provisions them when you deploy. Use explicit configuration for existing infrastructure and services that need additional setup.
25
+ title: Resources from Your Code
26
+ details: Void detects supported resources from your imports and provisions them on deploy. Configure existing resources explicitly.
27
27
  - iconify: lucide:shield-check
28
- title: Performant and Reliable
29
- details: Build on Cloudflare Workers with checked migrations, versioned deployments, and tools to inspect and roll back application releases.
28
+ title: Deploy with Confidence
29
+ details: Run on Cloudflare Workers with checked migrations, versioned deployments, logs, and rollback.
30
30
  - iconify: lucide:blocks
31
- title: Your Framework, Your Rendering
32
- details: React, Vue, Svelte, Solid, Vite-based meta-frameworks. SSR, SSG, ISR, islands with partial hydration, and markdown.
31
+ title: Choose Your Framework
32
+ details: Use React, Vue, Svelte, Solid, or a supported Vite framework with SSR, SSG, ISR, and islands.
33
33
  - iconify: lucide:bot
34
- title: AI-Native
35
- details: Built-in skills and reference prompts let coding agents scaffold and ship full-stack apps in a single prompt.
34
+ title: Work with Coding Agents
35
+ details: Void provides project instructions and skills to help coding agents build and deploy your app.
36
36
 
37
- footer_heading: Deploy at Warp Speed
38
- footer_subheading: Vite. Optimized. Isomorphic. Deploy.
37
+ footer_heading: Build with Vite. Deploy with Void.
38
+ footer_subheading: Server code, resources, and deployment in one workflow.
39
39
  ---
40
40
 
41
41
  <script setup>
@@ -4,11 +4,11 @@ outline: deep
4
4
 
5
5
  # Cloudflare
6
6
 
7
- Void runs on Cloudflare Workers. This page covers how bindings work, how the plugin merges Cloudflare configuration, and how to deploy directly to your own Cloudflare account.
7
+ Void runs on Cloudflare Workers. Use this guide to access bindings, configure your Worker, and deploy to your own account.
8
8
 
9
9
  ## Bindings
10
10
 
11
- Void automatically infers and provisions Cloudflare bindings (D1, KV, R2, AI, Queues) by scanning your source files. There are two ways to access them at runtime depending on your setup.
11
+ Void detects supported resource use in your source and provisions the corresponding bindings. How you access them depends on your framework.
12
12
 
13
13
  ### Via Hono context (`c.env`)
14
14
 
@@ -132,43 +132,36 @@ For environment variables, declare the schema in `env.ts` and put local values i
132
132
  API_URL=https://api.example.com
133
133
  ```
134
134
 
135
- Binding arrays such as `d1_databases`, `kv_namespaces`, and `r2_buckets` belong in the `cloudflare` field. Void adds inferred bindings that are missing by name and preserves custom bindings with real resource IDs. See [Cloudflare config merging](#cloudflare-config-merging) for details.
135
+ Binding arrays such as `d1_databases`, `kv_namespaces`, and `r2_buckets` belong in the `cloudflare` field. Void adds inferred bindings that are missing by name and preserves custom bindings with real resource IDs. See [Cloudflare Configuration](#cloudflare-configuration) for details.
136
136
 
137
137
  For non-secret plain-text defaults, you can also set `worker.vars` in `void.config.ts`. Local `.env` values override `worker.vars` during development. Production builds reject any `worker.vars` name that is declared as a server key in `env.ts`; store those values remotely with `void secret put` instead.
138
138
 
139
- ## Cloudflare config merging
139
+ ## Cloudflare Configuration
140
140
 
141
- Void reads `void.config.ts`, combines its `cloudflare` settings with provisioned values in `void.lock.json`, and generates the Cloudflare config needed by the build and deploy tools. Root `wrangler.jsonc` and `wrangler.json` files from existing apps are migrated automatically by `void init` or `void deploy`. Bindings are inferred from source code and use local placeholder IDs for development.
141
+ Set Worker options in `void.config.ts`. Void combines its `cloudflare` settings with resource IDs in `void.lock.json` for development and deployment. `void init` and `void deploy` migrate root `wrangler.jsonc` or `wrangler.json` files from existing apps.
142
142
 
143
- Edit `cloudflare` in `void.config.ts` for custom Worker settings. Commit `void.lock.json` when Void records resource IDs or Durable Object migration history.
143
+ Commit `void.lock.json` when Void records resource IDs or Durable Object migration history.
144
144
 
145
145
  ### Void-only mode and Vite-based frameworks
146
146
 
147
- In Void's default mode and frameworks where Void controls the Cloudflare integration (TanStack Start, React Router), Void manages `@cloudflare/vite-plugin` directly. It merges inferred bindings with the generated Cloudflare config:
147
+ In native Void apps, TanStack Start, and React Router, Void manages the Cloudflare Vite plugin. It merges inferred bindings with your `cloudflare` settings:
148
148
 
149
- 1. The plugin reads the generated config containing your `cloudflare` settings and Void's recorded resource values.
150
- 2. Void checks each inferred binding **by name** (e.g. `"DB"`, `"KV"`, `"STORAGE"`). If a binding with that name already exists in your config, it is left untouched.
151
- 3. Only bindings that are **missing** from your config are added with local placeholder IDs (e.g. `database_id: "local"`).
152
- 4. The merged config is used for both `vite dev` (Miniflare) and `vite build` (output `wrangler.json` in `dist/`).
149
+ - An existing binding with the same name stays unchanged.
150
+ - Missing inferred bindings get local placeholder IDs for development. Deploy replaces them with provisioned IDs.
151
+ - Other `cloudflare` settings, such as routes, services, variables, and compatibility settings, pass through.
153
152
 
154
- All other `cloudflare` fields -- `name`, `routes`, `services`, `vars`, `env`, `compatibility_date`, etc. -- flow through to the build output.
155
-
156
- Fields that Void always sets (`main`, `triggers`, `assets`) don't need to be in your Cloudflare config -- they're added programmatically based on your project structure.
157
-
158
- In this mode, normal inferred bindings are merged in memory. Typed state modules in `durable-objects/` are the exception: Void records their bindings and append-only `new_sqlite_classes` history in `void.lock.json`. Commit the lock.
153
+ Void sets `main`, `triggers`, and `assets` from your project structure. It also records typed Durable Object bindings and migration history from `durable-objects/` in `void.lock.json`.
159
154
 
160
155
  ### Adapter-based frameworks (SvelteKit, Nuxt, Astro)
161
156
 
162
- When using SvelteKit, Nuxt, or Astro, the framework's own Cloudflare adapter owns the worker build and dev server. Void does **not** provide `@cloudflare/vite-plugin` in that setup. It only contributes DB type codegen, migration management, and binding sync.
157
+ SvelteKit, Nuxt, and Astro build Workers through their own adapters. Void provides database types, migrations, and binding sync without replacing those adapters.
163
158
 
164
- Because Void does not control the Cloudflare plugin in this mode, it syncs inferred bindings to the generated Cloudflare config on dev startup:
159
+ At dev startup, Void updates the framework's generated Cloudflare config:
165
160
 
166
- - Only adds bindings that are **missing** by name -- existing bindings are never modified or removed.
167
- - If `worker.compatibility_date` is set in `void.config.ts`, syncs that date into the Cloudflare config so the framework adapter reads the same value.
168
- - Also ensures the `nodejs_als` compatibility flag is present.
169
- - The framework adapter reads the generated config through its configured path.
161
+ - It adds missing bindings by name without changing existing ones.
162
+ - It copies `worker.compatibility_date`, when set, and adds the `nodejs_als` compatibility flag.
170
163
 
171
- The framework adapter reads the generated config. Void adds bindings as you import resources, and `void deploy --platform cloudflare` replaces local placeholder IDs when it provisions production resources.
164
+ `void deploy --platform cloudflare` provisions production resources for inferred bindings.
172
165
 
173
166
  ### Merge precedence
174
167
 
@@ -28,7 +28,8 @@ Use this page as a command reference. If you are setting up a project for the fi
28
28
  | `void secret sync .env` | Bulk upload secrets from dotenv file |
29
29
  | `void env check [--remote]` | Validate env.ts schema |
30
30
  | `void env types` | Regenerate .void/env.d.ts from env.ts |
31
- | `void auth login` | Authenticate with Void |
31
+ | `void auth login` | Authenticate with the project’s saved destination, or choose one |
32
+ | `void account login` | Authenticate with a Void platform |
32
33
  | `void cloudflare login` | Authenticate with Cloudflare through Void |
33
34
  | `void platform install` | Install a company Void platform in Cloudflare |
34
35
  | `void connect <url>` | Connect the CLI to a Void platform |
@@ -78,7 +79,9 @@ Use `void --help` for the command list. For a specific command, try `void deploy
78
79
 
79
80
  ### `void migrate`
80
81
 
81
- `void migrate` converts `void.json` and root `wrangler.jsonc` or `wrangler.json` into a typed `void.config.ts`. It also recognizes a single root `wrangler*.json(c)` file explicitly referenced by a supported framework adapter. Void backs up the originals under `.void/config-migration/`, keeps Cloudflare resource state in `void.lock.json`, and updates supported framework adapters to use its generated Cloudflare config. `.void-wrangler.jsonc` is a generated Cloudflare tooling file; migration adds it to `.gitignore`. `void init` and `void deploy` run this migration automatically when they find legacy files. Before Cloudflare deployment, the project's installed `void` package must match the CLI version. Review and commit the new config, lock, and `.gitignore`. If multiple Cloudflare config files exist or existing files disagree, resolve them before retrying.
82
+ `void migrate` converts legacy `void.json` and root `wrangler.jsonc` or `wrangler.json` files into `void.config.ts`. It also accepts one root `wrangler*.json(c)` file referenced by a supported framework adapter. Void saves backups in `.void/config-migration/`, records resource IDs in `void.lock.json`, and updates supported adapters to use its generated Cloudflare config.
83
+
84
+ `.void-wrangler.jsonc` is generated for Cloudflare tooling and belongs in `.gitignore`; migration adds the entry. Review and commit `void.config.ts`, `void.lock.json`, and `.gitignore`. `void init` and `void deploy` migrate legacy files automatically. If the project has conflicting or multiple Cloudflare configs, resolve them first. The project's installed `void` package must match the CLI version before Cloudflare deployment.
82
85
 
83
86
  ### `void init`
84
87
 
@@ -167,9 +170,23 @@ The deployment preference is saved in `.void/project.json`. Connecting to anothe
167
170
 
168
171
  In a non-interactive shell, supply a URL or explicit target. Cloudflare requires usable credentials and an unambiguous account (`CLOUDFLARE_ACCOUNT_ID` when needed). For a Void platform, provide `VOID_TOKEN` with a matching `VOID_API_URL`, or reuse a valid origin-scoped keychain session. Use `void connect <url> --no-login` to save the verified connection without authenticating; this option is only available for Void platforms.
169
172
 
170
- ## Auth
173
+ ## Authentication
174
+
175
+ `void auth login`, `void auth status`, and `void auth logout` use the destination
176
+ saved for the current project by `void init` or `void connect`. If no destination
177
+ is saved, interactive commands let you choose Cloudflare or a connected Void
178
+ platform. In a non-interactive shell, pass `--platform cloudflare|void` or use
179
+ the explicit `void cloudflare` and `void account` commands. Choosing a destination
180
+ for authentication does not change the project's deploy target.
181
+
182
+ `void auth whoami`, `void auth link`, and `void auth token` remain supported for
183
+ existing scripts. `whoami` follows the selected destination; `link` and `token`
184
+ are Void account operations. Prefer `void auth status`, `void account link`, and
185
+ `void account token` in new scripts.
171
186
 
172
- ### `void auth login`
187
+ ## Void platform account
188
+
189
+ ### `void account login`
173
190
 
174
191
  Browser login through one of the platform's currently enabled methods. The token is saved in the operating-system keychain, scoped to the platform origin. Login fails closed when no keychain is available instead of writing the token to a plaintext file; headless environments use `VOID_TOKEN` from their secret manager.
175
192
 
@@ -180,22 +197,22 @@ saved login instead, unset `VOID_TOKEN`.
180
197
 
181
198
  This is optional if you already completed auth during `void connect` or the interactive `void init` flow.
182
199
 
183
- ### `void auth link [connection-id]`
200
+ ### `void account link [connection-id]`
184
201
 
185
202
  Link another enabled login method to your current account. Sign in again if your
186
203
  session is no longer recent, complete the additional provider's browser login,
187
204
  and confirm the displayed identity. With no connection ID, choose an enabled
188
205
  method interactively. The optional dashboard exposes the same flow in **Account**.
189
206
 
190
- ### `void auth logout`
207
+ ### `void account logout`
191
208
 
192
209
  Removes saved credentials.
193
210
 
194
- ### `void auth whoami`
211
+ ### `void account whoami`
195
212
 
196
213
  Prints your current login.
197
214
 
198
- ### `void auth token`
215
+ ### `void account token`
199
216
 
200
217
  Copies your human auth token to the system clipboard. It is intended for
201
218
  interactive troubleshooting and remains subject to login-method revocation. Do
@@ -775,9 +792,11 @@ The installed platform needs a separate runtime token to provision resources for
775
792
 
776
793
  To enable email during install or upgrade, set both `VOID_EMAIL_SENDER_DOMAIN` and `VOID_EMAIL_SHARED_ZONE_ID`. Void records the pair for later upgrades; supplying only one is an error.
777
794
 
778
- `--plan` prints the actual resource names, selected login methods, login callback, and direct setup links without opening credential pages or saving a draft; Cloudflare browser login still opens if needed. New platform resources use `void-<name>-<role>` names without random suffixes. Existing installations keep their recorded names, and unowned name conflicts stop installation without overwriting resources. After you confirm an interactive install, Void opens each missing credential's setup page and shows a short permission/checklist fallback. The runtime-token link preselects all required account permissions, including Workers Tail, Hyperdrive, and AI Gateway when needed; domain installations must also select the indicated zone. Supplied credentials skip browser opening. Setup drafts pin Worker names and the login callback and save partial credentials encrypted locally. Interactive installs list unfinished installations, including interrupted provisioning, or offer a new install. Entering an existing unfinished name asks to resume it; declining returns to name entry. Starting new leaves previous setup, credentials, and resources untouched. Completed platforms are not offered for resumption. `--resume` skips the choice and is required for non-interactive recovery.
795
+ `--plan` shows resource names, login methods, the callback URL, and setup links without opening credential pages or saving a draft. Cloudflare browser login can still open if needed. It prints an install command with the resolved name, account, domain, and any supplied authentication file or runtime. Run that command later to recalculate and confirm the plan. If you chose login methods interactively, choose them again during installation. For unfinished installations, the plan prints the saved `--resume` command instead.
796
+
797
+ New resources use `void-<name>-<role>` names. Existing installations keep their recorded names; an unowned name conflict stops installation. After confirmation, Void opens setup pages for missing credentials. The runtime-token link preselects required account permissions, including Workers Tail, Hyperdrive, and AI Gateway when needed; select the indicated zone for domain installs. Supplied credentials skip those pages.
779
798
 
780
- At the end of a plan, Void prints a command to install with the resolved name, account, domain, and any supplied authentication file or runtime. Running that command later recalculates the plan; interactive use asks for confirmation and missing credentials. If you chose login methods interactively, choose them again during installation. A plan for an unfinished installation instead prints its checkpointed `--resume` command.
799
+ Setup drafts save Worker names, the login callback, and partial credentials encrypted locally. Interactive installs offer unfinished installations, including interrupted provisioning, or a new one. Choosing an unfinished name asks to resume it; choosing a new one leaves earlier setup, credentials, and resources untouched. Use `--resume` for non-interactive recovery. Completed platforms cannot be resumed.
781
800
 
782
801
  Use an empty PostgreSQL database dedicated to the installation. You can correct a failed initial connection, but after the database is claimed or Hyperdrive is provisioned, commands reject a different URL.
783
802
 
@@ -959,19 +978,21 @@ Email setup needs a browser session from `void cloudflare login`, which carries
959
978
 
960
979
  Sandbox apps need Docker, [Workers Paid](https://dash.cloudflare.com/?to=/:account/workers/plans), and Containers access. API tokens need Account / Containers: Edit and Account / Cloudchamber: Edit. Void checks access before provisioning or building; apps without Sandbox skip that check.
961
980
 
962
- Void provisions inferred resources, builds and validates the app, applies migrations, validates remote secrets, and checks the uploaded Worker Version before sending it traffic. After activation it synchronizes routes, custom domains, cron triggers, queue consumers, and the Email Routing rules derived from `addresses`. Static, hybrid, and SSR output from supported frameworks is also supported. A brand-new Worker may need one ordinary deployment before the Versions API can be used.
981
+ Void provisions inferred resources, builds and validates the app, applies migrations, checks required secrets, and verifies the uploaded Worker before sending it traffic. It then updates routes and triggers. Supported frameworks can deploy static, hybrid, and SSR output. A new Worker may need one initial deployment before versioned deployment is available.
982
+
983
+ During deployment, Void shows the current phase and an animated spinner in an interactive terminal. CI and redirected output receive plain progress lines. Cloudflare CLI setup notices and successful command output are hidden; Void reports deployment errors directly.
963
984
 
964
985
  If Cloudflare Access protects readiness URLs, supply an allowed `CF_ACCESS_CLIENT_ID` and `CF_ACCESS_CLIENT_SECRET` pair, or a short-lived local `CF_ACCESS_TOKEN`. These credentials are used only for matching HTTPS readiness requests. Versions without accessible previews can be checked at 0% traffic through the stable hostname.
965
986
 
966
987
  Secrets and migrations are validated after the build, so a failed check may leave provisioned resources. It doesn't apply remote D1 migrations or upload the application Worker. PostgreSQL migrations are transactional; MySQL schema changes may partially apply on error.
967
988
 
968
- Provisioning reuses known resource IDs and records newly resolved IDs in `void.lock.json`. Commit that file for other machines and CI. Run the first deploy from one machine at a time because provisioning locks are local. The old `--provision` flag is accepted but no longer needed.
989
+ Void records provisioned resource IDs in `void.lock.json`. Commit it for other machines and CI. Run the first deploy from one machine at a time; provisioning locks are local. The `--provision` flag is accepted but no longer needed.
969
990
 
970
- `.env` is local-only and isn't emitted into Worker vars. Store every schema-declared server key with `void secret put <NAME>`; Void emits required names through `secrets.required` and blocks plaintext server vars. On a new Worker, set required secrets before retrying if the initial remote check reports them missing. Custom D1 layouts are accepted only when Cloudflare's exact file set, bytes, and numeric order match the migrations Void validated. Direct deploy and operational commands use the top-level Cloudflare settings and reject named environments and alternate config-path overrides.
991
+ `.env` stays local. Store server keys declared in `env.ts` with `void secret put <NAME>`; Void rejects them as plaintext Worker vars. If the first deploy reports missing remote secrets, set them and retry. Custom D1 migration layouts must match the exact files, contents, and order Void validated. Direct deploy and Cloudflare commands use the top-level settings, not named environments or alternate config paths.
971
992
 
972
993
  Existing remote secrets are preserved. Void also preserves or creates `BETTER_AUTH_SECRET` for auth apps.
973
994
 
974
- **Email.** When the app uses email (`sendEmail()` or `email/` handlers) and `void.config.ts` has `email.from`, the deploy reads the state of that address's zone before the build — session scopes, zone, MX records, Email Routing, subaddressing, routing rules, Email Sending, and what Void's Cloudflare config holds — prints a checklist of what it would change in your account, and asks once (default Yes). On Yes it enables what is missing, writes `send_email: [{ "name": "SEND_EMAIL" }]`, the `__VOID_EMAIL_FROM` var and the `addresses` array into Void's Cloudflare config, and lets Cloudflare tooling create the routing rules when the activated version's triggers are synchronized; the deploy ends with the address map. A deploy with nothing left to set up asks nothing. Without `email.from` the deploy prints `set email.from in void.config.ts` and continues without email. Non-interactive runs (CI, or stdin/stdout not a terminal) never prompt: they print the checklist plus `Run void email setup --platform cloudflare once locally, commit void.lock.json, then redeploy` and deploy without email (or with the setup Void's Cloudflare config already carries, when the binding is committed) — unless `--require-email` is passed, which fails instead. If setup has committed the exact subdomain `addresses` plan but the deploy's resolver still sees no MX records, Void preserves the plan and stops before build or upload until DNS can be verified. A deploy whose account rows all read ready reconciles the two config rows — `addresses` against the current derivation and `vars.__VOID_EMAIL_FROM` against `email.from` — with a plain file write and no prompt. See [Your own Cloudflare account](../guide/email.md#your-own-cloudflare-account) for the whole flow, including the subdomain-vs-apex rule and what stays manual.
995
+ **Email.** If the app uses `sendEmail()` or `email/` handlers, set `email.from` in `void.config.ts`. Void shows the Cloudflare account changes and asks before applying them. Later deploys skip the prompt once setup is ready. Without `email.from`, deploy continues without email. For CI, run `void email setup --platform cloudflare` locally and commit `void.lock.json`; pass `--require-email` to fail when email is unavailable. DNS propagation may delay a deploy after setup. See [Email on your own Cloudflare account](../guide/email.md#your-own-cloudflare-account) for setup and recovery.
975
996
 
976
997
  See the [Cloudflare guide](../integrations/cloudflare.md#deploy-to-your-own-cloudflare-account) for the complete deployment sequence, first-deploy exceptions, secret precedence, and recovery behavior.
977
998
 
@@ -1294,12 +1315,12 @@ Deploy-on-GitHub works from **any** Void login — Google, GitHub, or other SSO.
1294
1315
  void github link
1295
1316
  ```
1296
1317
 
1297
- Link your current Void account to a GitHub identity. Opens your browser to authorize Void on GitHub (a localhost + PKCE handshake, the same mechanics as `void auth login`), then binds that GitHub identity to the logged-in account. Requires an authenticated CLI (`void auth login` first).
1318
+ Link your current Void account to a GitHub identity. Opens your browser to authorize Void on GitHub (a localhost + PKCE handshake, the same mechanics as `void account login`), then binds that GitHub identity to the logged-in account. Requires an authenticated CLI (`void account login` first).
1298
1319
 
1299
1320
  You normally don't need to run this directly — `void github install` runs the link automatically when your account has no GitHub identity yet. Run it on its own to link ahead of time, or to link a GitHub identity without installing the App.
1300
1321
 
1301
1322
  ::: warning Existing GitHub sign-in
1302
- Void accounts cannot be merged. If the GitHub account you authorize is already linked to a different Void account, including one created through GitHub sign-in, `void github link` is refused with `This GitHub account is already linked to another Void account.` Run `void auth logout` and sign in to that existing account, or authorize a different GitHub account. The command is also refused if your current Void account is already linked to a different GitHub identity. Re-authorizing the GitHub account attached to your current Void account is allowed and reports `GitHub account already linked.`
1323
+ Void accounts cannot be merged. If the GitHub account you authorize is already linked to a different Void account, including one created through GitHub sign-in, `void github link` is refused with `This GitHub account is already linked to another Void account.` Run `void account logout` and sign in to that existing account, or authorize a different GitHub account. The command is also refused if your current Void account is already linked to a different GitHub identity. Re-authorizing the GitHub account attached to your current Void account is allowed and reports `GitHub account already linked.`
1303
1324
  :::
1304
1325
 
1305
1326
  ### `void github install`
@@ -1328,7 +1349,7 @@ Join the GitHub App installations your organization already has. If a teammate i
1328
1349
 
1329
1350
  In an interactive terminal you rarely need to run this yourself — `void github connect` runs the same join automatically when no active installations are linked to your account. Running `void github join` yourself matters mainly for non-interactive use (without a TTY, `void github connect` never opens a browser), or to link installations ahead of time.
1330
1351
 
1331
- Requires an authenticated CLI (`void auth login` first) and organization-installation sharing enabled on your Void instance; when it is not enabled the command fails closed with a clear message. You can only join installations your GitHub authorization actually returns — you cannot name or join one you cannot access on GitHub.
1352
+ Requires an authenticated CLI (`void account login` first) and organization-installation sharing enabled on your Void instance; when it is not enabled the command fails closed with a clear message. You can only join installations your GitHub authorization actually returns — you cannot name or join one you cannot access on GitHub.
1332
1353
 
1333
1354
  ### `void github connect`
1334
1355
 
@@ -6,9 +6,9 @@ outline: deep
6
6
 
7
7
  ## Config File Format
8
8
 
9
- Use this page as the exact reference for `void.config.ts`. If you are still learning how the pieces fit together, start in the guide first and come back here when you need field-by-field details.
9
+ Use `void.config.ts` to configure your app. For a guided introduction, start with [What is Void?](../guide/).
10
10
 
11
- Project configuration lives in a typed `void.config.ts` at the project root. Import `defineConfig` from `void/config`; all fields are optional. `void init` creates this file, and `void init`, `void deploy`, or `void migrate` converts existing `void.json` and root Wrangler JSON/JSONC files. Void saves the originals under `.void/config-migration/`. Commit `void.config.ts` and `void.lock.json` when Void creates the lock file. You can edit the typed config at any time; the lock records Cloudflare resource IDs and migration history that Void resolves for you.
11
+ Put `void.config.ts` at the project root and import `defineConfig` from `void/config`. All fields are optional. `void init`, `void deploy`, and `void migrate` can convert older Void and Cloudflare JSON config files, saving backups under `.void/config-migration/`. Commit `void.config.ts` and `void.lock.json` when Void creates the lock; it records resource IDs and migration history.
12
12
 
13
13
  ```ts
14
14
  // void.config.ts
@@ -217,7 +217,7 @@ Use remote D1/KV/R2 bindings during local development instead of local miniflare
217
217
 
218
218
  **Requirements:**
219
219
 
220
- - Must be logged in (`void auth login`)
220
+ - Must be logged in (`void account login`)
221
221
  - Must have a linked project (`void project link`)
222
222
  - Only affects D1 (`DB`), KV (`KV`), and R2 (`STORAGE`) bindings
223
223
 
@@ -253,7 +253,7 @@ Enable and configure Cloudflare Sandboxes for Void apps. Importing from `void/sa
253
253
  | `instanceType` | `string` | `lite` on Void deploy |
254
254
  | `maxInstances` | `number` | `20` on Void deploy |
255
255
 
256
- Sandbox support currently applies to Void apps on the Cloudflare target. Native deployment requires [Workers Paid](https://dash.cloudflare.com/?to=/:account/workers/plans) because Cloudflare Containers are unavailable on Workers Free. `void deploy --platform cloudflare` verifies Containers access before provisioning resources or building the app and explains how to fix a missing plan or API-token permission. Managed deployment checks the platform account and runtime token only when a Sandbox app is deployed; the token needs Account / Containers: Edit and Account / Cloudchamber: Edit. Apps that do not import `void/sandbox` or configure `sandbox` emit no Container and perform no entitlement check. The default registry image is pinned to the installed `@cloudflare/sandbox` version, so local and native Cloudflare deploys run the same container as Void Platform. If `sandbox.image` is a custom local Dockerfile path, set `sandbox.platformImage` to the pushed image that the platform should run.
256
+ Sandbox is available to Void apps on the Cloudflare target and requires [Workers Paid](https://dash.cloudflare.com/?to=/:account/workers/plans) and Containers access. Void checks access before provisioning or building. For a managed platform, its runtime token needs Account / Containers: Edit and Account / Cloudchamber: Edit. Apps without Sandbox use neither Containers nor an entitlement check. The default image matches the installed `@cloudflare/sandbox` version. If `sandbox.image` points to a local Dockerfile, set `sandbox.platformImage` to the pushed image for the platform.
257
257
 
258
258
  ### `target`
259
259
 
@@ -316,7 +316,7 @@ Void writes a generated Cloudflare config for its tooling and records provisione
316
316
 
317
317
  If you need to remove a value that Void previously generated, remove it from the `resolved` object in `void.lock.json`. Void refreshes the generated Cloudflare file on the next command. Put ongoing custom settings in `cloudflare` in `void.config.ts`.
318
318
 
319
- `worker.limits.cpu_ms` caps Workers CPU time per request, in milliseconds. It must be an integer between 1 and 300000 (Cloudflare's hard maximum, 5 minutes). A deploy that requests more than your account plan's ceiling fails with an error naming both the requested value and the plan maximum. Only a rollback clamps: rolling back to a deployment whose configured limit now exceeds your plan applies the plan ceiling instead of failing. If your plan changes so that a previously valid value now exceeds the ceiling, deploys keep failing until you lower `cpu_ms` in `void.config.ts`. On the direct Cloudflare path, the value is written into the generated `dist/ssr/wrangler.json` as `limits.cpu_ms` and enforced by Cloudflare directly. The Void plan ceiling does not apply there, but your Cloudflare account's own CPU-time allowance still does: the Workers Free plan caps CPU at 10 ms per request, and the Workers Paid plan allows up to 300000 ms. A value above what your Cloudflare account permits is constrained or rejected by Cloudflare, not by Void.
319
+ `worker.limits.cpu_ms` sets the CPU time limit per request, from 1 to 300000 ms. On a Void platform, deploy fails if the limit exceeds the account plan; lower it in `void.config.ts` before retrying. Rollback instead caps the old limit at the current plan ceiling. On direct deploys, [Cloudflare enforces the value](https://developers.cloudflare.com/workers/platform/limits/#cpu-time): Workers Free allows up to 10 ms and Workers Paid up to 300000 ms per request.
320
320
 
321
321
  ```json
322
322
  {
@@ -493,9 +493,9 @@ Each binding accepts `true` (use default name), `false` (disable), or a string (
493
493
  | `ai` | `AI` | `Ai` | `"ai": "MY_AI"` |
494
494
  | `email` | — | — | Boolean only |
495
495
 
496
- Custom resource binding names flow through deploy manifests, Cloudflare config generation, remote binding proxying, internal migrations, and generated runtime helpers such as `void/db`, `void/kv`, and `void/storage`. Custom AI names apply to generated Cloudflare configuration and `void/ai` runtime resolution for direct Cloudflare builds; managed Workers AI continues to use Void's service proxy.
496
+ Custom binding names work with `void/db`, `void/kv`, and `void/storage` during development and deployment. Custom AI names also work with `void/ai` on direct Cloudflare deploys; managed Workers AI uses the platform's proxy.
497
497
 
498
- `email` is a feature switch rather than a Cloudflare binding, so it has no binding name or type. On the platform, outbound mail is sent through the Void proxy, which owns the `send_email` binding — none is written into your worker; on your own Cloudflare account, `void deploy --platform cloudflare` records a `send_email` binding named `SEND_EMAIL` in `void.lock.json` once email is set up (see [`email.from`](#email)). Set it to `true` to turn the [email integration](../guide/email.md) on — which registers the `void dev` inbox — even when no scanned file imports `void/email`, or `false` to turn it off.
498
+ `email` is a boolean feature switch. Set it to `true` to enable [email](../guide/email.md) and the `void dev` inbox without an import from `void/email`, or `false` to disable them. On a Void platform, sending uses the platform proxy. Direct Cloudflare setup records a `SEND_EMAIL` binding in `void.lock.json`; see [`email.from`](#email).
499
499
 
500
500
  #### `inference.build`
501
501
 
@@ -1,2 +0,0 @@
1
- import { r as runGenCommand } from "./gen-CFOEEc-t.mjs";
2
- export { runGenCommand };
@@ -1,2 +0,0 @@
1
- import { r as printHelpPage } from "./help-C46mnlUS.mjs";
2
- export { printHelpPage };
@@ -1,2 +0,0 @@
1
- import { r as selectPlatformLoginMethod } from "./login-CKk5NX4d.mjs";
2
- export { selectPlatformLoginMethod };
@@ -1,2 +0,0 @@
1
- import { n as runMigrateCommand } from "./migrate-DcW8F2W8.mjs";
2
- export { runMigrateCommand };