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.From its SKILL.md
npx -y skills add popmechanic/VibesOS --skill cloudflareAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- reads credentialsReads from 2 credential sources: `~/.vibes/auth.json` and 1 more.
- runs commandsInstructs the agent to run 2 commands, including `bun "$VIBES_ROOT/scripts/deploy-cloudflare.js" --name myapp --file index.html` and 1 more.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
5.0 KB, ~1.2k tokens by cl100k_base, as published. Nobody here has run it
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 to Cloudflare
Deploy your Vibes app to Cloudflare Workers via the Deploy API.
Prerequisites
- Assembled HTML file (from
/vibes:vibesor/vibes:factory) - Vibes account (browser login on first deploy)
No Cloudflare account or wrangler CLI needed — the Deploy API handles infrastructure.
Quick Deploy
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.
Deploy with AI enabled
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"}.
Endpoints
| 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) |
Important: Custom Domain Required for Subdomains
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
Custom Domain Setup
- Add domain to Cloudflare (get nameservers from Cloudflare DNS dashboard)
- Point registrar nameservers to Cloudflare's assigned nameservers
- Delete conflicting DNS records for the apex domain (A, AAAA, CNAME)
- Add Custom Domain in Workers & Pages → your worker → Settings → Domains & Routes → Add → Custom Domain (apex: yourdomain.com)
- Add wildcard CNAME in DNS: Name:
*, Target:<worker-name>.<username>.workers.dev(Proxied: ON) - Add Route in Workers & Pages → your worker → Settings → Domains & Routes → Add → Route:
*.yourdomain.com/*
After setup:
yourdomain.com→ landing pagetenant.yourdomain.com→ tenant appadmin.yourdomain.com→ admin dashboard
Troubleshooting
| 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 |
What's Next?
After successful deployment, present these options:
AskUserQuestion: question: "Your app is deployed! What would you like to do next?" header: "Next steps" options: - label: "Set up custom domain" description: "Configure DNS for subdomain routing (required for multi-tenant)" - label: "Enable AI features" description: "Add OpenRouter API key for the useAI() hook" - label: "Add auth & SaaS features" description: "Transform into SaaS with /vibes:factory, then redeploy" - label: "Open in browser" description: "Visit the deployed URL to verify everything works"
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most containers cloud skills give in ~1.2k tokens
Counted across 607 of the 705 authors here whose files we hold, read 2026-09-06
- Run as non-root userin 34 of 607, across 27 files
- Use multi-stage buildsin 29 of 607
- Set resource requests and limitsin 24 of 607, across 20 files
- Configure liveness and readiness probesin 18 of 607, across 14 files
- Use named volumes for persistent datain 14 of 607, across 9 files
- Pin base image versionsin 14 of 607
- Set up environment variablesin 14 of 607, across 10 files
- Pin provider versionsin 14 of 607
- Apply least privilege RBAC permissionsin 10 of 607, across 7 files
- Create a dockerignore filein 10 of 607
- Use remote state with lockingin 9 of 607
- Pin base images by digestin 9 of 607, across 8 files
Said here and by no other author read
- Include static assets in assets directory
- Open the printed URL if headless
- Delete auth json if token expires
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.