Turn a fresh Fedora installation into a professional-grade development workstation
with a modern tiling Wayland compositor and Material Design shell — in one command.
This project automates the full setup of a Niri (scrollable tiling Wayland compositor) + Dank Material Shell (Material You desktop experience) environment, along with a curated, opinionated developer toolchain.
Running ./setup.sh will take a stock Fedora 43 system and install:
- 🖥️ A complete Wayland desktop (Niri + DMS + Ghostty terminal)
- 🦀 The Rust toolchain with IDE components
- 🐍 Python (via uv), Node.js (via FNM), and Go
- 🐳 Podman containers + full Kubernetes dev stack
- ⚡ 14 modern CLI tools replacing traditional Unix utilities
- 🐚 Zsh + OhMyZsh + Starship prompt with full tool integration
Niri+DMS/
├── setup.sh ← Entry point (orchestrator)
├── lib/
│ └── utils.sh ← Shared colors, run_step, headers
└── modules/
├── 01_niri_dms.sh ← Compositor & desktop
├── 02_rust.sh ← Rust + dev components
├── 03_languages_and_package_managers.sh ← Go, FNM, uv
├── 04_containers_and_kubernetes.sh ← Podman, kubectl, kind, k9s, helm
├── 05_modern_cli_utils.sh ← CLI power tools
└── 06_shell_and_prompt.sh ← Zsh, OhMyZsh, Starship, .zshrc
# Clone the repo
git clone <to-be-determined-repo-url> && cd Niri+DMS
# Run the full setup
./setup.shThat's it. The orchestrator will:
- Run pre-flight checks (root guard, Fedora detection, internet, sudo)
- Show you the installation plan and ask for confirmation
- Execute each module sequentially with progress indicators
- Print a summary report with pass/fail status and timing
./setup.sh # Interactive full install
./setup.sh --yes # Skip confirmation (for automation)
./setup.sh --dry-run # Print all commands without executing
./setup.sh --only 3 # Run only module 3 (Languages)
./setup.sh --help # Show usage and module list| Flag | Description |
|---|---|
--yes, -y |
Skip the confirmation prompt |
--only N |
Run only module N (1–6) |
--dry-run |
Real dry-run — prints every command without executing |
--help, -h |
Show usage info and module list |
Installs the core Wayland desktop stack:
| Package | Purpose |
|---|---|
| Niri | Scrollable tiling Wayland compositor |
| xwayland-satellite | X11 compatibility layer for legacy apps |
| Dank Material Shell | Material You shell with notifications, lock screen, and app launcher |
| Ghostty | GPU-accelerated terminal emulator |
| wl-clipboard | Wayland clipboard support |
| pavucontrol | Audio volume control (PipeWire compatible) |
| blueman | Bluetooth manager |
| Roboto / FontAwesome | Typography for Material Design |
| matugen | Material You color generation |
| xdg-desktop-portal-gtk | File dialogs for Firefox, Flatpak, etc. |
| Qt5/Qt6 Wayland | Native Wayland rendering for Qt apps |
Installs Rust via the official rustup installer, plus essential development components:
rust-analyzer— LSP server for IDE integrationclippy— Linter for idiomatic Rustrustfmt— Automatic code formatter
| Tool | What It Manages | Why |
|---|---|---|
| Go | Go programs | Installed via Fedora repos |
| FNM | Node.js versions | Fast, Rust-based nvm replacement |
| uv | Python versions + virtualenvs | 10–100x faster than pip, replaces conda |
| Tool | Purpose |
|---|---|
| Podman + podman-compose | Daemonless, rootless OCI containers |
| kubectl | Kubernetes CLI |
| kind | Local K8s clusters inside Podman |
| k9s | Terminal UI for Kubernetes |
| helm | Kubernetes package manager |
14 curated replacements for traditional Unix tools:
| Tool | Replaces | Description |
|---|---|---|
fzf |
— | Fuzzy finder for everything |
ripgrep |
grep |
10x faster, respects .gitignore |
eza |
ls |
Icons, Git integration, tree view |
bat |
cat |
Syntax highlighting, line numbers |
zoxide |
cd |
Learns your most-used directories |
fd-find |
find |
Simpler syntax, faster |
tealdeer |
man |
Concise, practical command examples |
jq |
— | JSON processor |
btop |
top/htop |
Beautiful resource monitor |
lazygit |
git |
Terminal Git UI |
stow |
— | Dotfile symlink manager |
xh |
curl |
Colorized HTTP client |
git-delta |
diff |
Beautiful Git diffs with syntax highlighting |
dust |
du |
Modern disk usage analyzer |
Sets up the interactive shell experience:
- Zsh as the default shell
- OhMyZsh framework with plugins:
zsh-autosuggestions— suggests commands from history as you typezsh-syntax-highlighting— colors valid/invalid commands in real-time
- Starship prompt — shows Git status, Python venv, K8s context, Rust version, command duration, and more
- Configures
.zshrcwith all tool init lines and aliases:ls→eza --iconscat→batdocker→podmank→kubectlkind→ uses Podman provider automatically
This isn't a fragile dotfiles script — it's built as a provisioning framework with production-grade reliability:
| Feature | What It Does |
|---|---|
set -Eeuo pipefail |
Strict error handling in every file — no silent failures |
| Idempotent modules | Safe to re-run — checks for existing installs before acting |
| Sudo keep-alive | Asks for password once, keeps it cached for the entire run |
| Real dry-run | --dry-run prints every command at the run_step level |
| Per-module timing | Tracks how long each module takes |
| Logging | All output saved to ~/.local/share/setup/logs/ |
.zshrc protection |
Uses a marker comment to prevent duplicate entries on re-run |
| OS detection | Warns if not on Fedora 43+ or if internet is unavailable |
| Graceful failure | If a module fails, the rest still run and a summary report shows what happened |
Every run is logged to:
~/.local/share/setup/logs/setup-YYYYMMDD-HHMMSS.log
If something fails, the log captures the full output. Re-run just the failed module with:
./setup.sh --only N- Log out and back in — for Zsh to become your default shell
- Select Niri at the login screen as your session
- Open Ghostty — your terminal is ready with Starship, all tools, and aliases
# Install a Node.js LTS version
fnm install --lts
# Install Python 3.12
uv python install 3.12
# Start a PyTorch project with CUDA
uv init my-ml-project && cd my-ml-project
uv add torch --index-url https://download.pytorch.org/whl/cu124
# Create a local Kubernetes cluster
kind create cluster
# Install Java (if ever needed)
# Just install SDKMAN: curl -s "https://get.sdkman.io" | bash
# Then: sdk install java- Fedora 43 (Workstation or Server with GNOME removed)
- Internet connection (all modules download packages)
- Non-root user with sudo access
MIT