<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>repoverlay | Blog</title><description>Overlay config files into git repositories without committing them.</description><link>https://repoverlay.tylerbutler.com/</link><language>en</language><item><title>Introducing profiles</title><link>https://repoverlay.tylerbutler.com/blog/introducing-profiles/</link><guid isPermaLink="true">https://repoverlay.tylerbutler.com/blog/introducing-profiles/</guid><description>Profiles compose overlays with AI harness capabilities (instructions and plugins) into one loadable unit you can apply to any repo.

</description><pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;repoverlay 0.17.0 ships &lt;strong&gt;profiles&lt;/strong&gt;, the biggest feature I&apos;ve added since the
project began. A profile bundles overlays with AI harness capabilities
(instruction files and plugins) into a single named unit you apply to a repo.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;why-i-built-them&quot;&gt;Why I built them&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Overlays solve one problem well: they drop config files into a repo without
committing them. But my own setup outgrew plain files. I wanted to say &quot;give me
everything I need to do Rust work with this agent&quot; and have one command place the
overlays, write the agent instructions, and install the skills and MCP servers I
rely on.&lt;/p&gt;
&lt;p&gt;A profile captures that intent. An overlay describes files to place. A profile
describes a working environment: a recipe that references overlays as
ingredients and layers harness capabilities on top.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-they-work&quot;&gt;How they work&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;You define marketplaces and profiles in your repoverlay CCL config, alongside &lt;code dir=&quot;auto&quot;&gt;sources&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;marketplaces =&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;name = playground&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;url = obra/claude-plugins&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;profiles =&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;rust-dev =&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;description = Rust development profile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;overlays =&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;= rust-base&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;= rust-tools&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;instructions =&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;content =&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Be concise in all responses.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;plugins =&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;= playground/rust-dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Then you apply it to a specific agent harness. Apply it persistently:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;repoverlay&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apply&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rust-dev&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--harness&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;copilot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Or apply it only for the lifetime of an agent session, with automatic cleanup:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;repoverlay&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;copilot&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rust-dev&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Profiles carry capabilities through &lt;strong&gt;plugins&lt;/strong&gt;, the same Claude-style plugin
format the Claude Code ecosystem uses. A plugin ships skills, agents, and MCP
servers. When you apply a profile, repoverlay decomposes managed/cacheable
plugins and places their parts using each harness&apos;s own paths: skills land under
&lt;code dir=&quot;auto&quot;&gt;.agents/skills/&lt;/code&gt; for Copilot and &lt;code dir=&quot;auto&quot;&gt;.claude/skills/&lt;/code&gt; for Claude, and MCP servers
merge into &lt;code dir=&quot;auto&quot;&gt;.mcp.json&lt;/code&gt;. Delegate or non-cacheable plugins are Claude-delegated
and Copilot-skipped with a warning.&lt;/p&gt;
&lt;p&gt;Profile capabilities are applied to the target repo, not installed globally for
the user or machine. New repo-local files are git-excluded when possible, but
profiles can also update existing repo files through managed regions or JSON
merges, and repoverlay keeps cache and recovery snapshots outside the repo.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;current-limitations&quot;&gt;Current limitations&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Profiles are new. These limits stand today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Two harnesses.&lt;/strong&gt; Profiles target GitHub Copilot and Claude Code. No other
agent is supported yet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delegate install is Claude-only.&lt;/strong&gt; The &lt;code dir=&quot;auto&quot;&gt;delegate&lt;/code&gt; install mode, which records
a plugin in the harness&apos;s own enablement config, currently means something only
for Claude. Copilot skips delegate plugins with a warning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repo scope only.&lt;/strong&gt; A profile touches just the repo you apply it to. There is
no user- or machine-global profile install, so capabilities you want everywhere
need a profile applied per repo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One mode at a time per profile.&lt;/strong&gt; A profile already applied persistently
cannot also run as an ephemeral session, and vice versa. A lock file guards
against concurrent ephemeral sessions and recovers automatically if a previous
session was killed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interrupted cleanup needs a manual step.&lt;/strong&gt; If an ephemeral session is
interrupted and cleanup fails, repoverlay reports the error and leaves enough
state behind for you to finish with &lt;code dir=&quot;auto&quot;&gt;repoverlay profile remove&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;try-them&quot;&gt;Try them&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://repoverlay.tylerbutler.com/guides/profiles/&quot;&gt;profiles guide&lt;/a&gt; covers defining, inspecting, applying, and
removing profiles in full, including marketplaces, managed versus delegate
plugins, and how each harness maps capabilities. Give it a read, and tell me what
you build.&lt;/p&gt;</content:encoded><category>release</category><category>profiles</category></item></channel></rss>