Closed chadwhitacre closed 11 months ago
Can we jump on a quick call please [...] Same time as usual if it's ok with you? 🙏
Of course, sent for your Thursday AM.
to confirm which repos will be included in the dep tree? We'll then be able to do the final export for onboarding.
My intention is to include all repos for all three orgs (weighted differently, of course). Is this enough to unblock?
Thanks – unblocked!
One more clarifying question – tag-archived
repositories to be left at default boosting or excluded?
One more clarifying question –
tag-archived
repositories to be left at default boosting or excluded?
Specific is terrific, I love it! 😁
Here are the topics we're using (per our internal docs):
- tag-production
- Definition for production: part of Sentry (including SaaS, ST, any public website, or internal tools we use to keep Sentry running) will be down without this repo
- tag-non-production
- Example: your side-projects, hackweek projects, repos that teams use for product management, testing stuff that’s not tied to prod
- tag-to-be-archived-{{date-tagged}}
- Repos that we believe can be archived, and will be archived if no action is taken for a period of time.
- tag-to-be-production-{{date-tagged}}
- Repos that will be tag as production if no action is taken for a period of time
- This will be the default tag for new repos
- tag-lost-and-found-{{date-tagged}}
- Repos we don’t know how to classify. Repos with this tag will be moved to
to-be-archived
if no action is taken for a period of time.- tag-archived
Let's go with:
tag-archived
tag-to-be-archived-*
tag-lost-and-found-*
tag-non-production
tag-to-be-production-*
tag-production
Thoughts on two levels of boosting based on repo tags? Doable?
I guess any actually archived repos (regardless of topic) should also be excluded.
I guess any repo without any of the above topics should be ... level 1, let's say? Level 1, let's say.
(I'm half-inclined to treat forks differently than sources, but let's not worry about that this time around.)
Perfect!
Also what % of funds should get allocated to each org?
mass-gh-sponsor
) vs. 77 (gh) sponsorables for syntaxfmgetsentry
org to codecov
and syntaxfm
mass-gh-sponsor
will create recurring donationsmass-gh-sponsor
for all orgscodecov
and syntaxfm
repos@chadwhitacre mass-gh-sponsor
has been updated to support import-csv
command. doc
New CLI looks clean! :)
utils🐚 $ ./scripts/mass-gh-sponsor --help
Usage: mass-gh-sponsor --db-path="db.sql" <command>
Flags:
-h, --help Show context-sensitive help.
-v, --version Print version and exit.
-C, --config=FILE Config file ($CONFIG_PATH).
--db-path="db.sql" Path to db file ($DB_PATH).
Observability:
--log-level=info Log level (trace,debug,info,warning,error,fatal,panic).
--log-json Log in JSON format.
Commands:
import-csv Import list of donations from csv file.
dl-repos Import the user's github repos.
animate-repos Animate the sponsorable dependencies for each repo.
donate Create the require GitHub sponsorships.
Run "mass-gh-sponsor <command> --help" for more information on a command.
utils🐚 $
@chadwhitacre Is it ok if we revert the max depth settings back to 1 please?
Done!
I've exported the CSVs and imported them into the db.sql
. Gonna see if I can get some sponsorships set up for getsentry
next (still working on transferring funds to other orgs).
sqlite> select sponsor_id, count(*) n from donations group by sponsor_id order by n desc;
getsentry|537
codecov|312
syntaxfm|77
sqlite>
I need to filter out Sentry employees.
#!/usr/bin/env zsh
for i in {1..10}; do
curl "https://github.com/enterprises/sentry/people?page=$i" \
-H 'authority: github.com' \
-H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \
-H 'accept-language: en-US,en;q=0.9' \
-H 'cache-control: max-age=0' \
-H "cookie: $COOKIE" \
-H 'sec-ch-ua: "Google Chrome";v="117", "Not;A=Brand";v="8", "Chromium";v="117"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'sec-ch-ua-platform: "macOS"' \
-H 'sec-fetch-dest: document' \
-H 'sec-fetch-mode: navigate' \
-H 'sec-fetch-site: same-origin' \
-H 'sec-fetch-user: ?1' \
-H 'upgrade-insecure-requests: 1' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36' \
--compressed \
> "$i.html"
done
$ grep 'id="user-' *.html | sed -e 's/^.*id="user-\([^"]*\)".*$/\1/' | sort | uniq > members
$ wc -l members
279 members
👍
Blech. Realizing that a fair number of people use separate user accounts for personal and work, so e.g. asottile
shouldn't be funded but asottile-sentry
is the one we can easily see programmatically.
#!/usr/bin/env python3
import csv
import os
members = set(open('members').read().splitlines())
for filename in os.listdir('.'):
if not filename.startswith('github-explore-sponsors-for-'):
continue
print(f'processing {filename}')
r = csv.reader(open(filename))
w = csv.writer(open('filtered-'+filename, 'w+'))
w.writerow(next(r)) # headers
for row in r:
if row[0] in members:
print(f'skipping {row[0]}')
continue
w.writerow(row)
After manually adding asottile
to members
:
$ ./filter-out-members.py
processing github-explore-sponsors-for-syntaxfm-2023-10-04.csv
processing github-explore-sponsors-for-getsentry-2023-10-04.csv
skipping mitsuhiko
skipping asottile
processing github-explore-sponsors-for-codecov-2023-10-04.csv
skipping asottile
sqlite> delete from donations where recipient_id='mitsuhiko';
sqlite> delete from donations where recipient_id='asottile';
sqlite> select sponsor_id, count(*) n from donations group by sponsor_id order by n desc;
getsentry|535
codecov|311
syntaxfm|77
sqlite>
I did a quick skim of select distinct(recipient_id) from donations order by recipient_id;
, nobody jumping out at me but it was a quick skim.
Pretty close to running this for getsentry
, I want to:
Testing with one.
sqlite> delete from donations where recipient_id != 'sindresorhus';
sqlite> select * from donations;
927|getsentry|sindresorhus|1696442229|0|0
sqlite>
utils🐚 $ mass-gh-sponsor donate --gh-classic-access-token=$TOKEN --amount=4
INFO[0000] starting
INFO[0000] donating getsentry:sindresorhus
utils🐚 $
💃
I did a one-time as a test.
Seeing a lot of minimums.
ERRO[0116] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $9"
ERRO[0151] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0154] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0154] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0157] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0158] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0161] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $8"
ERRO[0161] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0162] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $11"
ERRO[0164] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0164] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $8"
ERRO[0167] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0168] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0169] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $10"
ERRO[0170] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $10"
ERRO[0171] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0171] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0171] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $5"
ERRO[0172] failed to create sponsorship error="Could not create new Sponsors tier: Monthly price must be at least $500"
I captured some but not all of the logs. Looks like I can use timestamp columns to determine which errored.
sqlite> select * from donations where recipient_id='emberjs';
1468|getsentry|emberjs|1696453366|0|1696453817
sqlite> select * from donations where recipient_id='wooorm';
1470|getsentry|wooorm|1696453366|1696453819|0
sqlite>
Will pick up there later.
Not going to reach 100 but should be able to get to like 97%?
Seeing a lot of minimums.
What if it's not recurring? Do minimums still apply?
The following query should return the errored donations:
SELECT sponsor_id, recipient_id FROM donations WHERE donate_attempt_ts > 0;
UPDATE donations SET donate_attempt_ts = 0 where id in (SELECT id FROM donations WHERE donate_attempt_ts > 0 LIMIT 1) RETURNING *;
Will reset one of the failed donations so it can get retried. Will return the corresponding row so we can verify.
@nehzata I just shared some feedback in private email re: recruiting emails. Core concern:
when I connect my github account they want access to all my public and private repos. It looks legit, but it seems sketchy.
I know we've discussed this before. Is there anything we can do here for maintainers vs. sponsors?
Secondarily (and it may be too late for this), is it worth cc'ing me on the emails or other outreach (twitter) to increase legitimacy?
I know we've discussed this before. Is there anything we can do here for maintainers vs. sponsors?
They have the option of only selecting one of their public repositories instead of all. We'll add this in more detail to the FAQs.
Secondarily (and it may be too late for this), is it worth cc'ing me on the the emails or other outreach (twitter) to increase legitimacy?
That would be great if you don't mind please. We've only sent 27 messages so far.
We're also adding a link to the FAQs page in the email. 🤞
@nehzata I sent an invite to catch up again this evening/morning. Specifically let's hold off on any additional email/social outreach before we sync, I'd like to check in on response so far and possibly dial in the messaging.
Okay I am rerunning mass-gh-sponsors donate
with better log management. Create fails if there is an existing active sponsorship, so all the ones I created yesterday should be fine, and I can get a definitive list of the minimums in our list.
utils🐚 $ cat log|grep error|wc -l
534
utils🐚 $
👍
Ftr we've got a thumbs-up from @mdtro on https://github.com/getsentry/team-ospo/issues/108#issuecomment-1745531048, and I've confirmed in private Slack that we're all cleared security-wise to proceed with the thanks-dev app using my account. 👍
@chadwhitacre a few updates:
@chadwhitacre The second spreadsheet has been updated to include the calculations. Let's copy paste into master spreadsheet once boost factors are configured as there are email addresses in this one?
The following foundations have been paid as of today:
Awaiting response from:
One-time is not a workaround (at least through the UI, not sure about API but seems unlikely to work). :-/
The following foundations have been paid as of today:
Awesome! I've added foundations to the To Do in the ticket description, both a) paying them and b) confirming our logo placement where applicable (i.e,. not Postgres).
I've also added a public-facing write-up to the description for this issue, so I can share it during all of these conversations on X. Feel free to do likewise.
Your payment is in progress
The payment for invoice #0121 was initiated on Oct 11, 2023. We notified Thanks Dev Pty Ltd of the payment initiation. The payment should reach the vendor’s bank account in 4-5 business days from the day of this email.
@chadwhitacre The working spreadsheet has the boost factors added to it in column G. The survey amounts are also included so the total column should update accordingly.
I'm still working on merging last year's numbers into it. Once done will copy into master spreadsheet.
Asks on call (order of priority):
It's okay to treat the $24,291/mo (per below, from sheet) as a max, i.e., given the above constraints, get as close as possible without going over.
I realize this is a lot to bring up at this point. Let's see how far we can get.
@chadwhitacre Quick update – apologies I haven't had a chance to update the spreadsheet yet. Still working through the onboarding. We've finished first phase of outreach but the backlog of dependency analysis is still going. Combination of GH rate limiting, npm updates + ~20k new repos have logged in. Optimising the process as a fair number of users are seeing "collation not available" atm.
I think I have a solution to the bucketing requirement. Plan to test it tomorrow 🤞 . Will post another update COB.
Thanks for the update @nehzata. My priority would be to send money this week one way or another. Let's tune our efforts to that. The good news is that since we're running monthly we can improve the system in the coming months.
Good problem to have, onboarding so many new maintainers! 😁
@chadwhitacre We've figured out a way to implement minimums. Should be done COB today. Sample of it is in minimums
tab in the working spreadsheet. What do you think?
@chadwhitacre Minimums have been implemented. How are you looking for a quick catch up to confirm the numbers please?
Awesome! Just sent an invite, hopefully we can jump on a call?
Awesome! Thanks!
Minimums deployed (currently set to $10/mo) + spreadsheet updated (2023 tab)!
Awesome! I'll check it out ...
@chadwhitacre Can you please review the "NOT FOUND" list (now reduced to 48)? I've marked the ones that don't need to be imported as they've moved or are detected at org level. The remainder seem to be from last year's survey results?
← 2022 | Notion🔒 | Sheet🔒・Sheet 2🔒 | 2024 →
Greetings!
Welcome to Sentry's annual Open Source Fund Fest for 2023! This program takes a lot of work to run and this issue is the central source of truth for coordinating all of the moving parts. This year our budget is $500,000, which is almost double last year. There are two key components to this year's edition:
GitHub Sponsors—We are continuing our partnership with GitHub, and this year our goal is to become the first company to approach 100% coverage of all of our dependencies on Sponsors, across three orgs (
gesentry
,codecov
, andsyntaxfm
). We are dedicating 10% of our budget to this, so these will be small amounts but lots of them and will show as coming directly from us. We expect a number of these to be the first sponsorship that people ever receive.Thanks.dev—We were a launch partner for this new platform last year, and our pilot project went so well that we have contracted with Thanks.dev to manage the bulk of our budget this year. The size and scope of our program is quite significant, and the product Thanks.dev is building and the level of expertise they are developing in this field make them an excellent partner for us. We're inventing the future together!
Thanks.dev offers payouts through Stripe (0% additional fee) and Open Collective (10%) and is adding payouts through GitHub Sponsors for us (targeting the 3% fee tier). You will need to sign up on Thanks.dev if you want to receive more than the small amounts we're sending to everyone directly through GitHub Sponsors.
We're aiming to publish our wrap-up blog post on October 24. In the mean time, feel free to comment on this issue or reach out on 𝕏 with questions. Thank you to all of the maintainers who build the software Sentry depends on. 🙏
FOSS Funders
While it is fun and exciting to run arguably the most comprehensive and robust program in the industry for really truly funding Open Source, the only way we're going to solve Open Source sustainability once and for all is for every company to step up and participate. Sentry is part of the FOSS Funders working group to drive this change. If your company has an Open Source funding story to tell, please join us!
To Do
getsentry
codecov
andsyntaxfm
codecov
syntaxfm
codecov
andsyntaxfm
orgsPress
GitHub Sponsorships
Announcement