Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deployment and hosting platform specialist covering Vercel, Railway, and Convex. Use when deploying applications, configuring edge functions, setting up continuous deployment, or managing serverless infrastructure.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 104% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 75% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 108% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 68% | 0% |
Comprehensive deployment platform guide covering Vercel (edge-first), Railway (container-first), and Convex (real-time backend).
Vercel - Edge-First Deployment:
Railway - Container-First Deployment:
Convex - Real-Time Backend:
Web Applications (Frontend + API):
Mobile Backends:
Full-Stack Monoliths:
Compute Requirements:
Storage Requirements:
Networking Requirements:
Stack: Vercel + Vercel Postgres/KV
Setup:
Best For: Web apps with standard database needs, e-commerce, content sites
Stack: Railway + Docker
Setup:
Best For: Microservices, complex backends, custom tech stacks
Stack: Convex + Vercel/Railway (frontend)
Setup:
Best For: Collaborative tools, live dashboards, chat applications
Stack: Vercel (frontend/edge) + Railway (backend services)
Setup:
Best For: High-performance apps, global distribution with complex backends
Stack: Vercel (frontend + API routes) + Convex (backend)
Setup:
Best For: Rapid prototyping, startups, real-time web apps
vercel.json:
json{ "$schema": "https://openapi.vercel.sh/vercel.json", "framework": "nextjs", "regions": ["iad1", "sfo1", "fra1"], "functions": { "app/api/**/*.ts": { "memory": 1024, "maxDuration": 10 } } }
Edge Function:
typescriptexport const runtime = "edge" export const preferredRegion = ["iad1", "sfo1"] export async function GET(request: Request) { const country = request.geo?.country || "Unknown" return Response.json({ country }) }
railway.toml:
toml[build] builder = "DOCKERFILE" dockerfilePath = "Dockerfile" [deploy] healthcheckPath = "/health" healthcheckTimeout = 100 restartPolicyType = "ON_FAILURE" numReplicas = 2 [deploy.resources] memory = "2GB" cpu = "2.0"
Multi-Stage Dockerfile:
dockerfile# Builder stage FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # Runner stage FROM node:20-alpine WORKDIR /app ENV NODE_ENV=production RUN addgroup -g 1001 -S nodejs && adduser -S appuser -u 1001 COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/dist ./dist USER appuser EXPOSE 3000 CMD ["node", "dist/main.js"]
convex/schema.ts:
typescriptimport { defineSchema, defineTable } from "convex/server" import { v } from "convex/values" export default defineSchema({ messages: defineTable({ text: v.string(), userId: v.id("users"), timestamp: v.number(), }) .index("by_timestamp", ["timestamp"]) .searchIndex("search_text", { searchField: "text", filterFields: ["userId"], }), })
React Integration:
typescriptimport { useQuery, useMutation } from "convex/react" import { api } from "../convex/_generated/api" export function Messages() { const messages = useQuery(api.messages.list) const sendMessage = useMutation(api.messages.send) if (!messages) return <div>Loading...</div> return ( <div> {messages.map((msg) => ( <div key={msg._id}>{msg.text}</div> ))} </div> ) }
yamlname: Deploy to Vercel on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: amondnet/vercel-action@v25 with: vercel-token: ${{ secrets.VERCEL_TOKEN }} vercel-org-id: ${{ secrets.ORG_ID }} vercel-project-id: ${{ secrets.PROJECT_ID }}
yamlname: Deploy to Railway on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - run: npm install -g @railway/cli - run: railway up --detach env: RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
yamlname: Deploy to Convex on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 - run: npm ci - run: npx convex deploy env: CONVEX_DEPLOY_KEY: ${{ secrets.CONVEX_DEPLOY_KEY }}
Deploy new version, test on preview URL, then switch production alias using Vercel SDK for zero-downtime releases.
Configure deployment regions in railway.toml:
toml[deploy.regions] name = "us-west" replicas = 2 [[deploy.regions]] name = "eu-central" replicas = 1
typescriptconst sendMessage = useMutation(api.messages.send) const handleSend = (text: string) => { sendMessage({ text }) .then(() => console.log("Sent")) .catch(() => console.log("Failed, rolled back")) }
For detailed platform-specific patterns, configuration options, and advanced use cases, see:
.claude/rules/moai/languages/typescript.md for TypeScript best practices (auto-loaded via paths frontmatter).claude/rules/moai/languages/python.md for Python deployment on Railway (auto-loaded via paths frontmatter)Status: Production Ready Version: 2.0.0 Updated: 2026-02-09 Platforms: Vercel, Railway, Convex
<!-- moai:evolvable-start id="rationalizations" -->
| Rationalization | Reality | |---|---| | "I will configure the deployment platform after development is complete" | Deployment configuration affects build output, environment variables, and runtime behavior. Configure early. | | "Preview deployments are optional" | Preview deployments catch deployment-specific bugs before production. They cost little and save a lot. | | "Environment variables are the same across all environments" | Production, staging, and development need different database URLs, API keys, and feature flags. One set of env vars is a security risk. | | "Serverless cold starts are negligible" | Cold starts add 200-2000ms latency on first request. For user-facing APIs, this matters. Measure and mitigate. | | "I do not need a rollback strategy, I can just redeploy" | Redeployment takes minutes. Rollback takes seconds. When production is down, seconds matter. |
<!-- moai:evolvable-end -->
<!-- moai:evolvable-start id="red-flags" -->
<!-- moai:evolvable-end -->
<!-- moai:evolvable-start id="verification" -->
<!-- moai:evolvable-end -->
R4 audit verdict (2026-04-23): REFACTOR — shrink triplet to Vercel-only primary; Railway/Convex as documentation-only SPEC: SPEC-V3R2-WF-001 §6.2 line 271 Refactor scope (deferred to future sub-SPEC):
This skill is retained in v3.0 but its body will be restructured in a follow-up SPEC.
Other measured skills in the registry, with their headline benchmark lift.