How the Builder Score works
The score runs from 0 to 1000. It is a pure function of the collected metrics, so the same snapshot always gives the same score. The formula lives in src/lib/scoring.
Log scaling. Each metric is normalised as min(1, ln(1+x) / ln(1+cap)). The first few units count most, and nothing scores beyond its cap, so mass-produced commits or repos stop paying off.
Recency. Merged PRs and contributions are bucketed by year and decay with a 1-year half-life, so recent work moves the score. Actions and test runs are all-time counts, because GitHub doesn't expose them by year cheaply.
Self-declared items (from portfolio.yml or the dashboard) count at 50% of a detected one.
Weights
| Metric | Category | Max points | Saturates at |
|---|---|---|---|
| Apps deployed | Shipping | 150 | 30 |
| Apps built | Shipping | 100 | 40 |
| Vercel projects | Shipping | 50 | 30 |
| Prototypes | Shipping | 50 | 30 |
| PRs merged | Collaboration | 150 | 500 |
| Contributions | Collaboration | 100 | 5,000 |
| Test runs passed | Engineering rigor | 120 | 2,000 |
| Actions runs | Engineering rigor | 80 | 5,000 |
| Repositories | Breadth | 40 | 150 |
| Projects | Breadth | 30 | 20 |
| Integrations | Breadth | 50 | 25 |
| Hackathons | Hackathons | 80 | 15 |
Tiers
Explorer 0–199 · Builder 200–399 · Shipper 400–599 · Architect 600–799 · Legend 800+
What is inferred
- Test runs passed counts successful runs of workflows named like test/CI/e2e. It counts runs, not individual test cases.
- Apps built needs an app topic, or an app framework (Next.js, Expo, FastAPI…) in a root manifest plus a homepage or deployment.
- Apps deployed needs a successful GitHub Deployment or an external homepage URL. Homepage reachability is not checked.
- Vercel projects are repos with deployments created by the Vercel GitHub app, or come from the Vercel API when you add a token.
- Hackathons and prototypes come from repo topics, names and descriptions, plus anything you declare. Every hackathon entry also counts as a prototype, because weekend builds are prototypes by nature.
- Integrations are read from root package.json, requirements.txt and pyproject.toml only, so packages nested inside a monorepo are missed.
- Actions runs cover your 100 most recently pushed repos.