Scoring Algorithm
How RepoQuality Scores Repositories
Each repository is graded A through F across five categories. The overall grade is a weighted average.
New in v1.3.0 — Added commit frequency trend, release cadence, README quality, stale issue ratio, first response time, PR size, PR review depth, contributor growth, and recent activity metrics. See details below.
Categories and Metrics
Activity (weight: 30%)
| Metric | A | B | C | D | F |
|---|---|---|---|---|---|
| Days since last commit | <7 | <30 | <90 | <180 | 180+ |
| Commits per month | 30+ | 10+ | 3+ | 1+ | 0 |
| Days since last release | <30 | <90 | <180 | <365 | 365+ or never |
| Commit frequency trend | growing | stable | — | declining | — |
| Release cadence | <30d | <90d | <180d | <365d | 365d+ or none |
Community (weight: 20%)
| Metric | A | B | C | D | F |
|---|---|---|---|---|---|
| README | >500 chars | — | — | — | missing or tiny |
| README quality | 4+ signals | 3 signals | 1-2 signals | — | 0 signals |
| License | permissive | — | other/custom | — | missing |
| Contributing guide | present | — | — | — | missing |
| Security policy | present | — | — | — | missing |
| CI detected | present | — | — | — | missing |
Issues (weight: 20%)
| Metric | A | B | C | D | F |
|---|---|---|---|---|---|
| Median response time | <1 day | <7 days | <30 days | <90 days | 90+ or no data |
| First response time | <1 day | <7 days | <30 days | <90 days | 90+ or no data |
| Closed issue ratio | 70%+ | 60%+ | 45%+ | 30%+ | <30% |
| Answered ratio | 90%+ | 80%+ | 65%+ | 40%+ | <40% |
| Stale issue ratio | >90% non-stale | >80% | >65% | >40% | ≤40% |
Pull Requests (weight: 15%)
| Metric | A | B | C | D | F |
|---|---|---|---|---|---|
| Median merge time | <3 days | <7 days | <30 days | <90 days | 90+ or no data |
| Closed PR ratio | 77%+ | 67%+ | 50%+ | 33%+ | <33% |
| Review ratio | 80%+ | 50%+ | 20%+ | >0% | 0% |
| PR size | <200 lines | <400 | <600 | <1000 | 1000+ or none |
| PR review depth | 2+ | 1+ | 0.5+ | >0 | 0 |
Contributors (weight: 15%)
| Metric | A | B | C | D | F |
|---|---|---|---|---|---|
| Contributor count | 10+ | 5+ | 3+ | 1+ | 0 |
| Bus factor | 5+ | 3+ | 2+ | 1 | 0 |
| Contributor growth | growing | stable | — | declining | — |
| Recent activity | 50%+ | 30%+ | 15%+ | 5%+ | <5% |
Bus Factor
Bus factor is the minimum number of contributors who collectively account for 80% of contributions. AI bots are filtered out before calculation. Known bots include: Dependabot, Renovate, Greenkeeper, Snyk, Mergify, Semantic Release, and any account ending in [bot] or -bot.
Overall Grade
Archived repositories always receive an automatic F grade, regardless of their metrics. An archived repository is a dead project.
Each category grade is converted to a numeric score (A=4, B=3, C=2, D=1, F=0). The overall grade is a weighted average across all five categories, converted back to a letter grade. Activity has the highest weight (30%) because recent development activity is the strongest signal of repository health.
Data Sources
- Primary: Platform REST APIs (GitHub, GitLab, Bitbucket, Gitea/Codeberg)
- Fallback: Web scraping with Jsoup when API access is restricted
- Caching: Results cached in PostgreSQL for 24 hours
Recommendations
After scoring, RepoQuality generates actionable recommendations for metrics graded C or below. Metrics graded A or B are considered healthy and are not flagged.
Priority levels are determined by the metric's grade:
- High — metric graded F (critical deficiency)
- Medium — metric graded D (significant weakness)
- Low — metric graded C (room for improvement)
Effort levels estimate the work required to address a recommendation:
- Trivial — changes that can be made in minutes (e.g., adding a README or LICENSE file)
- Moderate — changes requiring some setup or process changes (e.g., configuring CI, improving issue triage)
- Significant — changes requiring ongoing effort or cultural shifts (e.g., growing a contributor base, reducing bus factor)
Recommendations are sorted by priority (high first) and then by category weight. Each recommendation links to the relevant category section so you can see the underlying metrics.