Policies Regarding Modules in Fedora, Fedora ELN and EPEL
| The Modularity project has been retired and there are no modules in Fedora 39 or newer or in EPEL. This page is only retained for historical reference. | 
Modularity was retired from Fedora 39+ and EPEL
There are no modules in Fedora 39 or newer. There are no modules in EPEL. The rest of this page serves as a policy for older Fedora releases only (Fedora 37 and 38).
Requirements for All Module Streams
- 
The module maintainer MUST have explicit commit privileges to all packages included in the module stream. The provenpackager privilege in Fedora is not sufficient.[1] 
- 
Components built into a module MUST be associated with a reachable commit in Fedora dist-git.[2] 
- 
If a stream of a module has build-time-only components, all such components MUST be marked as buildonly: Truein the module metadata to avoid shipping them to users and polluting their repository.
Requirements for Modules in Fedora
- 
Modular-only packages MUST NOT exist in Fedora. Modular versions MAY exist as alternatives to non-modular packages only. There is an exception to this rule: if the package does not function in non-modular Fedora (with a reasonable amount of work), it is permitted to have it in module only.[3] For the time being, such exceptions can be granted by FESCo. 
- 
Default streams MUST NOT be used in Fedora.[4] 
- 
Packagers SHOULD prefer compatibility packages rather than modules wherever reasonable (e.g., libraries, language interpreters, …, and anything that can benefit from parallel installability). 
Requirements for Default Streams in Fedora ELN
- 
Default streams are not permitted in Fedora or EPEL 8. Fedora ELN permits defaults streams that adhere to the policy below. 
- 
All RPMs in default module streams are required to conform to the same requirements around Conflicts as non-modular RPMs. 
- 
Packages provided at runtime by the default stream of a module MUST depend only on packages provided by packages from default module streams or the non-modular package set. By extension, default streams of a module MUST NOT have a dependency on any non-default stream.[5] 
- 
Packages provided from default streams MAY depend on content from other default streams. If they do so, this dependency MUST be encoded in the module metadata.[6] 
- 
All packages provided at runtime by the default stream of a module MUST provide all the same functionality that a downstream consumer would expect from a package in the non-modular package set.[7] 
- 
All packages provided at runtime by the default stream of a module SHOULD be declared as a module API or bundled appropriately.[8] 
- 
The default stream of a module MUST NOT change to a different stream within a released Fedora version.[9] The default stream MAY be changed in Rawhide or during Fedora upgrades. Changes to default streams MUST be approved via a Fedora Change proposal. 
- 
Packages MAY convert from a non-modular package to a modular default stream (or the reverse) only in Rawhide or during Fedora upgrades. 
- 
Default streams MUST NOT provide a binary RPM with the same package name as a non-modular RPM in the same release except in the case of a transition from one to the other.[10] 
- 
Default streams MUST NOT provide a binary RPM with the same package name as an RPM in a default stream of another module in the same release.[11] 
- 
Multiple default streams MUST NOT provide the same binary package names at runtime.[12] 
- 
Default streams MUST NOT provide a package that overrides a package of the same name in the non-modular content except in approved cases of migration between modular and non-modular delivery. 
- 
Default streams MUST NOT use the data.buildopts.rpm.macrosmetadata section without approval by FESCo.[13]
dnf install package are fully supported as any non-modular package.
alternatives system or virtual Provides for capabilities.
Want to help? Learn how to contribute to Fedora Docs ›