The Problem: Your .claude/skills/ Is a Dumping Ground
If you've been using Claude Code for more than a few weeks, your ~/.claude/skills/ directory is probably a mess. Frameworks like gstack dump ~80 skills in there. You installed a few MCP servers. Maybe you wrote custom skills for your Django project. Now every Claude Code session loads all of them, regardless of whether you're building a web app or debugging a Rust kernel module.
That's not just clutter — it's wasted context window. Every skill you load is a prompt prefix that Claude has to process, even when it's irrelevant to the current task.
What Changed — skillkit: Per-Project Skill Management
skillkit is an open-source tool that makes skill selection per-project and declarative. Instead of one global skill directory, you define a skills.toml manifest that specifies exactly which skills (or packs of skills) belong to each project.
Installation
git clone https://github.com/narendranag/skillkit ~/ai/skillkit
cd ~/ai/skillkit
uv tool install --editable .
This puts skillkit on your PATH via uv's tool shim directory. Add that directory to your shell's $PATH if uv prompts you.
How It Works
- Define sources in
sources.toml(in the registry directory, defaulting to~/ai/skillkit):
[sources]
mine = "~/ai/skillkit/skills"
gstack = "~/.claude/skills/gstack"
- Create a
skills.tomlin your project root:
[pack]
name = "webapp"
description = "Skills for a typical web app project"
skills = ["mine:qa", "gstack:next-best-practices", "gstack:review"]
- Run the sync:
skillkit sync
This materializes only the selected skills into .claude/skills/ inside your project. Since .claude/skills/ is in .gitignore, you commit only skills.toml. Each teammate runs skillkit sync after checkout.
Per-Skill Additions
Don't want to edit TOML by hand? Use the CLI:
skillkit add gstack:review
This adds the skill to skills.toml and materializes it immediately.
Vendor Mode (Version Locking)
Want to freeze skills at a specific version and commit them to the repo? Use vendor:
skillkit vendor
This syncs skills, then writes a negation line to .gitignore so the .claude/skills/ directory is tracked by git. Now your CI and teammates get exactly the same skill versions.
Adopting Existing gstack Skills
If you already have gstack installed, its skills are scattered across ~/.claude/skills/. skillkit's adopt gstack command consolidates them:
skillkit adopt gstack # dry run — review the list
skillkit adopt gstack --yes # approved — move scattered dirs to Trash
It detects scattered gstack skill directories by name match and moves them to macOS Trash (reversible).
Why It Works — Token Economics and Context Discipline
Every skill you load adds tokens to your prompt. With gstack's ~80 skills, that's easily 5,000-10,000 tokens of prefix you're paying for in every session, even when you're working on something completely unrelated.
skillkit's per-project approach means Claude only loads the skills relevant to your current codebase. For a web app project, you might load 5-10 skills instead of 80. That's a 90% reduction in skill-related prompt overhead.
More importantly, it reduces ambiguity. When Claude has fewer (but more relevant) instructions, it's less likely to apply patterns from a Python skill to your TypeScript project.
Try It Now
- Clone skillkit and install it
- Create a
sources.tomlpointing to your existing skills directory and any gstack install - In one of your projects, create a
skills.tomlwith just 2-3 skills you actually use there - Run
skillkit syncand start a Claude Code session in that project - Compare the response quality and relevance vs. your global setup
# Quick start in your project
cd ~/ai/skillkit
uv tool install --editable .
cd /path/to/your/project
skillkit add mine:qa
skillkit add gstack:review
The Bottom Line
skillkit is the answer to the question every Claude Code power user eventually asks: "Why is my Claude loading skills for projects I haven't touched in months?" It's a simple, declarative, git-friendly approach to skill management that respects your context window and your sanity.
Source: github.com
[Updated 04 Jun via devto_claudecode]
The cost isn't theoretical. Developer kenimo49 measured a 7-hour Claude Code session with 5 skills loaded and found that 3 skills never fired yet accounted for 11% of the total token bill — roughly 231K tokens of description overhead that yielded zero value [per dev.to]. Even with prompt caching, each turn re-bills the skill descriptions. That 11% figure is a concrete floor for the waste skillkit eliminates: a project with 5 focused skills instead of 80 could cut dormant-skill overhead from ~11% to near zero.









