📋
핵심 요약
GitHub Star는 북마크일 뿐 — 진짜 살아있는 레포는 RVS(Repo Vitality Score) 5축(Momentum 30%·Freshness 20%·Health 25%·Engagement 15%·Contemporary 10%)으로 가려낸다.
Star 50,000개지만 2년째 방치된 레포(RVS ~32점)보다, Star 5,000개에 3일 전 푸시·Open이슈 15개인 레포(RVS ~78점)가 실제로 더 쓸만하다.
GitHub API의 Star·fork·open_issues·pushed_at·created_at 값만 있으면 RVS 계산 함수를 바로 돌릴 수 있다(본문 Python 코드 포함).
GitHub Star는 북마크일 뿐 — 진짜 살아있는 레포는 RVS(Repo Vitality Score) 5축(Momentum 30%·Freshness 20%·Health 25%·Engagement 15%·Contemporary 10%)으로 가려낸다.
Star 50,000개지만 2년째 방치된 레포(RVS ~32점)보다, Star 5,000개에 3일 전 푸시·Open이슈 15개인 레포(RVS ~78점)가 실제로 더 쓸만하다.
GitHub API의 Star·fork·open_issues·pushed_at·created_at 값만 있으면 RVS 계산 함수를 바로 돌릴 수 있다(본문 Python 코드 포함).
Star가 높다고 좋은 레포? 솔직히 아니지
GitHub에서 뭐 찾을 때 Star 순으로 정렬하지? 나도 그랬어. 근데 생각해보면 Star는 그냥 북마크야. "나중에 볼게요" 누른 거랑 똑같단 말이지.
진짜 중요한 건 지금도 활발하게 돌아가고 있냐는 거잖아. 그래서 내가 쓰는 기준이 RVS(Repo Vitality Score)야. 5가지 축으로 레포의 실제 체력을 본다.
RVS — 5축 평가
| 축 | 가중치 | 뭐 보는 거냐면 |
|---|---|---|
| Momentum | 30% | 하루 평균 Star 증가량. 꾸준히 관심 받는지 |
| Freshness | 20% | 마지막 푸시가 언제인지. 7일 이내면 만점 |
| Health | 25% | Open 이슈 비율. 버그 쌓여있으면 감점 |
| Engagement | 15% | 포크 비율. 실제로 갖다 쓰는 사람이 많은지 |
| Contemporary | 10% | 2025년 이후 생성된 레포에 가산점 |
100점 만점이고, 70점 넘으면 진짜 잘 굴러가는 레포라고 보면 돼.
예시로 감 잡아보자
레포 A: Star 50,000개, 마지막 푸시 2년 전, Open 이슈 2,000개
레포 B: Star 5,000개, 마지막 푸시 3일 전, Open 이슈 15개
Star만 보면 A가 압도적으로 좋아 보이지? 근데 RVS 돌려보면:
| 레포 | Star | RVS | 해석 |
|---|---|---|---|
| A | 50K | ~32점 | 유물. 방치된 박물관 |
| B | 5K | ~78점 | 살아있는 프로젝트. 당장 써도 됨 |
차이 확 느껴지지? B가 Star는 1/10인데 실제로 쓸만한 건 B야.
왜 이게 중요하냐면
사이드 프로젝트에 쓸 라이브러리 고를 때, 팀에서 새 도구 도입 검토할 때 Star만 보고 "아 이거 유명하니까~" 했다가 낭패 보는 경우 진짜 많거든. 레포가 죽었는지 살았는지 판단하는 눈이 있어야 삽질을 줄일 수 있어.
Python으로 바로 써먹기
from datetime import datetime, date
def rvs(stars, forks, open_issues, pushed, created):
created_date = datetime.strptime(created, "%Y-%m-%d").date()
pushed_date = datetime.strptime(pushed, "%Y-%m-%d").date()
today = date.today()
days_since_created = (today - created_date).days or 1
days_since_push = (today - pushed_date).days
momentum = min(stars / days_since_created / 10, 30)
if days_since_push <= 7: freshness = 20
elif days_since_push <= 30: freshness = 18
elif days_since_push <= 90: freshness = 14
elif days_since_push <= 180: freshness = 8
else: freshness = 1
issue_ratio = open_issues / stars if stars > 0 else 1
if issue_ratio < 0.001: health = 25
elif issue_ratio < 0.005: health = 20
elif issue_ratio < 0.01: health = 15
elif issue_ratio < 0.05: health = 8
else: health = 2
fork_ratio = forks / stars if stars > 0 else 0
engagement = min(fork_ratio * 150, 15)
year = created_date.year
if year >= 2025: contemporary = 10
elif year >= 2024: contemporary = 7
elif year >= 2022: contemporary = 3
else: contemporary = 0
return round(momentum + freshness + health + engagement + contemporary, 1)
GitHub API로 Star, fork, open_issues, pushed_at, created_at만 가져오면 끝. 복사해서 바로 써도 되고.
한 줄 요약
Star는 인기투표. RVS는 건강검진. 레포 고를 땐 건강검진표를 봐라.
다음 편에선 이 RVS 기준으로 2026년 상반기 진짜 잘 나가는 오픈소스 TOP 10 뽑아볼게 ㅎㅎ
참고 자료
- GitHub 공개 API — Star, Fork, Open Issues, Push 이력 등 레포 활동 데이터
- 본문에 포함된 RVS 계산 Python 함수 — GitHub API 값만 넣으면 바로 실행 가능한 코드