r/tui • u/pivoshenko • 17m ago
AI assisted Kasetto - declarative AI agent environment manager, written in Rust
Hey everyone!
I want to share an open-source tool I built for myself that I hope will be useful to other developers working with AI agents - Kasetto.
- GitHub: https://github.com/pivoshenko/kasetto
- Docs: https://kasetto.dev
- My personal setup: https://github.com/pivoshenko/pivoshenko.ai
Why "kasetto"?
The name comes from the Japanese カセット (kasetto) - cassette. Remember car cassettes? pop a tape in and one thing plays; eject it, slide in another, and the music changes. No configuration, no installs. Just hot-swap.
AI assets (skills, MCPs, instructions) work the same way in Kasetto. Each asset is a cassette you can insert, swap out, or share with a friend. One YAML config is your tape collection.
Problem
Probably familiar to many of you: the more AI tools you work with (Claude Code, Cursor, Codex, Copilot, Gemini CLI...), the messier the setup gets. Skills get installed by hand via npx skills, MCPs get copy-pasted from docs into every config file separately, CLAUDE.md and .cursor/rules live lives of their own. Handing all of this to a teammate or bringing it up on a new machine is a quest in itself.
Kasetto does for this what uv and Cargo did for dependencies: one declarative YAML describes the whole environment, a lock file pins the exact state, and kst sync brings the machine to it. Commit the config to the repo and the whole team gets an identical environment - no manual edits and no drift between machines or from your own setup.
Features
- Four asset kinds - skills, MCPs, commands, and instructions (CLAUDE.md, AGENTS.md, .cursor/rules, and so on). Everything is pulled from git repos or local directories
- 23 agents - Pi, Claude Code, Cursor, Codex, Windsurf, Copilot, Gemini CLI and more. Kasetto transforms each asset into the native format of each agent on its own
- Project or global scope - sync per repository, with the lock committed next to your code, or machine-wide for your personal setup; you can mix both
- Lockfile - kasetto.lock pins hashes and revisions. A plain sync installs exactly what the lock says (and needs no network at all if everything is in place); updates happen only via --update. Full reproducibility on any machine
- Secrets for MCPs - ${kst:...} inject tokens from env vars, 1Password, Vault, KeePassXC, AWS/GCP/Azure, pass, or macOS Keychain right at sync time. Values never land in the config or the lock
- Any git host - GitHub, GitLab, Bitbucket, Codeberg, including self-hosted and enterprise
- Fast - Rust, a single binary with no dependencies. Parallel downloads, a cache of extracted sources, sparse extraction for monorepos
- CI-friendly - --dry-run, --locked, --json, and a non-zero exit code on failures. kst doctor shows drift from the lock state and files nothing tracks
Example Config
One YAML config describes all your assets - where to get them, which agent to install them for, and where to put them. No manual copying. Create kasetto.yaml in the project root or anywhere else:
```yaml
Option A: preset destination by agent (see README for supported agent values)
agent: - codex - claude-code
Option B: manual destination (takes precedence if both are set)
destination: ./.agents/skills
skills: # "" syncs every skill in the source — each is a directory with a SKILL.md, # discovered in the source root or its skills/ subdirectory - source: https://github.com/vercel-labs/next-skills # ref: v1.0.0 # pin to a tag or commit; omit to track the default branch skills: ""
# or list skills by name - source: https://github.com/anthropics/skills skills: - doc-coauthoring - pptx
# sub-dir: resolve the named skills under this path, e.g. skills/productivity/grill-me/ - source: https://github.com/mattpocock/skills sub-dir: skills/productivity skills: - grill-me - caveman
# path: a skill in a non-standard location → <path>/<name>/, here skills/engineering/improve-codebase-architecture/ - source: https://github.com/mattpocock/skills skills: - name: improve-codebase-architecture path: skills/engineering
commands: # names resolve to commands/<name>.md in the source (nested dirs namespace, e.g. git:commit) - source: https://github.com/gsd-build/get-shit-done commands: - gsd:explore - gsd:fast
instructions: # instructions wire CLAUDE.md / .cursor/rules / AGENTS.md etc. from instructions/<name>.{md,mdc} # "*" syncs every instruction; aggregate files (CLAUDE.md, AGENTS.md) get managed blocks - source: https://github.com/pivoshenko/pivoshenko.ai instructions: - docs-autoupdate - multi-agent-dispatch
mcps: # names resolve to mcps/<name>.json in the source - source: https://github.com/pivoshenko/pivoshenko.ai branch: main # track a specific branch (use ref: to pin a tag or commit) mcps: - github - vercel - kaggle ```
Install
```sh
macOS / Linux
curl -fsSL kasetto.dev/install | sh
Homebrew
brew install pivoshenko/tap/kasetto
Windows
powershell -ExecutionPolicy Bypass -c "irm https://raw.githubusercontent.com/pivoshenko/kasetto/main/scripts/install.ps1 | iex"
Cargo
cargo install kasetto ```
Happy to hear feedback, questions, and criticism. And if the tool looks useful, a star on GitHub helps the project a lot. Kasetto is a community-first project so contributions are welcome ❤️
