popmechanic/cloudflare
Self-contained deploy automation — invoke directly, do not decompose. Deploys a Vibes app to Cloudflare Workers via the Deploy API. Use when deploying, publishing, going live, pushing to production, or hosting on the edge.
npx skills add https://github.com/popmechanic/VibesOS --skill cloudflare
> Plan mode: If you are planning work, this entire skill is ONE plan step: "Invoke /vibes:cloudflare". Do not decompose the steps below into separate plan tasks.
╔═══════════════════════════════════════════════╗
║ ☁️ CLOUDFLARE WORKERS DEPLOY ║
║ Deploy API · Pocket ID · Edge Functions ║
╚═══════════════════════════════════════════════╝
Deploy your Vibes app to Cloudflare Workers via the Deploy API.
/vibes:vibes or /vibes:factory)No Cloudflare account or wrangler CLI needed — the Deploy API handles infrastructure.
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
bun "$VIBES_ROOT/scripts/deploy-cloudflare.js" --name myapp --file index.html
On first run, a browser window opens for Pocket ID authentication. Tokens are cached for subsequent deploys.
Static Assets: Place images, fonts, or other static files in an assets/ directory next to the app file. The deploy script auto-discovers and includes them (binary files are base64-encoded). Reference in code with absolute paths like /assets/logo.png.
VIBES_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname "$(dirname "${CLAUDE_SKILL_DIR}")")}"
bun "$VIBES_ROOT/scripts/deploy-cloudflare.js" --name myapp --file index.html --ai-key "sk-or-v1-your-key"
The --ai-key flag configures the OpenRouter API key for the useAI() hook. Without it, /api/ai/chat returns {"error": "AI not configured"}.
| Endpoint | Method | Description |
|----------|--------|-------------|
| /registry.json | GET | Public registry read |
| /check/:subdomain | GET | Check subdomain availability |
| /claim | POST | Claim a subdomain (auth required) |
| /api/ai/chat | POST | AI proxy to OpenRouter (requires AI key) |
Workers.dev domains only support one subdomain level for SSL. For multi-tenant
apps with subdomains (tenant.myapp.workers.dev), you MUST use a custom domain.
Won't work: tenant.myapp.username.workers.dev (SSL error)
Will work: tenant.myapp.com (with custom domain)
On workers.dev, use the ?subdomain= query parameter for testing:
myapp.username.workers.dev → landing pagemyapp.username.workers.dev?subdomain=tenant → tenant appmyapp.username.workers.dev?subdomain=admin → admin dashboard*, Target: <worker-name>.<username>.workers.dev (Proxied: ON)*.yourdomain.com/*After setup:
yourdomain.com → landing pagetenant.yourdomain.com → tenant appadmin.yourdomain.com → admin dashboard| Problem | Cause | Fix |
|---------|-------|-----|
| Browser doesn't open for auth | Headless environment | Copy the printed URL and open manually |
| Deploy API returns 401 | Expired or invalid token | Delete ~/.vibes/auth.json and retry |
| 404 on subdomain URL | Workers.dev doesn't support nested subdomains | Set up a custom domain (see Custom Domain Setup above) |
| /api/ai/chat returns "AI not configured" | Missing OpenRouter key | Redeploy with --ai-key |
| Stale content after redeploy | Browser cache | Hard refresh (Cmd+Shift+R) or clear cache |
After successful deployment, present these options:
AskUserQuestion:
question: "Your app is deployed! What would you like to do next?"
header: "Next steps"
options:
description: "Configure DNS for subdomain routing (required for multi-tenant)"
description: "Add OpenRouter API key for the useAI() hook"
description: "Transform into SaaS with /vibes:factory, then redeploy"
description: "Visit the deployed URL to verify everything works"
Take popmechanic/cloudflare from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.