Configuration
Every setting is a vars entry or a binding in wrangler.jsonc, and every one has a working
default. A deploy that sets nothing beyond what the canonical config already carries serves a site.
Values arrive from wrangler as strings, so a boolean is "1" or "0" and a number is a decimal
string. An unparseable value falls back to the default and never throws: these are read on the
serving path, and a typo must not take a site down.
Three layers decide what a value is, most specific first:
- A request parameter, where the route exposes one (
?prefill=,?all=1). - The
CONFIG_KVnamespace, for the plan and the runtime levers on Runtime Overrides. No redeploy needed. - The
varsentry, then the per-plan default insrc/ops/plan-profile.ts, then the constant.
Pages
- Site Identity and Origin Settings: the CMS selector, site id, location hint and origin.
- Plan and Extensibility Routes: the plan variable and the extensibility routes.
- Migrated Project Settings: settings a migrated project carries over from its old host.
- Diagnostics: diagnostic variables and logging.
- Serving and Caching: page tiers, static assets, limits, prefill, files and images.
- Runtime: cron, warming, the interpreter lifecycle, boot and storage.
- Replicas: replica lanes and pool sizing.
- Operations: maintenance, owner access, database updates, reconciliation and runtime overrides.
- Integrations: mail, outbound TCP, Workers AI, OIDC login and Spool.
Variable Index
Every variable and binding on the configuration pages, once each.
| Variable | Default | Page |
|---|---|---|
SITE |
binding | Configuration |
ASSETS |
binding | Configuration |
CONFIG_KV |
binding | Configuration |
FLEET_DB |
binding | Configuration |
FILES |
binding | Configuration |
CF_VERSION_METADATA |
binding | Configuration |
PAGE_KV |
binding | Configuration |
RENDER_LANES |
binding | Configuration |
SEND_EMAIL |
binding | Configuration |
CMS |
none, required at build | Configuration |
SITE_ID |
derived, then site |
Configuration |
SITE_ID_PORTS |
keep |
Configuration |
SITE_ORIGIN |
pinned on first use | Configuration |
SITE_LOCATION_HINT |
unset | Configuration |
PLAN |
free |
Configuration |
DRUPAL_ENV_<NAME> |
unset | Configuration |
DRUPAL_CONFIG |
unset | Configuration |
DRUPAL_SETTINGS |
unset | Configuration |
RESPONSE_HEADERS |
unset | Configuration |
REDIRECTS |
unset | Configuration |
PW_DIAGNOSTICS |
off | Configuration |
PHP_LOG_LEVEL |
info |
Configuration |
PW_SQL_TRACE |
off | Configuration |
PW_SQL_TRACE_FROM |
0 | Configuration |
MEMORY_TRACE |
off | Configuration |
GEN_BUCKET_MS |
5,000 | Serving |
MAX_BODY_BYTES |
2 MiB | Serving |
MAX_UPLOAD_BYTES |
100 MiB | Serving |
OUTBOUND_GUARD |
on | Serving |
PAGE_KV_ENABLED |
on | Serving |
PAGE_KV_TTL |
86,400 | Serving |
KV_WRITES_PER_DAY |
per plan | Serving |
EDGE_PLAN |
on | Serving |
CACHE_API |
on | Configuration |
CSP_MODE |
per plan | Serving |
SPOOL |
per plan | Serving |
SPOOL_IMAGES |
on | Serving |
SPOOL_VIDEO |
on | Serving |
SPOOL_EMBEDS |
on | Serving |
NEVER_STALE |
unset | Serving |
AGED_SERVE_MAX_MS |
60,000 | Serving |
ASSET_AGGREGATES |
unset | Serving |
MEMORY_CACHE_BINS |
unset | Serving |
MEMORY_CACHE_MAX_ITEMS |
64 | Serving |
RENDER_BUDGET_MS |
per plan | Serving |
FILL_BATCH_SIZE |
per plan | Serving |
WINDOW_SITES |
unset | Serving |
WINDOW_MAX_FILLS |
50 | Serving |
WINDOW_WALL_MS |
60,000 | Serving |
PREFILL |
on for free, off for paid | Serving |
PREFILL_ON_SAVE |
on | Serving |
PREFILL_ON_SAVE_LIMIT |
25 | Serving |
SAVE_DEBOUNCE_MS |
2000 | Serving |
MIRROR_LIMIT |
per plan | Serving |
R2_WRITES_PER_MONTH |
900000 | Serving |
HTTP_DRAIN_ON_ALARM |
on | Serving |
HTTP_DRAIN_LIMIT |
per plan | Serving |
FILES_PUBLIC_URL |
unset | Serving |
IMAGE_ENGINE |
tinyimg |
Serving |
EAGER_DERIVATIVES |
on | Serving |
DRUPAL_CRON |
on | Runtime |
CRON_INTERVAL_MS |
900,000 | Runtime |
CRON_MAX_UNITS |
6 | Runtime |
CRON_MAX_ROWS |
500 | Runtime |
CRON_MAX_MS |
500 | Runtime |
CRON_QUEUE_BATCH_SIZE |
5 | Runtime |
UPDATE_FETCH_URL |
unset | Runtime |
GC_INTERVAL_MS |
3,600,000 | Runtime |
CACHE_DATA_MAX_ROWS |
5,000 | Runtime |
WATCHDOG_ROW_LIMIT |
unset | Runtime |
KEEP_WARM_MS |
240,000 | Runtime |
SITE_WARM |
by plan | Runtime |
WARM_INTERVAL_MS |
8,000 | Runtime |
WARM_CEILING_MS |
unset | Runtime |
IDLE_CEILING_MS |
unset | Runtime |
RECYCLE_ABOVE_BYTES |
117440512 | Runtime |
ISOLATE_ABOVE_BYTES |
130023424 | Runtime |
FILL_SETTLE_MS |
60,000 | Runtime |
RETAIN_INTERPRETER |
on | Runtime |
HEAP_SNAPSHOT |
on | Runtime |
HEAP_IMAGE |
off | Runtime |
BOOT_IMAGE |
off | Runtime |
BOOT_IMAGE_BAKE |
off | Runtime |
HEAP_RESTORE_CHUNKS |
all at once | Runtime |
LAZY_MOUNT |
1 in the canonical config |
Runtime |
LAZY_FS_BUDGET_BYTES |
20 MiB, 4 MiB in the canonical config | Runtime |
SITE_DB_PREFIX |
the packed default | Runtime |
SQL_CHUNK_PREFIX |
drupal-sql |
Runtime |
MIGRATE_ENGINE |
sql |
Runtime |
MIGRATE_SELF_DRIVE |
on | Runtime |
MIGRATE_CHUNKS_PER_INVOCATION |
40 on free, all on paid | Runtime |
OPCACHE_MODE |
off | Runtime |
ARGON2 |
off | Runtime |
SHELL_ASSEMBLY |
on | Runtime |
REPLICA_COUNT |
0 | Replicas |
REPLICA_AUTOSCALE |
on | Replicas |
REPLICA_MAX_LANES |
32 | Replicas |
WRITE_FORWARD |
on | Replicas |
REPLICA_LAG_MS |
30,000 | Replicas |
REPLICA_READ_ONLY |
off | Replicas |
UPDB_FLUSH_SPLIT |
on | Operations |
UPDB_ALLOW_UNBOUNDED |
off | Operations |
UPDB_SNAPSHOT_MAX_ROWS |
none | Operations |
UPDB_RETRY_POLICY |
none | Operations |
UPDB_ON_ABORT |
none | Operations |
UPDB_MAX_ATTEMPTS |
none | Operations |
UPDB_MAX_PASSES |
none | Operations |
UPDB_MAX_COLD_WAITS |
none | Operations |
UPDB_MAX_BEATS |
none | Operations |
UPDB_CHECK_REQUIREMENTS |
none | Operations |
RECONCILE |
on | Operations |
SWEEP |
off | Operations |
SWEEP_ROWS_FRACTION |
0.25 | Operations |
MAIL_TRANSPORT |
auto |
Integrations |
MAIL_FROM |
none | Integrations |
MAIL_DRAIN_ON_ALARM |
on | Integrations |
MAIL_DRAIN_LIMIT |
5 | Integrations |
CF_EMAIL_ACCOUNT_ID |
none | Integrations |
CF_EMAIL_TOKEN |
none | Integrations |
SMTP_HOST |
none | Integrations |
SMTP_PORT |
587/465 | Integrations |
SMTP_TLS |
starttls | Integrations |
SMTP_USER |
none | Integrations |
SMTP_PASS |
none | Integrations |
SMTP_AUTH |
PLAIN |
Integrations |
REDIS_URL |
none | Integrations |
SYSLOG_URL |
none | Integrations |
SYSLOG_APP_NAME |
drupal |
Integrations |
PARK |
on | Integrations |
SLEEP_BUDGET_MS |
2,000 | Integrations |
AI |
none | Integrations |
AI_MODELS |
four model ids | Integrations |
OIDC_CLIENT_SECRET |
binding | Integrations |
Bindings
wrangler.jsonc is the canonical config and declares seven of the nine. FILES and SEND_EMAIL are
the two it leaves out.
| binding | kind | canonical config | what breaks without it |
|---|---|---|---|
SITE |
Durable Object | declared | the Worker has nothing to proxy to; every request fails |
ASSETS |
Workers Assets | declared | no pack, no driver, no /core/**; an object cannot boot |
CONFIG_KV |
KV | declared | the plan override and the runtime levers are absent; the deployed vars stay in force |
FLEET_DB |
D1 | declared | the cross-site inventory is absent; a single site does not need one |
FILES |
R2 | not declared | the page and file mirror drains nothing; the off-Worker serving path is unavailable |
CF_VERSION_METADATA |
version metadata | declared | the fleet row records workerVersion: "unknown" |
PAGE_KV |
KV | declared | the cross-colo page tier is absent, and so is the stale-generation serve |
RENDER_LANES |
Durable Object | declared | image styles render on first view instead of on upload |
SEND_EMAIL |
send_email |
not declared | the credential-free mail transport is absent; api or smtp still work |
FILES is left out of the shipping config because naming it breaks the deploy button. R2 has to be enabled from the Cloudflare dashboard before any bucket can exist, so a
config that names one is refused with "Please enable R2 through the Cloudflare Dashboard.
[code: 10042]" on every account that has not done that. Enabling R2 requires a payment card on
either Workers plan, even when usage stays inside the monthly allocation. KV and D1 have no such
requirement: wrangler creates CONFIG_KV and FLEET_DB on first deploy.
Once R2 is enabled, wrangler creates the named bucket on deploy as it does for KV and D1. Add the binding when you want the mirror:
"r2_buckets": [{ "binding": "FILES", "bucket_name": "drupflare-files" }]The managed config
wrangler.managed.jsonc is the canonical config plus the two bindings it leaves out, FILES and
SEND_EMAIL, and one var, CACHE_API=off. A user Worker in a Workers for Platforms dispatch namespace
cannot read caches.default: the property access throws, and every dynamic request failed with error
1101 before the var existed. With CACHE_API=off the serving path never touches the Cache API and
answers from the KV page tier and the object instead. Unset, it is on. The managed config is what a managed deployment deploys with, where the control plane has enabled R2 on
the account and set up Email Routing, which a deploy button cannot do:
bunx wrangler deploy -c wrangler.managed.jsonctests/node/oneclick-config.spec.ts holds the two files together. It fails when the managed config
differs from the canonical one in any key but those two, and when the canonical config names a binding
that needs an account resource it cannot create. bun run release:check dry-runs both configs and
prices each bundle against the 64 MiB limit, and the release workflow bundles both before it
publishes. Whether a deploy that names send_email is refused on an account without Email Routing has
not been measured, so the managed config assumes the control plane has set it up.
A binding goes into this file when the code that reads it lands, not before. Service bindings,
worker_loaders and a facade Worker are listed in the roadmap as managed-only and are not here yet,
because nothing in src/ reads them and a binding nothing reads fails a deploy for no gain.
An unbound optional binding always wins over the var that would enable the feature. Asking for a tier that is not bound is a configuration error, and answering it with a crash on the serving path would be the wrong trade.
Related
- Repository layout: every path outside
src/and how it arrives - Building from source: how a source build runs
- Measurement classes: which instrument may produce which class of number
- Recovery: which primitive answers which failure
- External database: why the site database lives in the Durable Object