Udderly instant pastures.

yes, it's called cow. as in Copy-On-Write. we have no regrets.

Clone your entire git repo โ€” node_modules, build outputs, .env files and all โ€” in milliseconds with near-zero disk overhead. Point an AI coding agent at each pasture and let them work in parallel.

๐ŸŽ macOS ยท APFS โšก millisecond clones ๐Ÿ’พ near-zero disk overhead ๐Ÿฆ€ written in Rust ๐Ÿค– AI-agent ready ๐Ÿ†“ MIT licence
20 active pastures
23 MB total disk delta
saved vs. full clones
~158.7 GB npm / yarn
~119.3 GB pnpm / bun

the developer's own experience โ€” 18 pastures across several JS monorepos. your mileage will vary.


Every other approach is udderly wrong.

Running multiple AI coding agents in parallel means multiple isolated pastures. Here is what you are up against otherwise.

๐ŸŒฟ

git worktrees

Shares the object store but not node_modules, build artefacts, or .env files. Every new worktree needs a full npm install. Agents step on each other's lock files. Works at a small scale; falls apart fast.

โœ— doesn't scale
๐Ÿ“ฆ

full clone

Copying 2 GB of node_modules four times over takes minutes and burns 8 GB of disk. You will run df -h with increasing alarm. Also slow to delete when you are done.

โœ— slow and disk-hungry
๐Ÿณ

containers / VMs

Heavyweight. Minutes to spin up. No native macOS toolchains. Your Xcode build does not work in a Linux container. Neither does your iOS simulator. Wrong layer of abstraction entirely.

โœ— wrong layer of abstraction

Copy-On-Write, from the filesystem up.

APFS has had block-level CoW cloning since macOS High Sierra. cow just wires it up with a nice interface.

1

Clone with clonefile(2)

Uses the same syscall Time Machine uses. A byte-identical copy of your entire repo directory in one call. No data is physically duplicated on disk until a file actually changes.

2

Checkout or create a branch

Optionally check out an existing branch or create a new one in the pasture. It is a fully independent git repo with its own HEAD, index, and working tree.

3

Clean up runtime artefacts

Removes .pid, .sock, and .socket files that should not be shared between pastures. Reads .cow.json for project-specific cleanup rules and post-clone commands.

4

Point your agent at it

Each pasture lands in ~/.cow/pastures/{name}. Open Claude Code, Cursor, or Aider in each one. They work in complete isolation until you extract their changes.

your main repo node_modules/ src/ .env .git/ dist/ 2.1 GB on disk cow create ยท ~130ms ยท ~0 disk agent-1 feat/auth ๐Ÿค– Claude Code ~0 extra disk agent-2 feat/api ๐Ÿค– Cursor ~0 extra disk agent-3 feat/ui ๐Ÿค– Aider ~0 extra disk agent-4 feat/docs ๐Ÿค– Claude ~0 extra disk

Eighteen commands. One binary.

No daemons to manage, no subscriptions, no install step in your pastures.

# create a named pasture; --branch overrides the branch name $ cow create feat-auth --source ~/my-project --branch feat/auth Cloning /Users/joe/my-project ... ๐Ÿ„ Created pasture 'feat-auth' at ~/.cow/pastures/feat-auth   # omit the name and cow auto-generates agent-1, agent-2, โ€ฆ $ cow create --source ~/my-project Cloning /Users/joe/my-project ... ๐Ÿ„ Created pasture 'agent-1' at ~/.cow/pastures/agent-1
$ cow list NAME STATUS BRANCH CREATED โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ my-project/agent-1 clean 5 minutes ago my-project/agent-2 dirty (2) feat/api 8 minutes ago my-project/feat-auth clean 12 minutes ago   # --json for scripts and MCP tools $ cow list --json [{"name":"agent-1","branch":"feat/auth","vcs":"git",โ€ฆ}]
# prompts when pasture has uncommitted changes $ cow remove agent-2 โš  Pasture 'agent-2' has uncommitted changes: M src/api/routes.rs Remove anyway? Changes will be lost. [y/N]: y ๐Ÿ„ Removed pasture 'agent-2'   # --force skips the prompt $ cow remove --force agent-1 feat-auth ๐Ÿ„ Removed pasture 'agent-1' ๐Ÿ„ Removed pasture 'feat-auth'
# write a patch file $ cow extract agent-2 --patch ~/auth-changes.patch Patch written to /Users/joe/auth-changes.patch   # land the branch in the source repo so you can push a PR $ cow extract agent-2 --branch feat/auth-review Branch 'feat/auth-review' created in source repo at ~/my-project   # clean up $ cow remove --force agent-2 ๐Ÿ„ Removed pasture 'agent-2'
$ cow status agent-2 ๐Ÿ„ Pasture: agent-2 Source: /Users/joe/my-project Branch: feat/api VCS: git Status: dirty Created: 2026-03-03 09:52:00 UTC Disk delta: 14 KB (estimated from modified file sizes)   Modified files: M src/api/routes.rs A src/api/middleware.rs
# discover git worktrees, jj workspaces, and orphaned cow dirs $ cow migrate --source ~/my-project Found 2 candidate(s) to migrate: feat-auth โ€” /Users/joe/my-project-feat-auth feat-api โ€” /Users/joe/my-project-feat-api Run with --all to migrate all of them.   # preview what would happen without making any changes $ cow migrate --source ~/my-project --all --dry-run [dry-run] Would migrate 'feat-auth' (/Users/joe/my-project-feat-auth) [dry-run] Would migrate 'feat-api' (/Users/joe/my-project-feat-api)   # migrate all candidates (skips dirty pastures) $ cow migrate --source ~/my-project --all Skipping 'feat-api' โ€” has uncommitted changes (use --force to override). Migrated 'feat-auth'   # migrate everything, including dirty pastures $ cow migrate --source ~/my-project --all --force Migrated 'feat-api'

cow ๐Ÿ„ vs the alternatives.

Spoiler: the one named after a farm animal wins on every metric that matters for parallel AI development.

Feature cow ๐Ÿ„ git worktree full clone
Clone time (2 GB repo) ~130ms ~1s (no modules) 3โ€“8 minutes
Extra disk per pasture ~0 until modified ~0 (no modules) full copy ร— N
node_modules included โœ“ โœ— โœ“
Isolated .env files โœ“ โœ— (shared) โœ“
Build artefacts included โœ“ โœ— โœ“
Independent git history โœ“ โœ“ โœ“
macOS native toolchains โœ“ โœ“ โœ“
jj (Jujutsu) support โœ“ n/a manual
MCP server built in โœ“ โœ— โœ—
Platform requirement macOS + APFS any OS any OS

A first-class MCP server.

Run cow mcp to expose pasture management as MCP tools. Your AI orchestrator can create and tear down pastures without shelling out.

Add to Claude Code

Drop this snippet into your ~/.claude.json or a project-local .mcp.json to let Claude manage its own pastures on your behalf.

Exposes four MCP tools: cow_create, cow_list, cow_remove, cow_status.

Communicates over stdio โ€” no ports, no background daemons, no port conflicts.

// ~/.claude.json { "mcpServers": { "cow": { "command": "cow", "args": ["mcp"] } } }

Meet Herd. ๐Ÿ„

A native macOS menubar app that gives you a live view of all your pastures โ€” no terminal needed.

Everything at a glance

Pastures are grouped by project. Hover any row to reveal quick actions: open in Finder, open in Terminal, sync from source, or remove with a confirmation prompt.

A stats strip at the bottom shows real-time disk savings versus a traditional clone.

Herd calls the cow CLI under the hood โ€” it requires cow to be installed.

# Install Herd via Homebrew brew install joeinnes/tap/cow-herd # Copy to Applications cp -r $(brew --prefix)/opt/cow-herd/Herd.app \ /Applications/ # First launch: right-click โ†’ Open # to bypass Gatekeeper (unsigned app)

Ready to join the herd?

macOS with APFS required. Apple Silicon and Intel both supported via a universal binary.

๐Ÿบ Homebrew

# Add the tap once brew tap joeinnes/tap # Install cow brew install cow # Verify cow --version

๐Ÿฆ€ Cargo

# Crate is cow-cli, binary is cow cargo install cow-cli # Verify cow --version

Requirements: macOS 10.13 High Sierra or later (clonefile(2) became stable in 10.13). Works on Apple Silicon and Intel โ€” the Homebrew formula installs a universal binary. Linux and Windows are not supported; the CoW mechanism requires APFS.