MCPcopy Index your code
hub / github.com/affromero/gitpane

github.com/affromero/gitpane @v0.8.2

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.8.2 ↗ · + Follow
762 symbols 1,949 edges 57 files 128 documented · 17%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

gitpane

<strong>Multi repo Git workspace dashboard for the terminal</strong>






<a href="https://github.com/affromero/gitpane/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/affromero/gitpane/ci.yml?branch=main&label=CI&logo=github&style=flat-square" alt="CI"></a>
<a href="https://github.com/affromero/gitpane/actions/workflows/security.yml"><img src="https://img.shields.io/github/actions/workflow/status/affromero/gitpane/security.yml?branch=main&label=Security&logo=github&style=flat-square" alt="Security"></a>
<a href="https://github.com/affromero/gitpane/actions/workflows/coverage.yml"><img src="https://img.shields.io/github/actions/workflow/status/affromero/gitpane/coverage.yml?branch=main&label=Coverage&logo=github&style=flat-square" alt="Coverage"></a>
<a href="https://github.com/affromero/gitpane/actions/workflows/docs.yml"><img src="https://img.shields.io/github/actions/workflow/status/affromero/gitpane/docs.yml?branch=main&label=Docs&logo=github&style=flat-square" alt="Docs"></a>
<a href="https://github.com/affromero/gitpane/actions/workflows/gitleaks.yml"><img src="https://img.shields.io/github/actions/workflow/status/affromero/gitpane/gitleaks.yml?branch=main&label=gitleaks&logo=github&style=flat-square" alt="Gitleaks secret scan"></a>



<a href="https://crates.io/crates/gitpane"><img src="https://img.shields.io/crates/v/gitpane.svg?logo=rust&style=flat-square&color=blue" alt="crates.io"></a>
<a href="https://docs.rs/gitpane"><img src="https://img.shields.io/docsrs/gitpane?logo=rust&style=flat-square" alt="docs.rs"></a>
<a href="https://deps.rs/repo/github/affromero/gitpane"><img src="https://deps.rs/repo/github/affromero/gitpane/status.svg?style=flat-square" alt="Dependency status"></a>
<a href="https://github.com/affromero/gitpane/blob/main/Cargo.toml"><img src="https://img.shields.io/badge/MSRV-1.88.0-dea584?style=flat-square&logo=rust" alt="MSRV 1.88.0"></a>
<a href="https://crates.io/crates/gitpane"><img src="https://img.shields.io/crates/d/gitpane?label=downloads&style=flat-square&color=blue" alt="Downloads"></a>



<a href="https://github.com/affromero/gitpane/releases/latest"><img src="https://img.shields.io/github/v/tag/affromero/gitpane?label=release&style=flat-square&color=blue" alt="GitHub Release"></a>
<a href="https://github.com/affromero/gitpane/releases"><img src="https://img.shields.io/github/downloads/affromero/gitpane/total?label=release%20downloads&style=flat-square&color=blue" alt="Release downloads"></a>
<a href="https://github.com/affromero/gitpane/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square" alt="License: MIT"></a>
<img src="https://img.shields.io/badge/platform-linux%20%7C%20macos%20%7C%20windows-lightgrey?style=flat-square" alt="Platform">
<img src="https://img.shields.io/github/languages/top/affromero/gitpane?style=flat-square&color=dea584" alt="Language">
<a href="https://github.com/affromero/gitpane/blob/main/AGENTS.md"><img src="https://img.shields.io/badge/AGENTS.md-7c3aed?style=flat-square" alt="AGENTS.md"></a>

Monitor all your repos at a glance. See branch, dirty state, ahead/behind, active worktrees, changed files, and commit history without leaving the terminal.

gitpane demo

Install

cargo install gitpane

That's it. No cloning, no building from source. Runs on Linux, macOS, and Windows.

Don't have Rust? Download a prebuilt binary from GitHub Releases. It is a single static binary with zero dependencies.

```bash

macOS (Apple Silicon)

curl -LO https://github.com/affromero/gitpane/releases/latest/download/gitpane-aarch64-apple-darwin.tar.gz tar xzf gitpane-aarch64-apple-darwin.tar.gz && sudo mv gitpane /usr/local/bin/

macOS (Intel)

curl -LO https://github.com/affromero/gitpane/releases/latest/download/gitpane-x86_64-apple-darwin.tar.gz tar xzf gitpane-x86_64-apple-darwin.tar.gz && sudo mv gitpane /usr/local/bin/

Linux (x86_64, statically linked)

curl -LO https://github.com/affromero/gitpane/releases/latest/download/gitpane-x86_64-unknown-linux-musl.tar.gz tar xzf gitpane-x86_64-unknown-linux-musl.tar.gz && sudo mv gitpane /usr/local/bin/

Linux (ARM64)

curl -LO https://github.com/affromero/gitpane/releases/latest/download/gitpane-aarch64-unknown-linux-gnu.tar.gz tar xzf gitpane-aarch64-unknown-linux-gnu.tar.gz && sudo mv gitpane /usr/local/bin/ ```

On NetBSD? gitpane is available as a community-maintained pkgsrc package in devel/gitpane, thanks to @0323pin:

sh pkgin install gitpane # prebuilt binary package cd /usr/pkgsrc/devel/gitpane && make install # build from pkgsrc source

Then run:

gitpane                     # Scans ~/Code by default
gitpane --root ~/projects   # Scan a specific directory
gitpane diagnostic          # Print config, watcher, and workspace diagnostics

Update

If you installed with cargo, gitpane can update itself:

gitpane update              # checks for a newer release, then runs cargo install
cargo install gitpane       # the equivalent manual command, overwrites the old binary

If you installed from a GitHub Release, download the latest binary for your platform using the same commands from the install section above.

On NetBSD, update through pkgsrc instead of gitpane update, which shells out to cargo install and would replace the package-managed binary with a cargo-built one.

Why gitpane?

If you work across multiple repositories, such as microservices, monorepos with submodules, or a mix of projects, you know the pain of checking status one directory at a time. Existing TUI tools focus on one repo at a time:

Tool Multi repo Auto refresh Worktrees Mouse Commit graph Split diffs Push/Pull
gitpane Yes Yes Yes Yes Yes Yes Yes
lazygit No No No Yes Yes Yes Yes
gitui No No No Yes Yes Yes Yes
tig No No No No Yes No No
git-delta No No No No No Yes (pager) No
grv No No No Yes Yes No No
git-summary Yes (list only) No No No No No No
mgitstatus Yes (list only) No No No No No No
gita Yes (CLI only) No No No No No Yes
gitbatch Yes (TUI) No No No No No Yes (batch)
gwq Yes (CLI) No Yes No No No No
Canopy Yes (CLI) No Yes No No No No

lazygit and gitui are excellent for deep single repo work like staging hunks, interactive rebase, and conflict resolution. gitpane is the workspace level dashboard. It shows every repo at once, lets you drill into anything, and keeps you in the terminal. They complement each other.

A newer category of worktree dashboards has grown up around parallel AI agents, such as gwq (worktree status list with tmux integration), Canopy, and git-worktree-manager. gitpane overlaps here, it expands each repo into its per worktree branch, ahead/behind, dirty, and submodule state, but pairs that with a full commit graph, split diffs, and remote ops the dashboard-only tools lack. With o to open any repo or worktree in a new tmux pane (or your editor), it is both the overview and the launchpad.

Screenshots

Three panel overview

Repos on the left show branch, dirty state (*), ahead/behind arrows (↑↓), worktree count (), dirty submodules (), unpushed submodule pointer (), stash count ($), and file count. Changes in the middle. Commit graph on the right.

Three panel overview

Split diff view

Click a changed file (or press Enter) to see its diff side by side. File list stays navigable on the left.

Split diff view

Commit detail drill down

Click a commit in the graph to see its files. Click a file to see the commit diff. Layered Esc dismissal: diff → files → graph.

Commit detail drill down

Features

  • Multi repo overview: Scans ~/Code (configurable) for git repos. It shows branch, dirty indicator (*), ahead/behind arrows (↑↓), worktree count (), dirty submodule (), unpushed submodule pointer (), stash count ($), and change count.
  • Worktree awareness: Shows the number of linked git worktrees per repo (⎇2). In the agentic AI era, tools like Claude Code create worktrees for parallel development. gitpane lets you see which repos have active parallel work.
  • Open / jump in: Press o (or the Open context menu item) to drop into the selected repo or worktree, a new tmux pane at its directory by default, or any [open] command you configure (cursor {path}, code {path}, ...). Turns the overview into a launchpad instead of a dead end.
  • Agent liveness: A marks any repo or worktree that has a live tmux pane open inside it, so at a glance you can see which parallel agents are actively working where. tmux only; toggle with [ui] show_liveness.
  • Filesystem awareness: Watches repo roots and Git metadata for commits, checkouts, and new repos. Local polling catches nested worktree file changes without overwhelming Linux inotify.
  • Commit graph: Lane based graph with colored box drawing characters, up to 200 commits.
  • Split diff views: Click a file to see its diff side by side. Click a commit to see its files and per file diffs.
  • Full mouse support: Click to select, right click for context menu, scroll wheel everywhere.
  • Push / Pull / Rebase: Right click context menu with git operations that account for ahead and behind state. Explicit origin <branch> is used for reliability.
  • Add and remove repos: Press a to add any repo with tab completing path input. Press d to remove. Press R to rescan.
  • Sort repos: Cycle between alphabetical and dirty first with s.
  • Copy to clipboard: Press y to copy selected item from any panel (OSC 52).
  • Configurable: TOML config for root dirs, scan depth, pinned repos, exclusions, frame rate.
  • Responsive layout: Three horizontal panels on wide terminals, vertical stack on narrow ones.
  • Cross platform: Linux, macOS, Windows.

Keybindings

Global

Key Action
? Toggle keybindings help overlay
Tab / Shift+Tab Cycle focus between panels
r Refresh all repo statuses
R Rescan directories for repos (clears exclusions)
g Reload git graph for selected repo
o Open selected repo/worktree (new tmux pane, or [open] command)
v Review selected repo/worktree's diff vs its base branch (new tmux window)
G Attach the live tmux session(s) for the selected repo/worktree
a Add a repo (opens path input with tab completion)
d Remove selected repo, or worktree if a worktree row is selected (with confirmation)
s Cycle sort order (Alphabetical / Dirty first)
w Toggle worktree subtree for the selected repo
S Toggle stash subtree for the selected repo
t Open the theme picker (live preview, Enter to persist)
y Copy selected item to clipboard
q Quit (or close diff if one is open)
Esc Navigate back through panels, then quit

Repos panel

Key Action
j / Next repo
k / Previous repo

Changes panel

Key Action
j / Next file
k / Previous file
Enter Open split diff view
Esc / h / Close diff view

Graph panel

Key Action
j / Next commit / file
k / Previous commit / file
h / l Scroll graph left / right
Enter Open commit files / file diff
Esc Close diff → close files → back
/ Search commits (message, author, short ID)
n / N Next / previous search match
f Toggle first parent mode
c Collapse / expand branch
H Expand all collapsed branches

Mouse

Action Effect
Left click Select item, switch panel focus
Click selected row Open diff / commit detail
Right click (repo list) Context menu (push, pull, copy path)
Scroll wheel Navigate lists or scroll diffs

Path input (a)

Key Action
Tab Autocomplete directory path (cycles matches)
Enter Add the repo
Esc Cancel
Ctrl+A / Home Cursor to start
Ctrl+E / End Cursor to end
Ctrl+U Clear line before cursor

Configuration

gitpane resolves its config file in this order (first existing file wins):

  1. $GITPANE_CONFIG (if set, treated as the full path; this overrides everything below and is also the save target)
  2. $XDG_CONFIG_HOME/gitpane/config.toml (if `$XDG_CONFIG_

Extension points exported contracts — how you extend this code

Component (Interface)
(no doc) [5 implementers]
src/components/mod.rs
ConfigEnv (Interface)
(no doc) [2 implementers]
src/config/load.rs

Core symbols most depended-on inside this repo

is_empty
called by 96
src/components/repo_list/mod.rs
query_status
called by 43
src/git/status/mod.rs
find
called by 37
src/git/graph/segments.rs
clear
called by 32
src/components/git_graph/mod.rs
push_line
called by 30
src/diagnostic.rs
set_rows
called by 18
src/components/git_graph/mod.rs
build
called by 17
src/git/graph/mod.rs
complete
called by 17
src/app/mod.rs

Shape

Function 444
Method 232
Class 62
Enum 22
Interface 2

Languages

Rust100%

Modules by API surface

src/config/tests.rs63 symbols
src/components/git_graph/mod.rs36 symbols
src/components/file_list.rs36 symbols
src/git/graph_render.rs34 symbols
src/session/launcher.rs31 symbols
src/components/repo_list/mod.rs31 symbols
src/components/context_menu.rs28 symbols
src/watcher.rs25 symbols
src/components/git_graph/tests.rs25 symbols
src/git/graph/tests.rs23 symbols
src/config/mod.rs23 symbols
src/app/mod.rs23 symbols

For agents

$ claude mcp add gitpane \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact