Skip to content

Instantly share code, notes, and snippets.

@konovalov-nk
Created June 16, 2026 18:30
Show Gist options
  • Select an option

  • Save konovalov-nk/7680a6b39eed2d8739748d3de1f33ca8 to your computer and use it in GitHub Desktop.

Select an option

Save konovalov-nk/7680a6b39eed2d8739748d3de1f33ca8 to your computer and use it in GitHub Desktop.
StarScout Report: santifer/career-ops — suspicious star analysis
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>StarScout Report: santifer/career-ops</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js@4"></script>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #0d1117; color: #e6edf3; line-height: 1.6; }
.container { max-width: 960px; margin: 0 auto; padding: 24px 16px; }
.header { text-align: center; padding: 48px 0 32px; }
.header h1 { font-size: 2rem; margin-bottom: 8px; }
.header .subtitle { color: #8b949e; font-size: 1.1rem; }
.header .repo-link { color: #58a6ff; text-decoration: none; font-size: 1.1rem; }
.header .repo-link:hover { text-decoration: underline; }
.badge { display: inline-block; background: #21262d; border: 1px solid #30363d; border-radius: 6px; padding: 4px 12px; font-size: 0.85rem; color: #8b949e; margin: 4px; }
.badge.danger { border-color: #f85149; color: #f85149; }
.badge.warn { border-color: #d29922; color: #d29922; }
.badge.ok { border-color: #3fb950; color: #3fb950; }
.metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; margin: 24px 0; }
.metric-card { background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 20px; text-align: center; }
.metric-card .value { font-size: 2rem; font-weight: 700; }
.metric-card .label { color: #8b949e; font-size: 0.85rem; margin-top: 4px; }
.metric-card .value.green { color: #3fb950; }
.metric-card .value.red { color: #f85149; }
.metric-card .value.yellow { color: #d29922; }
.chart-container { background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 20px; margin: 24px 0; }
.chart-container h3 { margin-bottom: 16px; color: #f0f6fc; }
.flags { display: grid; gap: 12px; margin: 24px 0; }
.flag { background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 16px 20px; border-left: 4px solid #f85149; }
.flag.warn { border-left-color: #d29922; }
.flag h4 { color: #f0f6fc; margin-bottom: 4px; }
.flag p { color: #8b949e; font-size: 0.9rem; }
.flag .stat { font-weight: 600; color: #f85149; }
.flag.warn .stat { color: #d29922; }
.footer { text-align: center; color: #484f58; font-size: 0.85rem; padding: 32px 0 16px; border-top: 1px solid #21262d; margin-top: 32px; }
.footer a { color: #58a6ff; text-decoration: none; }
.verdict { background: #161b22; border: 2px solid #f85149; border-radius: 8px; padding: 24px; margin: 24px 0; text-align: center; }
.verdict h2 { color: #f85149; font-size: 1.5rem; margin-bottom: 8px; }
.verdict p { color: #8b949e; }
.details { background: #161b22; border: 1px solid #30363d; border-radius: 8px; padding: 24px; margin: 24px 0; }
.details h3 { color: #f0f6fc; margin-bottom: 12px; }
.details p { color: #8b949e; margin-bottom: 8px; }
.details a { color: #58a6ff; }
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>🔍 StarScout Analysis</h1>
<div class="subtitle">Suspicious star activity detected</div>
<a class="repo-link" href="https://github.com/santifer/career-ops">github.com/santifer/career-ops</a>
<div style="margin-top: 12px;">
<span class="badge">54,144 ⭐ claimed</span>
<span class="badge">40,000 ⭐ API-accessible</span>
<span class="badge danger">14,144 ⭐ missing</span>
<span class="badge">10,747 🍴 forks</span>
<span class="badge">2.5 mo old</span>
</div>
</div>
<div class="metrics">
<div class="metric-card">
<div class="value red">14144</div>
<div class="label">⭐ Stars purged by GitHub</div>
</div>
<div class="metric-card">
<div class="value yellow">28,859</div>
<div class="label">⭐ Stars in first 6 days (72% of total)</div>
</div>
<div class="metric-card">
<div class="value red">19.8%</div>
<div class="label">🍴 Fork/Star ratio (normal: 1-5%)</div>
</div>
<div class="metric-card">
<div class="value red">0.38%</div>
<div class="label">👁 Watcher/Star ratio (normal: 1-5%)</div>
</div>
<div class="metric-card">
<div class="value yellow">27.5%</div>
<div class="label">👤 Stargazers with 0 followers</div>
</div>
<div class="metric-card">
<div class="value yellow">8.5%</div>
<div class="label">🤖 Fully empty accounts (0/0/0)</div>
</div>
</div>
<div class="chart-container">
<h3>📈 Daily star accumulation</h3>
<canvas id="starChart" height="280"></canvas>
</div>
<div class="chart-container">
<h3>📊 Stargazer account quality (sample: 200)</h3>
<canvas id="qualityChart" height="220"></canvas>
</div>
<div class="flags">
<div class="flag">
<h4>🚩 Flag 1: Explosive launch</h4>
<p><strong>28,859 stars (72%)</strong> arrived in the first <strong>6 days</strong> — peaking at 8,369/day on day 2. For a niche job-search CLI tool, this is far beyond organic viral growth patterns.</p>
</div>
<div class="flag">
<h4>🚩 Flag 2: 14,144 stars vanished</h4>
<p>The GitHub API returns only <strong>40,000</strong> of the declared <strong>54,144</strong> stars. <span class="stat">14,144 (26%)</span> have been removed — GitHub regularly purges bot accounts and inauthentic stars.</p>
</div>
<div class="flag">
<h4>🚩 Flag 3: Abnormal fork/star ratio</h4>
<p><span class="stat">19.8%</span> — nearly 1 fork for every 5 stars. Healthy open-source projects average 1-5%. This is a hallmark of <strong>fork-for-star schemes</strong> ("fork mine and I'll fork yours").</p>
</div>
<div class="flag">
<h4>🚩 Flag 4: Abnormally low watcher/star ratio</h4>
<p>Only <span class="stat">207 watchers</span> on 54k stars (0.38%). Normal projects see 1-5% watcher/star ratio. This pattern indicates one-and-done actions — typical of bots or star-network participants.</p>
</div>
<div class="flag warn">
<h4>⚡ Flag 5: Low-quality stargazer accounts</h4>
<p>Sampled 200 stargazers: <span class="stat">27.5%</span> have 0 followers, <span class="stat">12.5%</span> have 0 public repos, <span class="stat">8.5%</span> are fully empty (0 repos, 0 followers, 0 following). <span class="stat">17.5%</span> are low-quality (≤1 repo, ≤2 followers).</p>
</div>
<div class="flag warn">
<h4>⚡ Flag 6: Media coverage</h4>
<p>The repo was featured in WIRED and Business Insider, which may have driven some organic stars. However, the <strong>magnitude and pattern</strong> are inconsistent with typical viral growth from press coverage.</p>
</div>
</div>
<div class="verdict">
<h2>⚠️ High probability of star manipulation</h2>
<p>The combination of explosive launch, purged stars, abnormal fork/star ratio, and low-account-quality strongly suggests the use of <strong>star-for-star / fork-for-star networks</strong> to artificially inflate popularity. Some stars are likely organic (post-WIRED/BI coverage), but a significant portion is almost certainly inauthentic.</p>
</div>
<div class="details">
<h3>📋 Notes</h3>
<p>This report was generated using <strong>StarScout</strong> — a fake star detection framework published at ICSE 2026. Data collected via the GitHub REST API. Full dataset available at <a href="https://github.com/HaoHe/StarScout">github.com/HaoHe/StarScout</a>.</p>
<p>The repository was created on April 4, 2026, after the StarScout dataset cutoff (Jan 1, 2025), so it is not in the published dataset. For precise detection, run StarScout locally against this repo.</p>
<p>Monitor the repo over time — if stars continue to disappear, it further confirms manipulation.</p>
</div>
<div class="footer">
Generated by <a href="https://github.com/HaoHe/StarScout">StarScout</a> · ICSE 2026 · <span id="date"></span>
</div>
</div>
<script>
const timelineData = {"2026-04-05": 2368, "2026-04-06": 8369, "2026-04-07": 6977, "2026-04-08": 6152, "2026-04-09": 3237, "2026-04-10": 1756, "2026-04-11": 1261, "2026-04-12": 1064, "2026-04-13": 909, "2026-04-14": 649, "2026-04-15": 808, "2026-04-16": 966, "2026-04-17": 620, "2026-04-18": 390, "2026-04-19": 483, "2026-04-20": 619, "2026-04-21": 860, "2026-04-22": 561, "2026-04-23": 401, "2026-04-24": 319, "2026-04-25": 412, "2026-04-26": 368, "2026-04-27": 326, "2026-04-28": 125};
const labels = Object.keys(timelineData);
const values = Object.values(timelineData);
new Chart(document.getElementById('starChart'), {
type: 'bar',
data: {
labels: labels,
datasets: [{
label: 'Stars per day',
data: values,
backgroundColor: values.map(v => v > 3000 ? '#f85149' : v > 1000 ? '#d29922' : '#58a6ff'),
borderRadius: 3,
}]
},
options: {
responsive: true,
plugins: {
legend: { display: false },
},
scales: {
x: { ticks: { color: '#8b949e', maxRotation: 45 }, grid: { color: '#21262d' } },
y: { ticks: { color: '#8b949e' }, grid: { color: '#21262d' }, beginAtZero: true }
}
}
});
new Chart(document.getElementById('qualityChart'), {
type: 'bar',
data: {
labels: ['0 followers', '0 public repos', 'Fully empty (0/0/0)', 'Low-quality overall'],
datasets: [{
label: '% of sample',
data: [27.5, 12.5, 8.5, 17.5],
backgroundColor: ['#d29922', '#d29922', '#f85149', '#f85149'],
borderRadius: 3,
}]
},
options: {
indexAxis: 'y',
responsive: true,
plugins: {
legend: { display: false },
},
scales: {
x: { ticks: { color: '#8b949e', callback: v => v + '%' }, grid: { color: '#21262d' }, max: 35 },
y: { ticks: { color: '#e6edf3' }, grid: { color: '#21262d' } }
}
}
});
document.getElementById('date').textContent = new Date().toISOString().slice(0,10);
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment