**Goal:** Migrate from GNOME to Hyprland on Fedora 43, paired with DankMaterialShell (DMS), while keeping GNOME and Sway installable as fallbacks.
**Architecture:** Use Fedora's standard COPR-based install path for Hyprland (solopasha) and DMS (avengemedia). Run on the AMD iGPU (no proprietary NVIDIA driver needed). Store all user config under `~/.config/` and track it in `~/dotfiles` (Forgejo). Adopt DMS's batteries-included shell so the bar/notifications/lock/launcher work out of the box, and use `mylinuxforwork/hyprland-starter` as a reference for a minimal, readable starter `hyprland.conf`.
**Hardware note:** Machine has AMD Vega iGPU (primary) + NVIDIA RTX 3060 (discrete, unused for display). All steps assume AMD-path. Do **not** install `akmod-nvidia` as part of this plan.
---
## Phase 0 — Preparation
### Task 0.1: Bootstrap project docs and dotfiles
**Files:**
- Create: `~/systems-admin/docs/window-manager/progress.md` (done — append as we go)
- Create: `~/systems-admin/docs/window-manager/cheatsheet.md` (done — update as bindings change)
- Verify: `~/dotfiles/` exists and is the Forgejo clone
### Task 0.2: Enable COPRs and RPM Fusion (free only)
**Why:** Hyprland and DMS are not in Fedora's default repos yet. RPM Fusion free gives us codecs + a few utilities; we are **not** enabling the nonfree NVIDIA path.
- [ ]**Step 1:** Enable RPM Fusion free (safe even if already enabled).
Approach: write one small `hyprland.conf` we can read top-to-bottom, not a mega-config. DMS provides bar/launcher/lock/notifications/polkit, so our `hyprland.conf` just handles: monitors, input, keybinds, and launching DMS.
### Task 2.1: Create the base Hyprland config
**Files:**
- Create: `~/.config/hypr/hyprland.conf`
- [ ]**Step 1:** Ensure the directory exists.
```bash
mkdir -p ~/.config/hypr
```
- [ ]**Step 2:** Write the config.
```bash
cat > ~/.config/hypr/hyprland.conf <<'EOF'
# ----- Monitors -----
# Use Hyprland's auto-detect. Override later with specific resolution/refresh.
echo "(Older Hyprland versions may not have --verify-config; safe to skip)"
```
Expected: no fatal errors. Warnings are OK.
---
### Task 2.2: Run DMS's setup to generate its own baseline
**Why:** `dms setup` writes its autostart/keybind snippets in a way DMS expects. Our `hyprland.conf` already launches `dms run`, so setup here is just to generate any DMS-side state files (theme, shell config).
- [ ]**Step 1:** Run setup (answer prompts; accept defaults).
```bash
dms setup
```
Expected: walks through theme picker, writes config to `~/.config/DankMaterialShell/` or `~/.config/quickshell/dms/`.
- [ ]**Step 3:** Add hyprpaper to autostart. Edit `~/.config/hypr/hyprland.conf`, in the `# ----- Autostart -----` block, append:
```
exec-once = hyprpaper
```
**Note:** If DMS manages your wallpaper (it often does via matugen theming), skip this task and let DMS handle it. Revisit later if DMS's wallpaper tool isn't working for you.
---
## Phase 3 — Dotfiles symlinks
### Task 3.1: Add a `hypr` stow package
**Files:**
- Create: `~/.dotfiles/hypr/.config/hypr/hyprland.conf` (moved from `~/.config/hypr/hyprland.conf`)
- Symlink: `~/.config/hypr/hyprland.conf` → `~/.dotfiles/hypr/.config/hypr/hyprland.conf` (created by `stow`)
- [ ]**Step 1:** Confirm `stow` is installed.
```bash
command -v stow || sudo dnf install -y stow
```
- [ ]**Step 2:** Move the config into a new `hypr` stow package.
```bash
mkdir -p ~/.dotfiles/hypr/.config
mv ~/.config/hypr ~/.dotfiles/hypr/.config/hypr
```
- [ ]**Step 3:** Stow it to recreate the symlink.
```bash
cd ~/.dotfiles
stow --target="$HOME" hypr
```
- [ ]**Step 4:** Verify the symlink resolves.
```bash
ls -l ~/.config/hypr/hyprland.conf
readlink -f ~/.config/hypr/hyprland.conf
```
Expected: points into `~/.dotfiles/hypr/.config/hypr/hyprland.conf`.
- [ ]**Step 5:** Commit (only the new `hypr` package — leave existing uncommitted changes in `kitty/`, `nvim/`, etc. alone).
- [ ]**Step 6:** (Optional) Add a `dms` stow package once you've confirmed what file `dms setup` wrote and that it's stable. Don't move it yet if DMS rewrites its config on upgrades.
---
## Phase 4 — First login and smoke test
### Task 4.1: Log out and pick Hyprland from GDM
- [ ]**Step 1:** Save any open work. Log out of GNOME.
- [ ]**Step 2:** At GDM, click the gear/session picker and choose **Hyprland**.
- [ ]**Step 3:** Log in. Expected:
- Blank desktop briefly, then DMS bar appears at top.
-`SUPER+Return` opens kitty.
-`SUPER+D` opens fuzzel launcher.
-`SUPER+1..9` switches workspaces.
- [ ]**Step 4:** If things break: switch to TTY (`Ctrl+Alt+F3`), log in, and inspect:
- Replace `fuzzel` keybind with DMS spotlight if you prefer it
- Move to `foot` as default terminal if kitty feels heavy
---
## Self-review check
- **Spec coverage:** idea.md asked for Hyprland + shell (DMS or Noctalia) + stability. Plan installs Hyprland, picks DMS with reasoning, keeps Sway/GNOME as fallbacks. ✓
- **GPU path:** Plan explicitly avoids proprietary NVIDIA driver based on detected hardware (AMD iGPU primary). ✓
- **Backup goal:** Configs live in `~/.config/` and are migrated into `~/dotfiles` (Forgejo) in Phase 3. ✓
- **Learning goal:** Minimal hand-authored `hyprland.conf` the user can read top-to-bottom; cheat sheet provided separately. ✓
- **Known gaps to verify at install time:** exact COPR package names (solopasha occasionally renames), whether `hyprshot`/`hypridle`/`hyprpolkitagent` are split packages or bundled in `hyprland-contrib`. If `dnf install` complains about a missing name, `dnf search <name>` and adjust.