Creating Custom Skills in Claude Code
Building Your Own Slash Commands in Claude Code
If you use Claude Code regularly, you've probably found yourself typing the same instructions over and over — things like "analyze this repo and give me a summary" or "run the tests and organize the results." Custom Skills let you turn those repetitive tasks into a single /my-skill command.
What Is a Skill?
A Skill is a custom slash command for Claude Code. Create a single SKILL.md file and you can invoke it with /skill-name. Instead of writing long prompts every time, you can templatize your most-used workflows.
Where Do You Put Them?
# Available across all projects (personal)
~/.claude/skills/<skill-name>/SKILL.md
# Available only in a specific project
.claude/skills/<skill-name>/SKILL.md
Personal skills work in any repo. Project skills only activate within that repo.
SKILL.md Structure
---
name: my-skill
description: Explains when this skill should be used
argument-hint: [argument description]
disable-model-invocation: true
allowed-tools: Read, Grep, Glob
---
# Skill Instructions
Perform the task based on $ARGUMENTS.
Key Options
| Option | Description |
|---|---|
name | The name used to invoke it as /name |
description | Describes the skill — used by Claude to decide whether to auto-invoke it |
argument-hint | Argument hint shown in autocomplete |
disable-model-invocation | If true, the skill can only be run manually |
allowed-tools | Restricts which tools the skill can use |
Passing Arguments
---
name: analyze
---
Please analyze the $ARGUMENTS file.
# /analyze src/main.ts → "Please analyze the src/main.ts file."
Please convert $0 to $1 format.
# /convert data.json csv → "Please convert data.json to csv format."
$ARGUMENTS: the full argument string$0,$1,$2: positional arguments
Real-World Example
Here's a skill I built that collects information from a Flutter open-source project and automatically generates a draft blog post.
---
name: add-flutter-to-blogman
description: Collects Flutter repo info and generates a draft project introduction post
disable-model-invocation: true
allowed-tools: Read, Grep, Glob, Write
---
# Convert a Flutter Project into a Blog Post
Read README.md, pubspec.yaml, and CHANGELOG.md,
then save a project introduction draft as blogman-draft.md.
## Information to Collect
- README.md: description, features, screenshots
- pubspec.yaml: package name, dependencies, version
- CHANGELOG.md: latest changes
## Output
Save to blogman-draft.md
Now, running /add-flutter-to-blogman in any Flutter repo automatically produces a blog post draft.
Tips
- Read-only skills: Restrict to
allowed-tools: Read, Grep, Globto allow code analysis without letting the skill make any changes. - Prevent accidental execution: For risky operations like deployments or deletions, use
disable-model-invocation: trueso the skill can only be triggered manually. - Split out reference docs: If your
SKILL.mdgets long, you can place separate.mdfiles in the same folder and reference them from the skill.
If there's a Claude Code workflow you keep repeating, turn it into a Skill.