Features


Profile Score Dashboard

The main output of Devfolio Analyzer is a structured score dashboard rendered after analysis completes.

What's included

  • Overall composite score with a visual progress ring
  • Five sub-score cards (one per dimension), each with:
    • Numeric score (0–100)
    • Badge label (Excellent / Good / Fair / Weak / Poor)
    • 2–4 specific feedback points generated by the LLM
  • Top repos list showing the 6 repos used in evaluation with basic metadata
  • Language breakdown as a bar chart (top 5 languages by byte count)
  • Contribution heatmap — 52-week calendar view, client-side rendered

Contribution Consistency Analysis

This is the most technically nuanced dimension. Raw commit counts mean nothing without context.

What the analysis measures:

  • Active weeks — weeks in the last 52 with at least one contribution
  • Longest streak — consecutive days with at least one contribution
  • Recency decay — contributions weighted more heavily if they're in the last 90 days
  • Gap detection — flags gaps of 30+ days as a signal of inconsistency

Bots, organization events, and forked repo contributions are excluded from the calculation where detectable.


Project Quality Evaluation

For each of the top 6 repos (ranked by a combination of stars, forks, and last-push recency), the analyzer checks:

Signal How it's detected
Has README readme field present and > 200 chars
README quality LLM evaluates content — not just presence
Has tests Presence of test/, __tests__/, *.test.*, or *.spec.* files in file tree
Has CI/CD .github/workflows/, .circleci/, Jenkinsfile detected
Has live link homepage field in repo metadata
Commit message quality Sample of last 20 messages evaluated by LLM
Meaningful description description field present and non-generic

Note: The file tree check is limited to the top-level directory to avoid excessive API calls. Deeper test structures may not be detected.


Tech Stack Analysis

The tech stack dimension evaluates what you know and whether it's current.

Language scoring

Language percentages are pulled from GitHub's per-repo language breakdown (byte-count weighted). The analyzer:

  1. Aggregates across all public non-forked repos
  2. Normalizes to percentages
  3. Maps languages to a recency tier (e.g., Python/TypeScript/Go = current; PHP 5.x patterns = dated)

High specialization (>80% one language) scores lower than healthy breadth — unless the primary language is a modern, in-demand one.

Framework detection

Frameworks are inferred from:

  • package.json dependencies (fetched for top repos)
  • Repository topics set by the user
  • Language co-occurrence patterns (e.g., TypeScript + HTML + CSS often signals React/Next.js)

This detection is heuristic, not authoritative. If a framework doesn't appear in detectable signals, it won't be counted.


Portfolio Presentation Check

GitHub profiles have a presentation layer that many developers neglect. This dimension scores it.

Evaluated signals:

  • Profile README — does username/username repo exist and have meaningful content?
  • Pinned repos — are 6 repos pinned? Are they the developer's best work or arbitrary?
  • Bio — is it filled in? Does it contain role, location, or contact information?
  • Avatar — is it a real photo or default identicon? (heuristic: identicons score 0 for this signal)
  • Social links — Twitter/X, LinkedIn, or personal site linked in profile
  • Repo descriptions — what percentage of public repos have non-empty descriptions?

After analysis completes, a unique slug is generated for the result. The report is persisted in the database and accessible at:

Reports expire after 30 days by default. Users can re-analyze at any time to refresh their score.


Rate Limiting

The API enforces rate limits to prevent abuse and manage GitHub API quota:

  • Anonymous requests: 5 analyses per IP per hour
  • Authenticated requests (API key): 60 analyses per hour
  • Same username: Results are cached for 6 hours — repeated requests for the same username within that window return the cached result

Rate limit headers are returned on every API response:

X-RateLimit-Limit: 5
X-RateLimit-Remaining: 3
X-RateLimit-Reset: 1717200000