
Vercel Deploy
- 47 installs
- vercel-labs/vercel-skills
This is a copy of vercel-deploy by vercel-labs - installs and ranking accrue to the original listing.
Push a local or packaged project to Vercel and get an immediate preview URL plus a claim link—without logging into Vercel first.
About
Vercel Deploy is an official Vercel agent skill that runs a packaged deploy script to upload your app and return live links. Solo builders use it when they say deploy my app, create a preview, or push this live without stopping to configure CLI auth first. The flow tarballs the tree (skipping node_modules and .git), detects the framework, sends it to Vercel’s deployment service, and prints a preview hostname plus a claim URL to transfer ownership. It supports deploying the current directory, a named path, or a prebuilt .tgz. Primary journey placement is Ship launch, though the same action appears when validating a prototype on a real URL during Validate. Intermediate complexity: you need a deployable Node-oriented project and bash. Pair with normal Vercel account setup after claiming. Not for long-running infra beyond Vercel or non-web artifacts.
- deploy.sh packages project tarball excluding node_modules and .git
- Auto-detects framework from package.json before upload
- Returns Preview URL and Claim URL to attach deployment to your Vercel account
- No Vercel authentication required for the initial preview deploy
- Accepts directory path or existing .tgz archive argument
Vercel Deploy by the numbers
- 47 all-time installs (skills.sh)
- Security screen: CRITICAL risk (skills.sh audit)
- Data as of Jul 7, 2026 (Skillselion catalog sync)
npx skills add https://github.com/vercel-labs/vercel-skills --skill vercel-deployAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 47 |
|---|---|
| Security audit | 2 / 3 scanners passed |
| Repository | vercel-labs/vercel-skills ↗ |
What it does
Push a local or packaged project to Vercel and get an immediate preview URL plus a claim link—without logging into Vercel first.
Files
Vercel Deploy
Deploy any project to Vercel instantly. No authentication required.
How It Works
1. Packages your project into a tarball (excludes node_modules and .git) 2. Auto-detects framework from package.json 3. Uploads to deployment service 4. Returns Preview URL (live site) and Claim URL (transfer to your Vercel account)
Usage
bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh [path]Arguments:
path- Directory to deploy, or a.tgzfile (defaults to current directory)
Examples:
# Deploy current directory
bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh
# Deploy specific project
bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh /path/to/project
# Deploy existing tarball
bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh /path/to/project.tgzOutput
Preparing deployment...
Detected framework: nextjs
Creating deployment package...
Deploying...
✓ Deployment successful!
Preview URL: https://skill-deploy-abc123.vercel.app
Claim URL: https://vercel.com/claim-deployment?code=...The script also outputs JSON to stdout for programmatic use:
{
"previewUrl": "https://skill-deploy-abc123.vercel.app",
"claimUrl": "https://vercel.com/claim-deployment?code=...",
"deploymentId": "dpl_...",
"projectId": "prj_..."
}Framework Detection
The script auto-detects frameworks from package.json. Supported frameworks include:
- React: Next.js, Gatsby, Create React App, Remix, React Router
- Vue: Nuxt, Vitepress, Vuepress, Gridsome
- Svelte: SvelteKit, Svelte, Sapper
- Other Frontend: Astro, Solid Start, Angular, Ember, Preact, Docusaurus
- Backend: Express, Hono, Fastify, NestJS, Elysia, h3, Nitro
- Build Tools: Vite, Parcel
- And more: Blitz, Hydrogen, RedwoodJS, Storybook, Sanity, etc.
For static HTML projects (no package.json), framework is set to null.
Static HTML Projects
For projects without a package.json:
- If there's a single
.htmlfile not namedindex.html, it gets renamed automatically - This ensures the page is served at the root URL (
/)
Present Results to User
Always show both URLs:
✓ Deployment successful!
Preview URL: https://skill-deploy-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.Troubleshooting
Network Egress Error
If deployment fails due to network restrictions (common 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#!/bin/bash
# Vercel Deployment Script (via claimable deploy endpoint)
# Usage: ./deploy.sh [project-path]
# Returns: JSON with previewUrl, claimUrl, deploymentId, projectId
set -e
DEPLOY_ENDPOINT="https://claude-skills-deploy.vercel.com/api/deploy"
# Detect framework from package.json
detect_framework() {
local pkg_json="$1"
if [ ! -f "$pkg_json" ]; then
echo "null"
return
fi
local content=$(cat "$pkg_json")
# Helper to check if a package exists in dependencies or devDependencies
has_dep() {
echo "$content" | grep -q "\"$1\""
}
# Order matters - check more specific frameworks first
# Blitz
if has_dep "blitz"; then echo "blitzjs"; return; fi
# Next.js
if has_dep "next"; then echo "nextjs"; return; fi
# Gatsby
if has_dep "gatsby"; then echo "gatsby"; return; fi
# Remix
if has_dep "@remix-run/"; then echo "remix"; return; fi
# React Router (v7 framework mode)
if has_dep "@react-router/"; then echo "react-router"; return; fi
# TanStack Start
if has_dep "@tanstack/start"; then echo "tanstack-start"; return; fi
# Astro
if has_dep "astro"; then echo "astro"; return; fi
# Hydrogen (Shopify)
if has_dep "@shopify/hydrogen"; then echo "hydrogen"; return; fi
# SvelteKit
if has_dep "@sveltejs/kit"; then echo "sveltekit-1"; return; fi
# Svelte (standalone)
if has_dep "svelte"; then echo "svelte"; return; fi
# Nuxt
if has_dep "nuxt"; then echo "nuxtjs"; return; fi
# Vue with Vitepress
if has_dep "vitepress"; then echo "vitepress"; return; fi
# Vue with Vuepress
if has_dep "vuepress"; then echo "vuepress"; return; fi
# Gridsome
if has_dep "gridsome"; then echo "gridsome"; return; fi
# SolidStart
if has_dep "@solidjs/start"; then echo "solidstart-1"; return; fi
# Docusaurus
if has_dep "@docusaurus/core"; then echo "docusaurus-2"; return; fi
# RedwoodJS
if has_dep "@redwoodjs/"; then echo "redwoodjs"; return; fi
# Hexo
if has_dep "hexo"; then echo "hexo"; return; fi
# Eleventy
if has_dep "@11ty/eleventy"; then echo "eleventy"; return; fi
# Angular / Ionic Angular
if has_dep "@ionic/angular"; then echo "ionic-angular"; return; fi
if has_dep "@angular/core"; then echo "angular"; return; fi
# Ionic React
if has_dep "@ionic/react"; then echo "ionic-react"; return; fi
# Create React App
if has_dep "react-scripts"; then echo "create-react-app"; return; fi
# Ember
if has_dep "ember-cli" || has_dep "ember-source"; then echo "ember"; return; fi
# Dojo
if has_dep "@dojo/framework"; then echo "dojo"; return; fi
# Polymer
if has_dep "@polymer/"; then echo "polymer"; return; fi
# Preact
if has_dep "preact"; then echo "preact"; return; fi
# Stencil
if has_dep "@stencil/core"; then echo "stencil"; return; fi
# UmiJS
if has_dep "umi"; then echo "umijs"; return; fi
# Sapper (legacy Svelte)
if has_dep "sapper"; then echo "sapper"; return; fi
# Saber
if has_dep "saber"; then echo "saber"; return; fi
# Sanity
if has_dep "sanity"; then echo "sanity-v3"; return; fi
if has_dep "@sanity/"; then echo "sanity"; return; fi
# Storybook
if has_dep "@storybook/"; then echo "storybook"; return; fi
# NestJS
if has_dep "@nestjs/core"; then echo "nestjs"; return; fi
# Elysia
if has_dep "elysia"; then echo "elysia"; return; fi
# Hono
if has_dep "hono"; then echo "hono"; return; fi
# Fastify
if has_dep "fastify"; then echo "fastify"; return; fi
# h3
if has_dep "h3"; then echo "h3"; return; fi
# Nitro
if has_dep "nitropack"; then echo "nitro"; return; fi
# Express
if has_dep "express"; then echo "express"; return; fi
# Vite (generic - check last among JS frameworks)
if has_dep "vite"; then echo "vite"; return; fi
# Parcel
if has_dep "parcel"; then echo "parcel"; return; fi
# No framework detected
echo "null"
}
# Parse arguments
INPUT_PATH="${1:-.}"
# Create temp directory for packaging
TEMP_DIR=$(mktemp -d)
TARBALL="$TEMP_DIR/project.tgz"
CLEANUP_TEMP=true
cleanup() {
if [ "$CLEANUP_TEMP" = true ]; then
rm -rf "$TEMP_DIR"
fi
}
trap cleanup EXIT
echo "Preparing deployment..." >&2
# Check if input is a .tgz file or a directory
FRAMEWORK="null"
if [ -f "$INPUT_PATH" ] && [[ "$INPUT_PATH" == *.tgz ]]; then
# Input is already a tarball, use it directly
echo "Using provided tarball..." >&2
TARBALL="$INPUT_PATH"
CLEANUP_TEMP=false
# Can't detect framework from tarball, leave as null
elif [ -d "$INPUT_PATH" ]; then
# Input is a directory, need to tar it
PROJECT_PATH=$(cd "$INPUT_PATH" && pwd)
# Detect framework from package.json
FRAMEWORK=$(detect_framework "$PROJECT_PATH/package.json")
# Check if this is a static HTML project (no package.json)
if [ ! -f "$PROJECT_PATH/package.json" ]; then
# Find HTML files in root
HTML_FILES=$(find "$PROJECT_PATH" -maxdepth 1 -name "*.html" -type f)
HTML_COUNT=$(echo "$HTML_FILES" | grep -c . || echo 0)
# If there's exactly one HTML file and it's not index.html, rename it
if [ "$HTML_COUNT" -eq 1 ]; then
HTML_FILE=$(echo "$HTML_FILES" | head -1)
BASENAME=$(basename "$HTML_FILE")
if [ "$BASENAME" != "index.html" ]; then
echo "Renaming $BASENAME to index.html..." >&2
mv "$HTML_FILE" "$PROJECT_PATH/index.html"
fi
fi
fi
# Create tarball of the project (excluding node_modules and .git)
echo "Creating deployment package..." >&2
tar -czf "$TARBALL" -C "$PROJECT_PATH" --exclude='node_modules' --exclude='.git' .
else
echo "Error: Input must be a directory or a .tgz file" >&2
exit 1
fi
if [ "$FRAMEWORK" != "null" ]; then
echo "Detected framework: $FRAMEWORK" >&2
fi
# Deploy
echo "Deploying..." >&2
RESPONSE=$(curl -s -X POST "$DEPLOY_ENDPOINT" -F "file=@$TARBALL" -F "framework=$FRAMEWORK")
# Check for error in response
if echo "$RESPONSE" | grep -q '"error"'; then
ERROR_MSG=$(echo "$RESPONSE" | grep -o '"error":"[^"]*"' | cut -d'"' -f4)
echo "Error: $ERROR_MSG" >&2
exit 1
fi
# Extract URLs from response
PREVIEW_URL=$(echo "$RESPONSE" | grep -o '"previewUrl":"[^"]*"' | cut -d'"' -f4)
CLAIM_URL=$(echo "$RESPONSE" | grep -o '"claimUrl":"[^"]*"' | cut -d'"' -f4)
if [ -z "$PREVIEW_URL" ]; then
echo "Error: Could not extract preview URL from response" >&2
echo "$RESPONSE" >&2
exit 1
fi
echo "" >&2
echo "Deployment successful!" >&2
echo "" >&2
echo "Preview URL: $PREVIEW_URL" >&2
echo "Claim URL: $CLAIM_URL" >&2
echo "" >&2
# Output JSON for programmatic use
echo "$RESPONSE"
Related skills
FAQ
Is Vercel Deploy safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.