Branches: an Activity Monitor for my coding agents
At any given point I've got a handful of coding agents running at once, Claude Code in one terminal tab, Codex in another, a Claude session inside Obsidian, and a couple more in Terminal windows I stopped bothering to label, and I kept losing track of which thread had which agent. Every so often I'd go tab by tab trying to remember what each one was working on, and more than once I found one that had been sitting on a permission prompt for ten minutes waiting for me to say yes. It's kind of like cooking with every burner on and no idea which pot is about to boil over, where the food is fine and the stove is fine and the only problem is that you can't see everything at once.
So I built Branches, a small, free, open-source Mac app that shows every Claude Code and Codex session running on your machine, what each one is doing, and whether it needs you, and if you double-click a session it takes you straight to that terminal tab. That's honestly the whole app.

Where the idea came from
It started on September 24 as me talking an idea out loud to ChatGPT, and at first I called it Threads, which lasted until I remembered Meta pretty much owns that word. Branches fit better anyway, because a project is the trunk and each agent session is a branch coming off it, and "let me check my branches" sounds like something I'd actually say.
The most important call came early, which was that Branches only watches. It doesn't launch agents or send prompts or try to become another terminal, and that mattered to me because there are already plenty of agent managers that want you to run everything through them, and I didn't want to change how I work just to see what was going on. The way I think about it is a baby monitor, which tells you when something needs you and never picks anything up itself.
I also decided pretty quickly that it would be free and open source (MIT), with no accounts, no cloud, no telemetry and nothing to sell, and that turned out to matter more than I expected because it took away every excuse to add features. There's no pricing page to justify, so the only test anything has to pass is one sentence: open Branches and immediately understand what your coding agents are doing. From there ChatGPT helped me turn the conversation into a long spec for Claude Code covering the product, what was technically possible, the architecture, how status would work and a build plan, and even though it was verbose (fifteen deliverables), it meant the thinking was done before any code got written.
The build
I handed the spec to Claude Code at 7:44pm and asked whether a small app like this could be built in one shot, it said yes, and the first working version was committed at 8:16pm, running on my real sessions. The session building it showed up as Working, my Terminal sessions showed as Done with their tab numbers, and the Claude session inside Obsidian showed as Idle, which was the moment it started to feel real.
The part I find most interesting is how it knows any of this. Claude Code keeps a small live status file for every running session, and Codex writes a line to its log every time a turn starts and ends, so Branches just watches those folders, reads the new lines as they come in, checks which processes are still alive, and boils all of it down to five words: Working, Needs you, Done, Idle, Ended.
The first version had to guess when Claude was stuck on a permission prompt, so if a quick action hadn't finished after six seconds it assumed Claude was waiting on me, which is the kind of guess that's right most of the time and wrong exactly when it matters (a slow search in a big repo would have tripped it). Later that night we looked closer and found that Claude already writes "waiting" to its own status file along with the reason, so the guess went away and Branches just reads what Claude says about itself. That ended up being the pattern for the whole project, where before building anything clever I'd check whether the answer was already sitting there.
The same night I added a menu bar icon with a count of the sessions that need me, optional notifications, and a demo mode with made-up sessions so the screenshots in the public repo wouldn't show my real prompts.
Making it look like the name
The first version was plain, and I actually liked it plain, but I wanted it to feel like something called Branches. Claude mocked up three directions, I picked the one with a treeline across the top, and that turned into what I've been calling Forest v1, where the sky changes with the time of day, a firefly drifts over the trees for every session that needs you, and each status gets its own little plant, a swaying sprout for working, a glowing lantern for needs you, and a fallen leaf for a session that's ended. The app icon came out of an earlier ChatGPT image session, a brown branch that forks into a green node and a red one.
v0.1.0 went up on GitHub Releases on September 26, two days after the idea.
What I took from it
The real discipline in this project was saying no. When you can build almost anything in an evening, it's like packing a suitcase with no weight limit, where nothing physically stops you from bringing everything, so the only thing keeping the bag light is you deciding what stays home. Being able to build something isn't a reason to build it, so every "wouldn't it be cool if" had to answer to that one sentence about understanding your agents at a glance, and most of them didn't make it.
The other thing is the order I did it in. My usual failure mode is trying to launch a fully finished product that stays perpetually in the works and never actually leaves my laptop, and this time I shipped a v0 first, pushed it, and then iterated, and the version that came out of iterating is one I genuinely like looking at. Because the app was simple and the scope was clear, the idea went straight to execution without me drifting off or losing the plot halfway through, and that's the part I want to carry into the next project.
The numbers
- About 32 minutes from handing over the spec to the first working build
- Two days from the idea to v0.1.0 on GitHub
- About 4,500 lines of Swift and 44 tests
- No network code and no third-party packages
What's still open
It isn't notarized yet, because that needs an Apple Developer account I don't have, so for now it's ad-hoc signed and the first launch needs a trip to Privacy & Security to allow it. Focusing the exact tmux pane a session is running in is also still on the list. Branches is on GitHub at github.com/mdpierre/branches.