Arch Linux rice: Hyprland + Noctalia Shell + fish + alacritty/kitty, NVIDIA (open-dkms), pipewire, btrfs + timeshift.
The repo mirrors ~/.config (plus Wallpapers/ → ~/Pictures/Wallpapers) and ships an installer that rebuilds the whole system from scratch with a single command.
| Directory | What it is |
|---|---|
hypr/ |
Hyprland configured in Lua (hyprland.lua + config/*.lua), hypridle/hyprlock/hyprpaper, wallpaper and voxtype-toggle scripts |
noctalia/ |
Noctalia Shell (quickshell): settings, colors, plugins |
fish/ |
fish + Tide prompt (fully vendored, no fisher needed) |
alacritty/, kitty/ |
terminals + theme collections |
fastfetch/, solaar/, voxtype/ |
fetch config, Logitech devices, voice typing |
Wallpapers/ |
wallpapers (deployed to ~/Pictures/Wallpapers) |
packages.json |
manifest: packages, services, groups, deploy rules — everything the installer is driven by |
install.py / install.sh |
installer and curl bootstrap |
system/ |
system-level files (zram-generator.conf → /etc/systemd/) |
Requirements: fresh Arch install, a user with sudo, network access. Then one command:
curl -fsSL https://raw.githubusercontent.com/redmoondz/dots/master/install.sh | bashThe bootstrap installs git and python if missing, clones the repo to ~/Documents/dots and runs install.py. Flags pass through via bash -s --:
# preview every action without changing anything
curl -fsSL https://raw.githubusercontent.com/redmoondz/dots/master/install.sh | bash -s -- --dry-run
# fully unattended (every prompt takes its default)
curl -fsSL https://raw.githubusercontent.com/redmoondz/dots/master/install.sh | bash -s -- --noconfirmIf the repo is already cloned, run the installer directly:
python3 ~/Documents/dots/install.py install [flags]Every step is idempotent — the script is safe to re-run: already-done work prints as skip, changes as ok. The sudo password is asked once (kept alive for the whole run).
- preflight — sanity checks: Arch, not root, sudo, network
- multilib — enables
[multilib]in pacman.conf (steam/wine/lib32) - update —
pacman -Syu(partial upgrades are dangerous on Arch) - git-config — user.name/user.email (prompt with defaults)
- yay — builds yay from AUR via makepkg
- native / aur / npm / curl-tools — every package from
packages.json: official repos, AUR (voxtype, noctalia-git, chrome, spotify…),@openai/codex, the claude-code and codex CLIs - deploy — configs as symlinks:
~/.config/hypr → ~/Documents/dots/hypretc. The repo becomes the single source of truth — config edits show up ingit diffimmediately. Existing directories are backed up as*.bak-<date>. Alternative:--mode=copy - system-files —
system/zram-generator.conf→/etc/systemd/ - shell / path / groups — fish into
/etc/shells+chsh,~/.local/binon PATH,inputgroup (needed by voxtype) - services — NetworkManager, bluetooth, cronie, timesyncd. Docker gets installed but its service is not enabled.
voxtype.serviceis force-disabled — Hyprland launches voxtype viaexec-once, running both crash-loops - display-manager — SDDM by default (
--dm gdm|greetd|tty|skip). An already-enabled DM is never touched without--force-dm - nvidia-check — verifies dkms built the nvidia modules (warns only, never auto-fixes)
- voxtype — downloads the
large-v3whisper model (~3 GB, asks first;--skip-modelto defer),--voxtype-gpufor GPU inference - Final checklist of manual follow-ups
| Flag | Meaning |
|---|---|
--dry-run |
print actions without executing anything |
--noconfirm |
no questions, take defaults |
--mode symlink|copy |
config deploy strategy (default: symlink) |
--dm sddm|gdm|greetd|tty|skip |
display manager (default: sddm) |
--force-dm |
replace an already-enabled DM |
--skip-update / -native / -aur / -npm / -curl / -deploy / -services / -model |
skip a phase |
--with-optional |
also install optional[] packages (loupe, papers, hyprpolkitagent…) |
--with-zsh |
also deploy the legacy .zshrc |
--voxtype-gpu |
run voxtype setup gpu --enable |
--git-name / --git-email |
git identity without a prompt |
--only step1,step2 |
run only the listed steps (names: --list-steps) |
Examples:
python3 install.py install --only deploy # just recreate the symlinks
python3 install.py install --dm=greetd --force-dm # switch the DM to greetd
python3 install.py install --skip-aur --skip-model --noconfirmpython3 install.py sync # package lists -> packages.json
python3 install.py check # verify every package name still resolves in repos/AURsyncregeneratespackages.jsonfrompacman -Qqen/-Qqemusing thesync_policyrules: the GNOME stack is excluded, pins (pipewire, portals, lib32-nvidia-utils, virtualbox-host-dkms…) are preserved, and packages fromremoved_do_not_installnever come back. It also mirrors live configs into the repo if they are not symlinks yet. It never commits — it only showsgit status.checkrunspacman -Si/yay -Siover every name — catches packages migrating between AUR and the official repos. Run it before restoring onto a new machine.
Installed a new package → python3 install.py sync → git add -A && git commit && git push. Changed a config → it's already in the repo (symlinks) → just commit.
- GNOME is excluded. The source machine has GNOME installed alongside, but the restore doesn't pull it in: gdm/gnome-shell and the whole stack live in
sync_policy.exclude_globs. Exceptions:gnome-keyring(secrets under Hyprland) and former GNOME dependencies promoted to explicit packages (pipewire, bluez, libnotify, noto-fonts, polkit, xdg-desktop-portal-hyprland/-gtk). - The source of truth is pacman, not bash_history. Shell history is full of typos and reverted installs; the manifest is generated from
pacman -Qqen/-Qqemand kept fresh bysync. removed_do_not_install: epiphany, noctalia-qs (replaced by noctalia-git), datagrip, google-chrome-bin, voxtype-cuda — installed once and deliberately removed; the installer will never bring them back.- Provider pins:
lib32-nvidia-utilsandvirtualbox-host-dkmsare listed explicitly, otherwise--noconfirmwould pick lib32-mesa / virtualbox-host-modules-arch.
- Re-login/reboot —
inputgroup, login shell, NVIDIA driver - Log into
claudeandcodex nvidia-smi— verify the driver after reboot- Configure timeshift snapshots
- voxtype: SCROLLLOCK hotkey (push-to-talk); daemon toggle —
SUPER+ALT+R
- Bootstrapping yay from scratch, the first SDDM enable, the first dkms build and
chshhave not been exercised on a real bare machine — only in idempotent mode on the configured system. Watch the step output on the first real restore. - The whisper model (~3 GB) is not in the repo and is downloaded separately; voxtype does not work without it.
- Logins for claude/codex/chrome/spotify and other accounts are not automated.

