Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deploy Claude-powered applications to Vercel, Fly.io, and Cloud Run Use when working with deploy-integration patterns. with proper secrets management and streaming support. Trigger with "deploy anthropic", "claude production deploy", "anthropic vercel", "deploy claude app".
.claude/skills/jeremylongshore-clade-deploy-integration/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 128% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 13% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 102% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 37% | 0% |
Claude integrations are stateless API wrappers — a serverless function receives a user request, streams from the Messages API, and returns the response. No database, no connection pool, no persistent state.
typescript// app/api/chat/route.ts (Next.js App Router) import Anthropic from '@claude-ai/sdk'; export const runtime = 'edge'; export async function POST(req: Request) { const client = new Anthropic(); const { messages, system } = await req.json(); const stream = await client.messages.create({ model: 'claude-sonnet-4-20250514', max_tokens: 4096, system: system || 'You are a helpful assistant.', messages, stream: true, }); // Convert Anthropic stream to ReadableStream for SSE const encoder = new TextEncoder(); const readable = new ReadableStream({ async start(controller) { for await (const event of stream) { if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') { controller.enqueue(encoder.encode(`data: ${JSON.stringify(event.delta)}\n\n`)); } } controller.enqueue(encoder.encode('data: [DONE]\n\n')); controller.close(); }, }); return new Response(readable, { headers: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', }, }); }
bash# Add secret vercel env add ANTHROPIC_API_KEY # Deploy vercel --prod
dockerfileFROM node:20-slim WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 3000 CMD ["node", "server.js"]
bashfly launch --name my-claude-app fly secrets set ANTHROPIC_API_KEY=sk-ant-api03-... fly deploy
bashgcloud run deploy claude-api \ --source . \ --region us-central1 \ --allow-unauthenticated \ --set-secrets=ANTHROPIC_API_KEY=claude-key:latest \ --timeout=300 \ --concurrency=80
typescript// api/health.ts import Anthropic from '@claude-ai/sdk'; export async function GET() { try { const client = new Anthropic(); const msg = await client.messages.create({ model: 'claude-haiku-4-5-20251001', max_tokens: 5, messages: [{ role: 'user', content: 'ping' }], }); return Response.json({ status: 'healthy', model: msg.model }); } catch (err) { return Response.json({ status: 'unhealthy', error: err.message }, { status: 503 }); } }
| Variable | Required | Description | |----------|----------|-------------| | ANTHROPIC_API_KEY | Yes | API key from console.anthropic.com | | ANTHROPIC_MODEL | No | Default model ID (override per request) | | ANTHROPIC_MAX_TOKENS | No | Default max tokens |
ANTHROPIC_API_KEY stored in platform secrets manager| Issue | Cause | Solution | |-------|-------|----------| | FUNCTION_INVOCATION_TIMEOUT | Claude response > function timeout | Set timeout to 300s. Use streaming. | | Secret not found | Missing env var | Add via platform CLI | | 529 in production | API overloaded | SDK retries automatically. Add fallback model. | | CORS errors | Missing headers | Add CORS headers to API route |
See Vercel Edge Function (with SSE streaming), Fly.io Dockerfile, Cloud Run deploy script, and Health Check endpoint above.
See clade-observability for monitoring your Claude calls in production.
clade-install-auth and clade-prod-checklistvercel, fly, or gcloud| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 10,718 | 8,339 | -22% | 1 | 1 | 0% | 2,402 | 3,133 | +30% | 0 | 0 | — |
case-02 | pass→pass | 37,235 | 9,686 | -74% | 1 | 1 | 0% | 3,874 | 3,203 | -17% | 0 | 0 | — |
case-03 | fail→pass | 17,803 | 15,245 | -14% | 1 | 1 | 0% | 3,306 | 4,668 | +41% | 0 | 0 | — |
case-21 | fail→fail | 8,842 | 4,172 | -53% | 1 | 1 | 0% | 1,587 | 1,962 | +24% | 0 | 0 | — |
case-04 | pass→pass | 17,709 | 16,659 | -6% | 1 | 1 | 0% | 2,722 | 4,258 | +56% | 0 | 0 | — |
case-05 | pass→pass | 19,201 | 15,132 | -21% | 1 | 1 | 0% | 3,779 | 4,398 | +16% | 0 | 0 | — |
case-06 | fail→fail | 17,593 | 13,880 | -21% | 1 | 1 | 0% | 3,610 | 4,043 | +12% | 0 | 0 | — |
case-07 | fail→pass | 4,994 | 4,331 | -13% | 1 | 1 | 0% | 881 | 2,010 | +128% | 0 | 0 | — |
case-08 | pass→pass | 5,292 | 3,444 | -35% | 1 | 1 | 0% | 1,007 | 1,784 | +77% | 0 | 0 | — |
case-09 | pass→pass | 8,543 | 3,404 | -60% | 1 | 1 | 0% | 1,534 | 1,763 | +15% | 0 | 0 | — |
case-10 | pass→pass | 3,081 | 2,785 | -10% | 1 | 1 | 0% | 556 | 1,776 | +219% | 0 | 0 | — |
case-11 | fail→pass | 9,661 | 4,236 | -56% | 1 | 1 | 0% | 1,663 | 1,883 | +13% | 0 | 0 | — |
case-12 | fail→pass | 4,401 | 2,423 | -45% | 1 | 1 | 0% | 817 | 1,650 | +102% | 0 | 0 | — |
case-13 | pass→pass | 2,920 | 3,727 | +28% | 1 | 1 | 0% | 510 | 1,775 | +248% | 0 | 0 | — |
case-14 | pass→pass | 5,295 | 3,249 | -39% | 1 | 1 | 0% | 977 | 1,734 | +77% | 0 | 0 | — |
case-15 | pass→pass | 13,534 | 2,676 | -80% | 1 | 1 | 0% | 1,177 | 1,697 | +44% | 0 | 0 | — |
case-16 | pass→pass | 15,327 | 11,717 | -24% | 1 | 1 | 0% | 2,632 | 3,302 | +25% | 0 | 0 | — |
case-17 | fail→pass | 8,480 | 5,760 | -32% | 1 | 1 | 0% | 1,510 | 2,075 | +37% | 0 | 0 | — |
case-18 | pass→pass | 11,305 | 1,842 | -84% | 1 | 1 | 0% | 2,084 | 1,594 | -24% | 0 | 0 | — |
case-19 | fail→fail | 7,954 | 1,624 | -80% | 1 | 1 | 0% | 1,530 | 1,429 | -7% | 0 | 0 | — |
case-20 | fail→fail | 6,918 | 3,178 | -54% | 1 | 1 | 0% | 1,146 | 1,708 | +49% | 0 | 0 | — |
case-22 | pass→pass | 4,762 | 3,807 | -20% | 1 | 1 | 0% | 774 | 1,661 | +115% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +23 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.