What are Application Streams (Modules) in RHEL, and what problem do they solve?
Modules (Application Streams) let RHEL offer multiple versions of the same software in parallel — so you can install, say, Node.js 18 for one app and Node.js 20 for another from the same OS.
Traditional packaging gives you one version of a program per OS release. But real systems need different versions side by side — one app pinned to Python 3.9, another needing 3.11. Application Streams solve this by versioning software independently of the base OS. The vocabulary:
- Module — a component as a set of RPMs (e.g.
nodejs,python). - Stream — a specific version line of that module (e.g.
nodejs:18,nodejs:20). - Profile — a preset package selection for a use case (
minimal,common,devel).
| Command | Purpose |
|---|---|
dnf module list |
List available modules |
dnf module list nodejs |
Show that module's streams |
dnf module enable nodejs:20 |
Choose a stream |
dnf module install nodejs:20/common |
Install a stream with a profile |
dnf module list nodejs # nodejs 18 common; nodejs 20 common
dnf module install nodejs:20
The key constraint: only one stream per module can be enabled at a time on a given system. So Streams let different machines (or containers) standardize on different versions cleanly — you pick the version line per host, and the OS keeps it consistent.
Go deeper:
DNF modularity docs — modules and streams (parallel software versions).