Labsco
cloudflare logo

wrangler

✓ Official2,000

by Cloudflare · part of cloudflare/skills

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.

🔥🔥🔥🔥✓ VerifiedFreeQuick setup
🧩 One of 7 skills in the cloudflare/skills package — works on its own, and pairs well with its siblings.

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.

Inspect the full instructions your agent will receiveExpand

This is the exact playbook injected into your agent when the skill activates — shown here so you can audit it before installing. You don't need to read it to use the skill.

by Cloudflare

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. npx skills add https://github.com/cloudflare/skills --skill wrangler Download ZIPGitHub2k

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

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

Local Development

Start Dev Server

Copy & paste — that's it
# Local mode (default) - uses local storage simulation
wrangler dev

# With specific environment
wrangler dev --env staging

# Force local-only (disable remote bindings)
wrangler dev --local

# Remote mode - runs on Cloudflare edge (legacy)
wrangler dev --remote

# Custom port
wrangler dev --port 8787

# Live reload for HTML changes
wrangler dev --live-reload

# Test scheduled/cron handlers
wrangler 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:

Copy & paste — that's it
{
 "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:

Copy & paste — that's it
API_KEY=local-dev-key
DATABASE_URL=postgres://localhost:5432/dev

KV (Key-Value Store)

Manage Namespaces

Copy & paste — that's it
# Create namespace
wrangler kv namespace create MY_KV

# List namespaces
wrangler kv namespace list

# Delete namespace
wrangler kv namespace delete --namespace-id 

Manage Keys

Copy & paste — that's it
# Put value
wrangler kv key put --namespace-id "key" "value"

# Put with expiration (seconds)
wrangler kv key put --namespace-id "key" "value" --expiration-ttl 3600

# Get value
wrangler kv key get --namespace-id "key"

# List keys
wrangler kv key list --namespace-id 

# Delete key
wrangler kv key delete --namespace-id "key"

# Bulk put from JSON
wrangler kv bulk put --namespace-id data.json

Config Binding

Copy & paste — that's it
{
 "kv_namespaces": [
 { "binding": "CACHE", "id": " " }
 ]
}

R2 (Object Storage)

Manage Buckets

Copy & paste — that's it
# Create bucket
wrangler r2 bucket create my-bucket

# Create with location hint
wrangler r2 bucket create my-bucket --location wnam

# List buckets
wrangler r2 bucket list

# Get bucket info
wrangler r2 bucket info my-bucket

# Delete bucket
wrangler r2 bucket delete my-bucket

Manage Objects

Copy & paste — that's it
# Upload object
wrangler r2 object put my-bucket/path/file.txt --file ./local-file.txt

# Download object
wrangler r2 object get my-bucket/path/file.txt

# Delete object
wrangler r2 object delete my-bucket/path/file.txt

Config Binding

Copy & paste — that's it
{
 "r2_buckets": [
 { "binding": "ASSETS", "bucket_name": "my-bucket" }
 ]
}

D1 (SQL Database)

Manage Databases

Copy & paste — that's it
# Create database
wrangler d1 create my-database

# Create with location
wrangler d1 create my-database --location wnam

# List databases
wrangler d1 list

# Get database info
wrangler d1 info my-database

# Delete database
wrangler d1 delete my-database

Execute SQL

Copy & paste — that's it
# 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 locally
wrangler d1 execute my-database --local --command "SELECT * FROM users"

Migrations

Copy & paste — that's it
# Create migration
wrangler d1 migrations create my-database create_users_table

# List pending migrations
wrangler d1 migrations list my-database --local

# Apply migrations locally
wrangler d1 migrations apply my-database --local

# Apply migrations to remote
wrangler d1 migrations apply my-database --remote

Export/Backup

Copy & paste — that's it
# Export schema and data
wrangler d1 export my-database --remote --output backup.sql

# Export schema only
wrangler d1 export my-database --remote --output schema.sql --no-data

Config Binding

Copy & paste — that's it
{
 "d1_databases": [
 {
 "binding": "DB",
 "database_name": "my-database",
 "database_id": " ",
 "migrations_dir": "./migrations"
 }
 ]
}

Vectorize (Vector Database)

Manage Indexes

Copy & paste — that's it
# Create index with dimensions
wrangler 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 indexes
wrangler vectorize list

# Get index info
wrangler vectorize get my-index

# Delete index
wrangler vectorize delete my-index

Manage Vectors

Copy & paste — that's it
# Insert vectors from NDJSON file
wrangler vectorize insert my-index --file vectors.ndjson

# Query vectors
wrangler vectorize query my-index --vector "[0.1, 0.2, ...]" --top-k 10

Config Binding

Copy & paste — that's it
{
 "vectorize": [
 { "binding": "SEARCH_INDEX", "index_name": "my-index" }
 ]
}

Hyperdrive (Database Accelerator)

Manage Configs

Copy & paste — that's it
# Create config
wrangler hyperdrive create my-hyperdrive \
 --origin-host db.example.com \
 --origin-port 5432 \
 --database my-database \
 --origin-user db-user \
 --origin-password "$DB_PASSWORD"

# Or using a connection string from an environment variable
wrangler hyperdrive create my-hyperdrive \
 --connection-string "$HYPERDRIVE_CONNECTION_STRING"

# List configs
wrangler hyperdrive list

# Get config details
wrangler hyperdrive get 

# Update config
wrangler hyperdrive update \
 --origin-password "$DB_PASSWORD"

# Delete config
wrangler hyperdrive delete 

Config Binding

Copy & paste — that's it
{
 "compatibility_flags": ["nodejs_compat"],
 "hyperdrive": [
 { "binding": "HYPERDRIVE", "id": " " }
 ]
}

Workers AI

List Models

Copy & paste — that's it
# List available models
wrangler ai models

# List finetunes
wrangler ai finetune list

Config Binding

Copy & paste — that's it
{
 "ai": { "binding": "AI" }
}

Note: Workers AI always runs remotely and incurs usage charges even in local dev.

Queues

Manage Queues

Copy & paste — that's it
# Create queue
wrangler queues create my-queue

# List queues
wrangler queues list

# Delete queue
wrangler queues delete my-queue

# Add consumer to queue
wrangler queues consumer add my-queue my-worker

# Remove consumer
wrangler queues consumer remove my-queue my-worker

Config Binding

Copy & paste — that's it
{
 "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

Copy & paste — that's it
# Build container image
wrangler containers build -t my-app:latest .

# Build and push in one command
wrangler containers build -t my-app:latest . --push

# Push existing image to Cloudflare registry
wrangler containers push my-app:latest

Manage Containers

Copy & paste — that's it
# List containers
wrangler containers list

# Get container info
wrangler containers info 

# Delete container
wrangler containers delete 

Manage Images

Copy & paste — that's it
# List images in registry
wrangler containers images list

# Delete image
wrangler containers images delete my-app:latest

Manage External Registries

Security: Never hardcode registry credentials in commands. Use environment variables.

Copy & paste — that's it
# List configured registries
wrangler containers registries list

# Configure external registry (e.g., ECR)
wrangler containers registries configure \
 --aws-access-key-id "$AWS_ACCESS_KEY_ID"

# Configure DockerHub
wrangler containers registries configure \
 --dockerhub-username "$DOCKERHUB_USERNAME"

# Delete registry configuration
wrangler containers registries delete 

Workflows

Manage Workflows

Copy & paste — that's it
# List workflows
wrangler workflows list

# Describe workflow
wrangler workflows describe my-workflow

# Trigger workflow instance
wrangler workflows trigger my-workflow

# Trigger with parameters
wrangler workflows trigger my-workflow --params '{"key": "value"}'

# Delete workflow
wrangler workflows delete my-workflow

Manage Workflow Instances

Copy & paste — that's it
# List instances
wrangler workflows instances list my-workflow

# Describe instance
wrangler workflows instances describe my-workflow 

# Terminate instance
wrangler workflows instances terminate my-workflow 

Config Binding

Copy & paste — that's it
{
 "workflows": [
 {
 "binding": "MY_WORKFLOW",
 "name": "my-workflow",
 "class_name": "MyWorkflow"
 }
 ]
}

Pipelines

Manage Pipelines

Copy & paste — that's it
# Create pipeline
wrangler pipelines create my-pipeline --r2 my-bucket

# List pipelines
wrangler pipelines list

# Show pipeline details
wrangler pipelines show my-pipeline

# Update pipeline
wrangler pipelines update my-pipeline --batch-max-mb 100

# Delete pipeline
wrangler pipelines delete my-pipeline

Config Binding

Copy & paste — that's it
{
 "pipelines": [
 { "binding": "MY_PIPELINE", "pipeline": "my-pipeline" }
 ]
}

Secrets Store

Manage Stores

Copy & paste — that's it
# Create store
wrangler secrets-store store create my-store

# List stores
wrangler secrets-store store list

# Delete store
wrangler secrets-store store delete 

Manage Secrets in Store

Copy & paste — that's it
# Add secret to store
wrangler secrets-store secret put my-secret

# List secrets in store
wrangler secrets-store secret list 

# Get secret
wrangler secrets-store secret get my-secret

# Delete secret from store
wrangler secrets-store secret delete my-secret

Config Binding

Copy & paste — that's it
{
 "secrets_store_secrets": [
 {
 "binding": "MY_SECRET",
 "store_id": " ",
 "secret_name": "my-secret"
 }
 ]
}

Observability

Tail Logs

Copy & paste — that's it
# Stream live logs
wrangler tail

# Tail specific Worker
wrangler tail my-worker

# Filter by status
wrangler tail --status error

# Filter by search term
wrangler tail --search "error"

# JSON output
wrangler tail --format json

Config Logging

Copy & paste — that's it
{
 "observability": {
 "enabled": true,
 "head_sampling_rate": 1
 }
}

Testing

Local Testing with Vitest

Copy & paste — that's it
npm install -D @cloudflare/vitest-pool-workers vitest

vitest.config.ts:

Copy & paste — that's it
import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config";

export default defineWorkersConfig({
 test: {
 poolOptions: {
 workers: {
 wrangler: { configPath: "./wrangler.jsonc" },
 },
 },
 },
});

Test Scheduled Events

Copy & paste — that's it
# Enable in dev
wrangler dev --test-scheduled

# Trigger via HTTP
curl http://localhost:8787/__scheduled

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.

  • Never embed secrets in commands: Use interactive prompts (wrangler secret put), file-based input (wrangler secret bulk), or secure CI environment variables. Never echo, log, or pass secret values as CLI arguments.