Gee is a powerful tool for managing multiple git repositories. It features a full-screen interactive TUI (Terminal User Interface) with live status updates, Vim-style navigation, and one-key actions — plus a traditional CLI for scripting and automation. All operations run concurrently using a worker pool for speed.
- Interactive Dashboard: Run
geeto launch a K9s-style full-screen TUI with live-updating repo status - Automatic Discovery: Gee scans your home directory for git repos and streams them into the dashboard as they're found
- Pinned Repos: Pin your important repos with
gee addso they always show up first in the dashboard and CLI commands - Vim Navigation:
j/kto move,g/Gto jump,/to filter repos by name - Teleport: Press
Enteron any repo to instantlycdinto it (requires shell integration) - One-Key Actions:
pto pull,eto exec a command - Remote Discovery: Press
dto browse your GitHub/GitLab repos, multi-select, and batch-clone them - Staleness Detection: Repos with dirty changes and no recent activity are flagged as
STALE - Context-Aware CLI: Run
gee statusinside a repo to target just that repo, or use--allfor everything - Zero Config: No config files to maintain — Gee uses a JSON cache at
~/.config/gee/cache.json - Concurrent Operations: Every operation runs in parallel across all repos
brew tap stcrestrada/gee
brew install gee
Upgrade:
brew update && brew upgrade gee
go install github.com/stcrestrada/gee@latest
Requires Go 1.21+.
Grab the latest release for your platform from the Releases page. Extract and place the gee binary somewhere on your PATH.
Available for: macOS (amd64, arm64), Linux (amd64, arm64), Windows (amd64).
brew uninstall gee
Add this to your shell config to enable teleport (Enter to cd into a repo):
Bash (~/.bashrc) / Zsh (~/.zshrc):
eval "$(gee --init)"Fish (~/.config/fish/config.fish):
gee --init | sourcePowerShell ($PROFILE):
function gee {
if ($args.Count -eq 0) {
$env:GEE_TELEPORT = "1"
$result = & gee.exe
$env:GEE_TELEPORT = $null
if ($result -and (Test-Path $result)) { Set-Location $result }
} else {
& gee.exe @args
}
}Without shell integration, the TUI will print the path but won't change your directory.
# Pin repos you care about
cd path/to/repo && gee add
# Launch the interactive dashboard
geeGee automatically discovers git repos under your home directory. Use gee add inside any repo to pin it — pinned repos appear first in the dashboard and are the default target for CLI commands.
Run gee with no arguments to launch the interactive dashboard.
The dashboard shows all your repos in a live-updating table with:
- Pin indicator (
*) for pinned repos - Branch name (with rebase/merge/cherry-pick state detection)
- Sync status (ahead/behind remote)
- Change counts (staged, modified, untracked, conflicts)
STALEbadge for repos with dirty changes and no recent file activity
The header shows total repo count, pinned count, and a scanning indicator while discovery is in progress. Status refreshes automatically every 5 seconds and after every action.
| Key | Action |
|---|---|
j / k |
Move cursor down / up |
g / G |
Jump to first / last repo |
a |
Toggle pin on the selected repo |
p |
Pull the selected repo |
P |
Pull all visible repos |
e |
Open exec prompt — run any shell command in the selected repo |
Enter |
Teleport — quit TUI and cd into the selected repo |
r |
Manually refresh status |
/ |
Filter repos by name |
d |
Open the Discovery view (requires gh or glab) |
q |
Quit |
Press d to open the Discovery view, which lists your remote repositories from GitHub or GitLab.
| Key | Action |
|---|---|
j / k |
Move cursor down / up |
Space |
Toggle selection on the current repo |
Enter |
Clone all selected repos and pin them |
Esc |
Return to the dashboard |
Discovery requires gh (GitHub CLI) or glab (GitLab CLI) to be installed. If neither is available, the d key is hidden from the help bar. GitHub is preferred when both are present.
All commands also work as traditional CLI subcommands for scripting and CI pipelines. Commands are context-aware: if you run them inside a cached repo, they target that repo. Otherwise, they target all pinned repos. Use --all to target every cached repo.
Pin the current git repo so it shows up in the dashboard and CLI commands:
cd path/to/repo
gee add
Pin all git repos in the current directory:
gee add --all
Interactively select which repos to pin:
gee add --all-select
Show a compact summary of your repos:
gee status
Example output:
✓ api main ↑2 ~3 modified ?1 untracked
✓ frontend dev +1 staged ~2 modified
✓ gee main clean
For full git status output, use verbose mode:
gee status --verbose
Target all cached repos (not just pinned):
gee status --all
Pull changes for your repos:
gee pull
gee pull --all
Run any command across repos concurrently:
gee exec git push origin main
gee exec git stash
gee exec npm install
gee exec "git stash && git pull && git stash pop"
gee exec --all git fetchAutomatically detect from the current directory:
gee remove
Specify repository name using flag:
gee remove -r repo_namegee remove --repo repo_nameGee stores all repo data in a JSON cache at ~/.config/gee/cache.json. There are two types of repos:
- Pinned: Repos you've explicitly added with
gee add. These are the default target for CLI commands and always appear first in the dashboard. - Discovered: Repos found automatically by scanning your filesystem. These appear in the dashboard but are not targeted by CLI commands unless you use
--all.
If you're upgrading from an older version of Gee that used gee.toml, the first time you launch the TUI it will automatically import your repos from gee.toml into the cache as pinned repos. No manual migration is needed.
Discovery requires gh (GitHub CLI) or glab (GitLab CLI). Install one:
brew install gh # GitHub
brew install glab # GitLab~/.config/gee/cache.json. You can inspect or edit it directly — it's plain JSON.
Gee is licensed under the MIT License. See the LICENSE file for more information.