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.