<?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: Timur Lolaev</title>
    <description>The latest articles on DEV Community by Timur Lolaev (@bodasooqa).</description>
    <link>https://dev.to/bodasooqa</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3941997%2F09dfacd0-486b-4f4b-a340-954a01a9752b.JPG</url>
      <title>DEV Community: Timur Lolaev</title>
      <link>https://dev.to/bodasooqa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bodasooqa"/>
    <language>en</language>
    <item>
      <title>I wanted Copier in Rust, so I wrote rootstock</title>
      <dc:creator>Timur Lolaev</dc:creator>
      <pubDate>Sun, 01 Nov 2026 01:58:52 +0000</pubDate>
      <link>https://dev.to/bodasooqa/i-wanted-copier-in-rust-so-i-wrote-rootstock-hcj</link>
      <guid>https://dev.to/bodasooqa/i-wanted-copier-in-rust-so-i-wrote-rootstock-hcj</guid>
      <description>&lt;p&gt;I write Rust for a living, and over the last couple of years the tools around me quietly turned into Rust too. On the frontend, Biome does what ESLint and Prettier used to. In Python land it's Ruff and uv. They're fast, they ship as one binary, and there's nothing to set up besides the binary itself.&lt;/p&gt;

&lt;p&gt;Project templates were the exception. The best tool I know for them is Copier, and it's genuinely good. But it's Python, so every machine and every CI job that touches a template needs Python and pipx first. I wanted the same thing as one binary. That's rootstock.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a project is the easy part
&lt;/h2&gt;

&lt;p&gt;Plenty of tools can create a project from a template: cargo-generate, kickstart, cookiecutter. They render the files and that's it. From then on the project and the template live separate lives.&lt;/p&gt;

&lt;p&gt;That's fine for a one-off. It hurts when the template keeps changing. Think shared CI workflows, lint configs, a service skeleton your team uses everywhere. Someone fixes the CI in the template, and now there are twenty projects with the old version, each with its own local edits. Copying the fix by hand gets old fast.&lt;/p&gt;

&lt;p&gt;Copier's answer is to remember how the project was made and replay the template's changes on top of it. rootstock does the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an update looks like
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;rootstock new&lt;/code&gt; renders the template and writes a small record, &lt;code&gt;.rootstock.toml&lt;/code&gt;, next to your files: the template source, the tag and exact commit, your answers, and the list of files it wrote.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rootstock new gh:acme/service-template my-app &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="nv"&gt;project_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my-app &lt;span class="nt"&gt;--defaults&lt;/span&gt;
&lt;span class="go"&gt;created my-app from gh:acme/service-template v1.0.0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Later the template ships v1.1.0. It bumps &lt;code&gt;actions/checkout&lt;/code&gt; in CI and adds &lt;code&gt;--all-targets&lt;/code&gt; to the &lt;code&gt;test&lt;/code&gt; and &lt;code&gt;lint&lt;/code&gt; targets in the Makefile. Meanwhile you've added a &lt;code&gt;fmt&lt;/code&gt; target and made clippy stricter.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;rootstock update
&lt;span class="go"&gt;updated to v1.1.0
markers Makefile
1 conflict
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The CI bump and the new &lt;code&gt;test&lt;/code&gt; line went in on their own. Your &lt;code&gt;fmt&lt;/code&gt; target is still there. The one line you both changed is marked:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;lint&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="err"&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="err"&gt;project&lt;/span&gt;
    &lt;span class="err"&gt;cargo&lt;/span&gt; &lt;span class="err"&gt;clippy&lt;/span&gt; &lt;span class="err"&gt;--&lt;/span&gt; &lt;span class="err"&gt;-D&lt;/span&gt; &lt;span class="err"&gt;warnings&lt;/span&gt;
&lt;span class="err"&gt;=======&lt;/span&gt;
    &lt;span class="err"&gt;cargo&lt;/span&gt; &lt;span class="err"&gt;clippy&lt;/span&gt; &lt;span class="err"&gt;--all-targets&lt;/span&gt;
&lt;span class="err"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;template&lt;/span&gt; &lt;span class="err"&gt;v1.1.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You fix it, run &lt;code&gt;rootstock check&lt;/code&gt;, commit. The update is a plain diff in git, so it's easy to review and easy to throw away.&lt;/p&gt;
&lt;h2&gt;
  
  
  How the merge works
&lt;/h2&gt;

&lt;p&gt;Under the hood rootstock renders the template twice in temp directories: the old version with the answers from the record (the base), and the new version with the current answers (the target). Then it goes path by path and compares base, target and what's in your project.&lt;/p&gt;

&lt;p&gt;If only the template changed a file, you get the template's version. If only you changed it, nothing happens. If both did, the text goes through &lt;code&gt;git merge-file&lt;/code&gt;, which is what Copier uses too. I picked the git CLI over a merge library on purpose: the result matches Copier, the markers look like the ones everyone already knows, and your own git config doesn't leak into it.&lt;/p&gt;

&lt;p&gt;Some cases can't be merged at all, and rootstock doesn't pretend they can. A binary file you edited keeps your copy and gets the template's version next to it as &lt;code&gt;name.rootstock-new&lt;/code&gt;. A file you deleted but the template changed stays deleted and gets reported. Files marked as starter (a README, say) are written once and never touched again.&lt;/p&gt;

&lt;p&gt;Want to change an answer later? &lt;code&gt;rootstock update --data ci=false&lt;/code&gt; renders the base with the old answers and the target with the new ones, even when the version stays the same.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conflicts are an exit code
&lt;/h2&gt;

&lt;p&gt;Every case that needs a human ends with exit code 2 and one line per problem on stdout: &lt;code&gt;markers Makefile&lt;/code&gt;, &lt;code&gt;binary logo.png&lt;/code&gt; and so on. Everything else goes to stderr.&lt;/p&gt;

&lt;p&gt;That makes it easy to automate. My &lt;a href="https://github.com/bodasooqa/harness" rel="noopener noreferrer"&gt;harness&lt;/a&gt; template (agent tooling, hooks and CI for my projects) has a daily workflow in each project that runs &lt;code&gt;rootstock update&lt;/code&gt;, opens a PR and labels it when the exit code is 2. Clean minor and patch updates merge themselves once CI is green. The conflicting ones wait for me.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rootstock check&lt;/code&gt; runs in CI without network access and fails on leftover markers or side files, so a half-resolved conflict can't slip into main.&lt;/p&gt;
&lt;h2&gt;
  
  
  Coming from Copier
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;rootstock import-copier&lt;/code&gt; converts a Copier template, a project generated by Copier, or both if they live in the same directory. It writes nothing unless the whole conversion succeeds. Old template tags don't need converting – &lt;code&gt;update&lt;/code&gt; reads versions that only have &lt;code&gt;copier.yml&lt;/code&gt; and converts them in memory.&lt;/p&gt;

&lt;p&gt;For harness I checked that the converted template renders byte for byte like Copier 9.19 for every combination of its answers. That was my bar for calling the import done.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it doesn't do (yet)
&lt;/h2&gt;

&lt;p&gt;rootstock supports the part of Copier my templates use. &lt;code&gt;_migrations&lt;/code&gt;, Jinja extensions and some question types aren't there, and the import stops with the full list if your template needs them. It's v0.1.0, so expect rough edges.&lt;/p&gt;
&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;rootstock &lt;span class="nt"&gt;--locked&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;There are also prebuilt binaries for Linux (static, musl), macOS and Windows on GitHub Releases. The only thing it needs at runtime is git.&lt;/p&gt;

&lt;p&gt;If you maintain templates and something here doesn't fit how you work, open an issue. I'd like to hear about it.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/bodasooqa" rel="noopener noreferrer"&gt;
        bodasooqa
      &lt;/a&gt; / &lt;a href="https://github.com/bodasooqa/rootstock" rel="noopener noreferrer"&gt;
        rootstock
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Create projects from versioned git templates and update them by three-way merge, without losing the project's edits. A single Rust binary, like Copier.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;

  
  &lt;img alt="rootstock" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fbodasooqa%2Frootstock%2Fmain%2Fassets%2Flogo-light.svg" width="320"&gt;

&lt;p&gt;&lt;strong&gt;Project templates that keep growing after you use them.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Create a project from a versioned git template, then update it to every new template version&lt;br&gt;
with a real three-way merge: your edits stay, the template's improvements arrive, conflicts are never silent.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/bodasooqa/rootstock/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/bodasooqa/rootstock/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://crates.io/crates/rootstock" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cac473997e979651a36d72585ebd14170f8d0b6839aa20b98788d6fcc7e4bbb5/68747470733a2f2f696d672e736869656c64732e696f2f6372617465732f762f726f6f7473746f636b2e737667" alt="crates.io"&gt;&lt;/a&gt;
&lt;a href="https://github.com/bodasooqa/rootstock#license" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8c0cecbaa9c4d44f278f31ccd2459ff9d71c59ff9cfe24345c31de76cd27df7b/68747470733a2f2f696d672e736869656c64732e696f2f6372617465732f6c2f726f6f7473746f636b2e737667" alt="License: MIT OR Apache-2.0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bodasooqa.github.io/rootstock/" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt; · &lt;a href="https://github.com/bodasooqa/rootstock#install" rel="noopener noreferrer"&gt;Install&lt;/a&gt; · &lt;a href="https://github.com/bodasooqa/rootstock#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt; · &lt;a href="https://github.com/bodasooqa/rootstock#how-updates-work" rel="noopener noreferrer"&gt;How updates work&lt;/a&gt; · &lt;a href="https://github.com/bodasooqa/rootstock#commands" rel="noopener noreferrer"&gt;Commands&lt;/a&gt; · &lt;a href="https://github.com/bodasooqa/rootstock#writing-a-template" rel="noopener noreferrer"&gt;Writing a template&lt;/a&gt; · &lt;a href="https://github.com/bodasooqa/rootstock#coming-from-copier" rel="noopener noreferrer"&gt;Coming from Copier&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;




&lt;p&gt;In grafting, the &lt;em&gt;rootstock&lt;/em&gt; is the root system, and the &lt;em&gt;scion&lt;/em&gt; is the branch grafted onto it. The scion grows its own way, and the root keeps feeding it. A rootstock project works the same way. The template is the root and the project is the scion: the project goes its own way, and improvements to the template keep reaching it.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why rootstock&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Most scaffolding tools stop once the project is created. That is fine for a one-off, but not for a template that keeps changing: shared CI, lint…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bodasooqa/rootstock" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>rust</category>
      <category>cli</category>
      <category>opensource</category>
      <category>devops</category>
    </item>
    <item>
      <title>I built nvm-style account manager for Claude Code</title>
      <dc:creator>Timur Lolaev</dc:creator>
      <pubDate>Thu, 21 May 2026 07:00:00 +0000</pubDate>
      <link>https://dev.to/bodasooqa/i-built-nvm-style-account-manager-for-claude-code-47na</link>
      <guid>https://dev.to/bodasooqa/i-built-nvm-style-account-manager-for-claude-code-47na</guid>
      <description>&lt;p&gt;If you use Claude Code with more than one account – personal and work, or one per client – you know the dance. &lt;code&gt;claude&lt;/code&gt; opens, you realize you're under the wrong account, you &lt;code&gt;/logout&lt;/code&gt;, &lt;code&gt;/login&lt;/code&gt;, sit through the OAuth browser flow, then forget which account you're in by the time you switch projects again.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;claudenv&lt;/strong&gt; to make this stop happening.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claudenv use work
claude   &lt;span class="c"&gt;# automatically under your work account&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/clientA
&lt;span class="c"&gt;# auto-switches if you opted in, or:&lt;/span&gt;
claudenv use personal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it. The same &lt;code&gt;claude&lt;/code&gt; binary, just pointed at different config directories via the official &lt;code&gt;CLAUDE_CONFIG_DIR&lt;/code&gt; environment variable. No symlinks, no patching files in place, no daemons.&lt;/p&gt;
&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Claude Code reads its config from &lt;code&gt;~/.claude&lt;/code&gt; by default, but respects &lt;code&gt;CLAUDE_CONFIG_DIR&lt;/code&gt; if set. &lt;code&gt;claudenv&lt;/code&gt; keeps one directory per account under &lt;code&gt;~/.claudenv/accounts/&amp;lt;name&amp;gt;/&lt;/code&gt; and points the env var at the right one. Each account has its own OAuth state, settings, MCP servers, the whole thing.&lt;/p&gt;

&lt;p&gt;There are three layers of state, exactly like &lt;code&gt;nvm&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global default&lt;/strong&gt; – what you set with &lt;code&gt;claudenv use work&lt;/code&gt;, persists across shells&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-project override&lt;/strong&gt; – a &lt;code&gt;.claudenvrc&lt;/code&gt; file in your repo, picked up via walk-up resolution like &lt;code&gt;.nvmrc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shell-session override&lt;/strong&gt; – &lt;code&gt;.claudenvrc&lt;/code&gt; auto-switches on &lt;code&gt;cd&lt;/code&gt; if you enable the hook
Set a default, override per-project, forget about it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Why not just claude-switch or claudectx?
&lt;/h2&gt;

&lt;p&gt;There are other tools in this space – I want to be upfront about that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SaschaHeyer/claude-switch" rel="noopener noreferrer"&gt;&lt;code&gt;claude-switch&lt;/code&gt;&lt;/a&gt; uses the same &lt;code&gt;CLAUDE_CONFIG_DIR&lt;/code&gt; mechanism, but the workflow is per-launch: &lt;code&gt;claude-switch work&lt;/code&gt; runs Claude under that profile, every time you start a session. If you prefer being explicit on every invocation, use it – it's a fine tool.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;claudectx&lt;/code&gt; and a few others go a different route entirely, symlinking or patching &lt;code&gt;~/.claude.json&lt;/code&gt; in place. That works too, but it's stateful in a way I didn't want. If the symlink breaks or a patch fails halfway, you end up in a weird state that's hard to debug.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;claudenv&lt;/code&gt; is for people who switch accounts more than once a day and don't want to type the profile name every time. If your projects are clearly tied to specific accounts, &lt;code&gt;.claudenvrc&lt;/code&gt; + auto-switch means you basically never think about it again.&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;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/bodasooqa/claudenv/main/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or with &lt;code&gt;wget&lt;/code&gt;, or download and inspect first – instructions are in the README.&lt;/p&gt;

&lt;p&gt;Bash or zsh, that's the only requirement. No Node, no Python, no Homebrew, no extra dependencies. Twenty lines into &lt;code&gt;~/.zshrc&lt;/code&gt;, you're done.&lt;/p&gt;
&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;A few things on the roadmap: a &lt;code&gt;claudenv self-update&lt;/code&gt; command, a Homebrew tap once there's a real release cadence, and a wrapper that makes GUI-launched IDEs (Cursor, VS Code from the Dock or Spotlight) pick up the active profile – currently that's a known limitation with &lt;code&gt;launchd&lt;/code&gt; not reading shell rc files, documented in the README.&lt;/p&gt;

&lt;p&gt;If it solves your problem, a star helps me prioritize what to build next. Issues and PRs welcome.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/bodasooqa" rel="noopener noreferrer"&gt;
        bodasooqa
      &lt;/a&gt; / &lt;a href="https://github.com/bodasooqa/claudenv" rel="noopener noreferrer"&gt;
        claudenv
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      nvm-style account manager for Claude Code. Switch profiles via CLAUDE_CONFIG_DIR, with per-project .claudenvrc and auto-switch on cd.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;claudenv&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/bodasooqa/claudenv/actions/workflows/shellcheck.yml" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bab801b170cc2b6688d4c30fb2e3fef9ae9734f9b9650b2019af0e498017a8e1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f626f6461736f6f71612f636c617564656e762f7368656c6c636865636b2e796d6c3f6272616e63683d6d61696e266c6162656c3d7368656c6c636865636b266c6f676f3d676974687562616374696f6e73266c6f676f436f6c6f723d7768697465" alt="ShellCheck"&gt;&lt;/a&gt;
&lt;a href="https://github.com/bodasooqa/claudenv/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7b622f3368be3e0f7f75d7bd7087035a0987dd7208d89f5aa44436a90f6facd1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f626f6461736f6f71612f636c617564656e76" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/fabc47dc27a22a4897c60771aa5a633cb9387fd1d1448dd4f0f4cb6339fb3444/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d61634f532d737570706f727465642d3030303030303f6c6f676f3d6170706c65266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/fabc47dc27a22a4897c60771aa5a633cb9387fd1d1448dd4f0f4cb6339fb3444/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d61634f532d737570706f727465642d3030303030303f6c6f676f3d6170706c65266c6f676f436f6c6f723d7768697465" alt="macOS"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4ab8915a6f4a0fe1beca0d0cb34e8bcea1ce557405db6e171a1af9e030e9e2a0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c696e75782d737570706f727465642d4643433632343f6c6f676f3d6c696e7578266c6f676f436f6c6f723d626c61636b"&gt;&lt;img src="https://camo.githubusercontent.com/4ab8915a6f4a0fe1beca0d0cb34e8bcea1ce557405db6e171a1af9e030e9e2a0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c696e75782d737570706f727465642d4643433632343f6c6f676f3d6c696e7578266c6f676f436f6c6f723d626c61636b" alt="Linux"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An &lt;strong&gt;nvm-style&lt;/strong&gt; account manager for &lt;a href="https://docs.claude.com/en/docs/claude-code" rel="nofollow noopener noreferrer"&gt;Claude Code&lt;/a&gt;. Set a default account, override per-project with &lt;code&gt;.claudenvrc&lt;/code&gt;, optionally auto-switch on &lt;code&gt;cd&lt;/code&gt;. Zero dependencies.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;claudenv import default       &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; save current ~/.claude as 'default' (auto-activated — first profile)&lt;/span&gt;
claudenv add work             &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; create new empty slot&lt;/span&gt;
claudenv use work             &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; switch this shell + set as global default&lt;/span&gt;
claude                        &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; /login here, isolated from 'default'&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;When &lt;code&gt;accounts/&lt;/code&gt; is empty, the first &lt;code&gt;import&lt;/code&gt; or &lt;code&gt;add&lt;/code&gt; auto-activates the new profile so you don't have to follow with &lt;code&gt;claudenv use&lt;/code&gt;. Subsequent ones don't change the active profile.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Is this for you?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Claude Code already supports &lt;code&gt;CLAUDE_CONFIG_DIR&lt;/code&gt; for account isolation. Several tools wrap this — pick the one that fits how you work:&lt;/p&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;claudenv&lt;/th&gt;
&lt;th&gt;&lt;a href="https://github.com/SaschaHeyer/claude-switch" rel="noopener noreferrer"&gt;claude-switch&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mental model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Set a default, work normally&lt;/td&gt;
&lt;td&gt;Specify account on every launch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typical command&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;claude&lt;/code&gt; (after &lt;code&gt;claudenv use work&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;claude-switch work&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Per-project config&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.claudenvrc&lt;/code&gt; (walk-up resolution)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bodasooqa/claudenv" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>claude</category>
      <category>cli</category>
      <category>productivity</category>
      <category>bash</category>
    </item>
  </channel>
</rss>
