Git history analysis·for any repository

Your codebase already knows where the bugs live.

Lynix Detective reads your Git history and finds the files behind a disproportionate share of the bugs, merge conflicts and rework — and tells you what to do about each one.

Free for 3 scans a month · your code never leaves your machine
express · 6,157 commits · analysed in 3.2s
FileRiskLevelChangesTestedFixesConflicts
lib/response.js89.8critical39255%8122
lib/request.js70.9critical17745%217
lib/application.js69.8high18038%2710
lib/utils.js60.9high10752%1414
Whyresponse.js: 81 of 392 changes were fixes · 22 real merge conflicts · 80 different developers · the function send() is 108 lines with 22 branch points.Safe to touch?216 of those 392 changes came with a test change — better covered than the risk score alone suggests.What to doStart with send() — extracting it is where a refactor pays off first.
6,157commits replayed
485merges re-run to recover conflicts
3.2sfor the whole repository
0lines of code uploaded

Measured on expressjs/express — a public repository you can run it against yourself.

Beyond the score

Two things a risk number cannot tell you

How much trouble a file has caused is one question. Whether you can safely change it is another.

Is anyone testing it?

Read from the history rather than from a coverage run: how often a file changed in a commit that also touched a test. No test runner, no build, no CI — and it works whatever the language.

express · lib/express.js33 of 153changes came with a test change. Its neighbour response.js manages 216 of 392.

Who is the only one who knows?

A file everyone edits is one risk. A file one person wrote and then left behind is a worse one — and it is invisible to any metric that merely counts authors.

express · lib/view.js84% one authorwho has not committed to the project in over twelve years.
The difference

Why this finds what linters miss

Static analysis reads the code as it is today. Lynix reads what has happened to it.

A linter asks
Lynix asks
Is this line formatted correctly?
Has this file been repaired 81 times in 392 changes?
Is this function longer than 50 lines?
Do its parts ever change independently, or always together?
Is this variable unused?
Did 80 different people have to touch it?
Does the code pass today's rules?
Is this file getting worse, or is the rest of the repository getting better?
What it measures

Six signals, crossed against each other

No single number says much on its own. The report is built from all of them together.

Fix pressure

01

How many of a file's changes were repairs — 81 of 392 for express's response.js. A high share is the strongest single predictor that the next change breaks something too.

Merge conflicts, recomputed

02

Git stores the result of a merge, not the conflict. Lynix replays every merge against its base to recover the files people actually had to untangle by hand — 95 of express's 485 merges.

Churn crossed with complexity

03

A config file that changes daily is not a problem; a 1,050-line file with 106 branch points that changes daily is. Lynix measures both and only flags the intersection.

It can tell you not to refactor

04

Mapping past changes onto functions shows whether a file's parts move independently. When they always move together, it says keep it as one — an answer no size metric can give.

Pressure over time

05

Every score is replayed across the project's history against today's yardstick, so a rising line means this file got worse — not that the rest of the repo improved.

Files that move together

06

When two files keep changing in the same commits, the history has found a dependency no import graph shows. The report names the partner file — and how often it tagged along.

How it works

Three steps, about a minute

01

Point it at a repository

Open any local Git repository. No configuration, no CI job, nothing to add to the project itself.

02

It replays the history

Commits, diffs and merges are re-run to measure how every file has actually been treated over time.

03

You get a ranked report

The riskiest files first, the reason behind each score, and what to do about it — split, cover with tests, or leave alone.

Questions

Before you download

Does my code leave my machine?

No. The analysis runs entirely on your computer. Only the summary you choose to sync — file names, scores and counts — reaches the dashboard. The contents of your files never do.

Which languages does it work with?

The history analysis works on any file, in any language. Complexity and structure are measured for Python, JavaScript and TypeScript (including Svelte and Vue), Rust, Go, Java, Kotlin, Scala, C#, and C, C++ and Objective-C.

How large a repository can it handle?

It reads the full history rather than a sample. express, at 6,157 commits, takes about three seconds on a laptop; a larger repository takes proportionally longer.

Do I need a server or a CI pipeline?

Neither. It is a desktop application that reads the repository already on your disk. You sign in once so that scans can sync to your dashboard and build up history.

What happens when the free scans run out?

The app says so before a scan starts, so none is lost half-way. Everything already scanned stays available, and the allowance resets on the first of each month.

Can I cancel a subscription?

At any time, from the billing portal. The plan stays active until the end of the period you have already paid for.

How can it judge tests without running them?

It does not run anything. It reads how often a file changed in a commit that also touched a test, which answers a question coverage percentages do not: whether anyone actually adjusts the tests when this code moves. Where a language keeps unit tests inside the file they cover, as Rust does, it says so instead of reporting a false gap.

Do you collect my colleagues' names?

Author names come from the commits in your own repository and are used to work out who holds a file. They are part of the scan summary you choose to sync, and they stay in your dashboard — never shared, never used for anything else.

Pricing

Free to try, €9 once it earns it

Free€03 scans a month, full analysis
Pro€9Unlimited scans, cancel any time
Team€29Shared dashboard — coming soon

Point it at your repository.

The first 3 scans are free — the report takes about a minute.