{"id":51010744,"url":"https://github.com/iamrajhans/star-cred","last_synced_at":"2026-06-21T02:01:57.048Z","repository":{"id":364972119,"uuid":"1269940906","full_name":"iamrajhans/star-cred","owner":"iamrajhans","description":"Score a GitHub repo's stargazers 0-100 by how many are real, active developers vs. new, inactive, or bot-like accounts. 100% client-side dashboard — runs in your browser, no backend.","archived":false,"fork":false,"pushed_at":"2026-06-15T09:28:59.000Z","size":66,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-15T11:42:15.817Z","etag":null,"topics":["bot-detection","credibility","dashboard","data-visualization","fake-stars","github","github-api","github-graphql","github-pages","react","stargazers","tailwindcss","typescript","vite"],"latest_commit_sha":null,"homepage":"https://iamrajhans.github.io/star-cred/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iamrajhans.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-15T08:36:13.000Z","updated_at":"2026-06-15T09:29:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/iamrajhans/star-cred","commit_stats":null,"previous_names":["iamrajhans/star-cred"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/iamrajhans/star-cred","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamrajhans%2Fstar-cred","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamrajhans%2Fstar-cred/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamrajhans%2Fstar-cred/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamrajhans%2Fstar-cred/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iamrajhans","download_url":"https://codeload.github.com/iamrajhans/star-cred/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamrajhans%2Fstar-cred/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34591166,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bot-detection","credibility","dashboard","data-visualization","fake-stars","github","github-api","github-graphql","github-pages","react","stargazers","tailwindcss","typescript","vite"],"created_at":"2026-06-21T02:01:56.142Z","updated_at":"2026-06-21T02:01:57.039Z","avatar_url":"https://github.com/iamrajhans.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ⭐ Star Credibility\n\n[![Star on GitHub](https://img.shields.io/github/stars/iamrajhans/star-cred?style=social)](https://github.com/iamrajhans/star-cred)\n\nA 100% client-side dashboard that analyzes a GitHub repository's **stargazers** and\nproduces a **credibility score (0–100)** — answering the question: *how many of these\nstars come from real, active developers vs. new, inactive, or bot-like accounts?*\n\nNo backend. Your GitHub token stays in your browser and talks directly to the GitHub\nAPI. Deployed as a static site on GitHub Pages.\n\n**▶ Live demo: \u003chttps://iamrajhans.github.io/star-cred/\u003e**\n\n\u003e ⭐ **Find this useful? [Star the repo](https://github.com/iamrajhans/star-cred)** — then run star-cred on it. 😉\n\n\u003c!-- Add a screenshot at docs/screenshot.png, then uncomment the line below:\n![Star Credibility dashboard](docs/screenshot.png)\n--\u003e\n\n## What it does\n\nFor a repo (`owner/name`) it fetches stargazers (most recently starred first) via the\n**GitHub GraphQL API** in lean pages of ~50 detailed users per request, and classifies\neach into:\n\n| Category | Meaning |\n|---|---|\n| **Active developer** | Established account that pushed code recently |\n| **Open-source contributor** | Established + recently active + substantial public repos and a following |\n| **Recently joined** | Account created in the last 90 days |\n| **Inactive / dormant** | Established account with ~no recent activity |\n| **Suspected fake / bot** | New account with empty profile (no repos/followers/activity) |\n\nIt then computes an aggregate credibility score, detects **suspicious star spikes**\n(clusters of stars in a short window dominated by new/fake accounts), and explains the\nresult in plain language.\n\n## How it works\n\n```mermaid\nflowchart LR\n  A[Paste repo URL] --\u003e B[PAT from localStorage]\n  B --\u003e C[\"GraphQL page 1\u003cbr/\u003e(total + cursor format)\"]\n  C --\u003e D{Offset cursors?}\n  D -- yes --\u003e E[\"Fan out pages\u003cbr/\u003e(6 concurrent)\"]\n  D -- no --\u003e F[Sequential paginate]\n  E --\u003e G[Score each stargazer]\n  F --\u003e G\n  G --\u003e H[Bucket into 5 categories]\n  H --\u003e I[\"Aggregate 0-100 score\u003cbr/\u003e+ spike detection\"]\n  I --\u003e J[\"Donut + reasoning\u003cbr/\u003e+ virtualized user list\"]\n```\n\nPer-user scoring blends five weighted signals into a 0–100 score and a category:\n\n```mermaid\nflowchart TD\n  U[Stargazer] --\u003e S1[Account age]\n  U --\u003e S2[Last-push recency]\n  U --\u003e S3[Public repos]\n  U --\u003e S4[Followers]\n  U --\u003e S5[Profile completeness]\n  S1 --\u003e W[Weighted 0-100 score]\n  S2 --\u003e W\n  S3 --\u003e W\n  S4 --\u003e W\n  S5 --\u003e W\n  U --\u003e C[Category bucket]\n  W --\u003e AGG[Repo credibility + breakdown]\n  C --\u003e AGG\n```\n\n## Scoring signals\n\nPer user (weighted): account age, recency of last public push (activity proxy), size of\npublic repo portfolio, follower count, and profile completeness. All weights and\nthresholds live in [`src/lib/scoringConfig.ts`](src/lib/scoringConfig.ts) and are easy to\ntune.\n\n\u003e **Why not exact contribution counts?** GitHub's GraphQL API rejects\n\u003e `contributionsCollection` (`RESOURCE_LIMITS_EXCEEDED`) and times out on\n\u003e `repositoriesContributedTo` (`502`) when requested across many users at once. So we use\n\u003e the most recent repository `pushedAt` as a cheap, reliable activity proxy. A future\n\u003e \"deep mode\" could fetch exact contributions one user at a time for a small sample.\n\n## Getting a token\n\nThe app needs a GitHub **Personal Access Token** (classic; `read:user` scope is enough,\nor no scopes — a token just raises the rate limit to 5,000 requests/hour). Create one at\n\u003chttps://github.com/settings/tokens/new\u003e. It is stored only in your browser's\n`localStorage`.\n\n## Develop\n\n```bash\nnpm install\nnpm run dev      # local dev server\nnpm test         # run scoring unit tests (Vitest)\nnpm run build    # production build into dist/\n```\n\n## Deploy to GitHub Pages\n\n1. The `base` path in [`vite.config.ts`](vite.config.ts) must match the repo name\n   (`/star-cred/` here — change it if you rename the repo).\n2. In the repo: **Settings → Pages → Build and deployment → Source = GitHub Actions**.\n3. Push to `main`. The workflow in\n   [`.github/workflows/deploy.yml`](.github/workflows/deploy.yml) builds and publishes\n   the site to `https://iamrajhans.github.io/star-cred/`.\n\n## Notes \u0026 limits\n\n- **Sampling vs. all:** Sampling (default 300, most recent stars first) is statistically\n  representative and cheap. \"Analyze all\" is best for repos under ~3k stars before the\n  hourly rate limit becomes a concern; a live rate-limit meter and progress bar are shown.\n- **Suspended/deleted accounts** are skipped (GitHub returns them as null nodes).\n- **Future upgrade:** a real \"Login with GitHub\" OAuth flow would require a small CORS\n  proxy (GitHub Pages can't safely hold an OAuth secret), so the PAT flow is used instead.\n\n---\n\nIf star-cred helped you trust (or question) a repo's stars, consider giving it one of\nyour own — [⭐ Star on GitHub](https://github.com/iamrajhans/star-cred).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiamrajhans%2Fstar-cred","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiamrajhans%2Fstar-cred","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiamrajhans%2Fstar-cred/lists"}