spawn-backends
npx machina-cli add skill zircote/claude-team-orchestration/spawn-backends --openclawSpawn Backends
A backend determines how teammate Claude instances actually run. Claude Code supports three backends and auto-detects the best one based on your environment.
Experimental: Agent teams are disabled by default. Enable with
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMSin your settings or environment.
Related skills:
- Orchestrating - Primitives overview and quick reference
- Team Management - Creating and managing teams
- Error Handling - Troubleshooting backend issues
Backend Comparison
| Backend | How It Works | Visibility | Persistence | Speed |
|---|---|---|---|---|
| in-process | Same Node.js process as leader | Hidden (background) | Dies with leader | Fastest |
| tmux | Separate terminal in tmux session | Visible in tmux | Survives leader exit | Medium |
| iterm2 | Split panes in iTerm2 window | Visible side-by-side | Dies with window | Medium |
teammateMode Setting
The default is "auto", which uses split panes if you're already running inside a tmux session, and in-process otherwise.
Settings File Configuration
Set teammateMode in your settings.json:
{
"teammateMode": "in-process"
}
Valid values: "auto", "in-process", "tmux"
CLI Flag
Force a mode for a single session:
claude --teammate-mode in-process
Environment Variable
export CLAUDE_CODE_SPAWN_BACKEND=in-process
Auto-Detection Logic
Claude Code automatically selects a backend using this decision tree:
flowchart TD
A[Start] --> B{Running inside tmux?}
B -->|Yes| C[Use tmux backend]
B -->|No| D{Running in iTerm2?}
D -->|No| E{tmux available?}
E -->|Yes| F[Use tmux - external session]
E -->|No| G[Use in-process]
D -->|Yes| H{it2 CLI installed?}
H -->|Yes| I[Use iterm2 backend]
H -->|No| J{tmux available?}
J -->|Yes| K[Use tmux - prompt to install it2]
J -->|No| L[Error: Install tmux or it2]
Detection checks:
$TMUXenvironment variable -> inside tmux$TERM_PROGRAM === "iTerm.app"or$ITERM_SESSION_ID-> in iTerm2which tmux-> tmux availablewhich it2-> it2 CLI installed
in-process (Default)
Teammates run as async tasks within the same Node.js process.
How it works:
- No new process spawned
- Teammates share the same Node.js event loop
- Communication via in-memory queues (fast)
- You don't see teammate output directly
When it's used:
- Not running inside tmux session
- Non-interactive mode (CI, scripts)
- Explicitly set via
teammateMode: "in-process"orCLAUDE_CODE_SPAWN_BACKEND=in-process
Layout:
┌─────────────────────────────────────────┐
│ Node.js Process │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Leader │ │Worker 1 │ │Worker 2 │ │
│ │ (main) │ │ (async) │ │ (async) │ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────┘
Interaction: Use Shift+Up/Down to select a teammate, then type to send a message. Press Enter to view a session, Escape to interrupt, Ctrl+T to toggle the task list.
Pros:
- Fastest startup (no process spawn)
- Lowest overhead
- Works everywhere, no extra setup
Cons:
- Can't see teammate output in real-time
- All die if leader dies
- Harder to debug
tmux
Teammates run as separate Claude instances in tmux panes/windows.
How it works:
- Each teammate gets its own tmux pane
- Separate process per teammate
- You can switch panes to see teammate output
- Communication via inbox files
When it's used:
- Running inside a tmux session (
$TMUXis set) - tmux available and not in iTerm2
- Explicitly set via
teammateMode: "tmux"orCLAUDE_CODE_SPAWN_BACKEND=tmux
Layout modes:
- Inside tmux (native): Splits your current window
┌─────────────────┬─────────────────┐
│ │ Worker 1 │
│ Leader ├─────────────────┤
│ (your pane) │ Worker 2 │
│ ├─────────────────┤
│ │ Worker 3 │
└─────────────────┴─────────────────┘
- Outside tmux (external session): Creates a new tmux session called
claude-swarm
# Your terminal stays as-is
# Workers run in separate tmux session
# View workers:
tmux attach -t claude-swarm
Note: tmux has known limitations on certain operating systems and traditionally works best on macOS. Using
tmux -CCin iTerm2 is the suggested entrypoint.
Pros:
- See teammate output in real-time
- Teammates survive leader exit
- Can attach/detach sessions
- Works in CI/headless environments
Cons:
- Slower startup (process spawn)
- Requires tmux installed
- More resource usage
# Start tmux session first
tmux new-session -s claude
# Or force tmux backend
export CLAUDE_CODE_SPAWN_BACKEND=tmux
Useful tmux commands:
# List all panes in current window
tmux list-panes
# Switch to pane by number
tmux select-pane -t 1
# Kill a specific pane
tmux kill-pane -t %5
# View swarm session (if external)
tmux attach -t claude-swarm
# Rebalance pane layout
tmux select-layout tiled
iterm2 (macOS only)
Teammates run as split panes within your iTerm2 window.
How it works:
- Uses iTerm2's Python API via
it2CLI - Splits your current window into panes
- Each teammate visible side-by-side
- Communication via inbox files
When it's used:
- Running in iTerm2 (
$TERM_PROGRAM === "iTerm.app") it2CLI is installed and working- Python API enabled in iTerm2 preferences
Layout:
┌─────────────────┬─────────────────┐
│ │ Worker 1 │
│ Leader ├─────────────────┤
│ (your pane) │ Worker 2 │
│ ├─────────────────┤
│ │ Worker 3 │
└─────────────────┴─────────────────┘
Pros:
- Visual debugging - see all teammates
- Native macOS experience
- No tmux needed
- Automatic pane management
Cons:
- macOS + iTerm2 only
- Requires setup (it2 CLI + Python API)
- Panes die with window
- Not supported in VS Code's integrated terminal, Windows Terminal, or Ghostty
Setup:
# 1. Install it2 CLI
uv tool install it2
# OR
pipx install it2
# OR
pip install --user it2
# 2. Enable Python API in iTerm2
# iTerm2 -> Settings -> General -> Magic -> Enable Python API
# 3. Restart iTerm2
# 4. Verify
it2 --version
it2 session list
If setup fails: Claude Code will prompt you to set up it2 when you first spawn a teammate. You can choose to:
- Install it2 now (guided setup)
- Use tmux instead
- Cancel
Backend in Team Config
The backend type is recorded per-teammate in config.json:
{
"members": [
{
"name": "worker-1",
"backendType": "in-process",
"tmuxPaneId": "in-process"
},
{
"name": "worker-2",
"backendType": "tmux",
"tmuxPaneId": "%5"
}
]
}
Checking Current Backend
# See what backend was detected
cat ~/.claude/teams/{team}/config.json | jq '.members[].backendType'
# Check if inside tmux
echo $TMUX
# Check if in iTerm2
echo $TERM_PROGRAM
# Check tmux availability
which tmux
# Check it2 availability
which it2
Troubleshooting Backends
| Issue | Cause | Solution |
|---|---|---|
| "No pane backend available" | Neither tmux nor iTerm2 available | Install tmux: brew install tmux |
| "it2 CLI not installed" | In iTerm2 but missing it2 | Run uv tool install it2 |
| "Python API not enabled" | it2 can't communicate with iTerm2 | Enable in iTerm2 Settings -> General -> Magic |
| Workers not visible | Using in-process backend | Start inside tmux or iTerm2 |
| Workers dying unexpectedly | Outside tmux, leader exited | Use tmux for persistence |
| Orphaned tmux sessions | Team wasn't fully cleaned up | tmux ls then tmux kill-session -t <name> |
Source
git clone https://github.com/zircote/claude-team-orchestration/blob/main/skills/spawn-backends/SKILL.mdView on GitHub Overview
Claude Code supports three backends: in-process, tmux, and iTerm2, auto-detecting the best option based on your environment. This skill helps you choose a display mode, set up split panes, troubleshoot backend issues, and configure teammateMode.
How This Skill Works
The backend is auto-selected by environment checks unless you override with teammateMode, a CLI flag, or an environment variable. Detection looks for tmux sessions, iTerm2, and the availability of tmux or the it2 CLI, then maps to the appropriate backend with distinct visibility, persistence, and performance characteristics for each option.
When to Use It
- Choosing the default display mode for teammates (in-process, tmux, or iTerm2) based on your environment
- Setting up split panes or multiple Claude instances in tmux or iTerm2
- Troubleshooting backend issues related to visibility, persistence, or speed
- Configuring teammateMode via settings.json, CLI flag, or environment variable
- Understanding auto-detection behavior and how to override it when needed
Quick Start
- Step 1: Assess your environment (tmux session, iTerm2, or plain terminal) to decide the backend
- Step 2: Configure the backend by setting teammateMode in settings.json, or use CLAUDE_CODE_SPAWN_BACKEND, or run claude --teammate-mode <mode>
- Step 3: Start Claude and verify the correct display mode and pane arrangement (or lack of direct output in in-process) and adjust if needed
Best Practices
- Check your terminal environment before starting (tmux, iTerm2, or plain terminal) to pick the most suitable backend
- Use teammateMode to force a backend in scripts or CI environments for stability
- Keep the it2 CLI and tmux available if you plan to use iTerm2 or tmux backends
- Document the chosen backend in team notes to avoid confusion during handoffs
- Test backend changes in a small session before applying system-wide
Example Use Cases
- Setting teammateMode to in-process in a CI pipeline for non-interactive runs
- Running Claude in tmux to manage multiple teammate panes within a single terminal window
- Using iTerm2 with split panes to view leader and workers side-by-side
- Overriding auto-detection with --teammate-mode tmux for a developer workstation
- Configuring settings.json with teammateMode: "in-process" for a headless environment