Default Package Manager

Rum

A native, overlay-aware RPM package manager for RakuOS, written from scratch in Rust — built to fully replace dnf and zypper, not wrap them.

rum = RakuOS + yum. It speaks plain dnf repo metadata and reads your existing /etc/yum.repos.d/*.repo files, but changes how packages actually get resolved and applied underneath — closing a gap that a plain dnf-on-an-overlay setup can't see.

Highlights

Overlay-Aware Resolution

Resolves every dependency against an explicit base-image-vs-overlay diff, so an install only ever writes to the overlay what the overlay doesn't already have — no duplicating what the base image already ships.

Never Shadows the Base Image

upgrade, reinstall, downgrade, and distro-sync only ever touch overlay-installed packages, even if you name a base-image package explicitly. rum tells you it's provided by the base image and leaves it alone, rather than quietly layering a duplicate over it.

rpm Stays the Backbone

rum doesn't reinvent what rpm already does. Actual transaction application — cpio payload extraction, scriptlets, triggers, digest verification — is left to rpm itself; rum only owns resolution and the base/overlay split on top of it.

A Fraction of the Weight

Not a port of dnf's code — a from-scratch reimplementation of the commands and flags people actually use. No 1:1 porting of libdnf5's internals, and none of the weight that comes with it: roughly 11,000 lines of Rust versus libdnf5's sprawling C++ codebase.

libsolv-Backed SAT Resolver

Dependency resolution is driven by libsolv, with RakuOS's overlay/base policy layered on top as solver jobs and rules — the same proven SAT-solving core dnf5 itself relies on.

Existing Repos, Unmodified

Still reads standard repomd.xml + primary.xml repo metadata. Your existing RakuOS, Fedora, Terra, RPM Fusion, and Copr repos work exactly as they always have — rum changes the resolver, not the ecosystem underneath it.

Broad dnf5 Command Parity

install/remove, upgrade/system-upgrade, history, versionlock, group/environment installs, reposync, repoclosure, module streams, and more — most day-to-day dnf5 usage just works.

Protected & Install-Only Packages

Honors protected_packages and installonlypkgs policy (kernels and friends) straight out of rum.conf, with installonly_limit pruning old versions automatically.

dnf5-Style Output

Transaction summaries, download progress, and repo metadata refresh output are formatted to match dnf5's own — familiar output, no relearning required.

Split Mode & Standalone Mode

rum detects which kind of system it's running on and adapts automatically — the same binary, the same commands, two different backing models.

Split Mode — RakuOS's Overlay System

RakuOS overlays /usr on top of a read-only OSTree/composefs base deployment. In Split mode, rum maintains its own overlay rpmdb (/var/lib/rakuos/rum-rpmdb), entirely separate from a snapshot of the base image's own rpmdb (/var/lib/rakuos/base-rpmdb). The two are unioned at resolve time, never merged or diffed on disk, so there's never an "is the merged view stale" question to answer. This is what makes the base-image-vs-overlay awareness above possible in the first place — a plain dnf install on this same layout has no concept of the split and resolves as if it were one merged rpmdb, blind to what's already free on the base layer.

Standalone Mode — Anywhere Else

Outside a RakuOS overlay system — a plain Fedora install, a distrobox/podman container, or an image-build environment — rum falls back to a single plain rpmdb with no base/overlay distinction at all, exactly like rpm's own default behavior. Same resolver, same commands, same output — it just skips the split logic it has nothing to split against.

A dnf / zypper Drop-in Replacement

rum ships dnf/dnf5 and zypper compatibility shims that exec straight into rum, so tooling, scripts, CI pipelines, and muscle memory built around either package manager keep working without modification — whether that's dnf install, dnf5 upgrade, or zypper install. Under the hood every one of those invocations gets rum's overlay-aware resolution, not the tool it's pretending to be.

Architecture

rum is split into focused crates: NEVRA identity and rpm's own version-comparison algorithm (rum-core), rpmdb queries that shell to rpm rather than reimplement its on-disk format (rum-rpmdb), the base/overlay split described above (rum-overlay), repo metadata fetching and caching (rum-repo), the libsolv-backed resolver (rum-resolver / rum-solv), transaction application and history (rum-transaction), the CLI itself (rum-cli), and the dnf/zypper compatibility shims (rum-dnf-shim / rum-zypper-shim).

rum aims for full dnf5 CLI parity over time. Most day-to-day commands are already implemented; a handful of larger subsystems — advisories/updateinfo, offline/reboot-time transactions, spec-file build-dep parsing — are still stubs that print a clear "not implemented" message rather than doing something wrong silently.