- Terra repo is added right after RPM Fusion in the base setup (it carries noctalia + mangowc). Modules keep calling add_terra_repo so they still work standalone; it is a no-op when terra-release is present. - Hyprland was retired from the Fedora repos after F42 (dependency churn); the module could never resolve 'hyprland' on F44. It now enables the solopasha/hyprland COPR first — the de facto standard for F43/44 — and treats the accessory packages (hyprpaper/hyprlock/waybar/mako/wofi/ xwayland-satellite) as optional so a name drift warns instead of aborting. - README updated.
Fedora Unified Config
Unified configuration for bare/minimal Fedora 44 and newer. Pick a desktop environment and optionally a tiling window manager; the script wires up repos, packages, the greeter and the session entry.
This repo is the Fedora-only successor to starburst. Everything multi-distro
(Arch, Debian, Ubuntu branches, OS guessing, per-distro package helpers) is gone
on purpose.
Usage
git clone https://git.ku-it.org/yuri/fedora.git
cd fedora
./setup.sh # interactive: choose DE, then TWM
./setup.sh --debug # same, but pause after each section
Non-interactive:
./setup.sh --yes --de=none --twm=niri
./setup.sh --yes --de=gnome --twm=none
Run as your normal user, not root. sudo is used where needed.
Layout
setup.sh entrypoint: args, preconditions, base setup, menus, dispatch
lib/common.sh colours, logging, dnf helpers, rpmfusion/terra, nerd fonts
lib/session.sh display-manager detection/switching, session entries
modules/de/{gnome,plasma,xfce}.sh
modules/twm/{niri,hyprland,mango,chadwm}.sh
Modules are separate processes, not sourced into setup.sh. That means a
module's own set -e cannot leak into the caller, and every module can be run
on its own for testing:
DE=none TWM=niri DEBUG_MODE=false bash modules/twm/niri.sh
Each module pulls in lib/ by relative path, so it works both ways.
Selection matrix
| DE | TWM | Result |
|---|---|---|
| any | any | DE provides the session; TWM is added alongside it |
none |
any | TWM-only machine, SDDM installed as the greeter |
| any | none |
plain desktop, no tiling WM |
none |
none |
refused — that is not a graphical system |
Desktop environments
| DE | dnf group (tried in order) | native greeter |
|---|---|---|
gnome |
gnome-desktop, gnome-desktop-environment, workstation-product-environment |
gdm |
plasma |
kde-desktop, kde-desktop-environment |
sddm |
xfce |
xfce-desktop, xfce-desktop-environment |
sddm |
Tiling window managers
| TWM | Source | Session type | Notes |
|---|---|---|---|
niri |
Fedora repos + Terra (for noctalia) |
Wayland | Ships its own session entry |
hyprland |
copr solopasha/hyprland | Wayland | Retired from Fedora repos after F42 |
mango |
Terra repo only | Wayland | Session entry written if the package lacks one |
chadwm |
built from source | X11 | dwm fork; not packaged anywhere for Fedora |
chadwm is the only X11 entry in the menu. The other three are Wayland
compositors — do not expect the same config story from it.
Display manager policy
- A DE module leaves the DE's own greeter alone (GNOME→gdm, Plasma→sddm, XFCE→sddm). It never fights a desktop over its own login screen.
- A TWM module enforces SDDM, because it is the only greeter that lists Wayland compositors and X11 sessions in one menu.
- Either way
graphical.targetbecomes the default.
Design rules
- Fail loudly, early.
set -eis on unless--debug. Unsupported distro, release below 44,DE=none+TWM=none, and a missing module all abort with an explanation instead of half-installing. - Be idempotent. Re-running must be safe. Repos are checked with
rpm -qbefore being added, the Nerd Font is skipped if already present, and session entries are not overwritten. - Prefer official repos, then Terra, then a source build. That order is why
only
mangoandchadwmneed special handling. - No silent optional failures.
install_optionalwarns and continues for nice-to-haves; everything load-bearing usesinstall_packagesand aborts. - Guard anything environment-dependent.
clearneeds|| true(noTERMunder cron/pipes),os-releasefields are defaulted, and/usr/share/xsessionsis created before writing into it.
Testing
The script was verified on a non-Fedora host with a stateful stub harness
(fake sudo/dnf/rpm/systemctl/git/make/curl, a fake os-release,
and sandboxed /usr + $HOME). Covered: every DE×(TWM|none) combination, the
refusal paths, --help/bad args, interactive menus, --debug abort, and
re-running for idempotency.
OS_RELEASE_FILE is overridable purely so the preconditions can be tested:
OS_RELEASE_FILE=/tmp/fake-os-release ./setup.sh --yes --de=xfce --twm=chadwm
Known limitations
noctaliaandmangowccome from Terra, andhyprlandfrom the solopasha COPR — all third-party sources. Their package layout is not guaranteed across Fedora releases;mangoaborts with build-from-source instructions if the package is missing. Terra is added in the base section (and re-checked idempotently inside the modules that need it).- Package names are not verified by installation in this repo's test harness — only control flow is. First real run on a fresh F44 box is the actual proof.
gnome-tweaks/gnome-extensions-app,wofi,waybar,hyprlockand friends are installed withinstall_optional, so a rename will warn rather than fail.
Roadmap
- Profile files (
--profile=laptop) instead of individual flags - Optional dotfiles layer (noctalia/hyprland/niri configs)
--dry-runthat prints the dnf transaction without applying it- Pre-flight report: what is already installed, what would change
License
See LICENSE.