YuKu: 'the breathing is super slow'. Frame interval down from 150ms to 50ms (~7fps -> ~20fps pulse). Same change in the vendored lib/ui-block.sh helper for consistency.
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 | Wayland | noctalia is packaged since F44; ships its own session entry |
hyprland |
COPR (lionheartp, then hermitfeather, then solopasha) | Wayland | Retired from Fedora repos after F42; first COPR with a chroot for your release wins |
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.
System settings
Between base setup and the DE menu, the script asks two questions:
- Disable SELinux permanently? — default no. Writes
SELINUX=disabledto/etc/selinux/config(backup kept); a reboot applies it. Recommended answer is no. - Snapper + grub-btrfs + zstd compression — only asked when
/is btrfs, default yes. Runs, in order:btrfs subvolume list /and the fstab btrfs entries are shown- every fstab btrfs entry with a
subvol=but nocompress=gets,compress=zstd:1appended (fstab backed up first; re-runs cannot stack duplicate options) - the SysGuides installer
sets up snapper (root + home), grub-btrfs, and DNF5 pre/post snapshot hooks,
so every
dnftransaction is snapshotted andsnapper undochangeworks.
Unattended equivalents: --selinux=keep|disabled and --snapper=yes|no.
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
mangowccomes from Terra (added in the base section) andhyprlandfrom a COPR — third-party sources whose layout is not guaranteed across Fedora releases;mangoaborts with build-from-source instructions if the package is missing.noctaliahas been in the Fedora repos since F44, so the niri module needs no third-party repo.- 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.