Skip to content
Back to skills

Github Trending Repos

ASecurity

Find and rank trending GitHub repositories by real activity signals (commit velocity, PR throughput, contributor growth) — filters out non-code repos and scores for contribution opportunity

  • 5 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 2, 2026
developmentjavascripttypescriptpythonrustgojavac++bashnodegit

Works with

  • api

Security analysis

A100/100

Scanned September 2, 2026

npx -y skills add kookr-ai/kookr --skill github-trending-repos --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Github Trending Repos?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Github Trending Repos
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/kookr-ai-github-trending-repos/badge)](https://www.skillsdirectory.com/skills/kookr-ai-github-trending-repos)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: github-trending-repos
description: Find and rank trending GitHub repositories by real activity signals (commit velocity, PR throughput, contributor growth) — filters out non-code repos and scores for contribution opportunity
keywords: github, trending, stars, repos, popular, contribute, open source, ranking, activity, performance optimization, contribution
related: [pr-lifecycle, pre-pr-review]
---

# GitHub Trending Repos — Contribution Opportunity Finder

Discover which public GitHub repositories are genuinely active and welcoming to contributors, ranked by real activity signals rather than raw star count.

## When to Use

- Looking for open-source projects to contribute to
- Evaluating which repos are "hot" vs stagnant
- Finding performance optimization opportunities in popular projects
- Periodic scan of the OSS landscape

## Step 1: Discover Candidate Repos

Gather a broad list of popular repositories from multiple sources.

### 1a. GitHub Ranking Lists

Fetch the top-100-stars list for a comprehensive baseline:

```bash
# Fetch the curated top-100 list (auto-updated daily)
gh api repos/EvanLi/Github-Ranking/contents/Top100/Top-100-stars.md \
  --jq '.content' | base64 -d
```

### 1b. GitHub Trending Page

Use WebSearch to find currently trending repos:

```
WebSearch: "github trending repositories this week 2026"
WebSearch: "github trending {language} repositories" (e.g., TypeScript, Rust, Python)
```

### 1c. Language-Specific Rankings

For targeted searches by language:

```bash
# Top repos by language (replace LANG)
gh api repos/EvanLi/Github-Ranking/contents/Top100/LANG.md \
  --jq '.content' | base64 -d
```

Available: `TypeScript.md`, `Rust.md`, `Python.md`, `Go.md`, `CPP.md`, `Java.md`, `JavaScript.md`, etc.

## Step 2: Filter Non-Code Repositories

Remove repos that are not actual software projects. Exclude:

| Category | Examples | Why Exclude |
|----------|----------|-------------|
| Curated lists | awesome-*, public-apis | Markdown only, no code to optimize |
| Learning resources | freeCodeCamp curriculum, coding-interview-university | Educational content, not software |
| Books / guides | You-Dont-Know-JS, free-programming-books | Text, not code |
| Prompt collections | prompts.chat, system-prompts | No code |
| Style guides | airbnb/javascript | Reference, not runnable |
| Template collections | gitignore | Configuration files, not software |
| Non-software | HowToCook, 996.ICU | Not code projects |

**Keep:** Frameworks, runtimes, libraries, tools, applications, compilers, engines — anything where code contributions (features, bugs, performance) are the primary activity.

## Step 3: Collect Activity Signals

For each candidate repo, collect these metrics via GitHub API. Batch in groups of 5-10 to stay within rate limits.

### 3a. Basic Metadata

```bash
# Single repo metadata
gh api repos/{owner}/{repo} --jq '{
  stars: .stargazers_count,
  forks: .forks_count,
  open_issues: .open_issues_count,
  pushed_at: .pushed_at,
  language: .language,
  license: .license.spdx_id,
  archived: .archived
}'
```

### 3b. Commit Activity (last 52 weeks)

```bash
# Weekly commit counts — sum last 4 weeks for "recent" signal
gh api repos/{owner}/{repo}/stats/commit_activity \
  --jq '[.[-4:][] | .total] | {last_4_weeks: add, weekly_avg: (add/4)}'
```

### 3c. Community vs Owner Commits

```bash
# participation: .all = everyone, .owner = maintainers only
# High (all - owner) ratio = healthy community
gh api repos/{owner}/{repo}/stats/participation \
  --jq '{
    community_last_4w: ([.all[-4:][]] | add) - ([.owner[-4:][]] | add),
    owner_last_4w: [.owner[-4:][]] | add,
    total_last_4w: [.all[-4:][]] | add
  }'
```

### 3d. PR Throughput (last 30 days)

```bash
SINCE=$(date -d '30 days ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -v-30d +%Y-%m-%dT%H:%M:%SZ)

# PRs merged in last 30 days
gh api graphql -f query='
{
  repository(owner: "OWNER", name: "REPO") {
    pullRequests(states: MERGED, last: 100, orderBy: {field: UPDATED_AT, direction: DESC}) {
      totalCount
      nodes {
        mergedAt
      }
    }
  }
}' --jq '[.data.repository.pullRequests.nodes[] | select(.mergedAt > "'"$SINCE"'")] | length'
```

### 3e. Issue Velocity (last 30 days)

```bash
# Issues opened in last 30 days
gh api "repos/{owner}/{repo}/issues?state=all&since=$SINCE&per_page=100" \
  --jq '[.[] | select(.pull_request == null)] | length'
```

### 3f. Recent Releases

```bash
# Days since last release (0 = very active, 365+ = stale)
gh api repos/{owner}/{repo}/releases?per_page=1 \
  --jq '.[0].published_at // "none"'
```

### 3g. Contributor Count (active recently)

```bash
# Contributors with commits in last 90 days
gh api repos/{owner}/{repo}/stats/contributors \
  --jq '[.[] | select(.weeks[-13:][] | .c > 0)] | length'
```

## Step 4: Score and Rank

### Normalize Each Metric

For each metric, normalize to 0-1 across the candidate set:

```
normalized(x) = (x - min) / (max - min)
```

If `max == min`, set all values to 0.5.

### Composite Trending Score

```
trending_score =
    0.25 x normalized(commits_last_4_weeks)
  + 0.25 x normalized(prs_merged_last_30d)
  + 0.15 x normalized(issues_opened_last_30d)
  + 0.15 x normalized(community_commit_ratio)
  + 0.10 x normalized(active_contributors_90d)
  + 0.10 x recency_bonus(last_release)
```

**recency_bonus:**
- Released in last 7 days: 1.0
- Released in last 30 days: 0.8
- Released in last 90 days: 0.5
- Released in last 180 days: 0.2
- Older or no release: 0.0

### Optional: Performance Optimization Affinity

Add a bonus column for repos where perf work is especially valued:

| Signal | Bonus |
|--------|-------|
| Language is C, C++, Rust, Go | +0.2 |
| Has `performance` or `optimization` label in issues | +0.15 |
| Repo description mentions "fast", "efficient", "runtime", "engine" | +0.1 |
| Has benchmarks directory or CI benchmark job | +0.1 |

Check for perf labels:

```bash
gh api "repos/{owner}/{repo}/labels" --jq '.[].name' | grep -iE 'perf|optim|speed|benchmark'
```

## Step 5: Output Report

Present results as a ranked table:

```markdown
## Trending GitHub Repos — {date}

| # | Repository | Stars | Language | Trending Score | Perf Affinity | Highlights |
|---|-----------|------:|----------|:--------------:|:-------------:|------------|
| 1 | owner/repo | 100k | Rust     | 0.92           | High          | 85 PRs/month, daily releases |
| ...
```

### Highlight Column — What to Call Out

- Exceptional PR merge rate
- Very high community-to-owner commit ratio (welcoming to outsiders)
- Recent surge in stars or forks
- Active "good first issue" or "help wanted" labels
- Performance-related issues open

### Good First Issue Check

For repos the user is interested in:

```bash
gh api "repos/{owner}/{repo}/issues?labels=good+first+issue&state=open&per_page=5" \
  --jq '.[] | {number, title, labels: [.labels[].name]}'
```

## Rate Limit Awareness

The GitHub API has rate limits (5000 requests/hour for authenticated users). For a set of 50 repos, this workflow uses ~7 API calls per repo = ~350 calls. Safe for a single run.

Check remaining quota:

```bash
gh api rate_limit --jq '.rate | "Remaining: \(.remaining)/\(.limit) — resets \(.reset | todate)"'
```

If running low, prioritize Step 3b (commit activity) and 3d (PR throughput) — these are the highest-signal metrics.

## Anti-Patterns

- [ ] Don't rank by raw star count alone — stars measure historical popularity, not current activity
- [ ] Don't include archived repos (check `.archived` field)
- [ ] Don't include repos with no commits in the last 90 days
- [ ] Don't assume high stars = welcoming to contributors (check community commit ratio)
- [ ] Don't skip the filter step — curated lists pollute the ranking
- [ ] Don't exceed API rate limits — batch calls and check quota

## See Also

- [[pr-lifecycle]] — once you've picked a repo, follow the PR lifecycle for contributing
- [[pre-pr-review]] — self-review checklist before submitting to external projects
- [[git-commit-discipline]] — commit conventions expected by most large OSS projects

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…