NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #4794 most downloaded on npm
Last release 2 days ago
02 Oct 2026
Ships on a steady schedule
a new release about every 1 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
487 releases · first in 2020
One column per quarter.
28a7ab7: Build top-level daemons when VERCEL_ENABLE_DAEMONS_BOA=1: vercel build builds the project as usual, pushes each daemon's Dockerfile image, an
daemons when VERCEL_ENABLE_DAEMONS_BOA=1: vercel build builds the project as usual, pushes each daemon's Dockerfile image, and writes a Build Output API descriptor to daemons/<name>/.vc-config.json.20c5940: Make name optional for flat schedules entries. When omitted, the name defaults to a hash of the target and cron expression, matching the name
name optional for flat schedules entries. When omitted, the name defaults to a hash of the target and cron expression, matching the name the API derives. vercel build leaves unnamed schedules unnamed in config.json, except entrypoint schedules, which keep the derived name their function dispatches on.a7ef28c: Accept a top-level daemons field in vercel.json. vercel dev warns that it doesn't run daemons, and vercel build doesn't build them yet.
daemons field in vercel.json. vercel dev warns that it doesn't run daemons, and vercel build doesn't build them yet.deb48cd: Accept a flat schedules format in vercel.json that is aligned with crons (schedule plus one of path, function, topic, or entrypoint), and emi
schedules format in vercel.json that is aligned with crons (schedule plus one of path, function, topic, or entrypoint), and emit schedules in the flat format in Build Output API config.json. The nested expression/target format is still accepted.ff3d2f7: Allow projects to temporarily extend Node.js 20 support through November 1, 2026.
5082546: Build Python schedule entrypoints. A .py entrypoint such as jobs/nightly.py runs as a script once per firing in a private function under _ver
5082546: Build Python schedule entrypoints. A .py entrypoint such as jobs/nightly.py runs as a script once per firing in a private function under _vercel/schedules/. Entrypoints with the same functions config share one function, which runs the script for the dispatched schedule name, so the project's dependencies are bundled once per distinct config instead of once per script. Entrypoints without functions config share _vercel/schedules/default; the others' function is named after the functions patterns their config came from, such as _vercel/schedules/jobs/report. Schedule names must be unique within a shared function.
Declared schedule entrypoints are not served as static files, but other files follow the normal static rules. When a project with Python schedule entrypoints publishes other .py files from its root, through the zero-config static fallback or outputDirectory: ".", vercel build now warns and lists them.
Add findMatchingFunction to @vercel/build-utils, which returns the functions entry that applies to a function.
34b2c8e: Support afterCacheBypass rules in Build Output API config.json, preserving request and cached response header conditions through builds and d
afterCacheBypass rules in Build Output API config.json, preserving request and cached response header conditions through builds and deserialization.6e68e60: Add onMiss to Prerender.
6e68e60: Add onMiss to Prerender.
onMiss?: 'sync' | 'dynamic';
Declares how a request is served when no prerendered output is available for
it yet. Absent means sync: block the response on rendering it. dynamic
serves the request dynamically while the static shell is regenerated in the
background. The value is carried unvalidated so an unknown mode cannot fail
a deploy.
888f59e: Define an optional builder-owned development manifest for function identities, local invocation targets, trigger metadata, and native schedul
framework: null. Entrypoints must also match the runtime of frameworks that own one (Next.js, FastAPI, Express). The builder contract still supports multiple entrypoints per function for future runtimes.53a6086: Remove payload from static schedule configuration in vercel.json. Static schedules no longer accept or expose a payload field; use dynamic sc
payload from static schedule configuration in vercel.json. Static schedules no longer accept or expose a payload field; use dynamic schedules for payload support.f9d0e90: Add experimental Cloud Native Buildpacks lifecycle support with isolated source staging, pinned lifecycle and buildpack archives, and runtime
.ruby-version, .tool-versions, or
the tools.ruby entry in mise.toml, then an exact Gemfile declaration,
defaulting to Ruby 3.4. Unsupported version declarations fail with configuration
guidance. Nothing selects a buildpack yet.bun install silently discarding bun.lock files with lockfileVersion: 2 (written by Bun >= 1.4). The install step now selects the Bun 1.4 binary whenever the lockfile requires it, mirroring how the pnpm version is already inferred from its lockfile version, instead of always running the container's default Bun 1.3.x install.54a6d73: Require schedule jitter to be an integer from 1 to 15 minutes in vercel.json and Build Output API config, matching the maximum SQS message de
timezone to schedules in vercel.json and Build Output API config. Omitted timezones use UTC. Validate configured timezones before building.55e8d1e: Reduce CLI startup and deployment preparation time through lazy shared dependencies, smaller bundles, parallel Git metadata and file collecti
55e8d1e: Reduce CLI startup and deployment preparation time through lazy shared dependencies, smaller bundles, parallel Git metadata and file collection, and native executable startup caching. Allow deployment options to resolve asynchronously while the client collects local files.
Keep startup regression tests compatible with asynchronous prompts and Windows Git paths, and allow the NestJS build fixture sufficient time for cold dependency installation.
b174f14: Raise the client-side maxDuration validation limit to 3600 seconds.
maxDuration validation limit to 3600 seconds.1817491: Delay the pnpm 11 created-at default so unpinned lockfile 9.0 projects stay on pnpm 10. pnpm 11's default minimumReleaseAge of 1 day was brea
minimumReleaseAge of 1 day was breaking installs of freshly published packages. Explicit packageManager / devEngines pins to pnpm 11 are unchanged.392c759: Honor pnpm 12 pins without auto-adopting, and stop passing --unsafe-perm to pnpm install.
392c759: Honor pnpm 12 pins without auto-adopting, and stop passing --unsafe-perm to pnpm install.
When Corepack is off, a lockfile-compatible packageManager / devEngines.packageManager / engines.pnpm pin for 12.x selects /pnpm12 if that directory exists. Unpinned lockfile 9.0 still defaults to pnpm 9/10/11 by project creation date. pnpm install no longer includes --unsafe-perm, which pnpm 12's Rust CLI rejects.
a652a99: Propagate top-level schedules from vercel.json into the Build Output API config.json during vercel build, and validate the property against t
schedules from vercel.json into the Build Output API config.json during vercel build, and validate the property against the schedules schema37ff9da: Add build type to deploy manifest.
schedule/v1beta triggers in the Lambda runtime validation and the functions config schemaaad9541: Run on-disk JavaScript workers with a lazily resolved system Node.js executable in native CLI installations, and install the matching Build U
a443e57: Revert dependency install log rewriting that piped pnpm stdout through an unread Transform and could hang large installs.
90afd71: Expose the resolved rewrite destination as the request path observed by Node backend framework applications (express, hono, h3, koa, nestjs,
f8add0a: Replace prerenderClassification on Prerender with initialMetadata.
f8add0a: Replace prerenderClassification on Prerender with initialMetadata.
The platform consumes only the request-time compute mode and the HTML shell
size, so the flattened four-field taxonomy (routeType, response,
compute, htmlSize) is reduced to a single grouped field:
initialMetadata?: {
compute: 'blocking' | 'resuming' | 'static';
htmlSize?: number;
}
The group is named initialMetadata because the values describe the
deployment as it was built: revalidation can regenerate a route's output over
the deployment's lifetime, so readers must treat them as initial values, not
live state. @vercel/next reads compute and htmlSize off the v4
prerender-manifest taxonomy and deliberately ignores routeType and
response; the values are still carried unvalidated so a compute mode added
by a future framework release cannot hard-fail a deploy, and they are still
set only on the primary output of each prerender group. htmlSize: 0 is a
real size (a shell that postponed everything); htmlSize is absent when
there is no HTML shell to measure (route handlers, Pages Router). Absence of
the whole group remains legitimate (notFoundRoutes, Pages Router
fallback: false, older frameworks).
cd6b038: Honor package.json pnpm pins without Corepack, and default new projects to pnpm 11.
cd6b038: Honor package.json pnpm pins without Corepack, and default new projects to pnpm 11.
When Corepack is off, devEngines.packageManager is preferred, then a lockfile-compatible packageManager field, then engines.pnpm as a selector. Unpinned lockfile 9.0 projects created on or after 2026-08-19 use pnpm 11 (Node 22+) if /pnpm11 is present in the build image; otherwise they keep pnpm 10.
e340c58: Add schedules/v1beta to TriggerEvent types
b4f09c1: Support selecting Bun 1.4.x as an explicit runtime and build-time package manager, including local Bun servers.
852e1a0: Move middleware matcher utils from node builder to general build utils.
2da7809: Remove redundant and ineffective package tests.
13f81ac: Support pnpm lockfiles containing multiple YAML documents.
d72826e: Prevented unit tests and generated outputs from changing Turborepo task inputs during CI, and removed the redundant affected Unit test retry.
b7ec19b: Scope the pre-compilation install's VERCEL_INSTALL_COMPLETED marker to the package.json it installed. Previously, a vercel.toml/vercel.ts con
VERCEL_INSTALL_COMPLETED marker to the package.json it installed. Previously, a vercel.toml/vercel.ts config caused vc build to install at the repo root and then silently skip every later default install, so services whose install root is a different workspace (its own package.json/lockfile) built without dependencies.6d7fbfa: Bump all workspace packages to trigger a full publish from vercel-internal.
a69c714: Propagate per-function maxConcurrency configuration into build outputs and keep every configured Next.js route in its own Lambda group, inclu
maxConcurrency configuration into build outputs and keep every configured Next.js route in its own Lambda group, including routes with the same limit.2c75803: Preserve 4-byte UTF-8 characters when streaming string FileBlob contents (fixes Edge Function corruption during vercel build).
FileBlob contents (fixes Edge Function corruption during vercel build).17ee736: Replace the vercel-workers integration for Python queue subscribers and workflows with the new vercel-queue SDK:
17ee736: Replace the vercel-workers integration for Python queue subscribers and workflows with the new vercel-queue SDK:
[[tool.vercel.subscribers]] entrypoints are introspected at build time via vercel.queue.get_subscriptions() and served through generated vercel.queue.asgi_app() handler modules, with queue/v2beta triggers carrying the SDK-registered consumer groups and per-subscription tuning.vercel-celery/vercel-dramatiq integration package injected automatically (bundled variant unless vercel-queue is an explicit dependency), in builds and in vercel dev.[[tool.vercel.workflows]] entrypoints follow the SDK generation: projects on vercel >= 0.8.0 are served through vercel-queue like subscribers; older or undeterminable versions keep the legacy vercel-workers serving (worker env markers, injected pinned vercel-workers).vercel-workers directly keep the legacy integration wholesale: legacy subscriber schema, direct entrypoint serving, worker env markers.vercel dev serves queue sidecars through vercel.queue.asgi_app() for new-SDK projects, and its queue broker delivers with the SDK-registered consumer groups introspected at sidecar startup (matching production trigger behavior); legacy projects keep the vercel-workers bootstrap.config.hasWorkerServices; the Python builder makes all queue-serving decisions from project metadata.4502520: Support Node.js Routing Middleware entrypoints through proxy.entrypoint, with optional path matching through proxy.matcher. The matcher may b
proxy.entrypoint, with optional path matching through proxy.matcher. The matcher may be configured in the entrypoint source or vercel.json, but not both.7dd4301: Make service bindings type optional.
238543c: Support Python services that declare their web app and development workflow sidecars through a pyproject.toml entrypoint in vercel dev.
pyproject.toml entrypoint in vercel dev.BREAKING CHANGE (@vercel/client): the agent?: http.Agent option was replaced with dispatcher?: FetchDispatcher (an undici dispatcher, e.g. undici.Prox…
def07fc: Migrate @vercel/client and @vercel/build-utils from node-fetch to native fetch. This removes the last url.parse() usage from the CLI bundle, which triggered a DEP0169 DeprecationWarning on Node 24 (visible in the standalone binary during vercel deploy).
BREAKING CHANGE (@vercel/client): the agent?: http.Agent option was replaced with dispatcher?: FetchDispatcher (an undici dispatcher, e.g. undici.ProxyAgent), since native fetch does not support Node.js HTTP agents. The CLI now threads its proxy-aware dispatcher through automatically, so HTTP_PROXY/HTTPS_PROXY behavior is unchanged for CLI users.
607f0ef: Add service information to deploy-manifest.
7b30856: Add vercel dev support for Python queue subscribers defined in pyproject.toml.
vercel dev support for Python queue subscribers defined in pyproject.toml.6b49a17: Apply per-service functions config when building experimental V2 services. Previously, function configuration declared under services. .funct
functions config when building experimental V2 services. Previously, function configuration declared under services.<name>.functions in vercel.json (experimentalTriggers, maxDuration, memory, architecture, regions, functionFailoverRegions, supportsCancellation) was dropped at build time — only the top-level functions map was honored. The build now feeds each service's functions to its lambdas for both single-lambda builders (@vercel/node, etc., via writeBuildResultV3) and framework builders that read config.functions (e.g. @vercel/next, via the builder config). Derived queue/v2beta consumer groups are now scoped by the owning service name so two services that declare the same function path + topic no longer collide.8dc4702: Fix vercel dev for standalone Node servers, including projects without a package.json, and reuse the server process between requests.
vercel dev for standalone Node servers, including projects without a package.json, and reuse the server process between requests.9fb2976: Add services as the canonical multi-service project configuration and keep experimentalServicesV2 as a deprecated backwards-compatible alias.
services as the canonical multi-service project configuration and keep experimentalServicesV2 as a deprecated backwards-compatible alias.186014d: Add an experimental container service runtime. A service with
runtime: "container" either builds its Dockerfile/Containerfile and pushes
the resulting OCI image to the Vercel Container Registry (VCR), or passes a
prebuilt image reference through as build output.
@vercel/container (new builder): authenticates to VCR with the project's
VERCEL_OIDC_TOKEN, ensures the repository exists, builds and pushes the
image, and emits a digest-pinned reference in handler (container functions
are type: "Lambda" with runtime: "container"; the platform surfaces
handler as the image downstream). Uses docker on developer machines and
buildah (daemonless) in the Vercel build container behind a shared
ContainerEngine interface. Supports vc dev via startDevServer (local
build/run, env parity, log forwarding) and prepareCache for buildah layer
reuse between builds. Build flow is instrumented with tracing spans
(non-secret diagnostics) and debug logging gated on BUILDER_DEBUG.@vercel/build-utils: add the ContainerImage build-output type.@vercel/fs-detectors: resolve container services from vercel.json
(the services config and its deprecated experimentalServices /
experimentalServicesV2 aliases). A Dockerfile, Containerfile, or
*.dockerfile entrypoint triggers a build; any other entrypoint is treated as
a prebuilt OCI image reference.vercel: wire container output into vercel build result writing and
config validation.Buildah specifics in the build container: host networking for RUN steps,
native overlay storage on the XFS /vercel volume (deferring to the image's
storage.conf), zstd push compression, and registry credentials read from the
provisioned auth file when present. Several knobs are available for debugging:
VERCEL_CONTAINER_ENGINE, VERCEL_VCR_STRICT_STORAGE,
VERCEL_VCR_DISABLE_LAYER_CACHE, and VERCEL_VCR_FORCE_LOGIN.
cb0988f: Set the Node.js 20 discontinuation date to October 1, 2026.
2158ab6: [vc dev] Add support to experimentalServicesV2 for bindings in vc dev
experimentalServicesV2 for bindings in vc dev8dec9ea: Add deploy-manifest as an extension of project manifest.
01e18e8: Add hasFallback, htmlSize, and isDynamicRoute to Prerender
01e18e8: Add hasFallback, htmlSize, and isDynamicRoute to Prerender
These optional fields surface per-route PPR shell metadata in the Build Output so consumers can classify prerenders (e.g. full shell vs. empty shell vs. concrete prerender):
hasFallback — whether a dynamic route template had a static fallback (undefined for concrete prerenders)htmlSize — byte size of the prerendered .html shell (0 for an empty shell, undefined when there's no .html)isDynamicRoute — whether the entry came from a dynamic route template rather than a concrete prerender32a730e: Elevate maximum maxDuration to 1800s
…(the existing functionsSchema const is kept but deprecated). The CLI builds and compiles its config validator lazily, caching one validator per resolv…
8d8e871: Evaluate the maxDuration upper bound at validation time so VERCEL_CLI_SKIP_MAX_DURATION_LIMIT works regardless of import order.
The gate was read when @vercel/build-utils' functionsSchema was constructed and when the CLI compiled its vercel.json validator — both at module load. Any process that imports these modules before setting the env var baked in the default 900-second maximum and ignored the flag, failing with Invalid vercel.json - functions[...].maxDuration should be <= 900.
@vercel/build-utils now exposes getFunctionsSchema(), which reads the limit at call time (the existing functionsSchema const is kept but deprecated). The CLI builds and compiles its config validator lazily, caching one validator per resolved limit, so setting the variable after import takes effect. Default behavior is unchanged — the 900s maximum, the lower bound, and the integer check are all still enforced when the variable is unset.
4e849dd: Add a per-route hasPostponed signal to Prerender.
4e849dd: Add a per-route hasPostponed signal to Prerender.
@vercel/build-utils exposes a new optional hasPostponed?: boolean field on Prerender / PrerenderOptions. It is a tri-state: true when the route's .meta postponed state is present (React suspended during the build-time prerender), false when the framework prerendered a Prerender route without postponing, and undefined when the framework did not provide the signal.
@vercel/next populates it for app-router PPR routes (computed from the route's postponed state) and leaves it undefined for pages-router and other non-app-router prerenders. This is an additive, finer-grained signal — it does not change the existing chain / experimentalStreamingLambdaPath behavior — so downstream consumers can distinguish a route that actually postponed from one that has PPR machinery but fully prerendered (e.g. under cacheComponents: true).
c5eeb30: Gate the client-side 900-second maxDuration upper bound behind the VERCEL_CLI_SKIP_MAX_DURATION_LIMIT environment variable. The limit is now
maxDuration upper bound behind the VERCEL_CLI_SKIP_MAX_DURATION_LIMIT environment variable. The limit is now owned by a single helper in @vercel/build-utils instead of being hardcoded in multiple validators. When the variable is set to 1, the client-side maximum is skipped and validation defers to the server. Default behavior is unchanged — the maximum, the lower bound, and the integer check are all still enforced when the variable is unset./*, //, */) inside string, template, or regex literals — for example an Accept: */* header. Handler exports are now identified with the ES/CJS module lexers instead of stripping comments with regexes, so the contents of literals are never mistaken for comments.0a170fd: [services] wire experimentalServicesV2 into fs-detectors.
experimentalServicesV2 into fs-detectors.338cc35: Add isPackageInstalled util for detecting dependencies during build. Fix Vercel Flags dependency detection for emitting datafiles during buil
3019788: [services] Remove the services field from vercel.json and the VERCEL_USE_SERVICES gate.
services field from vercel.json and the VERCEL_USE_SERVICES gate.experimentalServicesV2 field to vercel.json implementing the new schema for services.1180675: Revert "[flags] fix dep detection for build embedding (#16242)"
6495585: [services] drop top-level env support for the new service-ref shape for services.
env support for the new service-ref shape for services.b66bd3e: Fix prebuilt deployments failing with "invalid relative path" when using the --standalone flag in pnpm monorepos by skipping external node_mo
--standalone flag in pnpm monorepos by skipping external node_modules symlinks and copying traced files at their logical paths instead.647c1e8: Cleanup getLambdaSupportsStreaming
fa25cb7: Fix config.framework in deserializeBuildOutput
fa25cb7: Fix config.framework in deserializeBuildOutput
972cc84: Support workflow-triggered job services in queue infrastructure
Add isWorkflowTriggeredService() and isQueueBackedService() helpers so workflow services
are recognized by the queue broker, dev server, and build pipeline. Update Python runtime to
bootstrap workflow services as queue-backed workers.
137e5d1: Allow builder V2 to expose startDevServer.
fb0cb8d: Add normalized entrypoint detector for runtime builders.
Your coding agent can read these notes before it upgrades. Set up the MCP server →