← Projects

tmux-helpers

2026 - Present

Professional
tmuxShellDeveloper ToolingStream DeckClaude CodeAutomation
Private repository — no public code link

For years I lived in IntelliJ. Then I started working with Claude, and my work moved into the terminal: an iTerm window per project, split into tabs and panes, none of them named. Every restart or crash wiped all of it, with no way to rebuild what I'd been doing. The code was never at risk, but the context was, and the context was the expensive part.

I didn't know tmux existed. I think it was ChatGPT that told me, when I described the problem instead of searching for a tool. It unfolded a piece at a time: panes, tabs, names, jumping straight to things, and shaping it all around how I work instead of someone else's defaults.

What surprised me was that I could point Claude at it and have it build the setup. My terminal stopped being a pile of preferences I'd clicked into place and became a repository. It's all code, symlinked into my home directory, so editing the repo changes the live setup. A new machine is a clone and an install script. At the center is one Claude Code session per git worktree, pinned to a fixed session id, so after a crash or a reboot I get the same session back in the same place.

What it does

  • A worktree picker that lists every worktree across my repos and attaches the right session, with Claude already running.
  • A bell system. A session rings when it needs me, and waiting tabs are ordered oldest-first so nothing quietly starves while I work on something louder.
  • Separate tmux servers per project, so one crash can't take the others with it.
  • Tested reboot safety. Autosave runs under launchd with locking, watchdog timeouts, crash detection, and diagnostic capture. I learned more than once that a silent save failure is worse than a loud one.

The Stream Deck

Eventually switching became the bottleneck, so I bought a Stream Deck and built an optional layer for it. The top row is my projects, as filter toggles. The next row fills with whatever tabs are ringing in those projects, oldest first; pressing a key jumps there and clears the bell. Below that is a Lotl button that starts and stops dictation in one press. That button is where this stops being three separate projects: the deck starts dictation, Lotl transcribes it, Claude Code picks it up through claude-helpers, and tmux keeps every session findable while I bounce between them.

What I learned

  • Describe the problem instead of searching for a tool. I didn't know tmux existed until I described what kept going wrong to an LLM and it named the fix.
  • The code was never at risk after a crash. The context was, and the context was the expensive part. Protect that.
  • Keep the terminal setup as code in a repo, symlinked into your home directory. Editing the repo changes the live setup, and a new machine is a clone and an install script.
  • A silent save failure is worse than a loud one. I learned that more than once before adding locking, watchdog timeouts, crash detection, and diagnostic capture to the autosave.