{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/steipete-me/2025-06-05-commanding-your-claude-code-army/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "![](https://steipete.me/assets/img/2025/commanding-your-claude-code-army/header.png)\n\n> **Update**: There’s a better solution now! Check out [Command Your Claude Code Army, Reloaded](https://steipete.me/posts/2025/command-your-claude-code-army-reloaded/) for VibeTunnel integration that gives Claude automatic title management.\n\n**TL;DR**: Running multiple Claude Code instances? Here’s a ZSH trick to keep your terminal titles organized and your sanity intact.\n\nI’ll admit it - I’ve become a [Claude Code](https://www.anthropic.com/claude-code) power user. At any given moment, I have at least three instances running: one for writing blog posts, another fixing that “quick” bug that’s now in hour three, and a third doing something I definitely forgot about. My terminal looks like a Claude Code convention.\n\n## The Problem: Too Many Claudes, Not Enough Context\n\n[Ghostty](https://ghostty.org/) (yes, with two T’s - it’s my favorite terminal) only shows the process name in the title. When you have six tabs all saying “claude”, finding the right one becomes a game of terminal roulette.\n\nThis is especially painful when you’re running Claude with the `--dangerously-skip-permissions` flag (yes, I live dangerously - see my post about [Claude Code being my computer](https://steipete.me/posts/2025/claude-code-is-my-computer/)). The last thing you want is to accidentally run the wrong command in the wrong directory with full system permissions.\n\nTo make matters worse, Claude Code has a habit of changing the terminal title to whatever it feels like - usually something unhelpful like “Running command…” or just “claude”. It’s like having a helpful assistant who keeps reorganizing your desk while you’re trying to work.\n\n## The Solution: Terminal Title Magic\n\nHere’s my approach - a clean ZSH setup that keeps terminal management code separate from my main configuration. First, I add one line to my `~/.zshrc`:\n\n```zsh\n# Source Claude wrapper with dynamic terminal title\n[ -f ~/.config/zsh/claude-wrapper.zsh ] && source ~/.config/zsh/claude-wrapper.zsh\n```\n\nThen I create `~/.config/zsh/claude-wrapper.zsh` with the actual implementation:\n\n```zsh\n#!/usr/bin/env zsh\n# Simple, elegant terminal title management for Claude\n\n# Set terminal title\n_set_title() { \n    print -Pn \"\\e]2;$1\\a\" \n}\n\n# Claude wrapper with custom terminal title\ncly() {\n    local folder=${PWD:t}  # Just the current folder name\n    \n    # Set title to show we're running Claude\n    _set_title \"$folder — Claude\"\n    \n    # Start a background process to continuously reset the title\n    # (prevents Claude from changing it)\n    (\n        while true; do\n            _set_title \"$folder — Claude\"\n            sleep 0.5\n        done\n    ) &\n    local title_pid=$!\n    \n    # Run Claude with dangerous permissions\n    \"$HOME/.claude/local/claude\" --dangerously-skip-permissions \"$@\"\n    local exit_code=$?\n    \n    # Kill the background title setter\n    kill $title_pid 2>/dev/null\n    wait $title_pid 2>/dev/null  # Clean up zombie process\n    \n    # Restore normal title\n    _set_title \"%~\"\n    \n    # Return the original exit code\n    return $exit_code\n}\n\n# Update terminal title before each prompt (using proper ZSH hooks)\n_claude_precmd() {\n    _set_title \"%~\"\n}\n\n# Add our precmd function to the array (doesn't overwrite existing hooks)\nif [[ -z ${precmd_functions[(r)_claude_precmd]} ]]; then\n    precmd_functions+=(_claude_precmd)\nfi\n```\n\nWhen I run `cly`, my terminal title changes from `~/Projects/blog` to `~/Projects/blog — Claude`. Revolutionary? No. Life-changing? Absolutely.\n\n> *Hot tip: Just ask Claude to read this blog post and set it up for you! (in yolo mode, of course)*\n\nNow if you’ll excuse me, I need to check on my Claude instances. I think one of them is refactoring my entire codebase without asking. Again.\n",
  "authors": [],
  "captured_at": "2026-09-27T19:29:15.293681927+00:00",
  "category": "programming",
  "content_html": "<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://steipete.me/assets/img/2025/commanding-your-claude-code-army/header.png\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<blockquote>\n<p><strong>Update</strong>: There’s a better solution now! Check out <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://steipete.me/posts/2025/command-your-claude-code-army-reloaded/\">Command Your Claude Code Army, Reloaded</a> for VibeTunnel integration that gives Claude automatic title management.</p>\n</blockquote>\n<p><strong>TL;DR</strong>: Running multiple Claude Code instances? Here’s a ZSH trick to keep your terminal titles organized and your sanity intact.</p>\n<p>I’ll admit it - I’ve become a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.anthropic.com/claude-code\">Claude Code</a> power user. At any given moment, I have at least three instances running: one for writing blog posts, another fixing that “quick” bug that’s now in hour three, and a third doing something I definitely forgot about. My terminal looks like a Claude Code convention.</p>\n<h2>The Problem: Too Many Claudes, Not Enough Context</h2>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ghostty.org/\">Ghostty</a> (yes, with two T’s - it’s my favorite terminal) only shows the process name in the title. When you have six tabs all saying “claude”, finding the right one becomes a game of terminal roulette.</p>\n<p>This is especially painful when you’re running Claude with the <code>--dangerously-skip-permissions</code> flag (yes, I live dangerously - see my post about <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://steipete.me/posts/2025/claude-code-is-my-computer/\">Claude Code being my computer</a>). The last thing you want is to accidentally run the wrong command in the wrong directory with full system permissions.</p>\n<p>To make matters worse, Claude Code has a habit of changing the terminal title to whatever it feels like - usually something unhelpful like “Running command…” or just “claude”. It’s like having a helpful assistant who keeps reorganizing your desk while you’re trying to work.</p>\n<h2>The Solution: Terminal Title Magic</h2>\n<p>Here’s my approach - a clean ZSH setup that keeps terminal management code separate from my main configuration. First, I add one line to my <code>~/.zshrc</code>:</p>\n<pre><code class=\"language-zsh\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Source Claude wrapper with dynamic terminal title</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-support syntax-function syntax-test syntax-begin syntax-shell\">[</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">-</span>f</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-tilde\"><span class=\"syntax-variable syntax-language syntax-tilde syntax-shell\">~</span></span>/.config/zsh/claude-wrapper.zsh <span class=\"syntax-support syntax-function syntax-test syntax-end syntax-shell\">]</span></span> <span class=\"syntax-keyword syntax-operator syntax-logical syntax-and syntax-shell\">&amp;&amp;</span> <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-support syntax-function syntax-source syntax-shell\">source</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-meta syntax-group syntax-expansion syntax-tilde\"><span class=\"syntax-variable syntax-language syntax-tilde syntax-shell\">~</span></span>/.config/zsh/claude-wrapper.zsh</span>\n</span></span></code></pre>\n<p>Then I create <code>~/.config/zsh/claude-wrapper.zsh</code> with the actual implementation:</p>\n<pre><code class=\"language-zsh\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">!/usr/bin/env zsh</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Simple, elegant terminal title management for Claude</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span>\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Set terminal title</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function syntax-shell\"><span class=\"syntax-entity syntax-name syntax-function syntax-shell\">_set_title</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-shell\">(</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-shell\">)</span> <span class=\"syntax-punctuation syntax-section syntax-braces syntax-begin syntax-shell\">{</span> \n    <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">print</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>Pn</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>\\e]2;<span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">1</span></span>\\a<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span> </span>\n<span class=\"syntax-punctuation syntax-section syntax-braces syntax-end syntax-shell\">}</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Claude wrapper with custom terminal title</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function syntax-shell\"><span class=\"syntax-entity syntax-name syntax-function syntax-shell\">cly</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-shell\">(</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-shell\">)</span> <span class=\"syntax-punctuation syntax-section syntax-braces syntax-begin syntax-shell\">{</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\">    <span class=\"syntax-storage syntax-modifier syntax-shell\">local</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-assignment syntax-shell\">folder</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-shell\">=</span><span class=\"syntax-string syntax-unquoted syntax-shell\"><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-punctuation syntax-section syntax-expansion syntax-parameter syntax-begin syntax-shell\">{</span></span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">PWD</span></span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-keyword syntax-operator syntax-substring syntax-begin syntax-shell\">:</span></span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\">t</span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-section syntax-expansion syntax-parameter syntax-end syntax-shell\">}</span></span></span></span>  <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Just the current folder name</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span>    \n    <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Set title to show we&#39;re running Claude</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span>    <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">_set_title</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">folder</span></span> — Claude<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n    \n    <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Start a background process to continuously reset the title</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span>    <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> (prevents Claude from changing it)</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span>    <span class=\"syntax-punctuation syntax-definition syntax-compound syntax-begin syntax-shell\">(</span>\n        <span class=\"syntax-keyword syntax-control syntax-while syntax-shell\">while</span> <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">true</span></span><span class=\"syntax-keyword syntax-operator syntax-logical syntax-continue syntax-shell\">;</span> <span class=\"syntax-keyword syntax-control syntax-do syntax-shell\">do</span>\n            <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">_set_title</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">folder</span></span> — Claude<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n            <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">sleep</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> 0.5</span>\n        <span class=\"syntax-keyword syntax-control syntax-done syntax-shell\">done</span>\n    <span class=\"syntax-punctuation syntax-definition syntax-compound syntax-end syntax-shell\">)</span> <span class=\"syntax-keyword syntax-operator syntax-logical syntax-job syntax-shell\">&amp;</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\">    <span class=\"syntax-storage syntax-modifier syntax-shell\">local</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-assignment syntax-shell\">title_pid</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-shell\">=</span><span class=\"syntax-string syntax-unquoted syntax-shell\"><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-language syntax-shell\">!</span></span></span></span>\n    \n    <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Run Claude with dangerous permissions</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span>    <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\"><span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">HOME</span></span>/.claude/local/claude<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>dangerously-skip-permissions</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-language syntax-shell\">@</span></span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\">    <span class=\"syntax-storage syntax-modifier syntax-shell\">local</span> <span class=\"syntax-variable syntax-other syntax-readwrite syntax-assignment syntax-shell\">exit_code</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-shell\">=</span><span class=\"syntax-string syntax-unquoted syntax-shell\"><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-language syntax-shell\">?</span></span></span></span>\n    \n    <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Kill the background title setter</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span>    <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-support syntax-function syntax-kill syntax-shell\">kill</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">title_pid</span></span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-file-descriptor syntax-shell\">2</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&gt;</span>/dev/null</span>\n    <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-support syntax-function syntax-wait syntax-shell\">wait</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">title_pid</span></span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-file-descriptor syntax-shell\">2</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&gt;</span>/dev/null  <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Clean up zombie process</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span></span>    \n    <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Restore normal title</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span>    <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">_set_title</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>%~<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n    \n    <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Return the original exit code</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span>    <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-keyword syntax-control syntax-return syntax-shell\">return</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">exit_code</span></span></span>\n<span class=\"syntax-punctuation syntax-section syntax-braces syntax-end syntax-shell\">}</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Update terminal title before each prompt (using proper ZSH hooks)</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function syntax-shell\"><span class=\"syntax-entity syntax-name syntax-function syntax-shell\">_claude_precmd</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-shell\">(</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-shell\">)</span> <span class=\"syntax-punctuation syntax-section syntax-braces syntax-begin syntax-shell\">{</span>\n    <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">_set_title</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>%~<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n<span class=\"syntax-punctuation syntax-section syntax-braces syntax-end syntax-shell\">}</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Add our precmd function to the array (doesn&#39;t overwrite existing hooks)</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-keyword syntax-control syntax-if syntax-begin syntax-shell\">if</span> <span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-support syntax-function syntax-double-brace syntax-begin syntax-shell\">[[</span> <span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\">-</span>z</span> <span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-variable syntax-shell\">$</span><span class=\"syntax-punctuation syntax-section syntax-expansion syntax-parameter syntax-begin syntax-shell\">{</span></span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-variable syntax-other syntax-readwrite syntax-shell\">precmd_functions<span class=\"syntax-punctuation syntax-section syntax-braces syntax-begin syntax-shell\">[</span><span class=\"syntax-meta syntax-group syntax-parens syntax-shell\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-shell\">(</span>r<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-shell\">)</span></span>_claude_precmd<span class=\"syntax-punctuation syntax-section syntax-braces syntax-end syntax-shell\">]</span></span></span><span class=\"syntax-meta syntax-group syntax-expansion syntax-parameter syntax-shell\"><span class=\"syntax-punctuation syntax-section syntax-expansion syntax-parameter syntax-end syntax-shell\">}</span></span> <span class=\"syntax-support syntax-function syntax-double-brace syntax-end syntax-shell\">]]</span></span><span class=\"syntax-keyword syntax-operator syntax-logical syntax-continue syntax-shell\">;</span> <span class=\"syntax-keyword syntax-control syntax-if syntax-then syntax-shell\">then</span>\n    <span class=\"syntax-variable syntax-other syntax-readwrite syntax-assignment syntax-shell\">precmd_functions</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-shell\">+=</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-shell\">(</span>_claude_precmd<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-shell\">)</span>\n<span class=\"syntax-keyword syntax-control syntax-if syntax-end syntax-shell\">fi</span>\n</span></span></code></pre>\n<p>When I run <code>cly</code>, my terminal title changes from <code>~/Projects/blog</code> to <code>~/Projects/blog — Claude</code>. Revolutionary? No. Life-changing? Absolutely.</p>\n<blockquote>\n<p><em>Hot tip: Just ask Claude to read this blog post and set it up for you! (in yolo mode, of course)</em></p>\n</blockquote>\n<p>Now if you’ll excuse me, I need to check on my Claude instances. I think one of them is refactoring my entire codebase without asking. Again.</p>\n",
  "content_markdown": "![](https://steipete.me/assets/img/2025/commanding-your-claude-code-army/header.png)\n\n> **Update**: There’s a better solution now! Check out [Command Your Claude Code Army, Reloaded](https://steipete.me/posts/2025/command-your-claude-code-army-reloaded/) for VibeTunnel integration that gives Claude automatic title management.\n\n**TL;DR**: Running multiple Claude Code instances? Here’s a ZSH trick to keep your terminal titles organized and your sanity intact.\n\nI’ll admit it - I’ve become a [Claude Code](https://www.anthropic.com/claude-code) power user. At any given moment, I have at least three instances running: one for writing blog posts, another fixing that “quick” bug that’s now in hour three, and a third doing something I definitely forgot about. My terminal looks like a Claude Code convention.\n\n## The Problem: Too Many Claudes, Not Enough Context\n\n[Ghostty](https://ghostty.org/) (yes, with two T’s - it’s my favorite terminal) only shows the process name in the title. When you have six tabs all saying “claude”, finding the right one becomes a game of terminal roulette.\n\nThis is especially painful when you’re running Claude with the `--dangerously-skip-permissions` flag (yes, I live dangerously - see my post about [Claude Code being my computer](https://steipete.me/posts/2025/claude-code-is-my-computer/)). The last thing you want is to accidentally run the wrong command in the wrong directory with full system permissions.\n\nTo make matters worse, Claude Code has a habit of changing the terminal title to whatever it feels like - usually something unhelpful like “Running command…” or just “claude”. It’s like having a helpful assistant who keeps reorganizing your desk while you’re trying to work.\n\n## The Solution: Terminal Title Magic\n\nHere’s my approach - a clean ZSH setup that keeps terminal management code separate from my main configuration. First, I add one line to my `~/.zshrc`:\n\n```zsh\n# Source Claude wrapper with dynamic terminal title\n[ -f ~/.config/zsh/claude-wrapper.zsh ] && source ~/.config/zsh/claude-wrapper.zsh\n```\n\nThen I create `~/.config/zsh/claude-wrapper.zsh` with the actual implementation:\n\n```zsh\n#!/usr/bin/env zsh\n# Simple, elegant terminal title management for Claude\n\n# Set terminal title\n_set_title() { \n    print -Pn \"\\e]2;$1\\a\" \n}\n\n# Claude wrapper with custom terminal title\ncly() {\n    local folder=${PWD:t}  # Just the current folder name\n    \n    # Set title to show we're running Claude\n    _set_title \"$folder — Claude\"\n    \n    # Start a background process to continuously reset the title\n    # (prevents Claude from changing it)\n    (\n        while true; do\n            _set_title \"$folder — Claude\"\n            sleep 0.5\n        done\n    ) &\n    local title_pid=$!\n    \n    # Run Claude with dangerous permissions\n    \"$HOME/.claude/local/claude\" --dangerously-skip-permissions \"$@\"\n    local exit_code=$?\n    \n    # Kill the background title setter\n    kill $title_pid 2>/dev/null\n    wait $title_pid 2>/dev/null  # Clean up zombie process\n    \n    # Restore normal title\n    _set_title \"%~\"\n    \n    # Return the original exit code\n    return $exit_code\n}\n\n# Update terminal title before each prompt (using proper ZSH hooks)\n_claude_precmd() {\n    _set_title \"%~\"\n}\n\n# Add our precmd function to the array (doesn't overwrite existing hooks)\nif [[ -z ${precmd_functions[(r)_claude_precmd]} ]]; then\n    precmd_functions+=(_claude_precmd)\nfi\n```\n\nWhen I run `cly`, my terminal title changes from `~/Projects/blog` to `~/Projects/blog — Claude`. Revolutionary? No. Life-changing? Absolutely.\n\n> *Hot tip: Just ask Claude to read this blog post and set it up for you! (in yolo mode, of course)*\n\nNow if you’ll excuse me, I need to check on my Claude instances. I think one of them is refactoring my entire codebase without asking. Again.\n",
  "dateCreated": "2026-09-27T19:29:15.293681927+00:00",
  "date_created": "2025-06-05T09:00:00+00:00",
  "date_modified": "2025-06-05T09:00:00+00:00",
  "date_published": "2025-06-05T09:00:00+00:00",
  "description": "How a simple terminal trick helps me manage multiple Claude Code instances without losing my mind (or my terminal tabs)",
  "external_url": "https://steipete.me/posts/2025/commanding-your-claude-code-army/",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/steipete-me/2025/06/2025-06-05-commanding-your-claude-code-army.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/steipete-me/2025/06/2025-06-05-commanding-your-claude-code-army.md"
  },
  "id": "urn:aggr:item:6b88db97dacb072f477af994b3ee27864767b0a2",
  "isBasedOn": {
    "@id": "https://steipete.me/posts/2025/commanding-your-claude-code-army/"
  },
  "mainEntity": {
    "@id": "https://steipete.me/posts/2025/commanding-your-claude-code-army/",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/steipete-me/2025-06-05-commanding-your-claude-code-army/#webpage"
    },
    "dateModified": "2025-06-05T09:00:00+00:00",
    "datePublished": "2025-06-05T09:00:00+00:00",
    "headline": "Commanding Your Claude Code Army",
    "timeRequired": "PT3M",
    "url": "https://steipete.me/posts/2025/commanding-your-claude-code-army/",
    "wordCount": 503
  },
  "name": "Archived snapshot: Commanding Your Claude Code Army",
  "preview": null,
  "reading_minutes": 3,
  "replicated_at": null,
  "source": "steipete-me",
  "source_name": "Peter Steinberger",
  "summary": "How a simple terminal trick helps me manage multiple Claude Code instances without losing my mind (or my terminal tabs)",
  "tags": [],
  "temporalCoverage": "2026-09-27T19:29:15.293681927+00:00",
  "title": "Commanding Your Claude Code Army",
  "url": "https://aggr.aymericbeaumet.com/items/steipete-me/2025-06-05-commanding-your-claude-code-army/",
  "word_count": 503
}