惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
博客园 - Franky
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Apple Machine Learning Research
Apple Machine Learning Research
云风的 BLOG
云风的 BLOG
人人都是产品经理
人人都是产品经理
博客园 - 【当耐特】
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
爱范儿
爱范儿
罗磊的独立博客
博客园_首页
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
V
Visual Studio Blog
T
Tailwind CSS Blog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
I Built a GitHub Repo Health Scorer with the Free Public API
Devanshu Biswas · 2026-06-14 · via DEV Community

Devanshu Biswas

Hackathon judges, hiring managers, and open-source maintainers all ask the same question fast: is this repo alive and looked-after? Eyeballing every repo — commits, license, README, open issues — is slow.

So I built a tool that turns that into one number plus a fix-list. This is Day 4 of my SolveFromZero series (real problems, small tools).

One API call gives you almost everything

const r = await fetch(`https://api.github.com/repos/${owner}/${name}`);
const data = await r.json();
// stargazers_count, forks_count, open_issues_count,
// pushed_at, license, description, topics, homepage…

No auth needed — 60 requests/hour per IP, plenty for a demo.

Turn signals into points (this is the interesting part)

Recency beats raw popularity

A repo with 50k stars last touched 3 years ago is dead. pushed_at is the strongest "maintained" signal:

const age = (Date.now() - new Date(data.pushed_at)) / 86400000; // days
const recency = age < 30 ? 20 : age < 90 ? 14 : age < 365 ? 7 : 0;

Log-scale the stars

Linear star scoring lets torvalds/linux drown out every honest small project. Compress the range:

const popularity = Math.min(20, Math.round(Math.log10(stars + 1) * 7));
// 10★ ≈ 7 pts · 1,000★ ≈ 14 · 100k★ ≈ 20 (capped)

Issue hygiene as a ratio

100 open issues on a 50-star repo is a red flag; 100 on a 50k-star repo is normal life. Score relative to stars, not the absolute count:

const ratio = data.open_issues_count / Math.max(stars, 1);
const issues = ratio < 0.05 ? 15 : ratio < 0.2 ? 10 : ratio < 0.5 ? 5 : 0;

Add points for a license, a description, topics + homepage, and a README (one extra call to /repos/:o/:r/readme). Sum to 100.

Show the breakdown, not just the score

A bare number is useless. The value is "add a LICENSE for +15" and "no README". Render each component as a bar so the maintainer sees the cheapest wins:

Recent activity   ████████████████████  20/20  · pushed this month
Has license       ░░░░░░░░░░░░░░░░░░░░   0/15  · none   ← biggest quick win
Has README        ████████████████████  10/10  · yes

The reusable shape

fetch signals → score each → sum → explain. No machine learning, no training data — just public data and transparent rules. The same shape scores npm packages, Devpost submissions, or your own portfolio repos before you ship them.

🩺 Score any public repo live: https://dev48v.infy.uk/solve/day4-repo-health.html

Day 4 of SolveFromZero. A small, real tool every day.