byvercel-labs· 154 skills
Deploy applications and websites to Vercel. Use when the user requests deployment actions like "deploy my app", "deploy and give me the link", "push this live", or "create a preview deployment".
$npx -y skills add vercel-labs/agent-skills --skill deploy-to-vercelInstalls into the current project.
Run `npx skills use "https://github.com/vercel-labs/agent-skills" --skill "vercel-labs/agent-skills/deploy-to-vercel"` and follow the generated skill instructions now. Read its complete output, redirecting it to a temporary file first if necessary. Resolve relative paths from the supporting-files directory it provides.
Use the skills in "https://github.com/vercel-labs/agent-skills" that are relevant to the current task. Run `npx skills add "https://github.com/vercel-labs/agent-skills"` and select the relevant skills, then follow their instructions.
| 1 | # Deploy to Vercel |
| 2 | |
| 3 | Deploy any project to Vercel. **Always deploy as preview** (not production) unless the user explicitly asks for production. |
| 4 | |
| 5 | The goal is to get the user into the best long-term setup: their project linked to Vercel with git-push deploys. Every method below tries to move the user closer to that state. |
| 6 | |
| 7 | ## Step 1: Gather Project State |
| 8 | |
| 9 | Run all four checks before deciding which method to use: |
| 10 | |
| 11 | ```bash |
| 12 | # 1. Check for a git remote |
| 13 | git remote get-url origin 2>/dev/null |
| 14 | |
| 15 | # 2. Check if locally linked to a Vercel project (either file means linked) |
| 16 | cat .vercel/project.json 2>/dev/null || cat .vercel/repo.json 2>/dev/null |
| 17 | |
| 18 | # 3. Check if the Vercel CLI is installed and authenticated |
| 19 | vercel whoami 2>/dev/null |
| 20 | |
| 21 | # 4. List available teams (if authenticated) |
| 22 | vercel teams list --format json 2>/dev/null |
| 23 | ``` |
| 24 | |
| 25 | ### Team selection |
| 26 | |
| 27 | If the user belongs to multiple teams, present all available team slugs as a bulleted list and ask which one to deploy to. Once the user picks a team, proceed immediately to the next step — do not ask for additional confirmation. |
| 28 | |
| 29 | Pass the team slug via `--scope` on all subsequent CLI commands (`vercel deploy`, `vercel link`, `vercel inspect`, etc.): |
| 30 | |
| 31 | ```bash |
| 32 | vercel deploy [path] -y --no-wait --scope <team-slug> |
| 33 | ``` |
| 34 | |
| 35 | If the project is already linked (`.vercel/project.json` or `.vercel/repo.json` exists), the `orgId` in those files determines the team — no need to ask again. If there is only one team (or just a personal account), skip the prompt and use it directly. |
| 36 | |
| 37 | **About the `.vercel/` directory:** A linked project has either: |
| 38 | - `.vercel/project.json` — created by `vercel link` (single project linking). Contains `projectId` and `orgId`. |
| 39 | - `.vercel/repo.json` — created by `vercel link --repo` (repo-based linking). Contains `orgId`, `remoteName`, and a `projects` array mapping directories to Vercel project IDs. |
| 40 | |
| 41 | Either file means the project is linked. Check for both. |
| 42 | |
| 43 | **Do NOT** use `vercel project inspect`, `vercel ls`, or `vercel link` to detect state in an unlinked directory — without a `.vercel/` config, they will interactively prompt (or with `--yes`, silently link as a side-effect). Only `vercel whoami` is safe to run anywhere. |
| 44 | |
| 45 | ## Step 2: Choose a Deploy Method |
| 46 | |
| 47 | ### Linked (`.vercel/` exists) + has git remote → Git Push |
| 48 | |
| 49 | This is the ideal state. The project is linked and has git integration. |
| 50 | |
| 51 | 1. **Ask the user before pushing.** Never push without explicit approval: |
| 52 | ``` |
| 53 | This project is connected to Vercel via git. I can commit and push to |
| 54 | trigger a deployment. Want me to proceed? |
| 55 | ``` |
| 56 | |
| 57 | 2. **Commit and push:** |
| 58 | ```bash |
| 59 | git add . |
| 60 | git commit -m "deploy: <description of changes>" |
| 61 | git push |
| 62 | ``` |
| 63 | Vercel automatically builds from the push. Non-production branches get preview deployments; the production branch (usually `main`) gets a production deployment. |
| 64 | |
| 65 | 3. **Retrieve the preview URL.** If the CLI is authenticated: |
| 66 | ```bash |
| 67 | sleep 5 |
| 68 | vercel ls --format json |
| 69 | ``` |
| 70 | The JSON output has a `deployments` array. Find the latest entry — its `url` field is the preview URL. |
| 71 | |
| 72 | If the CLI is not authenticated, tell the user to check the Vercel dashboard or the commit status checks on their git provider for the preview URL. |
| 73 | |
| 74 | --- |
| 75 | |
| 76 | ### Linked (`.vercel/` exists) + no git remote → `vercel deploy` |
| 77 | |
| 78 | The project is linked but there's no git repo. Deploy directly with the CLI. |
| 79 | |
| 80 | ```bash |
| 81 | vercel deploy [path] -y --no-wait |
| 82 | ``` |
| 83 | |
| 84 | Use `--no-wait` so the CLI returns immediately with the deployment URL instead of blocking until the build finishes (builds can take a while). Then check on the deployment status with: |
| 85 | |
| 86 | ```bash |
| 87 | vercel inspect <deployment-url> |
| 88 | ``` |
| 89 | |
| 90 | For production deploys (only if user explicitly asks): |
| 91 | ```bash |
| 92 | vercel deploy [path] --prod -y --no-wait |
| 93 | ``` |
| 94 | |
| 95 | --- |
| 96 | |
| 97 | ### Not linked + CLI is authenticated → Link first, then deploy |
| 98 | |
| 99 | The CLI is working but the project isn't linked yet. This is the opportunity to get the user into the best state. |
| 100 | |
| 101 | 1. **Ask the user which team to deploy to.** Present the team slugs from Step 1 as a bulleted list. If there's only one team (or just a personal account), skip this step. |
| 102 | |
| 103 | 2. **Once a team is selected, proceed directly to linking.** Tell the user what will happen but do not ask for separate confirmation: |
| 104 | ``` |
| 105 | Linking this project to <team name> on Vercel. This will create a Vercel |
| 106 | project to deploy to and enable automatic deployments on future git pushes. |
| 107 | ``` |
| 108 | |
| 109 | 3. **If a git remote exists**, use repo-based linking with the selected team scope: |
| 110 | ```bash |
| 111 | vercel link --repo --scope <team-slug> |
| 112 | ``` |
| 113 | This reads the git remote URL and matches it to existing Vercel projects that deploy from that repo. It creates `.vercel/repo.json`. This is much more reliable than `vercel link` (without `--repo`), which tries to match by directory name and often fails when the local folder and Vercel project are named differently. |
| 114 | |
| 115 | **If there is no git remote**, fall back to standard linking: |
| 116 | ```bash |
| 117 | vercel link --scope <team-slug> |
| 118 | ``` |
| 119 | This prompts the user to select or create a project. It creates `.vercel/project.json`. |
| 120 | |
| 121 | 4. **Then deploy using the best available method:** |
| 122 | - If a git remote exists → commit and push (see git push method above) |
| 123 | - If no git remote → `vercel deploy [path] -y --no-wait --scope <team-slug>`, then `vercel inspect <url>` to check status |
| 124 | |
| 125 | --- |
| 126 | |
| 127 | ### Not linked + CLI not authenticated → Install, auth, link, deploy |
| 128 | |
| 129 | The Vercel CLI isn't set up at all. |
| 130 | |
| 131 | 1. **Install the CLI (if not already installed):** |
| 132 | ```bash |
| 133 | npm install -g vercel |
| 134 | ``` |
| 135 | |
| 136 | 2. **Authenticate:** |
| 137 | ```bash |
| 138 | vercel login |
| 139 | ``` |
| 140 | The user completes auth in their browser. If running in a non-interactive environment where login is not possible, skip to the **no-auth fallback** below. |
| 141 | |
| 142 | 3. **Ask which team to deploy to** — present team slugs from `vercel teams list --format json` as a bulleted list. If only one team / personal account, skip. Once selected, proceed immediately. |
| 143 | |
| 144 | 4. **Link the project** with the selected team scope (use `--repo` if a git remote exists, plain `vercel link` otherwise): |
| 145 | ```bash |
| 146 | vercel link --repo --scope <team-slug> # if git remote exists |
| 147 | vercel link --scope <team-slug> # if no git remote |
| 148 | ``` |
| 149 | |
| 150 | 5. **Deploy** using the best available method (git push if remote exists, otherwise `vercel deploy -y --no-wait --scope <team-slug>`, then `vercel inspect <url>` to check status). |
| 151 | |
| 152 | --- |
| 153 | |
| 154 | ### No-Auth Fallback — claude.ai sandbox |
| 155 | |
| 156 | **When to use:** Last resort when the CLI can't be installed or authenticated in the claude.ai sandbox. This requires no authentication — it returns a **Preview URL** (live site) and a **Claim URL** (transfer to your Vercel account). |
| 157 | |
| 158 | ```bash |
| 159 | bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh [path] |
| 160 | ``` |
| 161 | |
| 162 | **Arguments:** |
| 163 | - `path` - Directory to deploy, or a `.tgz` file (defaults to current directory) |
| 164 | |
| 165 | **Examples:** |
| 166 | ```bash |
| 167 | # Deploy current directory |
| 168 | bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh |
| 169 | |
| 170 | # Deploy specific project |
| 171 | bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh /path/to/project |
| 172 | |
| 173 | # Deploy existing tarball |
| 174 | bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh /path/to/project.tgz |
| 175 | ``` |
| 176 | |
| 177 | The script auto-detects the framework from `package.json`, packages the project (excluding `node_modules`, `.git`, `.env`), uploads it, and waits for the build to complete. |
| 178 | |
| 179 | **Tell the user:** "Your deployment is ready at [previewUrl]. Claim it at [claimUrl] to manage your deployment." |
| 180 | |
| 181 | --- |
| 182 | |
| 183 | ### No-Auth Fallback — Codex sandbox |
| 184 | |
| 185 | **When to use:** In the Codex sandbox where the CLI may not be authenticated. Codex runs in a sandboxed environment by default — try the CLI first, and fall back to the deploy script if auth fails. |
| 186 | |
| 187 | 1. **Check whether the Vercel CLI is installed** (no escalation needed for this check): |
| 188 | ```bash |
| 189 | command -v vercel |
| 190 | ``` |
| 191 | |
| 192 | 2. **If `vercel` is installed**, try deploying with the CLI: |
| 193 | ```bash |
| 194 | vercel deploy [path] -y --no-wait |
| 195 | ``` |
| 196 | |
| 197 | 3. **If `vercel` is not installed, or the CLI fails with "No existing credentials found"**, use the fallback script: |
| 198 | ```bash |
| 199 | skill_dir="<path-to-skill>" |
| 200 | |
| 201 | # Deploy current directory |
| 202 | bash "$skill_dir/resources/deploy-codex.sh" |
| 203 | |
| 204 | # Deploy specific project |
| 205 | bash "$skill_dir/resources/deploy-codex.sh" /path/to/project |
| 206 | |
| 207 | # Deploy existing tarball |
| 208 | bash "$skill_dir/resources/deploy-codex.sh" /path/to/project.tgz |
| 209 | ``` |
| 210 | |
| 211 | The script handles framework detection, packaging, and deployment. It waits for the build to complete and returns JSON with `previewUrl` and `claimUrl`. |
| 212 | |
| 213 | **Tell the user:** "Your deployment is ready at [previewUrl]. Claim it at [claimUrl] to manage your deployment." |
| 214 | |
| 215 | **Escalated network access:** Only escalate the actual deploy command if sandboxing blocks the network call (`sandbox_permissions=require_escalated`). Do **not** escalate the `command -v vercel` check. |
| 216 | |
| 217 | --- |
| 218 | |
| 219 | ## Agent-Specific Notes |
| 220 | |
| 221 | ### Claude Code / terminal-based agents |
| 222 | |
| 223 | You have full shell access. Do NOT use the `/mnt/skills/` path. Follow the decision flow above using the CLI directly. |
| 224 | |
| 225 | For the no-auth fallback, run the deploy script from the skill's installed location: |
| 226 | ```bash |
| 227 | bash ~/.claude/skills/deploy-to-vercel/resources/deploy.sh [path] |
| 228 | ``` |
| 229 | The path may vary depending on where the user installed the skill. |
| 230 | |
| 231 | ### Sandboxed environments (claude.ai) |
| 232 | |
| 233 | You likely cannot run `vercel login` or `git push`. Go directly to the **no-auth fallback — claude.ai sandbox**. |
| 234 | |
| 235 | ### Codex |
| 236 | |
| 237 | Codex runs in a sandbox. Check if the CLI is available first, then fall back to the deploy script. Go to the **no-auth fallback — Codex sandbox**. |
| 238 | |
| 239 | --- |
| 240 | |
| 241 | ## Output |
| 242 | |
| 243 | Always show the user the deployment URL. |
| 244 | |
| 245 | - **Git push:** Use `vercel ls --format json` to find the preview URL. If the CLI isn't authenticated, tell the user to check the Vercel dashboard or commit status checks. |
| 246 | - **CLI deploy:** Show the URL returned by `vercel deploy --no-wait`. Use `vercel inspect <url>` to check build status and report it to the user. |
| 247 | - **No-auth fallback:** Show both the preview URL and the claim URL: |
| 248 | ``` |
| 249 | Deployment successful! |
| 250 | |
| 251 | Preview URL: https://my-app-abc123.vercel.app |
| 252 | Claim URL: https://vercel.com/claim-deployment?code=... |
| 253 | |
| 254 | View your site at the Preview URL. |
| 255 | To transfer this deployment to your Vercel account, visit the Claim URL. |
| 256 | ``` |
| 257 | |
| 258 | **Do not** curl or fetch the deployed URL to verify it works. Just return the link. |
| 259 | |
| 260 | --- |
| 261 | |
| 262 | ## Troubleshooting |
| 263 | |
| 264 | ### Network Egress Error (claude.ai) |
| 265 | |
| 266 | If deployment fails due to network restrictions on claude.ai, tell the user: |
| 267 | |
| 268 | ``` |
| 269 | Deployment failed due to network restrictions. To fix this: |
| 270 | |
| 271 | 1. Go to https://claude.ai/settings/capabilities |
| 272 | 2. Add *.vercel.com to the allowed domains |
| 273 | 3. Try deploying again |
| 274 | ``` |
| 275 | |
| 276 | ### Escalated Network Access (Codex / sandboxed environments) |
| 277 | |
| 278 | If deployment fails due to network issues (timeouts, DNS errors, connection resets) in a sandboxed environment, rerun with escalated permissions (`sandbox_permissions=require_escalated`). Do not escalate the initial CLI availability check — only escalate the actual deploy command. |
| 279 | |
| 280 | Example guidance to the user: |
| 281 | ``` |
| 282 | The deploy needs escalated network access to deploy to Vercel. I can rerun |
| 283 | the command with escalated permissions — want me to proceed? |
| 284 | ``` |
| 285 | |
| 286 | ### CLI Auth Failure |
| 287 | |
| 288 | If `vercel login` or `vercel deploy` fails with authentication errors, fall back to the no-auth deploy script (claude.ai or Codex variant, depending on the environment). |