box
A CLI tool that manages workspaces via git clone --local. Multi-repo support included.

What is box?
Box creates and manages named workspaces using git clone --local.
- Register repos with
box repo add, then create sessions — each session clones repos into~/.box/workspaces/<session>/ - Multiple repos can be grouped into a single session
- Each clone has its own
.git, so the original repo is never affected
Features
git clone --localworkspaces — fast cloning with hardlinks, fully independent.git- Multi-repo sessions — group multiple repos into one workspace
- Interactive TUI — select repos, enter session name and command, with history
- Shell integration — completions and
cdwrapper for zsh/bash
Requirements
Install
Quick install
|
From crates.io
From source
Nix
Binary download
Pre-built binaries are available on the GitHub Releases page.
Quick Start
# 1. Register a repo
# 2. Create a session via TUI
# 3. Or create via CLI
# 4. Clean up
Usage
)
)
)
|
Create a session
# With a command
# Multiple repos
# Minimal
--repo is required. To create sessions interactively, use box (no arguments) to launch the TUI.
Edit session repos
List and manage sessions
Navigate to a workspace
With shell integration enabled (eval "$(box config zsh)"), box cd changes your working directory. Without it, the workspace path is printed to stdout.
Multi-repo Workspaces
Register repos, then reference them by name when creating sessions:
Each repo is cloned into ~/.box/workspaces/<session>/<repo>/. For single-repo sessions, the workspace path resolves directly to the repo subdirectory.
Options
box new
| Option | Description |
|---|---|
<name> |
Session name (required) |
--repo <name> |
Repos to clone (required, repeatable) |
-- cmd... |
Command to run in the workspace (default: $BOX_DEFAULT_CMD if set) |
box list
| Option | Description |
|---|---|
--project, -p |
Show only sessions for the current project directory |
--quiet, -q |
Only print session names |
Environment Variables
| Variable | Description |
|---|---|
BOX_DEFAULT_CMD |
Default command for new sessions, used when no -- cmd is provided |
Shell Integration
# Zsh (~/.zshrc)
# Bash (~/.bashrc)
This provides tab completions and a box shell function that enables box cd to change your working directory.
How It Works
registered repos box new my-feature ~/.box/workspaces/my-feature/
frontend/ ──── git clone --local ────> frontend/
backend/ backend/
git clone --local creates an independent git repo using hardlinks for file objects. Each clone has its own .git directory — commits, branches, resets, and destructive operations in the workspace do not affect the original.
| Aspect | Detail |
|---|---|
| Workspace location | ~/.box/workspaces/<session>/ |
| Session metadata | ~/.box/sessions/<session>/ |
| Clone method | git clone --local (independent .git, hardlinked objects) |
| Cleanup | box remove deletes workspace and session data |
Design Decisions
| Alternative | Trade-off |
|---|---|
| Bind-mount | No isolation; modifications affect original files |
| git worktree | Shares .git with host; checkout/reset/rebase can affect host refs |
| Bare-git mount | Shares state; branch operations affect host |
Full copy (cp -r) |
Independent but slow for large repos |
git clone --local is independent (own .git), fast (hardlinks), complete (full history), and simple (no wrapper scripts).
Claude Code Integration
Box works well with Claude Code for running AI agents in independent workspaces:
Everything the agent does stays in the workspace. Delete the session when done.
License
MIT