A deterministic GitHub profile analyzer that scores developer profiles across 14 weighted categories, detects authenticity anomalies, and produces fully explainable reports. No black boxes: every score shows exactly which factors earned or lost points, and every claim links back to real GitHub data.
Most profile analyzers either show raw numbers with no context or hide behind an LLM that invents a different story on every run. This project takes a third path:
- Deterministic by design. The same profile always produces the same scores. 43 sampled rules evaluate account age, contribution patterns, repository quality, release discipline, security posture, community health, and more.
- Explainable scores. Hovering any score reveals its factor breakdown: what was measured, how many repositories were sampled, points earned versus possible, and concrete remediation steps when a score is low.
- Anomaly detection without accusations. 45 signals flag statistical patterns such as burst contributions, self-merge ratios, fork abandonment, and commit monotony. Flags are presented as context with caveats, never as verdicts.
- Honest about limits. Rules that cannot be computed truthfully from public data (branch protection, follower history) report themselves as unavailable instead of guessing.
A single deep-dive pass collects everything in about 30 GitHub API requests, well inside the Cloudflare Workers subrequest budget:
- One batched GraphQL query loads the profile core: contribution calendar, social graph, gists, pinned items, and two years of contribution history.
- Repository discovery runs through paginated GraphQL, then top repositories are enriched in batches of four with languages, releases, community files, dependency manifests, CI status, and per-commit statistics including additions, deletions, and signature validity.
- Weekly activity, punch cards, participation splits, contributor rankings, and churn series are derived from already-fetched data instead of extra REST calls.
- Search aggregators compute global counters such as external PR acceptance rate, discussion answers, and issue resonance in one request.
- Community health profiles and Actions run histories add authoritative documentation coverage and live CI pass rates for the top five repositories.
All results stream to the dashboard over Server-Sent Events so you can watch each phase complete.
Analysis
- Deterministic scoring across 14 categories with published weights
- 38 baseline metrics, from GPG signature ratio to release cadence
- 45 anomaly signals with sampling caveats and confidence ratings
- Year-over-year momentum, work rhythm, archetype, and portfolio interpretation
Transparency
- Per-factor score breakdowns with earned-versus-max bars
- Remediation hints attached to low scores
- Sampling windows and data-source labels on every metric
Platform
- GitHub OAuth login plus verified-star guest access
- Server-side rate limiting and encrypted session handling
- Snapshot history with side-by-side comparison
- PDF report export
- Responsive retro-styled dashboard with dark mode
- Framework: Next.js 16 with React 19 (App Router)
- Language: TypeScript
- Database: Neon serverless PostgreSQL
- Caching and rate limiting: Upstash Redis
- Sessions: JWT via jose, AES-256-GCM encrypted tokens
- PDF generation: react-pdf
- Styling: Tailwind CSS v4
- Validation: Zod
- Testing: Vitest
- Node.js 22+ (npm)
- A GitHub OAuth application (client id and secret)
- GitHub personal access tokens for the analysis pool
- Neon PostgreSQL database
- Upstash Redis instance
git clone https://github.com/0xarchit/github-profile-analyzer.git
cd github-profile-analyzer
npm installCreate a .env.local file:
| Variable | Purpose |
|---|---|
GITHUB_TOKENS |
Comma-separated token pool used for analysis |
GITHUB_PAT_TOKENS |
Optional secondary PAT pool |
DATABASE_WRITE |
Neon PostgreSQL connection string |
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET |
OAuth application credentials |
JWT_SECRET |
Session signing key |
ENCRYPTION_SECRET |
AES-256-GCM encryption key |
UPSTASH_URL / UPSTASH_TOKEN |
Redis caching and rate limiting |
NEXT_PUBLIC_APP_URL |
Public base URL of the deployment |
npm run devServer runs on http://localhost:3000
npm run testnpm run build
npm run start| Route | Description |
|---|---|
GET /api/analyze/deterministic/stream |
Run the deterministic engine with SSE progress streaming |
GET /api/analyze/deterministic |
Run the deterministic engine and return JSON |
POST /api/analyze |
Legacy AI-assisted analysis |
GET /api/contributions |
Fetch contribution data |
GET /api/scans/[id] |
Retrieve a stored scan |
GET /api/star-status |
Verify repository-star access |
POST /api/auth/github |
Initiate GitHub OAuth |
GET /api/auth/github/callback |
OAuth callback handler |
GET /api/auth/me |
Current session identity |
POST /api/auth/logout |
End session |
GET /api/users/settings |
Fetch user settings |
POST /api/users/settings |
Update user settings |
src/
├── app/ # App Router pages and API routes
├── components/ # Dashboard UI and charts
├── lib/
│ └── deterministic/ # Scoring engine
│ ├── fetchers/ # Batched GraphQL and REST collection
│ ├── rules/ # Baseline, signal, score, and chart rules
│ └── types.ts # Engine contracts
└── types/ # Shared TypeScript types
scripts/ # Smoke tests and GraphQL experiment harnesses
If this project helped you, here are two ways to give back:
- Give the repository a star. Stars help other developers discover the tool and guide which features get built next.
- Sponsor the maintainer to support ongoing development, token costs for the public instance, and future features.
| Contributing | Security | License | Support |
|---|---|---|---|
| Guidelines | Policy | MIT | Issues |
Issues and pull requests are welcome.
