All articles Day 8 extra · Extending it

Share your skill.
Make it open source.

By Kowshik Kesavarapu 12 min read Oct 18, 2026

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:

1. Send the fileShare SKILL.md directly. Fine for one or two people. No updates.
2. A public Git repositoryPut the skill in a GitHub repo with a README and a license. People copy the file in. This is the open source baseline.
3. A plugin and a marketplaceAdd two small JSON files to the same repo and people install and update with one command. Best for a skill you will keep improving.
4. Anthropic's directorySubmit the plugin so people can find it on claude.ai. Needs a paid plan and a review.

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:

A sharp descriptionSays what it does and when to use it, in the words people type (Day 8, section 06).
No secrets, no personal pathsSearch the files for tokens, keys, your username and absolute paths such as C:\Users\you. Anything like that must go.
Relative references onlyIf SKILL.md points at a helper file, use ${CLAUDE_SKILL_DIR} so the path works wherever the skill is installed.
A clean-room testCopy the skill into a fresh folder or another project, start a new session and run it. If it needs something you forgot to include, you find out now.
Safe by defaultAsk before anything destructive. create-launcher, for example, never overwrites an existing .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:

>_Repository layout
—☐✕
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.

>_Publish to GitHub
—☐✕
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:

What it doesTwo sentences. "Detects a project's stack and generates launch scripts for every OS."
InstallCopy-paste commands for each route you support, tested on a clean machine.
UseThe exact prompt or slash command, such as /create-launcher, and what the person will see.
Safety notesWhat it reads and writes, and what it never does.
License and contributingOne line each. Say how to report a bug.

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:

>_Install for one project
—☐✕
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\
>_Install for every project
—☐✕
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:

>_plugins/create-launcher/.claude-plugin/plugin.json
—☐✕
{
  "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):

>_.claude-plugin/marketplace.json
—☐✕
{
  "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:

>_Validate and test locally
—☐✕
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:

>_What your users run
—☐✕
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:

Bump the versionChange "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.
Omit the versionLeave it out and users track your latest commit. Best while you iterate quickly.
Set it in one placeDo not put a version in both plugin.json and the marketplace entry. The plugin file wins and validation warns about the mismatch.
Tag a releaseRun 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.

Private repoTeammates need read access and a stored credential. On GitHub, gh auth login then gh auth setup-git does it.
Pre-register for a repoRun 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.
Organisation rolloutAdmins can require a marketplace and its plugins on every machine through managed settings.
Try before you shipTest without installing: 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.

Keep it readablePlain Markdown steps, no hidden downloads. Anyone can read the whole skill in a minute.
Say what it touchesList the files it reads and writes, and the commands it runs, in the README.
Ask before riskAnything destructive or outward-facing should need a yes. Use disable-model-invocation: true for skills with side effects.
Pin what users getTag releases so people can choose a version they reviewed.
Review before you installWhen you use someone else's skill, read its SKILL.md and any scripts first. The same advice applies to yours.

13Release checklist

TestRun the skill in a clean project, by slash command and by plain request.
CleanNo secrets, no personal paths, .gitignore in place.
DocumentREADME with install, use and safety notes. LICENSE file added.
Validateclaude plugin validate . passes if you ship a plugin.
PublishPush to a public repo, then try the install commands from your own README on another machine.
MaintainBump the version on each release and answer issues.

Back to the main guide: Day 8, skills and custom slash commands. Next in the series: subagents.

Follow along

A new article lands every day. I post the short version on LinkedIn.