Multiplexer
tmux repo windows: one window per repository, named so you can read the room.
Groundwork's repo picker turns tmux windows into a map of your open repositories: each repo gets one lazygit window with a readable name, re-picking a repo jumps to its existing window, and the whole flow works whether you start inside tmux or from a bare terminal.
zsh · zsh · nvim · zsh and you have no idea which shell is standing in which repository.#Why windows, not more panes
A tmux window is the right size for a repository: it has a name in the status line, a number you can jump to, and room for whatever that repo needs. When each open repo is one window, the status line becomes a survey of your working set — 1:groundwork 2:my-app 3:notes reads like a to-review list. Panes are for views inside a repo (editor beside tests beside an agent); windows are for moving between repos.
#Open-or-select, never duplicate
The picker opens repo windows with tmux's new-window -S: if a window with that name already exists, tmux selects it instead of creating a twin. Pick the same repo five times and you land in the same window five times. That keeps window numbers stable through a whole session, which is what makes prefix 1…9 muscle memory possible.
$ tmux new-window -S -n my-app -c ~/code/my-app lazygit
# -S select the existing my-app window if there is one
# -n readable window name (shortest unique path suffix when repos collide)
# -c start in the repo — the path travels as one argument, spaces and all
Names stay honest: a window named for a repo was created for that repo, and because Groundwork's tmux config keeps manual renames sticky (prefix ,), your own labels are never overwritten by the picker — the window is simply reused by name.
#Inside or outside tmux
Inside tmux, picked repos become windows in your current session. Outside tmux — a fresh terminal, an SSH hop — the same commands create a session called repos (or attach to it if it exists), put the repo windows there, and attach. You never get an error for not being in tmux yet; the tool meets you where you are.
#The popup bindings
Both bindings live in Groundwork's managed tmux config, and both call groundwork-repos by absolute path so a long-lived tmux server's PATH can't break them. Repositories are discovered under your configured roots — the tmux config never contains a repository name:
| prefix R | Picker in a popup over your current window; Esc closes it with no side effects |
| prefix G | One lazygit window per dirty repo, without blocking the tmux client (run-shell -b) |
Before you stop for the day: prefix G. Every repository with uncommitted work — yours or an agent's — becomes a window. Walk them left to right, commit or discard, and end at inbox zero for diffs.
#Try it now
$ groundwork-repos # the table: what exists, what's dirty
$ tmux # if you're not already in it
# prefix R → type a few letters of any repo → Enter → you're in its lazygit
# prefix R → pick the SAME repo → note you landed in the same window
# q quits lazygit; prefix x closes the window (it asks first)