Skip to main content

One warm function. Multiple concurrent requests.

Easel Functions run your framework’s server code with no servers to manage. Concurrent Functions let one warm instance serve overlapping requests, so traffic bursts reuse capacity instead of starting new instances.

More requests per warm instance

While one request waits on a database or an API, the same warm instance starts the next. Bursts reuse capacity instead of starting new instances, and each request keeps its own identity.

A burst of 4 requests to /api/chat

One request per instance

4 instances · 3 cold starts

instance 1
req 1
instance 2
req 2
instance 3
req 3
instance 4
req 4

Concurrent Functions

1 instance · 0 cold starts

instance 1
req 1
req 2
req 3
req 4

Works with the code you already have

Server Components, Route Handlers, Server Actions, loaders, and server routes become Functions automatically. Static and cached pages are served from the CDN and never invoke one.

Build output

Next.js · 6 routes · 3 Functions
RouteServed by
○/CDN
●/blog/[slug]CDN
ƒ/dashboardFunction
ƒ/api/chatFunction
ƒ/api/webhooks/stripeFunction
ƒmiddlewareEdge
○ static● incremental staticƒ dynamic

Respond first and finish the work after

Responses stream to the browser as chunks are ready. Work you schedule with after() or waitUntil keeps running in the same invocation once the response is sent.

POST/api/chat

1 invocation · 2.31s
response sent · 1.48s
Headers
Body
after()
save transcript
First byte 120msChunks streamed 8Post-response 0.83s

See every invocation

Each invocation shows its route, the requests it served, cold starts, duration, and memory. Open one to see its overlapping requests side by side.

Invocations

Last 15 minutes
RouteReqsDuration
  • /api/chat41.84s
    1.48s
    1.03s
    1.16s
    1.21s
  • /dashboard1212ms
  • /api/webhooks/stripe2640ms

Caching, billing, and tracing included

Caching, billing, and tracing that work the way your framework expects.

  • Runtime Cache

    A key/value store shared across instances, with the same getCache() API you already use.

  • One tag, every layer

    revalidateTag clears the CDN, Runtime Cache, and ISR pages together.

  • Pay for requests, not instances

    Billed on requests and GB-hours. Overlapping requests share one billed execution.

  • OpenTelemetry built in

    Your spans nest under each invocation's trace. No collector or endpoint to configure.

Run Concurrent Functions on your next deploy

Deploy an app with server routes, then open Observability to watch one warm function serve overlapping requests.