Before facet existed, I was at work, locked into a Windows machine. I much prefer Linux, and the honest reason I run a Mac at home is that it keeps me from bricking my OS every two weeks. When you can't change the OS, you go tool-hunting instead, so I set out to make the terminal livable: first GlazeWM, a tiling window manager for people with i3 muscle memory, and through that rabbit hole, zellij. Rediscovering terminal multiplexing did something dangerous to my workflow. A new pane suddenly cost nothing, and I'm a skeptic by default, but agentic coding had just gotten usable enough that I started launching Claude sessions left and right. Soon I had a few running on different projects at once.
Some context on the shape of my work, because it explains the whole design: I'm a DevOps and infrastructure guy. My tasks are rarely one repo at a time. Publishing a new Helm chart means touching the Terraform repo and the Kubernetes manifests repo together, and I want them open side by side in the same VS Code window, not switched between. A piece of work, for me, is a small set of repos assembled around one task. Multiply that by a few tasks in flight, plus the agents, and you have the picture.
That's when the mess started. I tried git worktrees, on my own and with the agents. I'd open a codebase and be unsure which branch or which worktree I was looking at, and the agents were just as confused as I was. Several agents, or several people, working several issues will fight over one working tree: one branch, one dirty index. Worktrees were supposed to fix that. In my experience they moved the confusion around rather than removing it.
So I started building what I actually wanted: something like VS Code workspaces, but in the terminal. Then some git plumbing so ten workspaces over one repo don't cost ten clones. Then launching a Claude session straight into a fresh workspace, tied to a GitHub issue, disposable when the issue closes.
That last part is where I got it wrong. My first attempt wired zellij in, and the integration opened sessions and terminals almost at random, spawned Claude sessions with no name and no reference on disk, and when something crashed there was nothing to reattach to. It was a disaster. I lost a couple of sessions outright, work included. It took me a day of fighting, a Windows crash log, and eventually deleting about 1500 lines to understand why.
The tool is called and tell me where it breaks.
And if you take one thing from the arc: when you put agents to work, the valuable thing to automate away is the contention, not the operator. I deleted 1500 lines to learn that. The branch is still there, though. I wasn't done wanting it, I was done letting it act without me.
One last confession. My mantra has always been to build and publish the tools you'd actually use, and facet is exactly that, developed inside the very workflow it manages. The hidden cost of the mantra is that dogfooding makes it easy to skip the boring test-in-a-sandbox step. Between eagerness and hurry, I've lost more Claude sessions and more work building this tool than in anything else I've done, precisely because I test against the setup I'm actively working in. It happened again today, with an unreleased monitoring daemon on my tailnet. But that's another story.
Task-scoped workspaces over many git repositories, spawned from GitHub issues.
/\
/ \
/ /\ \
/_/ \_\ f a c e t
\ \ / /
\ \/ / one task, many repositories
\ / one disposable view
\/
facet
Task-scoped workspaces over many git repositories. A workspace is a directory
that assembles several repositories into one view for one task — and because its
whole layout is declared in .workspace.json, the directory is regenerable from
the manifest. Nothing about it is precious.
That is the core, and it stands on its own: no GitHub, no issues, no agents — just
a clean way to lay several repositories side by side and rebuild them anywhere. The
issue-driven features further down grew on top of it and became mainstays, but the
workspace is the thing.
~/Workspaces/
delivery/ # a long-lived, topical workspace
.workspace.json
platform/ # a clone this workspace owns outright
infra/
iss-platform-67-…/ # an ephemeral workspace, one GitHub
SOCIAL SHARE CARD GENERATOR