Skip to content
Search Fedora

    Browse this documentation

    dnf module streams: Fedora 45 has no modules left

    If you find a tutorial about dnf module enable nodejs:20, it will fail on Fedora 45 — not because the command is wrong, but because Fedora no longer has module streams.

    The conclusion first, then the background.

    Terminal window
    sudo dnf module list
    Updating and loading repositories:
    Fedora 45 - x86_64 - Updates 100% | 33.0 KiB/s | 6.0 KiB | 00m00s
    Fedora 45 - x86_64 100% | 143.5 KiB/s | 27.4 KiB | 00m00s
    Repositories loaded.
    No matches found: no module streams exist.

    no module streams exist does not mean “you did not enable one” — it means the repositories carry no module metadata at all.

    Try a common one:

    Terminal window
    sudo dnf module enable nodejs:20
    No match for argument: nodejs:20
    You can try to add to command line:
    --skip-unavailable to skip unavailable packages

    Measured on F45: dnf module list returns no module streams exist, and dnf module enable nodejs returns No match for argument

    dnf5 still has module subcommands, but only five

    Section titled “dnf5 still has module subcommands, but only five”
    Terminal window
    dnf module --help
    Query Commands:
    list List module streams
    info List module streams
    Stream Management Commands:
    enable Enable module streams and make their packages available.
    reset Reset module state so it's no longer enabled or disabled.
    disable Disable modules including all their streams.

    Compare the dnf4-era favourite:

    Terminal window
    dnf module install nodejs
    Unknown argument "install" for command "module". Add "--help" for more information about the arguments.

    dnf5 has no module install — none of dnf4’s module install / remove / update / switch-to survive. Only enable, reset and disable remain, so old scripts do not fail on syntax alone, even though there is nothing to operate on.

    Only one module stream can be enabled at a time; Fedora 45 repositories carry no module metadata at all

    In one sentence: several version lines of the same software inside one distribution.

    ConceptMeaningExample
    modulea group of packagesnodejs
    streamone version linenodejs:20, nodejs:22
    profilean install subsetnodejs:20/minimal
    defaultthe stream enabled by defaultwhich line you get without a version

    It was meant to solve “the system wants Python 3.12, my project wants 3.11” — but only one stream can be enabled at a time, which is the fundamental limitation.

    After dropping modules, version selection goes back to simpler mechanisms:

    NeedHow to do it now
    another language versionuse the packaged one, isolate per project with venv / Toolbx / containers (see toolchain)
    several versions side by sideinstall versioned package names such as python3.13, php8.3
    the newest upstreamyour own repository or a container image — do not touch system packages
    EL-style stabilityCentOS Stream / RHEL, where module streams still exist
    Terminal window
    dnf search python3.1 # look for versioned package names
    dnf search php8 # PHP follows the same pattern

    The key difference: module streams switch the one version in the system; versioned package names let several coexist. The latter suits development environments better.

    Coming from an older system or older docs, align on these four points:

    1. Does dnf module list return anything — if there are no modules, stop looking;
    2. Does any script call dnf module install — change it to dnf install <pkg>;
    3. Does anything call dnf module enable nodejs:xx — install a versioned package instead, or use a container;
    4. Is there a /etc/dnf/modules.d/ — usually absent on F45; leftover .module files can be removed.
    Terminal window
    ls /etc/dnf/modules.d/ 2>/dev/null || echo "no module state"

    Module streams were always contested in Fedora: they complicated repository metadata, made “which version did I get” opaque, and duplicated ground already covered by containers. Fedora progressively moved content back to plain packages and finally emptied it out.

    The effect is less complexity: dnf install means the newest, and rpm -q tells you what you have — no need to ask “which stream is enabled”.