How I ranked GitHub developers with one score (and what the math taught me)
Description and use
A GitHub profile ranking system that uses log scaling and caps to produce a single score, enabling recruiters to quickly assess candidates.
Problem
Recruiters need a quick, comparable metric for GitHub profiles to decide which developers to investigate further.
Outcome
The scoring system produces a single, comparable metric that balances multiple signals while mitigating outliers through log scaling and caps. It enables recruiters to filter and rank developers efficiently and provides transparency via a breakdown of each component.
Workflow
- 1. Collect public data via GitHub API: repos, stars, followers, recent events, account age.
- 2. Filter repos to exclude forks and sum stars.
- 3. Compute log-scaled components: repos, stars, followers.
- 4. Compute capped components: activity (events/30 capped at 1) and age (days/3650 capped at 1).
- 5. Multiply each component by its weight (30, 35, 15, 15, 5).
- 6. Sum weighted components and round to one decimal place to produce the final score.
- 7. Display the score with a breakdown bar showing each signal’s contribution.
- 8. Cache API responses (~8 h) to stay within rate limits.
- 9. Provide language and country filtering based on repo languages and location keyword matching.
- 10. Offer a public repo board sorted by stars and recent push activity.
- 11. Allow users to add or remove their GitHub username and verify ownership for a badge.
Evidence
Five signals, all from the public GitHub API: public repos you own, forks excluded; total stars on those repos; followers; public events in the last 90 days; account age.
The total is the sum, rounded to one decimal place.
Activity is min(events / 30, 1). Thirty public events in 90 days is a full score, and more than that adds nothing.
Account age caps at 10 years (3,650 days) and is only worth 5 points.
Repos: GET /users/{user}/repos?per_page=100&type=owner, paged up to 5 pages, then forks are filtered out.
Events: GET /users/{user}/events/public?per_page=100, then filtered to the last 90 days.
- Record date: 2026-10-26T15:11:23.753Z