Owner Map
Back to SkillSafe

Who actually knows this code?

Paste the output of one git log command. Owner Map works out, in your browser and for free, who holds the recent knowledge of every file — weighted so a commit from four years ago counts a sixteenth of the same commit today — which sensitive paths have a bus factor of one, whose files have lost their owner, and where your CODEOWNERS file claims something the history flatly contradicts. Then three model lanes: review the risk, plan the handover before somebody leaves, or cut the change set you have in flight into pull requests that each need the fewest reviewer groups.

Both are free and need no account: the example loads a 148-commit history for a fictional payments repository, and the finished review is a saved model reply rendered locally — no run, no charge. Your own export never leaves this page; a run sends only the numbers computed from it.

Measure
Plan
Ship

Ownership risk review

Where the knowledge is concentrated, which sensitive paths have a bus factor of one, and what CODEOWNERS claims that the history contradicts.

Run this in your repository, paste the output below
git log --no-merges --numstat --date=short --pretty=format:"::%H|%an|%ae|%ad|%s" > history.txt

Add --since="18 months ago" to bound it, or a pathspec such as -- services/ to scope it to one area. The plain git log --numstat shape is parsed too, but it carries no commit subjects, so the lanes lose the one place a commit's intent is written down.

Drop history.txt here, or paste below. Read in your browser, up to 10 MB. Nothing uploads, ever — not even when you run.
nothing pasted yet
Three optional inputs that change the answer more than anything else here

Without it there is nothing to reality-check. With it you get the gaps, the rules whose owners have never touched the code, and the rules a later rule silently shadows.

One person per line, matched on e-mail or full name. A bare name means left. This is what turns “one owner” into “no owner”.

Glob patterns, one per line: ** crosses directories, a leading / anchors at the root, a trailing / means the whole directory. Leave it as loaded to use the defaults.

Paste a git history export to begin.

Your past runs

Runs you make while signed in are saved to your account and listed here, on whatever machine you are at.

What this measures, and what it cannot

A file's owner is not whoever touched it last, and it is not whoever wrote the most lines in 2019. Owner Map gives every commit a weight that halves each year — 0.5 ^ (age_in_days / 365), multiplied by 1 + log10(1 + lines changed) so a 900-line vendored update does not outrank ten real fixes. An author's share of a file is their weight over the file's total, and the bus factor is the smallest number of authors whose shares reach one half. HHI — the sum of squared shares — says whether the remainder is one deputy or five equal contributors.

Two corrections make the difference between a report a lead acts on and a list nobody reads. Automation is not a maintainer: commits by dependabot, renovate, release bots and CI identities are counted in the totals but earn no ownership, because knowledge a bot holds cannot be handed over. Generated output is not knowledge: lockfiles, vendored bundles, minified assets and snapshots have their risk discounted, and a file with one or two human commits in the window is marked as thin history rather than as owned.

The CODEOWNERS check is a comparison, not a lint. Git applies the last matching rule, which is why a /docs/ @team line followed by *.md @guild silently hands the docs directory to the guild — Owner Map reports that as a shadowed rule and names the rule doing the shadowing. It also reports paths no rule matches at all, and rules whose declared owners are not among the three biggest contributors to the code they are supposed to review.

What it cannot tell you: who understands a file as opposed to who edited it, who reviewed the changes, who wrote the design document, or who is on the team this week. It reads a history; it never runs git, never authenticates against a forge, never writes to your disk. The export stays in the page — a run sends the aggregate, and the page prints exactly what was sent. If you paste a history from a private repository, the file paths and author names in the aggregate are what the model sees; nothing else.