{"id":50216331,"url":"https://github.com/rogerchappel/ossrank","last_synced_at":"2026-05-26T09:04:34.199Z","repository":{"id":356218424,"uuid":"1231558300","full_name":"rogerchappel/ossrank","owner":"rogerchappel","description":"Self-updating public OSS contributor and project ranking site","archived":false,"fork":false,"pushed_at":"2026-05-14T20:26:55.000Z","size":564,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-14T22:34:31.582Z","etag":null,"topics":["cloudflare-pages","contributors","github","open-source","rankings","static-site"],"latest_commit_sha":null,"homepage":"https://ossrank.pages.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rogerchappel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-07T04:27:24.000Z","updated_at":"2026-05-14T20:27:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rogerchappel/ossrank","commit_stats":null,"previous_names":["rogerchappel/ossrank"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/rogerchappel/ossrank","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rogerchappel%2Fossrank","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rogerchappel%2Fossrank/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rogerchappel%2Fossrank/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rogerchappel%2Fossrank/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rogerchappel","download_url":"https://codeload.github.com/rogerchappel/ossrank/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rogerchappel%2Fossrank/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33512344,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T03:12:49.672Z","status":"ssl_error","status_checked_at":"2026-05-26T03:12:47.976Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudflare-pages","contributors","github","open-source","rankings","static-site"],"created_at":"2026-05-26T09:04:15.176Z","updated_at":"2026-05-26T09:04:34.180Z","avatar_url":"https://github.com/rogerchappel.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OSSRank\n\nA static-first public data product for finding top GitHub contributors by country using simple public metrics: commits, public pull requests, repositories, and followers.\n\nOSSRank is designed for \u003chttps://ossrank.dev/\u003e. Set `OSSRANK_SITE_URL` in Cloudflare Pages if the production host changes so generated canonical URLs, Open Graph URLs, `robots.txt`, and `sitemap.xml` stay aligned with the live domain. V1 includes a conservative live GitHub REST/GraphQL collector plus fixture mode for deterministic tests. The primary user flow is home page country selection → country contributor table, sorted by commits by default and sortable by public PRs, repo count, or followers. A single projects page is included separately.\n\n## What it builds\n\n- A polished static website in `dist/` ready for Cloudflare Pages.\n- Generated SEO assets: per-route canonical URLs, Open Graph/Twitter metadata, `robots.txt`, `sitemap.xml`, Cloudflare Pages `_headers`, and duplicate-route `_redirects`.\n- Versioned JSON snapshots under `data/latest/` and immutable run snapshots under `data/runs/\u003cdate\u003e/`.\n- A public manifest at `/data/latest/manifest.json` with completed shards, failed shards, stale pages, API mode, duration, and source commit.\n- A focused country-selection homepage, country contributor pages, one projects page, methodology, badges, and raw JSON.\n- GitHub Actions for validation, weekly refresh, daily hot-page refresh, and manual shard refresh.\n\n## Current routes\n\n- `/`\n- `/countries/australia/top-github-contributors/`\n- `/countries/australia/` redirects to `/countries/australia/top-github-contributors/`\n- `/global/`\n- `/projects/`\n- `/agentic/`\n- `/momentum/`\n- `/rising/`\n- `/sitemap.xml`\n- `/robots.txt`\n- `/methodology/`\n- `/badges/users/octo-kiwi/au.svg`\n- `/data/latest/manifest.json`\n\n## Data contract\n\nEach ranking snapshot includes:\n\n- `kind`, `slug`, `name`, and `title`\n- `generated_at`, `fresh_until`, and `status`\n- `method`, `source_run`, and `candidate_count`\n- explicit `caveats`\n- compact `history`\n- ranked `entries`\n\nThe public site copies `data/latest/*` into `dist/data/latest/*` so pages and API-like JSON stay in sync.\n\n## Local development\n\n```sh\npnpm install\npnpm test\npnpm run build\n```\n\nUseful scripts:\n\n```sh\npnpm run refresh:fixtures   # create deterministic demo snapshots\npnpm run refresh:live       # collect live GitHub API snapshots using OSSRANK_GITHUB_TOKEN\npnpm run validate:data      # validate manifest + shard integrity\npnpm run build              # generate dist site\npnpm run deploy:cloudflare  # deploy dist with Wrangler\nbash scripts/validate.sh    # StackForge validation wrapper\n```\n\nLive refreshes use GitHub GraphQL search and contribution APIs. GitHub Actions' default `GITHUB_TOKEN` is an integration token and can return `Resource not accessible by integration`; configure a repository secret named `OSSRANK_GITHUB_TOKEN` with a classic or fine-grained PAT that can read public repository/user metadata.\n\n### GitHub Actions secrets and environment\n\nConfigure these repository secrets before running refresh/deploy workflows:\n\n- `OSSRANK_GITHUB_TOKEN` — GitHub PAT used by weekly/manual live refresh. Needs read-only access to public repository/user metadata and GraphQL search/contribution APIs.\n- `CLOUDFLARE_ACCOUNT_ID` — Cloudflare account id for Pages deploys. Stored as a secret so the public repo does not hardcode account metadata.\n- `CLOUDFLARE_API_TOKEN` — Cloudflare API token for Wrangler Pages deploys. Scope it to the `ossrank` Pages project where possible.\n\nOptional runtime/build variables:\n\n- `OSSRANK_SITE_URL` — canonical production URL, defaults to `https://ossrank.dev`.\n- `OSSRANK_LIMIT` — candidate limit for live refresh runs; workflow dispatch defaults to `20`.\n\n## Cloudflare Pages\n\n`wrangler.toml` sets `pages_build_output_dir = \"dist\"` and the deploy script runs:\n\n```sh\nwrangler pages deploy dist --project-name ossrank\n```\n\nFor a connected Git deployment, configure Cloudflare Pages with:\n\n- Build command: `pnpm run build`\n- Build output directory: `dist`\n- Node version: `22`\n- Environment variable: `OSSRANK_SITE_URL=https://ossrank.dev`\n\n## Methodology guardrails\n\nOSSRank must stay honest:\n\n- Use official GitHub APIs only; never scrape GitHub HTML.\n- Treat GitHub profile location text as unverified free text.\n- Rank observed public signals, not private contributions. Contributor pages prioritize one-year GitHub GraphQL commit totals, one-year public pull request totals, repository count, and followers. Raw commit totals stay visible, but ranking uses a per-user burst-adjusted commit signal when a short anomalous daily spike exceeds that contributor's adaptive baseline cap.\n- Preserve last-known-good data when refreshes fail.\n- Keep the product flow simple: choose a country, view contributors, sort by commits/public PRs/repos/followers, or view the single projects page.\n- Avoid claims of complete global coverage, endorsement, nationality, employment status, or identity attributes.\n\n## Roadmap\n\n- Add deeper GitHub GraphQL contribution and pull-request collection with low-concurrency backoff and checkpoint/resume.\n- Generate contributor detail pages and full project badges.\n- Add compact historical charts and route tests for ambiguous aliases.\n- Connect `ossrank.dev` to Cloudflare Pages.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md). Changes should be small, reviewable, and verified before review.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frogerchappel%2Fossrank","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frogerchappel%2Fossrank","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frogerchappel%2Fossrank/lists"}