SKILL.md: how to write a Claude Code skill that actually triggers (format + template) Claude Code skills allow developers to package multi-step procedures into reusable commands triggered by a slash prefix or natural language. The SKILL.md format uses frontmatter fields like description and allowed-tools to control invocation, with arguments supporting substitution syntax. A skill directory can include supporting files for detailed reference material, keeping the main file under 500 lines. Claude Code skills answer a specific pain: you keep pasting the same checklist into chat, or a section of your CLAUDE.md has quietly grown from facts about the project into a multi-step procedure . The official guidance is exactly that — when instructions become a procedure you re-explain, move them into a skill. Unlike CLAUDE.md content, a skill's body loads only when it's used, so a long runbook costs you almost nothing until the moment you need it. This post covers the SKILL.md format end to end: the frontmatter fields, how triggering actually works, arguments, supporting files, and a template you can copy. Everything about writing a good skill follows from one design fact: /skill-name .So the description is not documentation — it's the trigger . The body is not a summary — it's the procedure . Most broken skills I've seen get these backwards: a vague description "Helps with releases" that never matches anything, and a body that's a one-liner. A skill is a directory with a SKILL.md file. In a project: .claude/skills/release-notes/SKILL.md Personal skills live under ~/.claude/skills/ and follow you across projects. --- name: release-notes description: "Draft release notes from merged PRs. Use when the user" asks for release notes, a changelog entry, or "what shipped". --- Collect merged PRs since the last git tag, then write release notes. 1. Run git describe --tags --abbrev=0 to find the last tag. 2. List merges since then: git log