| name | wrangler |
| description | Cloudflare Workers CLI for deploying, developing, and managing Workers, KV, R2, D1, Vectorize, Hyperdrive, Workers AI, Containers, Queues, Workflows, Pipelines, and Secrets Store. Load before running wrangler commands to ensure correct syntax and best practices. Biases towards retrieval from Cloudflare docs over pre-trained knowledge. |
Wrangler CLI
Your knowledge of Wrangler CLI flags, config fields, and subcommands may be outdated. Prefer retrieval over pre-training for any Wrangler task.
Retrieval Sources
Fetch the latest information before writing or reviewing Wrangler commands and config. Do not rely on baked-in knowledge for CLI flags, config fields, or binding shapes.
| Source | How to retrieve | Use for |
|---|
| Wrangler docs | https://developers.cloudflare.com/workers/wrangler/ | CLI commands, flags, config reference |
| Wrangler config schema | node_modules/wrangler/config-schema.json | Config fields, binding shapes, allowed values |
| Cloudflare docs | Search tool or https://developers.cloudflare.com/workers/ | API reference, compatibility dates/flags |
FIRST: Verify Wrangler Installation
wrangler --version
If not installed:
npm install -D wrangler@latest
Key Guidelines
- Use
wrangler.jsonc: Prefer JSON config over TOML. Newer features are JSON-only.
- Set
compatibility_date: Use a recent date (within 30 days). Check https://developers.cloudflare.com/workers/configuration/compatibility-dates/
- Generate types after config changes: Run
wrangler types to update TypeScript bindings.
- Local dev defaults to local storage: Bindings use local simulation unless
remote: true.
- Profile Worker startup: Run
wrangler check startup to measure startup time and detect scripts that exceed the startup time limit.
- Use environments for staging/prod: Define
env.staging and env.production in config.
Quick Start: New Worker
npx wrangler init my-worker
npx create-cloudflare@latest my-app
Quick Reference: Core Commands
| Task | Command |
|---|
| Start local dev server | wrangler dev |
| Deploy to Cloudflare | wrangler deploy |
| Deploy dry run | wrangler deploy --dry-run |
| Generate TypeScript types | wrangler types |
| Profile Worker startup time | wrangler check startup |
| View live logs | wrangler tail |
| Delete Worker | wrangler delete |
| Auth status | wrangler whoami |
Configuration (wrangler.jsonc)
Minimal Config
{
"$schema": "./node_modules/wrangler/config-schema.json",
"name": "my-worker",
"main": "src/index.ts",
"compatibility_date": "2026-01-01",
}
Full Config with Bindings
{
"$schema": "./node_modules/wrangler/config-schema.json",
"name": "my-worker",
"main": "src/index.ts",
"compatibility_date": "2026-01-01",
"compatibility_flags": ["nodejs_compat"],
"vars": {
"ENVIRONMENT": "production",
},
"kv_namespaces": [{ "binding": "KV", "id": "<KV_NAMESPACE_ID>" }],
"r2_buckets": [{ "binding": "BUCKET", "bucket_name": "my-bucket" }],
"d1_databases": [{ "binding": "DB", "database_name": "my-db", "database_id": "<DB_ID>" }],
"ai": { "binding": "AI" },
"vectorize": [{ "binding": "VECTOR_INDEX", "index_name": "my-index" }],
"hyperdrive": [{ "binding": "HYPERDRIVE", "id": "<HYPERDRIVE_ID>" }],
"durable_objects": {
"bindings": [{ "name": "COUNTER", "class_name": "Counter" }],
},
"triggers": {
"crons": ["0 * * * *"],
},
"env": {
"staging": {
"name": "my-worker-staging",
"vars": { "ENVIRONMENT": "staging" },
},
},
}
Generate Types from Config
wrangler types
wrangler types ./src/env.d.ts
wrangler types --check
Local Development
Start Dev Server
wrangler dev
wrangler dev --env staging
wrangler dev --local
wrangler dev --remote
wrangler dev --port 8787
wrangler dev --live-reload
wrangler dev --test-scheduled
Remote Bindings for Local Dev
Use remote: true in binding config to connect to real resources while running locally:
{
"r2_buckets": [{ "binding": "BUCKET", "bucket_name": "my-bucket", "remote": true }],
"ai": { "binding": "AI", "remote": true },
"vectorize": [{ "binding": "INDEX", "index_name": "my-index", "remote": true }],
}
Recommended remote bindings: AI (required), Vectorize, Browser Rendering, mTLS, Images.
Local Secrets
Create .dev.vars for local development secrets:
API_KEY=local-dev-key
DATABASE_URL=postgres://localhost:5432/dev
Deployment
Deploy Worker
wrangler deploy
wrangler deploy --env staging
wrangler deploy --dry-run
wrangler deploy --keep-vars
wrangler deploy --minify
Manage Secrets
wrangler secret put API_KEY
echo "secret-value" | wrangler secret put API_KEY
wrangler secret list
wrangler secret delete API_KEY
wrangler secret bulk secrets.json
Versions and Rollback
wrangler versions list
wrangler versions view <VERSION_ID>
wrangler rollback
wrangler rollback <VERSION_ID>
KV (Key-Value Store)
Manage Namespaces
wrangler kv namespace create MY_KV
wrangler kv namespace list
wrangler kv namespace delete --namespace-id <ID>
Manage Keys
wrangler kv key put --namespace-id <ID> "key" "value"
wrangler kv key put --namespace-id <ID> "key" "value" --expiration-ttl 3600
wrangler kv key get --namespace-id <ID> "key"
wrangler kv key list --namespace-id <ID>
wrangler kv key delete --namespace-id <ID> "key"
wrangler kv bulk put --namespace-id <ID> data.json
Config Binding
{
"kv_namespaces": [{ "binding": "CACHE", "id": "<NAMESPACE_ID>" }],
}
R2 (Object Storage)
Manage Buckets
wrangler r2 bucket create my-bucket
wrangler r2 bucket create my-bucket --location wnam
wrangler r2 bucket list
wrangler r2 bucket info my-bucket
wrangler r2 bucket delete my-bucket
Manage Objects
wrangler r2 object put my-bucket/path/file.txt --file ./local-file.txt
wrangler r2 object get my-bucket/path/file.txt
wrangler r2 object delete my-bucket/path/file.txt
Config Binding
{
"r2_buckets": [{ "binding": "ASSETS", "bucket_name": "my-bucket" }],
}
D1 (SQL Database)
Manage Databases
wrangler d1 create my-database
wrangler d1 create my-database --location wnam
wrangler d1 list
wrangler d1 info my-database
wrangler d1 delete my-database
Execute SQL
wrangler d1 execute my-database --remote --command "SELECT * FROM users"
wrangler d1 execute my-database --remote --file ./schema.sql
wrangler d1 execute my-database --local --command "SELECT * FROM users"
Migrations
wrangler d1 migrations create my-database create_users_table
wrangler d1 migrations list my-database --local
wrangler d1 migrations apply my-database --local
wrangler d1 migrations apply my-database --remote
Export/Backup
wrangler d1 export my-database --remote --output backup.sql
wrangler d1 export my-database --remote --output schema.sql --no-data
Config Binding
{
"d1_databases": [
{
"binding": "DB",
"database_name": "my-database",
"database_id": "<DATABASE_ID>",
"migrations_dir": "./migrations",
},
],
}
Vectorize (Vector Database)
Manage Indexes
wrangler vectorize create my-index --dimensions 768 --metric cosine
wrangler vectorize create my-index --preset @cf/baai/bge-base-en-v1.5
wrangler vectorize list
wrangler vectorize get my-index
wrangler vectorize delete my-index
Manage Vectors
wrangler vectorize insert my-index --file vectors.ndjson
wrangler vectorize query my-index --vector "[0.1, 0.2, ...]" --top-k 10
Config Binding
{
"vectorize": [{ "binding": "SEARCH_INDEX", "index_name": "my-index" }],
}
Hyperdrive (Database Accelerator)
Manage Configs
wrangler hyperdrive create my-hyperdrive \
--connection-string "postgres://user:pass@host:5432/database"
wrangler hyperdrive list
wrangler hyperdrive get <HYPERDRIVE_ID>
wrangler hyperdrive update <HYPERDRIVE_ID> --origin-password "new-password"
wrangler hyperdrive delete <HYPERDRIVE_ID>
Config Binding
{
"compatibility_flags": ["nodejs_compat"],
"hyperdrive": [{ "binding": "HYPERDRIVE", "id": "<HYPERDRIVE_ID>" }],
}
Workers AI
List Models
wrangler ai models
wrangler ai finetune list
Config Binding
{
"ai": { "binding": "AI" },
}
Note: Workers AI always runs remotely and incurs usage charges even in local dev.
Queues
Manage Queues
wrangler queues create my-queue
wrangler queues list
wrangler queues delete my-queue
wrangler queues consumer add my-queue my-worker
wrangler queues consumer remove my-queue my-worker
Config Binding
{
"queues": {
"producers": [{ "binding": "MY_QUEUE", "queue": "my-queue" }],
"consumers": [
{
"queue": "my-queue",
"max_batch_size": 10,
"max_batch_timeout": 30,
},
],
},
}
Containers
Build and Push Images
wrangler containers build -t my-app:latest .
wrangler containers build -t my-app:latest . --push
wrangler containers push my-app:latest
Manage Containers
wrangler containers list
wrangler containers info <CONTAINER_ID>
wrangler containers delete <CONTAINER_ID>
Manage Images
wrangler containers images list
wrangler containers images delete my-app:latest
Manage External Registries
wrangler containers registries list
wrangler containers registries configure <DOMAIN> \
--public-credential <AWS_ACCESS_KEY_ID>
wrangler containers registries delete <DOMAIN>
Workflows
Manage Workflows
wrangler workflows list
wrangler workflows describe my-workflow
wrangler workflows trigger my-workflow
wrangler workflows trigger my-workflow --params '{"key": "value"}'
wrangler workflows delete my-workflow
Manage Workflow Instances
wrangler workflows instances list my-workflow
wrangler workflows instances describe my-workflow <INSTANCE_ID>
wrangler workflows instances terminate my-workflow <INSTANCE_ID>
Config Binding
{
"workflows": [
{
"binding": "MY_WORKFLOW",
"name": "my-workflow",
"class_name": "MyWorkflow",
},
],
}
Pipelines
Manage Pipelines
wrangler pipelines create my-pipeline --r2 my-bucket
wrangler pipelines list
wrangler pipelines show my-pipeline
wrangler pipelines update my-pipeline --batch-max-mb 100
wrangler pipelines delete my-pipeline
Config Binding
{
"pipelines": [{ "binding": "MY_PIPELINE", "pipeline": "my-pipeline" }],
}
Secrets Store
Manage Stores
wrangler secrets-store store create my-store
wrangler secrets-store store list
wrangler secrets-store store delete <STORE_ID>
Manage Secrets in Store
wrangler secrets-store secret put <STORE_ID> my-secret
wrangler secrets-store secret list <STORE_ID>
wrangler secrets-store secret get <STORE_ID> my-secret
wrangler secrets-store secret delete <STORE_ID> my-secret
Config Binding
{
"secrets_store_secrets": [
{
"binding": "MY_SECRET",
"store_id": "<STORE_ID>",
"secret_name": "my-secret",
},
],
}
Pages (Frontend Deployment)
wrangler pages project create my-site
wrangler pages deploy ./dist
wrangler pages deploy ./dist --branch main
wrangler pages deployment list --project-name my-site
Observability
Tail Logs
wrangler tail
wrangler tail my-worker
wrangler tail --status error
wrangler tail --search "error"
wrangler tail --format json
Config Logging
{
"observability": {
"enabled": true,
"head_sampling_rate": 1,
},
}
Testing
Local Testing with Vitest
npm install -D @cloudflare/vitest-pool-workers vitest
vitest.config.ts:
import { defineWorkersConfig } from '@cloudflare/vitest-pool-workers/config';
export default defineWorkersConfig({
test: {
poolOptions: {
workers: {
wrangler: { configPath: './wrangler.jsonc' },
},
},
},
});
Test Scheduled Events
wrangler dev --test-scheduled
curl http://localhost:8787/__scheduled
Troubleshooting
Common Issues
| Issue | Solution |
|---|
command not found: wrangler | Install: npm install -D wrangler |
| Auth errors | Run wrangler login |
| Startup time limit exceeded | Run wrangler check startup to profile startup and generate CPU profiles |
| Type errors after config change | Run wrangler types |
| Local storage not persisting | Check .wrangler/state directory |
| Binding undefined in Worker | Verify binding name matches config exactly |
Debug Commands
wrangler whoami
wrangler check startup
wrangler docs configuration
Best Practices
- Version control
wrangler.jsonc: Treat as source of truth for Worker config.
- Use automatic provisioning: Omit resource IDs for auto-creation on deploy.
- Run
wrangler types in CI: Add to build step to catch binding mismatches.
- Use environments: Separate staging/production with
env.staging, env.production.
- Set
compatibility_date: Update quarterly to get new runtime features.
- Use
.dev.vars for local secrets: Never commit secrets to config.
- Test locally first:
wrangler dev with local bindings before deploying.
- Use
--dry-run before major deploys: Validate changes without deployment.