
Nextjs 16
- 11 installs
- 14.5k repo stars
- Updated August 4, 2026
- prowler-cloud/prowler
Helps with ai & agent building tasks.
About
nextjs-16 is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- nextjs-16
- AI & Agent Building
- AI-coding skill
Nextjs 16 by the numbers
- 11 all-time installs (skills.sh)
- Ranked #11,740 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/prowler-cloud/prowler --skill nextjs-16Add your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 11 |
|---|---|
| repo stars | ★ 14.5k |
| Last updated | August 4, 2026 |
| Repository | prowler-cloud/prowler ↗ |
What it does
Helps with ai & agent building tasks.
Files
App Router File Conventions
app/
├── layout.tsx # Root layout (required)
├── page.tsx # Home page (/)
├── loading.tsx # Loading UI (Suspense)
├── error.tsx # Error boundary
├── not-found.tsx # 404 page
├── (auth)/ # Route group (no URL impact)
│ ├── login/page.tsx # /login
│ └── signup/page.tsx # /signup
├── api/
│ └── route.ts # API handler
└── _components/ # Private folder (not routed)Next.js 16 Notes
- Use
proxy.tsfor request-boundary logic.middleware.tsis deprecated in Next.js 16. proxy.tsruns on the Node.js runtime and cannot be configured for Edge.- Keep
proxy.tsmatchers narrow. Excludeapi, static files, and image assets unless the route explicitly needs proxy logic. - Route Handlers in
app/api/**/route.tsare the right fit for health checks, webhooks, backend-for-frontend endpoints, and server-only proxy calls.
Server Components (Default)
// No directive needed - async by default
export default async function Page() {
const data = await db.query();
return <Component data={data} />;
}Server Actions
"use server";
import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
export async function createUser(formData: FormData) {
const name = formData.get("name") as string;
await db.users.create({ data: { name } });
revalidatePath("/users");
redirect("/users");
}Data Fetching
async function Page() {
const [users, posts] = await Promise.all([getUsers(), getPosts()]);
return <Dashboard users={users} posts={posts} />;
}
<Suspense fallback={<Loading />}>
<SlowComponent />
</Suspense>;Caching and Revalidation
import { revalidatePath, revalidateTag } from "next/cache";
export async function refreshDashboard() {
"use server";
revalidatePath("/");
revalidateTag("dashboard");
}- Use
revalidatePathfor route-level invalidation after mutations. - Use
revalidateTagwhen data fetches share a cache tag across routes. - With Cache Components enabled, put
"use cache"only in pure server-side cached functions. Do not cache auth, tenant-scoped, or per-user responses unless the cache key explicitly isolates them.
Route Handlers (API)
// app/api/users/route.ts
import { NextResponse } from "next/server";
export async function GET() {
const users = await db.users.findMany();
return NextResponse.json(users);
}
export async function POST(request: Request) {
const body = await request.json();
const user = await db.users.create({ data: body });
return NextResponse.json(user, { status: 201 });
}Proxy
// proxy.ts (root level)
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
export function proxy(request: NextRequest) {
const token = request.cookies.get("token");
if (!token && request.nextUrl.pathname.startsWith("/dashboard")) {
return NextResponse.redirect(new URL("/login", request.url));
}
return NextResponse.next();
}
export const config = {
matcher: ["/dashboard/:path*"],
};Metadata
export const metadata = {
title: "My App",
description: "Description",
};
export async function generateMetadata() {
const product = await getProduct();
return { title: product.name };
}server-only Package
import "server-only";
export async function getSecretData() {
return db.secrets.findMany();
}Related skills
AI & Agent Buildingagents