
Next Cache Components
- 1.2k installs
- 229 repo stars
- Updated July 27, 2026
- vercel-labs/vercel-plugin
next-cache-components is an agent skill for next.js 16 cache components guidance — ppr, use cache directive, cachelife, cachetag, updatetag, and migration from unstable_cache. use when implementing partial prerendering,.
About
The next-cache-components skill is designed for next.js 16 Cache Components guidance — PPR, use cache directive, cacheLife, cacheTag, updateTag, and migration from unstable_cache. Use when implementing partial prerendering,. Cache Components (Next.js 16+) Cache Components enable Partial Prerendering (PPR) - mix static, cached, and dynamic content in a single route. Enable Cache Components This replaces the old experimental.ppr flag. Invoke when the user implementing partial prerendering, caching strategies, or migrating from older Next.
- Build ID - invalidates all caches on deploy.
- Function ID - hash of function location.
- Serializable arguments - props become part of key.
- Closure variables - outer scope values included.
- Tags - Replace options.tags with cacheTag() calls inside the function.
Next Cache Components by the numbers
- 1,177 all-time installs (skills.sh)
- Ranked #326 of 2,277 Frontend Development skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Jul 28, 2026 (Skillselion catalog sync)
next-cache-components capabilities & compatibility
- Capabilities
- build id invalidates all caches on deploy · function id hash of function location · serializable arguments props become part of ke · closure variables outer scope values included
What next-cache-components says it does
Next.js 16 Cache Components guidance — PPR, use cache directive, cacheLife, cacheTag, updateTag, and migration from unstable_cache. Use when implementing partial prerendering, cach
Next.js 16 Cache Components guidance — PPR, use cache directive, cacheLife, cacheTag, updateTag, and migration from unstable_cache. Use when implementing partia
npx skills add https://github.com/vercel-labs/vercel-plugin --skill next-cache-componentsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1.2k |
|---|---|
| repo stars | ★ 229 |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 27, 2026 |
| Repository | vercel-labs/vercel-plugin ↗ |
How do I next.js 16 cache components guidance — ppr, use cache directive, cachelife, cachetag, updatetag, and migration from unstable_cache. use when implementing partial prerendering,?
Next.js 16 Cache Components guidance — PPR, use cache directive, cacheLife, cacheTag, updateTag, and migration from unstable_cache. Use when implementing partial prerendering,.
Who is it for?
Developers using next cache components workflows documented in SKILL.md.
Skip if: Skip when the task falls outside next-cache-components scope or needs a different stack.
When should I use this skill?
User implementing partial prerendering, caching strategies, or migrating from older Next.
What you get
Completed next-cache-components workflow with documented commands, files, and expected deliverables.
- cacheComponents next.config.ts configuration
- use cache functions with cacheLife and cacheTag
- Migration notes from unstable_cache and revalidate exports
By the numbers
- Documents 6 built-in cacheLife profiles: default, minutes, hours, days, weeks, max
- Manifest includes 3 validation patterns for deprecated unstable_cache and cacheHandler usage
- Metadata priority 6 with pathPatterns for app/** and importPatterns for next/cache
Files
Cache Components (Next.js 16+)
Cache Components enable Partial Prerendering (PPR) - mix static, cached, and dynamic content in a single route.
Enable Cache Components
// next.config.ts
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
cacheComponents: true,
}
export default nextConfigThis replaces the old experimental.ppr flag.
---
Three Content Types
With Cache Components enabled, content falls into three categories:
1. Static (Auto-Prerendered)
Synchronous code, imports, pure computations - prerendered at build time:
export default function Page() {
return (
<header>
<h1>Our Blog</h1> {/* Static - instant */}
<nav>...</nav>
</header>
)
}2. Cached (use cache)
Async data that doesn't need fresh fetches every request:
async function BlogPosts() {
'use cache'
cacheLife('hours')
const posts = await db.posts.findMany()
return <PostList posts={posts} />
}3. Dynamic (Suspense)
Runtime data that must be fresh - wrap in Suspense:
import { Suspense } from 'react'
export default function Page() {
return (
<>
<BlogPosts /> {/* Cached */}
<Suspense fallback={<p>Loading...</p>}>
<UserPreferences /> {/* Dynamic - streams in */}
</Suspense>
</>
)
}
async function UserPreferences() {
const theme = (await cookies()).get('theme')?.value
return <p>Theme: {theme}</p>
}---
use cache Directive
File Level
'use cache'
export default async function Page() {
// Entire page is cached
const data = await fetchData()
return <div>{data}</div>
}Component Level
export async function CachedComponent() {
'use cache'
const data = await fetchData()
return <div>{data}</div>
}Function Level
export async function getData() {
'use cache'
return db.query('SELECT * FROM posts')
}---
Cache Profiles
Built-in Profiles
'use cache' // Default: 5m stale, 15m revalidate'use cache: remote' // Platform-provided cache (Redis, KV)'use cache: private' // For compliance, allows runtime APIscacheLife() - Custom Lifetime
import { cacheLife } from 'next/cache'
async function getData() {
'use cache'
cacheLife('hours') // Built-in profile
return fetch('/api/data')
}Built-in profiles: 'default', 'minutes', 'hours', 'days', 'weeks', 'max'
Inline Configuration
async function getData() {
'use cache'
cacheLife({
stale: 3600, // 1 hour - serve stale while revalidating
revalidate: 7200, // 2 hours - background revalidation interval
expire: 86400, // 1 day - hard expiration
})
return fetch('/api/data')
}---
Cache Invalidation
cacheTag() - Tag Cached Content
import { cacheTag } from 'next/cache'
async function getProducts() {
'use cache'
cacheTag('products')
return db.products.findMany()
}
async function getProduct(id: string) {
'use cache'
cacheTag('products', `product-${id}`)
return db.products.findUnique({ where: { id } })
}updateTag() - Immediate Invalidation
Use when you need the cache refreshed within the same request:
'use server'
import { updateTag } from 'next/cache'
export async function updateProduct(id: string, data: FormData) {
await db.products.update({ where: { id }, data })
updateTag(`product-${id}`) // Immediate - same request sees fresh data
}revalidateTag() - Background Revalidation
Use for stale-while-revalidate behavior:
'use server'
import { revalidateTag } from 'next/cache'
export async function createPost(data: FormData) {
await db.posts.create({ data })
revalidateTag('posts') // Background - next request sees fresh data
}---
Runtime Data Constraint
Cannot access cookies(), headers(), or searchParams inside use cache.
Solution: Pass as Arguments
// Wrong - runtime API inside use cache
async function CachedProfile() {
'use cache'
const session = (await cookies()).get('session')?.value // Error!
return <div>{session}</div>
}
// Correct - extract outside, pass as argument
async function ProfilePage() {
const session = (await cookies()).get('session')?.value
return <CachedProfile sessionId={session} />
}
async function CachedProfile({ sessionId }: { sessionId: string }) {
'use cache'
// sessionId becomes part of cache key automatically
const data = await fetchUserData(sessionId)
return <div>{data.name}</div>
}Exception: use cache: private
For compliance requirements when you can't refactor:
async function getData() {
'use cache: private'
const session = (await cookies()).get('session')?.value // Allowed
return fetchData(session)
}---
Cache Key Generation
Cache keys are automatic based on:
- Build ID - invalidates all caches on deploy
- Function ID - hash of function location
- Serializable arguments - props become part of key
- Closure variables - outer scope values included
async function Component({ userId }: { userId: string }) {
const getData = async (filter: string) => {
'use cache'
// Cache key = userId (closure) + filter (argument)
return fetch(`/api/users/${userId}?filter=${filter}`)
}
return getData('active')
}---
Complete Example
import { Suspense } from 'react'
import { cookies } from 'next/headers'
import { cacheLife, cacheTag } from 'next/cache'
export default function DashboardPage() {
return (
<>
{/* Static shell - instant from CDN */}
<header><h1>Dashboard</h1></header>
<nav>...</nav>
{/* Cached - fast, revalidates hourly */}
<Stats />
{/* Dynamic - streams in with fresh data */}
<Suspense fallback={<NotificationsSkeleton />}>
<Notifications />
</Suspense>
</>
)
}
async function Stats() {
'use cache'
cacheLife('hours')
cacheTag('dashboard-stats')
const stats = await db.stats.aggregate()
return <StatsDisplay stats={stats} />
}
async function Notifications() {
const userId = (await cookies()).get('userId')?.value
const notifications = await db.notifications.findMany({
where: { userId, read: false }
})
return <NotificationList items={notifications} />
}---
Migration from Previous Versions
| Old Config | Replacement |
|---|---|
experimental.ppr | cacheComponents: true |
dynamic = 'force-dynamic' | Remove (default behavior) |
dynamic = 'force-static' | 'use cache' + cacheLife('max') |
revalidate = N | cacheLife({ revalidate: N }) |
unstable_cache() | 'use cache' directive |
Migrating unstable_cache to use cache
unstable_cache has been replaced by the use cache directive in Next.js 16. When cacheComponents is enabled, convert unstable_cache calls to use cache functions:
Before (`unstable_cache`):
import { unstable_cache } from 'next/cache'
const getCachedUser = unstable_cache(
async (id) => getUser(id),
['my-app-user'],
{
tags: ['users'],
revalidate: 60,
}
)
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
const { id } = await params
const user = await getCachedUser(id)
return <div>{user.name}</div>
}After (`use cache`):
import { cacheLife, cacheTag } from 'next/cache'
async function getCachedUser(id: string) {
'use cache'
cacheTag('users')
cacheLife({ revalidate: 60 })
return getUser(id)
}
export default async function Page({ params }: { params: Promise<{ id: string }> }) {
const { id } = await params
const user = await getCachedUser(id)
return <div>{user.name}</div>
}Key differences:
- No manual cache keys -
use cachegenerates keys automatically from function arguments and closures. ThekeyPartsarray fromunstable_cacheis no longer needed. - Tags - Replace
options.tagswithcacheTag()calls inside the function. - Revalidation - Replace
options.revalidatewithcacheLife({ revalidate: N })or a built-in profile likecacheLife('minutes'). - Dynamic data -
unstable_cachedid not supportcookies()orheaders()inside the callback. The same restriction applies touse cache, but you can use'use cache: private'if needed.
---
Limitations
- Edge runtime not supported - requires Node.js
- Static export not supported - needs server
- Non-deterministic values (
Math.random(),Date.now()) execute once at build time insideuse cache
For request-time randomness outside cache:
import { connection } from 'next/server'
async function DynamicContent() {
await connection() // Defer to request time
const id = crypto.randomUUID() // Different per request
return <div>{id}</div>
}Sources:
name: next-cache-components
description: Next.js 16 Cache Components guidance — PPR, use cache directive, cacheLife, cacheTag, updateTag, and migration from unstable_cache. Use when implementing partial prerendering, caching strategies, or migrating from older Next.js cache patterns.
metadata:
priority: 6
docs:
- "https://nextjs.org/docs/app/getting-started/cache-components"
- "https://nextjs.org/docs/app/api-reference/directives/use-cache"
pathPatterns:
- 'next.config.*'
- 'app/**'
- 'src/app/**'
- 'apps/*/app/**'
- 'apps/*/src/app/**'
importPatterns:
- "next/cache"
bashPatterns:
- '\bnext\s+(dev|build)\b'
promptSignals:
phrases:
- "use cache"
- "cache components"
- "partial prerendering"
- "PPR"
- "cacheLife"
- "cacheTag"
- "updateTag"
- "unstable_cache"
allOf:
- [cache, component]
- [cache, directive]
- [partial, prerender]
anyOf:
- "revalidateTag"
- "stale"
- "revalidate"
- "cache profile"
noneOf: []
minScore: 6
validate:
-
pattern: 'unstable_cache\s*\('
message: 'unstable_cache is deprecated in Next.js 16 — use the "use cache" directive with cacheTag() and cacheLife() instead'
severity: recommended
upgradeToSkill: next-cache-components
upgradeWhy: 'Guides migration from unstable_cache to use cache directive with cacheTag and cacheLife.'
-
pattern: '\bcacheHandler\s*:'
message: 'Singular cacheHandler is deprecated in Next.js 16 — use cacheHandlers (plural) with per-type handlers'
severity: recommended
-
pattern: revalidateTag\(\s*['"][^'"]+['"]\s*\)
message: 'Single-arg revalidateTag(tag) is deprecated in Next.js 16 — pass a cacheLife profile: revalidateTag(tag, "max")'
severity: recommended
retrieval:
aliases:
- cache components
- partial prerendering
- PPR
- use cache
intents:
- enable partial prerendering in Next.js
- cache async data with use cache directive
- invalidate cache with cacheTag
- migrate from unstable_cache
entities:
- use cache
- cacheLife
- cacheTag
- updateTag
- revalidateTag
- PPR
chainTo:
-
pattern: 'use cache'
targetSkill: nextjs
message: 'Cache component detected — loading Next.js best practices for RSC boundaries and data patterns alongside caching.'
skipIfFileContains: 'next-best-practices'
Related skills
Forks & variants (1)
Next Cache Components has 1 known copy in the catalog totaling 488 installs. They canonicalize to this original listing.
- vercel - 488 installs
How it compares
Pick next-cache-components for Next.js 16 directive caching; use broader nextjs skills when Cache Components are not involved.
FAQ
What does next-cache-components do?
Next.js 16 Cache Components guidance — PPR, use cache directive, cacheLife, cacheTag, updateTag, and migration from unstable_cache. Use when implementing partial prerendering,.
When should I use next-cache-components?
User implementing partial prerendering, caching strategies, or migrating from older Next.
Is next-cache-components safe to install?
Review the Security Audits panel on this page before installing in production.