Claude Code Skills
Skills are reusable instruction packs that teach Claude Code how to do a specific task well — design a landing page, run an SEO audit, review a release. A skill is a folder with a SKILL.md (a description plus instructions) and any supporting files. When a task matches a skill's description, Claude Code loads it automatically.
In this boilerplate they ship committed. Clone the repo and they load on your first session, with nothing to install.
What ships
Design and UX
Symlinked into .agents/skills/
accessibility-inclusive-designagentic-ai-generative-uxdesign-critique-case-studiesdesign-systems-architectureinteraction-motion-designnng-ux-heuristicsui-visual-design-systemux-ethics-content-strategy
Next.js and code patterns
Symlinked into .agents/skills/
component-patterns-codenextjs-advanced-routingnextjs-app-router-fundamentalsnextjs-dynamic-routes-paramsnextjs-server-client-componentsperformance-states-patternsvercel-ai-sdk
SEO
Symlinked into .agents/skills/
seo-initial
Spec Harness (the build loop)
Real directories in .claude/skills/
spec-harnessspec-harness-auditspec-harness-buildspec-harness-generate-agentsspec-harness-installspec-harness-learnspec-harness-planspec-harness-rulesspec-harness-specspec-harness-tasksspec-harness-testerspec-harness-ticketsspec-harness-verify
Guardrails
Real directories in .claude/skills/
backend-secrets-lockrelease-preflightsecrets-guard
.claude/skills/. Read the directory itself after you add or archive one. pnpm run init resolves every symlink in there on a fresh clone and stops if one points at nothing, because a broken link costs you a skill without showing up in ls.How they are wired
Claude Code scans .claude/skills/ and loads anything it finds at .claude/skills/<name>/SKILL.md. Two shapes live there and both load the same way: the design, UX, Next.js and SEO packs are symlinks whose canonical folders sit in .agents/skills/, and the Spec Harness family plus the guardrail skills are real directories that exist only in .claude/skills/. The symlink is a filing choice, not a switch.
Archiving works by depth, not by deleting anything. .claude/skills/_archived/ holds skills that are kept but not loaded: discovery only looks one level deep, so an archived skill's SKILL.md sits one level too far to be found. To bring one back, move or link it up one level.
# restore an archived skill that lives in .agents/skills/_archived/ln -s ../../.agents/skills/_archived/<skill-name> .claude/skills/<skill-name># restore an archived skill that is a real directory$mv.claude/skills/_archived/<skill-name> .claude/skills/<skill-name># archive an active one (kept on disk, no longer loaded)$mv.claude/skills/<skill-name> .claude/skills/_archived/<skill-name>How skills work
- A skill lives in a directory with a
SKILL.mdat its root. - The frontmatter
descriptioncontrols when the skill triggers. - The body holds the methodology Claude follows once the skill is active.
Adding a skill to your project
Project skills live in .claude/skills/:
$mkdir-p .claude/skills/my-skillThen create .claude/skills/my-skill/SKILL.md:
---
name: my-skill
description: Use when the user asks to do X. Triggers on "X", "do X", "X this page".
---
# My Skill
Step-by-step instructions Claude should follow when this skill is active....claude/skills/ ship with the repo and are shared with your team. Personal skills live in ~/.claude/skills/ and follow you across projects.Adding your own
A skill for your own product (your editorial voice, your review checklist, your deploy ritual) is a folder and a file. Drop it next to the ones that ship and it loads on the next session.
description is the only thing that decides whether a skill fires. Keep it specific and name the phrases you would actually type. A vague description either never triggers or triggers on the wrong task.