getsentry / team-ospo

Open Source Program Office (OSPO)
https://open.sentry.io/
11 stars 1 forks source link

🤑 Run Fund Fest 2023 #108

Closed chadwhitacre closed 11 months ago

chadwhitacre commented 1 year ago

← 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:

  1. 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, and syntaxfm). 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.

    Screenshot 2023-10-06 at 10 21 50 AMScreenshot 2023-10-06 at 10 21 14 AM

  2. 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!
    ecosystem boost

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

Press

GitHub Sponsorships

  1. "A'ight, beat that. 😤😁💃" (chadwhitacre_)
  2. "I'm sorry, I don't make the rules. 🐭" (chadwhitacre_)
  3. "Sentry is giving $500k+ to open source it relies on this year" (zeeg)
  4. "it’s insane that people are anything other than thankful" (jarredsumner)
  5. "A company donates $500K/year in direct funding to OSS" (gergelyorosz)
  6. "YOU ARE A PIECE OF SHIT FOR NOT DONATING MORE OF YOUR VC FUNDING" (ThePrimeagen)

Announcement

  1. "We Just Gave $500,000 to Open Source Maintainers"
  2. X
  3. HN - 112 points and 36 comments despite being brutally modded at ~20 points - and then modded a second time! rankings
  4. /r/opensource/
  5. "It's the 2nd year in a row we've hit the front page only to have HN mods remove it." (bentlegen)
  6. "The answer I got last year (and kudos dang for the tone)" (chadwhitacre_)
  7. "Tarsnap has given 2^18 dollars to open source" (cperciva) - HN (not modded! 😁 390 / 180 / rankings) - X
nehzata commented 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?

chadwhitacre commented 11 months ago

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:

Thoughts on two levels of boosting based on repo tags? Doable?

chadwhitacre commented 11 months ago

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.)

nehzata commented 11 months ago

Perfect!

Also what % of funds should get allocated to each org?

chadwhitacre commented 11 months ago
nehzata commented 11 months ago

@chadwhitacre mass-gh-sponsor has been updated to support import-csv command. doc

chadwhitacre commented 11 months ago

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🐚 $
nehzata commented 11 months ago

@chadwhitacre Is it ok if we revert the max depth settings back to 1 please?

chadwhitacre commented 11 months ago

Done!

chadwhitacre commented 11 months ago

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>
chadwhitacre commented 11 months ago

I need to filter out Sentry employees.

chadwhitacre commented 11 months ago
#!/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

👍

chadwhitacre commented 11 months ago

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.

chadwhitacre commented 11 months ago
#!/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.

chadwhitacre commented 11 months ago

Pretty close to running this for getsentry, I want to:

chadwhitacre commented 11 months ago

Testing with one.

sqlite> delete from donations where recipient_id != 'sindresorhus';
sqlite> select * from donations;
927|getsentry|sindresorhus|1696442229|0|0
sqlite>
chadwhitacre commented 11 months ago
utils🐚 $ mass-gh-sponsor donate --gh-classic-access-token=$TOKEN --amount=4
INFO[0000] starting                                     
INFO[0000] donating getsentry:sindresorhus              
utils🐚 $

💃

Screenshot 2023-10-04 at 1 58 53 PM
chadwhitacre commented 11 months ago

I did a one-time as a test.

Screenshot 2023-10-04 at 4 41 36 PM
chadwhitacre commented 11 months ago

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.

chadwhitacre commented 11 months ago

Not going to reach 100 but should be able to get to like 97%?

Screenshot 2023-10-04 at 5 46 30 PM
nehzata commented 11 months ago

Seeing a lot of minimums.

What if it's not recurring? Do minimums still apply?

nehzata commented 11 months ago

The following query should return the errored donations:

SELECT sponsor_id, recipient_id FROM donations WHERE donate_attempt_ts > 0;

nehzata commented 11 months ago

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.

chadwhitacre commented 11 months ago

@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?

nehzata commented 11 months ago

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. 🤞

chadwhitacre commented 11 months ago

@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.

chadwhitacre commented 11 months ago

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.

chadwhitacre commented 11 months ago
utils🐚 $ cat log|grep error|wc -l
     534
utils🐚 $

👍

chadwhitacre commented 11 months ago

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. 👍

nehzata commented 11 months ago

@chadwhitacre a few updates:

nehzata commented 11 months ago

@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?

nehzata commented 11 months ago

The following foundations have been paid as of today:

Awaiting response from:

chadwhitacre commented 11 months ago

One-time is not a workaround (at least through the UI, not sure about API but seems unlikely to work). :-/

Screenshot 2023-10-06 at 9 53 48 AM
chadwhitacre commented 11 months ago

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.

chadwhitacre commented 11 months ago
getsentry

https://twitter.com/chadwhitacre_/status/1710378308012023998

chadwhitacre commented 11 months ago
Screenshot 2023-10-06 at 8 37 17 PM

https://twitter.com/chadwhitacre_/status/1710399485073846493 😬

chadwhitacre commented 11 months ago
Screenshot 2023-10-10 at 10 16 26 AM

https://twitter.com/zeeg/status/1710764429519049192

chadwhitacre commented 11 months ago

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.

nehzata commented 11 months ago

@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.

chadwhitacre commented 11 months ago

Asks on call (order of priority):

  1. implement a $5/mo minimum (no 17¢ per month)
  2. drop cents entirely, whole dollar amounts only
  3. put maintainers into ≲ 10 buckets (e.g. 5 10 20 50 100 200 500 1000 2000/mo)
    • easier to reason about and compare one to another
  4. iterate on boosting concept at each level
    1. org - maybe just include / exclude? - less import orgs have fewer repos, so weighting takes care of itself
    2. repo - prod / non-prod / exclude
    3. maintainer - put into buckets with whole dollar adjustment per maintainer
    4. ecosystem - would like to be able to see this as a percentage of total dollar volume

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.

Screenshot 2023-10-12 at 7 33 56 PM

I realize this is a lot to bring up at this point. Let's see how far we can get.

nehzata commented 11 months ago

@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.

chadwhitacre commented 11 months ago

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! 😁

nehzata commented 11 months ago

@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?

nehzata commented 11 months ago

@chadwhitacre Minimums have been implemented. How are you looking for a quick catch up to confirm the numbers please?

chadwhitacre commented 11 months ago

Awesome! Just sent an invite, hopefully we can jump on a call?

nehzata commented 11 months ago

Awesome! Thanks!

nehzata commented 11 months ago

Minimums deployed (currently set to $10/mo) + spreadsheet updated (2023 tab)!

chadwhitacre commented 11 months ago

Awesome! I'll check it out ...

chadwhitacre commented 11 months ago
  1. ali/armin to review 77 not founds and add to inclusions as appropriate
  2. chad to review sheet and set weight/boost as desired - Friday afternoon (SF)
  3. ali/armin to import them in to TD - Saturday (Sydney)
  4. chad to do final review within TD - Sunday evening (Pittsburgh)
  5. rock and roll! 🎸 - Monday (Sydney)
nehzata commented 11 months ago

@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?