RubyGems Contribution Data with Homebrew's Tooling
There’s ongoing discussion about recent changes to access in the RubyGems GitHub organisation. If you need context, first read Open Source Turmoil: RubyGems Maintainers Kicked Off GitHub. My goal is to share contribution data to help inform the conversation.
🍺 Homebrew Contributions
Hi, I’m Mike McQuaid 👋. I’ve spent most of the last 13 years working on Ruby on Rails applications you may have used such as GitHub, AllTrails, Workbrew, and Strap. I’ve maintained Homebrew (mostly written in Ruby) for 16 years and have been the Project Leader since the position was created in 2019. Some of my responsibilities include assessing whether Homebrew maintainers’ contributions make them eligible for:
- retaining commit access and membership in the Homebrew GitHub organisation
- receiving the $300/month maintainer stipend (paid quarterly)
- receiving other payments, e.g. hardware grant, travel expenses to the AGM, lunch with other maintainers
This is partly a matter of security (principle of least privilege), partly a matter of responsible use of our funds and partly a matter of fair recognition, making “Homebrew maintainer” reflect those doing the actual work.
We built a command for this in Homebrew:
brew contributions
.
If I run it on myself for the last year, I get this output:
$ brew contributions --user=mikemcquaid --from=2024-09-24 --organisation=Homebrew --csv
mikemcquaid contributed >=100 times (merged PR author), >=100 times (approved PR reviewer), 1787 times (commit author or committer), 35 times (commit coauthor) and >=2022 times (total) after 2024-09-24.
user,repository,merged_pr_author,approved_pr_review,committer,coauthor,total
mikemcquaid,all,100,100,1787,35,2022
This means that in the last year I:
- authored >=100 merged PRs
- ✅ reviewed >=100 merged PRs
- authored (I created it) or committed (I modified/rebased/committed it) 1,787 commits
- co-authored (someone accepted my GitHub suggestion) 35 commits
Note: the >=100 or >=1000 in the output is to make things quicker and avoid hitting GitHub API rate limits.
This excludes actions like commenting on issues, which don’t require write access. Remember: principle of least privilege.
These are the core metrics that I use to evaluate whether someone is maintaining Homebrew. The tools and data are open. Also, because we use OpenCollective, the money coming into and out of Homebrew is open.
💎 RubyGems Contributions
Ok Mike, that’s a lot about Homebrew: what about RubyGems? Sorry, I’m getting to that.
Homebrew has open tooling to analyse GitHub contributions. RubyGems has a GitHub organisation. Let’s combine the two.
First, who are the owners, maintainers, contributors and members of the RubyGems organisation?
It’s not an easy question to answer, so I’ve built a list based on the people who either participated or were CCd by indirect
on the
Proposal for RubyGems Organizational Governance.
I’ve also included the current members of the RubyGems organisation
Let’s look at contributions for the year preceding the removals:
$ brew contributions --csv --from 2024-08-18 --org=rubygems --user=aellispierce,amatsuda,andremedeiros,arthurnn,arunagw,bai,bronzdoc,colby-swandale,deivid-rodriguez,djberg96,drbrain,duckinator,dwradcliffe,ecnelises,evanphx,farukaydin,hsbt,indirect,jenshenny,ktheory,landongrindheim,lauragift21,luislavena,martinemde,mensfeld,mghaught,olleolleolle,qrush,segiddins,sferik,simi,skottler,sonalkr132
...
User | Merged PRs | Approved PRs | Commits | Total |
---|---|---|---|---|
deivid-rodriguez | 100 | 13 | 1303 | 1416 |
hsbt | 57 | 3 | 379 | 439 |
simi | 36 | 100 | 254 | 390 |
segiddins | 93 | 77 | 194 | 364 |
colby-swandale | 45 | 55 | 77 | 177 |
martinemde | 49 | 59 | 64 | 172 |
landongrindheim | 48 | 55 | 54 | 157 |
lauragift21 | 14 | 4 | 32 | 50 |
duckinator | 12 | 0 | 36 | 48 |
olleolleolle | 2 | 18 | 7 | 27 |
mghaught | 7 | 8 | 12 | 27 |
indirect | 1 | 7 | 3 | 11 |
qrush | 0 | 1 | 1 | 2 |
mensfeld | 0 | 1 | 0 | 1 |
ktheory | 0 | 0 | 0 | 0 |
luislavena | 0 | 0 | 0 | 0 |
sferik | 0 | 0 | 0 | 0 |
skottler | 0 | 0 | 0 | 0 |
sonalkr132 | 0 | 0 | 0 | 0 |
jenshenny | 0 | 0 | 0 | 0 |
farukaydin | 0 | 0 | 0 | 0 |
evanphx | 0 | 0 | 0 | 0 |
ecnelises | 0 | 0 | 0 | 0 |
dwradcliffe | 0 | 0 | 0 | 0 |
drbrain | 0 | 0 | 0 | 0 |
djberg96 | 0 | 0 | 0 | 0 |
bronzdoc | 0 | 0 | 0 | 0 |
bai | 0 | 0 | 0 | 0 |
arunagw | 0 | 0 | 0 | 0 |
arthurnn | 0 | 0 | 0 | 0 |
andremedeiros | 0 | 0 | 0 | 0 |
amatsuda | 0 | 0 | 0 | 0 |
aellispierce | 0 | 0 | 0 | 0 |
Full brew contributions
Output
$ brew contributions --csv --from 2024-08-18 --org=rubygems --user=aellispierce,amatsuda,andremedeiros,arthurnn,arunagw,bai,bronzdoc,colby-swandale,deivid-rodriguez,djberg96,drbrain,duckinator,dwradcliffe,ecnelises,evanphx,farukaydin,hsbt,indirect,jenshenny,ktheory,landongrindheim,lauragift21,luislavena,martinemde,mensfeld,mghaught,olleolleolle,qrush,segiddins,sferik,simi,skottler,sonalkr132 aellispierce contributed 0 times (total) after 2024-08-18. amatsuda contributed 0 times (total) after 2024-08-18. andremedeiros contributed 0 times (total) after 2024-08-18. arthurnn contributed 0 times (total) after 2024-08-18. arunagw contributed 0 times (total) after 2024-08-18. bai contributed 0 times (total) after 2024-08-18. bronzdoc contributed 0 times (total) after 2024-08-18. colby-swandale contributed 45 times (merged PR author), 55 times (approved PR reviewer), 77 times (commit author or committer) and 177 times (total) after 2024-08-18. deivid-rodriguez contributed >=100 times (merged PR author), 13 times (approved PR reviewer), 1303 times (commit author or committer) and >=1416 times (total) after 2024-08-18. djberg96 contributed 0 times (total) after 2024-08-18. drbrain contributed 0 times (total) after 2024-08-18. duckinator contributed 12 times (merged PR author), 36 times (commit author or committer) and 48 times (total) after 2024-08-18. dwradcliffe contributed 0 times (total) after 2024-08-18. ecnelises contributed 0 times (total) after 2024-08-18. evanphx contributed 0 times (total) after 2024-08-18. farukaydin contributed 0 times (total) after 2024-08-18. hsbt contributed 57 times (merged PR author), 3 times (approved PR reviewer), 379 times (commit author or committer) and 439 times (total) after 2024-08-18. indirect contributed 1 time (merged PR author), 7 times (approved PR reviewer), 3 times (commit author or committer) and 11 times (total) after 2024-08-18. jenshenny contributed 0 times (total) after 2024-08-18. ktheory contributed 0 times (total) after 2024-08-18. landongrindheim contributed 48 times (merged PR author), 55 times (approved PR reviewer), 54 times (commit author or committer) and 157 times (total) after 2024-08-18. lauragift21 contributed 14 times (merged PR author), 4 times (approved PR reviewer), 32 times (commit author or committer) and 50 times (total) after 2024-08-18. luislavena contributed 0 times (total) after 2024-08-18. martinemde contributed 49 times (merged PR author), 59 times (approved PR reviewer), 64 times (commit author or committer) and 172 times (total) after 2024-08-18. mensfeld contributed 1 time (approved PR reviewer) and 1 time (total) after 2024-08-18. mghaught contributed 7 times (merged PR author), 8 times (approved PR reviewer), 12 times (commit author or committer) and 27 times (total) after 2024-08-18. olleolleolle contributed 2 times (merged PR author), 18 times (approved PR reviewer), 7 times (commit author or committer) and 27 times (total) after 2024-08-18. qrush contributed 1 time (approved PR reviewer), 1 time (commit author or committer) and 2 times (total) after 2024-08-18. segiddins contributed 93 times (merged PR author), 77 times (approved PR reviewer), 194 times (commit author or committer) and 364 times (total) after 2024-08-18. sferik contributed 0 times (total) after 2024-08-18. simi contributed 36 times (merged PR author), >=100 times (approved PR reviewer), 254 times (commit author or committer) and >=390 times (total) after 2024-08-18. skottler contributed 0 times (total) after 2024-08-18. sonalkr132 contributed 0 times (total) after 2024-08-18. user,repository,merged_pr_author,approved_pr_review,committer,coauthor,total deivid-rodriguez,all,100,13,1303,0,1416 hsbt,all,57,3,379,0,439 simi,all,36,100,254,0,390 segiddins,all,93,77,194,0,364 colby-swandale,all,45,55,77,0,177 martinemde,all,49,59,64,0,172 landongrindheim,all,48,55,54,0,157 lauragift21,all,14,4,32,0,50 duckinator,all,12,0,36,0,48 olleolleolle,all,2,18,7,0,27 mghaught,all,7,8,12,0,27 indirect,all,1,7,3,0,11 qrush,all,0,1,1,0,2 mensfeld,all,0,1,0,0,1 ktheory,all,0,0,0,0,0 luislavena,all,0,0,0,0,0 sferik,all,0,0,0,0,0 skottler,all,0,0,0,0,0 sonalkr132,all,0,0,0,0,0 jenshenny,all,0,0,0,0,0 farukaydin,all,0,0,0,0,0 evanphx,all,0,0,0,0,0 ecnelises,all,0,0,0,0,0 dwradcliffe,all,0,0,0,0,0 drbrain,all,0,0,0,0,0 djberg96,all,0,0,0,0,0 bronzdoc,all,0,0,0,0,0 bai,all,0,0,0,0,0 arunagw,all,0,0,0,0,0 arthurnn,all,0,0,0,0,0 andremedeiros,all,0,0,0,0,0 amatsuda,all,0,0,0,0,0 aellispierce,all,0,0,0,0,0
The month preceding the removals:
$ brew contributions --csv --from 2025-08-18 --org=rubygems --user=aellispierce,amatsuda,andremedeiros,arthurnn,arunagw,bai,bronzdoc,colby-swandale,deivid-rodriguez,djberg96,drbrain,duckinator,
...
User | Merged PRs | Approved PRs | Commits | Total |
---|---|---|---|---|
deivid-rodriguez | 22 | 0 | 99 | 121 |
landongrindheim | 7 | 27 | 10 | 44 |
hsbt | 5 | 0 | 31 | 36 |
simi | 2 | 8 | 17 | 27 |
colby-swandale | 4 | 5 | 6 | 15 |
martinemde | 1 | 2 | 6 | 9 |
segiddins | 0 | 4 | 2 | 6 |
lauragift21 | 1 | 0 | 2 | 3 |
duckinator | 1 | 0 | 1 | 2 |
olleolleolle | 0 | 0 | 1 | 1 |
mghaught | 0 | 0 | 1 | 1 |
jenshenny | 0 | 0 | 0 | 0 |
ktheory | 0 | 0 | 0 | 0 |
luislavena | 0 | 0 | 0 | 0 |
mensfeld | 0 | 0 | 0 | 0 |
qrush | 0 | 0 | 0 | 0 |
sferik | 0 | 0 | 0 | 0 |
skottler | 0 | 0 | 0 | 0 |
sonalkr132 | 0 | 0 | 0 | 0 |
indirect | 0 | 0 | 0 | 0 |
farukaydin | 0 | 0 | 0 | 0 |
evanphx | 0 | 0 | 0 | 0 |
ecnelises | 0 | 0 | 0 | 0 |
dwradcliffe | 0 | 0 | 0 | 0 |
drbrain | 0 | 0 | 0 | 0 |
djberg96 | 0 | 0 | 0 | 0 |
bronzdoc | 0 | 0 | 0 | 0 |
bai | 0 | 0 | 0 | 0 |
arunagw | 0 | 0 | 0 | 0 |
arthurnn | 0 | 0 | 0 | 0 |
andremedeiros | 0 | 0 | 0 | 0 |
amatsuda | 0 | 0 | 0 | 0 |
aellispierce | 0 | 0 | 0 | 0 |
Full brew contributions
Output
$ brew contributions --csv --from 2025-08-18 --org=rubygems --user=aellispierce,amatsuda,andremedeiros,arthurnn,arunagw,bai,bronzdoc,colby-swandale,deivid-rodriguez,djberg96,drbrain,duckinator,dwradcliffe,ecnelises,evanphx,farukaydin,hsbt,indirect,jenshenny,ktheory,landongrindheim,lauragift21,luislavena,martinemde,mensfeld,mghaught,olleolleolle,qrush,segiddins,sferik,simi,skottler,sonalkr132 aellispierce contributed 0 times (total) after 2025-08-18. amatsuda contributed 0 times (total) after 2025-08-18. andremedeiros contributed 0 times (total) after 2025-08-18. arthurnn contributed 0 times (total) after 2025-08-18. arunagw contributed 0 times (total) after 2025-08-18. bai contributed 0 times (total) after 2025-08-18. bronzdoc contributed 0 times (total) after 2025-08-18. colby-swandale contributed 4 times (merged PR author), 5 times (approved PR reviewer), 6 times (commit author or committer) and 15 times (total) after 2025-08-18. deivid-rodriguez contributed 22 times (merged PR author), 99 times (commit author or committer) and 121 times (total) after 2025-08-18. djberg96 contributed 0 times (total) after 2025-08-18. drbrain contributed 0 times (total) after 2025-08-18. duckinator contributed 1 time (merged PR author), 1 time (commit author or committer) and 2 times (total) after 2025-08-18. dwradcliffe contributed 0 times (total) after 2025-08-18. ecnelises contributed 0 times (total) after 2025-08-18. evanphx contributed 0 times (total) after 2025-08-18. farukaydin contributed 0 times (total) after 2025-08-18. hsbt contributed 5 times (merged PR author), 31 times (commit author or committer) and 36 times (total) after 2025-08-18. indirect contributed 0 times (total) after 2025-08-18. jenshenny contributed 0 times (total) after 2025-08-18. ktheory contributed 0 times (total) after 2025-08-18. landongrindheim contributed 7 times (merged PR author), 27 times (approved PR reviewer), 10 times (commit author or committer) and 44 times (total) after 2025-08-18. lauragift21 contributed 1 time (merged PR author), 2 times (commit author or committer) and 3 times (total) after 2025-08-18. luislavena contributed 0 times (total) after 2025-08-18. martinemde contributed 1 time (merged PR author), 2 times (approved PR reviewer), 6 times (commit author or committer) and 9 times (total) after 2025-08-18. mensfeld contributed 0 times (total) after 2025-08-18. mghaught contributed 1 time (commit author or committer) and 1 time (total) after 2025-08-18. olleolleolle contributed 1 time (commit author or committer) and 1 time (total) after 2025-08-18. qrush contributed 0 times (total) after 2025-08-18. segiddins contributed 4 times (approved PR reviewer), 2 times (commit author or committer) and 6 times (total) after 2025-08-18. sferik contributed 0 times (total) after 2025-08-18. simi contributed 2 times (merged PR author), 8 times (approved PR reviewer), 17 times (commit author or committer) and 27 times (total) after 2025-08-18. skottler contributed 0 times (total) after 2025-08-18. sonalkr132 contributed 0 times (total) after 2025-08-18. user,repository,merged_pr_author,approved_pr_review,committer,coauthor,total deivid-rodriguez,all,22,0,99,0,121 landongrindheim,all,7,27,10,0,44 hsbt,all,5,0,31,0,36 simi,all,2,8,17,0,27 colby-swandale,all,4,5,6,0,15 martinemde,all,1,2,6,0,9 segiddins,all,0,4,2,0,6 lauragift21,all,1,0,2,0,3 duckinator,all,1,0,1,0,2 olleolleolle,all,0,0,1,0,1 mghaught,all,0,0,1,0,1 jenshenny,all,0,0,0,0,0 ktheory,all,0,0,0,0,0 luislavena,all,0,0,0,0,0 mensfeld,all,0,0,0,0,0 qrush,all,0,0,0,0,0 sferik,all,0,0,0,0,0 skottler,all,0,0,0,0,0 sonalkr132,all,0,0,0,0,0 indirect,all,0,0,0,0,0 farukaydin,all,0,0,0,0,0 evanphx,all,0,0,0,0,0 ecnelises,all,0,0,0,0,0 dwradcliffe,all,0,0,0,0,0 drbrain,all,0,0,0,0,0 djberg96,all,0,0,0,0,0 bronzdoc,all,0,0,0,0,0 bai,all,0,0,0,0,0 arunagw,all,0,0,0,0,0 arthurnn,all,0,0,0,0,0 andremedeiros,all,0,0,0,0,0 amatsuda,all,0,0,0,0,0 aellispierce,all,0,0,0,0,0
I’m not going to make any value judgements about these data. Remember that open source maintainers owe you nothing.
My only observation is that, if I were deciding based on the principle of least privilege for access control in the Homebrew organisation, based only on this data and our process, there would be people in all the groups of:
- appear they should have been removed, were removed
- appear they should have been removed, were not removed
- appear they should not have been removed, were removed
- appear they should not have been removed, were not removed
As Homebrew’s Governance has been cited as a good basis, I “stress tested” it here. I wanted to contribute data to a conversation that currently lacks it. That’s not to say who should or shouldn’t be in the RubyGems or any other GitHub organisation.
I wish we had data like Homebrew’s OpenCollective budget to similarly analyse finances, but it doesn’t seem to be public.
This situation also highlights how funding and transparency can shape open source dynamics. I’ve long believed that money is not the solution to every problem in open source. In some cases, it can create problems that wouldn’t exist otherwise.
If you’d like to talk more about this post, the RubyGems situation, Homebrew, or would like my help as a Fractional CTO/Principal Engineer/open source expert through my consulting business, please reach out.
If you want to financially support and encourage more of my work on Homebrew instead, consider sponsoring me on GitHub Sponsors or Patreon.