Pathfinder 71780291a3 TTY: on/off block pulse on the Linux console (shade fusion defeated)
YuKu tests on the bare Linux VT (not a terminal emulator): my 16-colour
fallback alternated blue (44) / bright blue (104), which render nearly
identically on VGA consoles -> fused into 'solid blue'. If TERM
misreports 256, 48;5;N codes are ignored outright.

Fixes:
- TERM linux*/console* forces the 16-colour path regardless of tput.
- 16-colour mode now PULSES THE BLOCK ON/OFF (2 frames blue block,
  2 frames no block, ~2.5Hz) instead of shade alternation — visible
  on any console hardware, no colour fidelity required.
- 256-colour terminals keep the deep 17->45 breathe ramp.

Verified: TERM=linux pty shows block/no-block alternation with zero
48;5 codes; TERM=xterm-256color keeps the 8-shade ramp; unattended +
piped regressions green.
2026-10-27 22:41:48 +01:00
2026-10-27 09:16:49 +01:00

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.target becomes the default.

System settings

Between base setup and the DE menu, the script asks two questions:

  1. Disable SELinux permanently? — default no. Writes SELINUX=disabled to /etc/selinux/config (backup kept); a reboot applies it. Recommended answer is no.
  2. 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 no compress= gets ,compress=zstd:1 appended (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 dnf transaction is snapshotted and snapper undochange works.

Unattended equivalents: --selinux=keep|disabled and --snapper=yes|no.

Design rules

  1. Fail loudly, early. set -e is 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.
  2. Be idempotent. Re-running must be safe. Repos are checked with rpm -q before being added, the Nerd Font is skipped if already present, and session entries are not overwritten.
  3. Prefer official repos, then Terra, then a source build. That order is why only mango and chadwm need special handling.
  4. No silent optional failures. install_optional warns and continues for nice-to-haves; everything load-bearing uses install_packages and aborts.
  5. Guard anything environment-dependent. clear needs || true (no TERM under cron/pipes), os-release fields are defaulted, and /usr/share/xsessions is 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

  • mangowc comes from Terra (added in the base section) and hyprland from a COPR — third-party sources whose layout is not guaranteed across Fedora releases; mango aborts with build-from-source instructions if the package is missing. noctalia has 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, hyprlock and friends are installed with install_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-run that prints the dnf transaction without applying it
  • Pre-flight report: what is already installed, what would change

License

See LICENSE.

S
Description
No description provided
Readme GPL-3.0
575 KiB
Languages
Shell 100%