--- name: deploy-to-vercel description: "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\"." risk: critical source: "https://github.com/vercel-labs/agent-skills" date_added: "2026-06-02" --- # Deploy to Vercel Deploy any project to Vercel. **Always deploy as preview** (not production) unless the user explicitly asks for production. 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. ## When to Use - Use this skill when the task matches this description: 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". ## Step 1: Gather Project State Run all four checks before deciding which method to use: ```bash # 1. Check for a git remote git remote get-url origin 2>/dev/null # 2. Check if locally linked to a Vercel project (either file means linked) cat .vercel/project.json 2>/dev/null || cat .vercel/repo.json 2>/dev/null # 3. Check if the Vercel CLI is installed and authenticated vercel whoami 2>/dev/null # 4. List available teams (if authenticated) vercel teams list --format json 2>/dev/null ``` ### Team selection 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. Pass the team slug via `--scope` on all subsequent CLI commands (`vercel deploy`, `vercel link`, `vercel inspect`, etc.): ```bash vercel deploy [path] -y --no-wait --scope ``` 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. **About the `.vercel/` directory:** A linked project has either: - `.vercel/project.json` — created by `vercel link` (single project linking). Contains `projectId` and `orgId`. - `.vercel/repo.json` — created by `vercel link --repo` (repo-based linking). Contains `orgId`, `remoteName`, and a `projects` array mapping directories to Vercel project IDs. Either file means the project is linked. Check for both. **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. ## Step 2: Choose a Deploy Method ### Linked (`.vercel/` exists) + has git remote → Git Push A local link plus a Git remote does not prove Vercel Git integration. Verify the linked project, target directory, connected repository and production branch in the dashboard. Use a preview branch or a direct preview deployment; never push a production branch for a preview request. 1. **Ask the user before pushing.** Never push without explicit approval: ``` This project is connected to Vercel via git. I can commit and push to trigger a deployment. Want me to proceed? ``` 2. **Commit and push:** ```bash git add -- git commit -m "deploy: " git push ``` Vercel automatically builds from the push. Non-production branches get preview deployments; the production branch (usually `main`) gets a production deployment. 3. **Retrieve the preview URL.** If the CLI is authenticated: ```bash sleep 5 vercel ls --format json ``` The JSON output has a `deployments` array. Match the project, commit SHA, branch and deployment target; the latest entry could belong to another build. A queued URL is not a successful build. 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. --- ### Linked (`.vercel/` exists) + no git remote → `vercel deploy` The project is linked but there's no git repo. Deploy directly with the CLI. ```bash vercel deploy [path] -y --no-wait ``` 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: ```bash vercel inspect ``` For production deploys (only if user explicitly asks): ```bash vercel deploy [path] --prod -y --no-wait ``` --- ### Not linked + CLI is authenticated → Link first, then deploy The CLI is working but the project isn't linked yet. This is the opportunity to get the user into the best state. 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. 2. **Once a team is selected, proceed directly to linking.** Tell the user what will happen but do not ask for separate confirmation: ``` Linking this project to on Vercel. This will create a Vercel project to deploy to and write local link metadata. Git auto-deployment requires a separately configured Git integration. ``` 3. **If a git remote exists**, use repo-based linking with the selected team scope: ```bash vercel link --repo --scope ``` 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. **If there is no git remote**, fall back to standard linking: ```bash vercel link --scope ``` This prompts the user to select or create a project. It creates `.vercel/project.json`. 4. **Then deploy using the best available method:** - If a git remote exists → commit and push (see git push method above) - If no git remote → `vercel deploy [path] -y --no-wait --scope `, then `vercel inspect ` to check status --- ### Not linked + CLI not authenticated → Install, auth, link, deploy The Vercel CLI isn't set up at all. 1. **Install the CLI (if not already installed):** ```bash npm install -g vercel ``` 2. **Authenticate:** ```bash vercel login ``` 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. 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. 4. **Link the project** with the selected team scope (use `--repo` if a git remote exists, plain `vercel link` otherwise): ```bash vercel link --repo --scope # if git remote exists vercel link --scope # if no git remote ``` 5. **Deploy** using the best available method (git push if remote exists, otherwise `vercel deploy -y --no-wait --scope `, then `vercel inspect ` to check status). --- ### No-Auth Fallback — claude.ai sandbox **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). ```bash bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh [path] ``` **Arguments:** - `path` - Directory to deploy, or a `.tgz` file (defaults to current directory) **Examples:** ```bash # Deploy current directory bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh # Deploy specific project bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh /path/to/project # Deploy existing tarball bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh /path/to/project.tgz ``` The helper guesses the framework and uploads an archive to the hosted endpoint shown in the script. Obtain authorization for that recipient and inspect the complete archive first: its small exclusion list is not a secret scanner and does not implement .gitignore/.vercelignore. A supplied archive is uploaded byte-for-byte. Returned URLs do not establish build success. **Tell the user:** "Deployment submitted at [previewUrl]; build status is unverified. The private claim link is [claimUrl]." --- ### No-Auth Fallback — Codex sandbox **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. 1. **Check whether the Vercel CLI is installed** (no escalation needed for this check): ```bash command -v vercel ``` 2. **If `vercel` is installed**, try deploying with the CLI: ```bash vercel deploy [path] -y --no-wait ``` 3. **If `vercel` is not installed, or the CLI fails with "No existing credentials found"**, use the fallback script: ```bash skill_dir="" # Deploy current directory bash "$skill_dir/resources/deploy-codex.sh" # Deploy specific project bash "$skill_dir/resources/deploy-codex.sh" /path/to/project # Deploy existing tarball bash "$skill_dir/resources/deploy-codex.sh" /path/to/project.tgz ``` The same archive-review and recipient-authorization requirements apply. The script submits the archive and returns JSON; it does not verify the build. Keep the claim URL private to the requesting owner. **Tell the user:** "Deployment submitted at [previewUrl]; build status is unverified. The private claim link is [claimUrl]." **Escalated network access:** Follow the active environment approval policy if sandboxing blocks the actual deployment; no skill can authorize bypassing it. Do **not** escalate the `command -v vercel` check. --- ## Agent-Specific Notes ### Claude Code / terminal-based agents You have full shell access. Do NOT use the `/mnt/skills/` path. Follow the decision flow above using the CLI directly. For the no-auth fallback, run the deploy script from the skill's installed location: ```bash bash ~/.claude/skills/deploy-to-vercel/resources/deploy.sh [path] ``` The path may vary depending on where the user installed the skill. ### Sandboxed environments (claude.ai) You likely cannot run `vercel login` or `git push`. Go directly to the **no-auth fallback — claude.ai sandbox**. ### Codex 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**. --- ## Output Always show the user the deployment URL. - **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. - **CLI deploy:** Show the URL returned by `vercel deploy --no-wait`. Use `vercel inspect ` to check build status and report it to the user. - **No-auth fallback:** Show both the preview URL and the claim URL: ``` Deployment submitted; verify build status before calling it successful. Preview URL: https://my-app-abc123.vercel.app Claim URL: https://vercel.com/claim-deployment?code=... View your site at the Preview URL. To transfer this deployment to your Vercel account, visit the Claim URL. ``` Verify the matched deployment status through the authenticated CLI/dashboard. Report pending or failed status truthfully; a URL alone is not live verification. Only fetch an expected project-owned HTTPS URL after checking its origin. --- ## Troubleshooting ### Network Egress Error (claude.ai) If deployment fails due to network restrictions on claude.ai, tell the user: ``` Deployment failed due to network restrictions. To fix this: 1. Go to https://claude.ai/settings/capabilities 2. Add *.vercel.com to the allowed domains 3. Try deploying again ``` ### Escalated Network Access (Codex / sandboxed environments) If deployment fails due to network issues (timeouts, DNS errors, connection resets) in a sandboxed environment, follow the active environment approval policy; a timeout alone does not prove sandbox blocking. Never bypass a denied network policy. Do not escalate the initial CLI availability check — only escalate the actual deploy command. Example guidance to the user: ``` The deploy needs escalated network access to deploy to Vercel. I can rerun the command with escalated permissions — want me to proceed? ``` ### CLI Auth Failure 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). ## Limitations - Use this skill only when the task clearly matches the scope described above. - Do not treat the output as a substitute for environment-specific validation, testing, or expert review. - Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.