# Archsetup Project Context ## Overview Arch Linux installation and configuration scripts with dotfiles managed via GNU Stow. Supports both X11 (DWM) and Wayland (Hyprland) setups. ## Project Structure ``` archsetup Main installation script archsetup.conf.example Configuration template init Bootstrap script for live ISO Makefile VM integration testing + project dependencies todo.org Active task list scripts/ Utility scripts (wireguard, post-install, wipedisk, etc.) assets/ Reference documents and archived files color-themes/ Theme palettes, generation scripts outbox/ Processed inbox items wireguard-config/ Proton VPN configs .ai/ Claude tooling: session docs, workflows, protocols (gitignored) inbox/ Unprocessed documents for session review reference-repos/ External dotfile references scripts/testing/ VM-based integration test framework test-results/ Test run output vm-images/ VM disk images for testing ``` ## Makefile Targets ``` make deps # Install VM-testing dependencies make test-unit # Run fast unit tests for installer helpers (no VM) make test # Run full VM integration test (creates base VM if needed) make test-keep # Run test and keep the VM up for manual poking make test-vm-base # Create the base VM only ``` Dotfile stow operations live in the dotfiles repo's own Makefile, not here. Run them from `~/.dotfiles`: ``` cd ~/.dotfiles && make stow hyprland # common + hyprland + host tier cd ~/.dotfiles && make restow hyprland # refresh links after git pull cd ~/.dotfiles && make reset hyprland # fix conflicts, keep repo version cd ~/.dotfiles && make unstow hyprland # remove symlinks cd ~/.dotfiles && make import common # fzf select → import to common/ cd ~/.dotfiles && make test # run the dotfile-script unit suites ``` Per-host overrides live in a stow tier named after the machine (`ratio/`, `velox/`), auto-included by every stow target when the directory exists (`HOST=` overrides detection; hostname binary is absent — `uname -n`). The tier holds only files no shared package owns: hypr `conf.d/local.conf` (velox: HiDPI scale + XWayland toolkit env), `pypr/config.toml`, and foot's `host.ini` (the shared foot.ini sets no font — it's per-host via include). ## Dotfiles Repository Dotfiles live in their own repo at `git.cjennings.net/dotfiles.git` (read: `https://git.cjennings.net/dotfiles.git`, push: `git@cjennings.net:dotfiles.git`). A fresh `archsetup` install clones it to `~/.dotfiles` and stows per `DESKTOP_ENV`: ``` dwm → common/ + dwm/ hyprland → common/ + hyprland/ none → minimal/ (standalone headless tree, not common/) ``` Config keys (in `archsetup.conf`, all optional — defaults shown): ``` DOTFILES_REPO=https://git.cjennings.net/dotfiles.git DOTFILES_BRANCH=main DOTFILES_DIR= # defaults to the target user's ~/.dotfiles ``` Pull dotfile changes after install: ``` cd ~/.dotfiles && git pull cd ~/.dotfiles && make restow hyprland ``` Setting up a new machine by hand (outside the installer): ``` git clone https://git.cjennings.net/dotfiles.git ~/.dotfiles cd ~/.dotfiles && make stow hyprland ``` **Quit Hyprland before an unstow/restow.** Unstowing while Hyprland runs makes it write a stub `hyprland.conf` into the gap, which then blocks the restow. Do it from a TTY, or with the session stopped. ## Dotfile Script Counts The scripts live in the dotfiles repo (`~/.dotfiles`), not here: ``` ~/.dotfiles/common/.local/bin/ → 33 universal scripts ~/.dotfiles/dwm/.local/bin/ → 8 X11/DWM scripts ~/.dotfiles/hyprland/.local/bin/ → 7 Hyprland scripts ``` ## Shell Configuration ``` ~/.profile → Environment variables only (POSIX compatible) ~/.bash_profile → Sources .profile + .bashrc for login shells ~/.bashrc → Bash-specific settings, sources .bashrc.d/ ~/.zshrc → Zsh-specific settings, sources .zshrc.d/ ~/.profile.d/ → Modular env vars (display, framework, auto-tmux, hyprland) ~/.bashrc.d/ → Modular bash configs (aliases, fzf, git, media, utilities, emacs) ~/.zshrc.d/ → Modular zsh configs (same + arch-downgrade) ``` ## Theme System Two themes available: dupre (default) and hudson. Switched via `set-theme` script. Full palette reference: `assets/color-themes/dupre/dupre-palette.org` - **GTK**: Adwaita-dark - **Qt**: Adwaita-Dark (via adwaita-qt5/qt6, QT_STYLE_OVERRIDE) - **Icons**: Papirus-Dark - **Cursors**: Bibata-Modern-Ice (size 24) - **Font**: BerkeleyMono Nerd Font (13pt terminal, 14px waybar) - **Theme configs**: `~/.dotfiles/hyprland/.config/themes/dupre/` ## Key Configuration Files - `~/.dotfiles/hyprland/.config/hypr/hyprland.conf` - Main Hyprland config - `~/.dotfiles/hyprland/.config/themes/dupre/` - Dupre theme files (foot, fuzzel, waybar, dunst, hyprlock, Xresources) - `~/.dotfiles/common/.profile.d/` - Shell environment scripts - `~/.dotfiles/common/.config/qt5ct/qt5ct.conf` - Qt5 theming - `~/.dotfiles/common/.config/qt6ct/qt6ct.conf` - Qt6 theming ## Notes - Desktop file overrides go in `~/.dotfiles/hyprland/.local/share/applications/` - MPD is configured but mpv handles audio file associations - Firewall is ufw (configured in `archsetup`, default-deny incoming, explicit allow list). Tailscale traffic **does** traverse ufw on ratio — a probe from a tailnet IP is still blocked unless a rule covers the port. Don't assume tailnet-only services bypass the firewall; they need an explicit ufw rule like any other. - This machine is **ratio**; **velox** is a laptop. Both run Hyprland (Wayland). archsetup still supports dwm/X11, but no current machine uses it. - Remote repository on cjennings.net - .ai/ is gitignored; living project context is in .ai/notes.org