{"id":18941431,"url":"https://github.com/mchmarny/reputer","last_synced_at":"2026-02-21T14:06:18.404Z","repository":{"id":172535146,"uuid":"649388553","full_name":"mchmarny/reputer","owner":"mchmarny","description":"Contributor reputation reporting tool","archived":false,"fork":false,"pushed_at":"2023-09-05T21:16:13.000Z","size":3811,"stargazers_count":0,"open_issues_count":7,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-01T18:23:55.380Z","etag":null,"topics":["contribution","git","identity","reputation"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mchmarny.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-04T17:33:11.000Z","updated_at":"2023-06-07T13:08:23.000Z","dependencies_parsed_at":null,"dependency_job_id":"a4dcb258-2a3d-49d0-a9e5-7f252f304101","html_url":"https://github.com/mchmarny/reputer","commit_stats":null,"previous_names":["mchmarny/reputer"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/mchmarny/reputer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mchmarny%2Freputer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mchmarny%2Freputer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mchmarny%2Freputer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mchmarny%2Freputer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mchmarny","download_url":"https://codeload.github.com/mchmarny/reputer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mchmarny%2Freputer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266868312,"owners_count":23997852,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-24T02:00:09.469Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["contribution","git","identity","reputation"],"created_at":"2024-11-08T12:28:02.734Z","updated_at":"2026-02-21T14:06:18.398Z","avatar_url":"https://github.com/mchmarny.png","language":"Go","funding_links":[],"categories":["Dependency intelligence"],"sub_categories":[],"readme":"# reputer\n\nReporting tool to calculate contributor reputation based on graduated scoring algorithm for each provider. Currently supported providers: `github` and `gitlab`.\n\n\u003e Note: `reputation` is a value between 0 (no/low reputation) to 1.0 (high reputation). Each signal (account age, repos, commit verification, follower ratio, 2FA) contributes proportionally rather than as binary pass/fail. The algorithms consider only provider information about each contributor so the `reputation` is more an identity confidence score until additional/external data sources are introduced.\n\n## install\n\n```shell\nbrew tap mchmarny/reputer\nbrew install mchmarny/reputer/reputer\n```\n\n## usage\n\n```shell\nreputer [flags]\n```\n\nSupported flags:\n\n* `--repo` - Repo URI (required, e.g. github.com/owner/repo)\n* `--commit` - Commit at which to end the report (optional, inclusive)\n* `--stats` - Includes stats used to calculate reputation (optional)\n* `--file` - Write output to file at this path (optional, stdout if not specified)\n* `--debug` - Turns logging verbose (optional)\n* `--version` - Prints version only (optional)\n\nexample:\n\n```shell\nreputer \\\n    --repo github.com/mchmarny/reputer \\\n    --commit 3c239456ef63b45322b7ccdceb7f835c01fba862\n```\n\nresults in:\n\n```json\n{\n  \"repo\": \"github.com/mchmarny/reputer\",\n  \"generated_on\": \"2023-06-10T14:49:19.417079Z\",\n  \"total_commits\": 338,\n  \"total_contributors\": 4,\n  \"contributors\": [\n    {\n      \"username\": \"mchmarny\",\n      \"reputation\": 1.0\n    },\n    ...\n  ]\n}\n```\n\nSame command with `--stats`\n\n```json\n{\n  \"repo\": \"github.com/mchmarny/reputer\",\n  \"generated_on\": \"2023-06-10T14:49:19.417079Z\",\n  \"total_commits\": 338,\n  \"total_contributors\": 4,\n  \"contributors\": [\n    {\n      \"username\": \"mchmarny\",\n      \"reputation\": 1.0,\n      \"context\": {\n        \"company\": \"@Company\",\n        \"created\": \"2010-01-04T00:19:57Z\",\n        \"name\": \"Mark Chmarny\"\n      },\n      \"stats\": {\n        \"verified_commits\": true,\n        \"strong_auth\": true,\n        \"age_days\": 4906,\n        \"commits\": 282,\n        \"unverified_commits\": 0,\n        \"public_repos\": 149,\n        \"private_repos\": 26,\n        \"followers\": 231,\n        \"following\": 8\n      }\n    },\n    ...\n  ]\n}\n```\n\n## scoring\n\nReputation is a value between `0` (no/low reputation) and `1.0` (high reputation), calculated using graduated proportional scoring. Each signal contributes linearly between 0 and its weight ceiling:\n\n| Signal | Weight | Ceiling | Notes |\n|--------|--------|---------|-------|\n| 2FA (strong auth) | 0.25 | — | Binary: full weight if enabled |\n| Commit verification | 0.25 | 100% verified | Ratio of verified to total commits |\n| Follower/following ratio | 0.15 | 10:1 | Skipped if following is 0 |\n| Account age | 0.15 | 365 days | Linear ramp to 1 year |\n| Public repositories | 0.10 | 20 repos | |\n| Private repositories | 0.10 | 10 repos | |\n\nEach signal is clamped: `min(1.0, value / ceiling) × weight`. The final score is the sum of all weighted signals. Suspended users always score `0`.\n\n## github actions\n\nA reusable workflow is provided to welcome first-time PR contributors with a comment that includes their reputation stats.\n\n### caller example\n\nAdd this to your repo at `.github/workflows/welcome.yaml`:\n\n```yaml\nname: welcome\non:\n  pull_request_target:\n    types: [opened]\npermissions:\n  pull-requests: write\n  contents: read\njobs:\n  welcome:\n    uses: mchmarny/reputer/.github/workflows/welcome.yaml@main\n```\n\n### inputs\n\n| Input | Type | Default | Description |\n|-------|------|---------|-------------|\n| `welcome-message` | string | *(auto)* | Custom welcome text; supports `{author}` placeholder |\n| `include-stats` | boolean | `true` | Whether to show the stats table |\n| `reputer-version` | string | `latest` | Reputer release version to install (e.g. `v0.2.4`) |\n\nThe caller's `permissions` block grants `pull-requests: write` and `contents: read` to the automatic `GITHUB_TOKEN`. No additional secrets are needed.\n\n### behavior\n\n1. Checks if the PR author is a first-time contributor\n2. Installs reputer (pinned version or latest release)\n3. Runs reputer against the calling repository\n4. Posts a comment with:\n   - Welcome message (first-time contributors only)\n   - **Contributor Reputation** table if reputer finds the author in the repo history\n   - **Contributor Profile** table (GitHub API fallback) if the author has no commits in the repo yet\n\nThe workflow uses `pull_request_target` context and does not check out PR code, so it is safe for use on public repositories.\n\n## disclaimer\n\nThis is my personal project and it does not represent my employer. While I do my best to ensure that everything works, I take no responsibility for issues caused by this code.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmchmarny%2Freputer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmchmarny%2Freputer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmchmarny%2Freputer/lists"}