Manage, inspect, and maintain multiple Git repositories from one place.
Gitreant combines “Git” with “Treant,” a mythical guardian of the forest. The name represents a tool that watches over, organizes, and maintains a forest of Git repositories.
Pronunciation: /ˈɡɪt.triːənt/ (git-ree-ant)
A web app that shows commit graphs of local git repositories side by side in a single-page app. Inspired by k1LoW/mo, it ships as a single Rust binary with an embedded React SPA.
$ gitreant # discover .git from the current directory
$ gitreant ../foo ../bar # show multiple repositories at onceRunning gitreant again from another directory adds that repository to the
already-running server, so everything appears on the same page
(single-instance behavior, like mo).
The launcher detaches by default: the server keeps running in the background
and control returns to your shell. Stop it with gitreant --shutdown, or use
--foreground to keep the server attached to the terminal.
- Commit graph rendering with lanes and colors computed server-side; merge-commit messages are dimmed, and clicking a hash copies the full id
- Right-click a branch badge to copy its name, check it out, or merge it
into the current branch (server-side
git switch/git merge); right-click a commit to tag it, or a tag badge to delete the tag. Tags, the stash and branches render as distinct badges - Click a commit to see its full message, signature state (with the signing key id, click to copy), and changed files (flat or tree view) with line counts; click a file (or "Diff all") to see diffs inline or side-by-side, with intra-line changes highlighted
- Select diff lines via the line-number gutter (shift-click for ranges) to copy them or a GitHub permalink
- Fetch button runs
git fetchfor every shown repository (requires git); a toggleable bottom pane logs the executed commands and your UI actions - Signed commits carry a badge in the graph: Verified / Unverified when a local gpg can check the signature, plain Signed otherwise
- Branch badges carry a GitHub mark linking to their open pull request when
the
ghCLI is installed and authenticated; squash-merged branches that still exist get a dashed link to the commit their PR landed as - Multiple repositories in one SPA: a drawer to list/add/remove, tabs to switch
- Live updates via Server-Sent Events when repositories are added or removed, plus a reload button to pick up new commits
- Native folder picker for adding repositories
- Detaches from the terminal by default;
--shutdownstops the server - A command palette (Ctrl+K / Cmd+K) for switching repositories and running fetch, reload, theme and other actions from the keyboard
- Dark/light theme toggle, and a settings dialog for the UI language (auto / English / Japanese) and for rendering action buttons as icons, icons with labels, or labels only
- Single self-contained binary — no runtime dependencies
Requirements: Rust (stable), Node.js + pnpm.
$ make build # build the frontend and embed it into a release binary
$ ./target/release/gitreantgitreant [PATH...]
-p, --port <PORT> port to listen on / connect to (default 4000)
--no-open do not open the browser automatically
--foreground run the server in the current terminal instead of detaching
--shutdown stop the running gitreant server and exit
gitreant doctor check the environment: git (required), gh and gpg
(optional feature enablers), and whether a server is
already running on the port; exits non-zero when a
required tool is missing
gitreant restart restart the running server, keeping the repositories it
shows; a fresh process re-verifies every signature and
picks up a rebuilt binary
gitreant refresh re-verify commit signatures in place, without restarting
(use after adding a key to your gpg keyring)
See docs/CONTRIBUTING.md for development setup, architecture, and testing. Planned work lives in docs/ROADMAP.md.
Licensed under either of the following, at your option:
- MIT License (LICENSE-MIT)
- Apache License 2.0 (LICENSE-APACHE)
SPDX-License-Identifier: MIT OR Apache-2.0
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.