01What "deploying a skill" means
What. A skill is only a folder with a SKILL.md file, so there is no server to deploy. "Deploying" a skill means putting those files somewhere other people can fetch them, and giving them a simple way to install and update. Why open source it. Other developers can use it, improve it and point out bugs, and you get a public project that shows your work. A skill is also easy to read and trust, because it is just text.
How. There are four routes, from least to most effort. You can start at the first and move down as the skill gets used:
SKILL.md directly. Fine for one or two people. No updates.This page walks through routes 2 and 3 using my open source skill create_launcher_skill as the real example, and covers routes 1 and 4 briefly. It is the companion to Day 8: skills and custom commands, which shows how to write the skill itself.
02Get the skill ready to share
Why. A skill that works on your machine can fail on someone else's: it may assume a folder, a tool or a secret only you have. People also judge a skill by its first run, so it pays to check before you publish. How. Go through this list:
C:\Users\you. Anything like that must go.SKILL.md points at a helper file, use ${CLAUDE_SKILL_DIR} so the path works wherever the skill is installed..env and does not start the project unless asked.03Create the repository
What. The repository is the product. Why this layout. Putting the skill at .claude/skills/<name>/SKILL.md means the repo itself is a working project-level skill, so anyone can open it in Claude Code and try it straight away. How. This is the real layout of create_launcher_skill:
create_launcher_skill\ .claude\skills\create-launcher\SKILL.md the skill itself plugins\create-launcher\... plugin copy (route 3) .claude-plugin\marketplace.json catalog (route 3) README.md what, why, install, use LICENSE what others may do with it .gitignore keeps .env and .venv out
Create and publish it from PowerShell. The GitHub CLI (gh) does the remote part in one command; if you do not have it, create an empty repository on github.com in the browser and copy its URL instead.
mkdir my-skill; cd my-skill mkdir .claude\skills\my-skill # add SKILL.md, README.md, LICENSE, .gitignore git init -b main git add . git commit -m "Add my-skill" # option A: GitHub CLI creates the repo and pushes gh repo create my-skill --public --source . --push # option B: after creating an empty repo on github.com git remote add origin https://github.com/YOUR-NAME/my-skill.git git push -u origin main
Before you push, run git status and look at every file that will go public. Once something is on a public repository, assume it has been copied, even if you delete it later. If a secret slips in, rotate it at the provider instead of just removing the file.
04Choose a license
What. A license is a file that says what other people may do with your work. Why it matters. Without one, the default is "all rights reserved": the code is visible, but nobody is clearly allowed to copy, change or share it, so most developers will not touch it. Open source means you chose to give that permission. How. For small skills the common choice is the MIT license: anyone may use, copy, change and redistribute the skill, including commercially, as long as they keep your copyright notice. Add it on GitHub with Add file, Create new file, name it LICENSE, and pick a template, or paste the MIT text. create_launcher_skill uses MIT. Also set "license": "MIT" in the plugin file (section 07).
05Write a README people can act on
Why. The README is the page most visitors see, and they decide in seconds whether to try the skill. How. Put these in order:
/create-launcher, and what the person will see.06Route 2: people install by copying the file
What. The simplest install is copying one file into a skills folder. Why list both. People who work in one repo want a project skill; people who want it everywhere want a personal skill. Put both in your README. How. In PowerShell:
git clone https://github.com/Kowshik46/create_launcher_skill mkdir .claude\skills\create-launcher copy create_launcher_skill\.claude\skills\create-launcher\SKILL.md .claude\skills\create-launcher\
mkdir $HOME\.claude\skills\create-launcher copy create_launcher_skill\.claude\skills\create-launcher\SKILL.md $HOME\.claude\skills\create-launcher\
Claude Code watches skill folders, so the skill is available at once. The limit of this route is updates: people have to pull and copy again. That is what the next route fixes.
07Route 3: make it a plugin with a marketplace
What. A plugin is a folder that Claude Code installs as one unit. It can hold skills, subagents, hooks and MCP servers. A marketplace is just a catalog file in a Git repo that lists plugins and where to fetch them. Why. Users get one-command install, one-command update, versions, and your skill is listed in the /plugin browser. How. You need two small files. First, the plugin manifest at plugins/create-launcher/.claude-plugin/plugin.json, next to the skill at plugins/create-launcher/skills/create-launcher/SKILL.md:
{
"name": "create-launcher",
"description": "Detects a project's stack and generates launch scripts.",
"version": "1.0.0",
"author": { "name": "Kowshik" },
"license": "MIT"
}
Second, the catalog at the repository root, .claude-plugin/marketplace.json. It needs a name, an owner and a plugins list, and each plugin entry needs a name and a source (a path from the repository root):
{
"name": "kowshik-tools",
"description": "Developer workflow skills by Kowshik",
"owner": { "name": "Kowshik" },
"plugins": [
{
"name": "create-launcher",
"source": "./plugins/create-launcher",
"description": "Generates launch.sh, launch.bat and launch.ps1 for a project"
}
]
}
Two rules save you from the most common failed installs. The entry name in the marketplace must match the name in plugin.json, and relative source paths start with ./ and never use ... Then check your work from the repository root:
claude plugin validate . claude plugin marketplace add . claude plugin install create-launcher@kowshik-tools claude plugin list
If it validates, installs and shows as enabled, push it. Everyone else then installs with two commands, or the same two inside a session with /plugin marketplace add and /plugin install:
claude plugin marketplace add Kowshik46/create_launcher_skill claude plugin install create-launcher@kowshik-tools
Plugin skills are namespaced by the plugin name, so the command is /create-launcher:create-launcher. Asking in plain words ("create launcher scripts for this project") works too, because Claude still matches your words to the description. One practical note from this repo: the skill exists twice, under .claude/skills/ for route 2 and under plugins/ for route 3. Keep the two copies identical when you edit, and mention it in the contributing notes so nobody updates only one.
08Versions and updates
What and why. Claude Code only downloads a new copy of a plugin when its version changes, so if you push edits without changing the version, users keep the old one and claude plugin update says they are already up to date. How. Pick one approach:
"version" in plugin.json on every release (1.0.0, 1.0.1, 1.1.0). Users get updates only on a release. Best for stable tools.version in both plugin.json and the marketplace entry. The plugin file wins and validation warns about the mismatch.claude plugin tag --push in the plugin folder to create a name--vX.Y.Z git tag. Useful once other plugins depend on yours.Users update with claude plugin update create-launcher@kowshik-tools. Auto-update is off by default for third-party marketplaces, and each user turns it on under Marketplaces in /plugin. Never rename a published plugin: installs are recorded under the old name and break. If you must, add a renames map to the marketplace file so existing users migrate.
09Share it with a team, or keep it private
What and why. The same marketplace repo works for a company, and the repo can be private. Claude Code uses whatever Git credentials the user's machine already has, so there is no extra token to manage. How.
gh auth login then gh auth setup-git does it.claude plugin marketplace add your-org/your-marketplace --scope project once in the project and commit the .claude/settings.json it writes. Teammates who trust the folder then get the marketplace registered.claude --plugin-dir ./plugins/create-launcher loads a plugin from a folder for one session.10VS Code users
A plugin installed at user scope in the terminal is also available in the VS Code extension, because both read the same settings files. So tell VS Code users to run the two claude plugin commands once in the integrated terminal (Ctrl+`), then open a new conversation and type / to see the skill. If you only offer route 2, they can copy the file with the Explorer into .claude/skills.
11Route 4: Anthropic's directory
What. Anthropic runs a directory that people browse on claude.ai and in Cowork. A listing there also reaches Claude Code users through account sync. Why. It puts your skill in front of people who would never find your GitHub repo. How. It needs a GitHub repository that holds the plugin and a paid claude.ai plan to submit from. Run claude plugin validate ./your-plugin --strict locally, then submit in the developer portal at claude.ai/directory/manage. A review step applies, and a clean local validation does not guarantee the portal passes. Treat this as an optional last step, after the skill has real users.
12Security: why people will trust it
An installed plugin runs with the user's permissions, so people are right to be careful. You earn trust by being easy to inspect.
disable-model-invocation: true for skills with side effects.SKILL.md and any scripts first. The same advice applies to yours.13Release checklist
.gitignore in place.claude plugin validate . passes if you ship a plugin.Back to the main guide: Day 8, skills and custom slash commands. Next in the series: subagents.