A distributed revenue sharing model for open source sponsorships
Tags: discuss, github, javascript, opensource
Published: 2019-09-01 14:08:10

I have created a few open source projects based on JavaScript and CSS. In my case, the aim has never been to earn money through it. But, if we take the whole community into consideration, earning no money from open source projects limits its potential.

Recently, an ad-based revenue generation experiment was tried out and stopped (https://feross.org/funding-experiment-recap/). Though the execution faced a backlash from some of the stakeholders, most of the people were supportive of the idea behind the experiment.

This incidence made me convert an idea I have had in mind into an on-paper proof-of-concept for discussions.

I have shared a proposal for distributed revenue sharing model for open source contributions at: https://github.com/webextensions/distributed-open-source-contributions/blob/master/README.md

Here is the gist.

# Problem statement

Open source developers spend a generous amount of time in developing and maintaining open source projects. **But, the currently popular monetary compensation models are skewed in favor of only a few open source projects which are popular and being used directly by the sponsors.** Due to this, the transitive dependencies of those open source projects are not able to attract enough monetary benefits.

**Note:** _Some of these transitive dependencies may be detectable, for example, via package.json for Node.js projects. While some others may be getting used in background and hence they are not automatically detectable, for example, a tool like GIMP._

# Proposed solution

Every open source project should be able to share a specific percentage of the sponsorship amount they receive, to the other open source projects.

## Sample workflow
* Let's consider that we have a Node.js based open-source project called `awesome-contributions`
* A considerate company, which makes use of the `awesome-contributions` project, decides to sponsor that project with a contribution of 200 USD per week.
* The team behind the `awesome-contributions` project has used many other open source projects, without which `awesome-contributions` couldn't have been built. That team wishes to share the contributions it receives with those open source projects (let's call them "transitive projects").
* `awesome-contributions` project uses the following "Contribution sharing rules" on the platform which has implemented this proposal:
  ```js
  {
      "contributionsShare": {
          // Out of all the sponsorship amount received via "GitHub Sponsors", this
          // percentage of the amount would be shared to other projects listed in
          // "shareContributionsWeightages". The remaining sponsorship amount would be
          // transferred to the accounts listed in the object "projectPartnersWeightages"
          "sharePercententageOfContributionsReceived": 50,

          // These "weightages" are just another way of representing share "percentages"
          "projectPartnersWeightages": {
              // Using "@" symbol to indicate that it is a project-partner account
              "@webextensions": 60,

              // "*" indicates remaining project-partners, who are not listed in the
              // object "projectPartnersWeightages"
              "*": 40
          },

          // These "weightages" are just another way of representing "percentages"
          "shareContributionsWeightages": {
              "eslint/eslint": 1,
              "facebook/react": 0.95,
              "GoogleChrome/puppeteer": 80,
              "jquery/jquery": 0.05,
              "webextensions/live-css-editor": 8,

              // "*" indicates remaining projects listed in "package.json"
              "*": 10
          }
      }
  }
  ```

* This means, from those 200 USD, in a week:
  * 50% would go to the project-partners of `awesome-contributions`, i.e., 100 USD
  * 50% would go to the transitive project-partners for the transitive projects mentioned under `shareContributionsWeightages`, i.e., 100 USD

* This effectively means, from those 200 USD, in a week:
  * `eslint/eslint` would get 1 USD
  * `facebook/react` would get 0.95 USD
  * `GoogleChrome/puppeteer` would get 80 USD
  * `jquery/jquery` would get 0.05 USD
  * `webextensions/live-css-editor` would get 8 USD
  * Other transitive projects would get, in total, 10 USD and those 10 USD would be equally distributed among them
  * `@webextensions` would get 60 USD in a week
  * Other project-partners would get, in total, 40 USD in a week and those 40 USD would be equally distributed among them

* Other projects would also have their own "Contribution sharing rules" which would distribute the sponsorship amount even further.

# More
This article represents the super-simplified version of the revenue sharing model which would auto-scale. More details and edge cases are handled in the detailed document.

Detailed document is available at: https://github.com/webextensions/distributed-open-source-contributions/blob/master/README.md

Comments are welcome here.
Issues and pull requests are welcome at the GitHub page of the document :-)

*PS: While writing this article, I got to know about a recent announcement from NPM that they would be taking an initiative to make it easy to fund projects via their registry. I'm hoping that their solution blends with this model and later on extends to all open source projects, like described in this proposal.*