Angular
ericrisco/rsc-harness
A skill your agent uses when building, refactoring, or debugging Angular (v20/21+): standalone components, signals, zoneless change detection, @if/@for/@defer control flow, inject() DI…
Next.js App Router architecture: React Server Components (RSC), Server Actions, nested layouts, route handlers, and streaming.
$ npx skills add irahardianto/awesome-agv --skill nextjs-idioms -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install irahardianto/awesome-agv nextjs-idioms --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/irahardianto/awesome-agv.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/nextjs-idioms .claude/skills/nextjs-idioms && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "nextjs-idioms" agent skill from https://github.com/irahardianto/awesome-agv/tree/main/.agents/skills/nextjs-idioms into .claude/skills/nextjs-idioms/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nextjs-idioms", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/irahardianto/awesome-agv/tree/main/.agents/skills/nextjs-idiomsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add irahardianto/awesome-agv --skill nextjs-idioms -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install irahardianto/awesome-agv nextjs-idioms --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/irahardianto/awesome-agv.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/nextjs-idioms .agents/skills/nextjs-idioms && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "nextjs-idioms" agent skill from https://github.com/irahardianto/awesome-agv/tree/main/.agents/skills/nextjs-idioms into .agents/skills/nextjs-idioms/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nextjs-idioms", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add irahardianto/awesome-agv --skill nextjs-idioms -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install irahardianto/awesome-agv nextjs-idioms --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/irahardianto/awesome-agv.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/nextjs-idioms .cursor/skills/nextjs-idioms && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "nextjs-idioms" agent skill from https://github.com/irahardianto/awesome-agv/tree/main/.agents/skills/nextjs-idioms into .cursor/skills/nextjs-idioms/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nextjs-idioms", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/irahardianto/awesome-agv.git --path .agents/skills/nextjs-idioms--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add irahardianto/awesome-agv --skill nextjs-idioms -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install irahardianto/awesome-agv nextjs-idioms --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/irahardianto/awesome-agv.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/nextjs-idioms .gemini/skills/nextjs-idioms && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "nextjs-idioms" agent skill from https://github.com/irahardianto/awesome-agv/tree/main/.agents/skills/nextjs-idioms into .gemini/skills/nextjs-idioms/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nextjs-idioms", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install irahardianto/awesome-agv nextjs-idiomsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add irahardianto/awesome-agv --skill nextjs-idioms -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/irahardianto/awesome-agv.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/nextjs-idioms .github/skills/nextjs-idioms && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "nextjs-idioms" agent skill from https://github.com/irahardianto/awesome-agv/tree/main/.agents/skills/nextjs-idioms into .github/skills/nextjs-idioms/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nextjs-idioms", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add irahardianto/awesome-agv --skill nextjs-idioms -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install irahardianto/awesome-agv nextjs-idioms --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/irahardianto/awesome-agv.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/nextjs-idioms .opencode/skills/nextjs-idioms && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "nextjs-idioms" agent skill from https://github.com/irahardianto/awesome-agv/tree/main/.agents/skills/nextjs-idioms into .opencode/skills/nextjs-idioms/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "nextjs-idioms", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
nextjs-idiomsNext.js App Router architecture: React Server Components (RSC), Server Actions, nested layouts, route handlers, and streaming.
Nextjs Idioms is an agent skill from irahardianto/awesome-agv. Next.js App Router architecture: React Server Components (RSC), Server Actions, nested layouts, route handlers, and streaming. Use when building or refactoring Next.js web applications. Pair with react-idioms and typescript-idioms.
Its SKILL.md is about 4.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/project-structure.md`).
It sits in Development, covering Refactoring. It works with Next.js, React, TypeScript and Zod. The repository describes itself as: Comprehensive sets of standards and practices designed to elevate the capabilities of AI coding agents. The licence is MIT.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 9e997ba. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
SESSION_SECRETFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Nextjs Idioms loads about 4.2k tokens when it runs, and up to ~5.7k if it reads all its reference files. Until then it costs about 61 tokens; SKILL.md has 862 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
4. **`.env.local`** for local overrides (gitignored). **`.env`** for defaults (committed, no secrets).Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from irahardianto/awesome-agv at commit 9e997ba, republished under its MIT licence (© irahardianto). 862 words, ~4,245 tokens.
.claude/skills/nextjs-idioms/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Next.js (15+) rewards App Router, Server Components, and Server Actions. Idiomatic Next.js = server-first, streaming, edge-ready. Push logic to the server, keep the client thin.
Scope: Next.js-specific patterns only. For React:
@.agents/skills/react-idioms/SKILL.md. For TypeScript:@.agents/skills/typescript-idioms/SKILL.md. For project layout:references/project-structure.md.Loading guard: This skill assumes the Next.js App Router (Next.js 15+,
app/directory). For Pages Router (pages/) legacy code, most React idioms still apply but App-Router-specific sections (RSC, Server Actions, parallel/intercepting routes,'use cache') do not. Co-load@.agents/skills/react-idioms/SKILL.mdfor client-component patterns.
Load these before writing code in the matching context — not after.
| Situation | Reference to Load |
|---|---|
| Starting a Next.js project or reviewing file layout | references/project-structure.md |
| TypeScript type system, async, Zod, error types | @.agents/skills/typescript-idioms/SKILL.md (always co-load) |
| Zod schemas / boundary validation (API routes, Server Actions, env) | @.agents/skills/typescript-idioms/references/zod-patterns.md |
| Async / I/O / coercion / security pitfalls | @.agents/skills/typescript-idioms/references/ts-patterns-and-anti-patterns.md |
| Client-component hooks/state/forms (non-App-Router) | @.agents/skills/react-idioms/SKILL.md |
'use client' only when: using hooks (useState, useEffect), attaching event handlers, calling browser APIs (window, localStorage), or wrapping third-party client libs.// app/tasks/page.tsx (Server)
export default async function TasksPage() {
const tasks = await getTasks();
return <TaskBoard tasks={tasks} />; // Client component for drag-and-drop
}
// features/task/components/task-board.tsx ('use client')
export function TaskBoard({ tasks }: { tasks: Task[] }) {
const [sorted, setSorted] = useState(tasks);
return <DndContext>...</DndContext>;
}'use client' as deep as possible — never mark an entire page as client:// ❌ 'use client' at page level loses all server benefits
// ✅ Only wrap the interactive leaf:
export default async function TasksPage() {
const tasks = await getTasks();
return (
<>
<TaskStats count={tasks.length} /> {/* Server */}
<TaskFilterBar /> {/* Client — has state */}
</>
);
}'use client' only per the decision tree above.app/tasks/
├── page.tsx # Server Component
├── loading.tsx # Suspense fallback
├── error.tsx # Error boundary ('use client')
└── layout.tsx # Shared layoutapp/
├── (auth)/login/page.tsx # /login
├── (auth)/register/page.tsx # /register
└── (dashboard)/
├── layout.tsx # Shared dashboard layout
├── tasks/page.tsx # /tasks
└── settings/page.tsx # /settings@slot parallel routes — render multiple pages simultaneously in the same layout:app/(dashboard)/
├── layout.tsx # Receives { children, modal }
├── @modal/default.tsx # Required: null fallback
├── @modal/(.)tasks/[id]/page.tsx # Intercepting route → modal
├── tasks/page.tsx # Main content
└── tasks/[id]/page.tsx # Full page (direct nav)export default function DashboardLayout({
children, modal,
}: {
children: React.ReactNode; modal: React.ReactNode;
}) {
return <>{children}{modal}</>;
}default.tsx is required for every @slot — returns null when no active match.(.) same level, (..) one level up, (...) from root.export default async function TasksPage() {
const tasks = await db.tasks.findMany();
return <TaskList tasks={tasks} />;
}'use server';
import { revalidatePath } from 'next/cache';
import { redirect } from 'next/navigation';
export async function createTask(formData: FormData) {
const title = formData.get('title');
if (!title || typeof title !== 'string') return { error: 'Title is required' };
await db.tasks.create({ data: { title } });
revalidatePath('/tasks');
redirect('/tasks');
}await:const [user, tasks, stats] = await Promise.all([getUser(), getTasks(), getStats()]);fetch cache options — Next.js extends fetch:await fetch(url, { cache: 'force-cache' }); // Cached indefinitely
await fetch(url, { cache: 'no-store' }); // Fresh every request
await fetch(url, { next: { revalidate: 3600 } }); // Time-based ISR
await fetch(url, { next: { tags: ['tasks'] } }); // Tag-based invalidation'use cache' directive for non-fetch data (DB queries, computations — Next.js 15+):'use cache';
import { cacheLife, cacheTag } from 'next/cache';
export async function getCachedTasks(userId: string) {
cacheLife('minutes'); // Built-in profile: 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'max'
cacheTag('tasks', `user-${userId}`);
return db.tasks.findMany({ where: { userId } });
}Legacy:
unstable_cache(deprecated in Next.js 15+) works the same way but is being replaced by'use cache'.
export const revalidate = 60; // ISR every 60s
export const dynamic = 'force-dynamic'; // Always fresh'use server';
export async function updateTask(id: string, data: TaskUpdate) {
await db.tasks.update({ where: { id }, data });
revalidateTag('tasks'); // Invalidate tagged fetches
revalidatePath('/tasks'); // Rebuild the page
}force-cache. User-specific → no-store. Semi-dynamic → revalidate: N. After mutation → revalidateTag/revalidatePath.// app/api/tasks/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { z } from 'zod';
const createTaskSchema = z.object({
title: z.string().min(1).max(200),
priority: z.enum(['low', 'medium', 'high']).default('medium'),
});
export async function GET(request: NextRequest) {
const tasks = await db.tasks.findMany();
return NextResponse.json(tasks);
}
export async function POST(request: NextRequest) {
const parsed = createTaskSchema.safeParse(await request.json());
if (!parsed.success) {
return NextResponse.json({ error: parsed.error.flatten() }, { status: 400 });
}
const task = await db.tasks.create({ data: parsed.data });
return NextResponse.json(task, { status: 201 });
}// app/api/tasks/[id]/route.ts
export async function GET(
request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
const { id } = await params;
const task = await db.tasks.findUnique({ where: { id } });
if (!task) return NextResponse.json({ error: 'Not found' }, { status: 404 });
return NextResponse.json(task);
}export async function GET() {
const stream = new ReadableStream({
async start(controller) {
for await (const chunk of db.tasks.stream()) {
controller.enqueue(new TextEncoder().encode(JSON.stringify(chunk) + '\n'));
}
controller.close();
},
});
return new Response(stream, { headers: { 'Content-Type': 'application/x-ndjson' } });
}middleware.ts at project root (or src/middleware.ts):import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const token = request.cookies.get('session')?.value;
if (!token && request.nextUrl.pathname.startsWith('/dashboard')) {
return NextResponse.redirect(new URL('/login', request.url));
}
const response = NextResponse.next();
response.headers.set('x-request-id', crypto.randomUUID());
return response;
}
export const config = {
matcher: ['/dashboard/:path*', '/api/:path*'],
};config.matcher — never run middleware on every request.fs, path). Web APIs only.NEXT_PUBLIC_ prefix exposes vars to client — use only for non-secrets:const apiUrl = process.env.NEXT_PUBLIC_API_URL; // ✅ Client + server
const dbUrl = process.env.DATABASE_URL; // ✅ Server-onlyEnvSchema.parse(process.env) pattern from @.agents/skills/typescript-idioms/references/zod-patterns.md §Environment Variable Validation. Add Next.js-specific vars (NEXT_PUBLIC_*, SESSION_SECRET) to the schema. Never use process.env in business logic — import from the validated env module.process.env in business logic — import from validated env module..env.local for local overrides (gitignored). .env for defaults (committed, no secrets).error.tsx boundary ('use client' required) with reset for retry:'use client';
export default function ErrorBoundary({ error, reset }: {
error: Error & { digest?: string }; reset: () => void;
}) {
return <div><h2>Something went wrong</h2><button onClick={reset}>Retry</button></div>;
}not-found.tsx for 404 — call notFound() when data is missing:import { notFound } from 'next/navigation';
export default async function TaskPage({ params }: { params: Promise<{ id: string }> }) {
const task = await getTask((await params).id);
if (!task) notFound();
return <TaskDetail task={task} />;
}'use server';
type ActionResult = { success: true } | { success: false; error: string };
export async function createTask(formData: FormData): Promise<ActionResult> {
try {
await db.tasks.create({ data: { title: formData.get('title') as string } });
revalidatePath('/tasks');
return { success: true };
} catch { return { success: false, error: 'Failed to create task' }; }
}export const dynamic = 'force-dynamic' only when data changes per request.next/image with width, height, and priority for above-fold.next/link.<Suspense fallback={<TasksSkeleton />}>
<TaskList /> {/* Server Component — streams when ready */}
</Suspense>import type { Metadata } from 'next';
export const metadata: Metadata = {
title: 'Tasks | MyApp',
description: 'Manage your tasks efficiently',
openGraph: { title: 'Tasks', description: 'Manage your tasks efficiently', type: 'website' },
};export async function generateMetadata({ params }: Props): Promise<Metadata> {
const { id } = await params;
const task = await getTask(id);
return { title: task.title, description: task.description };
}useEffect for data fetching in Server Components — fetch directly'use client' on everything — Server Components are the default for a reasongetServerSideProps / getStaticProps — App Router uses async componentsawait in Server Components — use Promise.all() for parallel fetching'use client' components small, push logic to serverfetch URLs — use environment variables and centralized API clientprocess.env everywhere — validate once in env.ts, import the typed objectconfig.matcher to limit to relevant routesFor universal testing principles, see
.agents/rules/testing-strategy.md. Below: framework-specific patterns only.
next/jest for jest configuration:const nextJest = require('next/jest')({ dir: './' });
module.exports = nextJest({ /* custom config */ });import { createTask } from '@/app/actions';
it('returns error for empty title', async () => {
const formData = new FormData();
formData.set('title', '');
const result = await createTask(formData);
expect(result).toEqual({ error: 'Title is required' });
});import { GET } from '@/app/api/tasks/route';
it('returns tasks as JSON', async () => {
const request = new NextRequest('http://localhost/api/tasks');
const response = await GET(request);
expect(response.status).toBe(200);
});import { middleware } from '@/middleware';
it('redirects unauthenticated users', () => {
const request = new NextRequest('http://localhost/dashboard');
const response = middleware(request);
expect(response.status).toBe(307);
expect(response.headers.get('location')).toContain('/login');
});| Tool | Purpose | Command |
|---|---|---|
| Prettier | Formatting | npx prettier --write . |
ESLint + eslint-config-next | Linting | npx eslint . (next lint was removed in Next.js 16 — use the ESLint CLI directly with eslint-config-next/core-web-vitals) |
| TypeScript | Type checking | npx tsc --noEmit |
© irahardianto, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in .agents/skills/nextjs-idioms of irahardianto/awesome-agv.
Open the folder on GitHubat commit 9e997ba
Nextjs Idioms next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Nextjs Idioms this skillirahardianto/awesome-agv | 156 | — | ~4.2k | Automated safety check: Notes | MIT | |
| Angularericrisco/rsc-harness | 190 | — | ~3.4k | Automated safety check: Pass | MIT | |
| Nuqstrycompai/crm | 11k | 1 repos | ~1.7k | Automated safety check: Pass | MIT | |
| Ultraciteagustinusnathaniel/nextarter-tailwind | 125 | 2 repos | ~1.2k | Automated safety check: Pass | MIT | |
| React Best Practicesshapeshift/web | 206 | 1 repos | ~2k | Automated safety check: Pass | MIT | |
| Nextjs App Architecturejakubwarkusz/themes | 123 | 1 repos | ~2.5k | Automated safety check: Pass | MIT |
ericrisco/rsc-harness
A skill your agent uses when building, refactoring, or debugging Angular (v20/21+): standalone components, signals, zoneless change detection, @if/@for/@defer control flow, inject() DI…
trycompai/crm
nuqs (type-safe URL query state) best practices for Next.js and other React frameworks.
agustinusnathaniel/nextarter-tailwind
Ultracite is a zero-config linting and formatting preset for JavaScript/TypeScript projects.
shapeshift/web
Comprehensive React and Next.js performance optimization guide with 40+ rules for eliminating waterfalls, optimizing bundles, and improving rendering.
jakubwarkusz/themes
Build or audit Next.js 16 App Router apps using a next-beats-style React Server Components architecture.
kcsujeet/ilamy-calendar
Reviews code changes for reuse, composition, codebase consistency, and slop.
irahardianto/awesome-agv
Commits to one bold aesthetic direction, sets up a CSS token system for it, then builds the interface in Vue or plain HTML using those tokens.
irahardianto/awesome-agv
Profile-driven performance optimization protocol. An agent skill from irahardianto/awesome-agv.
irahardianto/awesome-agv
Coding conventions for Angular 19 and later: standalone components, signals, OnPush change detection, lazy routes and where RxJS still belongs.
irahardianto/awesome-agv
Rules for designing CI/CD pipelines in layers: universal lint, test and scan stages, container builds with SBOM attestation, and GitOps for orchestrated deployments.
irahardianto/awesome-agv
Hono lightweight web framework patterns: type-safe route handlers, middleware composition, Zod validation, and RPC clients for Cloudflare Workers, Node, or Bun.
irahardianto/awesome-agv
Mobile E2E testing patterns — Flutter integrationtest, Patrol, Maestro, golden testing, device matrix, and test data management.
Works with
Categories
Next.js App Router architecture: React Server Components (RSC), Server Actions, nested layouts, route handlers, and streaming. Nextjs Idioms is an agent skill from irahardianto/awesome-agv.js App Router architecture: React Server Components (RSC), Server Actions, nested layouts, route handlers, and streaming.
Nextjs Idioms fits situations like: refactoring Next.js web applications; tasks that involve Refactoring.
Run `npx skills add irahardianto/awesome-agv --skill nextjs-idioms -a claude-code`. Or copy the skill folder (.agents/skills/nextjs-idioms in irahardianto/awesome-agv) into .claude/skills/nextjs-idioms in your project. Claude Code loads it when a task matches its description.
Run `npx skills add irahardianto/awesome-agv --skill nextjs-idioms -a codex`. Or copy the skill folder (.agents/skills/nextjs-idioms in irahardianto/awesome-agv) into .agents/skills/nextjs-idioms in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add irahardianto/awesome-agv --skill nextjs-idioms -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/nextjs-idioms, .gemini/skills/nextjs-idioms, .github/skills/nextjs-idioms and .opencode/skills/nextjs-idioms in your project.
Going by SKILL.md and its folder, Nextjs Idioms needs the command-line tools its instructions call (npx) and credentials named SESSION_SECRET. Our summary lists: Node.js; A credential in SESSION_SECRET.
SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Nextjs Idioms is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.2k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 1.5k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Nextjs Idioms: Angular (ericrisco/rsc-harness, 190 stars), Nuqs (trycompai/crm, 11k stars), Ultracite (agustinusnathaniel/nextarter-tailwind, 125 stars) and React Best Practices (shapeshift/web, 206 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
irahardianto (a GitHub user) maintains it in irahardianto/awesome-agv, which has 156 GitHub stars. The repository holds 34 skills in this directory. The repository was last updated on October 5, 2026.
Source: irahardianto/awesome-agv on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.