Skip to content
nerlo.ai
Sign in

How scores are calculated

Every score on this site is produced by a deterministic formula: the same findings always produce the same score. This page documents that formula exactly — every constant, threshold, and deduction — so you can recompute any number you see here and check our work. If a score looks wrong, the formula (or a scanner) is wrong, and we want to know.

One badge ladder

Per-scanner badges and the composite badge use the same thresholds, so there is a single rule to learn:

BadgeScore range
Verified85 – 100
Caution60 – 84.99
Unsafebelow 60

Per-scanner scores

A scanner's score starts at 100 and loses points for each finding, by severity. The result is clamped to 0–100.

Finding severityDeductionNote
Critical40also caps the score at 59 (Unsafe) even if the arithmetic lands higher
High15one high on its own lands exactly on the Caution boundary (85)
Medium5one medium alone stays Verified (95)
Low2
Informational0.5

The composite score

The composite is a weighted mean over the components we could actually assess. Each scan phase's component score is the average of the scanners that completedin that phase; the weights below are renormalized to sum to 1.0 across only the phases that produced a result. A phase that has not been built yet, or that no scanner found applicable, is left out of the average entirely — it is never counted as a zero, so a clean partial scan is not dragged down by work we haven't done.

ComponentDefault weight
Static analysis (SAST)0.25
Dependencies / supply chain0.25
Fuzzing / injection resistance0.25
Deep behavioral audit0.15
Maintenance vitality0.10

Maintenance vitality

The vitality component measures whether a project is actively maintained, over the trailing 90 days. It is the mean of three sub-scores, each linearly interpolated and clamped to 0–100:

Where a signal simply doesn't exist (no issues ever filed, no dependencies), that sub-score gets full marks — absence of data is not treated as evidence of neglect.

“Your view” — the scanner filter

When you deselect scanners on a server page, the composite is recomputed from only the scanners you kept, each with equal weight (vitality joins as one additional equally-weighted term). Phase weights are deliberately dropped: the filter expresses “these are the tools I trust,” not “these are the phases I care about.” Behavioral deductions from honeypot evidence still apply — they are observed behavior, not a scanner's opinion, so they cannot be filtered out.

Check our work

Every scan stores its per-scanner reports, component scores, and the exact weights applied, immutably for 24 months. The scoring engine is a pure function: same inputs, same score. If you recompute a number from this page and get a different answer than we show, read our self-attestation for how to verify the scan pipeline itself, and tell us — publicly.