Configuration
Wrangler optionally uses a configuration file to customize the development and deployment setup for a Worker.
It is best practice to treat Wrangler's configuration file as the source of truth for configuring a Worker.
{ "$schema": "./node_modules/wrangler/config-schema.json", // Top-level configuration "name": "my-worker", "main": "src/index.js", // Set this to today's date "compatibility_date": "2026-06-28", "workers_dev": false, "route": { "pattern": "example.org/*", "zone_name": "example.org", }, "kv_namespaces": [ { "binding": "<MY_NAMESPACE>", "id": "<KV_ID>", }, ], "env": { "staging": { "name": "my-worker-staging", "route": { "pattern": "staging.example.org/*", "zone_name": "example.org", }, "kv_namespaces": [ { "binding": "<MY_NAMESPACE>", "id": "<STAGING_KV_ID>", }, ], }, },}"$schema" = "./node_modules/wrangler/config-schema.json"name = "my-worker"main = "src/index.js"# Set this to today's datecompatibility_date = "2026-06-28"workers_dev = false
[route]pattern = "example.org/*"zone_name = "example.org"
[[kv_namespaces]]binding = "<MY_NAMESPACE>"id = "<KV_ID>"
[env.staging]name = "my-worker-staging"
[env.staging.route] pattern = "staging.example.org/*" zone_name = "example.org"
[[env.staging.kv_namespaces]] binding = "<MY_NAMESPACE>" id = "<STAGING_KV_ID>"You can define different configurations for a Worker using Wrangler environments. There is a default (top-level) environment and you can create named environments that provide environment-specific configuration.
These are defined under [env.<name>] keys, such as [env.staging] which you can then preview or deploy with the -e / --env flag in the wrangler commands like npx wrangler deploy --env staging.
The majority of keys are inheritable, meaning that top-level configuration can be used in environments. Bindings, such as vars or kv_namespaces, are not inheritable and need to be defined explicitly.
Further, there are a few keys that can only appear at the top-level.
BetaWrangler can automatically provision resources for you when you deploy your Worker without you having to create them ahead of time.
This currently works for KV, R2, and D1 bindings.
To use this feature, add bindings to your configuration file without adding resource IDs, or in the case of R2, a bucket name. Resources will be created with the name of your worker as the prefix.
{ "kv_namespaces": [ { "binding": "<MY_KV_NAMESPACE>", }, ],}[[kv_namespaces]]binding = "<MY_KV_NAMESPACE>"When you run wrangler dev, local resources will automatically be created which persist between runs. When you run wrangler deploy, resources will be created for you, and their IDs will be written back to your configuration file.
If you deploy a worker with resources and no resource IDs from the dashboard (for example, via GitHub), resources will be created, but their IDs will only be accessible via the dashboard. Currently, these resource IDs will not be written back to your repository.
Top-level keys apply to the Worker as a whole (and therefore all environments). They cannot be defined within named environments.
-
keep_varsbooleanoptional- Whether Wrangler should keep variables configured in the dashboard on deploy. Refer to source of truth.
-
migrationsobject[]optional- When making changes to your Durable Object classes, you must perform a migration. Refer to Durable Object migrations.
-
send_metricsbooleanoptional- Whether Wrangler should send usage data to Cloudflare for this project. Defaults to
true. You can learn more about this in our data policy ↗.
- Whether Wrangler should send usage data to Cloudflare for this project. Defaults to
-
siteobjectoptional deprecated- See the Workers Sites section below for more information. Cloudflare Pages and Workers Assets is preferred over this approach.
- This is not supported by the Cloudflare Vite plugin.
Inheritable keys are configurable at the top-level, and can be inherited (or overridden) by environment-specific configuration.
-
namestringrequired- The name of your Worker. Alphanumeric characters (
a,b,c, etc.) and dashes (-) only. Do not use underscores (_). Worker names can be up to 255 characters. If you plan to use aworkers.devsubdomain, the name must be 63 characters or less and cannot start or end with a dash.
- The name of your Worker. Alphanumeric characters (
-
mainstringrequired- The path to the entrypoint of your Worker that will be executed. For example:
./src/index.ts.
- The path to the entrypoint of your Worker that will be executed. For example:
-
compatibility_datestringrequired- A date in the form
yyyy-mm-dd, which will be used to determine which version of the Workers runtime is used. Refer to Compatibility dates.
- A date in the form
-
account_idstringoptional- This is the ID of the account associated with your zone. You might have more than one account, so make sure to use the ID of the account associated with the zone/route you provide, if you provide one. It can also be specified through the
CLOUDFLARE_ACCOUNT_IDenvironment variable.
- This is the ID of the account associated with your zone. You might have more than one account, so make sure to use the ID of the account associated with the zone/route you provide, if you provide one. It can also be specified through the
-
compatibility_flagsstring[]optional- A list of flags that enable features from upcoming features of the Workers runtime, usually used together with
compatibility_date. Refer to compatibility dates.
- A list of flags that enable features from upcoming features of the Workers runtime, usually used together with
-
workers_devbooleanoptional- Enables use of
*.workers.devsubdomain to deploy your Worker. If you have a Worker that is only forscheduledevents, you can set this tofalse. Defaults totrue. Refer to types of routes.
- Enables use of
-
preview_urlsbooleanoptional- Enables use of Preview URLs to test your Worker. Defaults to value of
workers_dev. Refer to Preview URLs.
- Enables use of Preview URLs to test your Worker. Defaults to value of
-
routeRouteoptional- A route that your Worker should be deployed to. Only one of
routesorrouteis required. Refer to types of routes.
- A route that your Worker should be deployed to. Only one of
-
routesRoute[]optional- An array of routes that your Worker should be deployed to. Only one of
routesorrouteis required. Refer to types of routes.
- An array of routes that your Worker should be deployed to. Only one of
-
tsconfigstringoptional- Path to a custom
tsconfig. - Not applicable if you're using the Cloudflare Vite plugin.
- Path to a custom
-
triggersobjectoptional- Cron definitions to trigger a Worker's
scheduledfunction. Refer to triggers.
- Cron definitions to trigger a Worker's
-
rulesRuleoptional- An ordered list of rules that define which modules to import, and what type to import them as. You will need to specify rules to use
Text,DataandCompiledWasmmodules, or when you wish to have a.jsfile be treated as anESModuleinstead ofCommonJS. - Not applicable if you're using the Cloudflare Vite plugin.
- An ordered list of rules that define which modules to import, and what type to import them as. You will need to specify rules to use
-
buildBuildoptional- Configures a custom build step to be run by Wrangler when building your Worker. Refer to Custom builds.
- Not applicable if you're using the Cloudflare Vite plugin.
-
no_bundlebooleanoptional- Skip internal build steps and directly deploy your Worker script. You must have a plain JavaScript Worker with no dependencies.
- Not applicable if you're using the Cloudflare Vite plugin.
-
find_additional_modulesbooleanoptional- If true then Wrangler will traverse the file tree below
base_dir. Any files that matchruleswill be included in the deployed Worker. Defaults to true ifno_bundleis true, otherwise false. Can only be used with Module format Workers (not Service Worker format). - Not applicable if you're using the Cloudflare Vite plugin.
- If true then Wrangler will traverse the file tree below
-
base_dirstringoptional- The directory in which module "rules" should be evaluated when including additional files (via
find_additional_modules) into a Worker deployment. Defaults to the directory containing themainentry point of the Worker if not specified. - Not applicable if you're using the Cloudflare Vite plugin.
- The directory in which module "rules" should be evaluated when including additional files (via
-
preserve_file_namesbooleanoptional- Determines whether Wrangler will preserve the file names of additional modules bundled with the Worker.
The default is to prepend filenames with a content hash.
For example,
34de60b44167af5c5a709e62a4e20c4f18c9e3b6-favicon.ico. - Not applicable if you're using the Cloudflare Vite plugin.
- Determines whether Wrangler will preserve the file names of additional modules bundled with the Worker.
The default is to prepend filenames with a content hash.
For example,
-
minifybooleanoptional- Minify the Worker script before uploading.
- If you're using the Cloudflare Vite plugin,
minifyis replaced by Vite'sbuild.minify↗.
-
keep_namesbooleanoptional- Wrangler uses esbuild to process the Worker code for development and deployment. This option allows
you to specify whether esbuild should apply its keepNames ↗ logic to the code or not. Defaults to
true.
- Wrangler uses esbuild to process the Worker code for development and deployment. This option allows
you to specify whether esbuild should apply its keepNames ↗ logic to the code or not. Defaults to
-
logpushbooleanoptional- Enables Workers Trace Events Logpush for a Worker. Any scripts with this property will automatically get picked up by the Workers Logpush job configured for your account. Defaults to
false. Refer to Workers Logpush.
- Enables Workers Trace Events Logpush for a Worker. Any scripts with this property will automatically get picked up by the Workers Logpush job configured for your account. Defaults to
-
limitsLimitsoptional- Configures limits to be imposed on execution at runtime. Refer to Limits.
-
observabilityobjectoptional- Configures automatic observability settings for telemetry data emitted from your Worker. Refer to Observability.
-
assetsAssetsoptional- Configures static assets that will be served. Refer to Assets for more details.
-
migrationsobjectoptional- Maps a Durable Object from a class name to a runtime state. This communicates changes to the Durable Object (creation / deletion / rename / transfer) to the Workers runtime and provides the runtime with instructions on how to deal with those changes. Refer to Durable Objects migrations.
-
placementobjectoptional- Configures where your Worker runs to minimize latency to back-end services. Refer to Placement.
modestring— Set to"smart"to automatically place your Worker near back-end services based on observed latency.regionstring— Specify a cloud region (for example,"aws:us-east-1","gcp:europe-west1", or"azure:westeurope") to place your Worker near infrastructure in that region.hoststring— Specify a hostname and port for a single-homed layer 4 service (for example,"my_database_host.com:5432") to place your Worker near that service.hostnamestring— Specify a hostname for a single-homed layer 7 service (for example,"my_api_server.com") to place your Worker near that service.
Non-inheritable keys are configurable at the top-level, but cannot be inherited by environments and must be specified for each environment.
-
defineRecord<string, string>optional- A map of values to substitute when deploying your Worker.
- If you're using the Cloudflare Vite plugin,
defineis replaced by Vite'sdefine↗.
-
varsobjectoptional- A map of environment variables to set when deploying your Worker. Refer to Environment variables.
-
durable_objectsobjectoptional- A list of Durable Objects that your Worker should be bound to. Refer to Durable Objects.
-
kv_namespacesobjectoptional- A list of KV namespaces that your Worker should be bound to. Refer to KV namespaces.
-
r2_bucketsobjectoptional- A list of R2 buckets that your Worker should be bound to. Refer to R2 buckets.
-
ai_search_namespacesobjectoptional- A list of AI Search namespaces that your Worker should be bound to. Refer to AI Search namespaces.
-
ai_searchobjectoptional- A list of AI Search instance bindings bound directly to pre-existing instances in the default namespace. Refer to AI Search instances.
-
vectorizeobjectoptional- A list of Vectorize indexes that your Worker should be bound to. Refer to Vectorize indexes.
-
servicesobjectoptional- A list of service bindings that your Worker should be bound to. Refer to service bindings.
-
queuesobjectoptional- A list of Queue producers and consumers that your Worker should be bound to. Refer to Queues.
-
workflowsobjectoptional- A list of Workflows that your Worker should be bound to. Refer to Workflows.
-
tail_consumersobjectoptional- A list of the Tail Workers your Worker sends data to. Refer to Tail Workers.
-
secretsobjectoptional- Declares the secret names your Worker requires. Used for validation during local development and deploy, and as the source of truth for type generation. Refer to Secrets.
requiredstring[]optional — A list of secret names that must be set to deploy your Worker.
-
secrets_store_secretsobjectoptional- A list of Secrets Store bindings that your worker should be bound to. Refer to Secrets Store.
There are three types of routes: Custom Domains, routes, and workers.dev.
Custom Domains allow you to connect your Worker to a domain or subdomain, without having to make changes to your DNS settings or perform any certificate management.
-
patternstringrequired- The pattern that your Worker should be run on, for example,
"example.com".
- The pattern that your Worker should be run on, for example,
-
custom_domainbooleanoptional- Whether the Worker should be on a Custom Domain as opposed to a route. Defaults to
false.
- Whether the Worker should be on a Custom Domain as opposed to a route. Defaults to
Example:
{ "routes": [ { "pattern": "shop.example.com", "custom_domain": true, }, ],}[[routes]]pattern = "shop.example.com"custom_domain = trueRoutes allow users to map a URL pattern to a Worker. A route can be configured as a zone ID route, a zone name route, or a simple route.
-
patternstringrequired- The pattern that your Worker can be run on, for example,
"example.com/*".
- The pattern that your Worker can be run on, for example,
-
zone_idstringrequired- The ID of the zone that your
patternis associated with. Refer to Find zone and account IDs.
- The ID of the zone that your
Example:
{ "routes": [ { "pattern": "subdomain.example.com/*", "zone_id": "<YOUR_ZONE_ID>", }, ],}[[routes]]pattern = "subdomain.example.com/*"zone_id = "<YOUR_ZONE_ID>"-
patternstringrequired- The pattern that your Worker should be run on, for example,
"example.com/*".
- The pattern that your Worker should be run on, for example,
-
zone_namestringrequired- The name of the zone that your
patternis associated with. If you are using API tokens, this will require theAccountscope.
- The name of the zone that your
Example:
{ "routes": [ { "pattern": "subdomain.example.com/*", "zone_name": "example.com", }, ],}[[routes]]pattern = "subdomain.example.com/*"zone_name = "example.com"This is a simple route that only requires a pattern.
Example:
{ "route": "example.com/*",}route = "example.com/*"Cloudflare Workers accounts come with a workers.dev subdomain that is configurable in the Cloudflare dashboard.
workers_devbooleanoptional- Whether the Worker runs on a custom
workers.devaccount subdomain. Defaults totrue.
- Whether the Worker runs on a custom
{ "workers_dev": false,}workers_dev = falseTriggers allow you to define the cron expression to invoke your Worker's scheduled function. Refer to Supported cron expressions.
cronsstring[]required- An array of
cronexpressions. - To disable a Cron Trigger, set
crons = []. Commenting out thecronskey will not disable a Cron Trigger.
- An array of
Example:
{ "triggers": { "crons": ["* * * * *"], },}[triggers]crons = [ "* * * * *" ]The Observability setting allows you to automatically ingest, store, filter, and analyze logging data emitted from Cloudflare Workers directly from your Cloudflare Worker's dashboard.
-
enabledbooleanrequired- When set to
trueon a Worker, logs for the Worker are persisted. Defaults totruefor all new Workers.
- When set to
-
head_sampling_ratenumberoptional- A number between 0 and 1, where 0 indicates zero out of one hundred requests are logged, and 1 indicates every request is logged. If
head_sampling_rateis unspecified, it is configured to a default value of 1 (100%). Read more about head-based sampling.
- A number between 0 and 1, where 0 indicates zero out of one hundred requests are logged, and 1 indicates every request is logged. If
Example:
{ "observability": { "enabled": true, "head_sampling_rate": 0.1, // 10% of requests are logged },}[observability]enabled = truehead_sampling_rate = 0.1You can configure a custom build step that will be run before your Worker is deployed. Refer to Custom builds.
-
commandstringoptional- The command used to build your Worker. On Linux and macOS, the command is executed in the
shshell and thecmdshell for Windows. The&&and||shell operators may be used.
- The command used to build your Worker. On Linux and macOS, the command is executed in the
-
cwdstringoptional- The directory in which the command is executed.
-
watch_dirstring | string[]optional- The directory to watch for changes while using
wrangler dev. Defaults to the current working directory.
- The directory to watch for changes while using
Example:
{ "build": { "command": "npm run build", "cwd": "build_cwd", "watch_dir": "build_watch_dir", },}[build]command = "npm run build"cwd = "build_cwd"watch_dir = "build_watch_dir"You can impose limits on your Worker's behavior at runtime. Limits are only supported for the Standard Usage Model. Limits are only enforced when deployed to Cloudflare's network, not in local development. The CPU limit can be set to a maximum of 300,000 milliseconds (5 minutes).
Each isolate has some built-in flexibility to allow for cases where your Worker infrequently runs over the configured limit. If your Worker starts hitting the limit consistently, its execution will be terminated according to the limit configured.
-
cpu_msnumberoptional- The maximum CPU time allowed per invocation, in milliseconds.
-
subrequestsnumberoptional- The maximum number of subrequests allowed per invocation. This value defaults to 50 for free accounts and 10,000 for paid accounts. The free account maximum is 50 and the paid account maximum is 10,000,000. Refer to subrequest limits for more information.
Example:
{ "limits": { "cpu_ms": 100, "subrequests": 150, },}[limits]cpu_ms = 100subrequests = 150The Workers Browser Run API allows developers to programmatically control and interact with a headless browser instance and create automation flows for their applications and products.
A browser binding will provide your Worker with an authenticated endpoint to interact with a dedicated Chromium browser instance.
bindingstringrequired- The binding name used to refer to the browser binding. The value (string) you set will be used to reference this headless browser in your Worker. The binding must be a valid JavaScript variable name ↗. For example,
binding = "HEAD_LESS"orbinding = "simulatedBrowser"would both be valid names for the binding.
- The binding name used to refer to the browser binding. The value (string) you set will be used to reference this headless browser in your Worker. The binding must be a valid JavaScript variable name ↗. For example,
Example:
{ "browser": { "binding": "<BINDING_NAME>", },}[browser]binding = "<BINDING_NAME>"D1 is Cloudflare's serverless SQL database. A Worker can query a D1 database (or databases) by creating a binding to each database for D1 Workers Binding API.
To bind D1 databases to your Worker, assign an array of the below object to the [[d1_databases]] key.
-
bindingstringrequired- The binding name used to refer to the D1 database. The value (string) you set will be used to reference this database in your Worker. The binding must be a valid JavaScript variable name ↗. For example,
binding = "MY_DB"orbinding = "productionDB"would both be valid names for the binding.
- The binding name used to refer to the D1 database. The value (string) you set will be used to reference this database in your Worker. The binding must be a valid JavaScript variable name ↗. For example,
-
database_namestringrequired- The name of the database. This is a human-readable name that allows you to distinguish between different databases, and is set when you first create the database.
-
database_idstringrequired- The ID of the database. The database ID is available when you first use
wrangler d1 createor when you callwrangler d1 list, and uniquely identifies your database.
- The ID of the database. The database ID is available when you first use
-
preview_database_idstringoptional- The preview ID of this D1 database. If provided,
wrangler devuses this ID. Otherwise, it usesdatabase_id. This option is required when usingwrangler dev --remote.
- The preview ID of this D1 database. If provided,
-
migrations_dirstringoptional- The migration directory containing the migration files. By default,
wrangler d1 migrations createcreates a folder namedmigrations. You can usemigrations_dirto specify a different folder containing the migration files (for example, if you have a mono-repo setup, and want to use a single D1 instance across your apps/packages). - For more information, refer to D1 Wrangler
migrationscommands and D1 migrations.
- The migration directory containing the migration files. By default,
-
migrations_patternstringoptional- A glob pattern (relative to your Wrangler config file) used to discover migration files. Defaults to
migrations/*.sql. - Use this to opt in to nested layouts produced by ORMs like Drizzle (for example,
migrations/*/migration.sql). - When
migrations_patternis set,migrations_dirmust also be set, andmigrations_patternmust start with whatevermigrations_diris set to. Each migration is recorded in the migrations table as a path relative tomigrations_dir.
- A glob pattern (relative to your Wrangler config file) used to discover migration files. Defaults to
Example:
{ "d1_databases": [ { "binding": "<BINDING_NAME>", "database_name": "<DATABASE_NAME>", "database_id": "<DATABASE_ID>", }, ],}[[d1_databases]]binding = "<BINDING_NAME>"database_name = "<DATABASE_NAME>"database_id = "<DATABASE_ID>"Dispatch namespace bindings allow for communication between a dynamic dispatch Worker and a dispatch namespace. Dispatch namespace bindings are used in Workers for Platforms. Workers for Platforms helps you deploy serverless functions programmatically on behalf of your customers.
-
bindingstringrequired- The binding name. The value (string) you set will be used to reference this database in your Worker. The binding must be a valid JavaScript variable name ↗. For example,
binding = "MY_NAMESPACE"orbinding = "productionNamespace"would both be valid names for the binding.
- The binding name. The value (string) you set will be used to reference this database in your Worker. The binding must be a valid JavaScript variable name ↗. For example,
-
namespacestringrequired- The name of the dispatch namespace.
-
outboundobjectoptionalservicestringrequired The name of the outbound Worker to bind to.parametersarray optional A list of parameters to pass data from your dynamic dispatch Worker to the outbound Worker.
{ "dispatch_namespaces": [ { "binding": "<BINDING_NAME>", "namespace": "<NAMESPACE_NAME>", "outbound": { "service": "<WORKER_NAME>", "parameters": ["params_object"], }, }, ],}[[dispatch_namespaces]]binding = "<BINDING_NAME>"namespace = "<NAMESPACE_NAME>"
[dispatch_namespaces.outbound] service = "<WORKER_NAME>" parameters = [ "params_object" ]Durable Objects provide low-latency coordination and consistent storage for the Workers platform.
To bind Durable Objects to your Worker, assign an array of the below object to the durable_objects.bindings key.
-
namestringrequired- The name of the binding used to refer to the Durable Object.
-
class_namestringrequired- The exported class name of the Durable Object.
-
script_namestringoptional- The name of the Worker where the Durable Object is defined, if it is external to this Worker. This option can be used both in local and remote development. In local development, you must run the external Worker in a separate process (via
wrangler dev). In remote development, the appropriate remote binding must be used.
- The name of the Worker where the Durable Object is defined, if it is external to this Worker. This option can be used both in local and remote development. In local development, you must run the external Worker in a separate process (via
-
environmentstringoptional- The environment of the
script_nameto bind to.
- The environment of the
Example:
{ "durable_objects": { "bindings": [ { "name": "<BINDING_NAME>", "class_name": "<CLASS_NAME>", }, ], },}[[durable_objects.bindings]]name = "<BINDING_NAME>"class_name = "<CLASS_NAME>"When making changes to your Durable Object classes, you must perform a migration. Refer to Durable Object migrations.
-
tagstringrequired- A unique identifier for this migration.
-
new_sqlite_classesstring[]optional- The new Durable Objects being defined.
-
renamed_classes{from: string, to: string}[]optional- The Durable Objects being renamed.
-
deleted_classesstring[]optional- The Durable Objects being removed.
Example:
{ "migrations": [ { "tag": "v1", "new_sqlite_classes": [ // Array of new classes "DurableObjectExample", ], }, { "tag": "v2", // Should be unique for each entry "renamed_classes": [ // Array of rename directives { "from": "DurableObjectExample", "to": "UpdatedName", }, ], "deleted_classes": [ // Array of deleted class names "DeprecatedClass", ], }, ],}[[migrations]]tag = "v1"new_sqlite_classes = [ "DurableObjectExample" ]
[[migrations]]tag = "v2"deleted_classes = [ "DeprecatedClass" ]
[[migrations.renamed_classes]] from = "DurableObjectExample" to = "UpdatedName"You can send an email about your Worker's activity from your Worker to an email address verified on Email Routing. This is useful for when you want to know about certain types of events being triggered, for example.
Before you can bind an email address to your Worker, you need to enable Email Routing and have at least one verified email address. Then, assign an array to the object (send_email) with the type of email binding you need.
-
namestringrequired- The binding name.
-
destination_addressstringoptional- The chosen email address you send emails to.
-
allowed_destination_addressesstring[]optional- The allowlist of email addresses you send emails to.
You can add one or more types of bindings to your Wrangler file. However, each attribute must be on its own line:
{ "send_email": [ { "name": "<NAME_FOR_BINDING1>" }, { "name": "<NAME_FOR_BINDING2>", "destination_address": "<YOUR_EMAIL>@example.com" }, { "name": "<NAME_FOR_BINDING3>", "allowed_destination_addresses": [ "<YOUR_EMAIL>@example.com", "<YOUR_EMAIL2>@example.com" ] } ]}[[send_email]]name = "<NAME_FOR_BINDING1>"
[[send_email]]name = "<NAME_FOR_BINDING2>"destination_address = "<YOUR_EMAIL>@example.com"
[[send_email]]name = "<NAME_FOR_BINDING3>"allowed_destination_addresses = [ "<YOUR_EMAIL>@example.com", "<YOUR_EMAIL2>@example.com" ]Environment variables are a type of binding that allow you to attach text strings or JSON values to your Worker.
Example:
{ "$schema": "./node_modules/wrangler/config-schema.json", "name": "my-worker-dev", "vars": { "API_HOST": "example.com", "API_ACCOUNT_ID": "example_user", "SERVICE_X_DATA": { "URL": "service-x-api.dev.example", "MY_ID": 123 } }}"$schema" = "./node_modules/wrangler/config-schema.json"name = "my-worker-dev"
[vars]API_HOST = "example.com"API_ACCOUNT_ID = "example_user"
[vars.SERVICE_X_DATA] URL = "service-x-api.dev.example" MY_ID = 123Hyperdrive bindings allow you to interact with and query any Postgres database from within a Worker.
-
bindingstringrequired- The binding name.
-
idstringrequired- The ID of the Hyperdrive configuration.
Example:
{ // required for database drivers to function "compatibility_flags": ["nodejs_compat_v2"], "hyperdrive": [ { "binding": "<BINDING_NAME>", "id": "<ID>", }, ],}compatibility_flags = [ "nodejs_compat_v2" ]
[[hyperdrive]]binding = "<BINDING_NAME>"id = "<ID>"Cloudflare Images lets you make transformation requests to optimize, resize, and manipulate images stored in remote sources.
To bind Images to your Worker, assign an array of the below object to the images key.
binding (required). The name of the binding used to refer to the Images API.
{ "images": { "binding": "IMAGES", // i.e. available in your Worker on env.IMAGES },}[images]binding = "IMAGES"Workers KV is a global, low-latency, key-value data store. It stores data in a small number of centralized data centers, then caches that data in Cloudflare’s data centers after access.
To bind KV namespaces to your Worker, assign an array of the below object to the kv_namespaces key.
-
bindingstringrequired- The binding name used to refer to the KV namespace.
-
idstringrequired- The ID of the KV namespace.
-
preview_idstringoptional- The preview ID of this KV namespace. This option is required when using
wrangler dev --remoteto develop against remote resources (but is not required with remote bindings). If developing locally, this is an optional field.wrangler devwill use this ID for the KV namespace. Otherwise,wrangler devwill useid.
- The preview ID of this KV namespace. This option is required when using
Example:
{ "kv_namespaces": [ { "binding": "<BINDING_NAME1>", "id": "<NAMESPACE_ID1>", }, { "binding": "<BINDING_NAME2>", "id": "<NAMESPACE_ID2>", }, ],}[[kv_namespaces]]binding = "<BINDING_NAME1>"id = "<NAMESPACE_ID1>"
[[kv_namespaces]]binding = "<BINDING_NAME2>"id = "<NAMESPACE_ID2>"AI Search is Cloudflare's managed search service. A namespace is a logical grouping of AI Search instances. The binding grants full access to all instances within the namespace.
To bind AI Search namespaces to your Worker, assign an array of the below object to the ai_search_namespaces key.
-
bindingstringrequired- The binding name used to refer to the AI Search namespace.
-
namespacestringrequired- The name of the AI Search namespace. A
defaultnamespace is created automatically for every account. If the namespace does not exist, Wrangler creates it on deploy.
- The name of the AI Search namespace. A
Example:
{ "ai_search_namespaces": [ { "binding": "<BINDING_NAME>", "namespace": "default", }, ],}[[ai_search_namespaces]]binding = "<BINDING_NAME>"namespace = "default"To bind directly to a pre-existing AI Search instance in the default namespace, assign an array of the below object to the ai_search key. This binding does not support namespace-level operations like list(), create(), or delete().
-
bindingstringrequired- The binding name used to refer to the AI Search instance.
-
instance_namestringrequired- The name of the AI Search instance. Must exist in the default namespace at deploy time.
Example:
{ "ai_search": [ { "binding": "<BINDING_NAME>", "instance_name": "<INSTANCE_NAME>", }, ],}[[ai_search]]binding = "<BINDING_NAME>"instance_name = "<INSTANCE_NAME>"Queues is Cloudflare's global message queueing service, providing guaranteed delivery and message batching. To interact with a queue with Workers, you need a producer Worker to send messages to the queue and a consumer Worker to pull batches of messages out of the Queue. A single Worker can produce to and consume from multiple Queues.
To bind Queues to your producer Worker, assign an array of the below object to the [[queues.producers]] key.
-
queuestringrequired- The name of the queue, used on the Cloudflare dashboard.
-
bindingstringrequired- The binding name used to refer to the queue in your Worker. The binding must be a valid JavaScript variable name ↗. For example,
binding = "MY_QUEUE"orbinding = "productionQueue"would both be valid names for the binding.
- The binding name used to refer to the queue in your Worker. The binding must be a valid JavaScript variable name ↗. For example,
-
delivery_delaynumberoptional- The number of seconds to delay messages sent to a queue for by default. This can be overridden on a per-message or per-batch basis.
Example:
{ "queues": { "producers": [ { "binding": "<BINDING_NAME>", "queue": "<QUEUE_NAME>", "delivery_delay": 60, // Delay messages by 60 seconds before they are delivered to a consumer }, ], },}[[queues.producers]]binding = "<BINDING_NAME>"queue = "<QUEUE_NAME>"delivery_delay = 60To bind Queues to your consumer Worker, assign an array of the below object to the [[queues.consumers]] key.
-
queuestringrequired- The name of the queue, used on the Cloudflare dashboard.
-
max_batch_sizenumberoptional- The maximum number of messages allowed in each batch.
-
max_batch_timeoutnumberoptional- The maximum number of seconds to wait for messages to fill a batch before the batch is sent to the consumer Worker.
-
max_retriesnumberoptional- The maximum number of retries for a message, if it fails or
retryAll()is invoked.
- The maximum number of retries for a message, if it fails or
-
dead_letter_queuestringoptional- The name of another queue to send a message if it fails processing at least
max_retriestimes. - If a
dead_letter_queueis not defined, messages that repeatedly fail processing will be discarded. - If there is no queue with the specified name, it will be created automatically.
- The name of another queue to send a message if it fails processing at least
-
max_concurrencynumberoptional- The maximum number of concurrent consumers allowed to run at once. Leaving this unset will mean that the number of invocations will scale to the currently supported maximum.
- Refer to Consumer concurrency for more information on how consumers autoscale, particularly when messages are retried.
-
retry_delaynumberoptional- The number of seconds to delay retried messages for by default, before they are re-delivered to the consumer. This can be overridden on a per-message or per-batch basis when retrying messages.
Example:
{ "queues": { "consumers": [ { "queue": "my-queue", "max_batch_size": 10, "max_batch_timeout": 30, "max_retries": 10, "dead_letter_queue": "my-queue-dlq", "max_concurrency": 5, "retry_delay": 120, // Delay retried messages by 2 minutes before re-attempting delivery }, ], },}[[queues.consumers]]queue = "my-queue"max_batch_size = 10max_batch_timeout = 30max_retries = 10dead_letter_queue = "my-queue-dlq"max_concurrency = 5retry_delay = 120Cloudflare R2 Storage allows developers to store large amounts of unstructured data without the costly egress bandwidth fees associated with typical cloud storage services.
To bind R2 buckets to your Worker, assign an array of the below object to the r2_buckets key.
-
bindingstringrequired- The binding name used to refer to the R2 bucket.
-
bucket_namestringrequired- The name of this R2 bucket.
-
jurisdictionstringoptional- The jurisdiction where this R2 bucket is located, if a jurisdiction has been specified. Refer to Jurisdictional Restrictions.
-
preview_bucket_namestringoptional- The preview name of this R2 bucket. If provided,
wrangler devwill use this name for the R2 bucket. Otherwise, it will usebucket_name. This option is required when usingwrangler dev --remote(but is not required with remote bindings).
- The preview name of this R2 bucket. If provided,
Example:
{ "r2_buckets": [ { "binding": "<BINDING_NAME1>", "bucket_name": "<BUCKET_NAME1>", }, { "binding": "<BINDING_NAME2>", "bucket_name": "<BUCKET_NAME2>", }, ],}[[r2_buckets]]binding = "<BINDING_NAME1>"bucket_name = "<BUCKET_NAME1>"
[[r2_buckets]]binding = "<BINDING_NAME2>"bucket_name = "<BUCKET_NAME2>"A Vectorize index allows you to insert and query vector embeddings for semantic search, classification and other vector search use-cases.
To bind Vectorize indexes to your Worker, assign an array of the below object to the vectorize key.
-
bindingstringrequired- The binding name used to refer to the bound index from your Worker code.
-
index_namestringrequired- The name of the index to bind.
Example:
{ "vectorize": [ { "binding": "<BINDING_NAME>", "index_name": "<INDEX_NAME>", }, ],}[[vectorize]]binding = "<BINDING_NAME>"index_name = "<INDEX_NAME>"A service binding allows you to send HTTP requests to another Worker without those requests going over the Internet. The request immediately invokes the downstream Worker, reducing latency as compared to a request to a third-party service. Refer to About Service Bindings.
To bind other Workers to your Worker, assign an array of the below object to the services key.
-
bindingstringrequired- The binding name used to refer to the bound Worker.
-
servicestringrequired- The name of the Worker.
- To bind to a Worker in a specific environment, you need to append the environment name to the Worker name. This should be in the format
<worker-name>-<environment-name>. For example, to bind to a Worker calledworker-namein itsstagingenvironment,serviceshould be set toworker-name-staging.
-
entrypointstringoptional- The name of the entrypoint to bind to. If you do not specify an entrypoint, the default export of the Worker will be used.
Example:
{ "services": [ { "binding": "<BINDING_NAME>", "service": "<WORKER_NAME>", "entrypoint": "<ENTRYPOINT_NAME>", }, ],}[[services]]binding = "<BINDING_NAME>"service = "<WORKER_NAME>"entrypoint = "<ENTRYPOINT_NAME>"Refer to Assets.
Workers Analytics Engine provides analytics, observability and data logging from Workers. Write data points to your Worker binding then query the data using the SQL API.
To bind Analytics Engine datasets to your Worker, assign an array of the below object to the analytics_engine_datasets key.
-
bindingstringrequired- The binding name used to refer to the dataset.
-
datasetstringoptional- The dataset name to write to. This will default to the same name as the binding if it is not supplied.
Example:
{ "analytics_engine_datasets": [ { "binding": "<BINDING_NAME>", "dataset": "<DATASET_NAME>", }, ],}[[analytics_engine_datasets]]binding = "<BINDING_NAME>"dataset = "<DATASET_NAME>"To communicate with origins that require client authentication, a Worker can present a certificate for mTLS in subrequests. Wrangler provides the mtls-certificate command to upload and manage these certificates.
To create a binding to an mTLS certificate for your Worker, assign an array of objects with the following shape to the mtls_certificates key.
-
bindingstringrequired- The binding name used to refer to the certificate.
-
certificate_idstringrequired- The ID of the certificate. Wrangler displays this via the
mtls-certificate uploadandmtls-certificate listcommands.
- The ID of the certificate. Wrangler displays this via the
Example of a Wrangler configuration file that includes an mTLS certificate binding:
{ "mtls_certificates": [ { "binding": "<BINDING_NAME1>", "certificate_id": "<CERTIFICATE_ID1>", }, { "binding": "<BINDING_NAME2>", "certificate_id": "<CERTIFICATE_ID2>", }, ],}[[mtls_certificates]]binding = "<BINDING_NAME1>"certificate_id = "<CERTIFICATE_ID1>"
[[mtls_certificates]]binding = "<BINDING_NAME2>"certificate_id = "<CERTIFICATE_ID2>"mTLS certificate bindings can then be used at runtime to communicate with secured origins via their fetch method.
Workers AI allows you to run machine learning models, on the Cloudflare network, from your own code – whether that be from Workers, Pages, or anywhere via REST API.
Unlike other bindings, this binding is limited to one AI binding per Worker project.
bindingstringrequired- The binding name.
Example:
{ "ai": { "binding": "AI", // available in your Worker code on `env.AI` },}[ai]binding = "AI"Workflows allow you to build durable, multi-step applications using the Workers platform. A Workflow binding enables your Worker to create and manage Workflow instances programmatically.
To bind Workflows to your Worker, assign an array of the below object to the workflows key.
-
bindingstringrequired- The binding name used to refer to the Workflow in your Worker. The binding must be a valid JavaScript variable name ↗. For example,
binding = "MY_WORKFLOW"would be a valid name for the binding.
- The binding name used to refer to the Workflow in your Worker. The binding must be a valid JavaScript variable name ↗. For example,
-
namestringrequired- The name of the Workflow.
-
class_namestringrequired- The name of the exported Workflow class. The
class_namemust match the name of the Workflow class exported from your Worker code.
- The name of the exported Workflow class. The
-
script_namestringoptional- The name of the Worker script where the Workflow class is defined. Only required if the Workflow is defined in a different Worker than the one the binding is configured on.
-
schedulesstring[]optional- A list of cron schedules that create new instances of this Workflow automatically.
- Use this when you want to run a Workflow on a recurring interval without defining top-level
triggers.cronsand a separatescheduledhandler. - Use a Wrangler release that supports Workflow schedules. If your local schema does not recognize
schedules, update Wrangler first.
Example:
{ "workflows": [ { "binding": "<BINDING_NAME>", "name": "<WORKFLOW_NAME>", "class_name": "<CLASS_NAME>", }, ],}[[workflows]]binding = "<BINDING_NAME>"name = "<WORKFLOW_NAME>"class_name = "<CLASS_NAME>"Static assets allows developers to run front-end websites on Workers. You can configure the directory of assets, an optional runtime binding, and routing configuration options.
You can only configure one collection of assets per Worker.
The following options are available under the assets key.
-
directorystringoptional- Folder of static assets to be served.
- Not required if you're using the Cloudflare Vite plugin, which will automatically point to the client build output.
-
bindingstringoptional- The binding name used to refer to the assets. Optional, and only useful when a Worker script is set with
main.
- The binding name used to refer to the assets. Optional, and only useful when a Worker script is set with
-
run_worker_firstboolean | string[]optional, defaults to false- Controls whether static assets are fetched directly, or a Worker script is invoked. Can be a boolean (
true/false) or an array of route pattern strings with support for glob patterns (*) and exception patterns (!prefix). Patterns must begin with/or!/. Learn more about fetching assets when usingrun_worker_first.
- Controls whether static assets are fetched directly, or a Worker script is invoked. Can be a boolean (
-
html_handling:"auto-trailing-slash" | "force-trailing-slash" | "drop-trailing-slash" | "none"optional, defaults to "auto-trailing-slash"- Determines the redirects and rewrites of requests for HTML content. Learn more about the various options in assets routing.
-
not_found_handling:"single-page-application" | "404-page" | "none"optional, defaults to "none"- Determines the handling of requests that do not map to an asset. Learn more about the various options for routing behavior.
Example:
{ "assets": { "directory": "./public", "binding": "ASSETS", "html_handling": "force-trailing-slash", "not_found_handling": "404-page", },}[assets]directory = "./public"binding = "ASSETS"html_handling = "force-trailing-slash"not_found_handling = "404-page"You can also configure run_worker_first with an array of route patterns:
{ "assets": { "directory": "./public", "binding": "ASSETS", "run_worker_first": [ "/api/*", // API calls go to Worker first "!/api/docs/*", // EXCEPTION: For /api/docs/*, try static assets first ], },}[assets]directory = "./public"binding = "ASSETS"run_worker_first = [ "/api/*", "!/api/docs/*" ]You can define Containers to run alongside your Worker using the containers field.
The following options are available:
-
imagestringrequired- The image to use for the container. This can either be a local path to a
Dockerfile, in which casewrangler deploywill build and push the image, or it can be an image reference. Supported registries are the Cloudflare Registry, Docker Hub, and Amazon ECR. For more information, refer to
- The image to use for the container. This can either be a local path to a