Deploy and manage Cloudflare Workers, Pages, KV, R2, D1, and other Cloudflare services using the wrangler CLI.
Version: 4.59.2+ (Jan 2026). Config format:
wrangler.jsoncrecommended over.toml.
# Create new project
npx create-cloudflare@latest my-worker
# Local dev
wrangler dev
# Deploy
wrangler deploy
# View logs
wrangler tail
Deploy Worker to Cloudflare:
1. Check wrangler.jsonc exists with name, main, compatibility_date
2. wrangler deploy (auto-provisions KV/R2/D1 bindings if IDs missing)
3. wrangler tail to verify
| Task | Command |
|---|---|
| Local dev | wrangler dev |
| Deploy | wrangler deploy |
| View logs | wrangler tail |
| Add secret | wrangler secret put NAME |
| List secrets | wrangler secret list |
| Generate types | wrangler types |
| Check config | wrangler check startup |
{
"name": "my-worker",
"main": "src/index.ts",
"compatibility_date": "2025-01-01",
// Routes
"routes": [
{ "pattern": "example.com/*", "zone_name": "example.com" }
],
// Bindings (IDs optional - auto-provisioned on deploy)
"kv_namespaces": [{ "binding": "KV", "id": "..." }],
"r2_buckets": [{ "binding": "BUCKET", "bucket_name": "my-bucket" }],
"d1_databases": [{ "binding": "DB", "database_id": "..." }],
// Environment variables
"vars": { "ENV": "production" }
}
Add bindings WITHOUT IDs โ Wrangler creates resources on deploy:
{
"kv_namespaces": [{ "binding": "CACHE" }], // No id - auto-created
"r2_buckets": [{ "binding": "ASSETS" }], // No bucket_name - auto-created
"d1_databases": [{ "binding": "DB" }] // No database_id - auto-created
}
| Flag | Purpose |
|---|---|
--x-provision |
Force auto-provision resources |
--x-auto-create |
Auto-create bindings with new resources |
--x-autoconfig |
Auto-detect framework (Next.js, Remix, etc.) |
| Variable | Purpose |
|---|---|
CLOUDFLARE_API_TOKEN |
Auth for CI/CD |
CLOUDFLARE_ACCOUNT_ID |
Override account |
What to do?
โโ New project โ npx create-cloudflare@latest
โโ Local dev โ wrangler dev
โโ Deploy โ wrangler deploy
โโ Add secret โ wrangler secret put NAME
โโ View logs โ wrangler tail
โโ Database ops โ wrangler d1 ...
โโ Storage ops โ wrangler r2 ... or wrangler kv ...
โโ Scheduled jobs โ Add [triggers] to config
wrangler secret put API_KEY
# Enter value when prompted (or pipe: echo "value" | wrangler secret put API_KEY)
{
"name": "my-worker",
"env": {
"staging": {
"vars": { "ENV": "staging" },
"routes": [{ "pattern": "staging.example.com/*" }]
},
"production": {
"vars": { "ENV": "production" },
"routes": [{ "pattern": "example.com/*" }]
}
}
}
wrangler deploy --env staging
wrangler deploy --env production
wrangler d1 create my-db
wrangler d1 execute my-db --file schema.sql
wrangler d1 execute my-db --command "SELECT * FROM users"
wrangler r2 bucket create my-bucket
wrangler r2 object put my-bucket/file.txt --file ./local.txt
wrangler r2 object get my-bucket/file.txt
Copy this to your project's AGENTS.md:
### Cloudflare Wrangler
Wrangler is installed and authenticated.
R2 bucket: `<BUCKET_NAME>`
Account ID: `<ACCOUNT_ID>`
Common commands:
\`\`\`bash
wrangler r2 object put <BUCKET>/<path> --file ./local-file
wrangler r2 object get <BUCKET>/<path> --file ./downloaded
wrangler r2 bucket list
wrangler d1 execute <DB> --command "SELECT * FROM users"
wrangler deploy
\`\`\`
| Topic | Reference |
|---|---|
| All commands | COMMANDS.md |
| Config options | CONFIG.md |
| Pages deployment | PAGES.md |
"keep_vars": true to preserve dashboard editswrangler secret put, never put secrets in configwrangler types after config changes