{"id":51417757,"url":"https://github.com/didrod205/fake-star-detector","last_synced_at":"2026-07-04T21:30:37.758Z","repository":{"id":367068418,"uuid":"1278636521","full_name":"didrod205/fake-star-detector","owner":"didrod205","description":"Is this GitHub repo's hype real? Crawls a repo's recent stargazers and flags purchased/bot stars from the timing spikes and the empty accounts behind them. A fake-o-meter + a self-updating leaderboard of trending repos. Public data, no key needed.","archived":false,"fork":false,"pushed_at":"2026-07-03T11:03:52.000Z","size":104,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-03T13:08:07.275Z","etag":null,"topics":["astroturf","bots","cli","crawler","fake-stars","github","no-api-key","stars","trending","typescript"],"latest_commit_sha":null,"homepage":"https://didrod205.github.io/fake-star-detector/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/didrod205.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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-24T01:31:07.000Z","updated_at":"2026-07-03T11:03:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/didrod205/fake-star-detector","commit_stats":null,"previous_names":["didrod205/fake-star-detector"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/didrod205/fake-star-detector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didrod205%2Ffake-star-detector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didrod205%2Ffake-star-detector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didrod205%2Ffake-star-detector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didrod205%2Ffake-star-detector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/didrod205","download_url":"https://codeload.github.com/didrod205/fake-star-detector/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/didrod205%2Ffake-star-detector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35136712,"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-07-04T02:00:05.987Z","response_time":113,"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":["astroturf","bots","cli","crawler","fake-stars","github","no-api-key","stars","trending","typescript"],"created_at":"2026-07-04T21:30:36.959Z","updated_at":"2026-07-04T21:30:37.733Z","avatar_url":"https://github.com/didrod205.png","language":"TypeScript","funding_links":["https://github.com/sponsors/didrod205"],"categories":[],"sub_categories":[],"readme":"# fake-star-detector ⭐\n\n**Is this GitHub repo's hype real?** Crawls a repo's recent stargazers and flags purchased/bot stars — from the **timing spikes** (hundreds in an hour) and the **empty accounts** behind them (days old, zero followers, zero repos, starred one thing and vanished). A fake-o-meter 0–100, with the receipts. No API key needed; a token just raises the rate limit.\n\n### 🌐 [**Check any repo + today's trending leaderboard →**](https://didrod205.github.io/fake-star-detector/)\n\nPaste a repo and it analyzes the stars live in your browser. Same engine in your terminal:\n\n```bash\nnpx fake-star-detector facebook/react\nnpx fake-star-detector trending     # rank today's trending by how bought they look\n```\n\n```\n  some-trending-org/rocket-launch · 48,201 stars\n\n  82/100 ████████████████░░░░ Reeks of bought stars 🤖\n\n  timing (of 1,000 recent stars)\n    biggest burst: 412 stars in one hour · 2026-06-12T03:00Z\n    91% of them landed on a single day  ▁▁▁▁▁█▁▁\n\n  accounts (sampled 30 recent stargazers)\n    26/30 look bot-shaped (87%)\n      @xk29fja — account 2d old when it starred, 0 followers, 0 public repos, no bio\n      @qz81mn0 — account 1d old when it starred, 0 followers, 0 public repos, no bio\n      …\n\n  heuristic, not proof — fast bursts + empty accounts ≈ purchased stars. public data only.\n```\n\n## Why\n\nGitHub stars are a currency — and currencies get counterfeited. You can buy a\nthousand stars for pocket change, and a lot of repos do, especially the ones\nracing up *trending*. The fakes leave two fingerprints this tool reads:\n\n1. **Timing.** Real stars trickle in; bought stars arrive in a wall — hundreds in\n   an hour, the whole batch in a day.\n2. **The accounts.** A real stargazer has a history. A bought one is a shell:\n   created days ago, zero followers, zero repos, one star, gone.\n\n`fake-star-detector` samples the **recent** stargazers (where the dumps show up),\nmeasures both, and gives you a score and the receipts.\n\n## How it works\n\n```\nGitHub stargazers API (starred_at)  ─crawl recent→  timing spikes  ─┐\nGitHub users API (account metadata) ─sample→  empty-account share  ─┴→  fake-o-meter\n```\n\n- **Browser-safe** — `api.github.com` allows CORS, so the exact same crawler runs\n  in the CLI, in CI, and live in the web page (no `node:*` in the core).\n- **Account signal dominates** the score (empty accounts are the real tell); the\n  timing concentration and single-hour burst corroborate. Among *trending* repos a\n  big burst is expected, so we don't cry wolf on timing alone.\n- The **live leaderboard** is static: a GitHub Action re-analyzes trending every\n  few hours and commits the result — no server.\n\n## Install \u0026 usage\n\n```bash\nnpm i -g fake-star-detector     # then:  fake-star-detector owner/repo\n# or zero-install:\nnpx fake-star-detector owner/repo\n```\n\n```bash\nfake-star-detector facebook/react           # analyze one repo\nfake-star-detector trending                 # rank today's trending by suspicion\nfake-star-detector owner/repo --sample 50    # sample more accounts (more confident)\nfake-star-detector owner/repo --md           # a Markdown report\nfake-star-detector owner/repo --json         # the full analysis\n```\n\n`fakestars` is a shorter alias.\n\n| Flag | |\n| --- | --- |\n| `--token \u003ctok\u003e` | a GitHub token (also `GITHUB_TOKEN` / `GH_TOKEN`) — raises 60 → 5,000 req/hr |\n| `--pages \u003cn\u003e` | stargazer pages (×100 most-recent stars) to pull (default 10) |\n| `--sample \u003cn\u003e` | recent stargazer accounts to sample (default 30) |\n| `--json [file]` / `--md [file]` | machine-readable / Markdown output |\n\n\u003e **Rate limits:** unauthenticated GitHub allows ~60 requests/hour — enough for a\n\u003e check or two. A read-only token (or `gh auth token`) raises it to 5,000.\n\n## Library\n\nThe core is pure and browser-safe:\n\n```ts\nimport { analyzeRepo } from \"fake-star-detector\";\n\nconst a = await analyzeRepo(\"owner/repo\", { token, sample: 40 });\na.verdict;             // { score: 82, band: \"astroturfed\", label: \"Reeks of bought stars\" }\na.suspiciousFraction;  // 0.87\na.spikes.burst;        // { hour: \"2026-06-12T03:00Z\", count: 412 }\na.samples;             // the sampled accounts, each with `suspicious` + `reasons`\n```\n\n## Honesty\n\nThis is a **heuristic, not proof.** A high score means a burst of recent stars\nfrom empty, brand-new accounts — *the shape of* purchased stars. It is not a\ncertainty, and a fast-growing legit project can have a spiky day. It reads only\n**public** data (stargazer timestamps and public account metadata), points at\n**repos** rather than people, and shows you the receipts so you can judge for\nyourself. Nothing about *you* is ever sent anywhere — in the browser, your\noptional token goes straight to `api.github.com` and stays in the tab.\n\n## Contributing\n\nThe most useful contribution is a **sharper account heuristic** or score tuning.\nSee [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\nMIT © [didrod205](https://github.com/didrod205)\n\n---\n\n\u003csub\u003eStars are a currency. This is the counterfeit detector. Heuristic, public data, judge for yourself.\u003c/sub\u003e\n\n## 💖 Sponsor\n\nFind this useful? [**Sponsor on GitHub**](https://github.com/sponsors/didrod205) — it keeps these projects maintained.\n\n[![Sponsor](https://img.shields.io/badge/Sponsor-GitHub-db61a2?logo=githubsponsors\u0026logoColor=white)](https://github.com/sponsors/didrod205)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdidrod205%2Ffake-star-detector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdidrod205%2Ffake-star-detector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdidrod205%2Ffake-star-detector/lists"}