The Problem
I had 50+ GitHub repositories and absolutely no idea which ones were worth showing to recruiters or adding to my portfolio.
Some were full products, some were half-finished experiments, and some were just "I was learning this on a Sunday" repos.
So I built a tool to solve this β GitHub Portfolio Analyzer.
What It Does
The app has two completely separate modes:
π Tab 1: Normal Analyze (Metadata)
This mode uses only GitHub API data β no AI, instant results.
Every repo gets scored from 0 to 100 based on:
Score = Stars (max 40)
+ Activity/last push (max 25)
+ Completeness: description, homepage, topics (max 25)
+ Community: forks + watchers (max 20)
Then it auto-categorizes:
- π¦ Product β Score β₯ 50 or has live demo + stars
- π οΈ Project β Score β₯ 22 or recently active
- π§ͺ Experiment β Everything else
You also get:
- π Top 3 "Most Impressive" repos with podium
- π Showcase Picker β portfolio-worthy repos highlighted
- Filter by category, search by name, sort by score/stars/date
π€ Tab 2: Deep AI Analyze (Google Gemini)
This mode reads each repo's README and sends it to Gemini 1.5 Flash for an honest review.
For each repo, AI returns:
- AI Score (0-100)
- Category: Product / Project / Experiment / Learning
- 2-3 sentence summary
- Strengths & Improvements
- Showcase Potential: High / Medium / Low
- Tech Stack detection
The two tabs are completely separate β no mixing of metadata scores and AI scores.
Tech Stack
Next.js 15 β App Router
TypeScript β Strict mode, zero `any`
Tailwind CSS β All styling
GitHub REST API β Fetch repos + README files
Google Gemini β Free tier AI analysis
Key Technical Decisions
1. Sequential fetch instead of parallel
// β Old approach - hard to debug errors
const [user, repos] = await Promise.all([fetchUser(), fetchAllRepos()])
// β
New approach - validate credentials first
const user = await fetchUser(username, token)
const repos = await fetchAllRepos(username, token)
2. Rate limit safe AI analysis
Gemini free tier = 15 requests/minute. So I added a 6 second gap between each repo analysis with a progress bar and stop button.
3. Using Bearer instead of token prefix
// β Old (deprecated)
headers["Authorization"] = `token ${token}`
// β
New (recommended)
headers["Authorization"] = `Bearer ${token}`
headers["X-GitHub-Api-Version"] = "2022-11-28"
What I Learned
-
GitHub fine-grained tokens are strict about permissions β
affiliation=ownercauses 422 errors, usetype=allinstead -
Gemini model names matter β
gemini-2.0-flash-litewithv1betais the most reliable free tier option - Mobile coding is hard but possible β this entire project was built on a mobile phone using GitHub Codespaces π
Try It
π Live Demo: https://github-portfolio-analyzer.vercel.app
β GitHub: https://github.com/Nischayb99/github-portfolio-analyzer
You'll need:
- GitHub username (for public repos)
- GitHub Personal Access Token (for private repos β free, read-only)
- Google Gemini API key (for AI analysis β free tier)
What's Next?
- [ ] Backend + auth to save analysis history
- [ ] Team/org support
- [ ] Export as PDF report
- [ ] Compare with other developers
Would love your feedback! What feature would you find most useful?
Built with β€οΈ by Nischay Bandodiya β Full-stack developer from Indore, India
Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.