graphkeeper is a graph-based Git TUI for people who manage repositories.
It keeps branch topology, remote state, tags, and stash state visible at the same time so you can make maintenance decisions from the graph instead of guessing from command output.
This README reflects the current version in VERSION.
git_workflow_condensed_40s.mp4
- Demo
- Overview
- Why It Exists
- Who It Is For
- What It Helps You Do
- What It Is Not
- Quick Start
- CLI
- Working Model
- Keyboard
- AI-Assisted Development
- Local Diagnostic Logs
- Alpha Note
- Release Notes
- Docs
graphkeeper is built for the maintainer view of Git.
It is for the person who needs to answer questions like:
- Where does this branch actually point?
- Is FF possible, or do I need a merge or rebase?
- Which commit should be tagged as a release?
- Is there local work to stash before switching focus?
- What is the safest next operation on this repository?
The UI is graph-first on purpose. The commit graph is the main surface, while Current, Remote, and Tags provide supporting context.
Inspired by Owen's HIPHOP, graphkeeper asks the same kind of questions from a
maintainer's point of view: who owns the current state, where the repository is,
and what needs to happen next.
who am I (develop)
when am I (Tue Jul 28)
where am I (a34bb6eb)
what am I (have to merge)
how am I (rebase or merge)
why am I (for apply)
The answer is the graph. It keeps the repository's shape visible while you make the next Git decision.
This tool is for people who manage repositories rather than just contribute to them.
- release managers
- maintainers
- engineering leads who review branch state
- people who teach others how to read Git topology
If you need to explain Git history to someone else, this tool is especially useful because it keeps the graph visible while you talk through the decision.
- inspect the commit graph quickly
- see current branch, upstream, remotes, and tags in one place
- understand ahead, behind, and diverged states
- decide whether fast-forward is possible
- create or switch to a branch from a graph point
- tag a release point
- stash or clean local work when needed
- keep the selected graph context visible while navigating
graphkeeper is not a full Git cockpit.
It is not trying to replace tools like lazygit for file staging, diff browsing, or everyday commit authoring.
It is narrower on purpose: graph awareness, repository shape, and maintainer-style decisions.
It also does not handle conflict resolution inside the TUI. When an operation conflicts, you finish the resolution in another Git-capable tool.
Set the application version in VERSION, then build the binary:
./scripts/buildRun it:
./graphkeeperShow the configured build version:
./graphkeeper --versionThe build script reads VERSION and injects it into the binary. You can pass a
different output path as its first argument:
./scripts/build /tmp/graphkeeperOr run it directly:
go run ./cmd/graphkeeperUse --help or --version before starting the TUI:
./graphkeeper --help
./graphkeeper --versionThese two options work without a Git repository. Unknown options and
positional arguments return exit code 2 with usage text. See the CLI
reference for the complete behavior and
build-and-run guide for troubleshooting.
The graph is the primary mental model.
- each row is a commit
- edges show ancestry
- branch labels show where refs point
- remote labels show what still lives on origin
- tag labels show release points
- Graph rows keep the topology
*and show stash/tag state in a visibleS,T, orS·Tcolumn - the Graph page line explains the state markers as
S stash · T tag;S·Tmeans both markers together
The usual maintainer flow looks like this:
- Inspect the graph and find the current point of truth.
- Check whether the branch is clean, ahead, behind, or diverged.
- Decide whether to merge, rebase, reset, tag, or switch branches.
- Keep the graph visible while you verify the choice.
- Graph occupies the full-height left surface.
- Details, Local, Remote, and Tags are stacked in the right rail.
- Global core keys are shown in the main footer; active-section actions are
available through the section-aware
?overlay, not as persistent panels. tab/shift+tabswitch sections,j/korup/downmove, andqquits.?shows the hidden hotkeys for the active section. In an open overlay,qcloses it andesckeeps its existing close/back behavior.- Graph rows show a five-character commit hash, no date column, restored author
metadata when space permits, and a narrower internal
graphtopology column.
spacecheckout the selected commit or refmmergerrebasesresetddelete branchppullPpushttag the selected commitopop stash at HEADHjump to HEAD
spacecheckout the selected branchsstash changescclean working treeddelete branch
spacecheckout the selected remote branchppullddelete remote branch
enterjump to the selected tag in the graphPpush the selected tagddelete tag
Product direction, requirements, prioritization, and final decisions are handled by the project maintainer. Architecture, implementation, tests, and documentation are developed with AI assistance. The maintainer reviews the changes, verifies the behavior, and is responsible for the final code.
Graphkeeper does not send telemetry or diagnostic logs to the project author or a third-party service. When an event occurs, it may write local JSON Lines events to graphkeeper-events.jsonl in Go's temporary directory: usually /tmp on Linux and $TMPDIR on macOS.
Events cover repository loading, fetch and pull checks, branch and tag operations, stash loading, action previews and executions, conflicts, and errors. Each event contains a timestamp, source, event name, and optional fields such as repository path, branch, commit, action, target, count, or error text. The repository path and Git error messages may contain local path or repository details.
Graphkeeper may still contact configured Git remotes when you explicitly run Git operations such as fetch, pull, or push. This is separate from local diagnostic logging.
To remove the log on Unix-like systems:
rm -f "${TMPDIR:-/tmp}/graphkeeper-events.jsonl"Read the version in VERSION as a concept and workflow preview, not a finished product.
This README describes the current shape of the product, not a promise of final polish.
The core graph workflow is in place, but the product is still evolving. Expect the UI and shortcut map to keep tightening as the maintainer flow gets sharper.
What works now:
- graph navigation
- current / remote / tag inspection
- branch, merge, rebase, reset, push, pull, stash, and tag flows
- maintainer-style graph reading with ref context visible
What is intentionally out of scope:
- conflict resolution inside the app
- a full file-level Git workflow
- CHANGELOG - release history and notes
docs/structure.md- current code mapdocs/roadmap.md- next work orderdocs/highlighting-color-map.md- UI color mapdocs/cli-reference.md- CLI options, exit codes, and version resolutiondocs/howto-build-and-run.md- build, verify, and run the CLIdocs/archive/- older plans and moved docs