vercel-services — Codex skill: what it does, how to install
Configures monorepos and multi-service deployments in a single Vercel project. Useful when pairing Python or Go backends with a frontend.
npx skills add openai/plugins --skill vercel-services -a codexWhat vercel-services does
This skill guides Codex on setting up the experimentalServices block inside vercel.json. It maps entry points and route prefixes for each service. At request time, Vercel routes traffic using the longest prefix match. The prefix is stripped before reaching your handler.
Local development runs via vercel dev -L without cloud authentication. Tested runtimes include Python (FastAPI, Flask, Django) and Go. For Go services, you must explicitly pass "framework": "go" in vercel.json because auto-detection fails. The entrypoint for Go must be a directory rather than a file.
Install this if you bundle separate runtimes under one domain and want to skip multi-repo pipelines.
What it helps with
- combine a Python or Go backend with a frontend in one Vercel project
- configure
experimentalServicesentries and routing rules invercel.json - test multi-service setups locally using
vercel dev -L - route requests between services using auto-generated
{SERVICENAME}_URLvariables
Example prompts for the agent
- Configure vercel.json for a Vite frontend and a FastAPI backend
- Add a Go service alongside my Next.js app in Vercel
- How do I route local services using vercel dev -L?
How to install vercel-services
1Skills CLI (Vercel)
npx skills add openai/plugins --skill vercel-services -a codex2Manually: put the files in place
.agents/skills/vercel-services/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add openai/plugins --skill vercel-services -a claude-code2Manually: put the files in place
~/.claude/skills/vercel-services/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/vercel-services/
Manually: put the files in place
.cursor/skills/vercel-services/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install openai/plugins vercel-services2Manually: put the files in place
.github/skills/vercel-services/SKILL.mdPlatform CLI
gemini skills install https://github.com/openai/plugins --path plugins/vercel/skills/vercel-servicesManually: put the files in place
.devin/skills/vercel-services/SKILL.mdThe legacy .windsurf/skills/ path still works
Claude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set201
The whole set →Similar
Questions about vercel-services
How to install vercel-services in Codex?
Run npx skills add openai/plugins --skill vercel-services. It installs the skill file to .agents/skills/vercel-services/SKILL.md.
What does vercel-services do?
It teaches Codex how to configure multi-service Vercel monorepos using experimentalServices and accurate route prefixes.
Why is framework configuration required for Go services?
Vercel auto-detection does not work for Go services. You must set "framework": "go" in vercel.json and point entrypoint to the folder rather than a file.
Source text
SKILL.md · Apache-2.0
---
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:
- [backend, frontend]
- [python, vercel]
- [go, vercel]
- [backend, deploy]
- [service, monorepo]
- [fastapi, deploy]
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`.
© Vercel Labs · Apache-2.0 · openai/plugins