This web app analyzes a GitHub user's achievement progress and displays it as a clean live counter dashboard.
Important: this dashboard is an estimate, not an official GitHub badge counter. Some values can be delayed, rounded to a tier floor, or differ from GitHub's internal achievement data.
It is made for tracking GitHub profile achievements such as:
- Starstruck
- Quickdraw
- Pair Extraordinaire
- Pull Shark
- Galaxy Brain
- YOLO
- Public Sponsor
The app shows the current counter value, current tier, next tier target, progress bar, achievement status, and detailed detected stats for each badge. It also shows a compact achievement summary row with tier multipliers such as x2, x3, and x4.
Public GitHub data works without a token. A GitHub token improves accuracy, raises API limits, and can include private repositories or private pull requests when the token belongs to the same GitHub account being analyzed.
Deployed app:
https://gitbadgecheck.vercel.app/
The app checks GitHub activity and estimates achievement progress by combining:
- GitHub REST API data
- GitHub GraphQL API data
- Public GitHub profile achievement badges
- Public sponsorship/profile information
- Recent events, pull requests, reviews, commits, discussions, and repositories
The backend tries to make counters more accurate by using official profile badge data as a minimum floor when GitHub does not expose the exact badge counter directly, but the results should still be treated as best-effort estimates.
Tracks repositories created by the user and uses the highest star count found.
Tracks issues or pull requests closed within 5 minutes of opening.
Tracks co-authored commits on merged pull requests.
Tracks pull requests opened by the user that have been merged.
Tracks accepted GitHub Discussion answers where available.
Tracks pull requests merged without review.
Tracks whether the user publicly sponsors someone through GitHub Sponsors.
- GitHub username analysis
- Optional GitHub token support
- Token tutorial modal
- Error modal for invalid usernames, invalid tokens, rate limits, and API errors
- Loading animation while analyzing
- Clean achievement counter cards
- Show Details modal for each achievement
- Achievement summary row with badge multipliers
- Animated notifications when achievements change
- Auto-sync and manual refresh
- Server-sent events for webhook-triggered refresh
- GitHub Sponsors floating button for JohnPaulZer
- Production security headers with Helmet
- API rate limit of 100 requests per 5 minutes
From the project root:
copy backend\.env.example backend\.env
copy frontend\.env.example frontend\.envOn macOS or Linux:
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.envcd backend
npm installOpen another terminal:
cd frontend
npm installcd backend
npm run devThe backend runs at:
http://localhost:5050
cd frontend
npm run devThe frontend runs at:
http://localhost:5173
- Open
http://localhost:5173. - Enter a GitHub username.
- Optional: paste a GitHub token for better accuracy.
- Click
Analyze. - Review the achievement cards.
- Click
Show Detailson any card to see detected stats and tier targets. - Use
Refreshto force a new sync. - Keep
Auto-syncenabled if you want the app to refresh automatically.
A token is optional, but recommended.
Without a token, the app can analyze public GitHub data only. With a token, the app gets higher GitHub API limits and can include private or token-accessible data when the token belongs to the analyzed account.
Open:
https://github.com/settings/personal-access-tokens/new
Create a fine-grained token with read-only access.
Recommended permissions:
- Metadata: read
- Contents: read
- Pull requests: read
- Issues: read
- Discussions: read
- Events: read, if shown by GitHub
Do not add write, admin, workflow, secret, or organization permissions for this app.
Open:
https://github.com/settings/tokens/new
For public data only, a classic token with no scopes can raise API limits.
For private repository data, classic tokens need the broad repo scope. Use that only if you understand and accept the wider access.
- Generate the token in GitHub.
- Copy it immediately.
- Paste it into the app's optional
Tokenfield. - Enter the matching GitHub username.
- Click
Analyze.
The token is sent to the backend for GitHub API requests. The frontend keeps it only in current React state and does not save it to local storage.
You can also set a backend token in backend/.env:
GITHUB_TOKEN=your_token_hereThis lets the backend reuse a server-side token for higher API limits. For private activity, use a token from the same account being analyzed.
Current security features:
.envfiles are ignored by Git.- GitHub token is not saved in browser local storage.
- Backend does not return the token to the frontend.
- Token-based cache keys use SHA-256 token hashes, not raw token values.
- Express JSON body limit is
1mb. - Helmet adds production-friendly security headers.
- API rate limit is
100requests per5minutes by default. - Production requires a specific
CORS_ORIGIN. - Webhook signature verification is supported through
GITHUB_WEBHOOK_SECRET. - Production error responses hide raw upstream details.
- GitHub does not expose every official achievement counter directly.
- This web app is not an official GitHub achievement source.
- Some values are estimates and may not exactly match GitHub's internal counters.
- Recently accepted answers, merged pull requests, or other profile activity can take time to appear.
- Public profile badges are used as a lower-bound source when available.
- Quickdraw depends on recent event history and may miss older activity.
- Private repositories require a token with access to those repositories.
- Organization repositories may require SSO or organization approval.
- Public Sponsor checks can depend on public profile visibility and GraphQL availability.
- GitHub API rate limits still apply even with a token.
GitHub Achievement Counter is a full-stack React and Express app for estimating GitHub achievement progress. It helps users see which GitHub achievements appear unlocked, which tier they are on, how close they may be to the next tier, and what GitHub activity was detected to calculate each badge.