Disclaimer: IANAL and certainly not a trademark lawyer (though I heard it pays well)
Redis has a trademark and a policy for it: Redis TRADEMARK GUIDELINES - Redis Documentation
Here are the interesting sections for us:
For avoidance of any doubt, the open source Redis software combined with, or integrated into, any other software program, including but not limited to automation software for offering Redis as a cloud service or orchestration software for offering Redis in containers is considered “modified” Redis software and does not entitle you to use the Mark or the Logo, except in a case of nominative use, as described below.
This is relevant for NixOS as I could see it classified as both “automation software for offering Redis as a cloud service” and “orchestration software for offering Redis in containers” (nixos-containers).
In Nixpkgs, we do slightly modify it using two patches, so that might also count as a “modified” version. It might count as modified anyways because we’re building from source.
Continuing on to nominative use which would be the only thing allowing us to use the TM:
- c. Nominative Use: Trademark law permits third parties the use of a mark to identify the trademark holder’s product or service so long as such use is not likely to cause unnecessary consumer or public confusion. This is referred to as a nominative or fair use. When you distribute, or offer an altered, modified or combined copy of the Software, such as in the case of a cloud service or a container service, you may engage in “nominative use” of the Mark, but this does not allow you to use the Logo.
I don’t think we’re currently causing any grand confusion as we distribute and orchestrate a rather plain Redis.
We’re now venturing into territory where we might cause confusion and could therefore be infringing on Redis’ trademark though.
A simple alias of i.e. pkgs.redis = pkgs.valkey
would be confusing enough to infringe on the TM IMHO. We should not do that.
Same with the module; simply making service.redis
use some other Redis API implementation could infringe on their TM. We might be able to get away with making it an alias but with a warning (i.e. mkRenamedOptionModule).
There are further details on using the term “Redis” we should take note of when writing descriptions of the new packages and modules’ APIs:
- d. Examples of Nominative Use:
- i. Offering an XYZ software, which is an altered, modified or combined copy of the open source Redis software, including but not limited to offering Redis as a cloud service or as a container service, and while fully complying with the open source Redis API - you may only name it “XYZ for Redis™” or state that “XYZ software is compatible with the Redis™ API” No other term or description of your software is allowed.
- ii. Offering an ABC application, which uses an altered, modified or combined copy of the open source Redis software as a data source, including but not limited to using Redis as a cloud service or a container service, and while the modified Redis fully complies with the open source Redis API - you may only state that “ABC application is using XYZ for Redis™”, or “ABC application is using a software which is compatible with the Redis™ API”. No other term or description of your application is allowed.
There’s also this though which is a bit trickier:
- iii. If, however, the offered XYZ software, or service based thereof, or application ABC uses an altered, modified or combined copy of the open source Redis software that does not fully comply with the open source Redis API - you may not use the Mark and Logo at all.
This excludes implementations of subsets of the Redis API but I’m not sure whether it excludes supersets such as KeyDB. A module with services.redis.package = pkgs.keydb
might infringe.
Other implementations may also become incompatible with the Redis API in the future too though.
Also note that all of this may change now that Redis’ enshittification has set in.
I think the safest option would be to create a new generic module for all the redis-compatible services that has a generic name and accepts all of the redis-compatible packages.
The Redis package itself should remain as-is and merely be marked as problematic (knownVulns etc.) as soon as it smells sufficiently dead. Perhaps the unfree version could be packaged too.