cloudflare-worker-builder — Claude Code skill: how to install
Scaffolds Cloudflare Worker projects with Hono routing, Vite dev server, and Static Assets. It configures D1, R2, and KV bindings and fixes deployment routing conflicts.
npx skills add jezweb/claude-skills --skill cloudflare-worker-builder -a claude-codeWhat cloudflare-worker-builder does
The skill sets up a Cloudflare Worker boilerplate with Hono and Vite. The agent first asks whether you build an API, a landing page, or a full SPA, then checks storage requirements. After collecting the brief, it runs npm create cloudflare@latest with TypeScript, installs hono alongside @cloudflare/vite-plugin, and populates configuration files such as wrangler.jsonc, vite.config.ts, and src/index.ts.
It enforces Cloudflare-specific architectural rules that prevent silent bugs. Omitting run_worker_first on /api/* routes makes the SPA fallback serve index.html instead of backend JSON data. The skill also enforces export default app because wrapping it in { fetch: app.fetch } triggers an undefined property error in Hono. A separate object syntax is applied only when configuring cron triggers with a scheduled handler.
Automatic provisioning of D1, R2, or KV resources requires Wrangler 4.45 or newer with explicit resource names in wrangler.jsonc. The package provides three reference guides covering ten common runtime bugs, Workers RPC, and gradual deployment setups.
What it helps with
- Scaffold a Cloudflare Worker project using Hono and Vite
- Configure bindings for D1 databases, R2 storage, and KV
- Prevent SPA static asset fallbacks from intercepting API endpoints
- Fix entry point export syntax errors in Hono applications
- Set up scheduled cron handlers alongside the fetch listener
Example prompts for the agent
- Create a new Cloudflare Worker project with Hono, D1 database, and Vite
- Configure KV and R2 bindings in wrangler.jsonc with explicit resource names
- Fix my Cloudflare Worker where API routes return index.html instead of JSON
How to install cloudflare-worker-builder
1Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill cloudflare-worker-builder -a claude-code2Manually: put the files in place
~/.claude/skills/cloudflare-worker-builder/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/cloudflare-worker-builder/
1Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill cloudflare-worker-builder -a codex2Manually: put the files in place
.agents/skills/cloudflare-worker-builder/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill cloudflare-worker-builder -a cursor2Manually: put the files in place
.cursor/skills/cloudflare-worker-builder/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install jezweb/claude-skills cloudflare-worker-builder2Manually: put the files in place
.github/skills/cloudflare-worker-builder/SKILL.md1Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill cloudflare-worker-builder -a gemini-cli2Platform CLI
gemini skills install https://github.com/jezweb/claude-skills --path archive/plugins/cloudflare/skills/cloudflare-worker-builderManually: put the files in place
.devin/skills/cloudflare-worker-builder/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill cloudflare-worker-builder -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about cloudflare-worker-builder
How to install cloudflare-worker-builder in Claude Code?
Install the skill by running npx skills add jezweb/claude-skills --skill cloudflare-worker-builder -a claude-code.
What does the cloudflare-worker-builder skill do?
It scaffolds Cloudflare Worker projects with Hono routing, Vite dev server, and Static Assets. The skill also configures D1, R2, and KV bindings while troubleshooting runtime and export syntax issues.
Why is the run_worker_first parameter required for static assets?
When serving an SPA, the asset handler intercepts unmatched routes and returns index.html. Adding run_worker_first: ["/api/*"] ensures API requests reach the Worker code and return JSON responses.
Source text
SKILL.md · MIT
---
name: cloudflare-worker-builder
description: "Scaffold and deploy Cloudflare Workers with Hono routing, Vite plugin, and Static Assets. Describe project, scaffold structure, configure bindings, deploy. Use whenever the user wants to create a Worker project, set up Hono on Cloudflare, configure D1 / R2 / KV / Queues bindings, or troubleshoot Worker export syntax, API route conflicts, HMR issues, or deployment failures."
compatibility: claude-code-only
---
# Cloudflare Worker Builder
Scaffold a working Cloudflare Worker project from a brief description. Produces a deployable project with Hono routing, Vite dev server, and Static Assets.
## Workflow
### Step 1: Understand the Project
Ask about the project to choose the right bindings and structure:
- What does the app do? (API only, SPA + API, landing page)
- What data storage? (D1 database, R2 files, KV cache, none)
- Auth needed? (Clerk, better-auth, none)
- Custom domain or workers.dev subdomain?
A brief like "todo app with database" is enough to proceed.
### Step 2: Scaffold the Project
```bash
npm create cloudflare@latest my-worker -- --type hello-world --ts --git --deploy false --framework none
cd my-worker
npm install hono
npm install -D @cloudflare/vite-plugin vite
```
Copy and customise the asset files from this skill's `assets/` directory:
- `wrangler.jsonc` — Worker configuration
- `vite.config.ts` — Vite + Cloudflare plugin
- `src/index.ts` — Hono app with Static Assets fallback
- `package.json` — Scripts and dependencies
- `tsconfig.json` — TypeScript config
- `public/index.html` — SPA entry point
### Step 3: Configure Bindings
Add bindings to `wrangler.jsonc` based on project needs. Wrangler 4.45+ auto-provisions resources on first deploy — always specify explicit names:
```jsonc
{
"name": "my-worker",
"main": "src/index.ts",
"compatibility_date": "2025-11-11",
"assets": {
"directory": "./public/",
"binding": "ASSETS",
"not_found_handling": "single-page-application",
"run_worker_first": ["/api/*"]
},
// Add as needed:
"d1_databases": [{ "binding": "DB", "database_name": "my-app-db" }],
"r2_buckets": [{ "binding": "STORAGE", "bucket_name": "my-app-files" }],
"kv_namespaces": [{ "binding": "CACHE", "title": "my-app-cache" }]
}
```
### Step 4: Deploy
```bash
npm run dev # Local dev at http://localhost:8787
wrangler deploy # Production deploy
```
---
## Critical Patterns
### Export Syntax
```typescript
// CORRECT — use this pattern
export default app
// WRONG — causes "Cannot read properties of undefined"
export default { fetch: app.fetch }
```
Source: [honojs/hono #3955](https://github.com/honojs/hono/issues/3955)
### Static Assets + API Routes
Without `run_worker_first`, SPA fallback intercepts API routes and returns `index.html` instead of JSON:
```jsonc
"assets": {
"not_found_handling": "single-page-application",
"run_worker_first": ["/api/*"] // CRITICAL
}
```
Source: [workers-sdk #8879](https://github.com/cloudflare/workers-sdk/issues/8879)
### Vite Config
```typescript
import { defineConfig } from 'vite'
import { cloudflare } from '@cloudflare/vite-plugin'
export default defineConfig({ plugins: [cloudflare()] })
```
Always set the `main` field in wrangler.jsonc — the Vite plugin needs it.
### Scheduled/Cron Handlers
When adding cron triggers, switch to explicit export:
```typescript
export default {
fetch: app.fetch,
scheduled: async (event, env, ctx) => { /* ... */ }
}
```
---
## Reference Files
Read these for detailed troubleshooting:
- `references/common-issues.md` — 10 documented issues with sources and fixes
- `references/architecture.md` — Route priority, caching, Workers RPC
- `references/deployment.md` — CI/CD, auto-provisioning, gradual rollouts
© jezweb · MIT · jezweb/claude-skills