Claude skills as shell scripts with clean, beautiful output. :chefkiss:
# Runs .claude/skills/<skill-bame> as a command
skillet skill-name
# See all the files, commands, and output.
skillet skill-name --verbose
# Run a remote skill (e.g. the test skill from this repo)
skillet https://raw.githubusercontent.com/martinemde/skillet/refs/heads/main/.claude/skills/test-skill/SKILL.mdSkillet makes claude scripting simple and beautiful.
I've made many throw-away headless claude scripts. None of them ever work on the first try. They always suck. There's an ugly prompt buried in the middle. It uses the wrong CLI flags, wrong permissions, or just skips permissions entirely. When you get it to run, your feedback is either nothing or an unreadable flood of json.
Skills solve many of these problems by setting allowed tools, model, and more in the frontmatter. Skillet reads and parses skills directly, just like claude. Allowed tools, model, and other frontmatter gets fed to claude with the correct permissions for the skill.
Instead of the unpleasant or absent output, Skillet uses Charm to glam up the markdown hidden in claude's json streams and history logs. Skillet formats claude output beautifully, showing code, commands, and even errors in a sleek minimal interface with controllable verbosity.
brew install martinemde/tap/skilletOr download a pre-built release.
If you run a skill in claude: /review this commit
You can run it as a shell script: skillet review "this commit"
# See which skills and commands you can run
skillet --list
# By skill name (looks in all .claude/skills/<skill-name>/SKILL.md paths)
skillet skill-or-command-name
# Run a remote URL
skillet https://raw.githubusercontent.com/user/repo/main/skill.md[!NOTICE] Skills are a security risk. Skills can execute commands, exfiltrate data, and modify files. Only use skills from sources you trust.
Commands are deprecated. Easily convert your existing commands to skills with Skillet:
# Non-destructive (you'll need to clean up the old commands yourself)
skillet command --convert-to-skill- Review past Claude sessions
- Browse conversation history logs in
~/.claude/projects/ - Pipe live Claude output through Skillet's formatter
# Format a saved JSONL file
skillet --parse conversation.jsonl
# Pipe directly from Claude Code
claude -p "explain this code" --verbose --output-format stream-json | skillet --parse
# Read from stdin
cat session.jsonl | skillet --parseWith fzf we can make a simple history browser.
Claude stores conversation logs in ~/.claude/projects/.
# Browse history for current project with live preview
find ~/.claude/projects/$(pwd | tr '/' '-') -name '*.jsonl' | \
fzf --preview 'go run ./cmd/skillet --parse {} --verbose --color=always'You can brew install fzf if you don't already have it.
Start a skill with a pre-existing task list. This is useful when one agent creates tasks for another to complete.
# Run a skill with a specific task list
skillet --task-list=f766aec0-6085-46cb-9810-320278fd08a2 my-skill
# The task list ID is passed via CLAUDE_CODE_TASK_LIST_ID environment variable
# Claude will pick up and work on tasks from that listThis enables workflows where a planning agent creates a task list, then skillet runs a specialized skill to complete those tasks autonomously.
You can use skillet in a bash for loop to run many times in parallal:
for file in transcripts/*.txt; do
skillet summarize-transcript "summarize $file and output to meetings/${file%.txt}.md" &
doneNerd shit (I love you nerds. Let's fry up some eggs or break some shells)
Make contributions:
- All tests pass:
go test ./... - Code follows Go conventions:
go fmt ./... - New features include tests
- Documentation is updated
- Make concise changes
- Make a second and third pass to ensure your change is focused and clean
- Test it manually to make sure it looks good (with human eyes)
- Go 1.21 or later
- Claude CLI installed and configured
See LICENSE file for details.