Skip to main content

vercel-services

Vercel Services — deploy multiple services within a single Vercel project. Use for monorepo layouts or when combining a backend (Python, Go) with a frontend (Next.js, Vite) in one deployment.

Source facts

Repository
openai/plugins
Last source activity
April 21, 2026 at 18:07
Detected SKILL.md language
English
Stars
7,904
Forks
1,014

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
6 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
vercel-services
description
Vercel Services — deploy multiple services within a single Vercel project. Use for monorepo layouts or when combining a backend (Python, Go) with a frontend (Next.js, Vite) in one deployment.
metadata
{"priority":7,"docs":["https://vercel.com/docs/services"],"sitemap":"https://vercel.com/sitemap/docs.xml","pathPatterns":["backend/**","backend/main.py","backend/main.go","backend/go.mod","backend/pyproject.toml","backend/requirements.txt","frontend/**","apps/*/backend/**","apps/*/frontend/**","services/*/vercel.json","*/pyproject.toml","*/go.mod"],"bashPatterns":["\\bvercel\\s+dev\\b.*-L","\\bpip\\s+install\\b.*fastapi","\\buv\\s+(sync|pip|run)\\b","\\bgo\\s+(run|build|mod)\\b","\\bpython\\s+-m\\s+uvicorn\\b","\\buvicorn\\b"],"importPatterns":["fastapi"],"promptSignals":{"phrases":["services api","vercel services","multi-service","python backend","go backend","fastapi","deploy backend","backend and frontend","multiple services"],"allOf":["[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]","[Truncated]"],"anyOf":["backend","monorepo","service","python","golang"],"noneOf":["turborepo cache","turbo.json","aws lambda","docker compose"],"minScore":6}}
# Deploy multi-service projects with Vercel Services let you deploy multiple independently-built units within a single Vercel project. The typical use case is combining different runtimes (e.g. Python + JavaScript) in one deployment with shared routing and environment variables, but services work for any combination — multiple services of the same runtime, different frameworks, or a mix. This skill covers **project structure and configuration**. For the actual deployment, defer to the **deployments-cicd** skill. ## How It Works A service is an independently built unit within your project, deployed to the same domain under a unique subpath. At build time, Vercel builds each service separately. At request time, Vercel routes incoming requests to the correct service based on the URL path prefix (longest prefix wins). - Services are enabled via the `experimentalServices` field in `vercel.json` (see reference project). - `vercel dev -L` auto-detects frameworks and runs all services locally as one application, handling routing automatically. The `-L` flag (short for `--local`) runs without authenticating with Vercel Cloud. - Only `vercel.json` lives at the root. Each service manages its own dependencies independently. ## Configuration Define services in `vercel.json`: ```json { "experimentalServices": { "web": { "entrypoint": "apps/web", "routePrefix": "/" }, "api": { "entrypoint": "backend/main.py", "routePrefix": "/server" } } } ``` The project's Framework Preset must be set to **Services** in the Vercel dashboard. ### Configuration fields | Field | Required | Description | |----------------|----------|------------------------------------------------------------| | `entrypoint` | Yes | Path to the service entrypoint file or directory. | | `routePrefix` | Yes | URL path prefix for routing (e.g. `/`, `/api`, `/svc/go`). | | `framework` | No | Framework slug. Pins detection; auto-detected if unset. | | `memory` | No | Max available RAM in MB (128–10,240). | | `maxDuration` | No | Execution timeout in seconds (1–900). | | `includeFiles` | No | Glob patterns for files to include in the deployment. | | `excludeFiles` | No | Glob patterns for files to exclude from the deployment. | Do not add unknown fields — they will cause the build to fail. ## Supported runtimes and frameworks Services is in beta. **Python** and **Go** are tested and production-ready. Other runtimes may work but are not yet validated. ### Python Works with FastAPI, Flask, Django, or any ASGI/WSGI application. Framework is auto-detected. Set `entrypoint` to the application file (e.g. `"backend/main.py"`). Dependencies go in `pyproject.toml` in the service directory. ### Go Set `entrypoint` to the service **directory** (e.g. `"backend"`), not a file. **Must** set `"framework": "go"` explicitly in `vercel.json` — auto-detection does not work for Go services. Dependencies in `go.mod` in the service directory. ### Other runtimes (untested) Vercel supports Node.js, Bun, Rust, Ruby, Wasm, and Edge runtimes for functions. These can theoretically be used as services but are not yet validated. ## Routing Vercel evaluates route prefixes from longest to shortest (most specific first), with the primary service (`/`) as the catch-all. Vercel automatically mounts services at their `routePrefix`, so service handlers should **not** include the prefix in their routes. For frontend frameworks mounted on a subpath (not `/`), configure the framework's own base path (e.g. `basePath` in `next.config.js`) to match `routePrefix`. ## Environment variables Vercel auto-generates URL variables so services can find each other: | Variable | Example value | Availability | Use case | |---------------------------------|------------------------------------------|--------------|---------------------------------------| | `{SERVICENAME}_URL` | `https://your-deploy.vercel.app/svc/api` | Server-side | Server-to-server requests | | `NEXT_PUBLIC_{SERVICENAME}_URL` | `/svc/api` | Client-side | Browser requests (relative, no CORS) | `SERVICENAME` is the key name from `experimentalServices`, uppercased. If you define an env var with the same name in project settings, your value takes precedence. ## Usage 1. Read `references/fastapi-vite/` for the canonical project layout. 2. Adapt the structure to the user's chosen runtimes — services can use any supported runtime, not just the ones in the reference. 3. Define service routes **without** the route prefix — Vercel strips the prefix before forwarding. 4. Validate that each service in `vercel.json` has `entrypoint` and `routePrefix`. Only set `framework` when auto-detection fails (required for Go). ## Output After scaffolding, present the created file structure to the user. After deployment, present the deployment URL (refer to the **deployments-cicd** skill for details). ## Troubleshooting ### 404 on routes after deployment The project needs the Services framework preset: 1. Go to Project Settings → Build & Deployment → Framework Preset 2. Select **Services** from the dropdown 3. Redeploy ### Routes return unexpected results 1. Ensure all services are picked up by `vercel dev` — check logs. If a service is missing, verify `vercel.json`. Try setting `framework` explicitly. 2. Validate route prefix behavior: handlers declare routes without `routePrefix` (e.g. `/health`), but requests from other services use the full prefix (e.g. `/api/health`). 3. For frontend services on a subpath, confirm the framework's base path config matches `routePrefix`.
View on GitHub