The health of a git repository, at a glance. One command, zero config, no server, no account.
gitpulse reads your git history and shows you what matters: how active the project is, who
actually knows the code, which files keep changing, and where you're one resignation away from
trouble.
Every codebase has a few files that change constantly and a few directories only one person
understands. Those are where bugs, merge conflicts and onboarding pain come from. You can dig
this out of git log with a pile of shell, or you can run:
gitpulseUse it to:
- Onboard to a new repo: see who to ask about what, and which files are the beating heart.
- Plan refactors: hotspots are the files where cleanup pays off most.
- Spot risk: a bus factor of 1 in
billing/is worth knowing before someone goes on leave. - Show off: a GitHub-style contribution graph for any repo, in your terminal.
# Go
go install github.com/Fahnoee/gitpulse@latest
# Nix (run without installing)
nix run github:Fahnoee/gitpulse
# Binaries for Linux, macOS and Windows
# → https://github.com/Fahnoee/gitpulse/releasesIt's a single static binary that uses only the Go standard library. All it needs is git on your PATH.
| Command | What it shows |
|---|---|
gitpulse |
Overview: summary, heatmap, top authors, hotspots, bus factor |
gitpulse heatmap |
GitHub-style contribution graph (fits your terminal width) |
gitpulse punchcard |
Commits by weekday × hour, in each author's own timezone |
gitpulse authors |
Commits, lines added/removed, share, and last activity per person |
gitpulse hotspots |
Files ranked by change frequency, weighted by churn |
gitpulse busfactor |
Per directory: the fewest people who wrote ≥50% of the code |
-C dir Run as if started in dir
--since date Only commits after date ("6 months ago", "2025-01-01", ...)
--until date Only commits before date
-n N Max rows to show (0 = all)
--weeks N Weeks shown in the heatmap
--depth N Directory depth for busfactor (default 1)
--exclude pat Ignore files matching a glob (repeatable): "*.md", "docs/"
--all Include files that no longer exist (hotspots, busfactor)
--json Machine-readable output
--no-color Disable colors (NO_COLOR is respected too)
Anything after -- is passed to git as a pathspec, so you can focus on part of a monorepo:
gitpulse hotspots --since "1 year ago" -n 20
gitpulse busfactor --depth 2 -- services/
gitpulse authors --json | jq '.[] | select(.commits > 50) | .name'- One
git logpass. History is streamed fromgit log --numstatand analyzed in memory. Large repos stay fast: fzf (3.6k commits, 13 years) takes under a second. - Renames are followed. If
src/app.gobecamelib/app.go, its whole history counts towardlib/app.go. - Duplicate identities are merged. Commits by the same person under several emails or name
spellings are combined.
.mailmapis honored too. - Noise is filtered. Lockfiles (
package-lock.json,go.sum,Cargo.lock, …) and minified assets are ignored, and merge commits are skipped. Deleted files are left out of hotspots and bus factor unless you pass--all. - Hotspot score =
commits × (1 + log10(churn + 1)): how often a file changes counts most, and big rewrites still rank higher. - Bus factor is the fewest authors who together wrote at least half of the changed lines in a directory. 1 is red, 2 is amber, 3+ is green.
- Heatmap and punchcard scale by quartiles, so one huge import day doesn't wash out the rest of the year.
nix develop # go, gopls, git, goreleaser
go test ./...
go run . -C ~/some/repoReleases are cut by pushing a v* tag; GoReleaser builds the binaries.
MIT