A maintenance-health score derived from observable GitHub activity and workflow signals. It is not a security, license, or compliance assessment. Every project is evaluated across 8 weighted GitHub-backed signals and combined into a single 0-100 score.
How recently the default branch received a commit. This is the strongest indicator that someone is actively working on the project.
| Recency | Score |
|---|---|
| Within 30 days | 100 |
| Within 90 days | 75 |
| Within 180 days | 50 |
| Within 1 year | 25 |
| Over 1 year ago | 0 |
Source: defaultBranchRef.target.history(first: 1) · Direct measurement
When the most recent release was published. Regular releases indicate a project that ships to users, not just commits to main.
| Recency | Score |
|---|---|
| Within 90 days | 100 |
| Within 180 days | 75 |
| Within 1 year | 50 |
| Over 1 year ago | 0 |
Source: releases(last: 1) · Direct measurement
Median age of the 20 most recently updated open pull requests. It is a sampled proxy for maintainer responsiveness, not a full-history measurement.
| Median PR Age | Score |
|---|---|
| Under 7 days | 100 |
| Under 30 days | 75 |
| Under 90 days | 50 |
| Over 90 days | 25 |
Source: pullRequests(first: 20, states: OPEN, orderBy: UPDATED_AT) · Sampled proxy
Median age of the last comment on the 50 most recently updated open issues. It is a sampled proxy for maintainer triage activity.
| Median Comment Age | Score |
|---|---|
| Under 7 days | 100 |
| Under 30 days | 75 |
| Under 90 days | 50 |
| Over 90 days | 25 |
Source: issues(first: 50, states: OPEN, orderBy: UPDATED_AT) · Sampled proxy
Unique commit authors in the last 90 days, sampled from up to 100 recent commits on the default branch.
| Contributors (90d) | Score |
|---|---|
| 6 or more | 100 |
| 2 - 5 | 75 |
| 1 | 50 |
| 0 | 0 |
Source: defaultBranchRef.target.history(first: 100, since: 90d ago) · Sampled proxy
Share of recent commits from the top contributor, derived from the same 90-day / 100-commit contributor sample.
| Top Contributor % | Score |
|---|---|
| Under 50% | 100 |
| 50% - 69% | 75 |
| 70% - 89% | 50 |
| 90% and above | 25 |
Source: Calculated from sampled commit author distribution · Sampled proxy
Checks whether CI workflows exist, how recently they ran, how often they ran in the last 30 days, and a sampled recent success rate.
| Factor | Max Points |
|---|---|
| Workflows present | 30 |
| Last run within 7 days | 30 |
| 30+ runs/month | 20 |
| 90%+ success rate | 20 |
Source: object(expression: "HEAD:.github/workflows") + REST /actions/runs · Sampled proxy
Absolute GitHub star count as a low-weight proxy for community interest. Popularity does not imply maintenance.
| Stars | Score |
|---|---|
| 1,000+ | 100 |
| 100 - 999 | 75 |
| 10 - 99 | 50 |
| Under 10 | 25 |
Source: stargazerCount · Direct measurement
The weighted score maps to one of five verdicts — each describes the observed maintenance state, not a trajectory or risk guarantee.
See for yourself:
Results are cached to avoid excessive API calls and to keep responses fast. Free-to-use requests share one cache policy:
| Access | Fresh TTL | Stale TTL |
|---|---|---|
| Free to use | 1 day | 2 days |
API responses use canonical cache status names so agents can tell whether a score came from a fresh fetch or a cached evaluation.
| Status | Meaning |
|---|---|
| l1-hit | L1 cache hit |
| l2-hit | L2 cache hit |
| l2-stale | L2 stale |
| l2-stale-degraded | L2 stale (degraded) |
| l3-miss | Live fetch |
During the stale window, you'll receive the cached result immediately while a background refresh runs. After the stale window, a fresh fetch is triggered synchronously.