$ manygit

error: no terminal here — that's a phone in your hand.

it's a command-line tool.

manygit lives in a terminal — a real keyboard, a wide screen, a computer that isn't also a phone. there's honestly nothing for you to do on this screen.

$ manygit --anyway

are you sure?

the demo won't run down here — it needs the keys, and your screen is made of glass. you'd be reading about a keyboard app with no keyboard. but it's your data plan.

$ manygit --tell-me-anyway

fine. the whole pitch:

manygit is a lazygit-style TUI for a folder full of git repos. point it at a directory and every repo underneath lands on one screen — its branch, and whether it's ahead, behind, or dirty. then fetch, pull, push, or switch branches on the one under the cursor, without cd-ing around.

that's it. i'm not printing the install command down here — you can't paste it into a terminal you're not holding. so go open manygit on a real computer (the kind with a keyboard), like i already told you.

— see you on a bigger screen.

manygit v1.0.8 github
single binary
macOS · Linux

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.

$curl -fsSL https://raw.githubusercontent.com/rabeeh-ta/manygit/main/install.sh | bash
other ways to install
A working copy of the interface, running here. The git is fake — the keys are the real keys. click to start it, then type · esc leaves swipe it · tap the keys below
panes
try

Install

One command. It drops a single binary in ~/.local/bin.

$curl -fsSL https://raw.githubusercontent.com/rabeeh-ta/manygit/main/install.sh | bash

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

$git clone https://github.com/rabeeh-ta/manygit && cd manygit && go build -o ~/.local/bin/manygit .

Needs Go 1.24 or newer.

Then run it

$manygit # scan the current directory
$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 — 34, 567. 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.

~/.config/manygit/config.yml
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.