Which of your repos are dirty right now?
If you keep a folder full of them — services, packages, plugins — answering that means
cd-ing through every one. manygit puts every repo underneath on one
screen: ahead, behind, dirty, clean.
Then fetch, pull, push, or switch branches on the one under your cursor, without
leaving the list.
Install
One command. It drops a single binary in ~/.local/bin.
The installer picks the right build for your OS and architecture, and adds
~/.local/bin to your PATH if it isn't there already. On every launch
manygit checks for a newer release and offers to update itself, so this is the last
time you'll run it.
From source
Needs Go 1.24 or newer.
Then run it
$manygit --root ~/work # scan somewhere else
manygit walks the folder three levels deep, collects every git repo it finds, and groups them by parent directory.
Keys
Every action applies to the repo under the > cursor.
| KEY | ACTION |
|---|---|
| 1 2 3 | Focus Repos, Scripts, or Branches |
| 4 | Pull requests — a tab beside Branches |
| 5 6 7 | The bottom slot: commit graph, changed files, script output |
| tab | Cycle the panes. shift+tab cycles back |
| [ ] | Cycle the focused pane's tabs — 3⇄4, 5→6→7. The numbers still jump straight to any of them |
| j k | Move within the focused pane |
| ← → | Hop between Repos and that repo's Branches |
| enter | Select: open a repo's branches, check one out, run a script, or check out a PR |
| b | Check out the highlighted branch — what enter does in Branches |
| s / p | Sync (fetch, then fast-forward pull) / push |
| d / D | Discard changes, after a confirm — d tracked files only, D also deletes untracked ones |
| f / r | Fetch this repo / refetch all of them |
| / |
Filter the focused list by what it shows. Repos match on their name
and their current branch — /main finds every repo sitting on
main, and the tag too while t is on. Branches match on name, so
feat finds one among hundreds
|
| F | Show only repos that are changed, ahead, or behind |
| t | Show each repo's latest tag inline |
| g / n | Full-screen commit graph / full-screen news feed |
| esc | Back out one layer of state — the diff, then Changes, then zoom, then the / and F filters. One press, one layer |
| o / z | Open the repo in your editor / zoom the focused pane |
| ? | The keybindings and the status legend — tab flips to settings |
| , | Settings: themes, AI harness, news window, scan depth, glyphs, editor |
| q | Quit |
Status
The right-hand column of the Repos pane, in one glance per repo.
| ok | Up to date with upstream |
| ↑N | N commits ahead — something to push |
| ↓N | N commits behind — something to pull |
| ↑N ↓M | Diverged from upstream |
| *N | N files changed in the working tree |
| no-remote | A local-only repo, never pushed anywhere. s and p skip it |
| ! | The branch has no upstream, or git errored |
If the arrows misalign in your terminal, switch to ASCII +/-
in the settings screen — press ,, in the demo above too.
Pull requests
If the gh CLI is signed in, a PRs tab appears next to Branches.
Press 4. One list is the pull requests you opened; m toggles to the ones waiting on your review. A count of both sits at the right end of the top bar, so you see it without opening the tab.
Press enter on a PR and manygit checks out its branch in the matching local
clone — it maps the PR to a repo by its origin remote, runs
gh pr checkout (which handles forks and tracking), and lands you on that
repo's Branches, ready to read the diff. It only does this when the repo is in view and
its working tree is clean. Otherwise it tells you which of the two is in the way.
Needs gh 2.12 or newer. Without it, the tab shows a hint and the rest of
manygit carries on as normal.
News
The top bar reads the last few days of commits back to you in English.
If you have claude or codex on your PATH, manygit hands them
the recent main-branch commits across every repo and rotates the summaries through the
top bar. Press n for all of them at once. Summaries are cached for four hours
and rewritten in place, so opening manygit doesn't re-summarize and the cache never
grows.
No AI tool installed? The top bar shows a repo count instead. Nothing else changes.
Config
Optional. The settings screen (,) writes this file for you.
| max_depth |
How many folders below the root to search for repos. Default 3.
Also a row in , — picking a depth re-walks the tree straight away, and a
depth with no repos under it is refused rather than leaving you an empty list
|
| open_cmd |
What o runs in the repo — code, cursor,
code -r. A trailing . is fine
|
| theme |
default, serika_dark, dracula,
nord, catppuccin, 8008
|
| status_glyphs | unicode arrows, or ascii if they misalign |
manygit never writes to the folder you launch it from, and never force-pushes, merges, or rebases. The one destructive action is discarding a repo's changes with d / D, and it always asks first.