Skip to main content
gitmole

gitmole

A toolkit for digging into any cloned git repository: who works on it, where the risk is, how old the code is, whether the repo itself is healthy, and whether anything sensitive was ever committed.

gitmole on react: the summary, and the watch list of files where the next bug is likely, with a backtest

Free. Any Stack. Local. Offline. Deterministic. Fast.

  • Free. MIT licence, no paid tier, no account, no token. A local clone needs no credentials, and a public owner/repo is cloned with plain git. Your gh login is only used for private repositories and for owner/*, and only when you ask for them. The tools it runs are open source too.
  • Any stack. It reads what every repository has: the git log, git blame and the files themselves.
  • Local & Offline. Everything runs against a clone on your machine. Nothing is uploaded, nothing phones home; the vulnerability database is a copy you download once.
  • Deterministic. No AI at runtime. Every finding is a plain rule over counts you can recompute by hand. The same clone gives the same report every time.
  • Fast. A 4,400-commit repository takes under thirty seconds.

Install

# macOS, or Linux with Homebrew: gitmole and the five tools it runs
brew tap antvinni/gitmole https://github.com/antvinni/gitmole
brew trust antvinni/gitmole
brew install gitmole

# anywhere else: scc, git-sizer, betterleaks, jscpd and osv-scanner on your PATH, then
pipx install gitmole

Linux package names, the release binaries, --plots and the pip caveats: docs/install.md.

Usage

gitmole .                              # the clone you are in
gitmole /path/to/clone                 # any local clone
gitmole owner/repo                     # clones into a temp dir first, with gh or plain git
gitmole 'owner/*'                      # every non-archived repo of a user or org, one summary table

gitmole . --markdown report.md         # the same report as a Markdown document
gitmole . --json report.json           # every table, the watch list and the findings
gitmole . --fail-on warning            # exit 3 if any finding is a warning or worse
gitmole . --risk main --risk-threshold 5   # exit 3 if the files changed since main are too risky
gitmole . --since 2y --full            # the current team, every row and column
gitmole --clean                        # list what gitmole left behind, delete on a yes

A CI job that runs gitmole . --fail-on critical --markdown - >> "$GITHUB_STEP_SUMMARY" blocks on secrets in source files and still posts the report. Every option: docs/cli.md.

What you get

The opening of the report for react, 35,263 commits since 2013, at a pinned commit; the picture above, as text:

╭─ react ──────────────────────────────────────────────────────────────────────────────────────────╮
│ 35263 commits  ·  2013-05-28 → 2026-09-16  ·  1880 identities  ·  branch main                    │
│ 681,078 lines in 4781 files  ·  JavaScript, TypeScript, Rust, CSS                                │
│ most commits on Wed at 16:00  ·  13% of commits are fixes  ·  1% of commits are reverts  ·  19%  │
│ of surviving code from 2026                                                                      │
│ 1 critical, 6 warnings, 8 notes                                                                  │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯

◎ Watch list
  file                                              why                                             
  ──────────────────────────────────────────────────────────────────────────────────────────────────
  compiler/packages/babel-plugin-react-compiler/s   changed 331 times · fixed twice in six months · 
  rc/Inference/InferMutationAliasingEffects.ts      Joe Savona wrote 98% of it ·                    
                                                    findNonMutatedDestructureSpreads() complexity 39
  packages/react-server/src/ReactFlightServer.js    changed 377 times · fixed once in six months ·  
                                                    renderModelDestructive() complexity 544         
  packages/shared/forks/ReactFeatureFlags.www.js    changed 583 times · fixed once in six months ·  
                                                    changes with                                    
                                                    packages/shared/forks/ReactFeatureFlags.test-ren
                                                    derer.www.js (77%) and 5 others                 
  packages/shared/ReactFeatureFlags.js              changed 575 times · fixed 6 times · changes with
                                                    packages/shared/forks/ReactFeatureFlags.test-ren
                                                    derer.js (80%) and 4 others                     
  packages/react-reconciler/src/ReactFiberWorkLoo   changed 342 times · fixed 4 times in six months 
  p.js                                              · flushSpawnedWork() complexity 48              
  ranked by churn × recent fixes × complexity × single ownership                                    
  6 months ago this list would have named 6 of the 211 files fixed since (a random 15 of the 1979   
  files that had changed more than once would name 0.3)                                             

The watch list is the point: the five files where the next bug is most likely, the reasons in words, and a backtest that says how the same list, drawn six months earlier, would have done against the fixes that followed. Between the header and that list the full report puts its findings, 15 for react (1 critical, 6 warnings, 8 notes); below it, tables for people, the knowledge map, the timeline, hotspots with their complexity trend, change coupling, complex functions and repo health. Every section is explained in docs/output.md.

Reports on repositories you know, each at a pinned commit with a fixed reference date, published as gitmole wrote them; the repo-health numbers come from git-sizer over the whole clone, so a fresh clone can differ there:

Repository Commits Lines Watch list backtest
curl 39,894 247,179 named 15 of the 239 files fixed in the next six months; a random pick would name 5.0
django 52,832 431,749 named 13 of the 213 files fixed in the next six months; a random pick would name 2.8
react 35,263 681,078 named 6 of the 211 files fixed in the next six months; a random pick would name 0.3
kubernetes 161,803 4,180,715 named 7 of the 338 files fixed in the next six months; a random pick would name 0.4

kubernetes's code-age step was skipped on gitmole's default time budget and its report says so; the duplicates step was skipped on the memory budget too and produced no section.

The tool set

One tool per question; together they cover what a single command can tell you about a clone.

Question Tool Install
What is this repo, at a glance; who commits, when, how much churn gitmole itself, from the git log built in
How big is the codebase, per language scc brew
Is the repo itself healthy (huge blobs, deep trees) git-sizer brew
Where is the risk: hotspots, coupling, ownership gitmole's own change analysis over git log --numstat built in
How old is the surviving code, per year and author gitmole's own blame pass (one git blame per file at HEAD) built in
Code-age and survival plots over time git-of-theseus pip, opt-in with --plots
Per-function complexity, length, parameters lizard pip, installed with gitmole; tracked code files only
Which blocks of code appear more than once jscpd brew
Have secrets ever been committed betterleaks brew
Do the dependencies have known vulnerabilities osv-scanner, offline against a local copy of the OSV database brew, plus a one-time database download

Why these and not others: docs/tools.md.

Docs

Safety

  • Everything is offline except the optional clone step, which uses your existing gh auth. None of the tools send data anywhere; osv-scanner runs against a local copy of its database that you download once, and gitmole never downloads it for you.
  • Remote targets are cloned into a fresh temp directory that is removed when the run ends. Local clones are only read, but the log export and the secrets scan touch all branches. gitmole --clean lists every directory gitmole created and deletes them after a y/N question.
  • Secret values never reach the output directory. betterleaks reports to gitmole in memory, and gitmole stores a short keyed hash in place of the value, the matched text and the commit message. The key is random, made for that one report and never saved.

License

MIT. gitmole runs the tools it wraps as separate processes and bundles none of them; their licences are listed in docs/tools.md.

Release files for gitmole 0.7.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gitmole 0.7.1
File Size Uploaded
gitmole-0.7.1.tar.gz 175.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for gitmole 0.7.1
File Interpreter ABI Platform
gitmole-0.7.1-py3-none-any.whl Python 3 none any Details

Total release size: 272.0 kB

Release files / gitmole-0.7.1.tar.gz

Download URL gitmole-0.7.1.tar.gz
Size 175.7 kB
Tags Source
SHA-256 checksum
How to use checksums
f39d96237bcf138ed299033ff7ceb7d8a091b3e0fdf3050135e1995f83adf7ae
BLAKE2b-256 checksum
How to use checksums
53c8aa5e3e65cf49690a8cb47fec6256b496fb62eea87dd6bb42acc2ede75fb4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Release files / gitmole-0.7.1-py3-none-any.whl

Download URL gitmole-0.7.1-py3-none-any.whl
Size 96.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2c5bf7077f0f1a398cd47c43a8a91e6e5aa8bd14168f1d21a37aefe0d1a1b7c7
BLAKE2b-256 checksum
How to use checksums
d3706bb2c75bd77c04e3937856390dc0d4184053814a1416435046243329636c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.

Transparency log

Release history Release notifications | RSS feed

0.30.0

2 release files

0.29.0

2 release files

0.28.0

2 release files

0.27.0

2 release files

0.26.0

2 release files

0.25.0

2 release files

0.24.0

2 release files

0.23.0

2 release files

0.22.0

2 release files

0.21.0

2 release files

0.20.0

2 release files

0.19.0

2 release files

0.18.0

2 release files

0.17.0

2 release files

0.16.0

2 release files

0.15.0

2 release files

0.14.0

2 release files

0.13.1

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.2

2 release files

This release

0.7.1 This release

2 release files

0.7.0

2 release files

0.6.15

2 release files

0.6.14

2 release files

0.6.13

2 release files

0.6.12

2 release files

0.6.11

2 release files

0.6.10

2 release files

0.6.9

2 release files

0.6.8

2 release files

0.6.7

2 release files

0.6.6

2 release files

0.6.5

2 release files

0.6.4

2 release files

0.6.3

2 release files

0.6.2

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page