A real-time open source contributor leaderboard. It tracks PRs (open + merged) and issues across a GitHub organization's repositories. Uses Node.js, Express, and vanilla frontend.
Built originally for Rocket.Chat's GSoC contributor tracking, but works for any GitHub organization.
index.html ← frontend (vanilla HTML, rendered via webpack)
src/index.js ← frontend JS entry point (axios + socket.io-client)
src/server/app.js ← Express server (serves static files + proxies API + spawns refresh)
src/server/refresh.js ← background worker that polls GitHub API and writes data.json
src/server/config.json ← YOUR config (copy from config-example.json)
src/server/util/API.js ← GitHub API calls
src/server/util/Util.js ← helper utilities
admin/ ← admin panel (separate webpack build)
There is exactly one deployment path. Plain Node.js.
git clone <repo-url>
cd Opensource-Contribution-Leaderboard
cp src/server/config-example.json src/server/config.json
# Edit src/server/config.json — add your GitHub auth token, org name, contributors
npm run add # installs deps for root + server + admin
npm run build # builds frontend + admin panel
cd dist/server
node app.jsRuns on port 8080. That's it.
For local development:
npm start # webpack-dev-server on :8080
npm run serve # backend on :62050 (in a second terminal)Static/environment settings live in .env (copy from src/server/.env.example):
AUTH_TOKEN=ghp_... # GitHub personal access token
ORGANIZATION=YourOrg # GitHub org name
ORGANIZATION_HOMEPAGE=https://yourorg.com/
ORGANIZATION_GITHUB_URL=https://github.com/YourOrg
ADMIN_PASSWORD=change-this # admin panel password
SERVER_PORT=62050 # backend API portDynamic/runtime values stay in config.json (modifiable via admin panel):
{
"delay": "10",
"startDate": "2025-06-01",
"contributors": ["username1", "username2"],
"includedRepositories": ["Repo1", "Repo2"]
}delay— seconds between each contributor's API pollstartDate— filter contributions from this date onwardscontributors— GitHub usernames to trackincludedRepositories— repos to include in tracking
- No code changes without explicit request. This project favors documentation and configuration changes. Keep the codebase stable.
- Hidden rank column. The rank column and some metadata are intentionally invisible on-screen. Admins can scrape the full stats by mouse-drag selecting the leaderboard table and copying — that's a one-stroke capture by design. Do not "fix" this by changing CSS or rendering logic.
- Simplicity over complexity. Avoid over-engineering.
Endpoints at /api/:
GET /api/stats— total contributors, open PRs, merged PRs, issuesGET /api/rank?username=X¶meter=mergedprs|openprs|issues— get rankGET /api/contributor?username=X&rank=N¶meter=...— get contributor details
See REST-API.md for full docs.
- express — HTTP server
- axios — GitHub API calls
- jsonfile — JSON file read/write
- socket.io / socket.io-client — real-time updates
- webpack 4 — frontend bundling
- Don't change the hidden-rank-column behavior
- Don't over-engineer — this project values simplicity
- Don't modify code unless explicitly asked to