Skill v1.0.0
currentTrusted Publisher100/100version: "1.0.0" 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 # Requires v4.x+
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 typesto update TypeScript bindings. - Local dev defaults to local storage: Bindings use local simulation unless
remote: true. - Validate config before deploy: Run
wrangler checkto catch errors early. - Use environments for staging/prod: Define
env.stagingandenv.productionin config.
Quick Start: New Worker
# Initialize new projectnpx wrangler init my-worker# Or with a frameworknpx 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 | |
| Validate configuration | wrangler check | |
| 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-03-18"}
Full Config with Bindings
{"$schema": "./node_modules/wrangler/config-schema.json","name": "my-worker","main": "src/index.ts","compatibility_date": "2026-03-18","compatibility_flags": ["nodejs_compat_v2"],// Environment variables"vars": {"ENVIRONMENT": "production"},// KV Namespace"kv_namespaces": [{ "binding": "KV", "id": "<KV_NAMESPACE_ID>" }],// R2 Bucket"r2_buckets": [{ "binding": "BUCKET", "bucket_name": "my-bucket" }],// D1 Database"d1_databases": [{ "binding": "DB", "database_name": "my-db", "database_id": "<DB_ID>" }],// Workers AI (always remote)"ai": { "binding": "AI" },// Vectorize"vectorize": [{ "binding": "VECTOR_INDEX", "index_name": "my-index" }],// Hyperdrive"hyperdrive": [{ "binding": "HYPERDRIVE", "id": "<HYPERDRIVE_ID>" }],// Durable Objects"durable_objects": {"bindings": [{ "name": "COUNTER", "class_name": "Counter" }]},// Cron triggers"triggers": {"crons": ["0 * * * *"]},// Environments"env": {"staging": {"name": "my-worker-staging","vars": { "ENVIRONMENT": "staging" }}}}
Generate Types from Config
# Generate worker-configuration.d.tswrangler types# Custom output pathwrangler types ./src/env.d.ts# Check types are up to date (CI)wrangler types --check
Local Development
Start Dev Server
# Local mode (default) - uses local storage simulationwrangler dev# With specific environmentwrangler dev --env staging# Force local-only (disable remote bindings)wrangler dev --local# Remote mode - runs on Cloudflare edge (legacy)wrangler dev --remote# Custom portwrangler dev --port 8787# Live reload for HTML changeswrangler dev --live-reload# Test scheduled/cron handlerswrangler dev --test-scheduled# Then visit: http://localhost:8787/__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-keyDATABASE_URL=postgres://localhost:5432/dev
Deployment
Deploy Worker
# Deploy to productionwrangler deploy# Deploy specific environmentwrangler deploy --env staging# Dry run (validate without deploying)wrangler deploy --dry-run# Keep dashboard-set variableswrangler deploy --keep-vars# Minify codewrangler deploy --minify
Manage Secrets
# Set secret interactivelywrangler secret put API_KEY# Set from stdinecho "secret-value" | wrangler secret put API_KEY# List secretswrangler secret list# Delete secretwrangler secret delete API_KEY# Bulk secrets from JSON filewrangler secret bulk secrets.json
Versions and Rollback
# List recent versionswrangler versions list# View specific versionwrangler versions view <VERSION_ID># Rollback to previous versionwrangler rollback# Rollback to specific versionwrangler rollback <VERSION_ID>
KV (Key-Value Store)
Manage Namespaces
# Create namespacewrangler kv namespace create MY_KV# List namespaceswrangler kv namespace list# Delete namespacewrangler kv namespace delete --namespace-id <ID>
Manage Keys
# Put valuewrangler kv key put --namespace-id <ID> "key" "value"# Put with expiration (seconds)wrangler kv key put --namespace-id <ID> "key" "value" --expiration-ttl 3600# Get valuewrangler kv key get --namespace-id <ID> "key"# List keyswrangler kv key list --namespace-id <ID># Delete keywrangler kv key delete --namespace-id <ID> "key"# Bulk put from JSONwrangler kv bulk put --namespace-id <ID> data.json
Config Binding
{"kv_namespaces": [{ "binding": "CACHE", "id": "<NAMESPACE_ID>" }]}
R2 (Object Storage)
Manage Buckets
# Create bucketwrangler r2 bucket create my-bucket# Create with location hintwrangler r2 bucket create my-bucket --location wnam# List bucketswrangler r2 bucket list# Get bucket infowrangler r2 bucket info my-bucket# Delete bucketwrangler r2 bucket delete my-bucket
Manage Objects
# Upload objectwrangler r2 object put my-bucket/path/file.txt --file ./local-file.txt# Download objectwrangler r2 object get my-bucket/path/file.txt# Delete objectwrangler r2 object delete my-bucket/path/file.txt
Config Binding
{"r2_buckets": [{ "binding": "ASSETS", "bucket_name": "my-bucket" }]}
D1 (SQL Database)
Manage Databases
# Create databasewrangler d1 create my-database# Create with locationwrangler d1 create my-database --location wnam# List databaseswrangler d1 list# Get database infowrangler d1 info my-database# Delete databasewrangler d1 delete my-database
Execute SQL
# Execute SQL command (remote)wrangler d1 execute my-database --remote --command "SELECT * FROM users"# Execute SQL file (remote)wrangler d1 execute my-database --remote --file ./schema.sql# Execute locallywrangler d1 execute my-database --local --command "SELECT * FROM users"
Migrations
# Create migrationwrangler d1 migrations create my-database create_users_table# List pending migrationswrangler d1 migrations list my-database --local# Apply migrations locallywrangler d1 migrations apply my-database --local# Apply migrations to remotewrangler d1 migrations apply my-database --remote
Export/Backup
# Export schema and datawrangler d1 export my-database --remote --output backup.sql# Export schema onlywrangler 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
# Create index with dimensionswrangler vectorize create my-index --dimensions 768 --metric cosine# Create with preset (auto-configures dimensions/metric)wrangler vectorize create my-index --preset @cf/baai/bge-base-en-v1.5# List indexeswrangler vectorize list# Get index infowrangler vectorize get my-index# Delete indexwrangler vectorize delete my-index
Manage Vectors
# Insert vectors from NDJSON filewrangler vectorize insert my-index --file vectors.ndjson# Query vectorswrangler 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
# Create configwrangler hyperdrive create my-hyperdrive \--connection-string "postgres://user:pass@host:5432/database"# List configswrangler hyperdrive list# Get config detailswrangler hyperdrive get <HYPERDRIVE_ID># Update configwrangler hyperdrive update <HYPERDRIVE_ID> --origin-password "new-password"# Delete configwrangler hyperdrive delete <HYPERDRIVE_ID>
Config Binding
{"compatibility_flags": ["nodejs_compat_v2"],"hyperdrive": [{ "binding": "HYPERDRIVE", "id": "<HYPERDRIVE_ID>" }]}
Workers AI
List Models
# List available modelswrangler ai models# List finetuneswrangler 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
# Create queuewrangler queues create my-queue# List queueswrangler queues list# Delete queuewrangler queues delete my-queue# Add consumer to queuewrangler queues consumer add my-queue my-worker# Remove consumerwrangler 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
# Build container imagewrangler containers build -t my-app:latest .# Build and push in one commandwrangler containers build -t my-app:latest . --push# Push existing image to Cloudflare registrywrangler containers push my-app:latest
Manage Containers
# List containerswrangler containers list# Get container infowrangler containers info <CONTAINER_ID># Delete containerwrangler containers delete <CONTAINER_ID>
Manage Images
# List images in registrywrangler containers images list# Delete imagewrangler containers images delete my-app:latest
Manage External Registries
# List configured registrieswrangler containers registries list# Configure external registry (e.g., ECR)wrangler containers registries configure <DOMAIN> \--public-credential <AWS_ACCESS_KEY_ID># Delete registry configurationwrangler containers registries delete <DOMAIN>
Workflows
Manage Workflows
# List workflowswrangler workflows list# Describe workflowwrangler workflows describe my-workflow# Trigger workflow instancewrangler workflows trigger my-workflow# Trigger with parameterswrangler workflows trigger my-workflow --params '{"key": "value"}'# Delete workflowwrangler workflows delete my-workflow
Manage Workflow Instances
# List instanceswrangler workflows instances list my-workflow# Describe instancewrangler workflows instances describe my-workflow <INSTANCE_ID># Terminate instancewrangler workflows instances terminate my-workflow <INSTANCE_ID>
Config Binding
{"workflows": [{"binding": "MY_WORKFLOW","name": "my-workflow","class_name": "MyWorkflow"}]}
Pipelines
Manage Pipelines
# Create pipelinewrangler pipelines create my-pipeline --r2 my-bucket# List pipelineswrangler pipelines list# Show pipeline detailswrangler pipelines show my-pipeline# Update pipelinewrangler pipelines update my-pipeline --batch-max-mb 100# Delete pipelinewrangler pipelines delete my-pipeline
Config Binding
{"pipelines": [{ "binding": "MY_PIPELINE", "pipeline": "my-pipeline" }]}
Secrets Store
Manage Stores
# Create storewrangler secrets-store store create my-store# List storeswrangler secrets-store store list# Delete storewrangler secrets-store store delete <STORE_ID>
Manage Secrets in Store
# Add secret to storewrangler secrets-store secret put <STORE_ID> my-secret# List secrets in storewrangler secrets-store secret list <STORE_ID># Get secretwrangler secrets-store secret get <STORE_ID> my-secret# Delete secret from storewrangler 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)
# Create Pages projectwrangler pages project create my-site# Deploy directory to Pageswrangler pages deploy ./dist# Deploy with specific branchwrangler pages deploy ./dist --branch main# List deploymentswrangler pages deployment list --project-name my-site
Observability
Tail Logs
# Stream live logswrangler tail# Tail specific Workerwrangler tail my-worker# Filter by statuswrangler tail --status error# Filter by search termwrangler tail --search "error"# JSON outputwrangler 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
# Enable in devwrangler dev --test-scheduled# Trigger via HTTPcurl http://localhost:8787/__scheduled
Troubleshooting
Common Issues
| Issue | Solution | |
|---|---|---|
command not found: wrangler | Install: npm install -D wrangler | |
| Auth errors | Run wrangler login | |
| Config validation errors | Run wrangler check | |
| 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
# Check auth statuswrangler whoami# Validate configwrangler check# View config schemawrangler 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 devwith local bindings before deploying. - Use `--dry-run` before major deploys: Validate changes without deployment.