
Github Trending
- 796 installs
- 253 repo stars
- Updated August 4, 2026
- majiayu000/claude-arsenal
github-trending is a Claude Code skill that pulls structured GitHub trending data, applies quality filters, and extracts genuine project angles for developers who need signal beyond hype repository lists.
About
github-trending is a Claude Code skill from majiayu000/claude-arsenal that treats GitHub Trending as a hype barometer, not a quality ranking. The bundled scripts/fetch_trending.py outputs clean JSON parsed from GitHub HTML article.Box-row elements, supporting since, language, spoken, and developers filters. Developers reach for github-trending when researching rising repos, writing analysis posts, or evaluating whether a trending project shows real adoption versus AI slop. Optional enrichment uses GitHub Search API and star-history.com growth curves. The skill forbids feeding raw HTML to the LLM—always run the script first.
- Fetches clean JSON via scripts/fetch_trending.py with support for since, language, spoken, and developers filters
- Distinguishes hype from real traction using stars_today, fork ratios, maintainer history, and dependency counts
- Provides 9 core evaluation dimensions including README clarity, CI presence, issue response, and benchmark quality
- Includes self-hosted API alternatives and secondary enrichment from star-history.com, ossinsight.io, and GitHub Search A
- Hard-gate: always convert raw data into a unique angle before any product decision
Github Trending by the numbers
- 796 all-time installs (skills.sh)
- +1 installs in the week ending Jul 26, 2026 (Skillselion tracking)
- Ranked #576 of 3,282 Productivity & Planning skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/majiayu000/claude-arsenal --skill github-trendingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 796 |
|---|---|
| repo stars | ★ 253 |
| Security audit | 2 / 3 scanners passed |
| Last updated | August 4, 2026 |
| Repository | majiayu000/claude-arsenal ↗ |
How do you analyze GitHub trending repos with filters?
Pull structured GitHub trending data, apply quality filters, and extract genuine angles instead of copying hype lists.
Who is it for?
Developers researching trending open-source projects who want script-backed data and quality filtering instead of reposting hype lists.
Skip if: Teams needing deep dependency or security analysis of a single repo rather than trending discovery across GitHub.
When should I use this skill?
The developer asks about GitHub trending repos, wants trending data by language or timeframe, or needs filtered analysis of rising projects.
What you get
Structured trending JSON, filtered repo shortlist, and angle-focused analysis notes.
- Trending JSON dataset
- Filtered repo analysis
- Angle-focused summary
Files
GitHub Trending 探索
2026 版核心认知:GitHub Trending 已是严重被 hype 和 AI slop 污染的榜单(Karpathy 等反复确认)。本 skill 的唯一价值是「结构化数据 + 严格过滤 + 写出真实 angle」,而不是再输出一份 list。
职责边界(严格遵守):
- 只负责发现 + 趋势分析 + 日报/洞察报告
- 不负责把结果加工成公众号/小红书/X 帖(用
/scout-to-article或/blog-write) - 不负责多 AI 深度竞品/社区反应调研(用
/multi-ai-research)
---
何时触发(推荐触发词)
- 探索今日/本周热门
- “Rust / Python / Go 最近有什么好项目”
- “AI / Agent / LLM 领域现在 trending 什么”
- “帮我看看 GitHub trending,有没有类似 X 的项目”
- “最近什么技术在快速增长,值得关注”
- “做个 GitHub trending 日报 / 周报”
- 想过滤 hype、要真实增长信号时
不适合:纯快速事实查询(直接让 Claude 回答即可)。
---
完整工作流(必须按顺序,不要跳步)
1. 拿干净数据(优先用脚本)
# 在 skill 目录执行;如果 skill 已安装到 ~/.claude/skills,也可以换成对应安装路径
cd /path/to/spellbook/skills/github-trending
# 今日总榜 TOP 8
python3 scripts/fetch_trending.py --since daily --limit 8
# Rust 周榜
python3 scripts/fetch_trending.py --since weekly --language Rust --limit 6
# 开发者榜
python3 scripts/fetch_trending.py --developers --since daily --limit 10脚本输出结构化 JSON,绝不直接 WebFetch 原始 HTML。
2. 筛 TOP N + 过滤 hype
- 默认 5-8 个
- 优先选 stars_today 有真实增量 + forks 跟上 + 不是纯 awesome-list 的
- 参考
reference/extended.md中的「Hype 红旗」快速排除
3. 必要时轻度 enrich
- 只对最终入榜的 2-3 个项目,必要时再用 WebFetch 看 README 头部或 Releases
- 不要一上来就读全量 README
4. 套模板 + 必写 Angle
- 用参考模板组织
- 最后必须有独立一段「今日观察 / Angle」,这是产出价值所在
5. 输出 + 归档(可选)
- 普通用户:直接给 Markdown 日报
- 想后续发文:把 JSON + angle 结构喂给下游 skill
---
脚本安装与依赖
首次使用执行:
python3 -m pip install -r requirements.txt如果没有 requirements.txt,手动安装:
python3 -m pip install requests beautifulsoup4 lxml脚本位置:scripts/fetch_trending.py(相对本 skill 目录)。
支持参数见脚本 --help。所有错误都会以清晰 JSON 返回,绝不静默失败。
---
输出硬性要求
日报结尾必须包含「Angle」段,否则视为不合格输出。
好 Angle 特征:
- 指出 1-2 个跨项目模式(技术演进、社区偏好、 hype 信号)
- 给出可行动建议(“这个方向值得跟进,但优先看 fork 增长”)
- 基于今日真实数据,不复述旧知识
---
进阶场景
- 领域深度报告:先用脚本按 language 拉月榜,再结合
reference/extended.md里的评估框架写对比表。 - 长期跟踪:用
/loop技能每天定时跑脚本 + 分析,输出到固定目录。 - 想知道社区真实反应:对重点项目再调用
/multi-ai-research。 - 想发内容:把结构化结果 + angle 交给
scout-to-article。
---
Extended Reference
所有详细框架(数据源、评估维度、hype 识别、趋势分类、好/坏 Angle 示例、scraper 维护提示、2026 社区共识)已移至 `reference/extended.md`。
日常触发时不需要读它。只有你要定制模板、维护脚本、或做高精度分析时再加载。
---
更新记录:2026-05 完整重构(引入可靠 scraper 层 + 严格 pipeline + 拆分 reference + 移除所有硬编码日期/旧趋势列表)。数据永远以脚本实时输出为准。
GitHub Trending 深度参考(Extended)
本文件被 SKILL.md 通过「Extended Reference」按需加载。日常使用只需读 SKILL.md + 运行脚本;只有做深度分析、定制模板、维护 scraper 时才读这里。
核心原则(2026 版):
- GitHub Trending 是 hype 晴雨表,不是质量榜(Karpathy 等反复强调 AI slop 泛滥)。
- 本 skill 的唯一价值 = 数据 → 过滤 → 写出真实 angle,而非再列一次 list。
- 永远用脚本拿结构化数据,绝不让 LLM 直接吞原始 HTML。
---
1. 数据源(推荐优先级)
Primary(必用)
scripts/fetch_trending.py(本 skill 提供)- 输出干净 JSON
- 支持 since / language / spoken / developers
- 容错解析当前 GitHub HTML(2026 仍以 article.Box-row + h2.h3 为主)
Secondary(可选 enrich)
- GitHub Search API(需 token 时用)
- 最近创建高星:
created:>2026-01-01 stars:>500 - 最近活跃高星:
pushed:>2026-04-01 stars:>1000 - https://star-history.com(增长曲线可视化,判断是否真实爆发)
- https://ossinsight.io(官方洞察)
辅助信号(判断是否真火)
- Hacker News Show HN 评论质量
- X/Twitter 讨论密度(用 multi-ai-research 或 opencli 快速交叉)
- 实际 fork / 依赖数(比 star 更可信)
- 维护者历史(是否持续贡献 vs 一次性营销)
自托管备选(生产/高频使用推荐):
- https://github.com/NiklasTiede/Github-Trending-API(Python+FastAPI,2026-04 仍有更新)
- https://github.com/antonkomarev/github-trending-api(Rust,轻量)
---
2. 项目评估维度(筛选 + 分析必读)
基础指标(必须看)
- Stars + stars_today(脚本已提供)
- Forks / Contributors
- 最近提交频率(可后续用 API 补)
- Issue / PR 响应(社区健康)
质量信号(区分 hype vs 真实)
强正面:
- README 有清晰问题陈述 + 真实使用案例
- 有测试、CI、License
- 多个活跃维护者或公司背书
- 被其他知名项目依赖
强负面(Hype 红旗):
- 只有 README,代码极少
- Star 多但 fork 极少(营销驱动)
- Issue 积压严重,单个维护者
- 描述全是 buzzword,无具体 benchmark / 案例
- 24h 内 star 暴涨但随后归零(典型 X 推广 spike)
趋势类型(帮助写 angle)
1. 爆发型 (Viral):1 天 1000+ star,通常 HN/Reddit/X 首页 + 解决方案热点 2. 稳定增长型 (Steady):每天 10-80 star,口碑驱动,值得长期跟踪 3. 周期型:面试题、年度总结类,有固定窗口 4. 长尾型:低调但持续被用,生产力工具
写 angle 时优先挑 Steady + 有真实痛点解决的。
---
3. 趋势解读模板(推荐结构)
单项目卡片(用于 TOP N)
### {rank}. {full_name} ⭐ {stars} (+{stars_today} today)
> {description}
- **语言**: {language} | **License**: (后续 enrich)
- **为什么值得关注**: {1-2 句痛点 + 解法}
- **真实信号**: {forks / 最近活跃 / 被谁引用}
- **潜在风险**: {hype 迹象 or 成熟度问题}
- **适合人群**: {新手 / 生产 / 研究}完整日报结尾必须有「今日观察 / Angle」
这是本 skill 的灵魂。没有 angle 的输出 = 失败。
好 angle 示例:
- “今天 Rust 生态出现两个系统级重写工具,都在解决同一类高并发场景下的内存安全痛点,说明社区正在从‘能用’走向‘极致可靠’。”
- “AI Agent 类项目仍占 Trending 40%+,但真正有 star 增量且 fork 跟上的只有 3 个,说明市场已从‘概念验证’进入‘谁先有真实用户谁赢’的阶段。”
坏 angle 示例:
- “今天有几个 AI 项目上了榜,值得关注。”
- 纯复述 star 数 + 描述(没有洞察)。
---
4. 避免的陷阱(X 社区 2025-2026 共识)
- 不要只看 star 数(已被 X 营销严重污染)
- 不要把所有 “awesome-xxx” 当成趋势(它们是索引,不是创新)
- 不要忽略“star 今天暴涨但昨天也暴涨”的项目(通常是推广循环)
- 不要在日报里推荐你自己没看懂的项目
- 语言过滤时注意:GitHub trending 的“中文”内容经常是文档/教程,而非核心工具
---
5. 进阶用法
结合其他 skill
- 发现 2-3 个重点项目后 → 调用
multi-ai-research做“这个项目在 X 上的真实讨论密度” - 想发内容 → 把日报 JSON + angle 喂给
scout-to-article或直接blog-write - 想长期跟踪 → 用
loop技能每天跑一次,输出到固定目录
开发者榜特殊处理
开发者榜更适合“关注人”而非“关注项目”。适合场景:
- 找潜在合作者 / 导师
- 观察某个语言社区的意见领袖
- 招聘信号(高排名 + 频繁换工作 = 活跃人才)
---
6. Scraper 维护提示
GitHub 页面结构偶尔变化(通常是 class 重命名)。当脚本输出条目 < 3 时:
1. 手动打开 https://github.com/trending?since=daily 用浏览器检查元素 2. 更新 parse_repository / parse_developer 里的 select 选择器 3. 优先保持“多兜底 + 容错”而非精确 class 4. 考虑切换到自托管 API(更稳定)
当前(2026)主要选择器仍围绕:
article.Box-rowh2.h3.lh-condensed a(仓库名)p.my-1, p.col-9(描述)a[href$='/stargazers'](star)
---
维护者提示:每次重大 GitHub UI 改版后,跑一次 --limit 3 验证脚本是否还能产出 ≥3 条有效数据,并更新本节日期。
---
本文件最后更新:2026-05(随 skill 优化同步)。所有日期示例均已移除,永远以脚本实时数据为准。
requests
beautifulsoup4
lxml
#!/usr/bin/env python3
"""
GitHub Trending 可靠数据获取脚本
为 github-trending skill 提供干净结构化 JSON,避免 LLM 直接解析易变的 HTML。
用法示例:
python3 fetch_trending.py --since daily --limit 8
python3 fetch_trending.py --since weekly --language Rust --limit 5
python3 fetch_trending.py --developers --since daily --limit 10
python3 fetch_trending.py --since monthly --spoken-language "Chinese" --limit 10
输出: stdout JSON
{
"meta": {"source": "github-trending-scrape", "since": "daily", "language": "...", "count": N, "fetched_at": "..."},
"items": [ { "rank": 1, "full_name": "owner/repo", "url": "...", "description": "...", "language": "...", "stars": 12345, "stars_today": 234, "forks": 123, "owner": "...", "name": "..." }, ... ]
}
首次使用:
pip install requests beautifulsoup4 lxml
错误处理: 所有失败均输出带 error 的 JSON + 非零退出,绝不静默。
"""
import argparse
import json
import re
import sys
import time
from datetime import datetime, timezone
from typing import Any, Dict, List, Optional
from urllib.parse import urlencode
try:
import requests
from bs4 import BeautifulSoup, Tag
except ImportError as e:
err = {
"error": "缺少依赖",
"missing": str(e),
"suggestion": "pip install requests beautifulsoup4 lxml",
"command_example": "pip install requests beautifulsoup4 lxml"
}
print(json.dumps(err, ensure_ascii=False))
sys.exit(1)
GITHUB_BASE = "https://github.com"
TRENDING_URL = f"{GITHUB_BASE}/trending"
DEVELOPERS_URL = f"{GITHUB_BASE}/trending/developers"
DEFAULT_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
def build_url(since: str = "daily", language: Optional[str] = None, spoken_language: Optional[str] = None, developers: bool = False) -> str:
base = DEVELOPERS_URL if developers else TRENDING_URL
params: Dict[str, str] = {"since": since}
if language:
# GitHub uses slug like "rust", "python", "c++" → "c%2B%2B"
lang_slug = language.lower().replace(" ", "-").replace("++", "%2B%2B").replace("#", "%23")
base = f"{base}/{lang_slug}"
if spoken_language:
params["spoken_language_code"] = spoken_language # e.g. "zh", "en", or full? GitHub accepts code like "Chinese"
return f"{base}?{urlencode(params)}" if params else base
def fetch_html(url: str) -> str:
headers = {
"User-Agent": DEFAULT_UA,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
}
try:
resp = requests.get(url, headers=headers, timeout=20)
resp.raise_for_status()
return resp.text
except requests.RequestException as e:
raise RuntimeError(f"请求失败: {e} (URL: {url})") from e
def safe_text(tag: Optional[Tag], strip: bool = True) -> str:
if not tag:
return ""
text = tag.get_text()
return text.strip() if strip else text
def parse_stars(text: str) -> int:
if not text:
return 0
t = text.lower().replace(",", "").replace(" ", "").strip()
if "k" in t:
try:
return int(float(t.replace("k", "")) * 1000)
except ValueError:
return 0
try:
return int("".join(c for c in t if c.isdigit()))
except ValueError:
return 0
def parse_repository(article: Tag) -> Optional[Dict[str, Any]]:
"""解析单个仓库条目,容错优先"""
try:
# 仓库链接和名称 (h2.h3 > a)
h2 = article.select_one("h2.h3, h2.lh-condensed, h2")
link = h2.select_one("a") if h2 else article.select_one("a[href*='/'][itemprop]")
if not link:
link = article.select_one("a[href^='/'][class*='Link']")
if not link:
return None
href = link.get("href", "").strip()
if not href or not href.startswith("/"):
return None
full_name = href.strip("/")
# 描述
desc_tag = article.select_one("p.my-1, p.col-9, p.color-fg-muted, p")
description = safe_text(desc_tag)
# 语言
language = ""
for selector in ("span[itemprop='programmingLanguage']", "span.language"):
language = safe_text(article.select_one(selector))
if language:
break
if not language:
for span in article.select(".f6 .d-inline-block span"):
candidate = safe_text(span)
if candidate:
language = candidate
break
# Stars 总数
stars_tag = article.select_one("a[href$='/stargazers'], a[href*='stargazers']")
stars_text = safe_text(stars_tag)
stars = parse_stars(stars_text)
# 今日新增 (常见于 "X stars today" 或小 span)
today_tag = article.select_one("span.d-inline-block.float-sm-right, span:-soup-contains('stars today'), small")
stars_today_text = safe_text(today_tag)
stars_today = parse_stars(stars_today_text)
# 兜底:有些页面在 title 或相邻文本
if stars_today == 0 and "stars today" in article.get_text().lower():
m = re.search(r"(\d[\d,]*)\s*stars? today", article.get_text(), re.I)
if m:
stars_today = parse_stars(m.group(1))
# Forks (可选)
forks_tag = article.select_one("a[href$='/forks'], a[href*='forks']")
forks = parse_stars(safe_text(forks_tag))
owner, name = full_name.split("/", 1) if "/" in full_name else (full_name, "")
return {
"rank": 0, # 由调用方填充
"full_name": full_name,
"owner": owner,
"name": name,
"url": f"{GITHUB_BASE}/{full_name}",
"description": description[:300] if description else "",
"language": language,
"stars": stars,
"stars_today": stars_today,
"forks": forks,
}
except Exception:
return None
def parse_developer(article: Tag) -> Optional[Dict[str, Any]]:
"""解析开发者趋势条目"""
try:
# 开发者链接通常在 h1/h2 + a
link = article.select_one("h1 a, h2 a, a[data-hovercard-type='user']")
if not link:
link = article.select_one("a[href^='/'][class*='Link']")
if not link:
return None
href = link.get("href", "").strip("/")
if not href or "/" in href: # 跳过组织等
# 有些是 /org/repo 形式,跳过
return None
# 名称
name = safe_text(link)
# 登录
login_tag = article.select_one("span.text-normal, p.f4, .f6 a")
login = safe_text(login_tag) or href.split("/")[-1]
# 仓库贡献描述
repo_tag = article.select_one("a[href*='/'][class*='repo'] , .h4 a, .f6 a")
popular_repo = safe_text(repo_tag)
# 粉丝/贡献
followers_tag = article.select_one("span:-soup-contains('followers'), a[href*='followers']")
followers = parse_stars(safe_text(followers_tag))
return {
"rank": 0,
"login": login,
"name": name,
"url": f"{GITHUB_BASE}/{href}",
"popular_repository": popular_repo[:120] if popular_repo else "",
"followers": followers,
"type": "developer",
}
except Exception:
return None
def scrape_trending(url: str, developers: bool = False, limit: int = 10) -> List[Dict[str, Any]]:
html = fetch_html(url)
soup = BeautifulSoup(html, "lxml")
# 主要容器:article.Box-row (2025-2026 仍有效)
articles = soup.select("article.Box-row")
if not articles:
# 兜底:某些布局变化
articles = soup.select("div.Box-row, article")
items: List[Dict[str, Any]] = []
parser = parse_developer if developers else parse_repository
for idx, article in enumerate(articles[: max(limit, 25)]):
item = parser(article)
if item:
item["rank"] = idx + 1
items.append(item)
# 轻微延迟,礼貌
time.sleep(0.2)
return items[:limit]
def main() -> None:
parser = argparse.ArgumentParser(
description="GitHub Trending 结构化数据抓取 (为 AI skill 设计)"
)
parser.add_argument("--since", choices=["daily", "weekly", "monthly"], default="daily",
help="时间范围 (默认 daily)")
parser.add_argument("--language", "-l", default=None,
help="编程语言过滤,如 Rust, Python, TypeScript, 'C++'")
parser.add_argument("--spoken-language", default=None,
help="自然语言过滤,如 Chinese, English, Japanese (GitHub spoken_language_code)")
parser.add_argument("--developers", "-d", action="store_true",
help="抓取开发者榜 (默认仓库榜)")
parser.add_argument("--limit", "-n", type=int, default=10,
help="返回条数上限 (1-25,默认 10)")
parser.add_argument("--format", choices=["json"], default="json",
help="输出格式 (仅 json)")
args = parser.parse_args()
if args.limit < 1 or args.limit > 25:
print(json.dumps({"error": "limit 必须在 1-25 之间"}, ensure_ascii=False))
sys.exit(1)
url = build_url(
since=args.since,
language=args.language,
spoken_language=args.spoken_language,
developers=args.developers
)
try:
items = scrape_trending(url, developers=args.developers, limit=args.limit)
result = {
"meta": {
"source": "github-trending-scrape",
"url": url,
"since": args.since,
"language": args.language or "",
"spoken_language": args.spoken_language or "",
"mode": "developers" if args.developers else "repositories",
"count": len(items),
"fetched_at": datetime.now(timezone.utc).isoformat(),
"note": "数据来自 HTML 解析,GitHub 页面结构可能变化。建议结合 API 二次校验。"
},
"items": items
}
print(json.dumps(result, ensure_ascii=False, indent=2))
except Exception as e:
err = {
"error": str(e),
"url": url,
"suggestion": "检查网络、GitHub 是否限流,或稍后重试。必要时自托管 https://github.com/NiklasTiede/Github-Trending-API"
}
print(json.dumps(err, ensure_ascii=False))
sys.exit(1)
if __name__ == "__main__":
main()
Related skills
How it compares
Pick github-trending over manual browsing when you need structured JSON, filters, and analysis angles from GitHub Trending.
FAQ
How does github-trending fetch trending data?
github-trending uses scripts/fetch_trending.py to parse GitHub Trending HTML into clean JSON. The script supports since, language, spoken, and developers parameters and avoids sending raw HTML to the LLM.
Why does github-trending filter trending results?
github-trending filters results because GitHub Trending reflects hype, not quality, with AI-generated slop common on the page. The skill applies quality filters and writes genuine project angles instead of copying repository lists.
Is Github Trending safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.