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:

  1. A request parameter, where the route exposes one (?prefill=, ?all=1).
  2. The CONFIG_KV namespace, for the plan and the runtime levers on Runtime Overrides. No redeploy needed.
  3. The vars entry, then the per-plan default in src/ops/plan-profile.ts, then the constant.

Pages

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.jsonc

tests/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.