Grove: Know what’s finished in ~/Code.
Grove reads every repository, worktree and stray folder, including the ones your agents left in .claude/worktrees, and shows what’s active, what’s gone stale and what’s safe to clear. Then it clears it, with undo.
Grove reads git, not just your disk.
A disk tool sees folders. Grove sees branches, remotes and worktrees, so it can tell a worktree whose pull request merged last week from one holding an afternoon of unpushed work.

| Clears space | Grove says | Because it checked | In the demo folder |
|---|---|---|---|
| Offers to clear | Remove finished worktrees | Nothing uncommitted, and the branch was merged, its remote branch was deleted, or it has sat idle with everything pushed. | marigold-image-pipeline, fix-flaky-upload-test, dark-mode-tokens, review-pr-2122.08 GB |
| Offers to clear | Clear out dormant repositories | Untouched for over 90 days, every commit already on a remote, no stashes, nothing uncommitted in it or its worktrees. | pixel-garden, advent-of-code-2024, retro-weather, old-portfolio2.48 GB |
| Offers to clear | Prune stale branches | Merged, or the remote branch is gone. Never the default branch, the current one, or one checked out in any worktree. | chore/bump-deps, docs/api-examples, fix/typo-in-readme3 branches |
| Offers to clear | Forget missing worktrees | Git still tracks a worktree whose folder was deleted, which blocks its branch from being checked out anywhere else. | old-spike1 record |
| Points it out | Save work in progress | Uncommitted changes, or commits that aren’t on any remote yet. Grove points at these; it never offers to clear them. | lantern-cli, onboarding-copy, refactor-sync-engine, workshop-zine, hackathon-scrapbot5 items |
| Points it out | Sort out loose folders | Not a git repository, so nothing backs it up. Grove shows how much space they take and leaves the call to you. | scratch, screenshots-2025, figma-exports, downloads-to-sort1.48 GB |
Agents make worktrees. Grove finds every one.
Claude Code tucks them into .claude/worktrees, Codex keeps them under ~/.codex, and plenty end up outside ~/Code entirely. Grove follows git to each of them, and a repository stays active as long as its busiest worktree is.
| State | Where | Branch | Size | Grove’s read |
|---|---|---|---|---|
| ~/Code/tidepool | main | 1.48 GB | Keep Everything on main is pushed. 4 commits on its agent branches aren't on any remote yet. | |
| .claude/worktrees/ | claude/refactor-sync-engine | 537 MB | Unsaved work 2 uncommitted changes, 2 commits not on any remote. | |
| .claude/worktrees/ | claude/onboarding-copy | 268 MB | Unsaved work 1 commit not on any remote yet. | |
| .claude/worktrees/ | claude/fix-flaky-upload-test | 537 MB | Remove Branch merged into main, nothing uncommitted. | |
| .claude/worktrees/ | claude/dark-mode-tokens | 470 MB | Remove Remote branch deleted after its pull request closed, nothing uncommitted. | |
| .claude/worktrees/ | claude/review-pr-212 | 403 MB | Remove Idle 21 days with everything pushed. | |
| .claude/worktrees/ | claude/old-spike | — | Forget Folder deleted, but git still tracks the worktree. Grove can forget it. | |
| ~/Code/marigold-web | main | 1.01 GB | Keep Everything is pushed. | |
| ~/.codex/worktrees/marigold-image-pipeline | codex/image-pipeline | 671 MB | Remove Branch merged into main, nothing uncommitted. Lives outside ~/Code. |
Nothing goes without a way back.
Removing moves things to the real Trash, so Finder’s Put Back works, and ⌘Z undoes it.
- Scanning is read-only
- Git runs with GIT_OPTIONAL_LOCKS=0, so Grove never takes the index lock out from under your editor or terminal.
- Worktrees come back exactly
- Removing a worktree also sets aside git’s record of it, so undo puts it back as it was. Those records are cleared after a week.
- Repositories list what they take
- Removing a repository takes its linked worktrees with it, and the confirmation names every one.
- Unsaved work is called out first
- Uncommitted changes, unpushed commits, stashes or no remote at all: you see it before you confirm.
- Branches in use are off limits
- Branch cleanup never touches the default branch, the current branch, or one checked out in any worktree. Deleted branches come back with ⌘Z.
- Pins stay put
- Pin a repository to keep it in the sidebar and out of every cleanup suggestion.
- The network waits for you
- Fetch All is the only network action, and it only runs when you click it.
From the keyboard
- ⌘RRefresh
- ⌥⌘RFetch all remotes
- ⌘OOpen in editor
- ⇧⌘TOpen in terminal
- ⇧⌘RShow in Finder
- ⇧⌘BOpen remote in browser
- ⌘⌫Move to Trash
- ⌘ZUndo the last removal
- ⌥⌘IShow or hide the inspector
Your grove is tidy.
That’s what Grove says once there’s nothing left to clear. The 17 items above are what the demo folder keeps; see what yours says.