diff --git a/AGENTS.md b/AGENTS.md index a462239..6d242fb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -21,3 +21,10 @@ Project harness follows `jammyfu/CoderSkills` → `skills/continuous-project-loo - Dirty worktree: if a run starts with uncommitted changes, finish or park them first (`verify` -> PR); do not stack new work on top. `tools/local_daily.sh` refuses to run on a dirty tree or off `main`. - Verification must not depend on the shell PATH: `tools/verify.py` and `tools/local_daily.sh` use explicit interpreters, no `shell=True` (guarded by `tests/test_harness.py`). - Do not edit the plan files to claim a result that `tools/verify.py` has not confirmed. + +## Localized introduction website + +- `docs/index.html`, `docs/{zh-Hans,zh-Hant,ja,ko}/index.html`, `docs/sitemap.xml` and `docs/llms.txt` are generated by `python3 tools/render_site.py`; do not edit them by hand. +- Edit full site translations in `tools/site_locales.json` and machine navigation in root `llms.txt`, then regenerate. Taiwan Traditional Chinese must use natural Taiwan vocabulary, not just character conversion. +- Keep all five locales' canonical/hreflang navigation reciprocal, FAQ structured data identical to visible answers, and rankings linked to the corresponding existing README. +- Run `python3 tools/render_site.py --check` (also in `tools/verify.py`). This site is an introduction, not a second ranking data source: do not copy stale metrics or fabricate hotness. diff --git a/CURRENT_PLAN.md b/CURRENT_PLAN.md index 28024e9..115496f 100644 --- a/CURRENT_PLAN.md +++ b/CURRENT_PLAN.md @@ -43,3 +43,12 @@ Complete the latest GitHub API ranking in all five languages, including the unre - Observe the existing hourly Mac job after the authorized publication, without duplicate triggers - Improve explicit English-language detection for non-CJK sources separately - Owner decision on developer-tools newcomer quality signals remains outside this round + +## Five-language introduction site (2026-11-12) + +- [x] Keep ranking tables, data, formulas and historical snapshots unchanged. +- [x] Add full Taiwan Traditional Chinese, Japanese and Korean introduction/FAQ pages. +- [x] Generate reciprocal language navigation, canonical/hreflang, visible-matching JSON-LD and sitemap for all five pages. +- [x] Reuse the existing project title image and keep the facts table readable on narrow screens. +- [x] Check generated site consistency in the repository verifier. +- [ ] Publish an independent draft PR for review; do not merge automatically. diff --git a/docs/SITE_LOCALIZATION.md b/docs/SITE_LOCALIZATION.md new file mode 100644 index 0000000..7a1a7ce --- /dev/null +++ b/docs/SITE_LOCALIZATION.md @@ -0,0 +1,31 @@ +# Maintaining the five-language introduction + +The ranking READMEs were already available in five languages. This website now offers the same five entry languages without duplicating ranking snapshots. + +| Entry | Language | Ranking destination | +| --- | --- | --- | +| `/` | English | `README.md` | +| `/zh-Hans/` | 简体中文 | `README.zh-Hans.md` | +| `/zh-Hant/` | 繁體中文(台灣用語) | `README.zh-Hant.md` | +| `/ja/` | 日本語 | `README.ja.md` | +| `/ko/` | 한국어 | `README.ko.md` | + +Edit `tools/site_locales.json`, then run: + +```bash +python3 tools/render_site.py +python3 tools/render_site.py --check +python3 tools/verify.py +``` + +The generator shares layout, language links, canonical URLs, sitemap and FAQ schema. Every FAQ schema answer comes from the same localized text shown on screen. Root `llms.txt` is copied to the published site; edit the root file only. + +## Presentation and evidence + +- Reuse `.github/social-preview.png` as project identity, not a fake screenshot of the current rankings. +- Keep the primary action pointed at the current language's live README; numeric data and ranking logic remain in the existing pipeline. +- The facts table remains a table; flexible navigation, wrapping text and a fluid title image support narrow screens without removing content. +- No client-side executable scripts or telemetry are added. JSON-LD is inert structured data. +- Discovery improvements are clearer localized titles, descriptions, links and exact answer text, not keyword stuffing or a ranking guarantee. `llms.txt` cannot guarantee AI citations. +- Supporting methodology documents linked from these pages may still be English or Simplified Chinese; this change does not claim that every repository document has five translations. +- Translations are AI-reviewed and remain open to corrections from native speakers. diff --git a/docs/index.html b/docs/index.html index 2329c83..2b73fb8 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,192 +1,32 @@ - - - - -GitHub Risers: GitHub Trending Repos Ranked by Star Growth - + + + +GitHub Risers: GitHub Trending Repos Ranked by Star Growth + + + - - - - - - - - - - - - -
-

GitHub Risers

-

GitHub trending repositories ranked by star growth (stars gained per day), not total stars. AI is the main board; developer tools, security, web, infrastructure, design and data have their own. Numbers come straight from the GitHub API and are refreshed daily.

-

It is a script-generated leaderboard: not an official GitHub product, not a manually curated list, and not a star-buying or promotion service.

+ + + + + + +
+

GitHub Risers

GitHub trending repositories ranked by star growth (stars gained per day), not total stars. AI is the main board; developer tools, security, web, infrastructure, design and data have their own. Numbers come straight from the GitHub API and are refreshed daily.

It is a script-generated leaderboard: not an official GitHub product, not a manually curated list, and not a star-buying or promotion service.

Open the latest rankings -

简体中文

-
-
-

Key facts

- - -
WhatRepositories ranked by stars gained per day over 7, 30 and 365 days, plus a 7-day hottest-new-repos board
CategoriesAI (main), Developer Tools, Security, Web / Frontend, Infrastructure, Design / Creative, Data
UpdatesDaily
Data sourceGitHub REST API only; missing data is shown as missing, never estimated
TelemetryNone
LicenseMIT
-

Rankings in five languages

- -

FAQ

-
What is GitHub Risers?

A leaderboard of GitHub repositories ranked by how fast they gain stars, not by how many they already have. AI is the main board, with separate boards for developer tools, security, web, infrastructure, design and data.

How is the growth rate computed?

per_day = stars gained over the window / days used. The gain is the sum of daily star counts from the GitHub API endpoint stargazers/history over the complete UTC days before the run. A repository younger than the window is divided by its own age and marked young.

How often is it updated?

Updated daily. Every run is archived under its own folder in the repository.

Is it the same as GitHub Trending?

No. GitHub Trending is GitHub's own page. GitHub Risers is an independent open-source project with published rules and a saved history of every update. It is not affiliated with GitHub.

What is the hottest new repos board?

Repositories created in the last 7 days with at least 100 stars, not forks, not archived, ranked by stars divided by age in days.

Does it detect fake stars?

No. It reports the counts the GitHub API returns. It only flags, with a published heuristic, new repos that look like cracked or pirated bundles and ranks them after all normal repos.

Does it use generative AI?

The rankings are computed by plain scripts. Translations of repo descriptions can be produced with an AI model in an optional step; numbers never are.

How do I cite it?

Use the CITATION.cff file in the repository (GitHub shows a Cite this repository button) and name the snapshot date.

-

Documentation

- -
-
MIT License. Author: jammyfu. No analytics or tracking. Not affiliated with GitHub.
- - + +GitHub Risers +
+

Key facts

WhatRepositories ranked by stars gained per day over 7, 30 and 365 days, plus a 7-day hottest-new-repos board
CategoriesAI (main), Developer Tools, Security, Web / Frontend, Infrastructure, Design / Creative, Data
UpdatesDaily
Data sourceGitHub REST API only; missing data is shown as missing, never estimated
TelemetryNone
LicenseMIT
+

Rankings in five languages

+

FAQ

What is GitHub Risers?

A leaderboard of GitHub repositories ranked by how fast they gain stars, not by how many they already have. AI is the main board, with separate boards for developer tools, security, web, infrastructure, design and data.

How is the growth rate computed?

per_day = stars gained over the window / days used. The gain is the sum of daily star counts from the GitHub API endpoint stargazers/history over the complete UTC days before the run. A repository younger than the window is divided by its own age and marked young.

How often is it updated?

Updated daily. Every run is archived under its own folder in the repository.

Is it the same as GitHub Trending?

No. GitHub Trending is GitHub's own page. GitHub Risers is an independent open-source project with published rules and a saved history of every update. It is not affiliated with GitHub.

What is the hottest new repos board?

Repositories created in the last 7 days with at least 100 stars, not forks, not archived, ranked by stars divided by age in days.

Does it detect fake stars?

No. It reports the counts the GitHub API returns. It only flags, with a published heuristic, new repos that look like cracked or pirated bundles and ranks them after all normal repos.

Does it use generative AI?

The rankings are computed by plain scripts. Translations of repo descriptions can be produced with an AI model in an optional step; numbers never are.

How do I cite it?

Use the CITATION.cff file in the repository (GitHub shows a Cite this repository button) and name the snapshot date.

+

Documentation

+
diff --git a/docs/ja/index.html b/docs/ja/index.html new file mode 100644 index 0000000..25b4935 --- /dev/null +++ b/docs/ja/index.html @@ -0,0 +1,32 @@ + + + + +GitHub Risers:Star 増加速度で見つける注目の GitHub リポジトリ + + + + + + + + + + + + + +
+

GitHub Risers

累計 Star 数ではなく、1 日あたりの Star 増加数でリポジトリを順位付けします。AI をメインに、開発ツール、セキュリティ、Web、インフラ、デザイン、データの個別ランキングを用意。数値は GitHub API から取得し、毎日更新します。

スクリプトで作成するランキングです。GitHub の公式製品でも、人が選ぶおすすめ一覧でもありません。Star 販売や宣伝代行サービスではありません。

+最新ランキングを見る + +GitHub Risers +
+

基本情報

内容7・30・365 日間の 1 日あたり Star 増加数で順位付け。直近 7 日の新規リポジトリランキングも掲載
カテゴリAI(メイン)、開発ツール、セキュリティ、Web/フロントエンド、インフラ、デザイン/クリエイティブ、データ
更新毎日
データソースGitHub REST API のみ。欠損データは欠損として表示し、推定しません
テレメトリなし
ライセンスMIT
+

5 言語のランキング

+

よくある質問

GitHub Risers とは?

累計 Star 数ではなく増加速度で順位付けした GitHub リポジトリのランキングです。AI がメインで、開発ツール、セキュリティ、Web、インフラ、デザイン、データにも個別ランキングがあります。

増加速度はどう計算しますか?

1 日あたりの増加数 = 集計期間内の獲得 Star 数 ÷ 使用日数です。GitHub API の stargazers/history から、実行日より前の完了した UTC 日ごとの Star 数を合計します。作成からの日数が集計期間より短い場合は、その日数で割り、新規として表示します。

更新頻度は?

毎日更新します。実行ごとに別のフォルダーへ履歴を保存します。

GitHub Trending と同じですか?

いいえ。GitHub Trending は GitHub 自身のページです。GitHub Risers は独立したオープンソースプロジェクトで、ルールと全更新履歴を公開しており、GitHub との提携関係はありません。

注目の新規リポジトリはどう選びますか?

過去 7 日以内に作成され、100 Star 以上あり、fork ではなく、アーカイブされていないリポジトリを、Star 数 ÷ 作成からの日数で順位付けします。

不正な Star を検出しますか?

いいえ。GitHub API が返す数値を表示します。公開したヒューリスティックでクラック版や海賊版の寄せ集めと思われる新規リポジトリに印を付け、通常のリポジトリの後ろに並べるだけです。

生成 AI を使いますか?

ランキングは通常のスクリプトで計算します。説明文の翻訳には任意の手順で AI モデルを使えますが、数値は AI で生成しません。

引用するには?

リポジトリの CITATION.cff を使い(GitHub の Cite this repository ボタンから確認できます)、利用したスナップショットの日付を記載してください。

+

ドキュメント

+
diff --git a/docs/ko/index.html b/docs/ko/index.html new file mode 100644 index 0000000..0a8c7b9 --- /dev/null +++ b/docs/ko/index.html @@ -0,0 +1,32 @@ + + + + +GitHub Risers: 하루 Star 증가량으로 찾는 인기 GitHub 프로젝트 + + + + + + + + + + + + + +
+

GitHub Risers

누적 Star 수가 아니라 하루 Star 증가량으로 저장소 순위를 매깁니다. AI를 중심으로 개발 도구, 보안, 웹, 인프라, 디자인, 데이터의 개별 순위를 제공합니다. 수치는 GitHub API에서 직접 가져오며 매일 갱신합니다.

스크립트로 생성하는 순위입니다. GitHub 공식 제품이나 사람이 직접 선정한 목록이 아니며, Star 판매 또는 홍보 대행 서비스도 아닙니다.

+최신 순위 보기 + +GitHub Risers +
+

핵심 정보

내용7일·30일·365일 동안의 일평균 Star 증가량 순위와 최근 7일 신규 저장소 순위
분야AI(중심), 개발 도구, 보안, 웹/프런트엔드, 인프라, 디자인/창작, 데이터
갱신매일
데이터 출처GitHub REST API만 사용합니다. 없는 데이터는 누락으로 표시하며 추정하지 않습니다
원격 측정없음
라이선스MIT
+

5개 언어의 순위

+

자주 묻는 질문

GitHub Risers는 무엇인가요?

누적 Star 수가 아니라 증가 속도로 정렬한 GitHub 저장소 순위입니다. AI를 중심으로 개발 도구, 보안, 웹, 인프라, 디자인, 데이터의 개별 순위를 제공합니다.

증가 속도는 어떻게 계산하나요?

일평균 증가량 = 기간 내 새 Star 수 ÷ 적용 일수입니다. GitHub API의 stargazers/history에서 실행일 이전에 끝난 UTC 날짜별 Star 수를 합산합니다. 저장소 생성 후 경과일이 집계 기간보다 짧으면 실제 경과일로 나누고 신규로 표시합니다.

얼마나 자주 갱신하나요?

매일 갱신하며, 실행할 때마다 저장소 내 별도 폴더에 기록을 보관합니다.

GitHub Trending과 같은 서비스인가요?

아닙니다. GitHub Trending은 GitHub 자체 페이지입니다. GitHub Risers는 규칙과 모든 갱신 기록을 공개하는 독립 오픈소스 프로젝트이며 GitHub와 제휴 관계가 없습니다.

인기 신규 저장소는 어떻게 선정하나요?

최근 7일 이내 생성되고 Star가 100개 이상이며, fork가 아니고 보관 처리되지 않은 저장소를 Star 수 ÷ 생성 후 경과일로 정렬합니다.

조작된 Star를 감지하나요?

아닙니다. GitHub API가 반환하는 수치를 표시합니다. 공개된 휴리스틱으로 크랙 또는 불법 복제 묶음이 의심되는 신규 저장소를 표시하고 일반 저장소 뒤에 배치할 뿐입니다.

생성형 AI를 사용하나요?

순위는 일반 스크립트로 계산합니다. 설명 번역은 선택 단계에서 AI 모델을 사용할 수 있지만 수치를 AI로 생성하지는 않습니다.

어떻게 인용하나요?

저장소의 CITATION.cff를 사용하고(GitHub의 Cite this repository 버튼에서 확인 가능), 사용한 스냅샷 날짜를 명시하세요.

+

문서

+
diff --git a/docs/llms.txt b/docs/llms.txt index 23ce161..7bce2d6 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -10,6 +10,10 @@ GitHub Risers is a script-generated leaderboard, not a manual editorial list. It - [README (English rankings)](https://github.com/jammyfu/github-risers#readme): the latest rankings - [README.zh-Hans.md](https://github.com/jammyfu/github-risers/blob/main/README.zh-Hans.md): 简体中文榜单 +- [Website (繁體中文)](https://jammyfu.github.io/github-risers/zh-Hant/) · [README.zh-Hant.md](https://github.com/jammyfu/github-risers/blob/main/README.zh-Hant.md) +- [Website (日本語)](https://jammyfu.github.io/github-risers/ja/) · [README.ja.md](https://github.com/jammyfu/github-risers/blob/main/README.ja.md) +- [Website (한국어)](https://jammyfu.github.io/github-risers/ko/) · [README.ko.md](https://github.com/jammyfu/github-risers/blob/main/README.ko.md) + ## Method and facts - [docs/FACTS.md](https://github.com/jammyfu/github-risers/blob/main/docs/FACTS.md): one-page facts: scope, formula, update schedule, data sources, limits - [docs/FAQ.md](https://github.com/jammyfu/github-risers/blob/main/docs/FAQ.md): questions people ask about the ranking diff --git a/docs/project-governance/WORKLOG.md b/docs/project-governance/WORKLOG.md index f500ab5..1f90692 100644 --- a/docs/project-governance/WORKLOG.md +++ b/docs/project-governance/WORKLOG.md @@ -130,3 +130,12 @@ - Verification: full `python3 tools/verify.py` passed with 240 tests; daily data verification passed with zero warnings; strict description and all-category hook audits, generated-file checks, plan validation, shell syntax and diff checks passed. Next: publish the reviewed PR, verify its exact remote/CI/Pages output, then let the unchanged hourly job continue. - Independent code review found no actionable issues. The reviewer separately passed 102 focused tests and 12 extra isolated probes, including malformed audits, empty concurrent commits, validation failures and exhausted push retries; no real model or installed task was touched. - PR CI initially exposed a Linux fixture omission: the disposable repository lacked the production .gitignore, so normal Python bytecode looked like uncommitted work. Reproduced both failures with Homebrew Python 3.15.1, copied the unchanged production ignore file into the fixture, and passed all seven shell tests plus the full 240-test verification with that interpreter. Production behavior and assertions are unchanged. + +## 2026-11-12: Five-language landing pages + +- Current five-language ranking READMEs already satisfy the table-first presentation requirement; left their generated content, popularity calculations and historical data unchanged. +- Closed the website gap: the old two-language site now has full Taiwan Traditional Chinese, Japanese and Korean introductions, six facts, eight FAQ answers and document links. +- Added `tools/site_locales.json` and deterministic `tools/render_site.py` with `--check`; all five pages share reciprocal hreflang, canonical links, a sitemap, visible-matching FAQ schema and the existing title asset. +- Root and published llms.txt now link all five languages. No analytics, new tracking scripts or ranking promises added. +- Translation was AI-reviewed, not claimed as native-human review. Existing auxiliary documents may remain English/Chinese; localized ranking pages remain available in all five languages. +- Verification: 244 unit tests passed; README generation and site generation checks passed; all 55 ranked newcomer descriptions reported translated; `tools/next_plan.py --check` and `git diff --check` passed. No historical snapshot or ranking data changed. diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 475d54c..9350526 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -1,13 +1,8 @@ - - https://jammyfu.github.io/github-risers/ - - - - - https://jammyfu.github.io/github-risers/zh-Hans/ - - - +https://jammyfu.github.io/github-risers/ +https://jammyfu.github.io/github-risers/zh-Hans/ +https://jammyfu.github.io/github-risers/zh-Hant/ +https://jammyfu.github.io/github-risers/ja/ +https://jammyfu.github.io/github-risers/ko/ diff --git a/docs/zh-Hans/index.html b/docs/zh-Hans/index.html index af431b4..e70e336 100644 --- a/docs/zh-Hans/index.html +++ b/docs/zh-Hans/index.html @@ -1,192 +1,32 @@ - - - - -GitHub 涨星榜(GitHub Risers):按涨星速度排名的 GitHub 热门仓库 - + + + +GitHub 涨星榜(GitHub Risers):按涨星速度排名的 GitHub 热门仓库 + + + - - - - - - - - - - - - -
-

GitHub 涨星榜(GitHub Risers)

-

按涨星速度(每天新增 star 数)而不是总 star 数,给 GitHub 热门仓库排名。AI 是主榜,开发工具、安全、前端、基础设施、设计、数据各有自己的榜。数字直接取自 GitHub API,每天更新。

-

它是脚本生成的榜单:不是 GitHub 官方产品,不是人工精选清单,也不是买星或推广服务。

+ + + + + + +
+

GitHub 涨星榜(GitHub Risers)

按涨星速度(每天新增 star 数)而不是总 star 数,给 GitHub 热门仓库排名。AI 是主榜,开发工具、安全、前端、基础设施、设计、数据各有自己的榜。数字直接取自 GitHub API,每天更新。

它是脚本生成的榜单:不是 GitHub 官方产品,不是人工精选清单,也不是买星或推广服务。

查看最新榜单 -

English

-
-
-

关键事实

- - -
是什么按 7、30、365 天的每日涨星速度排名,另有近 7 天新仓库榜
分类AI(主榜)、开发工具、安全、Web / 前端、基础设施、设计 / 创意、数据
更新时间每天更新
数据来源只用 GitHub REST API;取不到的数据标为缺失,不估算
遥测无
许可证MIT
-

五种语言的榜单

- -

常见问题

-
GitHub 涨星榜是什么?

一份按涨星速度而不是总 star 数排序的 GitHub 仓库榜单。AI 是主榜,开发工具、安全、前端、基础设施、设计、数据各有独立榜单。

涨星速度怎么算?

每日涨星 = 窗口内新增 star 数 ÷ 所用天数。新增数取自 GitHub API 的 stargazers/history,按运行日之前完整的 UTC 日累加。比窗口更新的仓库用自己的年龄做除数,并标为新仓库。

多久更新一次?

每天更新。每次运行都会在仓库里单独存档。

它和 GitHub Trending 一样吗?

不一样。GitHub Trending 是 GitHub 自己的页面;涨星榜是独立的开源项目,规则公开,每次更新都有存档,与 GitHub 无任何关联。

“最热新仓库”榜怎么选?

近 7 天内创建、至少 100 star、非 fork、未归档的仓库,按 star 数 ÷ 仓库年龄(天)排序。

能识别刷星吗?

不能。它只如实报告 GitHub API 返回的数字。仅对疑似破解 / 盗版合集的新仓库用公开的规则标记,并排在所有正常仓库之后。

用了生成式 AI 吗?

榜单由普通脚本计算。新仓库描述的翻译可在一个可选步骤里用 AI 模型生成;数字从不由 AI 生成。

怎么引用?

使用仓库里的 CITATION.cff(GitHub 页面有“Cite this repository”按钮),并注明所用快照的日期。

-

文档

- -
-
MIT 许可证。作者:jammyfu。无统计、无追踪。与 GitHub 无关联。
- - + +GitHub Risers +
+

关键事实

是什么按 7、30、365 天的每日涨星速度排名,另有近 7 天新仓库榜
分类AI(主榜)、开发工具、安全、Web / 前端、基础设施、设计 / 创意、数据
更新时间每天更新
数据来源只用 GitHub REST API;取不到的数据标为缺失,不估算
遥测无
许可证MIT
+

五种语言的榜单

+

常见问题

GitHub 涨星榜是什么?

一份按涨星速度而不是总 star 数排序的 GitHub 仓库榜单。AI 是主榜,开发工具、安全、前端、基础设施、设计、数据各有独立榜单。

涨星速度怎么算?

每日涨星 = 窗口内新增 star 数 ÷ 所用天数。新增数取自 GitHub API 的 stargazers/history,按运行日之前完整的 UTC 日累加。比窗口更新的仓库用自己的年龄做除数,并标为新仓库。

多久更新一次?

每天更新。每次运行都会在仓库里单独存档。

它和 GitHub Trending 一样吗?

不一样。GitHub Trending 是 GitHub 自己的页面;涨星榜是独立的开源项目,规则公开,每次更新都有存档,与 GitHub 无任何关联。

“最热新仓库”榜怎么选?

近 7 天内创建、至少 100 star、非 fork、未归档的仓库,按 star 数 ÷ 仓库年龄(天)排序。

能识别刷星吗?

不能。它只如实报告 GitHub API 返回的数字。仅对疑似破解 / 盗版合集的新仓库用公开的规则标记,并排在所有正常仓库之后。

用了生成式 AI 吗?

榜单由普通脚本计算。新仓库描述的翻译可在一个可选步骤里用 AI 模型生成;数字从不由 AI 生成。

怎么引用?

使用仓库里的 CITATION.cff(GitHub 页面有“Cite this repository”按钮),并注明所用快照的日期。

+

文档

+
diff --git a/docs/zh-Hant/index.html b/docs/zh-Hant/index.html new file mode 100644 index 0000000..38eb60d --- /dev/null +++ b/docs/zh-Hant/index.html @@ -0,0 +1,32 @@ + + + + +GitHub Risers:依每日 Star 成長速度排序的熱門專案 + + + + + + + + + + + + + +
+

GitHub Star 成長榜(GitHub Risers)

依每天新增的 Star 數排序,而不是比累積總數。AI 為主榜,開發工具、資安、前端、基礎設施、設計與資料各有獨立榜單。數字直接取自 GitHub API,每日更新。

這是由程式產生的榜單,不是 GitHub 官方產品、人工精選清單,也不提供買星或付費推廣服務。

+查看最新榜單 + +GitHub Risers +
+

重點資訊

內容依 7、30、365 天的每日 Star 成長速度排序,另有近 7 天新儲存庫榜
分類AI(主榜)、開發工具、資安、Web/前端、基礎設施、設計/創意、資料
更新頻率每日更新
資料來源僅使用 GitHub REST API;缺少的資料會標示為缺漏,不自行估算
遙測無
授權MIT
+

五種語言的榜單

+

常見問題

GitHub Risers 是什麼?

依 Star 成長速度而非累積總數排序的 GitHub 儲存庫榜單。AI 為主榜,開發工具、資安、前端、基礎設施、設計與資料各有獨立榜單。

成長速度如何計算?

每日成長 = 統計期間新增的 Star 數 ÷ 採計天數。新增數取自 GitHub API 的 stargazers/history,累計執行當天之前完整的 UTC 日期。儲存庫成立時間若短於統計期間,則以實際成立天數計算,並標示為新儲存庫。

多久更新一次?

每日更新。每次執行都會在儲存庫內以獨立資料夾封存。

與 GitHub Trending 相同嗎?

不同。GitHub Trending 是 GitHub 自己提供的頁面;GitHub Risers 是獨立開源專案,規則公開,每次更新都有紀錄,與 GitHub 無隸屬關係。

熱門新儲存庫如何篩選?

成立不超過 7 天、至少 100 顆 Star、不是分支副本(fork)且未封存的儲存庫,依 Star 數 ÷ 成立天數排序。

能辨識灌星嗎?

不能。本專案如實呈現 GitHub API 回傳的數字,僅以公開的啟發式規則標記疑似破解或盜版合集的新儲存庫,並將其排在其他儲存庫之後。

有使用生成式 AI 嗎?

排名由一般程式計算。描述翻譯可選擇使用 AI 模型,但排名數字絕不由 AI 產生。

如何引用?

請使用儲存庫中的 CITATION.cff(GitHub 有 Cite this repository 按鈕),並註明所引用快照的日期。

+

文件

+
diff --git a/llms.txt b/llms.txt index 23ce161..7bce2d6 100644 --- a/llms.txt +++ b/llms.txt @@ -10,6 +10,10 @@ GitHub Risers is a script-generated leaderboard, not a manual editorial list. It - [README (English rankings)](https://github.com/jammyfu/github-risers#readme): the latest rankings - [README.zh-Hans.md](https://github.com/jammyfu/github-risers/blob/main/README.zh-Hans.md): 简体中文榜单 +- [Website (繁體中文)](https://jammyfu.github.io/github-risers/zh-Hant/) · [README.zh-Hant.md](https://github.com/jammyfu/github-risers/blob/main/README.zh-Hant.md) +- [Website (日本語)](https://jammyfu.github.io/github-risers/ja/) · [README.ja.md](https://github.com/jammyfu/github-risers/blob/main/README.ja.md) +- [Website (한국어)](https://jammyfu.github.io/github-risers/ko/) · [README.ko.md](https://github.com/jammyfu/github-risers/blob/main/README.ko.md) + ## Method and facts - [docs/FACTS.md](https://github.com/jammyfu/github-risers/blob/main/docs/FACTS.md): one-page facts: scope, formula, update schedule, data sources, limits - [docs/FAQ.md](https://github.com/jammyfu/github-risers/blob/main/docs/FAQ.md): questions people ask about the ranking diff --git a/tests/test_site.py b/tests/test_site.py new file mode 100644 index 0000000..fbd347c --- /dev/null +++ b/tests/test_site.py @@ -0,0 +1,52 @@ +"""Prevent localized landing pages drifting away from visible content and navigation.""" +import json +import re +import sys +import unittest +import xml.etree.ElementTree as ET +from html.parser import HTMLParser +from pathlib import Path +ROOT=Path(__file__).resolve().parents[1] +sys.path.insert(0,str(ROOT/'tools')) +import render_site + +class Page(HTMLParser): + def __init__(self,text): + super().__init__();self.links=[];self.lang=None;self.h1=0;self.details=0;self.feed(text) + def handle_starttag(self,tag,attrs): + a=dict(attrs) + if tag=='html':self.lang=a.get('lang') + if tag=='h1':self.h1+=1 + if tag=='details':self.details+=1 + if tag=='link':self.links.append(a) + +class SiteTests(unittest.TestCase): + def test_generated_site_is_current(self): + self.assertEqual(render_site.main(['--check']),0) + def test_all_locales_are_complete_and_reciprocal(self): + locales=json.loads((ROOT/'tools/site_locales.json').read_text()) + self.assertEqual(set(locales),set(render_site.LANGS)) + for code,s in locales.items(): + self.assertEqual(len(s['faq']),8);self.assertEqual(len(s['facts']),6) + self.assertEqual(len(s['docs']),8);self.assertEqual(len(s['headings']),4) + text=render_site.render(code,s);page=Page(text) + self.assertEqual(page.lang,code);self.assertEqual(page.h1,1);self.assertEqual(page.details,8) + links={a.get('hreflang'):a['href'] for a in page.links if a.get('rel')=='alternate'} + self.assertEqual(links,{**{c:render_site.page_url(c) for c in locales},'x-default':render_site.BASE}) + self.assertIn({'rel':'canonical','href':render_site.page_url(code)},page.links) + schema=[json.loads(x) for x in re.findall(r'<[s]cript type="application/ld\+json">(.*?)',text,re.S)] + faq=next(x for x in schema if x['@type']=='FAQPage') + self.assertEqual(faq['inLanguage'],code) + self.assertEqual([(q['name'],q['acceptedAnswer']['text']) for q in faq['mainEntity']],[tuple(x) for x in s['faq']]) + self.assertNotRegex(text, r'<[s]cript\s+src=') + def test_sitemap_has_all_five_destinations(self): + doc=ET.fromstring(render_site.outputs()[Path('docs/sitemap.xml')]) + ns={'s':'http://www.sitemaps.org/schemas/sitemap/0.9','x':'http://www.w3.org/1999/xhtml'} + self.assertEqual({x.text for x in doc.findall('s:url/s:loc',ns)},{render_site.page_url(c) for c in render_site.LANGS}) + for url in doc.findall('s:url',ns):self.assertEqual(len(url.findall('x:link',ns)),6) + def test_machine_navigation_matches_site(self): + self.assertEqual((ROOT/'llms.txt').read_bytes(),(ROOT/'docs/llms.txt').read_bytes()) + for code in render_site.LANGS: + self.assertIn(render_site.page_url(code),(ROOT/'llms.txt').read_text()) + +if __name__=='__main__':unittest.main() diff --git a/tools/render_site.py b/tools/render_site.py new file mode 100644 index 0000000..bceff48 --- /dev/null +++ b/tools/render_site.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +"""Render the five-language introduction site. Never modifies ranking data.""" +from __future__ import annotations +import argparse +import html +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +BASE = 'https://jammyfu.github.io/github-risers/' +REPO = 'https://github.com/jammyfu/github-risers' +LANGS = {'en': 'English', 'zh-Hans': '简体中文', 'zh-Hant': '繁體中文', 'ja': '日本語', 'ko': '한국어'} +DOCS = ['docs/FACTS.md', 'docs/FAQ.md', 'docs/CATEGORIES.md', 'docs/NEW_ARRIVALS.md', 'docs/DAILY_UPDATE.md'] +CSS = '''*{box-sizing:border-box}body{margin:0;font:16px/1.65 system-ui,-apple-system,"Segoe UI",sans-serif;color:#1b1f2a;background:#f6f7fb;overflow-wrap:anywhere} +header{background:linear-gradient(135deg,#0f172a,#312e81 55%,#7c3aed);color:#fff;padding:40px 20px}.w{max-width:860px;margin:0 auto}h1{margin:0 0 12px;font-size:clamp(1.7rem,5vw,2.2rem);line-height:1.2}header p{color:#e5e7ff}a.btn{display:inline-block;padding:10px 18px;border-radius:8px;background:#fff;color:#312e81;text-decoration:none;font-weight:600}.hero{display:block;max-width:100%;height:auto;margin:24px auto 0;border-radius:12px} +main{padding:12px 20px 40px}h2{margin-top:32px;font-size:1.35rem}table{border-collapse:collapse;width:100%;background:#fff}td,th{border:1px solid #e3e5ee;padding:8px 12px;text-align:left;vertical-align:top}th{width:25%;background:#eef0f8}details{background:#fff;border:1px solid #e3e5ee;border-radius:8px;padding:10px 14px;margin:8px 0}summary{cursor:pointer;font-weight:600}a{color:#4338ca}ul{padding-left:1.2em}footer{padding:24px 20px 40px;color:#555;font-size:.9rem}.sw{display:flex;flex-wrap:wrap;gap:8px 16px;margin:18px 0}.sw a{color:#e0e7ff}a:focus-visible,summary:focus-visible{outline:3px solid #fb923c;outline-offset:4px}@media(max-width:480px){header,main,footer{padding-left:16px;padding-right:16px}td,th{padding:8px}} +''' + +def page_url(lang): + return BASE + ('' if lang == 'en' else lang + '/') + +def readme_url(lang): + return REPO + ('#readme' if lang == 'en' else '/blob/main/README.' + lang + '.md') + +def render(lang, s): + e = html.escape + url = page_url(lang) + alternates = '\n'.join(f'' for code in LANGS) + schema = [ + {'@context': 'https://schema.org', '@type': 'Dataset', 'name': s['title'], 'description': s['description'], 'url': url, 'sameAs': REPO, 'license': 'https://opensource.org/license/mit', 'isAccessibleForFree': True, 'inLanguage': list(LANGS), 'creator': {'@type':'Person','name':'jammyfu','url':'https://github.com/jammyfu'}, 'variableMeasured':['stars','stars gained per day'], 'distribution':[{'@type':'DataDownload','encodingFormat':'application/json','contentUrl':'https://raw.githubusercontent.com/jammyfu/github-risers/main/data/stats.json'}]}, + {'@context':'https://schema.org','@type':'SoftwareSourceCode','name':'github-risers','codeRepository':REPO,'programmingLanguage':'Python','license':'https://opensource.org/license/mit'}, + {'@context':'https://schema.org','@type':'FAQPage','inLanguage':lang,'mainEntity':[{'@type':'Question','name':q,'acceptedAnswer':{'@type':'Answer','text':a}} for q,a in s['faq']]}, + ] + scripts='\n'.join('' for x in schema) + nav=''.join(f'{label}' for code,label in LANGS.items()) + rows=''.join(f'{e(k)}{e(v)}' for k,v in s['facts']) + rankings=''.join(f'
  • {label}
  • ' for code,label in LANGS.items()) + faq=''.join(f'
    {e(q)}

    {e(a)}

    ' for q,a in s['faq']) + links=[REPO+'/blob/main/'+p for p in DOCS]+['https://raw.githubusercontent.com/jammyfu/github-risers/main/data/stats.json',BASE+'llms.txt',REPO] + docs=''.join(f'
  • {e(label)}
  • ' for u,label in zip(links,s['docs'])) + intro=''.join('

    '+e(x)+'

    ' for x in s['intro']) + headings=[e(x) for x in s['headings']] + return f''' + + + +{e(s['title'])} + +{alternates} + + + + +{scripts} +
    +

    {e(s['h1'])}

    {intro} +{e(s['cta'])} + +GitHub Risers +
    +

    {headings[0]}

    {rows}
    +

    {headings[1]}

    +

    {headings[2]}

    {faq} +

    {headings[3]}

    +
    +''' + +def outputs(): + locales=json.loads((ROOT/'tools/site_locales.json').read_text('utf-8')) + result={Path('docs')/('' if code=='en' else code)/'index.html':render(code,locales[code]) for code in LANGS} + alternate=''.join(f'' for c in LANGS)+f'' + result[Path('docs/sitemap.xml')]='\n\n'+''.join(f'{page_url(c)}{alternate}\n' for c in LANGS)+'\n' + result[Path('docs/llms.txt')]=(ROOT/'llms.txt').read_text('utf-8') + return result + +def main(argv=None): + parser=argparse.ArgumentParser(description=__doc__);parser.add_argument('--check',action='store_true');args=parser.parse_args(argv) + stale=[] + for path,content in outputs().items(): + target=ROOT/path + if args.check: + if not target.exists() or target.read_text('utf-8')!=content: stale.append(str(path)) + else: + target.parent.mkdir(parents=True,exist_ok=True);target.write_text(content,encoding='utf-8') + if stale: + print('Stale site files: '+', '.join(stale));return 1 + return 0 + +if __name__=='__main__': + raise SystemExit(main()) diff --git a/tools/site_locales.json b/tools/site_locales.json new file mode 100644 index 0000000..6b5e0be --- /dev/null +++ b/tools/site_locales.json @@ -0,0 +1,437 @@ +{ + "en": { + "title": "GitHub Risers: GitHub Trending Repos Ranked by Star Growth", + "description": "GitHub trending repositories ranked by stars gained per day, not total stars. AI first, plus developer tools, security, web, infrastructure, design and data. Updated daily from the GitHub API.", + "h1": "GitHub Risers", + "intro": [ + "GitHub trending repositories ranked by star growth (stars gained per day), not total stars. AI is the main board; developer tools, security, web, infrastructure, design and data have their own. Numbers come straight from the GitHub API and are refreshed daily.", + "It is a script-generated leaderboard: not an official GitHub product, not a manually curated list, and not a star-buying or promotion service." + ], + "cta": "Open the latest rankings", + "headings": [ + "Key facts", + "Rankings in five languages", + "FAQ", + "Documentation" + ], + "facts": [ + [ + "What", + "Repositories ranked by stars gained per day over 7, 30 and 365 days, plus a 7-day hottest-new-repos board" + ], + [ + "Categories", + "AI (main), Developer Tools, Security, Web / Frontend, Infrastructure, Design / Creative, Data" + ], + [ + "Updates", + "Daily" + ], + [ + "Data source", + "GitHub REST API only; missing data is shown as missing, never estimated" + ], + [ + "Telemetry", + "None" + ], + [ + "License", + "MIT" + ] + ], + "faq": [ + [ + "What is GitHub Risers?", + "A leaderboard of GitHub repositories ranked by how fast they gain stars, not by how many they already have. AI is the main board, with separate boards for developer tools, security, web, infrastructure, design and data." + ], + [ + "How is the growth rate computed?", + "per_day = stars gained over the window / days used. The gain is the sum of daily star counts from the GitHub API endpoint stargazers/history over the complete UTC days before the run. A repository younger than the window is divided by its own age and marked young." + ], + [ + "How often is it updated?", + "Updated daily. Every run is archived under its own folder in the repository." + ], + [ + "Is it the same as GitHub Trending?", + "No. GitHub Trending is GitHub's own page. GitHub Risers is an independent open-source project with published rules and a saved history of every update. It is not affiliated with GitHub." + ], + [ + "What is the hottest new repos board?", + "Repositories created in the last 7 days with at least 100 stars, not forks, not archived, ranked by stars divided by age in days." + ], + [ + "Does it detect fake stars?", + "No. It reports the counts the GitHub API returns. It only flags, with a published heuristic, new repos that look like cracked or pirated bundles and ranks them after all normal repos." + ], + [ + "Does it use generative AI?", + "The rankings are computed by plain scripts. Translations of repo descriptions can be produced with an AI model in an optional step; numbers never are." + ], + [ + "How do I cite it?", + "Use the CITATION.cff file in the repository (GitHub shows a Cite this repository button) and name the snapshot date." + ] + ], + "docs": [ + "Facts (one page)", + "FAQ", + "Category rules", + "New-repo criteria", + "Daily update", + "Latest data (JSON)", + "llms.txt", + "Source code" + ], + "footer": "MIT License. Author: jammyfu. No analytics or tracking. Not affiliated with GitHub." + }, + "zh-Hans": { + "title": "GitHub 涨星榜(GitHub Risers):按涨星速度排名的 GitHub 热门仓库", + "description": "按每天新增 star 数(涨星速度)而不是总 star 数给 GitHub 仓库排名。AI 为主榜,另有开发工具、安全、前端、基础设施、设计、数据榜。数据来自 GitHub API,每天更新。", + "h1": "GitHub 涨星榜(GitHub Risers)", + "intro": [ + "按涨星速度(每天新增 star 数)而不是总 star 数,给 GitHub 热门仓库排名。AI 是主榜,开发工具、安全、前端、基础设施、设计、数据各有自己的榜。数字直接取自 GitHub API,每天更新。", + "它是脚本生成的榜单:不是 GitHub 官方产品,不是人工精选清单,也不是买星或推广服务。" + ], + "cta": "查看最新榜单", + "headings": [ + "关键事实", + "五种语言的榜单", + "常见问题", + "文档" + ], + "facts": [ + [ + "是什么", + "按 7、30、365 天的每日涨星速度排名,另有近 7 天新仓库榜" + ], + [ + "分类", + "AI(主榜)、开发工具、安全、Web / 前端、基础设施、设计 / 创意、数据" + ], + [ + "更新时间", + "每天更新" + ], + [ + "数据来源", + "只用 GitHub REST API;取不到的数据标为缺失,不估算" + ], + [ + "遥测", + "无" + ], + [ + "许可证", + "MIT" + ] + ], + "faq": [ + [ + "GitHub 涨星榜是什么?", + "一份按涨星速度而不是总 star 数排序的 GitHub 仓库榜单。AI 是主榜,开发工具、安全、前端、基础设施、设计、数据各有独立榜单。" + ], + [ + "涨星速度怎么算?", + "每日涨星 = 窗口内新增 star 数 ÷ 所用天数。新增数取自 GitHub API 的 stargazers/history,按运行日之前完整的 UTC 日累加。比窗口更新的仓库用自己的年龄做除数,并标为新仓库。" + ], + [ + "多久更新一次?", + "每天更新。每次运行都会在仓库里单独存档。" + ], + [ + "它和 GitHub Trending 一样吗?", + "不一样。GitHub Trending 是 GitHub 自己的页面;涨星榜是独立的开源项目,规则公开,每次更新都有存档,与 GitHub 无任何关联。" + ], + [ + "“最热新仓库”榜怎么选?", + "近 7 天内创建、至少 100 star、非 fork、未归档的仓库,按 star 数 ÷ 仓库年龄(天)排序。" + ], + [ + "能识别刷星吗?", + "不能。它只如实报告 GitHub API 返回的数字。仅对疑似破解 / 盗版合集的新仓库用公开的规则标记,并排在所有正常仓库之后。" + ], + [ + "用了生成式 AI 吗?", + "榜单由普通脚本计算。新仓库描述的翻译可在一个可选步骤里用 AI 模型生成;数字从不由 AI 生成。" + ], + [ + "怎么引用?", + "使用仓库里的 CITATION.cff(GitHub 页面有“Cite this repository”按钮),并注明所用快照的日期。" + ] + ], + "docs": [ + "一页事实表(英文)", + "常见问题(英文)", + "分类规则", + "新仓库榜标准", + "每日更新", + "最新数据(JSON)", + "llms.txt", + "源码" + ], + "footer": "MIT 许可证。作者:jammyfu。无统计、无追踪。与 GitHub 无关联。" + }, + "zh-Hant": { + "title": "GitHub Risers:依每日 Star 成長速度排序的熱門專案", + "description": "以每天新增的 Star 數,而非累積總數,探索 GitHub 熱門儲存庫。涵蓋 AI、開發工具、資安、前端、基礎設施、設計與資料,每日依 GitHub API 更新。", + "h1": "GitHub Star 成長榜(GitHub Risers)", + "intro": [ + "依每天新增的 Star 數排序,而不是比累積總數。AI 為主榜,開發工具、資安、前端、基礎設施、設計與資料各有獨立榜單。數字直接取自 GitHub API,每日更新。", + "這是由程式產生的榜單,不是 GitHub 官方產品、人工精選清單,也不提供買星或付費推廣服務。" + ], + "cta": "查看最新榜單", + "headings": [ + "重點資訊", + "五種語言的榜單", + "常見問題", + "文件" + ], + "facts": [ + [ + "內容", + "依 7、30、365 天的每日 Star 成長速度排序,另有近 7 天新儲存庫榜" + ], + [ + "分類", + "AI(主榜)、開發工具、資安、Web/前端、基礎設施、設計/創意、資料" + ], + [ + "更新頻率", + "每日更新" + ], + [ + "資料來源", + "僅使用 GitHub REST API;缺少的資料會標示為缺漏,不自行估算" + ], + [ + "遙測", + "無" + ], + [ + "授權", + "MIT" + ] + ], + "faq": [ + [ + "GitHub Risers 是什麼?", + "依 Star 成長速度而非累積總數排序的 GitHub 儲存庫榜單。AI 為主榜,開發工具、資安、前端、基礎設施、設計與資料各有獨立榜單。" + ], + [ + "成長速度如何計算?", + "每日成長 = 統計期間新增的 Star 數 ÷ 採計天數。新增數取自 GitHub API 的 stargazers/history,累計執行當天之前完整的 UTC 日期。儲存庫成立時間若短於統計期間,則以實際成立天數計算,並標示為新儲存庫。" + ], + [ + "多久更新一次?", + "每日更新。每次執行都會在儲存庫內以獨立資料夾封存。" + ], + [ + "與 GitHub Trending 相同嗎?", + "不同。GitHub Trending 是 GitHub 自己提供的頁面;GitHub Risers 是獨立開源專案,規則公開,每次更新都有紀錄,與 GitHub 無隸屬關係。" + ], + [ + "熱門新儲存庫如何篩選?", + "成立不超過 7 天、至少 100 顆 Star、不是分支副本(fork)且未封存的儲存庫,依 Star 數 ÷ 成立天數排序。" + ], + [ + "能辨識灌星嗎?", + "不能。本專案如實呈現 GitHub API 回傳的數字,僅以公開的啟發式規則標記疑似破解或盜版合集的新儲存庫,並將其排在其他儲存庫之後。" + ], + [ + "有使用生成式 AI 嗎?", + "排名由一般程式計算。描述翻譯可選擇使用 AI 模型,但排名數字絕不由 AI 產生。" + ], + [ + "如何引用?", + "請使用儲存庫中的 CITATION.cff(GitHub 有 Cite this repository 按鈕),並註明所引用快照的日期。" + ] + ], + "docs": [ + "專案資訊(一頁)", + "常見問題", + "分類規則", + "新儲存庫條件", + "每日更新流程", + "最新資料(JSON)", + "llms.txt", + "原始碼" + ], + "footer": "MIT 授權。作者:jammyfu。無分析追蹤或遙測,與 GitHub 無隸屬關係。" + }, + "ja": { + "title": "GitHub Risers:Star 増加速度で見つける注目の GitHub リポジトリ", + "description": "累計 Star 数ではなく、1 日あたりの Star 増加数で GitHub の注目リポジトリを探す。AI、開発ツール、セキュリティ、Web、インフラ、デザイン、データを GitHub API から毎日更新。", + "h1": "GitHub Risers", + "intro": [ + "累計 Star 数ではなく、1 日あたりの Star 増加数でリポジトリを順位付けします。AI をメインに、開発ツール、セキュリティ、Web、インフラ、デザイン、データの個別ランキングを用意。数値は GitHub API から取得し、毎日更新します。", + "スクリプトで作成するランキングです。GitHub の公式製品でも、人が選ぶおすすめ一覧でもありません。Star 販売や宣伝代行サービスではありません。" + ], + "cta": "最新ランキングを見る", + "headings": [ + "基本情報", + "5 言語のランキング", + "よくある質問", + "ドキュメント" + ], + "facts": [ + [ + "内容", + "7・30・365 日間の 1 日あたり Star 増加数で順位付け。直近 7 日の新規リポジトリランキングも掲載" + ], + [ + "カテゴリ", + "AI(メイン)、開発ツール、セキュリティ、Web/フロントエンド、インフラ、デザイン/クリエイティブ、データ" + ], + [ + "更新", + "毎日" + ], + [ + "データソース", + "GitHub REST API のみ。欠損データは欠損として表示し、推定しません" + ], + [ + "テレメトリ", + "なし" + ], + [ + "ライセンス", + "MIT" + ] + ], + "faq": [ + [ + "GitHub Risers とは?", + "累計 Star 数ではなく増加速度で順位付けした GitHub リポジトリのランキングです。AI がメインで、開発ツール、セキュリティ、Web、インフラ、デザイン、データにも個別ランキングがあります。" + ], + [ + "増加速度はどう計算しますか?", + "1 日あたりの増加数 = 集計期間内の獲得 Star 数 ÷ 使用日数です。GitHub API の stargazers/history から、実行日より前の完了した UTC 日ごとの Star 数を合計します。作成からの日数が集計期間より短い場合は、その日数で割り、新規として表示します。" + ], + [ + "更新頻度は?", + "毎日更新します。実行ごとに別のフォルダーへ履歴を保存します。" + ], + [ + "GitHub Trending と同じですか?", + "いいえ。GitHub Trending は GitHub 自身のページです。GitHub Risers は独立したオープンソースプロジェクトで、ルールと全更新履歴を公開しており、GitHub との提携関係はありません。" + ], + [ + "注目の新規リポジトリはどう選びますか?", + "過去 7 日以内に作成され、100 Star 以上あり、fork ではなく、アーカイブされていないリポジトリを、Star 数 ÷ 作成からの日数で順位付けします。" + ], + [ + "不正な Star を検出しますか?", + "いいえ。GitHub API が返す数値を表示します。公開したヒューリスティックでクラック版や海賊版の寄せ集めと思われる新規リポジトリに印を付け、通常のリポジトリの後ろに並べるだけです。" + ], + [ + "生成 AI を使いますか?", + "ランキングは通常のスクリプトで計算します。説明文の翻訳には任意の手順で AI モデルを使えますが、数値は AI で生成しません。" + ], + [ + "引用するには?", + "リポジトリの CITATION.cff を使い(GitHub の Cite this repository ボタンから確認できます)、利用したスナップショットの日付を記載してください。" + ] + ], + "docs": [ + "プロジェクト概要", + "よくある質問", + "カテゴリ規則", + "新規リポジトリの条件", + "毎日の更新手順", + "最新データ(JSON)", + "llms.txt", + "ソースコード" + ], + "footer": "MIT ライセンス。作者:jammyfu。解析・追跡なし。GitHub との提携関係はありません。" + }, + "ko": { + "title": "GitHub Risers: 하루 Star 증가량으로 찾는 인기 GitHub 프로젝트", + "description": "누적 Star가 아닌 하루 증가량으로 GitHub 인기 저장소를 살펴보세요. AI, 개발 도구, 보안, 웹, 인프라, 디자인, 데이터를 GitHub API에서 매일 갱신합니다.", + "h1": "GitHub Risers", + "intro": [ + "누적 Star 수가 아니라 하루 Star 증가량으로 저장소 순위를 매깁니다. AI를 중심으로 개발 도구, 보안, 웹, 인프라, 디자인, 데이터의 개별 순위를 제공합니다. 수치는 GitHub API에서 직접 가져오며 매일 갱신합니다.", + "스크립트로 생성하는 순위입니다. GitHub 공식 제품이나 사람이 직접 선정한 목록이 아니며, Star 판매 또는 홍보 대행 서비스도 아닙니다." + ], + "cta": "최신 순위 보기", + "headings": [ + "핵심 정보", + "5개 언어의 순위", + "자주 묻는 질문", + "문서" + ], + "facts": [ + [ + "내용", + "7일·30일·365일 동안의 일평균 Star 증가량 순위와 최근 7일 신규 저장소 순위" + ], + [ + "분야", + "AI(중심), 개발 도구, 보안, 웹/프런트엔드, 인프라, 디자인/창작, 데이터" + ], + [ + "갱신", + "매일" + ], + [ + "데이터 출처", + "GitHub REST API만 사용합니다. 없는 데이터는 누락으로 표시하며 추정하지 않습니다" + ], + [ + "원격 측정", + "없음" + ], + [ + "라이선스", + "MIT" + ] + ], + "faq": [ + [ + "GitHub Risers는 무엇인가요?", + "누적 Star 수가 아니라 증가 속도로 정렬한 GitHub 저장소 순위입니다. AI를 중심으로 개발 도구, 보안, 웹, 인프라, 디자인, 데이터의 개별 순위를 제공합니다." + ], + [ + "증가 속도는 어떻게 계산하나요?", + "일평균 증가량 = 기간 내 새 Star 수 ÷ 적용 일수입니다. GitHub API의 stargazers/history에서 실행일 이전에 끝난 UTC 날짜별 Star 수를 합산합니다. 저장소 생성 후 경과일이 집계 기간보다 짧으면 실제 경과일로 나누고 신규로 표시합니다." + ], + [ + "얼마나 자주 갱신하나요?", + "매일 갱신하며, 실행할 때마다 저장소 내 별도 폴더에 기록을 보관합니다." + ], + [ + "GitHub Trending과 같은 서비스인가요?", + "아닙니다. GitHub Trending은 GitHub 자체 페이지입니다. GitHub Risers는 규칙과 모든 갱신 기록을 공개하는 독립 오픈소스 프로젝트이며 GitHub와 제휴 관계가 없습니다." + ], + [ + "인기 신규 저장소는 어떻게 선정하나요?", + "최근 7일 이내 생성되고 Star가 100개 이상이며, fork가 아니고 보관 처리되지 않은 저장소를 Star 수 ÷ 생성 후 경과일로 정렬합니다." + ], + [ + "조작된 Star를 감지하나요?", + "아닙니다. GitHub API가 반환하는 수치를 표시합니다. 공개된 휴리스틱으로 크랙 또는 불법 복제 묶음이 의심되는 신규 저장소를 표시하고 일반 저장소 뒤에 배치할 뿐입니다." + ], + [ + "생성형 AI를 사용하나요?", + "순위는 일반 스크립트로 계산합니다. 설명 번역은 선택 단계에서 AI 모델을 사용할 수 있지만 수치를 AI로 생성하지는 않습니다." + ], + [ + "어떻게 인용하나요?", + "저장소의 CITATION.cff를 사용하고(GitHub의 Cite this repository 버튼에서 확인 가능), 사용한 스냅샷 날짜를 명시하세요." + ] + ], + "docs": [ + "한눈에 보는 프로젝트", + "자주 묻는 질문", + "분류 규칙", + "신규 저장소 조건", + "일일 갱신 과정", + "최신 데이터(JSON)", + "llms.txt", + "소스 코드" + ], + "footer": "MIT 라이선스. 작성자: jammyfu. 분석 및 추적 기능이 없으며 GitHub와 제휴 관계가 없습니다." + } +} diff --git a/tools/verify.py b/tools/verify.py old mode 100755 new mode 100644 index 391a276..ecb89f2 --- a/tools/verify.py +++ b/tools/verify.py @@ -25,6 +25,7 @@ def commands(root: Path, daily: bool = False) -> list[list[str]]: *tests, *data, [py, "tools/render_readme.py", "--check"], + [py, "tools/render_site.py", "--check"], [py, "tools/newcomer_i18n.py"], # lists untranslated new-repo descriptions; informational, never fails ]