Ga naar hoofdinhoud

Quality matrix

This page is our own measurement, not an external quality assessment. It has two parts.

  1. Component checker scores. The Common Ground component checker scores each app from 0 to 100. The latest round ran on 13 November 2026.
  2. The quality matrix. Our estimate of the maintainability rating an external assessment would give, our own measures and every gate. An external assessment uses its own parsers and scoping, so its numbers can differ.

Component checker scores​

Measured on 13 November 2026, 04:01 to 04:19 UTC, with checker version d6a3b66. We measured openregister on main and every other app on development. The commit is the head we measured.

The checker rates 30 criteria in five categories: governance, security, architecture, maintainability, and deployment and operations. The score runs from 0 to 100, the rating from 1 to 5 stars. An app is endorsed when no mandatory criterion fails.

AppCommitScoreRatingEndorsedMandatory criteria that do not pass
openregister5af71ed90974.8yesnone
thematiqbafd06c33974.9yesnone
larpinq1137ab67c974.7yesnone
filinqe1f08e30b974.6yesnone
keepiq2f62be10393 (round: 89)4.3yesAPI design rules warn, 536 warnings. Secure coding passes since the checker fix, see below
versioniq2d33f50fe934.5yesAPI design rules warn, 87 warnings
integriq0a984caa0934.4yesAPI design rules warn, 25 warnings
hermiqbeeb8ec1c934.4yesAPI design rules warn, 6 warnings
humaniq8d29580c1934.4yesAPI design rules warn, no API spec found
planninq8fc73df3d934.4yesAPI design rules warn, no API spec found
pipelinq7933b59c4934.3yesAPI design rules warn, no API spec found
launchpad39f212172934.3yesAPI design rules warn, no API spec found
shillinqe7b76198c934.3yesAPI design rules warn, no API spec found
learniqc16800b62934.3yesAPI design rules warn, no API spec found
decidiq7cd7d1756934.3yesAPI design rules warn, no API spec found
stackiq7cd10138f924.5nocoverage fails, 65.17% of 80%
opencatalogi92b8e73e6904.3noAPI design rules fail, 1 error and 1 warning
portaliqa893a302a884.4nosecure coding fails, 23 findings, all in the vendored woo/static/js bundle
buildiq5f5f87c67884.3nocoverage fails, 79.92% of 80%. API design rules warn, no API spec found
dossiqd63da17a9884.4nocoverage fails, 75.80% of 80%. API design rules warn, no API spec found

The five-layer architecture criterion warns in every app, so the table leaves it out. The checker sees signals of several Common Ground layers in each repository.

  • Fleet. The mean score is 92.7, or 92.9 with keepiq's rescan. 15 of 20 apps are endorsed.
  • Blocked. Coverage holds back stackiq, buildiq and dossiq. buildiq misses 80% by 0.08 points. API design rules hold back opencatalogi. Secure coding holds back portaliq.
  • Coverage is self-reported. The checker reads the committed coverage/coverage-summary.json. It does not run the tests itself.
  • portaliq's secure coding findings sit in a third-party bundle we commit, not in portaliq's own source.

Why the checker scores moved this week​

The checker changed between rounds, so not every jump is new code.

  • Round of 01:00 UTC, 13 November (checker d6a3b66). Three fixes landed. The hardcoded-secret rule now needs a value that looks like a secret, not just a name. Go, pytest, end-to-end and Android test paths count as test code. The licence check honours the excludes in each repository's scope file. Eight apps gained 4 points from these fixes alone. A control scan of the same commits with the old checker separates the two effects.
  • Round of 04:00 UTC (same checker). Every change came from merged work. launchpad gained 12 points from its Docker image and Helm chart. filinq, larpinq and thematiq reached 97 with a clean versioned API spec. portaliq gained 3 points for the same reason.
  • keepiq rescan, about 04:30 UTC (checker afb5f1b). The secret rule now looks at one line only and accepts PascalCase names. keepiq's one finding was an icon name, so secure coding passes and keepiq scores 93 on the same commit.

The quality matrix​

Measured on 2026-11-06. We have not measured the matrix again since. The commit under each app name is the head that was measured. An app we measured again later shows its own date under its name. For that app, the rating, maintainability rows and levers come from that date. Its other rows keep the date above.

Why the matrix scores jump from 1 November 2026

Until 31 October 2026 the fleet followed the Nextcloud coding standards. From 1 November 2026 we apply the maintainability rules of the maintainability guidance. Gates 122 and 123 check them on every change. That is why the scores rise from 1 November.

How to read the matrix​

Each column is an app. The rows come in five sections.

  1. Estimated maintainability rating. Our estimate of the rating an external assessment would give, from 0.5 to 5.5. The overall row is a range. Below it are the five sub-characteristics and the seven properties. All of it is an estimate.
  2. Maintainability checks. Every check of gate 122, per language, rated from 1 to 5 stars.
  3. Other external models. Open Source Health and Architecture Quality, where we can measure them. The guidance publishes only the 4-star value, so a cell says met (4★) or missed (<4).
  4. Our own measures. Tests, debt, security, and accessibility and UI. We define these bands ourselves. The table below the matrix gives each band's basis.
  5. Gates per category. Each row shows the gates that pass out of the gates that apply, and the findings of all of them. Open a row to see its gates.
  • Unit size, complexity and interfacing: the share of unit code above the bound, for example the code in units longer than 15 lines.
  • Duplication: the share of redundant lines, in fragments of 6 lines or more. In a Vue file we treat template, script and style as separate pieces, so a fragment never crosses from one into the next. This is our assumption until a real external scan confirms it.
  • Module coupling: the share of module code in files with more than 10, 20 or 50 incoming dependencies.
  • Component independence: the share of code that no other component calls. Higher is better here. For every other check, lower is better.

A cell shows the stars and the measured value. Hover a cell for the details. An empty cell (·) means the app has no such code or the gate does not apply.

Maintainability bands​

The 4-star limits come from the maintainability guidance, Guidance for Producers v18.1, dated 31 March 2026. It is the 2026 model. Volume no longer counts.

The guidance publishes no other level. We derive the 5, 3 and 2-star limits ourselves. The only public table of all levels is Alves, Correia and Visser (2011). We take its distance between each band and the 4-star band. We apply that ratio to the v18.1 limits. Duplication uses the band ratios of Heitlager, Kuipers and Visser (2007). Anything worse than 2 stars is 1 star.

Check5★4★ (v18.1)3★2★
Unit size, code in units over 15 / 30 / 60 lines36.0 / 17.0 / 5.5%48.0 / 24.2 / 9.1%63.0 / 34.7 / 15.4%84.7 / 49.0 / 25.3%
Unit complexity, McCabe over 5 / 10 / 2515.8 / 4.4 / 0.5%20.7 / 7.5 / 1.1%27.7 / 10.6 / 1.7%34.6 / 13.2 / 2.7%
Unit interfacing, 3+ / 5+ / 7+ parameters12.5 / 2.5 / 0.6%15.4 / 3.4 / 0.9%18.3 / 4.8 / 1.4%26.0 / 7.2 / 2.1%
Module coupling, fan-in over 10 / 20 / 507.4 / 3.3 / 1.2%9.7 / 5.3 / 1.8%10.7 / 5.9 / 2.3%13.0 / 8.0 / 3.8%
Duplication3.5%5.8%11.6%23%
Component independenceat least 97.3%at least 94.5%no bandno band
Component entanglementat most 0.0375at most 0.075no bandno band

The 2011 table was calibrated on a 20/20/20/20/20 spread. The 2026 model uses 5/30/30/30/5. So the real 5-star limits are probably stricter, and the real 2-star limits looser.

For independence and entanglement no public source gives other levels. We set 5 stars at half the 4-star exposure. A value below 4 stars shows as <4. Entanglement is our estimate from the violation degree, because the assessor normalises it against benchmark figures it does not publish. It is shown, but gate 123 does not floor it.

How we estimate the maintainability rating​

The external assessment rates each app from 0.5 to 5.5 stars. Our estimate follows its published steps, from the checks up to one number. Where nothing is published, we made a choice. Each choice is listed under assumptions.

  1. Check. A share of code between two star limits gets a rating between them, on a straight line. A share at the 4-star limit rates 3.5. This is equation 1 of Alves, Correia and Visser (2011). We test it on the paper's own example, which rates 2.68.
  2. Property. A property with three checks takes its worst check. Same paper.
  3. Languages. Each language gets its own property rating. We weight them by the code each property measures in that language.
  4. Sub-characteristic. The plain mean of its properties. Analysability: duplication and unit size. Modifiability: duplication, unit complexity and module coupling. Testability: unit complexity and component independence. Modularity: module coupling, component independence and component entanglement. Reusability: unit size and unit interfacing.
  5. Overall. The power mean of the five sub-characteristics. The 2026 model switched to a power mean in 2026 but does not publish the exponent. We show two: p = 1, the plain mean, and p = -1, the harmonic mean. The harmonic mean pulls harder towards the weakest sub-characteristic. The real rating probably sits between them.

Rounding to stars follows the guidance: half up, and 5.5 is still 5 stars. A rating row is coloured by its stars and shows the value. The overall row is coloured by the lower end of its range.

Sources​

  • Key changes in the 2026 quality models, the assessor's own note: volume is removed, and the overall rating is now a power mean.
  • Guidance for Producers v18.1, 31 March 2026: the 4-star limits, per language.
  • Evaluation Criteria Trusted Product Maintainability v12.0, 2020: which properties feed which sub-characteristic, and the order of the steps.
  • Alves, Correia and Visser, Benchmark-based aggregation of metrics to ratings, IWSM/Mensura 2011: the interpolation and the minimum over checks.
  • Baggen, Correia, Schill and Visser, Standardized code quality benchmarking for improving software maintainability, Software Quality Journal 2012: a sub-characteristic is the mean of its properties, and the overall rating the mean of the sub-characteristics.
  • The worked example in the 2026 changes note fits this: its overall 3.2 is the mean of the sub-characteristics, not of the properties.

Assumptions​

  • Exponent. The assessor does not publish it. We show p = 1 and p = -1 as a range.
  • Weights. Every property counts equally in its sub-characteristic, and every sub-characteristic in the overall rating. The evaluation criteria say a panel of experts sets the weights, and the assessor does not publish them. The worked example fits equal weights.
  • Mapping in 2026. The 2020 mapping, minus volume and component balance, which the 2026 model no longer rates. Nothing is added.
  • Power mean at the last step only. The sub-characteristics stay a plain mean. The published text does not say at which step the power mean applies.
  • Languages. Weighted by code. The guidance says most results are weighted by code volume, but not how languages combine.
  • 1 star. Below the 2-star limit the rating falls on a straight line to 0.5 when all code is in the band. The paper does not give this end.
  • Limits other than 4 stars. Our derived 5, 3 and 2-star limits from the table above.
  • Independence and entanglement below 4 stars. The assessor rates them below 4 stars but publishes only the 4-star limit. For the estimate, each star level doubles the allowed exposure. Independence: at least 97.25, 94.5, 89 and 78% hidden code for 5, 4, 3 and 2 stars. Entanglement: at most 0.0375, 0.075, 0.15 and 0.30. The check rows keep showing <4.
  • Entanglement value. We rate the violation degree. The assessor combines it with the communication density against benchmark maxima it does not publish.
  • Missing structure. Module coupling, independence and entanglement are measured for PHP under lib/ and for Python only. JavaScript, TypeScript and Vue count for the unit checks and duplication.

Floors​

A cell with a ring and a lock is floored. Gate 123 holds that check. The app met it when its floor was recorded, and a change that loses it fails. Re-recording a floor never lowers it. A floored check that the v18.1 limits miss stays in the floor and shows <4 until development meets it again.

  • 5★ 5 stars
  • 4★ 4 stars
  • 3★ 3 stars
  • 2★ 2 stars
  • 1★ 1 star
  • 3★ in the estimated rating rows: a rating from 0.5 to 5.5, rounded to stars, value below
  • <4 misses 4 stars where no lower band is published or estimated
  • 4★ floored: gate 123 refuses a change that loses this check
  • · not measured for this app

All 20 apps: 612 of 758 maintainability checks at 4 stars or better (81%). This average is our own figure, not an external score.

Showing 20 of 20 apps
measurebuildiqd6f56351decidiq3a356e7edossiq9622acd9filinqab6c1ebbhermiq1fad8992humaniq5589f3abintegriqcd844692keepiqee758777larpinq5ad762belaunchpad3e7bf07blearniq4d971c74opencatalogi7a191dbbopenregister4eccbfbcmeasured 2026-11-08pipelinqe4d420d4planninq19c35bedportaliq795da17bshillinqf1e580b0stackiq9ad6a74fthematiq3a5ccb20versioniqab0f16d6
Maintainability checks at 4 stars or betterand the share of the app's checks26/3476%27/3479%20/3459%40/4491%25/3474%29/3485%25/3474%46/5879%33/3497%28/3482%23/3468%39/4489%54/5893%21/3462%33/3497%24/3471%32/4473%24/3471%22/2492%41/4493%
Maintainability checks at 5 stars20/3422/3416/3436/4417/3426/3425/3442/5829/3425/3418/3428/4453/5816/3426/3417/3428/4417/3420/2441/44
floored checksfloor recorded at commit27fa904a53244242e8e11939ea188e40aff2d6052557a9fd9829d83ab23e2645eaf57646441230ac29ebf9d6ef289080e1fa229e7724de39d34462cb43eb3a39082135f34859323b8ff73f242dadb96d327a3bf1b617dd80cc1c21c2740962418a3e548d
Estimated maintainability rating
overall
Estimated maintainability rating (estimate)range from power mean p = -1 to p = 1, on 0.5 to 5.5; stars of the lower end3★2.82 to 3.053★2.91 to 3.072★2.34 to 2.594★3.76 to 3.862★2.36 to 2.502★2.43 to 2.713★3.00 to 3.153★2.95 to 3.134★3.95 to 4.083★2.67 to 2.893★2.61 to 2.804★3.99 to 4.054★3.94 to 4.012★2.34 to 2.634★3.59 to 3.772★2.45 to 2.832★2.16 to 2.322★2.11 to 2.273★3.40 to 3.594★3.68 to 3.88
sub-characteristics (estimate)
analysabilitymean of duplication, unit size3★3.393★3.303★2.974★3.653★2.804★3.543★2.924★3.715★4.553★3.233★2.904★3.665★4.583★2.904★4.444★3.612★2.433★2.505★4.585★4.73
modifiabilitymean of duplication, unit complexity, module coupling4★3.624★3.753★3.334★4.393★3.003★2.984★3.513★3.455★4.734★3.523★3.404★4.155★4.793★3.174★4.253★3.193★2.992★2.134★4.475★4.57
testabilitymean of unit complexity, component independence2★1.692★1.921★1.384★3.592★1.531★1.373★2.762★1.903★2.902★1.632★1.603★3.424★3.511★1.283★2.941★1.261★1.391★1.442★2.462★2.49
modularitymean of module coupling, component independence, component entanglement3★3.333★3.153★2.985★4.723★2.713★3.084★4.323★3.174★3.793★3.343★3.215★4.764★3.703★3.093★2.673★3.033★2.732★2.003★3.254★3.61
reusabilitymean of unit size, unit interfacing3★3.223★3.222★2.283★2.982★2.463★2.582★2.253★3.414★4.443★2.743★2.904★4.253★3.463★2.705★4.573★3.052★2.083★3.293★3.174★3.98
properties (estimate)
duplicationlanguages weighted by their code4★3.563★3.263★3.334★4.073★2.954★3.823★3.244★3.775★4.784★3.653★2.804★3.565★4.563★2.984★4.184★3.753★2.653★2.915★5.005★4.91
unit sizelanguages weighted by their code3★3.233★3.333★2.613★3.223★2.643★3.273★2.594★3.654★4.323★2.803★3.004★3.755★4.613★2.825★4.713★3.472★2.202★2.084★4.155★4.54
unit complexitylanguages weighted by their code2★2.283★2.762★1.634★3.792★1.982★1.652★2.163★2.685★4.672★2.252★2.123★3.445★4.782★1.505★4.721★1.432★1.612★2.014★3.764★3.66
unit interfacinglanguages weighted by their code3★3.213★3.112★1.953★2.742★2.272★1.892★1.903★3.185★4.563★2.683★2.805★4.752★2.313★2.574★4.423★2.622★1.965★4.512★2.193★3.42
module couplinglanguages weighted by their code5★5.015★5.215★5.045★5.314★4.073★3.485★5.124★3.895★4.755★4.655★5.285★5.455★5.055★5.024★3.844★4.415★4.721★1.485★4.655★5.14
component independencelanguages weighted by their code1★1.091★1.081★1.143★3.381★1.091★1.093★3.351★1.131★1.121★1.021★1.093★3.412★2.241★1.051★1.151★1.101★1.181★0.881★1.151★1.32
component entanglementlanguages weighted by their code4★3.893★3.153★2.775★5.463★2.995★4.674★4.475★4.515★5.504★4.353★3.275★5.424★3.813★3.193★3.044★3.592★2.294★3.634★3.964★4.37
Maintainability checks
php
unit size >155★ ≤36.0%, 4★ ≤48.0%, 3★ ≤63.0%, 2★ ≤84.7%, worse 1★2★71.3%3★56.2%2★64.1%3★57.8%2★69.7%3★52.8%2★67.0%3★54.8%4★40.2%2★71.3%3★57.5%4★46.1%5★32.3%2★65.0%5★floored35.7%3★56.3%2★71.4%2★80.6%4★floored40.2%5★floored35.8%
unit size >305★ ≤17.0%, 4★ ≤24.2%, 3★ ≤34.7%, 2★ ≤49.0%, worse 1★2★35.5%4★22.2%4★23.5%5★floored14.9%3★33.2%5★floored14.5%3★31.0%4★floored22.6%5★floored4.8%2★35.7%4★floored18.9%5★floored12.4%5★11.3%3★28.7%5★floored4.3%5★floored16.2%2★42.5%1★55.8%5★floored7.4%5★floored7.0%
unit size >605★ ≤5.5%, 4★ ≤9.1%, 3★ ≤15.4%, 2★ ≤25.3%, worse 1★4★floored6.0%5★floored3.1%5★floored1.7%5★floored0.1%4★floored6.3%5★floored2.4%5★floored3.8%5★floored1.9%5★floored1.1%5★floored2.7%5★floored1.2%5★floored0.8%5★1.1%5★floored3.7%5★floored0.0%5★floored1.1%3★13.7%1★27.1%5★floored0.0%5★floored0.0%
unit complexity >55★ ≤15.8%, 4★ ≤20.7%, 3★ ≤27.7%, 2★ ≤34.6%, worse 1★1★44.7%2★29.2%2★34.0%4★floored20.0%1★35.1%1★37.1%2★32.5%3★24.8%5★15.6%2★34.2%2★31.6%3★21.0%5★11.5%1★36.4%5★floored10.5%1★40.4%1★44.1%1★45.5%4★19.4%3★21.5%
unit complexity >105★ ≤4.4%, 4★ ≤7.5%, 3★ ≤10.6%, 2★ ≤13.2%, worse 1★4★floored5.7%5★floored0.1%5★floored0.7%5★floored0.1%5★floored3.5%5★floored3.0%5★floored3.5%5★floored1.6%5★floored0.0%5★floored2.0%5★floored0.1%5★floored1.2%5★1.0%5★floored3.2%5★floored0.4%5★floored0.5%3★8.0%1★14.5%5★floored0.0%5★floored1.8%
unit complexity >255★ ≤0.5%, 4★ ≤1.1%, 3★ ≤1.7%, 2★ ≤2.7%, worse 1★4★floored0.6%5★floored0.0%5★floored0.0%5★floored0.0%4★floored0.8%5★floored0.5%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.3%1★2.9%5★floored0.0%5★floored0.0%
unit interfacing >=35★ ≤12.5%, 4★ ≤15.4%, 3★ ≤18.3%, 2★ ≤26.0%, worse 1★1★26.3%2★22.1%1★28.9%2★22.0%1★29.4%2★24.4%1★28.1%1★34.8%4★13.2%2★25.1%2★22.4%4★floored12.7%2★22.1%2★24.6%4★14.4%1★35.1%1★26.7%4★13.3%2★20.7%3★17.1%
unit interfacing >=55★ ≤2.5%, 4★ ≤3.4%, 3★ ≤4.8%, 2★ ≤7.2%, worse 1★3★4.3%2★4.9%1★7.8%2★5.1%1★11.5%4★floored3.1%1★9.5%1★12.0%4★2.5%5★floored2.2%4★3.0%5★floored2.5%3★4.2%2★6.0%4★floored2.8%1★12.4%1★7.8%4★floored2.6%5★floored2.3%5★floored1.7%
unit interfacing >=75★ ≤0.6%, 4★ ≤0.9%, 3★ ≤1.4%, 2★ ≤2.1%, worse 1★5★floored0.4%3★1.0%2★1.6%5★floored0.3%1★4.6%5★floored0.4%1★3.5%1★4.4%5★floored0.2%5★floored0.6%5★floored0.4%5★floored0.6%3★1.4%4★floored0.7%4★floored0.8%1★4.4%1★2.2%5★floored0.6%5★floored0.0%5★floored0.1%
duplication5★ ≤3.5%, 4★ ≤5.8%, 3★ ≤11.6%, 2★ ≤23.0%, worse 1★4★floored5.0%4★floored5.0%3★6.9%4★floored4.5%3★8.7%4★5.3%3★7.2%3★7.4%5★floored2.1%3★6.7%3★10.5%4★floored3.7%5★2.9%3★9.7%5★floored3.4%4★floored5.3%2★12.1%3★8.6%5★floored1.8%5★floored1.9%
module coupling fan-in >105★ ≤7.4%, 4★ ≤9.7%, 3★ ≤10.7%, 2★ ≤13.0%, worse 1★5★floored3.6%5★floored2.1%5★floored3.4%5★floored1.4%4★floored8.4%5★floored3.7%5★floored2.8%5★floored7.4%5★floored2.5%5★floored5.1%5★floored0.8%5★floored0.4%5★2.9%5★floored1.8%5★floored7.1%5★floored6.0%5★floored1.1%4★floored9.5%5★floored6.3%5★floored2.7%
module coupling fan-in >205★ ≤3.3%, 4★ ≤5.3%, 3★ ≤5.9%, 2★ ≤8.0%, worse 1★5★floored1.5%5★floored0.4%5★floored1.3%5★floored0.4%5★floored0.3%5★floored3.0%5★floored0.2%5★floored3.0%5★floored2.5%5★floored2.8%5★floored0.5%5★floored0.2%5★1.1%5★floored1.1%4★floored4.6%4★floored3.5%5★floored1.1%1★9.5%5★floored2.0%5★floored0.2%
module coupling fan-in >505★ ≤1.2%, 4★ ≤1.8%, 3★ ≤2.3%, 2★ ≤3.8%, worse 1★5★floored0.0%5★floored0.1%5★floored0.5%5★floored0.0%5★floored0.3%3★floored1.8%5★floored0.0%4★floored1.6%5★floored0.0%5★floored0.5%5★floored0.3%5★floored0.0%5★0.5%5★floored0.6%5★floored0.0%5★floored0.6%5★floored0.9%5★0.0%5★floored0.2%5★floored0.0%
component independence5★ ≥97.3%, 4★ ≥94.5%, under that <4<446.2%<445.4%<449.8%<4floored93.8%<446.1%<446.3%<4floored93.7%<445.0%<448.7%<440.3%<445.7%<4floored94.0%<486.2%<443.2%<450.3%<446.7%<452.8%<429.4%<450.5%<464.1%
component entanglement (estimate, not floored)5★ ≤0.0375, 4★ ≤0.075, under that <44★0.060<40.102<40.1305★0.002<40.1135★0.0314★0.0394★0.0385★0.0004★0.043<40.0935★0.0034★0.063<40.098<40.1104★0.072<40.1814★0.0704★0.0584★0.042
javascript
unit size >155★ ≤36.0%, 4★ ≤48.0%, 3★ ≤63.0%, 2★ ≤84.7%, worse 1★5★floored33.0%5★floored29.2%3★48.9%5★floored35.0%5★floored34.3%5★floored17.9%5★floored16.0%3★49.3%5★floored21.4%5★floored31.9%4★floored38.5%5★floored24.6%5★floored19.4%4★floored41.0%5★floored21.2%4★floored42.3%5★floored26.5%4★38.0%5★floored0.0%5★floored18.4%
unit size >305★ ≤17.0%, 4★ ≤24.2%, 3★ ≤34.7%, 2★ ≤49.0%, worse 1★5★floored4.8%5★floored2.7%4★floored21.1%5★floored6.9%5★floored11.4%5★floored0.0%5★floored0.0%5★floored15.7%5★floored2.2%5★floored2.9%5★floored11.0%5★floored12.5%5★floored0.7%5★floored14.1%5★floored0.0%5★floored11.5%5★floored2.7%5★12.9%5★floored0.0%5★floored0.0%
unit size >605★ ≤5.5%, 4★ ≤9.1%, 3★ ≤15.4%, 2★ ≤25.3%, worse 1★5★floored0.0%5★floored0.0%5★floored4.9%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored1.9%5★floored0.0%5★floored0.0%5★floored1.9%4★floored5.9%5★floored0.0%5★floored4.8%5★floored0.0%5★floored2.8%5★floored0.0%5★0.0%5★floored0.0%5★floored0.0%
unit complexity >55★ ≤15.8%, 4★ ≤20.7%, 3★ ≤27.7%, 2★ ≤34.6%, worse 1★4★floored18.4%4★19.8%1★39.9%4★floored19.3%4★floored18.4%5★floored6.7%5★floored1.9%2★29.6%5★floored6.1%4★floored17.4%1★41.4%5★floored9.6%5★floored6.0%2★31.8%4★floored17.5%1★39.8%4★16.3%4★19.0%5★floored0.0%5★floored0.0%
unit complexity >105★ ≤4.4%, 4★ ≤7.5%, 3★ ≤10.6%, 2★ ≤13.2%, worse 1★5★floored1.0%5★floored1.8%1★13.4%5★floored0.0%5★floored3.5%5★floored0.0%5★floored0.0%4★floored5.8%5★floored0.0%5★floored0.3%3★9.2%5★floored2.8%5★floored0.3%3★9.0%5★floored1.6%2★10.8%5★floored1.6%5★0.7%5★floored0.0%5★floored0.0%
unit complexity >255★ ≤0.5%, 4★ ≤1.1%, 3★ ≤1.7%, 2★ ≤2.7%, worse 1★5★floored0.0%5★floored0.0%2★2.5%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%4★floored0.9%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%
unit interfacing >=35★ ≤12.5%, 4★ ≤15.4%, 3★ ≤18.3%, 2★ ≤26.0%, worse 1★5★floored5.1%5★floored8.5%5★floored9.5%5★floored4.5%5★floored6.9%5★floored6.4%5★floored3.3%5★floored11.0%5★floored2.1%5★floored3.4%5★floored11.4%5★floored5.1%5★floored4.1%5★floored8.6%4★floored12.7%4★floored14.2%5★floored7.0%5★floored6.0%5★floored0.0%5★floored0.0%
unit interfacing >=55★ ≤2.5%, 4★ ≤3.4%, 3★ ≤4.8%, 2★ ≤7.2%, worse 1★5★floored0.0%5★floored1.0%5★floored1.3%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.3%5★floored0.0%5★floored0.0%5★floored1.4%5★floored0.8%5★floored0.2%5★floored0.8%5★floored0.0%5★floored0.6%5★floored0.9%5★floored0.8%5★floored0.0%5★floored0.0%
unit interfacing >=75★ ≤0.6%, 4★ ≤0.9%, 3★ ≤1.4%, 2★ ≤2.1%, worse 1★5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.1%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%
duplication5★ ≤3.5%, 4★ ≤5.8%, 3★ ≤11.6%, 2★ ≤23.0%, worse 1★5★floored2.2%5★floored1.6%5★floored2.8%5★floored2.4%5★floored2.5%5★floored1.7%5★floored0.0%5★floored2.0%5★floored1.3%5★floored0.9%5★floored0.9%5★floored1.7%5★floored1.6%5★floored2.4%5★floored1.6%5★floored2.6%5★floored1.0%5★floored3.3%5★floored0.0%5★floored2.5%
typescript
unit size >155★ ≤36.0%, 4★ ≤48.0%, 3★ ≤63.0%, 2★ ≤84.7%, worse 1★not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored26.2%not measured for this appnot measured for this appnot measured for this app4★floored45.3%5★floored18.7%not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this app5★floored12.4%
unit size >305★ ≤17.0%, 4★ ≤24.2%, 3★ ≤34.7%, 2★ ≤49.0%, worse 1★not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored7.9%not measured for this appnot measured for this appnot measured for this app5★floored14.9%5★floored7.8%not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this app5★floored0.0%
unit size >605★ ≤5.5%, 4★ ≤9.1%, 3★ ≤15.4%, 2★ ≤25.3%, worse 1★not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored1.0%not measured for this appnot measured for this appnot measured for this app4★floored7.6%5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this app5★floored0.0%
unit complexity >55★ ≤15.8%, 4★ ≤20.7%, 3★ ≤27.7%, 2★ ≤34.6%, worse 1★not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this app2★33.5%not measured for this appnot measured for this appnot measured for this app4★floored17.7%5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this app5★floored8.5%
unit complexity >105★ ≤4.4%, 4★ ≤7.5%, 3★ ≤10.6%, 2★ ≤13.2%, worse 1★not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this app2★10.7%not measured for this appnot measured for this appnot measured for this app4★floored6.0%5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this app5★floored0.0%
unit complexity >255★ ≤0.5%, 4★ ≤1.1%, 3★ ≤1.7%, 2★ ≤2.7%, worse 1★not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.3%not measured for this appnot measured for this appnot measured for this app5★floored0.0%5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this app5★floored0.0%
unit interfacing >=35★ ≤12.5%, 4★ ≤15.4%, 3★ ≤18.3%, 2★ ≤26.0%, worse 1★not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored8.7%not measured for this appnot measured for this appnot measured for this app5★floored4.1%5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this app5★floored5.4%
unit interfacing >=55★ ≤2.5%, 4★ ≤3.4%, 3★ ≤4.8%, 2★ ≤7.2%, worse 1★not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.6%not measured for this appnot measured for this appnot measured for this app5★floored0.0%5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this app5★floored0.0%
unit interfacing >=75★ ≤0.6%, 4★ ≤0.9%, 3★ ≤1.4%, 2★ ≤2.1%, worse 1★not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.0%5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this app5★floored0.0%
duplication5★ ≤3.5%, 4★ ≤5.8%, 3★ ≤11.6%, 2★ ≤23.0%, worse 1★not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this app5★floored0.3%not measured for this appnot measured for this appnot measured for this app5★floored3.3%5★floored0.6%not measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this app5★floored0.0%
vue
unit size >155★ ≤36.0%, 4★ ≤48.0%, 3★ ≤63.0%, 2★ ≤84.7%, worse 1★5★floored34.2%4★floored45.6%4★floored44.4%5★floored33.5%4★floored39.9%5★floored25.1%5★floored25.8%5★floored35.9%5★floored30.3%5★floored35.2%3★53.2%4★floored44.1%5★floored33.1%4★floored40.8%5★floored21.7%5★floored27.9%4★floored47.0%4★floored43.5%not measured for this app5★floored34.5%
unit size >305★ ≤17.0%, 4★ ≤24.2%, 3★ ≤34.7%, 2★ ≤49.0%, worse 1★5★floored12.4%5★floored12.7%5★floored15.9%5★floored11.8%5★floored10.3%5★floored2.2%5★floored8.0%5★floored13.3%5★floored6.5%5★floored8.6%3★25.9%4★floored18.5%5★floored9.1%4★floored17.2%5★floored3.6%5★floored9.8%4★floored19.7%5★floored14.1%not measured for this app5★floored3.2%
unit size >605★ ≤5.5%, 4★ ≤9.1%, 3★ ≤15.4%, 2★ ≤25.3%, worse 1★5★floored0.9%5★floored0.0%5★floored3.1%5★floored2.6%5★floored0.9%5★floored0.0%5★floored1.5%5★floored2.4%5★floored0.0%5★floored0.0%4★floored7.1%5★floored4.3%5★floored1.2%4★floored6.0%5★floored0.0%5★floored4.2%5★floored1.1%5★floored0.8%not measured for this app5★floored0.0%
unit complexity >55★ ≤15.8%, 4★ ≤20.7%, 3★ ≤27.7%, 2★ ≤34.6%, worse 1★3★floored23.0%4★19.9%3★22.1%5★floored8.6%4★floored19.9%5★floored10.9%5★floored8.0%4★floored18.7%5★floored7.6%4★floored18.5%3★24.2%3★24.6%5★floored12.5%3★25.1%5★floored8.2%4★floored15.9%3★floored24.3%4★floored18.8%not measured for this app5★floored15.1%
unit complexity >105★ ≤4.4%, 4★ ≤7.5%, 3★ ≤10.6%, 2★ ≤13.2%, worse 1★4★floored5.5%5★floored1.8%4★floored6.7%5★floored2.7%4★floored4.5%5★floored0.0%5★floored0.0%5★floored4.4%5★floored1.6%5★floored2.5%4★floored5.5%3★8.3%5★floored0.9%3★8.0%5★floored2.1%4★floored4.6%4★floored4.5%5★floored2.4%not measured for this app5★floored1.5%
unit complexity >255★ ≤0.5%, 4★ ≤1.1%, 3★ ≤1.7%, 2★ ≤2.7%, worse 1★5★floored0.0%5★floored0.0%2★1.8%5★floored0.0%4★floored0.6%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%4★floored0.8%5★0.0%1★3.4%5★floored0.0%1★3.1%5★floored0.0%5★floored0.0%not measured for this app5★floored0.0%
unit interfacing >=35★ ≤12.5%, 4★ ≤15.4%, 3★ ≤18.3%, 2★ ≤26.0%, worse 1★5★floored2.2%5★floored0.5%5★floored0.5%5★floored0.2%5★floored0.4%5★floored0.0%5★floored0.5%5★floored0.0%5★floored0.0%5★floored0.9%5★floored1.2%5★floored0.5%5★floored0.7%5★floored0.7%5★floored0.7%5★floored0.7%5★floored1.2%5★floored0.4%not measured for this app5★floored2.2%
unit interfacing >=55★ ≤2.5%, 4★ ≤3.4%, 3★ ≤4.8%, 2★ ≤7.2%, worse 1★5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%not measured for this app5★floored0.0%
unit interfacing >=75★ ≤0.6%, 4★ ≤0.9%, 3★ ≤1.4%, 2★ ≤2.1%, worse 1★5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%5★floored0.0%not measured for this app5★floored0.0%
duplication5★ ≤3.5%, 4★ ≤5.8%, 3★ ≤11.6%, 2★ ≤23.0%, worse 1★3★8.1%2★16.9%3★9.2%4★5.1%2★12.6%4★floored3.6%3★9.2%3★9.5%4★floored3.8%4★floored5.0%3★10.5%2★13.5%4★4.9%3★9.0%4★floored5.3%3★7.1%3★9.1%2★12.2%not measured for this app5★floored2.5%
python
unit size >155★ ≤36.0%, 4★ ≤48.0%, 3★ ≤63.0%, 2★ ≤84.7%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored5.6%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
unit size >305★ ≤17.0%, 4★ ≤24.2%, 3★ ≤34.7%, 2★ ≤49.0%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
unit size >605★ ≤5.5%, 4★ ≤9.1%, 3★ ≤15.4%, 2★ ≤25.3%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
unit complexity >55★ ≤15.8%, 4★ ≤20.7%, 3★ ≤27.7%, 2★ ≤34.6%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
unit complexity >105★ ≤4.4%, 4★ ≤7.5%, 3★ ≤10.6%, 2★ ≤13.2%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
unit complexity >255★ ≤0.5%, 4★ ≤1.1%, 3★ ≤1.7%, 2★ ≤2.7%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
unit interfacing >=35★ ≤12.5%, 4★ ≤15.4%, 3★ ≤18.3%, 2★ ≤26.0%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored3.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
unit interfacing >=55★ ≤2.5%, 4★ ≤3.4%, 3★ ≤4.8%, 2★ ≤7.2%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
unit interfacing >=75★ ≤0.6%, 4★ ≤0.9%, 3★ ≤1.4%, 2★ ≤2.1%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
duplication5★ ≤3.5%, 4★ ≤5.8%, 3★ ≤11.6%, 2★ ≤23.0%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
module coupling fan-in >105★ ≤7.4%, 4★ ≤9.7%, 3★ ≤10.7%, 2★ ≤13.0%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
module coupling fan-in >205★ ≤3.3%, 4★ ≤5.3%, 3★ ≤5.9%, 2★ ≤8.0%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
module coupling fan-in >505★ ≤1.2%, 4★ ≤1.8%, 3★ ≤2.3%, 2★ ≤3.8%, worse 1★not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored0.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
component independence5★ ≥97.3%, 4★ ≥94.5%, under that <4not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored100.0%not measured for this appnot measured for this appnot measured for this appnot measured for this app5★floored100.0%not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
component entanglement (estimate, not floored)5★ ≤0.0375, 4★ ≤0.075, under that <4not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app5★0.000not measured for this appnot measured for this appnot measured for this appnot measured for this app5★0.000not measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this appnot measured for this app
Other external models
Open Source Health
vulnerabilities above moderate4 stars: none<414<464★04★0<42<4144★0<43<47<413<4144★04★0<43<412<413<49<49<4104★0
dependencies with a licence risk4 stars: no AGPL, GPL or other medium or worse, at most 3 low-risk (LGPL, EPL)<419<417<423<435<420<418<417<432<420<422<418<439<420<419<419<418<416<4194★0<416
unmanaged dependencies (%)4 stars: at most 6%4★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.04★0.0
Architecture Quality
component adjacency (estimate)4 stars: a component talks to at most 6 others on average4★5.04★4.7<47.04★3.44★4.24★5.6<47.1<46.44★2.74★5.94★5.24★3.2<49.14★5.54★4.24★4.8<47.44★3.54★4.44★3.2
Our own measures
Tests
PHP line coverage5★ ≥95%, 4★ ≥80%, 3★ ≥60%, 2★ ≥20%, worse 1★2★57.4%2★57.7%2★29.7%3★61.4%3★68.2%3★77.6%3★60.6%2★55.8%3★67.7%2★49.5%3★71.2%3★70.7%2★58.9%2★45.4%3★69.2%3★79.7%2★57.7%1★13.0%3★77.5%not measured for this app
spec coverage (gate 16)5★ ≥95%, 4★ ≥80%, 3★ ≥60%, 2★ ≥20%, worse 1★4★85.7%5★96.4%5★96.6%4★86.8%5★96.5%5★95.1%5★98.1%5★100.0%5★99.7%5★98.1%5★98.5%4★94.8%5★95.7%4★83.6%5★99.7%4★93.2%3★76.1%5★98.9%5★100.0%4★89.9%
e2e scenario coverage (gate 19)5★ ≥95%, 4★ ≥80%, 3★ ≥60%, 2★ ≥20%, worse 1★2★23.1%1★18.6%1★14.9%2★32.4%1★4.5%1★1.1%2★44.2%1★16.2%3★77.2%2★45.5%1★13.9%2★25.8%1★5.1%2★24.2%2★53.8%2★32.1%1★8.8%2★25.8%3★60.0%1★8.6%
test code ratio5★ ≥120%, 4★ ≥100%, 3★ ≥75%, 2★ ≥25%, worse 1★3★99.9%4★107.8%5★139.3%4★110.8%3★93.5%4★115.5%4★105.2%5★129.1%5★213.9%4★104.4%3★97.9%5★121.5%5★137.4%3★79.8%3★84.5%3★96.4%3★93.5%2★59.1%5★300.6%5★135.4%
Debt
baselined findings per kLOC PHP5★ ≤1, 4★ ≤5, 3★ ≤10, 2★ ≤25, worse 1★3★5.35★0.05★0.05★0.05★0.04★4.74★4.25★0.05★0.04★2.85★0.04★1.43★5.24★1.15★0.05★0.05★0.04★3.25★0.04★3.2
suppressions per kLOC5★ ≤0.5, 4★ ≤2, 3★ ≤5, 2★ ≤10, worse 1★3★2.04★0.73★2.14★1.23★4.14★1.83★4.93★2.31★17.63★3.74★1.53★3.92★7.63★3.45★0.34★1.33★3.13★4.33★3.43★2.1
Security
security gate findings5★ ≤0, 4★ ≤2, 3★ ≤5, 2★ ≤15, worse 1★5★05★05★05★05★05★05★05★05★04★15★04★11★462★85★05★04★25★05★05★0
vulnerable dependencies, high or critical5★ ≤0, 4★ ≤0, 3★ ≤2, 2★ ≤5, worse 1★1★141★65★05★03★21★145★02★31★71★131★145★05★02★31★121★131★91★91★105★0
unmanaged dependencies5★ ≤0%, 4★ ≤6%, 3★ ≤12%, 2★ ≤25%, worse 1★5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%5★0.0%
Accessibility and UI
accessibility findings per .vue file5★ ≤0, 4★ ≤0.05, 3★ ≤0.2, 2★ ≤0.5, worse 1★5★0.05★0.05★0.05★0.05★0.05★0.05★0.05★0.05★0.05★0.05★0.05★0.05★0.05★0.05★0.05★0.05★0.05★0.0not measured for this app5★0.0
UI convention findings5★ ≤0, 4★ ≤5, 3★ ≤20, 2★ ≤50, worse 1★5★05★01★805★05★05★05★05★04★15★04★55★05★04★15★04★45★04★25★05★0
Gates per category
gates passing of applicable, and findings10/100 findings11/110 findings11/110 findings11/110 findings11/110 findings9/90 findings11/110 findings10/100 findings9/90 findings10/111 findings10/100 findings10/111 findings10/1146 findings9/118 findings9/90 findings11/110 findings8/102 findings10/100 findings9/90 findings6/60 findings
gates passing of applicable, and findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings15/150 findings14/140 findings15/150 findings
gates passing of applicable, and findings16/175 findings17/170 findings16/171 findings17/170 findings17/170 findings17/170 findings17/170 findings12/120 findings16/160 findings16/160 findings15/161 findings17/170 findings15/1612 findings15/162 findings17/170 findings16/171 findings17/170 findings16/160 findings12/120 findings10/100 findings
gates passing of applicable, and findings3/30 findings2/32 findings1/349 findings2/331 findings1/310 findings3/30 findings3/30 findings2/340 findings3/30 findings3/30 findings1/37 findings2/31 findings3/30 findings1/329 findings3/30 findings1/311 findings3/30 findings3/30 findings2/20 findings2/20 findings
gates passing of applicable, and findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings3/30 findings
gates passing of applicable, and findings2/355 findings2/328 findings2/355 findings2/328 findings2/355 findings2/328 findings2/373 findings2/328 findings2/328 findings2/328 findings2/328 findings2/373 findings2/364 findings2/373 findings2/328 findings2/328 findings2/355 findings2/346 findings2/355 findings3/30 findings
gates passing of applicable, and findings19/190 findings19/190 findings15/2080 findings19/190 findings19/190 findings17/170 findings19/190 findings18/180 findings19/201 findings19/190 findings16/205 findings19/190 findings19/190 findings19/201 findings18/180 findings18/194 findings19/190 findings17/192 findings13/130 findings2/20 findings
gates passing of applicable, and findings10/13774 findings11/131963 findings11/132946 findings10/12809 findings11/121149 findings9/11914 findings11/13351 findings11/12579 findings12/13187 findings11/12501 findings11/13568 findings10/13871 findings11/133809 findings9/121279 findings12/13279 findings11/13975 findings11/13786 findings11/13492 findings10/11276 findings8/9338 findings

Levers per app​

A lever is one property in one language. For each lever we move the next 1,000 lines above a bound to low risk, worst band first, and rate the app again. The gain is how far the overall rating rises, under both exponents. When fewer than 1,000 lines are left, the gain is for the lines that are left.

Lines for +0.5 is the fewest lines to fix in that language to raise the property by half a star. "Not by vue alone" means fixing every vue line is not enough, because the other languages hold the rating down.

A lever is sure when it ranks in the top 3 under both exponents. The panel shows the top 5 of each app, ordered by their two ranks together. Start with a sure lever.

Showing 20 of 20 apps

buildiqestimated rating 2.82 to 3.05

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
unit complexity in vue3,873 lines above a bound+0.057 / +0.1041,823✓ sure
duplication in php1,613 lines above a bound+0.067 / +0.0431,300✓ sure
module coupling in php1,131 lines above a bound+0.057 / +0.0371,131no, not in the top 3 under both exponents
unit complexity in javascript1,299 lines above a bound+0.028 / +0.053not by javascript aloneno, not in the top 3 under both exponents
duplication in vue3,589 lines above a bound+0.032 / +0.0211,664no, not in the top 3 under both exponents

decidiqestimated rating 2.91 to 3.07

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
unit complexity in php11,274 lines above a bound+0.041 / +0.0642,049✓ sure
duplication in php2,240 lines above a bound+0.070 / +0.0471,270✓ sure
unit complexity in vue2,567 lines above a bound+0.039 / +0.061not by vue alone✓ sure
unit complexity in javascript1,426 lines above a bound+0.029 / +0.046not by javascript aloneno, not in the top 3 under both exponents
module coupling in php932 lines above a bound+0.038 / +0.027only 932 lines left932no, not in the top 3 under both exponents

dossiqestimated rating 2.34 to 2.59

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
unit complexity in vue2,537 lines above a bound+0.025 / +0.048not by vue alone✓ sure
unit complexity in php49,525 lines above a bound+0.014 / +0.0275,799✓ sure
duplication in php11,832 lines above a bound+0.012 / +0.0073,825no, not in the top 3 under both exponents
unit size in javascript5,389 lines above a bound+0.010 / +0.008not by javascript aloneno, not in the top 3 under both exponents
duplication in vue2,988 lines above a bound+0.012 / +0.007not by vue aloneno, not in the top 3 under both exponents

filinqestimated rating 3.76 to 3.86

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
component independence in php3,730 lines above a bound+0.080 / +0.0711,033✓ sure
duplication in php2,719 lines above a bound+0.064 / +0.0581,406✓ sure
duplication in vue1,344 lines above a bound+0.059 / +0.053not by vue alone✓ sure
unit complexity in php10,066 lines above a bound+0.053 / +0.0491,577no, not in the top 3 under both exponents
unit interfacing in php11,045 lines above a bound+0.020 / +0.0312,089no, not in the top 3 under both exponents

hermiqestimated rating 2.36 to 2.50

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
unit complexity in vue1,823 lines above a bound+0.031 / +0.050not by vue alone✓ sure
module coupling in php4,734 lines above a bound+0.072 / +0.047837✓ sure
unit complexity in php17,224 lines above a bound+0.030 / +0.0482,379✓ sure
duplication in php4,943 lines above a bound+0.029 / +0.0192,151no, not in the top 3 under both exponents
unit complexity in javascript750 lines above a bound+0.017 / +0.027only 750 lines leftnot by javascript aloneno, not in the top 3 under both exponents

humaniqestimated rating 2.43 to 2.71

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
module coupling in php1,618 lines above a bound+0.238 / +0.135132✓ sure
duplication in php2,379 lines above a bound+0.130 / +0.067609✓ sure
unit interfacing in php9,493 lines above a bound+0.032 / +0.0271,580no, not in the top 3 under both exponents
unit size in php20,505 lines above a bound+0.033 / +0.0222,835no, not in the top 3 under both exponents
unit complexity in php14,413 lines above a bound+0.007 / +0.0162,291no, not in the top 3 under both exponents

integriqestimated rating 3.00 to 3.15

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
component independence in php6,821 lines above a bound+0.032 / +0.0281,925✓ sure
unit complexity in php29,627 lines above a bound+0.024 / +0.0233,529✓ sure
duplication in php7,838 lines above a bound+0.019 / +0.0182,683✓ sure
duplication in vue2,589 lines above a bound+0.019 / +0.018not by vue aloneno, not in the top 3 under both exponents
unit size in php61,040 lines above a bound+0.009 / +0.0138,797no, not in the top 3 under both exponents

keepiqestimated rating 2.95 to 3.13

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
module coupling in php3,248 lines above a bound+0.124 / +0.094134✓ sure
unit complexity in typescript4,932 lines above a bound+0.032 / +0.0542,398✓ sure
unit complexity in javascript3,999 lines above a bound+0.032 / +0.0542,945no, not in the top 3 under both exponents
duplication in php3,312 lines above a bound+0.034 / +0.0231,779no, not in the top 3 under both exponents
unit complexity in php9,190 lines above a bound+0.032 / +0.0542,302no, not in the top 3 under both exponents

larpinqestimated rating 3.95 to 4.08

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
unit complexity in php1,019 lines above a bound+0.117 / +0.154711✓ sure
module coupling in php192 lines above a bound+0.100 / +0.086only 192 lines left129✓ sure
unit size in php2,634 lines above a bound+0.096 / +0.0721,063✓ sure
unit interfacing in php867 lines above a bound+0.091 / +0.067only 867 lines left400no, not in the top 3 under both exponents
duplication in php166 lines above a bound+0.059 / +0.042only 166 lines leftnot by php aloneno, not in the top 3 under both exponents

launchpadestimated rating 2.67 to 2.89

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
duplication in vue1,271 lines above a bound+0.080 / +0.0501,044✓ sure
unit complexity in php11,194 lines above a bound+0.053 / +0.0921,574no, not in the top 3 under both exponents
duplication in php2,583 lines above a bound+0.079 / +0.0491,045no, not in the top 3 under both exponents
unit complexity in vue1,671 lines above a bound+0.036 / +0.064not by vue aloneno, not in the top 3 under both exponents
module coupling in php1,921 lines above a bound+0.070 / +0.041923no, not in the top 3 under both exponents

learniqestimated rating 2.61 to 2.80

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
unit complexity in vue3,632 lines above a bound+0.038 / +0.0683,568✓ sure
unit complexity in php17,491 lines above a bound+0.033 / +0.0572,569✓ sure
unit complexity in javascript1,645 lines above a bound+0.027 / +0.048not by javascript aloneno, not in the top 3 under both exponents
module coupling in php551 lines above a bound+0.029 / +0.018only 551 lines left551no, not in the top 3 under both exponents
duplication in php7,093 lines above a bound+0.024 / +0.0173,380no, not in the top 3 under both exponents

opencatalogiestimated rating 3.99 to 4.05

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
component independence in php1,792 lines above a bound+0.188 / +0.189487✓ sure
unit complexity in php5,276 lines above a bound+0.086 / +0.099966✓ sure
unit complexity in vue2,369 lines above a bound+0.069 / +0.0801,517no, not in the top 3 under both exponents
duplication in php1,105 lines above a bound+0.074 / +0.078not by php aloneno, not in the top 3 under both exponents
unit size in php11,577 lines above a bound+0.043 / +0.0442,308no, not in the top 3 under both exponents

openregisterestimated rating 3.94 to 4.01

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
module coupling in php11,153 lines above a bound+0.013 / +0.01211,153✓ sure
duplication in vue3,722 lines above a bound+0.015 / +0.010not by vue alone✓ sure
duplication in php11,495 lines above a bound+0.010 / +0.0078,576✓ sure
unit interfacing in php71,365 lines above a bound+0.004 / +0.00512,838no, not in the top 3 under both exponents
component independence in php54,159 lines above a bound+0.004 / +0.00516,315no, not in the top 3 under both exponents

pipelinqestimated rating 2.34 to 2.63

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
unit complexity in vue5,340 lines above a bound+0.065 / +0.1331,633✓ sure
unit complexity in javascript2,161 lines above a bound+0.023 / +0.050not by javascript alone✓ sure
module coupling in php1,774 lines above a bound+0.050 / +0.0271,774✓ sure
duplication in php9,585 lines above a bound+0.015 / +0.0094,555no, not in the top 3 under both exponents
unit size in vue8,699 lines above a bound+0.015 / +0.010not by vue aloneno, not in the top 3 under both exponents

planninqestimated rating 3.59 to 3.77

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
module coupling in php934 lines above a bound+0.222 / +0.252only 934 lines left133✓ sure
duplication in vue1,051 lines above a bound+0.145 / +0.093501✓ sure
unit complexity in javascript889 lines above a bound+0.050 / +0.058only 889 lines leftnot by javascript aloneno, not in the top 3 under both exponents
duplication in php457 lines above a bound+0.055 / +0.036only 457 lines leftnot by php aloneno, not in the top 3 under both exponents
unit interfacing in php1,628 lines above a bound+0.060 / +0.035714no, not in the top 3 under both exponents

portaliqestimated rating 2.45 to 2.83

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
unit complexity in vue2,295 lines above a bound+0.093 / +0.209388✓ sure
module coupling in php3,723 lines above a bound+0.067 / +0.040996✓ sure
duplication in php3,327 lines above a bound+0.049 / +0.0241,991✓ sure
duplication in vue3,751 lines above a bound+0.027 / +0.0142,232no, not in the top 3 under both exponents
unit interfacing in javascript2,930 lines above a bound+0.020 / +0.012not by javascript aloneno, not in the top 3 under both exponents

shillinqestimated rating 2.16 to 2.32

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
module coupling in php1,457 lines above a bound+0.085 / +0.047781✓ sure
unit complexity in vue2,827 lines above a bound+0.022 / +0.036not by vue alone✓ sure
unit size in vue5,477 lines above a bound+0.013 / +0.012not by vue aloneno, not in the top 3 under both exponents
duplication in vue2,860 lines above a bound+0.015 / +0.010not by vue aloneno, not in the top 3 under both exponents
unit complexity in javascript740 lines above a bound+0.006 / +0.011only 740 lines leftnot by javascript aloneno, not in the top 3 under both exponents

stackiqestimated rating 2.11 to 2.27

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
unit complexity in vue1,563 lines above a bound+0.031 / +0.051not by vue alone✓ sure
module coupling in php4,315 lines above a bound+0.047 / +0.0481,141✓ sure
duplication in php3,923 lines above a bound+0.031 / +0.0251,862no, not in the top 3 under both exponents
unit complexity in javascript1,072 lines above a bound+0.028 / +0.046not by javascript aloneno, not in the top 3 under both exponents
duplication in vue4,019 lines above a bound+0.028 / +0.0222,432no, not in the top 3 under both exponents

thematiqestimated rating 3.40 to 3.59

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
unit complexity in php4,026 lines above a bound+0.136 / +0.171509✓ sure
unit interfacing in php4,297 lines above a bound+0.114 / +0.114617✓ sure
unit size in php8,340 lines above a bound+0.074 / +0.0611,978no, not in the top 3 under both exponents
duplication in php452 lines above a bound+0.083 / +0.045only 452 lines left452no, not in the top 3 under both exponents
module coupling in php1,539 lines above a bound+0.073 / +0.059908no, not in the top 3 under both exponents

versioniqestimated rating 3.68 to 3.88

levergain from the next 1,000 lines, p = 1 / p = -1lines for +0.5sure
unit complexity in php1,899 lines above a bound+0.192 / +0.268299✓ sure
unit interfacing in php1,512 lines above a bound+0.167 / +0.121164✓ sure
module coupling in php281 lines above a bound+0.048 / +0.040only 281 lines left281no, not in the top 3 under both exponents
unit size in php3,155 lines above a bound+0.049 / +0.0352,031no, not in the top 3 under both exponents
duplication in php203 lines above a bound+0.055 / +0.034only 203 lines leftnot by php aloneno, not in the top 3 under both exponents

What we add beyond the external models​

The external models rate maintainability, security, open source health and architecture. They do not rate tests, debt hidden in baselines, or accessibility. These are our own measures, with the reason we add each one and the basis of its bands.

measurewhy we add itbasis of the bands
PHP line coverageThe external models rate no tests. Coverage shows how much of the code a unit or integration test runs.Heitlager, Kuipers and Visser 2007: unit test coverage ++ 95-100%, + 80-95%, o 60-80%, - 20-60%, -- 0-20%
spec coverage (gate 16)Share of in-scope methods that name the spec they implement, so a change can be traced to a requirement.our choice: Heitlager's coverage bands applied to traceability
e2e scenario coverage (gate 19)Share of non-excluded spec scenarios a running Playwright test cites: the behaviour a user sees is proven.our choice: Heitlager's coverage bands applied to spec scenarios
test code ratioThe external test volume figure (test LOC / production LOC), shown there without stars.external assessment: a 100% test code ratio is roughly 80% coverage, so Heitlager's 95/80/60/20% coverage bands become 120/100/75/25% test code
baselined findings per kLOC PHPpsalm, phpstan and phpmd baselines hide findings from the gates. Each entry is debt a reviewer no longer sees.our own bands; no published benchmark
suppressions per kLOCInline @psalm-suppress, @phpstan-ignore, @SuppressWarnings, phpcs:ignore and eslint-disable silence a tool where an external assessment still counts the code.our own bands; no published benchmark
security gate findingsGates 5-9, 11, 30, 48, 50, 82, 97 and 121 find missing auth, IDOR and fail-open checks that SAST tools do not know about Nextcloud.our own bands; 0 is the only passing state of each gate
vulnerable dependencies, high or criticalcomposer audit and npm audit on the lockfiles; the external Open Source Health model rates the same CVEs.Open Source Health guidance: 4 stars means no vulnerability above moderate; 5 stars also no moderate
unmanaged dependenciesThird-party code committed into the repository (minified or vendored files) gets no security updates.Open Source Health guidance: 4 stars at most 6% unmanaged; 3 and 2 stars double that
accessibility findings per .vue fileThe external models have no accessibility model. Gates 12 and 31-45 check WCAG 2.2 AA rules in the source.our own bands; WCAG 2.2 AA asks for none
UI convention findingsThe UI gates keep every app on the shared nextcloud-vue patterns, so users meet one interface.our own bands; 0 is the only passing state of each gate

Spec coverage counts the methods gate 16 holds in scope, with and without an @spec tag. E2e coverage is gate 19's report over the scenarios that are not excluded. PHP coverage is the statement coverage in the newest clover report CI kept for the app: from development if there is one, otherwise from the newest run on another branch. The tooltip names the branch, commit and date. CI keeps these reports 14 days. Without a readable report the cell falls back to the coverage-guard floor in .coverage-baseline, says stale with the date that floor last changed, and the run prints a warning. The vulnerable dependency count treats a Composer advisory without a severity as high, because nothing shows it is lower. The gate rows come from a full-scope run of every gate on development.

Floors and ratchets per app​

Besides the maintainability floor, each app keeps its own floors and baselines on development. A baseline lists debt that may stay, so a lower count is better. A coverage floor is a minimum, so a higher value is better. A · means the app has no such file. Hover a cell for the file it came from.

Showing 20 of 20 apps
floorbuildiqd6f56351decidiq3a356e7edossiq9622acd9filinqab6c1ebbhermiq1fad8992humaniq5589f3abintegriqcd844692keepiqee758777larpinq5ad762belaunchpad3e7bf07blearniq4d971c74opencatalogi7a191dbbopenregister061df3ecpipelinqe4d420d4planninq19c35bedportaliq795da17bshillinqf1e580b0stackiq9ad6a74fthematiq3a5ccb20versioniqab0f16d6
maintainability floor (gate 123)4-star checks the app must keep2724194025292646292822394321322432172141
procedure code (gate 119)procedure-named classes allowed0016610010000027030010000
PHP coverage (coverage-guard)line coverage the PHP suite may not drop below57.39%57.66%29.69%61.41%68.25%77.60%60.65%55.79%67.68%49.47%71.16%70.69%58.88%45.36%69.15%79.70%57.71%13.01%77.48%none
test coverage ratchetsuite coverage per runner, raised on every gainvitest 64.72%phpunit 52.25% / vitest 1.62%phpunit 22.48% / vitest 1.03%phpunit 46.68% / vitest 4.24%nonenonevitest 2.34%phpunit 57.59% / vitest 18.31%phpunit 57.34% / vitest 8.48%nonenonephpunit 82.39% / vitest 1.59%phpunit 54.55%nonenonenonephpunit 55.42% / vitest 0.37%phpunit 0.38%phpunit 11.37% / vitest 66.25%none
debt ratchetsuppressions and ignores counted by check:debt-ratchetnonenone862nonenonenonenonenonenonenonenonenonenonenonenonenonenonenonenonenone
eslint suppressionssuppressed eslint violations123182151137160none162110none047559706nonenone0121414nonenone
phpstan baselineignored phpstan errors, all baseline files21none02662none0nonenone0134279000141nonenone
psalm baselinebaselined psalm issuesnonenonenone004nonenonenonenonenone092nonenone0nonenonenone34
phpmd baselinebaselined phpmd violations170nonenonenonenone199388nonenone106none4348026nonenonenone6nonenone
schema l10n baselineuntranslated schema strings allowed396159002130000841519352195690123012169479nonenone
.reuse-baseline.jsonother floor-like filenonenonenonenonenonenonenonenonenonenonenonenonenonenonenonepresentnonenonenonenone
l10n/.l10n-parity-baseline.jsonother floor-like filenonenonenonenonenonenonenonenonenonenonepresentnonenonenonenonenonenonenonenonenone
tests/nav-reachability-baseline.jsonother floor-like filenonenonenonenonenonenonenonenonenonenonenonenonenonenonenonenonepresentnonenonenone

Refresh the data​

The matrix reads one JSON file in website/src/data/. One generator in website/scripts/ writes it. Its docstring gives the exact commands.

  1. Clone each app's development branch into one directory, named after the app.

  2. Run gate 122 in report mode on each clone. It writes one JSON report per app.

  3. Run all gates at full scope on each clone. The runner writes gates.json into its log directory:

    HYDRA_GATE_LOG_DIR=<gates-dir>/<app> bash hydra-gates/scripts/run-hydra-gates.sh --full <clones>/<app>
  4. Run the generator from the repository root. It runs composer audit and npm audit on the lockfiles and reads the CI coverage reports with gh api, so it needs the network and a logged-in gh.

  5. Commit the new data file.

The generator takes the rating estimate and the star bands from gate 122 and the own bands from website/scripts/quality_measures.py. A change to either shows up in the matrix on the next refresh.

Back to app health.