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.
| File | Risk | Level | Changes | Tested |
|---|---|---|---|---|
| lib/response.js | 89.8 | critical | 392 | 55% |
| lib/request.js | 70.9 | critical | 177 | 45% |
| lib/application.js | 69.8 | high | 180 | 38% |
| lib/utils.js | 60.9 | high | 107 | 52% |
Measured on expressjs/express — a public repository you can run it against yourself.
How much trouble a file has caused is one question. Whether you can safely change it is another.
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.
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.
Static analysis reads the code as it is today. Lynix reads what has happened to it.
No single number says much on its own. The report is built from all of them together.
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.
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.
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.
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.
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.
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.
Open any local Git repository. No configuration, no CI job, nothing to add to the project itself.
Commits, diffs and merges are re-run to measure how every file has actually been treated over time.
The riskiest files first, the reason behind each score, and what to do about it — split, cover with tests, or leave alone.
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.
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.
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.
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.
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.
At any time, from the billing portal. The plan stays active until the end of the period you have already paid for.
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.
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.
The first 3 scans are free — the report takes about a minute.