A different way to fund freedom-respecting software

Introduction

Nobody seems to know how to make a living by contributing to freedom-respecting software.

Corporate "open source" projects often choose the "open core" model (monetizing proprietary extensions to free software), which results in continued reliance on proprietary software, and is antithetical to the ideals of software freedom activists. A number of prominent examples are listed on en.wikipedia.org/wiki/Open-core​_model#Examples.

Matthew Miller (the Fedora Project Leader) recently cited the open core model as one of the reasons for Fedora choosing Forgejo over GitLab CE -

Open core software tends, over time, to get less open (no matter how good the initial intentions).

Another monetization model is to provide paid support or services (like a chat client being free but the chat account requiring a subscription to use), but that doesn't work for all kinds of software.

A number of developers sell binaries on proprietary app stores like Google Play Store and Apple App Store. One example is OsmAnd+. While I don't know how successful this approach is, I certainly can say as a software freedom activist that it poses an obstacle to introduce people to these apps, especially on iOS where F-Droid doesn't exist and sideloading is unheard of. Most people are reluctant to pay for software, even if it respects your freedom.

Besides, this model is undermined by others compiling and/or publishing binaries themselves, such as app stores like F-Droid. And restricting that means curtailing the four software freedoms.

That leaves recurring donations, like Patreon, Liberapay, GitHub Sponsors, and variations on the idea like snowdrift.coop. But it's often observed that the number of donors on such platforms is only a small fraction of the number of users. Some point to these numbers as "proof" that you can't make a living working on free software.

I've tried to fund my free software, data, and cultural contributions using Liberapay, without much success. Part of it might be poor marketing, but there are also some issues I've observed which are inherent to the recurring donations model -

  1. It requires you to be a consistent contributor to specific projects. 1 These projects also need to be popular. See How the crowd affects crowdfunding. That doesn't work if your interests change as often as mine.
  2. There's no way for users to know exactly how their money will be used, or whether it will result in any improvements they care about at all.
  3. There's no incentive for the user to donate. They've already got the software, and the better future for the software (weakly promised by the recurring donation model) is nebulous.
  4. Recurring donations are "yet another subscription". With companies trying to make everything into a subscription, people may be tired of subscriptions everywhere and may not want to add another one, even if it's for libre software/data/culture.

The idea - focused, fixed-goal crowdfunding

Recently, I thought of a different way to fund free software. I'll now describe two fundraising models, both of which seem promising to me. The crux of the idea is - don't release the work in any form until it's funded.

The fund-to-develop model

  1. You announce that you would like to implement a bugfix or feature (or even an app). Mention the time it will take you, and set a corresponding crowdfunding target.
  2. When the target is met, implement and release the work.

This is the classic Kickstarter/Indiegogo-style fixed-goal crowdfunding, scaled down to the bug/feature level.

It's how Prav funded the custom username feature in their fork of the Quicksy XMPP client - they got a quote from a software consultancy firm, raised the funds, and paid the company.

Members of the Prav community are also behind DebPhoshFund, trying to crowdfund improvements for mobile GNU/Linux applications in the same manner.

A variation on the fund-to-develop model

Crowdfund some amount (e.g. 50% of the costs) in advance, and the rest on completion. If the initial funding succeeds, the developer can begin. The software can be released once the rest is funded.

This way, risk is reduced for both sides - people don't pay everything up-front and end up without results, and the developer doesn't end up doing all the work without getting paid.

The fund-to-release model

  1. You implement an application, bugfix, or a feature (while keeping track of the time it took), without publishing the source code.
  2. Announce when you are done, and set a crowdfunding goal based on the time it took.
  3. When the goal is met, release the code and make the PR.

The snowdrift.coop wiki 2 What the Snowdrift wiki describes is 'meet the threshold and the code becomes free rather than proprietary', whereas what I'm describing is 'meet the threshold, or you get no code'. calls this the ransom model or the Street Performer Protocol, although the Wikipedia descriptions of these terms differ slightly from what I'm describing.

In practice, there are some more steps involved, but the structure remains the same -

  1. Discuss the app/feature/fix with users to understand their needs.
  2. In case of features or fixes, inform the maintainers about the intended changes. Discuss the desirability and the design.

    Announce that you are working on it, to prevent duplicate efforts.

  3. Begin implementing the feature/fix. Track the time it takes. For long tasks, provide progress updates.
  4. When finished, calculate the ransom amount based on the time you spent, and (if applicable) the time the maintainers spent helping you.
  5. Announce the app/feature/fix and the ransom amount to users. Show demos in the form of screenshots or screencasts.3 pranavats suggested that one may also release an obfuscated binary as the proof of work, "and pray [that] nobody bothers reversing it."
    • If funding succeeds, make a PR and go through review. Pay the maintainers before or after review.
    • If funding does not succeed, optionally release the code or the money after some time.
  6. If the PR is merged - success! If the PR is not merged, make your code available in a fork.

This, too, is hardly a revolutionary idea - it's how freelancers work across the world. But somehow, it's not very popular in the free software world. The Snowdrift Wiki cites some examples of its use (e.g. liberating Blender as a whole), but never in the way I have described - that is, applied at the feature/bugfix level, and making releasing the work itself contingent on funding, rather than only changing its licensing.

Benefits of the fund-to-release model

1. Greater incentive to pay

Users are incentivized to pay, because they don't get the feature/fix if they don't.

For me, this is the biggest benefit, and it compensates for any downsides.

2. User control over development

Compared to recurring donations, users have finer-grained control over how their money is used.

3. Lowering obstacles to paid contribution

If the developer is not confident in their skills, the fund-to-release model allows them to successfully complete the task first, without publicly committing to it by crowdfunding it in advance.

4. User-focused development

Developers will focus on features/fixes most likely to be funded by the users.

5. Higher likelihood of delivery

There is no question of budget overruns or failure to deliver - the work is already done. Users have a much greater assurance of getting the feature/fix.

(In contrast, there have been plenty of Kickstarter-style campaigns that were successfully funded, but failed to deliver results.)

6. Developers reach out to users

Unlike bounties, users are not required to reach out to a platform to put up a bounty. (Very few users will do that.) Instead, the developer reaches out to users. This could also be done through the application itself (although it's kind of like an advertisement).

Downsides of the fund-to-release model

1. Increased financial risk for developers

The developer is at risk of not getting paid for work they've already done.

2. Freeloading or hesitation

If the ransom has a fixed expiry date (i.e. when the code is released regardless of ransom), people may wait for it to run out instead of paying.

  • The OpenAV model (which the Snowdrift Wiki cites as a failure of this model) used an expiry date, which naturally reduces the chances of successful funding - the freeloaders can just wait it out, as they already have a working older version and are assured of the new version being released eventually.

If there is no expiry date (or if it's too far away), people may hesitate to chip in, since their money could be held up without results until others chip in (or the ransom expires).

  • Theoretically, the developer could return incomplete ransoms after a while, without releasing the code. But that would mean being wholly uncompensated for their work - I doubt they would accept that.

This is why the initial community input phase is necessary - it prevents such stalemates by ensuring the demand exists.

It's also why fine-grained feature/bugfix-oriented ransoms are helpful. OpenAV tried to apply this to software releases, which is too broad.

A matchfunding platform like Snowdrift could also help, but I don't think the Prisoner's Dilemma is the biggest factor here.

3. Delayed code review

When the code contributor is not part of the project, code may not get reviewed until the payments are in and the code is released. Maintainers may not merge the PR, e.g. for design or code quality reasons. That could waste the users' money, and deter future payments.

  • The developer could always publish the changes in a separate repository. But users are more concerned with changes being merged into upstream so they can (easily) use the feature they paid for.
  • I suppose this also includes snowdrift.coop's concerns about the fund-to-release model disincentivizing collaboration.

    But I'm fine with that. The software remains freedom-respecting and the developers get paid. The collaboration, if any, happens after the developers are paid and the code is liberated. (Even as things stand, collaboration in the free software world is rare and most projects have a bus factor of 1.)

4. Maintainer resentment

When the code contributor is not part of the project, maintainers may feel resentful of someone making money off their project while they don't.

One could add on a sum to the ransom which will be given to the maintainers. This could include -

  • their help in implementing the feature/fix.
  • any code review required for merging
  • past unpaid labour they invested into the codebase.

Alternatively, maintainers themselves could set a project-wide percent to be charged for reviewing (but not necessarily accepting) any paid PRs.

5. User fatigue

Users may get tired of being regularly notified of new ransoms for new features, and payments may decline. In this perspective, subscriptions require less thought…

6. Potential for scams

It's possible to scam users by sharing fabricated screenshots or screencasts. Like any business transaction, the fund-to-release model requires trust, and it helps to have a positive reputation.

Alternatively, an escrow platform could be made and some sort of verification of work could be performed before funds are released.

Other considerations

Gaming the system

Some may claim that feature/bugfix-focused funding models incentivize the creation of half-baked/deliberately feature-incomplete software, to allow for greater ransoms for popular features in the future.

There may be people who will try that, but I doubt they will succeed. Feature/bugfix-focused crowdfunding relies on the software being useful to many people - a half-baked application won't acquire the critical mass of donors to begin with.

How the crowd affects crowdfunding

Crowdfunding always works better with a bigger crowd, and the ideas I have described are no different. All forms of crowdfunding favor popular projects with lots of users.

This is not necessarily a bad thing. There's a lot of complaining about duplication of effort in the free software world, and this works to hinder it.

But with feature/fix-focused models, it can also mean that only the most popular features/bugs are likely to be implemented/fixed. Less-popular features/fixes place greater strain on individual users, or will pay less. Code improvements that are not user-facing (such as refactoring, library migration, etc) are less likely to be funded, unless you can convince users of its necessity.

Developers could counteract this by clubbing costs for less-popular changes into more popular ones.

Epilogue

So those were my thoughts on some ideas which seem promising to me. Why aren't these models used more often? I intend to make use of them and find out.