Inspiration
Developers already measure themselves with GitHub stars, streaks and contribution graphs, but those numbers feel dry. I wanted to turn them into something fun and shareable. The wanted posters from One Piece were the obvious fit: a dramatic number, a portrait and a class that makes you feel like you’ve earned a reputation. I also wanted the number to be explainable and not just made up, so the project is a mix of a game and a transparent scoring engine.
What it does
GitHub Bounty turns a GitHub username, organization or owner/repo into a wanted poster. Investigates: a short animated sequence runs while the server fetches real public data from GitHub. Scores: it calculates a 0–100 score, converts it to a bounty (from ฿1M up to about ฿3.16B) and assigns a class: Unknown, Rookie, Deckhand, Raider, Captain, Supernova, Yonko or Legendary. Poster: it draws a vintage wanted poster with your avatar, name, bounty and stats, which you can download as PNG or SVG. Flip and explain: you can flip the poster to see a “Bounty Intelligence” report, and a “Why this bounty?” breakdown shows how much each category added. Share: each bounty has a shareable link and preview image. Bounty Board: a leaderboard ranks profiles, organizations and repositories by the app’s own score.
The bounty is a gamified score, not a measure of programming ability, and the site says so.
How we built it
Frontend: Next.js 14 and TypeScript with plain CSS. There’s a day/night theme and a light parchment look with texture and a faint map background. Backend: API routes fetch data from GitHub’s REST and GraphQL APIs. Requests have timeouts, a 10-minute cache, input validation and per-IP rate limiting, and the GitHub token never reaches the browser. Scoring engine: a pure TypeScript module with configurable weights. Every signal goes through a diminishing-returns curve, sat(x, k) = 100 × (1 − e^(−x/k)), and five categories (activity, impact, engineering, community, consistency) are combined into one score. The bounty is 1,000,000 × 10^(0.035 × score). Profiles, organizations and repositories each have their own formulas. Poster engine: the poster is generated as SVG in code, with no image AI. Paper texture comes from SVG filters, and text is fitted using real glyph measurements from the bundled fonts. Export embeds the fonts so the downloaded file matches the screen. Leaderboard: Upstash Redis in production (sorted sets for the different rankings) with a local JSON file as a fallback for development. Quality: unit tests for the scoring engine, and a health endpoint that reports which storage and token are active.
Challenges we ran into
Scoring fairness: I didn’t want 100 empty repos to beat a few strong ones, so I added diminishing returns and an anti-spam penalty. Inconsistent scores: the same profile scored differently depending on whether a GitHub token (which unlocks commit and PR data) was available. I fixed it by making every profile use one formula and showing a clear error when the data can’t be fetched. Organizations: they have no personal contribution history, so I gave them their own formula based on their repositories. Poster download not matching the screen: the first PNG exports used different fonts. I solved it by embedding the fonts in the exported file and measuring text from the font files. Serverless storage: Vercel has no persistent disk, so the leaderboard moved to Upstash Redis. GitHub rate limits: I used caching, a server-side token and themed error messages.
Accomplishments that we're proud of
A poster that looks like a printed artifact, and a PNG download that matches what you see. A scoring system that is explainable, tested and easy to reconfigure. Real GitHub data end to end, with no fake numbers in the live flow. Support for three kinds of targets (people, organizations and repositories) with their own scoring. Clear, themed error states, such as “The trail has gone cold” and “The Marines have blocked the route”.
What we learned
Fair scoring needs diminishing returns and a single consistent formula, otherwise users lose trust. Rendering the same image in the browser and in an export is harder than it looks, because fonts and filters behave differently. Serverless hosting changes how you store data. Handling real-world edge cases, like organizations and rate limits, matters more than adding features. Being open about what the score does and doesn’t mean makes a gamified product easier to trust.
What's next for Gitbount
A combined cap on stars, forks and followers so one popular repo can’t boost several categories. Separate weights for profiles and repositories. A detailed per-signal breakdown on the poster back. Poster themes for different classes and rarity tiers. More repository signals, such as dependents and release cadence. A persistent, shared rate limiter. A cleaner component structure and more tests.
Built With
- css
- graphql
- next.js
- react-18
- redis
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.