Analyzing repository…
RepoSignal is reading public GitHub data. This usually takes a few seconds.
Analyzing repository…
RepoSignal is reading public GitHub data. This usually takes a few seconds.
Engineering health
86out of 100
Analyzed just now. Scoring algorithm version 1.0.0.
80 × 0.150 + 87 × 0.150 + 75 × 0.150 + 99 × 0.150 + 90 × 0.150 + 89 × 0.150 + 75 × 0.100.
| Category | Score | Declared weight | Effective weight |
|---|---|---|---|
| Repository Activity | 80 | 15 | 15% |
| Pull Request Health | 87 | 15 | 15% |
| Issue Health | 75 | 15 | 15% |
| CI Health | 99 | 15 | 15% |
| Documentation | 90 | 15 | 15% |
| Repository Hygiene | 89 | 15 | 15% |
| Security Hygiene | 75 | 10 | 10% |
The observations behind the scores above. Charts are omitted where there was too little data to draw one meaningfully.
How long the issues in the sample have been open.
| Age | Count |
|---|---|
| 0–7 days | 8 |
| 1–4 weeks | 31 |
| 1–3 months | 12 |
| 3–6 months | 0 |
| 6–12 months | 0 |
| Over a year | 0 |
How long the pull requests in the sample have been open.
Observations RepoSignal could make from public data. Each states what was observed, not why — intent is not something this data reveals.
Over the last 90 days, 61 issues were opened and 10 were closed. At this rate the backlog grows faster than it is resolved.
Recommendation: Consider whether triage capacity matches inbound volume — through templates that reduce back-and-forth, or more contributors with triage rights.
Measures whether the project is being actively developed: how recently it was pushed to, how consistently it is committed to, and how recently and regularly it releases.
Intervals between the 100 published releases vary widely. Irregular releases make it harder to anticipate when a fix will ship, though many healthy projects release when there is something worth releasing rather than on a schedule.
Recommendation: No action implied.
100 × 0.47 + 100 × 0.33 + 0 × 0.20 Excluded as unobservable, with weight redistributed: Weeks with commits.
| Age | Count |
|---|---|
| 0–7 days | 27 |
| 1–4 weeks | 91 |
| 1–3 months | 2 |
| 3–6 months | 0 |
| 6–12 months | 0 |
| Over a year | 0 |
| Component | Score | Weight | Observed |
|---|---|---|---|
| Time since last pushDays since the most recent push. Pushed within a month. | 100 | 35 | 0 days ago |
| Weeks with commitsProportion of the trailing year’s weeks containing at least one commit. Unavailable statistics score null and the weight is redistributed. | Excluded | 25 | GitHub has not made commit statistics available |
| Time since last releaseDays since the most recent published release. Released within 3 months. | 100 | 25 | 27 days ago |
| Release cadence regularityCoefficient of variation of intervals between releases, so a predictable slow cadence scores as well as a predictable fast one. Null below 3 releases. | 0 | 15 | Regularity score 0 |
Measures how pull requests move: how many sit open for a long time, how quickly they are merged, and what share of decided pull requests were merged.
100 × 0.35 + 100 × 0.35 + 57 × 0.30
| Component | Score | Weight | Observed |
|---|---|---|---|
| Long-lived open pull requestsProportion of open pull requests older than 90 days. Under 10% long-lived. | 100 | 35 | 0 of 120 open PRs older than 90 days (0%) |
| Median time to merge (approximate)Median days from opening to merge across the sample. Median under 2 days. Median is used so a single very old merge cannot distort the result. | 100 | 35 | 1.5 days (median of 46 merged PRs sampled) |
| Merged share of decided pull requestsMerged divided by merged-plus-closed-unmerged over the trailing 90 days. | 57 | 30 | 46 merged, 34 closed unmerged, in the last 90 days |
Measures whether the issue backlog is being tended: how much of it is stale, how old it is, and whether issues are closed as fast as they arrive.
Over the last 90 days, 61 issues were opened and 10 were closed. At this rate the backlog grows faster than it is resolved.
Recommendation: Consider whether triage capacity matches inbound volume — through templates that reduce back-and-forth, or more contributors with triage rights.
100 × 0.40 + 100 × 0.30 + 16 × 0.30
| Component | Score | Weight | Observed |
|---|---|---|---|
| Stale issue proportionProportion of open issues with no activity for 180+ days. Under 10% stale. | 100 | 40 | 0 of 51 open issues inactive for 180+ days (0%) |
| Median open issue ageMedian age of open issues. Median under 30 days. | 100 | 30 | 16 days |
| Close rate against open rateIssues closed divided by issues opened over the trailing 90 days, capped at 1.0. A ratio at or above 1.0 means the backlog is not growing. | 16 | 30 | 10 closed against 61 opened in 90 days |
Measures whether automated checks exist and whether they are passing, using workflow runs on the default branch and the status of its most recent commit.
100 × 0.40 + 98 × 0.60 Excluded as unobservable, with weight redistributed: Latest commit status.
| Component | Score | Weight | Observed |
|---|---|---|---|
| CI configuredWorkflows or commit status checks present scores 100. | 100 | 30 | 26 workflows |
| Recent run success rateSuccessful runs divided by decisive runs on the default branch. Cancelled and skipped runs are excluded rather than counted as failures. | 98 | 45 | 94 of 96 recent runs succeeded (98%) |
| Latest commit statusSuccess scores 100, pending scores 70, failure scores 0. No status is not scorable and its weight is redistributed. | Excluded | 25 | No status on the latest default-branch commit |
Measures whether the files a newcomer needs are present, and whether the README and contributing guide are substantial enough to be useful.
100 × 0.30 + 100 × 0.20 + 100 × 0.15 + 100 × 0.10 + 100 × 0.10 + 100 × 0.05 + 0 × 0.10
| Component | Score | Weight | Observed |
|---|---|---|---|
| READMEPresent and ≥ 300 bytes scores 100; present but smaller scores 50; absent scores 0. | 100 | 30 | Present at README.md (5317 bytes) |
| LICENSEPresent scores 100, absent scores 0. Without one, the code is not legally reusable. | 100 | 20 | Present at LICENSE (1088 bytes) |
| CONTRIBUTINGPresent and ≥ 200 bytes scores 100; present but smaller scores 50; absent scores 0. | 100 | 15 | Present at CONTRIBUTING.md (208 bytes) |
| Code of conductPresent scores 100, absent scores 0. | 100 | 10 | Present at CODE_OF_CONDUCT.md (3541 bytes) |
| Issue templatesPresent scores 100, absent scores 0. | 100 | 10 | Present at .github/ISSUE_TEMPLATE |
| Pull request templatePresent scores 100, absent scores 0. | 100 | 5 | Present at .github/pull_request_template.md |
| Documentation directoryPresent scores 100, absent scores 0. Extended documentation beyond the README. | 0 | 10 | Absent |
Measures the repository-level practices that make a project reproducible, maintainable, and discoverable.
100 × 0.17 + 100 × 0.22 + 100 × 0.17 + 0 × 0.11 + 100 × 0.17 + 100 × 0.17 Excluded as unobservable, with weight redistributed: Default branch protection.
| Component | Score | Weight | Observed |
|---|---|---|---|
| .gitignorePresent scores 100, absent scores 0. | 100 | 15 | Present |
| Dependency lockfileAny recognized lockfile scores 100, none scores 0. A lockfile makes builds reproducible. | 100 | 20 | Present: yarn.lock |
| Dependency update automationDependabot or Renovate configuration scores 100, absent scores 0. | 100 | 15 | Configured at .github/dependabot.yml |
| CODEOWNERSPresent scores 100, absent scores 0. | 0 | 10 | Absent |
| Release tagsAt least one tag scores 100, none scores 0. Unreadable scores null and its weight is redistributed. | 100 | 15 | 174 tags |
| Description and topicsA description scores 50, 3 or more topics scores the other 50. | 100 | 15 | Description set, 6 topics |
| Default branch protectionProtected scores 100, unprotected scores 0. Requires elevated permissions to read; when unreadable it scores null and its weight is redistributed. | Excluded | 10 | Unable to verify from public GitHub data |
Measures observable security practices: a documented reporting channel, automated dependency updates, scanning declared in CI, and a committed lockfile.
No recognized security scanning step was found in the repository workflow files RepoSignal examined. This reflects what is declared in those files, not whether scanning happens by some other means.
Recommendation: Consider adding a scanning step such as CodeQL or a dependency review action to CI.
100 × 0.30 + 100 × 0.25 + 0 × 0.25 + 100 × 0.20
| Component | Score | Weight | Observed |
|---|---|---|---|
| Security policyA SECURITY.md scores 100, absent scores 0. It tells a reporter where to send a vulnerability privately. | 100 | 30 | Present at SECURITY.md |
| Dependency update automationDependabot or Renovate configuration scores 100, absent scores 0. | 100 | 25 | Configured at .github/dependabot.yml |
| Security scanning in CIA recognized scanning step in a workflow file scores 100, none scores 0. | 0 | 25 | None detected |
| Committed lockfileAny recognized lockfile scores 100, none scores 0. Pinned dependencies make what is installed auditable. | 100 | 20 | Present: yarn.lock |