← VercelCONTENT HISTORY

Update to Vercel

Snapshot Sep 30, 2026 · 23:18 UTC · version 0.21.4

Collection source: not recorded for this historical snapshot. These snapshots do not have a confirmed matching collection source. Differences in file lists alone do not establish changes to the package.

WHAT CHANGED · RULE-BASED ANALYSIS

Supporting file metadata differs

Newly listed paths: agents/openai.yaml. This compares saved file lists, not package contents; a different collection source can change the list.

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Supporting files

Before

[{"relative_path":"references/fastapi-vite/backend/pyproject.toml","size_in_bytes":165},{"relative_path":"references/fastapi-vite/frontend/package.json","size_in_bytes":320},{"relative_path":"references/fastapi-vite/frontend/vite.config....

After

[{"relative_path":"agents/openai.yaml","size_in_bytes":144},{"relative_path":"references/fastapi-vite/backend/pyproject.toml","size_in_bytes":165},{"relative_path":"references/fastapi-vite/frontend/package.json","size_in_bytes":320},{"re...

Compare saved observations

Download comparison JSON
Full technical diff · 1 changed fields

changed /included_files

BEFORE
[
  {
    "relative_path": "references/fastapi-vite/backend/pyproject.toml",
    "size_in_bytes": 165
  },
  {
    "relative_path": "references/fastapi-vite/frontend/package.json",
    "size_in_bytes": 320
  },
  {
    "relative_path": "references/fastapi-vite/frontend/vite.config.ts",
    "size_in_bytes": 133
  },
  {
    "relative_path": "references/fastapi-vite/vercel.json",
    "size_in_bytes": 208
  }
]
AFTER
[
  {
    "relative_path": "agents/openai.yaml",
    "size_in_bytes": 144
  },
  {
    "relative_path": "references/fastapi-vite/backend/pyproject.toml",
    "size_in_bytes": 165
  },
  {
    "relative_path": "references/fastapi-vite/frontend/package.json",
    "size_in_bytes": 320
  },
  {
    "relative_path": "references/fastapi-vite/frontend/vite.config.ts",
    "size_in_bytes": 133
  },
  {
    "relative_path": "references/fastapi-vite/vercel.json",
    "size_in_bytes": 208
  }
]
Full snapshot data
{
  "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.",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 144
    },
    {
      "relative_path": "references/fastapi-vite/backend/pyproject.toml",
      "size_in_bytes": 165
    },
    {
      "relative_path": "references/fastapi-vite/frontend/package.json",
      "size_in_bytes": 320
    },
    {
      "relative_path": "references/fastapi-vite/frontend/vite.config.ts",
      "size_in_bytes": 133
    },
    {
      "relative_path": "references/fastapi-vite/vercel.json",
      "size_in_bytes": 208
    }
  ],
  "skill_md_contents": "---\nname: vercel-services\ndescription: \"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.\"\nmetadata:\n  priority: 7\n  docs:\n    - \"https://vercel.com/docs/services\"\n  sitemap: \"https://vercel.com/sitemap/docs.xml\"\n  pathPatterns:\n    - 'backend/**'\n    - 'backend/main.py'\n    - 'backend/main.go'\n    - 'backend/go.mod'\n    - 'backend/pyproject.toml'\n    - 'backend/requirements.txt'\n    - 'frontend/**'\n    - 'apps/*/backend/**'\n    - 'apps/*/frontend/**'\n    - 'services/*/vercel.json'\n    - '*/pyproject.toml'\n    - '*/go.mod'\n  bashPatterns:\n    - '\\bvercel\\s+dev\\b.*-L'\n    - '\\bpip\\s+install\\b.*fastapi'\n    - '\\buv\\s+(sync|pip|run)\\b'\n    - '\\bgo\\s+(run|build|mod)\\b'\n    - '\\bpython\\s+-m\\s+uvicorn\\b'\n    - '\\buvicorn\\b'\n  importPatterns:\n    - \"fastapi\"\n  promptSignals:\n    phrases:\n      - \"services api\"\n      - \"vercel services\"\n      - \"multi-service\"\n      - \"python backend\"\n      - \"go backend\"\n      - \"fastapi\"\n      - \"deploy backend\"\n      - \"backend and frontend\"\n      - \"multiple services\"\n    allOf:\n      - [backend, frontend]\n      - [python, vercel]\n      - [go, vercel]\n      - [backend, deploy]\n      - [service, monorepo]\n      - [fastapi, deploy]\n    anyOf:\n      - \"backend\"\n      - \"monorepo\"\n      - \"service\"\n      - \"python\"\n      - \"golang\"\n    noneOf:\n      - \"turborepo cache\"\n      - \"turbo.json\"\n      - \"aws lambda\"\n      - \"docker compose\"\n    minScore: 6\n---\n\n# Deploy multi-service projects with Vercel\n\nServices 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.\n\nThis skill covers **project structure and configuration**. For the actual deployment, defer to the **deployments-cicd** skill.\n\n## How It Works\n\nA 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).\n\n- Services are enabled via the `experimentalServices` field in `vercel.json` (see reference project).\n- `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.\n- Only `vercel.json` lives at the root. Each service manages its own dependencies independently.\n\n## Configuration\n\nDefine services in `vercel.json`:\n\n```json\n{\n  \"experimentalServices\": {\n    \"web\": {\n      \"entrypoint\": \"apps/web\",\n      \"routePrefix\": \"/\"\n    },\n    \"api\": {\n      \"entrypoint\": \"backend/main.py\",\n      \"routePrefix\": \"/server\"\n    }\n  }\n}\n```\n\nThe project's Framework Preset must be set to **Services** in the Vercel dashboard.\n\n### Configuration fields\n\n| Field          | Required | Description                                                |\n|----------------|----------|------------------------------------------------------------|\n| `entrypoint`   | Yes      | Path to the service entrypoint file or directory.          |\n| `routePrefix`  | Yes      | URL path prefix for routing (e.g. `/`, `/api`, `/svc/go`). |\n| `framework`    | No       | Framework slug. Pins detection; auto-detected if unset.    |\n| `memory`       | No       | Max available RAM in MB (128–10,240).                      |\n| `maxDuration`  | No       | Execution timeout in seconds (1–900).                      |\n| `includeFiles` | No       | Glob patterns for files to include in the deployment.      |\n| `excludeFiles` | No       | Glob patterns for files to exclude from the deployment.    |\n\nDo not add unknown fields — they will cause the build to fail.\n\n## Supported runtimes and frameworks\n\nServices is in beta. **Python** and **Go** are tested and production-ready. Other runtimes may work but are not yet validated.\n\n### Python\n\nWorks 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.\n\n### Go\n\nSet `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.\n\n### Other runtimes (untested)\n\nVercel supports Node.js, Bun, Rust, Ruby, Wasm, and Edge runtimes for functions. These can theoretically be used as services but are not yet validated.\n\n## Routing\n\nVercel 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.\n\nFor frontend frameworks mounted on a subpath (not `/`), configure the framework's own base path (e.g. `basePath` in `next.config.js`) to match `routePrefix`.\n\n## Environment variables\n\nVercel auto-generates URL variables so services can find each other:\n\n| Variable                        | Example value                            | Availability | Use case                              |\n|---------------------------------|------------------------------------------|--------------|---------------------------------------|\n| `{SERVICENAME}_URL`             | `https://your-deploy.vercel.app/svc/api` | Server-side  | Server-to-server requests             |\n| `NEXT_PUBLIC_{SERVICENAME}_URL` | `/svc/api`                               | Client-side  | Browser requests (relative, no CORS)  |\n\n`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.\n\n## Usage\n\n1. Read `references/fastapi-vite/` for the canonical project layout.\n2. Adapt the structure to the user's chosen runtimes — services can use any supported runtime, not just the ones in the reference.\n3. Define service routes **without** the route prefix — Vercel strips the prefix before forwarding.\n4. Validate that each service in `vercel.json` has `entrypoint` and `routePrefix`. Only set `framework` when auto-detection fails (required for Go).\n\n## Output\n\nAfter scaffolding, present the created file structure to the user. After deployment, present the deployment URL (refer to the **deployments-cicd** skill for details).\n\n## Troubleshooting\n\n### 404 on routes after deployment\n\nThe project needs the Services framework preset:\n\n1. Go to Project Settings → Build & Deployment → Framework Preset\n2. Select **Services** from the dropdown\n3. Redeploy\n\n### Routes return unexpected results\n\n1. Ensure all services are picked up by `vercel dev` — check logs. If a service is missing, verify `vercel.json`. Try setting `framework` explicitly.\n2. 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`).\n3. For frontend services on a subpath, confirm the framework's base path config matches `routePrefix`.\n"
}

SHA-256: a684015d06e7b672724888aee979571e2503a7a5d6506ffcefbb78815cc95d13