I am curious as to how do you solve the problem of maintaining different offerings of your product.
1) Do you have two separate codebases for free and paid? Or do you have some sort of standard workflow where you have two different branches? 2) How do you handle updates to your product? 3) How about employee access?
Thanks in advance!
I've been running this set up for about a year [1] and it's working well. Having a single code base was a requirement before I made the project fair source [2]; the fair source ELv2 license lets me add feature gates to facilitate this, while protecting me from forks giving away EE features for free (while still allowing forks).
Updates are pushed to the SaaS offering daily. I cut self-hosted releases bi-annually unless it's for a critical fix.
[0]: https://github.com/keygen-sh/keygen-api
[1]: https://keygen.sh/blog/all-your-licensing-are-belong-to-you/
[2]: http://fair.io/
But would be it practical to go for a such guy?
There are always... stupid people who use hacked software 'because the employer don't have money', but I guess someone with a skill enough to read and patch such code is fully aware how the things are working and wouldn't be doing such stupid deeds.
I need to send your team some shirts!
Did you write that as well or outsource it?
More: https://twitter.com/chadwhitacre_/status/1790101820364267902
The reasons for OSS you list include "Bus-Factor", "Longevity", and "Continuity". I'd summarize all of those as "even if they can't do business with [company] anymore, users can continue on" - our customers also say that's very important to them.
... But what if "can continue on" means "need some of those proprietary features"? And you're not there to sell to them anymore? Or you've been acquired by private equity, started charging 10^6x, and users want out? Users aren't allowed to clone the repo, remove your proprietary code, and reimplement it with their own solution, because:
> you may not remove or obscure any functionality in the software that is protected by the license key.
Is this a thing your customers are concerned about? What do you expect them to do in such a scenario?
Maybe some kind of clause for a "Change License" in case Keygen LLC goes under, e.g. we go from ELv2 to Apache 2.0 if that happens. I'm not really sure what that'd look like right now, but I'll keep thinking on this and hopefully come up with a good answer eventually.
Outside of that, nothing is really stopping somebody from forking Keygen and reimplementing the EE features 'in-spirit' under a new code path, especially if Keygen LLC has gone bust. They just can't remove or copy the existing EE features verbatim.
With an API product, you also have to be picky about new features because once something is introduced, it can't be taken back (assuming you want to maintain backwards compatibility).
2. Your project repro actually links to the elastic license. Is there some relation between the two? Do you prefer the fairsource license over the elastic license>
2. Yes, the ELv2 will be considered a Fair Source license, because it allows contributions, redistribution, forking, etc. You can visit https://faircode.io for an idea of what Fair Source will ultimately entail (Fair Source and Fair Code will be merged eventually AFAICT).
[0]: https://github.com/getsentry/fsl.software/issues/4
[1]: https://github.com/getsentry/fsl.software/issues/2
https://github.com/fairsource/fair.io/issues/14
Nowadays, it's not the case any more as the 20€ or so a month are affordable for a lot of people.
My favorite part of your reply..haha
Thanks for sharing!
My SaaS version of https://datasette.io is the open source version plus 76 plugins. Almost all of those plugins are themselves open source, with just a few that aren't for features that are unique to the SaaS product - things like showing how much disk space the user has used up already.
Here's what that custom plugin looks like, it's pretty thin: https://gist.github.com/simonw/114131fd9c1826f3629cc3b3dcb84...
I recommend checking out their approach, as it is pretty flexible.
This approach has really made the private fork much more maintanable.
[0] https://www.getoutline.com
[0] https://github.com/outline/outline
I'm always unsatisfied with the number of steps to achieve that (and the total CI time required), but maybe it's unavoidable.
Thank you for adding this bit of info! We’ve been using this model for a while but I hadn’t come across a label for it. Now knowing this, I’m coming across a ton of great info about managing/sustaining these product families.
There is currently no difference between the self-hosted and the SaaS version, but I am planning two things:
1) An env variable `IS_SELF_HOSTED` which, when set to `false`, toggles certain features like billing (currently enabled via a separate env variable and theoretically available to self-hosters) and includes hard-coded stuff like a footer with links to the official project website and our ToS.
2) Add a registration feature for self-hosters who make a donation. I haven’t fully planned out this feature, but if a self-hosted instance is registered by a paid supporter, it will most likely remove a call for becoming a supporter (that is yet to be added) or give them a supporter badge.
Choosing the AGPLv3 has been partially inspired by Plausible’s very successful model [2]. They’re also using a `SELFHOST` env variable to differentiate between their "Enterprise Edition" and the "Community Edition" [3].
[1] https://www.keila.io
[2] https://plausible.io/blog/open-source-licenses
[3] https://github.com/plausible/analytics/blob/baa99652f612f50b...
If someone is so concerned about their so-called "software patents" to the extent that they don't want to deploy their own instance of the AGPL code, they are more than welcome to use our SaaS offer.
- 2 git repos, one public, one private
- Custom tooling inspired by other existing tools out there like copybara to move commits in a unidirectional flow from the private repo to the public one
The private repo had the contents of the OSS repo in a subfolder, and a unidirectional workflow where all commits flowed from the private to the public. The way the OSS repo accepted contributions was going through the normal pull request workflow on the OSS repo, then on approval the custom tooling copied the pull request into the private repository where it would go through a second round where it was tested against the private code. On merge in the private repo the commit sha of the original commit along with the original author would get injected into the new commit message and then the custom tooling would then automatically push commits in the private repo subfolder to the public OSS repo, which essentially served as a read only mirror on the main branch.
It actually worked quite well, though obviously this approach comes with some tradeoffs. Here are some of the benefits and drawbacks off the top of my head
Benefits:
- no mixing of free and proprietary code. Public users just check out the OSS repo and it’s completely free
- proprietary code is not visible to the public
Drawbacks:
- workflow slightly more complex for both end users and employees of the enterprise
- more work to mainline code by the enterprise: contributions essentially need to be reviewed twice
- it is not possible to have signed commits by OSS contributors with this workflow
Overall it ended up being a great solution for that organization but this kind of approach can only work for low traffic or easy to review repositories. Anything with a decent amount of traffic or lots of complex contributions has a risk of becoming too much overhead for the organization to double build and test pull requests
And each plugin has a concept called install constraints. They consist of app, tier, and the role of the user provisioning the account.
Based on the right combination, certain plugins get auto installed and the user can enable/disable optional plugins/features.
Upon installation, the plug-in module has a “lifecycle” module with callbacks for install, uninstall, after_install, etc.
In those, we insert db metadata (pages, folders, menu items, etc) related to that plugin.
All is written in elixir.
1: https://simplyscholar.com
We will have samples up in a couple weeks. But stay in touch! ashish@simplyscholar.com