{"id":51612147,"url":"https://github.com/quangtran88/gitpodium","last_synced_at":"2026-07-12T09:30:31.127Z","repository":{"id":370449195,"uuid":"1294855044","full_name":"quangtran88/gitpodium","owner":"quangtran88","description":"Rank git contributors across all branches/history of your GitHub orgs → one self-contained HTML leaderboard. Churn ≠ contribution.","archived":false,"fork":false,"pushed_at":"2026-07-09T09:47:53.000Z","size":1021,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-09T10:08:52.907Z","etag":null,"topics":["agent-skill","claude-code","cli","code-review","contributors","developer-productivity","git","leaderboard"],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/quangtran88.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-07-09T07:57:26.000Z","updated_at":"2026-07-09T09:48:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/quangtran88/gitpodium","commit_stats":null,"previous_names":["quangtran88/gitpodium"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/quangtran88/gitpodium","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quangtran88%2Fgitpodium","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quangtran88%2Fgitpodium/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quangtran88%2Fgitpodium/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quangtran88%2Fgitpodium/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/quangtran88","download_url":"https://codeload.github.com/quangtran88/gitpodium/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quangtran88%2Fgitpodium/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35388394,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-12T02:00:06.386Z","response_time":87,"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":["agent-skill","claude-code","cli","code-review","contributors","developer-productivity","git","leaderboard"],"created_at":"2026-07-12T09:30:29.226Z","updated_at":"2026-07-12T09:30:31.117Z","avatar_url":"https://github.com/quangtran88.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🏆 gitpodium\n\n[![CI](https://github.com/quangtran88/gitpodium/actions/workflows/ci.yml/badge.svg)](https://github.com/quangtran88/gitpodium/actions/workflows/ci.yml)\n\n**Who actually wrote the code?** Point gitpodium at your GitHub orgs, and it clones\nevery repo, walks *every branch of the full history*, untangles the fact that one human\ncommits under five different emails, throws out the vendored-dump commits that would\notherwise crown a bot — and bakes the result into a single, shareable `report.html`.\n\nNo dashboard to host. No account to create. No data leaves your machine. One HTML file\nyou can double-click, email, or drop in Slack.\n\n**gitpodium is meant to be driven by your AI agent, not run by hand.** Install it as a\nskill (Claude Code, Codex, OpenCode — see below) and just ask:\n\n\u003e *\"Who contributed most across our GitHub org this year?\"*\n\nThe agent checks your GitHub CLI login, asks what to audit (which orgs, which metric,\nwhat to filter out, where to put the report), then clones, dedups, and hands you a\n`report.html`. The commands below are what it runs under the hood — you can also run\nthem yourself.\n\n---\n\n\u003e ### ⚠️ Read this first: churn is not contribution\n\u003e gitpodium ranks by **lines added + deleted**, because that's the only signal git gives\n\u003e you with a time axis. But code review, mentoring, design, debugging, and the hard\n\u003e conversation that saved a week of work are all **invisible to git**. Squash-merged and\n\u003e deleted branches are gone forever. Treat the leaderboard as a **conversation-starter,\n\u003e never a stack-rank or a performance metric.** The report itself says so, at the top,\n\u003e every time. This honesty is a feature, not a disclaimer.\n\n---\n\n## What you get\n\nA self-contained `report.html` with:\n\n- **Per-month / quarter / year** leaderboards — scrub through time.\n- **Per-person trend charts** — see when someone ramped up or went quiet.\n- **Repo spread** — one-repo specialist vs. someone who touches everything.\n- **Collaboration tab** *(GitHub)* — PRs opened/merged, code reviews, review comments,\n  and issues per GitHub user. This is the review \u0026 PR work churn *can't* see: a heavy\n  reviewer who writes little code finally shows up as a top contributor.\n- **Light / dark theme**, keyboard-navigable, works offline from `file://`.\n\nPlus the raw `monthly.csv`, `contrib-commits.tsv`, and `github.json` if you want to slice\nit yourself.\n\n### The two views\n\n**Collaboration tab** — PRs, code reviews, review comments and issues per GitHub user.\nNote `micahchen`: **509 PRs but 1,724 reviews** — a heavy reviewer a churn leaderboard would\nbadly underrate. The *Churn-blind reviewers* card counts people who review but open no PRs.\n\n![gitpodium Collaboration tab — PR / review / issue leaderboard](docs/collaboration.png)\n\n**Code (git) tab** — churn leaderboard with per-contributor trends over time:\n\n![gitpodium Code tab — churn leaderboard and trend chart](docs/leaderboard.png)\n\n\u003csub\u003eNames and logins shown are anonymized sample data.\u003c/sub\u003e\n\n## Why it's not just `git shortlog`\n\n| Problem | gitpodium |\n|---|---|\n| One person, many git emails | Auto-merges by shared email + normalized name; optional manual overrides |\n| Vendored / generated dumps (Odoo, `dist/`, lockfiles) inflate a \"winner\" | Path excludes **and** a per-commit `MAXCHURN`/`MAXFILES` cap, with a transparency line showing exactly what got dropped |\n| Bots (`dependabot`, CI, AI agents) top the chart | `*[bot]` + configurable non-human filter |\n| Only `main` is counted | Walks `--all` refs, dedups shared commits |\n| Many repos across an org | Clones the whole org (or user) in parallel, one pass |\n| Reviews, PRs, and issues never touch git | Optional **Collaboration tab** pulls PRs / reviews / review-comments / issues per GitHub login straight from the API |\n| \"Just give me a link to share\" | Data is **baked into** the HTML — one file, no server |\n\n## Install — copy this to your coding agent\n\nThe easiest way: paste this prompt into **Claude Code, Codex, or OpenCode** and let it\ninstall itself. No manual steps.\n\n```text\nInstall the \"gitpodium\" skill for yourself:\n1. Clone https://github.com/quangtran88/gitpodium into a stable location (e.g. ~/tools/gitpodium).\n2. Wire it in as a skill for whatever coding agent you are:\n   - Claude Code    -\u003e symlink the repo dir to ~/.claude/skills/gitpodium\n   - Codex/OpenCode -\u003e make sure you load its AGENTS.md (add the repo to the project, or point your config at it)\n3. Read its SKILL.md so you know the workflow, then tell me it's ready and how to invoke it.\ngitpodium clones GitHub orgs and ranks contributors across all branches of full history\ninto one shareable, self-contained HTML leaderboard.\n```\n\nOnce installed, just ask: *\"Audit contributions across my acme-inc org, rank by commits.\"*\nThe agent checks your `gh` login, interviews you for scope/metric/filters/output, runs the\npipeline, and hands you `report.html` — surfacing the *churn ≠ contribution* caveat.\n\n\u003cdetails\u003e\n\u003csummary\u003ePrefer to install manually?\u003c/summary\u003e\n\n```bash\ngit clone https://github.com/quangtran88/gitpodium.git ~/tools/gitpodium\n# Claude Code — SKILL.md is auto-discovered from the skills dir:\nln -s ~/tools/gitpodium ~/.claude/skills/gitpodium\n# Codex / OpenCode — they read AGENTS.md; point the agent at the repo\n# or copy AGENTS.md into your project.\n```\n\u003c/details\u003e\n\n## Run it yourself (what the agent runs under the hood)\n\n**Prerequisites:** [`gh`](https://cli.github.com) (run `gh auth status`), plus `git`,\n`python3`, `bash`, `awk` — all standard on macOS/Linux.\n\n```bash\ngit clone https://github.com/quangtran88/gitpodium.git\ncd some-empty-working-dir           # artifacts land in the current directory\n\n# one shot: clone → dedup → collect → rollup → report.html\n/path/to/gitpodium/gitpodium run acme-inc acme-labs\nopen report.html                    # macOS (Linux: xdg-open report.html)\n```\n\n`\u003cowner\u003e` can be a GitHub **org or a user**. Re-run any time — clones update in place.\n\n### Or drive it step by step\n\n```bash\nexport PATH=\"$PATH:/path/to/gitpodium\"             # or: ln -s /path/to/gitpodium/gitpodium ~/bin/\ngitpodium clone acme-inc acme-labs                 # → ./clones/   (idempotent)\ngitpodium mailmap                                  # → ./.mailmap  (identity dedup)\ngitpodium collect                                  # → ./contrib-commits.tsv (all branches)\ngitpodium rollup                                   # → ./monthly.json + monthly.csv\ngitpodium github acme-inc acme-labs                # → ./github.json (PRs/reviews/issues; gh API)\ngitpodium report                                   # → ./report.html (self-contained)\n\ngitpodium rank                                     # console leaderboard, all-time\ngitpodium rank 2025-01-01 2025-12-31 quarter       # windowed + bucketed\n```\n\n## How it works\n\n```\n GitHub orgs/users\n        │  gh repo list + clone --all           clone-all.sh\n        ▼\n   ./clones/*                                    (full history, every branch)\n        │  git log --all --pretty (name+email)   build-mailmap.py\n        ▼\n   ./.mailmap                                    (1 person ⇒ 1 identity)\n        │  git log --all --numstat --use-mailmap collect.sh\n        ▼\n   contrib-commits.tsv                           (1 row / commit, author-dated)\n        │  filter bots + bulk, aggregate         rollup.sh\n        ▼\n   monthly.json  ─────────────┐\n                              ├──▶ build-report.py ──▶ report.html\n   github.json  ──────────────┘     (embeds both)      (self-contained, shareable)\n        ▲\n        └─ gh api graphql: PRs · reviews · review comments · issues   collect-github.py\n```\n\nThe `github.json` branch is **optional and additive** — skip it (or run against non-GitHub\nrepos) and you still get the full git-churn report; the Collaboration tab just won't appear.\n\nEverything writes to your **current directory** (override with `GITPODIUM_OUT`). Nothing\nis written back into the install folder, so you can keep it read-only on your `PATH`.\n\n## Configuration\n\nDrop a `gitpodium.config.sh` in your working dir (auto-sourced) — see\n[`examples/gitpodium.config.sh`](examples/gitpodium.config.sh). It is **executed as\nshell**, so only run gitpodium in directories you trust:\n\n| Env var | Default | What it does |\n|---|---|---|\n| `GITPODIUM_ORGS` | — | Owners for `gitpodium run` with no args |\n| `GITPODIUM_METRIC` | `churn` | Default metric in the report: `churn`/`commits`/`added`/`deleted`/`net`/`repos` (viewers can still switch live) |\n| `MAXCHURN` | `10000` | Drop a commit whose added+deleted exceeds this (vendored dumps). `0` = off |\n| `MAXFILES` | `400` | Drop a commit touching more files than this. `0` = off |\n| `DROP_BOTS` | `1` | Exclude `*[bot]` accounts (git churn **and** GitHub reviewers/authors: any GraphQL `Bot`-type actor, `*[bot]`, or `extra_bots`) |\n| `GITPODIUM_SKIP_GITHUB` | `0` | `1` skips the API-based Collaboration step in `run` (e.g. non-GitHub repos, or to save rate limit) |\n| `GITPODIUM_IDENTITY` | — | JSON of manual identity merges + `extra_bots` — see [`examples/gitpodium.identity.json`](examples/gitpodium.identity.json) |\n| `GITPODIUM_CLONES` | `./clones` | Reuse an existing clone mirror |\n| `GITPODIUM_OUT` | `.` | Where artifacts are written |\n\n**Identity overrides** — when auto-dedup can't tell that `jane` and `jane-doe-corp` are\nthe same person, or you want to pin a display name:\n\n```json\n{\n  \"force_merge\": [[\"janedoe\", \"janedoecorp\"]],\n  \"canonical_override\": { \"acmebot\": [\"Jane Doe\", \"jane@acme.com\"] },\n  \"extra_bots\": [\"ci-runner\", \"release-bot\"]\n}\n```\n\n`gitpodium mailmap` also writes `mailmap-review.md` listing low-confidence guesses\n(one name is a prefix of another) it left **un**merged for you to confirm.\n\n## Limitations\n\n- Churn is a proxy, not truth — see the caveat above. Really. Read it again.\n- Binary files and the excluded paths (vendor, `dist/`, lockfiles, minified) don't count.\n- Rewritten history / force-pushes reflect whatever's currently reachable.\n- Private repos need your `gh` token to have access.\n- Repos that fail to clone/update are listed in `./clone-failures.log` and the run\n  continues without them — check it if a repo seems missing from the report.\n- **Forks are skipped** (`gh repo list --source`) — a fork would import its entire\n  upstream author history. If your org does real work in a fork, list it explicitly\n  with `clone-all.sh -f repos.txt`. Duplicate commits (same sha in two clones) are\n  counted once either way. Owner listing is capped at 1000 repos (`gh` limit) — a\n  warning is printed if an owner hits it.\n- Commit months use the **author-local** date; Collaboration months use **UTC**\n  timestamps from the API — work near a month boundary can land in adjacent months\n  across the two tabs.\n- The trend chart's x-axis skips months with zero org-wide activity (ordinal, not\n  calendar — keeps one mis-dated 1970/2099 commit from flattening the whole chart).\n- A committer named exactly `claude` (or with the `noreply@anthropic.com` email) is\n  treated as an AI agent and filed under `automation[bot]` by default — that's the\n  stock Claude Code commit identity. Add your own agents via `extra_bots`.\n- The **Collaboration tab** needs the GitHub API (only GitHub-hosted repos your `gh` token\n  can see) and is subject to the GraphQL rate limit. Issues may be sparse if the team\n  tracks them in Jira/Linear instead — the report says so when the count is zero. It's\n  keyed by **GitHub login**, which is a different identity space from the git author names\n  in the churn view, so the two tabs are shown side by side rather than merged.\n\n## License\n\nMIT © 2026 Quang Tran\n\n*gitpodium (\"git\" + \"podium\") is an independent project, not affiliated with Gitpod/Ona.*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquangtran88%2Fgitpodium","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fquangtran88%2Fgitpodium","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquangtran88%2Fgitpodium/lists"}