How Ranking Works

Every chart on maal.top is ranked using publicly available metrics from official APIs. The same inputs always produce the same output — our methodology is deterministic and verifiable.

Verifiable Rank

Each chart displays a method version and hash. These change whenever the ranking logic or data source changes. You can verify that the same inputs produce the same rankings.

Data Sources

Hugging Face

Models, datasets, and spaces are ranked by trendingScore from the Hugging Face Hub API. Additional metrics: downloads and likes. No API key required for read access.

Endpoint: GET https://huggingface.co/api/models?sort=trendingScore&direction=-1&limit=100

npm

Frontend, backend, devtools, and testing packages are ranked by last-month downloads from the npm registry. Only packages on our curated allowlists (~200 packages per category) are included.

Endpoint: GET https://api.npmjs.org/downloads/point/last-month/{pkg} (bulk: 128 packages/call)

GitHub

Repositories are ranked by stars, filtered by topic. No date filter is applied — we search all time. GitHub has no official trending API — we use the Search API with verified queries (PAT required).

Endpoint: GET https://api.github.com/search/repositories?q=topic:X+stars:>500

PyPI

Top 100 Python packages by monthly downloads from the hugovk monthly dump (top-pypi-packages). No API key required.

Source: https://hugovk.dev/top-pypi-packages/top-pypi-packages.min.json

crates.io

Top 100 Rust crates by recent downloads from crates.io public API. 30-day download sparklines from per-crate version download history.

Endpoint: GET https://crates.io/api/v1/crates?sort=recent-downloads

Update Cadence

Charts update daily at 04:00 UTC via GitHub Actions. If the source API fails, yesterday's data is preserved and the chart is marked as stale.

Adding New Charts

New charts require a human pull request adding to the curated allowlist indata/curated/*.json. We do not auto-expand charts — that prevents spam.

Automated Discovery

A weekly job runs fetch/discover.mjs against 50+ product category seeds (CRM, CMS, blog, dashboard, etc.) and proposes qualifying GitHub topics (total ≥ 30 repos, 10th result ≥ 500 stars). Proposals are written todata/discover/ for human review before adding to github-topics.json.