Installation¶
Three paths are available depending on how much you want to automate:
| Path | When to use |
|---|---|
| Interactive TUI | Fresh Arch system, guided dialogs |
| Answerfile (automated) | Unattended or repeatable installs |
| Custom ISO | Deploy from USB to multiple machines |
Prerequisites¶
- Arch Linux (base install completed, user created)
- Internet connection
gitavailable (sudo pacman -S git)
Interactive TUI¶
Clone the repo and run the installer:
git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git ~/Dotfiles
bash ~/Dotfiles/setup/tui-install.sh
The TUI walks you through:
- Hostname — optional; sets
/etc/hostnameimmediately - Components — pick any combination:
pkg— package managers (yay, nvm, Rust)core— 100+ base system packagessvc— core services (NetworkManager, cronie, fail2ban, greetd)shell— zsh, Neovim, Yazi, Micro, Starship- Desktop Environment — Hyprland, Sway, KDE Plasma, GNOME, COSMIC, XFCE, LXQt, or none
- Applications — checklist of ~50 optional apps (see Modules)
- Colorway — optional; enter hex values to customise the CyberQueer palette
All activity is logged to ~/dotfiles-install.log.
Adding Modules Later¶
To install additional optional apps on an already-configured system:
bash ~/Dotfiles/setup/install-modules.sh
This presents the same app checklist without re-running core setup.
Answerfile (Automated)¶
An answerfile lets the entire install — base OS and dotfiles — run without any user input.
Generating an Answerfile¶
bash ~/Dotfiles/setup/generate-answerfile.sh [OUTPUT_PATH]
# Default output: ~/answerfile.json
This dry-runs every installer dialog and saves your choices. No software is installed. Passwords are intentionally excluded — you will be prompted at install time.
Answerfile Schema¶
{
"_generated": "2026-05-18T12:00:00+00:00",
"drive": "/dev/sda",
"kernel": "linux",
"hostname": "myhost",
"username": "amir",
"encrypt": true,
"fido2_root": false,
"fido2_user": false,
"run_tui": true,
"components": ["pkg", "core", "svc", "shell"],
"desktop_environment": "hyprland",
"apps": ["firefox-browser", "vscodium", "docker"],
"colors": {
"COLOR_TEXT": "D6ABAB",
"COLOR_BG": "1A1A1A",
"COLOR_HIGHLIGHT": "E40046",
"COLOR_DARK": "5018DD",
"COLOR_RED": "F50505"
}
}
| Field | Type | Description |
|---|---|---|
drive |
string | Install target (/dev/sda, /dev/nvme0n1, …) |
kernel |
string | linux, linux-lts, or linux-zen |
hostname |
string | Base hostname — a MAC-address suffix is appended automatically |
username |
string | Primary user account name |
encrypt |
bool | Enable LUKS2 root encryption |
fido2_root |
bool | Enroll FIDO2 key for LUKS unlock |
fido2_user |
bool | Enroll FIDO2 key for PAM login |
run_tui |
bool | Run dotfiles setup automatically after base install |
components |
array | Dotfiles components to install |
desktop_environment |
string | DE name or "none" |
apps |
array | Optional app IDs (see Modules) |
colors |
object | Optional colour overrides (omit to keep defaults) |
Hostname Uniqueness¶
When hostname is set in the answerfile, the MAC address of the primary network interface is automatically appended:
myhost → myhost-aabbccddee11
This prevents hostname conflicts when the same answerfile is used across multiple machines.
Running with an Answerfile¶
Place the file at /answerfile.json (or set the ANSWERFILE environment variable):
# Use default location
sudo cp ~/answerfile.json /answerfile.json
bash ~/Dotfiles/setup/tui-install.sh
# Or override the path
ANSWERFILE=~/my-setup.json bash ~/Dotfiles/setup/tui-install.sh
Base OS Installers¶
Two scripts install Arch Linux itself (before the dotfiles step):
Guided Installer (archbaseos-guided-install.sh)¶
Interactive, dialog-based. Prompts for each setting with sensible defaults. Good for hands-on installs where you want to review each option.
bash ~/installer/archbaseos-guided-install.sh
Auto Installer (arch-autoinstall.sh)¶
Reads all settings from /answerfile.json if present; falls back to prompts for anything missing.
bash ~/installer/arch-autoinstall.sh
Both installers perform the same steps:
- Partition disk (EFI 15 GiB · Root · Swap = RAM size)
- Optionally encrypt root with LUKS2
- Format root as Btrfs with
@and@homesubvolumes pacstrapbase system- Configure locale, timezone, hostname, user, sudo
- Set up mkinitcpio hooks and GRUB
- Optionally run
tui-install.shinside the chroot
Disk Encryption¶
When encryption is enabled:
- Primary key: entered interactively at install time
- Backup key: generated automatically from
/dev/urandom, enrolled into a second LUKS slot, and written to/_LUKS_BACKUP_KEYinside the new system (mode0400, root-readable only, inside the encrypted container) - FIDO2 (optional): enroll a hardware key for passwordless unlock
The backup key can be collected by Ansible — see FreeIPA & Ansible.
mkinitcpio Hook Sets¶
| Scenario | Hooks |
|---|---|
| No encryption | base udev autodetect microcode modconf kms consolefont block btrfs filesystems keyboard fsck |
| LUKS + password | base udev autodetect microcode modconf kms consolefont block encrypt lvm2 btrfs filesystems keyboard keymap fsck |
| LUKS + FIDO2 | base udev systemd autodetect microcode modconf kms consolefont block sd-encrypt lvm2 btrfs filesystems keyboard keymap fsck |
Custom Live ISO¶
See Archiso for building a bootable USB that embeds the installer and, optionally, a pre-baked answerfile for zero-touch deployment.