All posts

Developer tooling

I Moved My Claude Sessions From tmux to herdr

So far, I'm not going back. Mostly.

herdr

A terminal workspace manager for AI coding agents. Not mine — I just use it every day now.

brew install herdr

Same setup, different multiplexer

My setup hasn't changed. I work remotely. The code, the containers and the Claude Code sessions live on an Ubuntu box at home; my hands are on a MacBook Air. The two talk over Tailscale, which means the Air doesn't have to be at home for any of this to work.

That matters, because I also fetch my daughter from school. The laptop comes with me; the Ubuntu box stays home and keeps working. Most of the day I'm in iTerm, connected to that box.

What changed is the thing sitting between me and those sessions. For years that was tmux. For the last few weeks it's been herdr — a tmux-shaped workspace manager built specifically for running AI coding agents. Persistent sessions, workspaces, tabs, panes: all the parts you'd expect. Plus one thing tmux never had a reason to know about: which of those panes are agents, and what they're doing right now.

Short version: so far, it's better than tmux for the way I work. Here's why, and the one thing I genuinely miss.

Ctrl+V just works

Claude Code takes images. Paste a screenshot with Ctrl+V and it can see the stack trace, the broken layout, the chart that looks wrong. Locally, that's nothing special.

Over SSH, it's a different story. The screenshot is on my Mac's clipboard. Claude is running on the Ubuntu box. Plain SSH plus tmux has no way to carry an image from one to the other, so Ctrl+V does nothing useful.

With herdr, I don't SSH in and then start a multiplexer. I attach from my Mac:

herdr --remote devbox

The herdr server and the Claude sessions stay on the box; the client runs on my Mac. And Ctrl+V with a screenshot on the clipboard just… works. Claude gets the image. No extra script, no extension, no config. Out of the box.

That one behavior is most of the reason I switched.

It keeps running when I leave

The part herdr shares with tmux is the part I can't live without: the sessions live on the server, not in my terminal window.

Close the Air's lid, drive to school, open it somewhere else, run herdr --remote again — and every Claude session is right where I left it — or, more often, further along. The agents never noticed I was gone.

It also doesn't care how I attach. In iTerm, it's herdr --remote from the Mac. From VS Code over Remote-SSH, I open the integrated terminal and just run herdr on the Ubuntu box itself. Same server, same sessions, same agents. It's the tmux promise, kept.

How I used to paste into remote sessions

Getting things from my Mac into a remote Claude session is a problem I've been fighting for a while.

Back in the iTerm-plus-tmux days I had a small zsh script, clip2remote.sh: copy a file, hit a keybinding, and it would scp the file to the Ubuntu box and type the remote path into my prompt so Claude could read it.

When I moved to VS Code Remote-SSH, I missed that script enough to turn it into an extension, Clip2Remote. I wrote about that whole detour — including why every existing paste extension was running on the wrong computer — in my previous post.

Where Clip2Remote still wins

To be fair to my own extension: herdr's Ctrl+V is about images. Clip2Remote moves any file — a zip of logs, a screen recording, a client's PDF — to the remote box and drops the path into the prompt. On features alone, Clip2Remote is still the more capable tool.

But day to day, most of what I hand Claude is a screenshot. For that, Ctrl+V in herdr is more than enough.

So my workflow now looks like this:

  • Most of the time, I'm in iTerm with herdr --remote. Running the Claude sessions, watching the agents panel, pasting screenshots. It's lightweight — a terminal window, not an IDE — which matters on a MacBook Air that's often away from home.
  • When I need to actually look at files — browse the code, or manually review what Claude just generated — I open VS Code over Remote-SSH. Clickable paths, real editor tabs, a proper diff view. And in its terminal I still run herdr, this time directly on the Ubuntu box, attached to the same sessions I had open in iTerm.
  • And in VS Code, Clip2Remote is still pulling its weight for remote development over SSH, especially when the thing I need to hand over isn't an image.

Two tools, each in the place it's best at. herdr didn't replace Clip2Remote; it replaced the part of my day where I needed it most.

The agents panel

This is the part I didn't know I wanted.

I rarely run just one Claude session. I'll start several at a time — one per task — and let them run side by side. In tmux, keeping track of them meant cycling through windows and reading the last few lines of each one to figure out what state it was in. Most of the time the answer was "still working." Sometimes it was "has been waiting on a yes/no from me for who knows how long."

herdr keeps a panel with every agent and its current status: working, blocked, done. I glance at it the way I'd glance at a CI dashboard.

The status that matters is "blocked."

A session waiting on me is a session doing nothing. Seeing that at a glance, instead of finding it by accident, is the difference between running several agents and actually getting several agents' worth of work.

It turns "run several Claude sessions at once" from something I could technically do into something I actually do every day.

What I miss: tmux -CC

It's not a clean sweep.

iTerm2 has a tmux integration mode — tmux -CC — that I'd gotten very used to. Instead of drawing its own UI inside one terminal window, tmux hands the layout to iTerm, so tmux windows become real iTerm tabs and panes. Native scrollback. Native Cmd+F. Mouse selection that selects what you meant to select. All of it backed by a tmux session on the Linux box that survives disconnects.

herdr draws its own interface, the way plain tmux does. That's fine, and its keybindings are easy to pick up. But if you're coming from -CC, you'll notice the native feel is gone. It's the one thing I genuinely miss.

Give it a few weeks

My suggestion, if you live in tmux and run coding agents:

  • Install it: brew install herdr, or the install script on herdr.dev.
  • If your agents run on another machine, attach with herdr --remote instead of SSH-then-tmux, and try pasting a screenshot into Claude.
  • Start a few agents at once and watch the agents panel instead of cycling through windows.
  • Use it for a few weeks, not an afternoon. tmux muscle memory is deep, and the first few days will feel slower just because they're different.

Then compare honestly. For me, the image paste and the agents panel outweighed losing -CC. Your trade might come out differently — but I think it's worth finding out.

herdr is open source and not affiliated with me — I'm just a happy user. When I'm in VS Code over Remote-SSH, Clip2Remote is still how I paste files — any file, not just images — into a remote terminal.