<p align="center">
<img alt="Kasetto logo" src="assets/logo.svg" width="450" />
</p>
<p align="center">
<a href="https://github.com/pivoshenko/kasetto/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/pivoshenko/kasetto/ci.yml?style=flat-square&logo=github&logoColor=white&label=CI&color=0A6847"></a>
<img alt="Rust" src="https://img.shields.io/badge/Rust-Stable-0A6847?style=flat-square&logo=rust&logoColor=white">
<a href="https://github.com/pivoshenko/kasetto/releases"><img alt="Release" src="https://img.shields.io/github/v/release/pivoshenko/kasetto?style=flat-square&logo=github&logoColor=white&color=4856CD&label=Release"></a>
<a href="https://github.com/pivoshenko/kasetto/blob/main/LICENSE-MIT"><img alt="License" src="https://img.shields.io/badge/License-MIT%20%7C%20Apache--2.0-0A6847?style=flat-square&logo=opensourceinitiative&logoColor=white"></a>
<a href="https://stand-with-ukraine.pp.ua"><img alt="Stand with Ukraine" src="https://img.shields.io/badge/Stand_With-Ukraine-FFD700?style=flat-square&labelColor=0057B7"></a>
</p>
<p align="center">
An extremely fast AI skills manager, written in Rust.
</p>
Name comes from the Japanese word **カセット** (*kasetto*) - cassette. Think of skill sources as cassettes you plug in, swap out, and share across machines.
## Highlights
- **Declarative** - one YAML config describes your entire skill setup. Version it, share it, bootstrap a whole team in seconds.
- Syncs skills from **GitHub repos** or **local directories** into any agent environment.
- **35+ built-in agent presets**: Claude Code, Cursor, Codex, Windsurf, Copilot, Gemini CLI, and [many more](#supported-agents).
- Tracks every install in a local SQLite manifest - knows what changed and why.
- `--dry-run`, `--json`, and `--verbose` flags for scripting and CI.
- Ships as a single binary - install as `kasetto`, run as `kst`.
## Why Kasetto
There are good tools in this space already - [Vercel Skills](https://github.com/vercel-labs/skills) installs skills from a curated catalog, and [Claude Plugins](https://claude.com/plugins) offer runtime integrations. Both work well for one-off installs, but neither gives you a declarative, version-controlled config.
Kasetto is a **community-first** project that solves a different problem: **declarative, reproducible skill management across machines and agents.**
- **Team consistency** - commit a YAML file, everyone gets the same skills.
- **Multi-source** - pull from multiple GitHub repos and local folders in one config.
- **Agent-agnostic** - one config field switches between 35+ agent environments.
- **Traceable** - every install is tracked, diffable, and inspectable.
- **CI-friendly** - `--json` output and non-zero exit codes for automation.
> Inspired by [uv](https://github.com/astral-sh/uv) - what uv did for Python packages, Kasetto aims to do for AI skills.
## Install
### Standalone installer
**macOS and Linux:**
```bash
**Windows:**
```powershell
By default the binary is placed in `~/.local/bin`. You can override this with environment variables:
| `KASETTO_VERSION` | Version tag to install | Latest release |
| `KASETTO_INSTALL_DIR` | Installation directory | `~/.local/bin` (Unix) / `%USERPROFILE%\.local\bin` (Windows) |
### Homebrew
```bash
brew install pivoshenko/tap/kasetto
```
### Cargo
```bash
cargo install kasetto
```
### From source
```bash
git clone https://github.com/pivoshenko/kasetto && cd kasetto
cargo install --path .
```
## Getting started
**1. Sync from a shared config or a local file:**
```bash
# from a remote URL (great for teams)
kst sync --config https://example.com/team-skills.yaml
# from a local file
kst sync --config skills.config.yaml
```
That's it. Kasetto reads the config, pulls the skills, and installs them into the right agent directory. Next time you run `sync`, only changed skills are updated.
**2. Explore what's installed:**
```bash
kst list # interactive browser with vim-style navigation
kst doctor # version, paths, last sync status
```
## Commands
### `kst sync`
Reads the config, discovers skills, and makes the local destination match.
```bash
kst sync [--config <path-or-url>] [--dry-run] [--quiet] [--json] [--plain] [--verbose]
```
| `--config` | Path or HTTPS URL to a YAML config (default: `skills.config.yaml`) |
| `--dry-run` | Preview what would change without writing anything |
| `--quiet` | Suppress non-error output |
| `--json` | Print the sync report as JSON |
| `--plain` | Disable colors and spinner animations |
| `--verbose` | Show per-skill action details |
Missing skills are reported as broken but don't stop the run. The exit code is non-zero only for source-level failures.
### `kst list`
Shows everything currently tracked in the manifest.
```bash
kst list [--json]
```
In a terminal it opens an interactive browser - navigate with `j`/`k`, scroll with `PgUp`/`PgDn`, jump with `gg`/`G`. Set `NO_TUI=1` or pipe the output to get plain text instead.
### `kst doctor`
Prints local diagnostics: version, manifest DB path, installation paths, last sync time, and any failed skills from the latest run.
```bash
kst doctor [--json]
```
### `kst self-update`
Checks GitHub for the latest release and replaces the current binary in-place.
```bash
kst self-update [--json]
```
## Configuration
Pass a config via `--config` or let Kasetto pick up `skills.config.yaml` in the current directory.
```yaml
# Choose an agent preset...
agent: codex
# ...or set an explicit path (overrides agent)
# destination: ./my-skills
skills:
# Pull specific skills from a GitHub repo
- source: https://github.com/org/skill-pack
branch: main
skills:
- code-reviewer
- name: design-system
# Sync everything from a local folder
- source: ~/Development/my-skills
skills: "*"
# Override the subdirectory inside a repo
- source: https://github.com/acme/monorepo
skills:
- name: custom-skill
path: tools/skills
```
| Key | Required | Description |
| ----------------- | -------- | ------------------------------------------------------------------- |
| `agent` | no | One of the [supported agent presets](#supported-agents) |
| `destination` | no | Explicit install path - overrides `agent` if both are set |
| `skills` | **yes** | List of skill sources |
| `skills[].source` | **yes** | GitHub URL or local path |
| `skills[].branch` | no | Branch for remote sources (default: `main`, falls back to `master`) |
| `skills[].skills` | **yes** | `"*"` for all, or a list of names / `{ name, path }` objects |
## Supported agents
Set the `agent` field and Kasetto handles the rest.
<details>
<summary>Full list of 35+ supported agents</summary>
<br />
| Agent | Config value | Install path |
| -------------- | ---------------- | ------------------------------- |
| AdaL | `adal` | `~/.adal/skills/` |
| Amp | `amp` | `~/.config/agents/skills/` |
| Antigravity | `antigravity` | `~/.gemini/antigravity/skills/` |
| Augment | `augment` | `~/.augment/skills/` |
| Claude Code | `claude-code` | `~/.claude/skills/` |
| Cline | `cline` | `~/.agents/skills/` |
| CodeBuddy | `codebuddy` | `~/.codebuddy/skills/` |
| Codex | `codex` | `~/.codex/skills/` |
| Command Code | `command-code` | `~/.commandcode/skills/` |
| Continue | `continue` | `~/.continue/skills/` |
| Cortex Code | `cortex` | `~/.snowflake/cortex/skills/` |
| Crush | `crush` | `~/.config/crush/skills/` |
| Cursor | `cursor` | `~/.cursor/skills/` |
| Deep Agents | `deepagents` | `~/.deepagents/agent/skills/` |
| Droid | `droid` | `~/.factory/skills/` |
| Gemini CLI | `gemini-cli` | `~/.gemini/skills/` |
| GitHub Copilot | `github-copilot` | `~/.copilot/skills/` |
| Goose | `goose` | `~/.config/goose/skills/` |
| iFlow CLI | `iflow-cli` | `~/.iflow/skills/` |
| Junie | `junie` | `~/.junie/skills/` |
| Kilo Code | `kilo` | `~/.kilocode/skills/` |
| Kimi Code CLI | `kimi-cli` | `~/.config/agents/skills/` |
| Kiro CLI | `kiro-cli` | `~/.kiro/skills/` |
| Kode | `kode` | `~/.kode/skills/` |
| MCPJam | `mcpjam` | `~/.mcpjam/skills/` |
| Mistral Vibe | `mistral-vibe` | `~/.vibe/skills/` |
| Mux | `mux` | `~/.mux/skills/` |
| Neovate | `neovate` | `~/.neovate/skills/` |
| OpenClaw | `openclaw` | `~/.openclaw/skills/` |
| OpenCode | `opencode` | `~/.config/opencode/skills/` |
| OpenHands | `openhands` | `~/.openhands/skills/` |
| Pi | `pi` | `~/.pi/agent/skills/` |
| Pochi | `pochi` | `~/.pochi/skills/` |
| Qoder | `qoder` | `~/.qoder/skills/` |
| Qwen Code | `qwen-code` | `~/.qwen/skills/` |
| Replit | `replit` | `~/.config/agents/skills/` |
| Roo Code | `roo` | `~/.roo/skills/` |
| Trae | `trae` | `~/.trae/skills/` |
| Trae CN | `trae-cn` | `~/.trae-cn/skills/` |
| Universal | `universal` | `~/.config/agents/skills/` |
| Warp | `warp` | `~/.agents/skills/` |
| Windsurf | `windsurf` | `~/.codeium/windsurf/skills/` |
| Zencoder | `zencoder` | `~/.zencoder/skills/` |
`claude` is accepted as a legacy alias for `claude-code`.
</details>
Need an agent that isn't listed? Use the `destination` field to point at any path.
## Roadmap
- MCP servers management
- Agents management
- Hooks management
- Your idea? [Open an issue](https://github.com/pivoshenko/kasetto/issues)
## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
## License
Licensed under either [MIT](LICENSE-MIT) or [Apache-2.0](LICENSE-APACHE), at your option.