Skip to content
Guide

Which Claude Code skills are you actually using?

Nothing on disk tells you. A skill folder looks identical whether it fired a hundred times or never. The one record that exists is the session transcripts in ~/.claude/projects (one .jsonl file per session, grouped in a folder per project), where every skill Claude invoked appears as a tool call. Count those and you have the answer; skip them and you are guessing. The rest of this page shows the manual way and where it gives out.

Where the record of what you used lives

~/.claude/projects/
One folder per project you have worked in. The folder name is the project path with the slashes replaced by dashes, which is why it looks unreadable.
~/.claude/projects/<project>/<session-id>.jsonl
One session, one line per event. Every tool call Claude made is in here, including the one that loads a skill.
~/.claude/skills/
The skills themselves. Useful for knowing what exists, useless for knowing what runs: nothing here changes when a skill fires.

The two halves never meet on their own. The skills folder is the inventory, the transcripts are the history, and no command joins them. That gap is the whole reason this question is hard to answer.

Counting skill invocations from the terminal

A skill invocation is a tool call named Skill, and the name of the skill is in that call. Because each line of a .jsonl file is one JSON object, you can pull the names out and count them. This is the honest version: it works, and you should know exactly how much to trust it.

grep -ho '"skill":"[^"]*"' ~/.claude/projects/*/*.jsonl \
  | sort | uniq -c | sort -rn

# and the other side of the ledger, what is installed:
ls ~/.claude/skills
Every skill invoked, most used first, across all projects.

Anything in the second list that is missing from the first has never been invoked in a session you still have on disk. That is the shortlist worth looking at.

Why grep is the wrong tool for this in the long run

It gets you a number, and the number is roughly right. But every assumption behind it is one you are making silently, and each one can be wrong without the count looking wrong.

  • Transcripts are a log, not an archive. Delete a project folder, clear old sessions, work on a different machine, and the history that proves a skill is useful is gone with it.
  • The transcript format is internal. It is not a documented API, so a field name that matches today can stop matching after an update, and the failure is a quiet zero, not an error.
  • A raw match counts appearances, not successful runs, and it does not separate you invoking a skill by name from Claude choosing it on its own. Those are very different signals about whether the description is doing its job.
  • Counts alone do not date anything. A skill used heavily last year and untouched since looks the same as one you used this morning.
  • Project skills and plugin skills are invoked the same way as personal ones, so the names in the count do not map cleanly back to a single folder you can go and delete.

Deleting the ones you never use

Claude Code ships a /checkup command that reviews your setup and offers to remove skills it finds unused. It is the fastest route, and it is the right first move, but it decides for you, and what it removes is gone from the folder, so it pays to know which skills you expect to be on that list before you run it.

The safe manual version is to move rather than delete. A skill only loads from ~/.claude/skills, .claude/skills in a project, or a plugin, so moving the folder somewhere else takes it out of play while keeping it recoverable if you were wrong.

mkdir -p ~/.claude/skills-retired
mv ~/.claude/skills/some-skill ~/.claude/skills-retired/

# put it back if you miss it:
mv ~/.claude/skills-retired/some-skill ~/.claude/skills/
Retire a skill without losing it.

A skill that never fires is not always a bad skill. Often the description is the problem: it is the text Claude matches against, so a vague one keeps a useful skill permanently invisible. Rewriting that line is worth trying before deleting anything.

Questions

How do I see which Claude Code skills I actually use?
Count the skill invocations in your session transcripts. They live in ~/.claude/projects as one .jsonl file per session, and each skill Claude loaded appears there as a tool call carrying the skill name. There is no built-in command that prints the tally, so it is grep and uniq -c, or a tool that reads the transcripts for you.
Is it safe to delete unused Claude Code skills?
Yes, as long as you check the transcripts first and move rather than delete. A skill is just a folder, so moving it out of ~/.claude/skills unloads it and you can put it back. Be careful with project skills, which are committed to a repository and may be unused by you but used by everyone else on the team.
What does /checkup do to my skills?
It reviews your Claude Code setup and offers to remove skills it considers unused. It is a genuine cleanup, not a report you can sit on, so look at your own usage counts first, especially for skills you installed recently and have not had a reason to trigger yet.

Loadout shows all of this in one list, with usage counts

A free Mac app that reads the same folders this guide describes: every skill, subagent, slash command, plugin and MCP server, and how often each one actually fires. Nothing leaves your machine.