Clawhub Publish
v1.4.2Deploy to Vercel. Auto-activates for any Vercel task — editing a landing page, deploying, aliasing, updating a site.
Like a lobster shell, security has layers — review code before you run it.
Skill: Vercel Deploy
When to activate (automatically, without prompting)
- any mention of Vercel, landing page, or site on vercel.app
- task "update site", "deploy", "fix landing"
- editing an HTML file in a project folder with
.vercel/project.json
Auth flow (before anything else)
vercel whoami 2>&1
Authorized → proceed.
Not authorized → one-time setup:
→ In Claude Code (has a browser):
vercel login
→ In OpenClaw or any headless agent:
- Tell the user:
"Open vercel.com/account/tokens → Create Token → copy it and send it here. You only need to do this once."
- Once received, verify:
export VERCEL_TOKEN=<token>
vercel whoami
- Store securely — do NOT write the token to
~/.zshrcor any file. Keep it in env for this session only, or ask the user to add it to their secrets manager.
Creating or editing HTML files
CRITICAL: Never output HTML in the response text.
Always write directly to a file using the Write/Edit tool:
- ✅ Write tool →
index.html→ deploy - ❌ Print HTML in response → copy-paste → deploy
Reason: large HTML files exceed the 32k output token limit and Claude hangs mid-generation. Writing to a file has no such limit.
If the file is very large (>300 lines), build it in logical sections using Edit tool rather than rewriting from scratch.
Pre-deploy checklist (required)
1. Make ALL changes first
❌ ANTI-PATTERN: deploy after each individual edit ✅ Rule: all edits in file first → one deploy
2. Check for .vercel/project.json
ls .vercel/project.json
File exists → proceed to deploy.
File does not exist → first deploy, Vercel will create the project automatically:
vercel deploy --yes --prod
# Vercel creates the project and .vercel/project.json on first run
3. Verify changes are actually in the file
grep -c "expected string" index.html
Deploy recipe
# Deploy (run from project folder)
vercel deploy --yes --prod 2>&1 | grep -E "https://|Error"
# If custom alias was not assigned automatically — set it manually:
# For personal accounts (no --scope needed):
vercel alias set <deploy-url> <alias>.vercel.app
# For team accounts only:
vercel alias set <deploy-url> <alias>.vercel.app --scope YOUR_TEAM_SCOPE
Note: script -q /dev/null suppresses interactive prompts on macOS but breaks on Linux. Use plain vercel deploy instead — --yes flag handles prompts cross-platform.
Post-deploy verification (required)
curl -s https://<alias>.vercel.app | grep "expected string"
# 200 + expected string = ✅ done
Removing SSO (if site is locked behind auth)
PROJECT_ID=$(python3 -c "import json; print(json.load(open('.vercel/project.json'))['projectId'])")
TOKEN=$(python3 -c "import json; print(json.load(open('$HOME/Library/Application Support/com.vercel.cli/auth.json'))['token'])")
# For personal accounts:
curl -s -X PATCH "https://api.vercel.com/v9/projects/$PROJECT_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"ssoProtection":null,"passwordProtection":null,"trustedIps":null}'
# For team accounts — add teamId:
curl -s -X PATCH "https://api.vercel.com/v9/projects/$PROJECT_ID?teamId=YOUR_TEAM_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"ssoProtection":null,"passwordProtection":null,"trustedIps":null}'
Final output (always)
After a successful deploy, the last message to the user must be the public URL — nothing else:
✅ https://<alias>.vercel.app
❌ Anti-patterns (from practice)
| What went wrong | How to do it right |
|---|---|
| Generated HTML in response text (hit 32k token limit) | Always write HTML directly to file using Write/Edit tool |
| Deployed from home directory (wrong CWD) | Always deploy from the project folder with .vercel/project.json |
| Multiple deploys for separate edits | All edits → one deploy |
| Didn't verify file actually changed before deploying | grep before deploying |
| Didn't verify after deploy | curl on the live URL after every deploy |
Used --scope on a personal account | --scope is for team accounts only |
Used script -q /dev/null on Linux | Use plain vercel deploy --yes instead |
Stored token in ~/.zshrc | Keep token in env only, never write to files |
| Started with partial understanding | Read source fully first, make a diff, then apply all edits |
Gotchas
--nameis deprecated — don't use itvercel project rmdoesn't support--yes— interactive onlyvercelAuthenticationis NOT supported in API v9 — usessoProtection: null- After
vercel deploy --prodthe default alias is assigned automatically, custom alias is not (always verify) - First deploy on a new project: no
.vercel/project.jsonyet — just runvercel deploy --yes --prod, it creates the project automatically
Comments
Loading comments...
