How the health score is calculated.
Every cataloged repository receives a composite 0–10 score built from six deterministic health signals. No opaque AI ratings or paid endorsements — every score is mathematically verifiable from public upstream metadata.
The 6 Health Signal Engines
Total Weight: 100%Recency
Days since the last push, decaying to zero over a 90-day window. Fresh activity signals a living project.
Formula:recency = 1 − days_since_push / 90, clamped [0, 1]
Why it matters: Stale code is the #1 failure on Android. Anything under 14 days counts as fresh; 90 days of silence reads as gone.
Source: GitHub `pushed_at`
Momentum
Star velocity relative to repo age — rewards sustained growth over flash-in-the-pan spikes. Absolute reference scale, not run-relative.
Formula:momentum = ln(1 + stars) / ln(1 + 10 × age_days), clamped [0, 1] (10 stars/day = full marks)
Why it matters: A busy community keeps a project honest. An absolute curve means a quiet week in the whole catalog can't inflate every repo's score.
Source: GitHub repo `stargazers_count` + `created_at`
Issue Health
Open-issue load as a maintenance proxy, with open pull requests excluded — GitHub counts PRs as issues, which would punish PR-active repos.
Formula:issue_health = steps(open_issues − open_prs): 0 → 1.0 · <10 → 0.8 · <50 → 0.6 · <100 → 0.4 · else 0.2
Why it matters: Repos with <10 recent issues default to 0.8 to avoid punishing new or quiet repos; excluding PRs stops healthy review traffic from reading as a bug backlog.
Source: GitHub `open_issues_count` − open-PR search count
Contributors
More contributors means a healthier, bus-factor-resistant community. Capped at 20 for scoring.
Formula:contributors = min(count, 20) / 20
Why it matters: One-maintainer projects are one bad week away from abandonment; the cap stops 200-contributor mega-repos from walloping the scale.
Source: GitHub Contributors API
License
Whether the project declares an open-source license. Legal clarity matters for actually using the code.
Formula:license = 1 if SPDX present, else 0
Why it matters: No license = can't legally use or redistribute the app. Small weight because it's binary, but it's a hard gate to trust.
Source: GitHub `license` field
Abandonment Risk ↓
Inverted: starts costing points once a repo sits idle past 14 days, fully consumed by day 90. Your time is the resource this signal protects — stale apps don't get to ride on momentum.
Formula:risk = 0 (<14d) ramping to 1 (≥90d) · score uses (1 − risk)
Why it matters: Warns within 14 days but isn't a false-positive on normal release cadence (<7d would cry wolf); 90 days is the loss limit.
Source: GitHub `pushed_at` timestamp
Composite Normalization Formula
score = (0.24×Recency + 0.20×Momentum + 0.16×IssueHealth + 0.12×Contributors + 0.08×License + 0.20×(1 − AbandonmentRisk)) × 10
Output scores range from 0.0 to 10.0. Scores ≥ 7.0 represent actively maintained, healthy packages; scores between 4.0 and 6.9 indicate slowing releases or moderate issues; scores < 4.0 flag high abandonment or incompatibility risks.
Interactive Health Simulator
Adjust the 6 telemetry signals to compute the resulting 0–10 composite score.
Developer API & Feed Reference
All scoring data is exposed through open, unauthenticated REST and RSS endpoints with ETag caching.
/api/score/{owner}/{repo}Fetches real-time composite score, 6 signal breakdowns, and target SDK compatibility for any tracked repository.
curl -i https://pulsaross.vercel.app/api/score/JunkFood02/Seal
/api/feedPublic RSS 2.0 feed delivering updates on newly cataloged apps and health status changes. Filterable via ?repos=owner/repo,owner2/repo2.
curl -i https://pulsaross.vercel.app/api/feed
/api/openapiMachine-readable OpenAPI 3.1 schema defining all parameters, response envelopes, and error codes.