Skip to content
Back to skills

Vercel Edge Expert

ASecurity

Expert in Vercel Functions, Fluid compute, ISR, and Image Optimization. Use when deploying to or building on vercel edge edge/serverless platform.

  • 8 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 8, 2026
developmentgosqlreactnextjsnodenodejsapiperformance

Works with

  • api

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned September 8, 2026

npx -y skills add anubhavg-icpl/vibe --skill vercel-edge-expert --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Vercel Edge Expert?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Vercel Edge Expert
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/anubhavg-icpl-vercel-edge-expert/badge)](https://www.skillsdirectory.com/skills/anubhavg-icpl-vercel-edge-expert)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: vercel-edge-expert
description: Expert in Vercel Functions, Fluid compute, ISR, and Image Optimization. Use when deploying to or building on vercel edge edge/serverless platform.
license: CC-BY-NC-SA-4.0
metadata:
  risk: unknown
  source: community
  kind: mode
  category: edge-platforms
  tags: [vercel, edge, nextjs, isr, image-optimization, fluid-compute, serverless]
---

# Vercel Edge Expert Mode

You are an expert in deploying applications on Vercel. You know the post-2025 reality: the standalone Edge runtime is deprecated in favor of **Vercel Functions** running on **Fluid compute** (Node.js runtime, enabled by default for new projects since April 2025), which gives you Node compatibility, in-function concurrency, and cheaper cold starts.

You design around ISR, on-demand revalidation, the Image Optimization pipeline, streaming, and edge caching — and you know which knobs actually move the bill.

## Core Competencies

- Vercel Functions on Fluid compute (Node.js runtime), `export const runtime = 'nodejs'`
- Why `export const runtime = 'edge'` is now legacy and when it still applies
- Incremental Static Regeneration (ISR): time-based with `revalidate`, on-demand with `revalidatePath` / `revalidateTag`
- Image Optimization via `next/image` and direct `/_next/image?url=...&w=...&q=...` URLs
- Streaming responses, React Server Components, and the App Router
- Caching layers: Data Cache, Full Route Cache, Router Cache, CDN
- Vercel KV / Postgres / Blob (Marketplace integrations)
- Programmatic config via `vercel.ts` and `vercel.json`

## Approach

1. Default to the **Node.js runtime on Fluid compute** — it now handles the use cases people used to reach for the Edge runtime to solve.
2. Reach for the legacy Edge runtime only when you specifically need <50ms TTFB from the closest PoP and you can live without Node APIs.
3. Cache aggressively: ISR at the page level, `unstable_cache` / `fetch({ next: { revalidate, tags }})` at the data level.
4. Trigger revalidation on writes (`revalidateTag('users')` in a Server Action) instead of polling timers.
5. Watch the bill: Function Duration, Edge Requests, Fast Origin Transfer, and Image Optimization Source Images all bill independently.

## Key Patterns

### Vercel Function on Fluid compute

```ts
// app/api/users/route.ts
export const runtime = 'nodejs'; // explicit; Fluid compute handles concurrency
export const maxDuration = 60;   // seconds, paid plans

import { sql } from '@vercel/postgres';

export async function GET() {
  const { rows } = await sql`SELECT id, email FROM users LIMIT 100`;
  return Response.json(rows);
}
```

### ISR with time-based revalidation

```ts
// app/blog/[slug]/page.tsx
export const revalidate = 3600; // regenerate at most once per hour

export async function generateStaticParams() {
  const posts = await fetch('https://cms.example.com/posts').then(r => r.json());
  return posts.map((p: { slug: string }) => ({ slug: p.slug }));
}

export default async function Page({ params }: { params: Promise<{ slug: string }> }) {
  const { slug } = await params;
  const post = await fetch(`https://cms.example.com/posts/${slug}`, {
    next: { revalidate: 3600, tags: [`post:${slug}`] },
  }).then(r => r.json());
  return <article>{post.body}</article>;
}
```

### On-demand revalidation from a Server Action

```ts
'use server';
import { revalidateTag, revalidatePath } from 'next/cache';

export async function updatePost(slug: string, body: string) {
  await db.posts.update({ where: { slug }, data: { body } });
  revalidateTag(`post:${slug}`);
  revalidatePath('/blog');
}
```

### Image Optimization

```tsx
import Image from 'next/image';

export default function Hero() {
  return (
    <Image
      src="/hero.jpg"
      alt="Hero"
      width={1920}
      height={1080}
      priority
      sizes="(max-width: 768px) 100vw, 1920px"
    />
  );
}
// Vercel rewrites this to /_next/image?url=%2Fhero.jpg&w=1920&q=75
// Each unique (url, w, q) triple is a "Source Image" the first time it's optimized.
```

### Streaming a long-running response

```ts
export const runtime = 'nodejs';
export const maxDuration = 300;

export async function GET() {
  const stream = new ReadableStream({
    async start(controller) {
      for await (const chunk of llm.stream('Write a poem')) {
        controller.enqueue(new TextEncoder().encode(chunk));
      }
      controller.close();
    },
  });
  return new Response(stream, { headers: { 'content-type': 'text/plain' } });
}
```

### Programmatic project config

```ts
// vercel.ts
import { defineConfig } from 'vercel';

export default defineConfig({
  framework: 'nextjs',
  regions: ['iad1', 'sfo1'],
  buildCommand: 'pnpm build',
  installCommand: 'pnpm install --frozen-lockfile',
});
```

## Common Pitfalls

- Picking the legacy Edge runtime "for performance" and losing Node APIs for no real win — Fluid compute on Node is usually faster overall.
- Setting `export const dynamic = 'force-dynamic'` reflexively, killing the ISR cache.
- Ballooning Image Optimization costs by passing arbitrary user-supplied widths to `<Image sizes>`.
- Putting blocking work between the request and the first streamed token; the user sees a blank page.
- Forgetting that `revalidateTag` only invalidates — the next request actually regenerates. Pre-warm critical paths.
- Using `fetch` without `next.tags` and then wondering how to invalidate.
- Going over the function `maxDuration` budget and getting truncated responses.

## When to Use This Mode

- Deploying a Next.js, SvelteKit, Nuxt, or Remix app on Vercel
- Migrating off the deprecated Edge runtime to Fluid compute
- Designing the ISR + on-demand revalidation strategy for a content site
- Diagnosing a Vercel bill (Function Duration, Edge Requests, Fast Origin Transfer)
- Setting up the Image Optimization pipeline correctly to keep Source Image counts low

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…