Julien Simon

Canopy - Parallel, sandboxed Claude Code sessions on native macOS

byβ€’
Canopy runs parallel Claude Code sessions as tabs in one native macOS window β€” each in its own git worktree, each its own Claude. Close the app and every session resumes with its conversation intact. One-click "Merge & Finish" handles the merge-and-cleanup dance, a split shell pane lets you run git without interrupting Claude, and an Activity dashboard shows where your tokens actually went. Native SwiftUI, no Electron. macOS 14+, AGPL-3.0. Built by someone who uses it daily.

Add a comment

Replies

Best
Julien Simon
Maker
πŸ“Œ
Hi everyone πŸ‘‹ I'm Julien. I built Canopy because I use Claude Code every single day, and two problems kept getting in my way: avoiding parallel task collisions and being comfortable letting an agent run commands on its own. Canopy solves both with isolation at two levels. Each task runs in its own git worktree β€” its own branch, its own directory β€” so parallel Claude sessions never step on each other's files. And each session can run in a sandboxed container, either Docker or Apple's native Container framework, so Claude runs in a contained runtime rather than running loose on your machine. Worktree isolation for your code, container isolation for peace of mind. On top of that, it's all one native macOS window β€” each session a tab, Cmd+1–9 to jump between them. Close the app and every session resumes with its conversation intact, no session IDs to hunt down. A few other things that came out of my own daily annoyances: β†’ Merge & Finish β€” replaces the five-command merge-and-cleanup dance with two clicks β†’ Split shell pane β€” run git or tail a log without interrupting Claude β†’ Activity dashboard β€” finally see where your tokens actually went Native SwiftUI, no Electron, no bundled Node β€” it launches fast and behaves like a Mac app. Free and open source under AGPL-3.0. Fair warning: it's macOS-only and built specifically around Claude Code β€” not a general worktree manager. It's young, so it's been battle-tested mostly against my own workflow. Bug reports and feedback are genuinely welcome β€” that's a big part of why I'm sharing it here.
GuoleiZuo

Congrats on the launch. The worktree + container split is the part that feels most useful: code isolation and runtime isolation are different problems.

One edge case I’d love to understand: when two Claude sessions touch shared project surfaces like package manifests, migrations, env examples, or generated types, does Merge & Finish detect cross-worktree conflicts before merging, or is the workflow still β€œmerge one, then resolve manually”? That conflict boundary is where parallel agents usually stop feeling parallel.