<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Volodymyr Pivoshenko</title>
    <description>The latest articles on DEV Community by Volodymyr Pivoshenko (@pivoshenko).</description>
    <link>https://dev.to/pivoshenko</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3866547%2F6e6bf5dd-ec56-494d-8d5e-9d128db7878f.jpeg</url>
      <title>DEV Community: Volodymyr Pivoshenko</title>
      <link>https://dev.to/pivoshenko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pivoshenko"/>
    <language>en</language>
    <item>
      <title>kasetto - declarative AI agent environment manager, written in Rust</title>
      <dc:creator>Volodymyr Pivoshenko</dc:creator>
      <pubDate>Sat, 11 Apr 2026 11:30:40 +0000</pubDate>
      <link>https://dev.to/pivoshenko/kasetto-declarative-ai-agent-environment-manager-written-in-rust-34kf</link>
      <guid>https://dev.to/pivoshenko/kasetto-declarative-ai-agent-environment-manager-written-in-rust-34kf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk486j1c03jfik7tebgm2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk486j1c03jfik7tebgm2.png" alt=" " width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kasetto.dev" rel="noopener noreferrer"&gt;https://www.kasetto.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/pivoshenko/kasetto" rel="noopener noreferrer"&gt;https://github.com/pivoshenko/kasetto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hey DEV community! 👋&lt;/p&gt;

&lt;p&gt;I want to share an open-source tool I built for myself, and that I hope will be useful to other developers working with AI agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;The more AI coding tools we adopted, the messier our setup got. Skills and MCP servers installed manually, via individual commands, or copy-pasted from docs. Scattered across Claude Code, Cursor, Codex, Windsurf - with no way to version any of it, no way to share it with teammates, no way to reproduce it on a new machine or project.&lt;/p&gt;

&lt;p&gt;Every new team member meant walking them through the same manual steps. Every new machine meant doing it all over again. And if someone changed a skill or added an MCP server, there was no way to propagate that to the rest of the team.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://github.com/pivoshenko/kasetto" rel="noopener noreferrer"&gt;kasetto&lt;/a&gt; to fix that. The idea is borrowed from things I already loved - the declarative reproducibility of dotfiles, the simplicity of &lt;a href="https://github.com/astral-sh/uv" rel="noopener noreferrer"&gt;uv&lt;/a&gt; for Python packages. What uv did for Python, kasetto aims to do for AI agent skills.&lt;/p&gt;

&lt;p&gt;One YAML config describes your entire setup: skills, MCP servers, target agents. Commit it, share it, and everyone on the team gets the exact same environment. No manual editing, no drift between machines or teammates. New machine? One command.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Name
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Kasetto&lt;/em&gt; (カセット) is the Japanese word for cassette - as in a cassette tape. A cassette was a self-contained, portable thing: you recorded something once, handed it to someone, and it played back exactly the same on any device. No setup, no drift, no "works on my machine." That's exactly what kasetto does for your AI agent environment - package it once, share it, and it reproduces identically everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why kasetto
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Declarative&lt;/strong&gt; - one YAML config, version it, share it, bootstrap a whole team in seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-agent&lt;/strong&gt; - 21 built-in presets: Claude Code, Cursor, Codex, Windsurf, Copilot, Gemini CLI, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-source&lt;/strong&gt; - pulls from GitHub, GitLab, Bitbucket, Codeberg including self-hosted and enterprise&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP management&lt;/strong&gt; - merges MCP servers into each agent's native settings file automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global and project scopes&lt;/strong&gt; - install skills globally or per-project, each with its own lockfile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI-friendly&lt;/strong&gt; - &lt;code&gt;--dry-run&lt;/code&gt; to preview, &lt;code&gt;--json&lt;/code&gt; for automation, non-zero exit on failure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single binary&lt;/strong&gt; - no runtime dependencies, written in Rust, fast cold starts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Define your config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;claude-code&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;cursor&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;codex&lt;/span&gt;

&lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/org/skill-pack&lt;/span&gt;
    &lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/org/skill-pack-2&lt;/span&gt;
    &lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;product-design&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/org/skill-pack-3&lt;/span&gt;
    &lt;span class="na"&gt;skills&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jupyter-notebook&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;skills/.curated&lt;/span&gt;

&lt;span class="na"&gt;mcps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/org/mcp-pack&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then sync:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kst &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Kasetto pulls the skills and MCP servers, installs them into the right agent directories, and merges MCP configs into each agent's native settings file. The next time you run &lt;code&gt;sync&lt;/code&gt;, only what changed gets updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Command Overview
&lt;/h2&gt;

&lt;p&gt;Kasetto ships with a focused set of commands - each does exactly one thing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kst &lt;span class="nb"&gt;sync&lt;/span&gt;              &lt;span class="c"&gt;# pull skills + MCP servers and install them&lt;/span&gt;
kst &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt;    &lt;span class="c"&gt;# preview what would change without touching anything&lt;/span&gt;
kst &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;       &lt;span class="c"&gt;# structured output for CI pipelines&lt;/span&gt;

kst list              &lt;span class="c"&gt;# browse installed skills interactively&lt;/span&gt;
kst list &lt;span class="nt"&gt;--json&lt;/span&gt;       &lt;span class="c"&gt;# dump installed state as JSON&lt;/span&gt;

kst init              &lt;span class="c"&gt;# scaffold a kasetto.yaml in the current directory&lt;/span&gt;
kst doctor            &lt;span class="c"&gt;# check your environment and diagnose issues&lt;/span&gt;

kst clean             &lt;span class="c"&gt;# remove all installed skills and MCP entries&lt;/span&gt;
kst self update       &lt;span class="c"&gt;# update kasetto to the latest release&lt;/span&gt;
kst self uninstall    &lt;span class="c"&gt;# remove kasetto and all its files&lt;/span&gt;
kst completions       &lt;span class="c"&gt;# generate shell completions (bash, zsh, fish, etc.)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The binary is available as both &lt;code&gt;kasetto&lt;/code&gt; and &lt;code&gt;kst&lt;/code&gt; - the short alias makes daily use quick.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS / Linux&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/pivoshenko/kasetto/main/scripts/install.sh | sh

&lt;span class="c"&gt;# Homebrew&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;pivoshenko/tap/kasetto

&lt;span class="c"&gt;# Cargo&lt;/span&gt;
cargo &lt;span class="nb"&gt;install &lt;/span&gt;kasetto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/pivoshenko/kasetto#roadmap" rel="noopener noreferrer"&gt;roadmap&lt;/a&gt; includes agents management and hooks management. If you have ideas or run into issues, &lt;a href="https://github.com/pivoshenko/kasetto/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt; - feedback from real users shapes the direction.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://github.com/pivoshenko/kasetto" rel="noopener noreferrer"&gt;github.com/pivoshenko/kasetto&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If kasetto saves you time, a GitHub star means a lot. And drop a comment below - I'd love to hear what your AI agent setup looks like today, and what pain points you're still hitting.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>cursor</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
