Personal Arch Linux dotfiles + bootstrap script. Automates installing core tooling (shell, editors, CLI utilities, desktop bits), sets sane defaults, and symlinks configs safely (with backups). Includes optional private package mode.
Target: Minimal Arch install (with AUR) Script assumes
pacman+ AUR helper (paru). Other distros are NOT supported by the current script (README previously overstated this).
- Automated install of base packages, AUR apps, developer tooling, fonts.
- Safe idempotent symlinking (backs up existing files with numbered .bak suffixes).
- Opinionated Zsh setup (Oh My Zsh + plugins + Spaceship theme).
- Neovim bootstrap (kickstart.nvim clone, auto-replaced if different repo).
- Post-install desktop defaults (qutebrowser, zathura, display/login assets).
- Optional private mode:
--privateinstalls extra packages.
- Arch Linux (or derivative with pacman + ability to build AUR packages).
- sudo access.
- git, curl (will install if missing in base step).
git clone https://github.com/knownasnaffy/dotfiles.git
cd dotfiles
./setup.sh # standard
./setup.sh --private # include private extrasThe script will:
- Install base compilers & tools (
pacman -Sy zsh make gcc ripgrep unzip git xclip neovim base-devel). - Install / build
paruif missing. - Sync + install large program set via
paru(see list below). - Install Homebrew (if absent) then bun, pipx, fnm, cargo battery-notify.
- Setup Oh My Zsh plugins + Spaceship prompt.
- Link dotfiles (user + select /etc configs via sudo symlinks).
- Run post-install tweaks (bat cache, xdg defaults, enable
ly).
AUR + repo installs include (subset):
- Shell/tools: zsh, fzf, ripgrep, bat, eza, zoxide, btop, eva, jq, brightnessctl.
- Terminal/UI: ghostty, rofi (+ greenclip), polybar, picom, dunst, i3-wm, i3lock-color, keyd.
- Fonts & visuals: ttf-hack-nerd, noto-fonts-emoji, fastfetch, ueberzug.
- Apps: qutebrowser, zathura (+ poppler), spotifyd, flameshot, pass.
- Audio: pipewire, wireplumber, pipewire-pulse, pipewire-alsa, alsa-utils.
- Misc/fun: thefuck, cowsay, fortune-mod.
- Dev extras: bun, fnm (Node LTS), pipx, cargo battery-notify.
Private mode adds: jrnl (and can be extended).
User-level symlinks:
- .gitconfig, .zshrc, .zsh_functions
- ~/.config: gh, ghostty, qutebrowser, picom, polybar, i3, rofi, fastfetch, bat, eza, zathura, yazi, pycodestyle, battery-notify, spotifyd, systemd, dunst, btop, greenclip.toml, BeeperTexts (custom.css, config.json), fonts (under .local/share/fonts)
- ~/.Xresources, ~/.lesskey
System-level (sudo) symlinks:
- /etc/X11/xorg.conf.d/30-touchpad.conf
- /etc/ly/config.ini
- /etc/keyd
If a target exists it is renamed to filename.bak (or numbered .bakN).
If an existing ~/.config/nvim is a git repo pointing to knownasnaffy/kickstart.nvim, it is kept. Any other existing config is removed then the kickstart repo is cloned.
ZRAM + optional swapfile instructions (for half-RAM zram + 2G fallback file) are documented below.
paru -S zram-generator
sudo nvim /etc/systemd/zram-generator.conf
# contents:
[zram0]
zram-size = ram / 2
compression-algorithm = zstd
swap-priority = 100
sudo systemctl daemon-reexec
sudo systemctl restart systemd-zram-setup@zram0
swapon --showOptional swapfile:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw,pri=10 0 0' | sudo tee -a /etc/fstabUse port 465 (implicit TLS) for Gmail outgoing instead of 587 if STARTTLS fails.
.
├── setup.sh
├── README.md
├── images/
│ ├── fastfetch.png
│ └── tokyonight-wallpaper.png
├── etc/
│ ├── X11/...
│ ├── keyd/...
│ └── ly/config.ini
└── .config/...
Fastfetch example (images/fastfetch.png):

- Shell still bash: log out or run
chsh $(id -un) --shell $(command -v zsh)manually. - Symlink missing: check permissions (sudo for /etc) and ensure parent directories exist.
- Neovim config not replaced: remove existing
~/.config/nvimand rerun. lynot starting:sudo systemctl enable ly && sudo systemctl start ly.
Add new config under repo then append a create_symlink (or create_sudo_symlink) call in link_dotfiles() maintaining grouping. Keep changes minimal & idempotent.
No license file currently included. Add one (MIT, etc.) if you intend to share/reuse.
Previously claimed cross-distro support was removed to match actual script behavior.