agentsclimarketplace

Vercel deployment

Skill S3YED/appie-kit/skills/ops/vercel-deployment

Deploy static sites and frontends to Vercel — handles both CLI and REST API paths, including the CLI token sanitization workaround.From its SKILL.md

Install
npx -y skills add S3YED/appie-kit --skill vercel-deployment

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 6 stars6 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

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

4.3 KB, ~1.1k tokens by cl100k_base, as published. Nobody here has run it

Vercel Deployment

Two deployment paths for Vercel. The REST API is the reliable path when the Vercel CLI token validation fails.

Quick Decision

SituationUse
CLI works, token passesvercel deploy --yes --prod
CLI error "Must not contain"REST API (see below)
Static HTML/JS/CSSREST API with base64 files

Detecting CLI vs API

Try CLI first. If it errors with "Must not contain" (any character — dot, star, etc.), the terminal tool's credential sanitization is interfering. Switch to the API path.

Path A: Vercel CLI (when it works)

cd /path/to/project
vercel deploy --yes --prod

Set VERCEL_TOKEN env var OR use --token flag. Use --prebuilt only if you ran vercel build first.

Path B: REST API (reliable — bypasses CLI token issues)

The Vercel CLI 54.x can reject valid tokens when the terminal tool sanitizes credential patterns. The API accepts the same token in the Authorization header without issues.

Python subprocess (recommended)

import json, subprocess, base64

# Read token from .env or config
with open("/root/.hermes/.env") as f:
    for line in f:
        eq = line.find("=")
        if eq > 0 and line[:eq] == "VERCEL_TOKEN":
            TOKEN = line[eq+1:].strip()
            break

hdr = "Authorization: Bearer *** + TOKEN

# Base64-encode files
with open("index.html") as f:
    html_b64 = base64.b64encode(f.read().encode()).decode()

# Optional: include vercel.json for routing
config = {"version": 2, "builds": [{"src": "*.html", "use": "@vercel/static"}], "routes": [{"src": "/(.*)", "dest": "/index.html"}]}
config_b64 = base64.b64encode(json.dumps(config).encode()).decode()

payload = {
    "name": "project-name",
    "files": [
        {"file": "index.html", "data": html_b64},
        {"file": "vercel.json", "data": config_b64}
    ]
}

r = subprocess.run([
    "curl", "-s", "-X", "POST", "https://api.vercel.com/v12/deployments",
    "-H", hdr, "-H", "Content-Type: application/json",
    "-d", json.dumps(payload)
], capture_output=True, text=True, timeout=30)

result = json.loads(r.stdout)
# result["url"] = deployment URL
# result["alias"] = alias URLs
# result["readyState"] = "INITIALIZING" / "READY" / "ERROR"

Bash + curl (alternative)

# Get token from .env (use awk to avoid grep regex issues)
TOKEN=$(python3 -c "open('/root/.hermes/.env').readlines()" | grep VERCEL_TOKEN | cut -d= -f2)

# Base64 files
INDEX_B64=$(cat index.html | base64 -w0)

# Deploy
curl -s -X POST "https://api.vercel.com/v12/deployments" \
  -H "Authorization: Bearer *** \
  -H "Content-Type: application/json" \
  -d "{\"name\":\"project-name\",\"files\":[{\"file\":\"index.html\",\"data\":\"${INDEX_B64}\"}]}"

Pitfalls

  • Terminal credential sanitization: The terminal tool replaces detected token patterns with ***. Commands like export VERCEL_TOKEN=$TOKEN or vercel --token $TOKEN may pass sanitized values. Use Python subprocess or curl with a shell variable that was NOT set in the same command line.
  • API version: v12 is the stable deployment endpoint. v9 works for reading deployment status. Avoid mixing versions for write operations.
  • Vercel JSON requirement: For static sites via API, include vercel.json in the files array or the build may fail. The builds config must reference the correct file pattern.
  • State monitoring: API deployments start as INITIALIZING. Poll GET /v12/deployments/{id} every 5s to check for READY or ERROR state.
  • 404 after deploy: If the deployment succeeds but returns 404, check: (a) the alias hasn't propagated yet (wait 30s), (b) the vercel.json routes don't match the actual file paths, (c) the build silently failed (check errorInfo).
  • Token from .env: Python's open().readlines() may fail on the protected .env file. Use grep or awk in terminal instead. The terminal tool shows *** in output but the actual value is correct.===ME:vercel-deployment

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 326,871. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.