Smart deployment platform router for Vercel vs Cloudflare vs GitHub Pages. Analyzes project structure, framework, SEO needs, runtime requirements, AND repository visibility (private/public). Routes to Cloudflare for private repos (GitHub Pages requires paid plan), Vercel for dynamic SEO, GitHub Pages only for public repos. Activates for deploy, vercel vs cloudflare, where to deploy, cloudflare workers, cloudflare pages, vercel deployment, edge deployment, SSR deployment, static site deployment, which hosting, deployment recommendation, github pages, private repo deployment.
Intelligently routes deployments to Vercel, Cloudflare, or GitHub Pages by analyzing project structure, framework, and runtime requirements. It automatically detects repository visibility to eliminate GitHub Pages for private repos, prioritizing Cloudflare for private projects and Vercel for dynamic SEO or Node.js needs.
/plugin marketplace add anton-abyzov/specweave/plugin install sw-infra@specweaveThis skill is limited to using the following tools:
I intelligently route your deployment to the optimal platform based on project analysis, including repository visibility (private vs public).
Ask me when you need help with:
GitHub Pages has a major limitation: Free GitHub accounts can ONLY deploy GitHub Pages from public repositories. Private repo deployment requires GitHub Pro, Team, or Enterprise.
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā STEP 0: CHECK REPOSITORY VISIBILITY ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā
ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Is the repository PRIVATE? ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā ā
YES NO (Public)
ā ā
ā¼ ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā ā GitHub Pages FREE ā ā ā
All platforms available ā
ā ā
Cloudflare Pages ā ā GitHub Pages is an option ā
ā ā
Vercel ā ā for static public sites ā
ā ā
Netlify ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
āāāāāāāāāāāāāāāāāāāāāāāāāāā
# Check if git remote exists and get repo visibility
REMOTE_URL=$(git remote get-url origin 2>/dev/null)
if [[ "$REMOTE_URL" =~ github.com[:/]([^/]+)/([^/.]+) ]]; then
OWNER="${BASH_REMATCH[1]}"
REPO="${BASH_REMATCH[2]}"
# Use GitHub CLI to check visibility
VISIBILITY=$(gh repo view "$OWNER/$REPO" --json visibility -q '.visibility' 2>/dev/null)
if [[ "$VISIBILITY" == "PRIVATE" ]]; then
echo "ā ļø PRIVATE REPOSITORY DETECTED"
echo " GitHub Pages requires GitHub Pro/Team/Enterprise for private repos"
echo " ā Recommended: Cloudflare Pages (free for private repos)"
echo " ā Alternative: Vercel (free tier available)"
else
echo "ā
PUBLIC REPOSITORY - All deployment options available"
fi
fi
| Platform | Private Repo (Free) | Public Repo (Free) | Notes |
|---|---|---|---|
| Cloudflare Pages | ā Yes | ā Yes | Best for private repos - No visibility restrictions |
| Vercel | ā Yes | ā Yes | Free tier works for both |
| Netlify | ā Yes | ā Yes | Free tier works for both |
| GitHub Pages | ā No (requires Pro) | ā Yes | BLOCKED for free private repos |
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā PROJECT ANALYSIS ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā
ā¼
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Does project require Node.js runtime features? ā
ā (Server Components with DB, fs, crypto, native modules) ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā ā
YES NO
ā ā
ā¼ ā¼
āāāāāāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā VERCEL ā ā Static/Edge compatible? ā
ā (Node.js runtime) ā ā (No Node.js dependencies) ā
āāāāāāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā
āāāāāāāāāā“āāāāāāāāā
YES NO
ā ā
ā¼ ā¼
āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā
ā CLOUDFLARE ā ā VERCEL ā
ā (Edge/Pages) ā ā (needs runtime) ā
āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā
| Framework | Detection | Default Recommendation |
|---|---|---|
| Next.js | next.config.js/ts/mjs | Depends on features used |
| Remix | remix.config.js | Vercel (Node) or Cloudflare (adapter) |
| Astro | astro.config.mjs | Cloudflare (static-first) |
| Nuxt | nuxt.config.ts | Vercel (SSR) or Cloudflare (static) |
| SvelteKit | svelte.config.js | Either (adapter-based) |
| Static (Vite/CRA) | vite.config.ts, no SSR | Cloudflare Pages |
Signals for VERCEL (Node.js Runtime):
prisma, drizzle, direct SQL)fs module usage (file system operations)crypto or native Node.js modulesgetServerSideProps with database queriesSignals for CLOUDFLARE (Edge/Static):
When SEO matters most, choose carefully:
| SEO Need | Vercel | Cloudflare | GitHub Pages |
|---|---|---|---|
| Static meta tags | ā | ā | ā |
| Dynamic meta from DB | ā (SSR) BEST | ā ļø (ISR/Edge only) | ā (static only) |
| Per-page dynamic OG | ā BEST | ā ļø (limited) | ā |
| Real-time product data | ā (SSR) BEST | ā ļø (stale cache) | ā |
| Sitemap generation | ā | ā | ā (manual) |
| robots.txt | ā | ā | ā |
| Structured data (JSON-LD) | ā (dynamic) | ā (static) | ā (static) |
| Core Web Vitals | ā (optimized) | ā (fast edge) | ā (fast static) |
| SSR/ISR for freshness | ā BEST | ā ļø (edge-limited) | ā |
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā SEO REQUIREMENTS ROUTING ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ā
ā TIER 1 - Critical SEO (choose VERCEL): ā
ā āā E-commerce product pages (prices change, inventory) ā
ā āā News/content sites (freshness matters for Google) ā
ā āā SaaS landing pages with dynamic pricing ā
ā āā Marketplace listings (real-time availability) ā
ā āā Any page where DB-driven meta tags are required ā
ā ā
ā TIER 2 - Good SEO (CLOUDFLARE works): ā
ā āā Blogs with static content ā
ā āā Documentation sites ā
ā āā Marketing pages (rarely changing) ā
ā āā Portfolio sites ā
ā āā ISR with revalidation (1-hour stale OK) ā
ā ā
ā TIER 3 - Basic SEO (any platform): ā
ā āā Internal tools (SEO doesn't matter) ā
ā āā Admin dashboards ā
ā āā Private apps ā
ā āā Prototypes/MVPs ā
ā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
revalidateTag() and revalidatePath()@vercel/og generates images server-sideBest For:
Pricing (2025):
Limitations:
Best For:
Pricing (2025):
Limitations:
Why Cloudflare for Private Repos:
Best For:
Pricing (2025):
Limitations:
When to Use GitHub Pages:
ā
DO use GitHub Pages when:
- Repository is PUBLIC
- Content is 100% static
- You want zero deployment config
- Open-source project docs
ā DO NOT use GitHub Pages when:
- Repository is PRIVATE (use Cloudflare Pages instead!)
- You need SSR/dynamic content
- You need API routes
- You need environment variables
When user asks "where should I deploy?", I follow this order:
# CRITICAL: Check if repo is private BEFORE anything else
REMOTE_URL=$(git remote get-url origin 2>/dev/null)
if [[ "$REMOTE_URL" =~ github.com[:/]([^/]+)/([^/.]+) ]]; then
OWNER="${BASH_REMATCH[1]}"
REPO="${BASH_REMATCH[2]}"
# Check visibility with GitHub CLI
VISIBILITY=$(gh repo view "$OWNER/$REPO" --json visibility -q '.visibility' 2>/dev/null)
if [[ "$VISIBILITY" == "PRIVATE" ]]; then
echo "š PRIVATE REPO - GitHub Pages NOT available on free tier"
echo " Recommended: Cloudflare Pages or Vercel"
GITHUB_PAGES_AVAILABLE=false
else
echo "ā
PUBLIC REPO - All platforms available"
GITHUB_PAGES_AVAILABLE=true
fi
else
echo "ā ļø No GitHub remote detected - assuming private"
GITHUB_PAGES_AVAILABLE=false
fi
# Framework detection
ls -la | grep -E "next.config|remix.config|astro.config|nuxt.config|svelte.config|vite.config"
# Package.json analysis
cat package.json | jq '.dependencies, .devDependencies'
# Check for SSR/SSG configuration
grep -r "getServerSideProps\|getStaticProps\|generateStaticParams" --include="*.tsx" --include="*.ts" | head -20
# Native module detection
grep -E "prisma|sharp|puppeteer|playwright|canvas|bcrypt|argon2" package.json
# File system usage
grep -r "require\('fs'\)\|from 'fs'\|import fs" --include="*.ts" --include="*.tsx" --include="*.js" | head -10
# Crypto usage
grep -r "require\('crypto'\)\|from 'crypto'" --include="*.ts" --include="*.tsx" | head -10
# Dynamic meta detection
grep -r "generateMetadata\|Head.*title\|meta.*content" --include="*.tsx" --include="*.ts" | head -10
# Database calls in metadata
grep -rB5 "generateMetadata" --include="*.tsx" | grep -E "prisma|db\.|fetch\("
# Check for e-commerce/content patterns that need fresh SEO
grep -rE "product|price|inventory|article|news" --include="*.tsx" | head -10
Based on analysis, I provide:
## š Deployment Recommendation
**Platform**: [VERCEL / CLOUDFLARE]
**Confidence**: [HIGH / MEDIUM / LOW]
### Analysis Results
| Factor | Finding | Impact |
|--------|---------|--------|
| Framework | Next.js 14 | Neutral |
| Node.js deps | Prisma, Sharp | ā VERCEL |
| SEO needs | Dynamic meta | ā VERCEL |
| Budget | Cost-sensitive | ā Cloudflare |
| Scale | Global edge | ā Cloudflare |
### Why [PLATFORM]
[Detailed reasoning based on findings]
### Configuration
[Platform-specific setup instructions]
### Alternative
If you need [opposite platform features], consider:
- [Migration path]
- [Hybrid approach]
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā MASTER DECISION TREE (Check in order!) ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ā
ā STEP 1: Is repo PRIVATE? ā
ā āā YES ā ā Eliminate GitHub Pages ā
ā ā ā Go to Step 2 ā
ā āā NO ā GitHub Pages is an option (static only) ā
ā ā
ā STEP 2: Do you need dynamic SEO? ā
ā āā YES ā ā
VERCEL (SSR, real-time meta, OG images) ā
ā āā NO ā Go to Step 3 ā
ā ā
ā STEP 3: Do you need Node.js runtime? ā
ā āā YES ā ā
VERCEL (Prisma, Sharp, fs, crypto) ā
ā āā NO ā Go to Step 4 ā
ā ā
ā STEP 4: Is it a static site? ā
ā āā YES, Private repo ā ā
CLOUDFLARE Pages ā
ā āā YES, Public repo ā ā
CLOUDFLARE or GitHub Pages ā
ā āā NO ā Go to Step 5 ā
ā ā
ā STEP 5: Do you need edge performance + cost savings? ā
ā āā YES ā ā
CLOUDFLARE (Workers/Pages) ā
ā āā NO ā ā
VERCEL (default choice for Next.js) ā
ā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā PLATFORM QUICK REFERENCE ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¤
ā ā
ā Use VERCEL when: ā
ā āā Dynamic SEO is critical (e-commerce, news, marketplaces) ā
ā āā Next.js with Server Components + DB ā
ā āā Native Node.js modules (Sharp, Prisma, Puppeteer) ā
ā āā Real-time OG image generation ā
ā āā WebSockets/real-time features ā
ā āā Team wants easiest DX ā
ā ā
ā Use CLOUDFLARE when: ā
ā āā š PRIVATE REPO (GitHub Pages blocked on free tier!) ā
ā āā Static site (Astro, Hugo, plain HTML) ā
ā āā Edge-first, low latency priority ā
ā āā Cost-sensitive (Cloudflare is cheaper) ā
ā āā Simple API routes without Node.js deps ā
ā āā Already using Cloudflare ecosystem (R2, D1, KV) ā
ā āā Global CDN distribution priority ā
ā ā
ā Use GITHUB PAGES when: ā
ā āā Repository is PUBLIC (required for free tier!) ā
ā āā 100% static content (no SSR, no API) ā
ā āā Open-source project documentation ā
ā āā Zero deployment configuration needed ā
ā ā
ā HYBRID approach: ā
ā āā Frontend on Cloudflare Pages (edge speed) ā
ā āā API/backend on Vercel Functions (Node.js power) ā
ā āā Best of both: edge speed + Node.js + full SEO ā
ā ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
After recommendation, I trigger the appropriate deployment:
// For Vercel deployment
Task({
subagent_type: "sw-infra:devops:devops",
prompt: `Deploy to Vercel:
- Project: ${projectName}
- Framework: ${framework}
- Environment: ${env}
Use existing VERCEL_TOKEN from .env`,
description: "Deploy to Vercel"
});
// For Cloudflare deployment
Task({
subagent_type: "sw-infra:devops:devops",
prompt: `Deploy to Cloudflare:
- Project: ${projectName}
- Type: ${isStatic ? 'Pages' : 'Workers'}
Use wrangler CLI (already authenticated)`,
description: "Deploy to Cloudflare"
});
This skill activates for:
User: "Where should I deploy my Next.js app with Prisma?"
Analysis:
- Framework: Next.js 14
- Database: Prisma (requires Node.js runtime)
- Impact: MUST use Node.js-compatible host
Recommendation: VERCEL
- Prisma requires Node.js runtime (binary execution)
- Cloudflare Workers don't support Prisma's native binary
- Vercel provides Node.js serverless functions
Alternative: Use Prisma Edge with Cloudflare D1 (requires migration)
User: "Best deployment for my Astro blog?"
Analysis:
- Framework: Astro (static-first)
- Database: None
- SEO: Static meta tags only
Recommendation: CLOUDFLARE PAGES
- 100% static site, no server runtime needed
- Free tier covers most blogs
- Global edge CDN included
- Faster than Vercel for static content
User: "I'm building an e-commerce site with product pages that need dynamic meta tags from the database"
Analysis:
- Framework: Next.js
- SEO: Dynamic meta from database (products, prices)
- Database: PostgreSQL with product catalog
Recommendation: VERCEL
- Dynamic `generateMetadata()` with DB calls
- Server-side rendering for SEO
- Product pages need fresh data for Google
- Cloudflare would require ISR which may show stale prices
User: "Where should I deploy my private Astro documentation site?"
Analysis:
- Framework: Astro (static-first)
- Repository: PRIVATE ā ļø
- SEO: Static meta tags only
- Content: Internal documentation
Step 0 - Visibility Check:
š PRIVATE REPO DETECTED
ā GitHub Pages: NOT AVAILABLE (requires GitHub Pro/Team)
ā
Cloudflare Pages: Available (free tier)
ā
Vercel: Available (free tier)
Recommendation: CLOUDFLARE PAGES
- Private repo works with free tier
- Static site = perfect fit for edge deployment
- Fast global CDN
- 500 builds/month free
- No Node.js needed
Alternative: Vercel (also works, but Cloudflare is cheaper for static)
ā ļø DO NOT recommend GitHub Pages for private repos!
User: "I need the best SEO possible for my product catalog with 10,000+ products"
Analysis:
- Framework: Next.js 14 with App Router
- Products: 10,000+ items with prices, inventory, reviews
- SEO Requirements: CRITICAL
- Dynamic meta tags per product
- Real-time pricing in structured data
- Fresh inventory status for Google
- Dynamic OG images showing product photos
SEO Analysis Results:
| Requirement | Vercel | Cloudflare | GitHub Pages |
|-------------|--------|------------|--------------|
| Dynamic meta from DB | ā
SSR | ā ļø ISR (stale) | ā |
| Real-time prices | ā
| ā ļø (1hr delay) | ā |
| Dynamic OG images | ā
@vercel/og | ā ļø Limited | ā |
| Inventory freshness | ā
SSR | ā ļø Cache | ā |
Recommendation: VERCEL (STRONG)
- SSR ensures Google sees fresh data every crawl
- `generateMetadata()` with database calls
- `@vercel/og` for product OG images
- ISR with on-demand revalidation for cache-then-fresh
- Image optimization built-in
Why NOT Cloudflare:
- ISR cache means Google might see stale prices
- No native OG image generation
- Edge runtime can't run Prisma directly
Cost consideration:
- Vercel Pro ($20/month) vs Cloudflare (free)
- For critical SEO sites, Vercel Pro is worth it
@cloudflare/next-on-pages adapterwrangler.toml to vercel.jsonCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.