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 |
lightdm |
Tiling window managers
| TWM | Source | Session type | Notes |
|---|---|---|---|
niri |
Fedora repos + Terra (for noctalia) |
Wayland | Ships its own session entry |
hyprland |
Fedora repos | Wayland | Ships its own session entry |
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→lightdm). 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, a third-party repo. The package layout there is not guaranteed across Fedora releases;mangoaborts with build-from-source instructions if the package is missing.- 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.