Scripts to set up my preferred environment on Arch, Debian, or Fedora based distributions.
The setup script detects (or accepts as argument) whether the system is Arch, Debian, or Fedora based, then:
- Updates system packages
- Checks for existing firewalls and installs/enables
ufwif none found - Creates
~/Workspaceand clones dotfiles (converted to SSH remote) - Runs dotfiles
justfile(just install) which handles core tools, shell setup (ZSH, plugins, starship), font installation, stowing configs, and more - Installs additional packages not covered by the justfile (see
vars/) - Prompts for git user configuration (
~/.config/git/config.local) - Installs KDE Plasma packages, apps, and gaming packages
- Installs Cursor IDE (official repo on Fedora/Debian;
cursor-binAUR on Arch) - Sets up NordVPN with systemd-resolved
- Registers Steam Tinker Launch as a Steam compatibility tool
Arch-specific: Enables multilib, installs paru (AUR helper), configures btrfs Snapper rollback (when root is btrfs). Desktop apps from AUR include cursor-bin (official .deb-based Cursor build).
Debian-specific: Installs nala and apt tools, ghostty via debian.griffo.io, Cursor via official APT repo, pyenv/nvm manually (no AUR), adds NordVPN repo.
Fedora-specific: Enables RPM Fusion, installs packages from dnf_*, rpmfusion_*, and flatpak_* groups in vars/fedora-vars, configures btrfs Snapper (when root is btrfs), ghostty via COPR scottames/ghostty, Firefox Wayland (MOZ_ENABLE_WAYLAND=1), Cursor via official DNF repo, system-scope Flatpak installs, pyenv/nvm manually, adds NordVPN repo. Skips power-profiles-daemon when tuned-ppd is installed.
Setup scripts record errors in a counter (SETUP_ERRORS) and exit non-zero at the end if any step failed; interactive prompts are not aborted by set -e.
Setup scripts are safe to re-run: package installs skip already-installed packages, and shared helpers in scripts/lib/common.sh guard groups, systemd units, multilib, and pip user installs. System upgrades (paru -Syu, apt upgrade, dnf upgrade) still run each time.
Output is logged to logs/<timestamp>_setup.log (absolute path under repo root).
Logging: All scripts source scripts/lib/common.sh for shared logging (INFO, OUT, WARN, ERROR, RUN levels with timestamps). Logs are written to logs/ via tee regardless of current working directory.
├── setup # Entry point — post-install setup (detects distro)
├── install # Entry point — Arch install / reinstall / backup
├── scripts/
│ ├── lib/
│ │ ├── common.sh # Shared logging and setup helpers
│ │ └── install.sh # Shared Arch install/reinstall helpers
│ ├── setup-arch # Full Arch (KDE) setup
│ ├── setup-debian # Full Debian (KDE) setup
│ ├── setup-fedora # Full Fedora (KDE) setup
│ ├── setup-arch-i3 # Older i3-based Arch setup (unused)
│ ├── install-arch # Arch Linux fresh install (live ISO)
│ ├── install-arch-reinstall # Arch reinstall (preserves /home)
│ └── install-arch-backup # Arch reinstall config backup (live system)
├── vars/
│ ├── arch-vars # Package lists for Arch (pacman & paru/AUR)
│ ├── debian-vars # Package lists for Debian (apt & extras)
│ └── fedora-vars # Package lists for Fedora (dnf & extras)
├── instructions/
│ ├── install/ # Arch, Debian & Fedora install guides
│ └── post-install/ # App-specific settings & configuration notes
├── apps.md # App decision log (done / not done / to investigate)
└── logs/ # Created at runtime (gitignored)
- A working internet connection
gitavailable to clone this repo and dotfiles- Arch:
base-develinstalled (needed to buildparu) - Debian:
sudoandaptworking - Fedora:
sudoanddnfworking
Optional: allow passwordless sudo by editing sudoers safely:
sudo visudo
# or with vim:
sudo VISUAL=vim visudoAdd to the end of the file:
your_username ALL=(ALL:ALL) NOPASSWD: ALL
Or uncomment line for wheel group that has NOPASSWD:
%wheel ALL=(ALL) NOPASSWD: ALL
And add your user to wheel group:
sudo usermod -a -G wheel your_username-
Clone this repo and enter the directory.
-
Make scripts executable, if not already:
chmod u+x setup install scripts/*- Run:
./setup
# or explicitly:
./setup arch
./setup debian
./setup fedoraThe script auto-detects the distro from /etc/os-release. Pass arch, debian, or fedora manually if detection fails.
Entry point: ./install arch
Fresh install (live ISO, as root):
./install archDestroys target disks. Automates instructions/install/arch-install.md: partitioning, optional LUKS encryption, LVM, btrfs subvolumes, pacstrap, boot setup (GRUB/mkinitcpio), localization, user creation, KDE Plasma, and optional reboot.
Reinstall (live ISO, as root):
./install arch --reinstallPreserves /home, reformats root only, restores boot configs from backup, recreates users, installs KDE Plasma.
Config backup (running system, before rebooting to live ISO):
sudo ./install arch --backupCopies /etc configs to ~/install/etc/ for reinstall restore (see instructions/install/arch-reinstall.md).
Logs: logs/<timestamp>_install-arch.log, _install-arch-reinstall.log, or _install-arch-backup.log.
These steps are also printed by the script on completion:
- Reboot the machine.
- Open Ghostty (terminal emulator).
- Open Cursor (
cursorin app menu or terminal). - If a firewall was already installed, check its rules.
- Install nvm and Node.js:
# Get install command from: https://github.com/nvm-sh/nvm#installing-and-updating exec zsh nvm install node
- Set up Python with pyenv:
pyenv install -l | less pyenv install <version> pyenv global <version> mkdir -p ~/Python && cd ~/Python python -m venv <name>
- Open Neovim if you want to verify plugins (
just installalready syncs Lazy.nvim and Mason tools). - Open tmux and install plugins:
tmuxthenctrl+space I(TPM runs duringjust install; reload tmux config if needed).
apps.md— Several apps still marked as not done (app launcher, tiling WM, Docker, RDP, mouse/keyboard tools, etc.).- Configurable package selection (interactive options)
- Clean package caches at the end?