fix(installer): address issues 2-8 from sanity check

#2 — Word-boundary match for all module patterns
  Generator now pads SELECTED_APPS with spaces and uses *" id "* in
  counters, summary, and dispatch, matching the conflict fix from #1.
  plymouth-custom no longer false-triggers any plymouth check.

#3 — Guided installer now runs tui-install.sh
  archbaseos-guided-install.sh was calling simple-install.sh; both
  paths now use the full TUI (sentinel-managed, modules.conf-driven).

#4 — EFI/boot partition size unified at 10 GiB
  arch-autoinstall.sh was 15 GiB, archbaseos-guided-install.sh was
  5 GiB. Both now use 10 GiB.

#5 — Interactive retry for dotfiles clone (guided installer)
  Clone moved outside the chroot heredoc so read() reaches the terminal.
  Loops until success or the user skips; AF_MODE warns and continues.

#6 — PAM target unified on system-local-login
  archbaseos-guided-install.sh was writing to system-auth (affects
  sudo). Both installers now target system-local-login only.

#7 — Redundant second clone removed from autoinstaller
  arch-autoinstall.sh had a second git clone inside the chroot as a
  fallback that collided with the skel copy and printed a spurious
  warning. Removed; skel-only approach matches the guided installer
  (last updated). Also removed the individual .zshrc/.bashrc/.vimrc
  cp block; aligned to the guided installer's cleaner skel structure.

#8 — Docs: remove stale plymouth core-module section
  docs/md/modules.md still described plymouth under Core Modules.
  Section removed; plymouth appears in Optional Applications (system
  category) via the generated sentinel.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
main
Amir Alexander Abdelbaki 2026-06-26 14:12:09 +02:00
parent b227c73fcc
commit a92de3193a
5 changed files with 283 additions and 297 deletions

View File

@ -47,17 +47,6 @@ Also deploys `greetd-tuigreet` config from the dotfiles.
- **Yazi** file manager - **Yazi** file manager
- Deploys `.bashrc`, `.zshrc`, `starship.toml`, Micro config, Neovim config - Deploys `.bashrc`, `.zshrc`, `starship.toml`, Micro config, Neovim config
### `plymouth` — Boot Splash *(on by default)*
Installs the **M-Archy Plymouth theme**: the skull logo (`resources/bg-skull.svg`) centred on a dark background with a 12-dot magenta spinner animation below it.
- Converts the bundled SVG to PNG via `rsvg-convert` (Plymouth's image loader is PNG-only)
- Injects the `plymouth` or `sd-plymouth` mkinitcpio hook automatically (detects `udev` vs `systemd` hook set)
- Adds `quiet splash` to `GRUB_CMDLINE_LINUX_DEFAULT` and regenerates GRUB config
- Rebuilds the initramfs so the theme is baked in
To install with a **custom image** on an existing system, use `install-modules.sh` and select *Plymouth (custom)* — you will be prompted for a PNG or SVG path.
--- ---
## Desktop Environments ## Desktop Environments

View File

@ -273,15 +273,15 @@ fi
# Read installed RAM in GiB; used to size both the swap and to calculate remaining # Read installed RAM in GiB; used to size both the swap and to calculate remaining
# root space. `--giga` prints in GiB units; awk extracts the total column. # root space. `--giga` prints in GiB units; awk extracts the total column.
RAM_GB=$(free --giga | awk '/^Mem:/ {print $2}') RAM_GB=$(free --giga | awk '/^Mem:/ {print $2}')
# 15 GiB boot partition: large enough for multiple kernels, initramfs, and UKIs. # 10 GiB boot partition: large enough for multiple kernels, initramfs, and UKIs.
BOOT_SIZE=15GiB BOOT_SIZE=10GiB
SWAP_SIZE="${RAM_GB}GiB" SWAP_SIZE="${RAM_GB}GiB"
# lsblk -b reports raw bytes; divide down to GiB for integer arithmetic. # lsblk -b reports raw bytes; divide down to GiB for integer arithmetic.
DISK_SIZE=$(lsblk -b -dn -o SIZE "$DRIVE") DISK_SIZE=$(lsblk -b -dn -o SIZE "$DRIVE")
DISK_GIB=$((DISK_SIZE / 1024 / 1024 / 1024)) DISK_GIB=$((DISK_SIZE / 1024 / 1024 / 1024))
# Root gets whatever is left after reserving 15 GiB for boot and RAM_GB for swap. # Root gets whatever is left after reserving 10 GiB for boot and RAM_GB for swap.
ROOT_GIB=$((DISK_GIB - RAM_GB - 15)) ROOT_GIB=$((DISK_GIB - RAM_GB - 10))
if (( ROOT_GIB < 8 )); then if (( ROOT_GIB < 8 )); then
echo "ERROR: Not enough disk space. Root would be only ${ROOT_GIB}GiB (need ≥8GiB)." echo "ERROR: Not enough disk space. Root would be only ${ROOT_GIB}GiB (need ≥8GiB)."
exit 1 exit 1
@ -296,16 +296,16 @@ echo " Swap: ${SWAP_SIZE}"
# PARTITION DISK # PARTITION DISK
############################################ ############################################
# --script suppresses interactive prompts; mklabel gpt wipes any existing table. # --script suppresses interactive prompts; mklabel gpt wipes any existing table.
# Partition 1: ESP at 1MiB15GiB, flagged boot/esp so firmware can find it. # Partition 1: ESP at 1MiB10GiB, flagged boot/esp so firmware can find it.
# Partition 2: ROOT immediately after the ESP. # Partition 2: ROOT immediately after the ESP.
# Partition 3: SWAP fills the rest (100%). # Partition 3: SWAP fills the rest (100%).
# Starting at 1MiB aligns the first partition to a 1 MiB boundary, which is # Starting at 1MiB aligns the first partition to a 1 MiB boundary, which is
# optimal for both SSD erase blocks and spinner track alignment. # optimal for both SSD erase blocks and spinner track alignment.
parted "$DRIVE" --script mklabel gpt \ parted "$DRIVE" --script mklabel gpt \
mkpart ESP fat32 1MiB 15GiB \ mkpart ESP fat32 1MiB 10GiB \
set 1 boot on \ set 1 boot on \
mkpart ROOT 15GiB "$((15 + ROOT_GIB))"GiB \ mkpart ROOT 10GiB "$((10 + ROOT_GIB))"GiB \
mkpart SWAP "$((15 + ROOT_GIB))"GiB 100% mkpart SWAP "$((10 + ROOT_GIB))"GiB 100%
# Resolve partition device paths via the `part` helper (handles NVMe 'p' suffix). # Resolve partition device paths via the `part` helper (handles NVMe 'p' suffix).
BOOT_PART=$(part "$DRIVE" 1) BOOT_PART=$(part "$DRIVE" 1)
@ -488,16 +488,8 @@ systemctl enable NetworkManager
# Populate /etc/skel before user creation so useradd -m copies everything # Populate /etc/skel before user creation so useradd -m copies everything
echo "Cloning dotfiles into /etc/skel..." echo "Cloning dotfiles into /etc/skel..."
git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git /etc/skel/Dotfiles \ git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git /etc/skel/Dotfiles \
|| echo "Warning: dotfiles clone into skel failed — will fall back to direct clone." || echo "Warning: dotfiles clone failed — clone manually after first boot."
# Seed /etc/skel with base shell dotfiles from the repo clone mkdir -p /etc/skel/{Desktop,Documents,Downloads,Music,Pictures,Public,Templates,Videos}
if [[ -d /etc/skel/Dotfiles ]]; then
D=/etc/skel/Dotfiles
# Copy individually; `2>/dev/null || true` silently skips any file that is absent
# in this repo revision rather than aborting the install.
cp "$D/.zshrc" /etc/skel/.zshrc 2>/dev/null || true
cp "$D/.bashrc" /etc/skel/.bashrc 2>/dev/null || true
cp "$D/.vimrc" /etc/skel/.vimrc 2>/dev/null || true
fi
# User # User
# -m: create home dir; -G wheel: add to sudoers group; -s /bin/zsh: default shell. # -m: create home dir; -G wheel: add to sudoers group; -s /bin/zsh: default shell.
@ -568,16 +560,6 @@ if [[ "$FIDO_USER" == "YES" ]]; then
echo "auth required pam_u2f.so" >> /etc/pam.d/system-local-login echo "auth required pam_u2f.so" >> /etc/pam.d/system-local-login
fi fi
###################################################
# CLONE DOTFILES
###################################################
# Fall back to a direct clone if /etc/skel/Dotfiles was not copied into home
# (happens when the skel clone failed or useradd did not copy skel).
echo "Cloning dotfiles..."
git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git "/home/$USERNAME/Dotfiles" \
&& chown -R "$USERNAME":"$USERNAME" "/home/$USERNAME/Dotfiles" \
|| echo "Warning: dotfiles clone failed — clone manually after first boot."
CHROOT_EOF CHROOT_EOF
############################################ ############################################

View File

@ -243,8 +243,8 @@ RAM_GB=$(free --giga | awk '/Mem/ {print $2}')
# lsblk -b: bytes; -d: disk only (no partitions); -n: no header; -o SIZE: size column. # lsblk -b: bytes; -d: disk only (no partitions); -n: no header; -o SIZE: size column.
DISK_GB=$(lsblk -dn -o SIZE -b "$DRIVE" | awk '{print int($1/1024/1024/1024)}') DISK_GB=$(lsblk -dn -o SIZE -b "$DRIVE" | awk '{print int($1/1024/1024/1024)}')
# Reserve 5 GiB for the EFI partition and 1 GiB for alignment/overhead. # Reserve 10 GiB for the EFI partition and 1 GiB for alignment/overhead.
EFI_SIZE=5 EFI_SIZE=10
SWAP_SIZE=$RAM_GB SWAP_SIZE=$RAM_GB
ROOT_SIZE=$((DISK_GB - SWAP_SIZE - EFI_SIZE - 1)) ROOT_SIZE=$((DISK_GB - SWAP_SIZE - EFI_SIZE - 1))
@ -389,6 +389,29 @@ if $AF_MODE; then
install -m 644 "$ANSWERFILE" /mnt/answerfile.json install -m 644 "$ANSWERFILE" /mnt/answerfile.json
fi fi
############################################
# DOTFILES CLONE TO SKEL (with retry)
############################################
# Clone before entering the chroot so useradd -m inside will copy Dotfiles to
# the new user's home. Interactive retry is available so a transient network
# failure doesn't silently leave the system without dotfiles.
echo "Cloning dotfiles into /mnt/etc/skel..."
_clone_ok=false
while ! $_clone_ok; do
if git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git /mnt/etc/skel/Dotfiles; then
mkdir -p /mnt/etc/skel/{Desktop,Documents,Downloads,Music,Pictures,Public,Templates,Videos}
_clone_ok=true
else
if $AF_MODE; then
echo "Warning: dotfiles clone failed — continuing without dotfiles."
_clone_ok=true
else
read -rp "Clone failed — retry? [y/N]: " _retry
[[ "${_retry,,}" == "y" ]] || { echo "Skipping dotfiles — clone manually after first boot."; _clone_ok=true; }
fi
fi
done
############################################ ############################################
# CHROOT Configuration # CHROOT Configuration
############################################ ############################################
@ -430,15 +453,7 @@ echo "$HOSTNAME" > /etc/hostname
# Enable NetworkManager at boot so the installed system has networking on first login. # Enable NetworkManager at boot so the installed system has networking on first login.
systemctl enable NetworkManager systemctl enable NetworkManager
# Populate /etc/skel before user creation so useradd -m copies everything # -m: create home from /etc/skel (dotfiles cloned before chroot); -G wheel: allow sudo; -s /bin/zsh: default shell.
echo "Cloning dotfiles into /etc/skel..."
git clone https://git.abdelbaki.eu/The_miro/Dotfiles.git /etc/skel/Dotfiles \
|| echo "Warning: dotfiles clone failed — clone manually after first boot."
# Create standard XDG user directories in skel so they are present in every new home.
mkdir -p /etc/skel/{Desktop,Documents,Downloads,Music,Pictures,Public,Templates,Videos}
# -m: create home from /etc/skel; -G wheel: allow sudo; -s /bin/zsh: default shell.
useradd -m -G wheel -s /bin/zsh "$USERNAME" useradd -m -G wheel -s /bin/zsh "$USERNAME"
# chpasswd reads "user:pass" from stdin to set the password non-interactively. # chpasswd reads "user:pass" from stdin to set the password non-interactively.
echo "$USERNAME:$USERPASS" | chpasswd echo "$USERNAME:$USERPASS" | chpasswd
@ -492,7 +507,7 @@ if [[ "$ENABLE_FIDO_USER" == "YES" ]]; then
mkdir -p "/home/$USERNAME/.config/Yubico" mkdir -p "/home/$USERNAME/.config/Yubico"
chown "$USERNAME:$USERNAME" "/home/$USERNAME/.config/Yubico" chown "$USERNAME:$USERNAME" "/home/$USERNAME/.config/Yubico"
# `cue` option: pam_u2f prints a prompt so the user knows to touch the key. # `cue` option: pam_u2f prints a prompt so the user knows to touch the key.
echo "auth required pam_u2f.so cue" >> /etc/pam.d/system-auth echo "auth required pam_u2f.so cue" >> /etc/pam.d/system-local-login
fi fi
CHROOT_EOF CHROOT_EOF
@ -535,11 +550,11 @@ if [[ "${_DO_TUI^^}" == "YES" ]]; then
echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" \ echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" \
| arch-chroot /mnt tee /etc/sudoers.d/99-setup-nopasswd > /dev/null | arch-chroot /mnt tee /etc/sudoers.d/99-setup-nopasswd > /dev/null
echo "Running simple-install.sh as ${USERNAME} inside chroot..." echo "Running tui-install.sh as ${USERNAME} inside chroot..."
# `runuser -u` switches to the unprivileged user inside the chroot so that # `runuser -u` switches to the unprivileged user inside the chroot so that
# AUR helpers and dotfiles are owned/built by the correct UID. # AUR helpers and dotfiles are owned/built by the correct UID.
arch-chroot /mnt runuser -u "${USERNAME}" -- \ arch-chroot /mnt runuser -u "${USERNAME}" -- \
bash "/home/${USERNAME}/Dotfiles/setup/simple-install.sh" \ bash "/home/${USERNAME}/Dotfiles/setup/tui-install.sh" \
|| echo "Warning: tui-install exited with errors — check ~/dotfiles-install.log in the new system." || echo "Warning: tui-install exited with errors — check ~/dotfiles-install.log in the new system."
# Remove the temporary no-password sudoers drop-in after setup completes. # Remove the temporary no-password sudoers drop-in after setup completes.
@ -560,7 +575,7 @@ echo " umount -R /mnt && reboot"
if [[ "${_DO_TUI^^}" != "YES" ]]; then if [[ "${_DO_TUI^^}" != "YES" ]]; then
echo echo
echo "After first boot, login as ${USERNAME} and run:" echo "After first boot, login as ${USERNAME} and run:"
echo " ~/Dotfiles/setup/simple-install.sh" echo " ~/Dotfiles/setup/tui-install.sh"
fi fi
if [[ "$ENCRYPT_DISK" == "YES" ]]; then if [[ "$ENCRYPT_DISK" == "YES" ]]; then
echo echo

View File

@ -56,7 +56,7 @@ fi
gen_counters="" gen_counters=""
for i in "${ACTIVE_IDS[@]}"; do for i in "${ACTIVE_IDS[@]}"; do
id="${M_IDS[$i]}" id="${M_IDS[$i]}"
gen_counters+=" [[ \"\$a\" == *\"${id}\"* ]] && TOTAL=\$(( TOTAL + 1 ))\n" gen_counters+=" [[ \" \$a \" == *\" ${id} \"* ]] && TOTAL=\$(( TOTAL + 1 ))\n"
done done
# -- module-checklist (tui-install.sh and generate-answerfile.sh) ------------- # -- module-checklist (tui-install.sh and generate-answerfile.sh) -------------
@ -99,7 +99,7 @@ gen_checklist_af=$(build_checklist_af)
gen_summary="" gen_summary=""
for i in "${ACTIVE_IDS[@]}"; do for i in "${ACTIVE_IDS[@]}"; do
id="${M_IDS[$i]}" id="${M_IDS[$i]}"
gen_summary+=" [[ \"\$SELECTED_APPS\" == *\"${id}\"* ]] && SUMMARY+=\" ✦ ${id}\\\\n\"\n" gen_summary+=" [[ \" \$SELECTED_APPS \" == *\" ${id} \"* ]] && SUMMARY+=\" ✦ ${id}\\\\n\"\n"
done done
# -- module-conflicts (tui-install.sh: before dispatch) ----------------------- # -- module-conflicts (tui-install.sh: before dispatch) -----------------------
@ -125,7 +125,7 @@ done
gen_dispatch="" gen_dispatch=""
for i in "${ACTIVE_IDS[@]}"; do for i in "${ACTIVE_IDS[@]}"; do
id="${M_IDS[$i]}" id="${M_IDS[$i]}"
gen_dispatch+="[[ \"\$SELECTED_APPS\" == *\"${id}\"* ]] && run_module \"${id}\" \"\$APPS/${id}.sh\"\n" gen_dispatch+="[[ \" \$SELECTED_APPS \" == *\" ${id} \"* ]] && run_module \"${id}\" \"\$APPS/${id}.sh\"\n"
done done
# -- per-category doc tables (docs/md/modules.md) ----------------------------- # -- per-category doc tables (docs/md/modules.md) -----------------------------

View File

@ -174,86 +174,86 @@ count_steps() {
# Glob syntax *"tag"* matches if the space-separated SELECTED_APPS string # Glob syntax *"tag"* matches if the space-separated SELECTED_APPS string
# contains the tag anywhere — works because tags never share substrings. # contains the tag anywhere — works because tags never share substrings.
# BEGIN GENERATED MODULES: module-counters # BEGIN GENERATED MODULES: module-counters
[[ "$a" == *"ollama"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" ollama "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"llama-cpp"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" llama-cpp "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"open-webui"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" open-webui "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"claude"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" claude "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"networking-cli"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" networking-cli "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"disk-recovery"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" disk-recovery "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"himalaya"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" himalaya "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"mail-notmuch"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" mail-notmuch "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"caldav-sync"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" caldav-sync "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"ssh-server"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" ssh-server "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"wireshark"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" wireshark "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"anti-malware"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" anti-malware "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"gnuplot"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" gnuplot "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"blender-povray"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" blender-povray "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"toot"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" toot "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"db-clients"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" db-clients "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"mysql"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" mysql "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"productivity"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" productivity "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"python"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" python "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"k8s"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" k8s "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"docker"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" docker "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"podman"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" podman "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"cockpit"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" cockpit "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"tlp"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" tlp "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"butter"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" butter "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"localsend"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" localsend "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"croc"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" croc "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"opendeck"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" opendeck "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"localtunnel"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" localtunnel "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"timeshift"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" timeshift "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"zfs"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" zfs "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"wprs"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" wprs "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"plymouth"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" plymouth "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"plymouth-custom"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" plymouth-custom "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"steam"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" steam "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"vesktop"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" vesktop "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"spotify"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" spotify "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"prism"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" prism "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"vintagestory"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" vintagestory "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"openarena"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" openarena "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"tetris"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" tetris "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"doom"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" doom "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"sauerbraten"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" sauerbraten "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"stuntrally"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" stuntrally "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"onlyoffice"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" onlyoffice "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"xournal"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" xournal "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"rnote"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" rnote "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"obsidian"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" obsidian "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"tangent-notes"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" tangent-notes "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"ffmpeg"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" ffmpeg "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"sox"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" sox "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"imagemagick"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" imagemagick "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"yt-dlp"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" yt-dlp "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"gimp"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" gimp "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"inkscape"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" inkscape "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"krita"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" krita "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"kdenlive"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" kdenlive "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"openshot"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" openshot "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"shotcut"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" shotcut "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"ardour"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" ardour "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"audacity"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" audacity "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"lmms"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" lmms "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"mixxx"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" mixxx "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"cecilia"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" cecilia "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"chromium"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" chromium "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"firefox-browser"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" firefox-browser "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"zen-browser"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" zen-browser "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"nyxt"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" nyxt "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"librewolf"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" librewolf "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"min-browser"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" min-browser "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"vscodium"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" vscodium "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"zed-ide"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" zed-ide "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"geany"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" geany "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"codeblocks"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" codeblocks "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"kate"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" kate "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"rdp-client"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" rdp-client "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"lamco-rdp-server"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" lamco-rdp-server "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"qemu"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" qemu "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"freeipa-client"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" freeipa-client "* ]] && TOTAL=$(( TOTAL + 1 ))
[[ "$a" == *"freeipa-server"* ]] && TOTAL=$(( TOTAL + 1 )) [[ " $a " == *" freeipa-server "* ]] && TOTAL=$(( TOTAL + 1 ))
# END GENERATED MODULES: module-counters # END GENERATED MODULES: module-counters
} }
@ -571,86 +571,86 @@ if ! $ANSWERFILE_MODE; then
if [[ -n "$SELECTED_APPS" ]]; then if [[ -n "$SELECTED_APPS" ]]; then
SUMMARY+="\n Applications:\n" SUMMARY+="\n Applications:\n"
# BEGIN GENERATED MODULES: module-summary # BEGIN GENERATED MODULES: module-summary
[[ "$SELECTED_APPS" == *"ollama"* ]] && SUMMARY+=" ✦ ollama\n" [[ " $SELECTED_APPS " == *" ollama "* ]] && SUMMARY+=" ✦ ollama\n"
[[ "$SELECTED_APPS" == *"llama-cpp"* ]] && SUMMARY+=" ✦ llama-cpp\n" [[ " $SELECTED_APPS " == *" llama-cpp "* ]] && SUMMARY+=" ✦ llama-cpp\n"
[[ "$SELECTED_APPS" == *"open-webui"* ]] && SUMMARY+=" ✦ open-webui\n" [[ " $SELECTED_APPS " == *" open-webui "* ]] && SUMMARY+=" ✦ open-webui\n"
[[ "$SELECTED_APPS" == *"claude"* ]] && SUMMARY+=" ✦ claude\n" [[ " $SELECTED_APPS " == *" claude "* ]] && SUMMARY+=" ✦ claude\n"
[[ "$SELECTED_APPS" == *"networking-cli"* ]] && SUMMARY+=" ✦ networking-cli\n" [[ " $SELECTED_APPS " == *" networking-cli "* ]] && SUMMARY+=" ✦ networking-cli\n"
[[ "$SELECTED_APPS" == *"disk-recovery"* ]] && SUMMARY+=" ✦ disk-recovery\n" [[ " $SELECTED_APPS " == *" disk-recovery "* ]] && SUMMARY+=" ✦ disk-recovery\n"
[[ "$SELECTED_APPS" == *"himalaya"* ]] && SUMMARY+=" ✦ himalaya\n" [[ " $SELECTED_APPS " == *" himalaya "* ]] && SUMMARY+=" ✦ himalaya\n"
[[ "$SELECTED_APPS" == *"mail-notmuch"* ]] && SUMMARY+=" ✦ mail-notmuch\n" [[ " $SELECTED_APPS " == *" mail-notmuch "* ]] && SUMMARY+=" ✦ mail-notmuch\n"
[[ "$SELECTED_APPS" == *"caldav-sync"* ]] && SUMMARY+=" ✦ caldav-sync\n" [[ " $SELECTED_APPS " == *" caldav-sync "* ]] && SUMMARY+=" ✦ caldav-sync\n"
[[ "$SELECTED_APPS" == *"ssh-server"* ]] && SUMMARY+=" ✦ ssh-server\n" [[ " $SELECTED_APPS " == *" ssh-server "* ]] && SUMMARY+=" ✦ ssh-server\n"
[[ "$SELECTED_APPS" == *"wireshark"* ]] && SUMMARY+=" ✦ wireshark\n" [[ " $SELECTED_APPS " == *" wireshark "* ]] && SUMMARY+=" ✦ wireshark\n"
[[ "$SELECTED_APPS" == *"anti-malware"* ]] && SUMMARY+=" ✦ anti-malware\n" [[ " $SELECTED_APPS " == *" anti-malware "* ]] && SUMMARY+=" ✦ anti-malware\n"
[[ "$SELECTED_APPS" == *"gnuplot"* ]] && SUMMARY+=" ✦ gnuplot\n" [[ " $SELECTED_APPS " == *" gnuplot "* ]] && SUMMARY+=" ✦ gnuplot\n"
[[ "$SELECTED_APPS" == *"blender-povray"* ]] && SUMMARY+=" ✦ blender-povray\n" [[ " $SELECTED_APPS " == *" blender-povray "* ]] && SUMMARY+=" ✦ blender-povray\n"
[[ "$SELECTED_APPS" == *"toot"* ]] && SUMMARY+=" ✦ toot\n" [[ " $SELECTED_APPS " == *" toot "* ]] && SUMMARY+=" ✦ toot\n"
[[ "$SELECTED_APPS" == *"db-clients"* ]] && SUMMARY+=" ✦ db-clients\n" [[ " $SELECTED_APPS " == *" db-clients "* ]] && SUMMARY+=" ✦ db-clients\n"
[[ "$SELECTED_APPS" == *"mysql"* ]] && SUMMARY+=" ✦ mysql\n" [[ " $SELECTED_APPS " == *" mysql "* ]] && SUMMARY+=" ✦ mysql\n"
[[ "$SELECTED_APPS" == *"productivity"* ]] && SUMMARY+=" ✦ productivity\n" [[ " $SELECTED_APPS " == *" productivity "* ]] && SUMMARY+=" ✦ productivity\n"
[[ "$SELECTED_APPS" == *"python"* ]] && SUMMARY+=" ✦ python\n" [[ " $SELECTED_APPS " == *" python "* ]] && SUMMARY+=" ✦ python\n"
[[ "$SELECTED_APPS" == *"k8s"* ]] && SUMMARY+=" ✦ k8s\n" [[ " $SELECTED_APPS " == *" k8s "* ]] && SUMMARY+=" ✦ k8s\n"
[[ "$SELECTED_APPS" == *"docker"* ]] && SUMMARY+=" ✦ docker\n" [[ " $SELECTED_APPS " == *" docker "* ]] && SUMMARY+=" ✦ docker\n"
[[ "$SELECTED_APPS" == *"podman"* ]] && SUMMARY+=" ✦ podman\n" [[ " $SELECTED_APPS " == *" podman "* ]] && SUMMARY+=" ✦ podman\n"
[[ "$SELECTED_APPS" == *"cockpit"* ]] && SUMMARY+=" ✦ cockpit\n" [[ " $SELECTED_APPS " == *" cockpit "* ]] && SUMMARY+=" ✦ cockpit\n"
[[ "$SELECTED_APPS" == *"tlp"* ]] && SUMMARY+=" ✦ tlp\n" [[ " $SELECTED_APPS " == *" tlp "* ]] && SUMMARY+=" ✦ tlp\n"
[[ "$SELECTED_APPS" == *"butter"* ]] && SUMMARY+=" ✦ butter\n" [[ " $SELECTED_APPS " == *" butter "* ]] && SUMMARY+=" ✦ butter\n"
[[ "$SELECTED_APPS" == *"localsend"* ]] && SUMMARY+=" ✦ localsend\n" [[ " $SELECTED_APPS " == *" localsend "* ]] && SUMMARY+=" ✦ localsend\n"
[[ "$SELECTED_APPS" == *"croc"* ]] && SUMMARY+=" ✦ croc\n" [[ " $SELECTED_APPS " == *" croc "* ]] && SUMMARY+=" ✦ croc\n"
[[ "$SELECTED_APPS" == *"opendeck"* ]] && SUMMARY+=" ✦ opendeck\n" [[ " $SELECTED_APPS " == *" opendeck "* ]] && SUMMARY+=" ✦ opendeck\n"
[[ "$SELECTED_APPS" == *"localtunnel"* ]] && SUMMARY+=" ✦ localtunnel\n" [[ " $SELECTED_APPS " == *" localtunnel "* ]] && SUMMARY+=" ✦ localtunnel\n"
[[ "$SELECTED_APPS" == *"timeshift"* ]] && SUMMARY+=" ✦ timeshift\n" [[ " $SELECTED_APPS " == *" timeshift "* ]] && SUMMARY+=" ✦ timeshift\n"
[[ "$SELECTED_APPS" == *"zfs"* ]] && SUMMARY+=" ✦ zfs\n" [[ " $SELECTED_APPS " == *" zfs "* ]] && SUMMARY+=" ✦ zfs\n"
[[ "$SELECTED_APPS" == *"wprs"* ]] && SUMMARY+=" ✦ wprs\n" [[ " $SELECTED_APPS " == *" wprs "* ]] && SUMMARY+=" ✦ wprs\n"
[[ "$SELECTED_APPS" == *"plymouth"* ]] && SUMMARY+=" ✦ plymouth\n" [[ " $SELECTED_APPS " == *" plymouth "* ]] && SUMMARY+=" ✦ plymouth\n"
[[ "$SELECTED_APPS" == *"plymouth-custom"* ]] && SUMMARY+=" ✦ plymouth-custom\n" [[ " $SELECTED_APPS " == *" plymouth-custom "* ]] && SUMMARY+=" ✦ plymouth-custom\n"
[[ "$SELECTED_APPS" == *"steam"* ]] && SUMMARY+=" ✦ steam\n" [[ " $SELECTED_APPS " == *" steam "* ]] && SUMMARY+=" ✦ steam\n"
[[ "$SELECTED_APPS" == *"vesktop"* ]] && SUMMARY+=" ✦ vesktop\n" [[ " $SELECTED_APPS " == *" vesktop "* ]] && SUMMARY+=" ✦ vesktop\n"
[[ "$SELECTED_APPS" == *"spotify"* ]] && SUMMARY+=" ✦ spotify\n" [[ " $SELECTED_APPS " == *" spotify "* ]] && SUMMARY+=" ✦ spotify\n"
[[ "$SELECTED_APPS" == *"prism"* ]] && SUMMARY+=" ✦ prism\n" [[ " $SELECTED_APPS " == *" prism "* ]] && SUMMARY+=" ✦ prism\n"
[[ "$SELECTED_APPS" == *"vintagestory"* ]] && SUMMARY+=" ✦ vintagestory\n" [[ " $SELECTED_APPS " == *" vintagestory "* ]] && SUMMARY+=" ✦ vintagestory\n"
[[ "$SELECTED_APPS" == *"openarena"* ]] && SUMMARY+=" ✦ openarena\n" [[ " $SELECTED_APPS " == *" openarena "* ]] && SUMMARY+=" ✦ openarena\n"
[[ "$SELECTED_APPS" == *"tetris"* ]] && SUMMARY+=" ✦ tetris\n" [[ " $SELECTED_APPS " == *" tetris "* ]] && SUMMARY+=" ✦ tetris\n"
[[ "$SELECTED_APPS" == *"doom"* ]] && SUMMARY+=" ✦ doom\n" [[ " $SELECTED_APPS " == *" doom "* ]] && SUMMARY+=" ✦ doom\n"
[[ "$SELECTED_APPS" == *"sauerbraten"* ]] && SUMMARY+=" ✦ sauerbraten\n" [[ " $SELECTED_APPS " == *" sauerbraten "* ]] && SUMMARY+=" ✦ sauerbraten\n"
[[ "$SELECTED_APPS" == *"stuntrally"* ]] && SUMMARY+=" ✦ stuntrally\n" [[ " $SELECTED_APPS " == *" stuntrally "* ]] && SUMMARY+=" ✦ stuntrally\n"
[[ "$SELECTED_APPS" == *"onlyoffice"* ]] && SUMMARY+=" ✦ onlyoffice\n" [[ " $SELECTED_APPS " == *" onlyoffice "* ]] && SUMMARY+=" ✦ onlyoffice\n"
[[ "$SELECTED_APPS" == *"xournal"* ]] && SUMMARY+=" ✦ xournal\n" [[ " $SELECTED_APPS " == *" xournal "* ]] && SUMMARY+=" ✦ xournal\n"
[[ "$SELECTED_APPS" == *"rnote"* ]] && SUMMARY+=" ✦ rnote\n" [[ " $SELECTED_APPS " == *" rnote "* ]] && SUMMARY+=" ✦ rnote\n"
[[ "$SELECTED_APPS" == *"obsidian"* ]] && SUMMARY+=" ✦ obsidian\n" [[ " $SELECTED_APPS " == *" obsidian "* ]] && SUMMARY+=" ✦ obsidian\n"
[[ "$SELECTED_APPS" == *"tangent-notes"* ]] && SUMMARY+=" ✦ tangent-notes\n" [[ " $SELECTED_APPS " == *" tangent-notes "* ]] && SUMMARY+=" ✦ tangent-notes\n"
[[ "$SELECTED_APPS" == *"ffmpeg"* ]] && SUMMARY+=" ✦ ffmpeg\n" [[ " $SELECTED_APPS " == *" ffmpeg "* ]] && SUMMARY+=" ✦ ffmpeg\n"
[[ "$SELECTED_APPS" == *"sox"* ]] && SUMMARY+=" ✦ sox\n" [[ " $SELECTED_APPS " == *" sox "* ]] && SUMMARY+=" ✦ sox\n"
[[ "$SELECTED_APPS" == *"imagemagick"* ]] && SUMMARY+=" ✦ imagemagick\n" [[ " $SELECTED_APPS " == *" imagemagick "* ]] && SUMMARY+=" ✦ imagemagick\n"
[[ "$SELECTED_APPS" == *"yt-dlp"* ]] && SUMMARY+=" ✦ yt-dlp\n" [[ " $SELECTED_APPS " == *" yt-dlp "* ]] && SUMMARY+=" ✦ yt-dlp\n"
[[ "$SELECTED_APPS" == *"gimp"* ]] && SUMMARY+=" ✦ gimp\n" [[ " $SELECTED_APPS " == *" gimp "* ]] && SUMMARY+=" ✦ gimp\n"
[[ "$SELECTED_APPS" == *"inkscape"* ]] && SUMMARY+=" ✦ inkscape\n" [[ " $SELECTED_APPS " == *" inkscape "* ]] && SUMMARY+=" ✦ inkscape\n"
[[ "$SELECTED_APPS" == *"krita"* ]] && SUMMARY+=" ✦ krita\n" [[ " $SELECTED_APPS " == *" krita "* ]] && SUMMARY+=" ✦ krita\n"
[[ "$SELECTED_APPS" == *"kdenlive"* ]] && SUMMARY+=" ✦ kdenlive\n" [[ " $SELECTED_APPS " == *" kdenlive "* ]] && SUMMARY+=" ✦ kdenlive\n"
[[ "$SELECTED_APPS" == *"openshot"* ]] && SUMMARY+=" ✦ openshot\n" [[ " $SELECTED_APPS " == *" openshot "* ]] && SUMMARY+=" ✦ openshot\n"
[[ "$SELECTED_APPS" == *"shotcut"* ]] && SUMMARY+=" ✦ shotcut\n" [[ " $SELECTED_APPS " == *" shotcut "* ]] && SUMMARY+=" ✦ shotcut\n"
[[ "$SELECTED_APPS" == *"ardour"* ]] && SUMMARY+=" ✦ ardour\n" [[ " $SELECTED_APPS " == *" ardour "* ]] && SUMMARY+=" ✦ ardour\n"
[[ "$SELECTED_APPS" == *"audacity"* ]] && SUMMARY+=" ✦ audacity\n" [[ " $SELECTED_APPS " == *" audacity "* ]] && SUMMARY+=" ✦ audacity\n"
[[ "$SELECTED_APPS" == *"lmms"* ]] && SUMMARY+=" ✦ lmms\n" [[ " $SELECTED_APPS " == *" lmms "* ]] && SUMMARY+=" ✦ lmms\n"
[[ "$SELECTED_APPS" == *"mixxx"* ]] && SUMMARY+=" ✦ mixxx\n" [[ " $SELECTED_APPS " == *" mixxx "* ]] && SUMMARY+=" ✦ mixxx\n"
[[ "$SELECTED_APPS" == *"cecilia"* ]] && SUMMARY+=" ✦ cecilia\n" [[ " $SELECTED_APPS " == *" cecilia "* ]] && SUMMARY+=" ✦ cecilia\n"
[[ "$SELECTED_APPS" == *"chromium"* ]] && SUMMARY+=" ✦ chromium\n" [[ " $SELECTED_APPS " == *" chromium "* ]] && SUMMARY+=" ✦ chromium\n"
[[ "$SELECTED_APPS" == *"firefox-browser"* ]] && SUMMARY+=" ✦ firefox-browser\n" [[ " $SELECTED_APPS " == *" firefox-browser "* ]] && SUMMARY+=" ✦ firefox-browser\n"
[[ "$SELECTED_APPS" == *"zen-browser"* ]] && SUMMARY+=" ✦ zen-browser\n" [[ " $SELECTED_APPS " == *" zen-browser "* ]] && SUMMARY+=" ✦ zen-browser\n"
[[ "$SELECTED_APPS" == *"nyxt"* ]] && SUMMARY+=" ✦ nyxt\n" [[ " $SELECTED_APPS " == *" nyxt "* ]] && SUMMARY+=" ✦ nyxt\n"
[[ "$SELECTED_APPS" == *"librewolf"* ]] && SUMMARY+=" ✦ librewolf\n" [[ " $SELECTED_APPS " == *" librewolf "* ]] && SUMMARY+=" ✦ librewolf\n"
[[ "$SELECTED_APPS" == *"min-browser"* ]] && SUMMARY+=" ✦ min-browser\n" [[ " $SELECTED_APPS " == *" min-browser "* ]] && SUMMARY+=" ✦ min-browser\n"
[[ "$SELECTED_APPS" == *"vscodium"* ]] && SUMMARY+=" ✦ vscodium\n" [[ " $SELECTED_APPS " == *" vscodium "* ]] && SUMMARY+=" ✦ vscodium\n"
[[ "$SELECTED_APPS" == *"zed-ide"* ]] && SUMMARY+=" ✦ zed-ide\n" [[ " $SELECTED_APPS " == *" zed-ide "* ]] && SUMMARY+=" ✦ zed-ide\n"
[[ "$SELECTED_APPS" == *"geany"* ]] && SUMMARY+=" ✦ geany\n" [[ " $SELECTED_APPS " == *" geany "* ]] && SUMMARY+=" ✦ geany\n"
[[ "$SELECTED_APPS" == *"codeblocks"* ]] && SUMMARY+=" ✦ codeblocks\n" [[ " $SELECTED_APPS " == *" codeblocks "* ]] && SUMMARY+=" ✦ codeblocks\n"
[[ "$SELECTED_APPS" == *"kate"* ]] && SUMMARY+=" ✦ kate\n" [[ " $SELECTED_APPS " == *" kate "* ]] && SUMMARY+=" ✦ kate\n"
[[ "$SELECTED_APPS" == *"rdp-client"* ]] && SUMMARY+=" ✦ rdp-client\n" [[ " $SELECTED_APPS " == *" rdp-client "* ]] && SUMMARY+=" ✦ rdp-client\n"
[[ "$SELECTED_APPS" == *"lamco-rdp-server"* ]] && SUMMARY+=" ✦ lamco-rdp-server\n" [[ " $SELECTED_APPS " == *" lamco-rdp-server "* ]] && SUMMARY+=" ✦ lamco-rdp-server\n"
[[ "$SELECTED_APPS" == *"qemu"* ]] && SUMMARY+=" ✦ qemu\n" [[ " $SELECTED_APPS " == *" qemu "* ]] && SUMMARY+=" ✦ qemu\n"
[[ "$SELECTED_APPS" == *"freeipa-client"* ]] && SUMMARY+=" ✦ freeipa-client\n" [[ " $SELECTED_APPS " == *" freeipa-client "* ]] && SUMMARY+=" ✦ freeipa-client\n"
[[ "$SELECTED_APPS" == *"freeipa-server"* ]] && SUMMARY+=" ✦ freeipa-server\n" [[ " $SELECTED_APPS " == *" freeipa-server "* ]] && SUMMARY+=" ✦ freeipa-server\n"
# END GENERATED MODULES: module-summary # END GENERATED MODULES: module-summary
fi fi
@ -711,86 +711,86 @@ if [[ " $SELECTED_APPS " == *" plymouth-custom "* && " $SELECTED_APPS " == *" pl
fi fi
# END GENERATED MODULES: module-conflicts # END GENERATED MODULES: module-conflicts
# BEGIN GENERATED MODULES: module-dispatch # BEGIN GENERATED MODULES: module-dispatch
[[ "$SELECTED_APPS" == *"ollama"* ]] && run_module "ollama" "$APPS/ollama.sh" [[ " $SELECTED_APPS " == *" ollama "* ]] && run_module "ollama" "$APPS/ollama.sh"
[[ "$SELECTED_APPS" == *"llama-cpp"* ]] && run_module "llama-cpp" "$APPS/llama-cpp.sh" [[ " $SELECTED_APPS " == *" llama-cpp "* ]] && run_module "llama-cpp" "$APPS/llama-cpp.sh"
[[ "$SELECTED_APPS" == *"open-webui"* ]] && run_module "open-webui" "$APPS/open-webui.sh" [[ " $SELECTED_APPS " == *" open-webui "* ]] && run_module "open-webui" "$APPS/open-webui.sh"
[[ "$SELECTED_APPS" == *"claude"* ]] && run_module "claude" "$APPS/claude.sh" [[ " $SELECTED_APPS " == *" claude "* ]] && run_module "claude" "$APPS/claude.sh"
[[ "$SELECTED_APPS" == *"networking-cli"* ]] && run_module "networking-cli" "$APPS/networking-cli.sh" [[ " $SELECTED_APPS " == *" networking-cli "* ]] && run_module "networking-cli" "$APPS/networking-cli.sh"
[[ "$SELECTED_APPS" == *"disk-recovery"* ]] && run_module "disk-recovery" "$APPS/disk-recovery.sh" [[ " $SELECTED_APPS " == *" disk-recovery "* ]] && run_module "disk-recovery" "$APPS/disk-recovery.sh"
[[ "$SELECTED_APPS" == *"himalaya"* ]] && run_module "himalaya" "$APPS/himalaya.sh" [[ " $SELECTED_APPS " == *" himalaya "* ]] && run_module "himalaya" "$APPS/himalaya.sh"
[[ "$SELECTED_APPS" == *"mail-notmuch"* ]] && run_module "mail-notmuch" "$APPS/mail-notmuch.sh" [[ " $SELECTED_APPS " == *" mail-notmuch "* ]] && run_module "mail-notmuch" "$APPS/mail-notmuch.sh"
[[ "$SELECTED_APPS" == *"caldav-sync"* ]] && run_module "caldav-sync" "$APPS/caldav-sync.sh" [[ " $SELECTED_APPS " == *" caldav-sync "* ]] && run_module "caldav-sync" "$APPS/caldav-sync.sh"
[[ "$SELECTED_APPS" == *"ssh-server"* ]] && run_module "ssh-server" "$APPS/ssh-server.sh" [[ " $SELECTED_APPS " == *" ssh-server "* ]] && run_module "ssh-server" "$APPS/ssh-server.sh"
[[ "$SELECTED_APPS" == *"wireshark"* ]] && run_module "wireshark" "$APPS/wireshark.sh" [[ " $SELECTED_APPS " == *" wireshark "* ]] && run_module "wireshark" "$APPS/wireshark.sh"
[[ "$SELECTED_APPS" == *"anti-malware"* ]] && run_module "anti-malware" "$APPS/anti-malware.sh" [[ " $SELECTED_APPS " == *" anti-malware "* ]] && run_module "anti-malware" "$APPS/anti-malware.sh"
[[ "$SELECTED_APPS" == *"gnuplot"* ]] && run_module "gnuplot" "$APPS/gnuplot.sh" [[ " $SELECTED_APPS " == *" gnuplot "* ]] && run_module "gnuplot" "$APPS/gnuplot.sh"
[[ "$SELECTED_APPS" == *"blender-povray"* ]] && run_module "blender-povray" "$APPS/blender-povray.sh" [[ " $SELECTED_APPS " == *" blender-povray "* ]] && run_module "blender-povray" "$APPS/blender-povray.sh"
[[ "$SELECTED_APPS" == *"toot"* ]] && run_module "toot" "$APPS/toot.sh" [[ " $SELECTED_APPS " == *" toot "* ]] && run_module "toot" "$APPS/toot.sh"
[[ "$SELECTED_APPS" == *"db-clients"* ]] && run_module "db-clients" "$APPS/db-clients.sh" [[ " $SELECTED_APPS " == *" db-clients "* ]] && run_module "db-clients" "$APPS/db-clients.sh"
[[ "$SELECTED_APPS" == *"mysql"* ]] && run_module "mysql" "$APPS/mysql.sh" [[ " $SELECTED_APPS " == *" mysql "* ]] && run_module "mysql" "$APPS/mysql.sh"
[[ "$SELECTED_APPS" == *"productivity"* ]] && run_module "productivity" "$APPS/productivity.sh" [[ " $SELECTED_APPS " == *" productivity "* ]] && run_module "productivity" "$APPS/productivity.sh"
[[ "$SELECTED_APPS" == *"python"* ]] && run_module "python" "$APPS/python.sh" [[ " $SELECTED_APPS " == *" python "* ]] && run_module "python" "$APPS/python.sh"
[[ "$SELECTED_APPS" == *"k8s"* ]] && run_module "k8s" "$APPS/k8s.sh" [[ " $SELECTED_APPS " == *" k8s "* ]] && run_module "k8s" "$APPS/k8s.sh"
[[ "$SELECTED_APPS" == *"docker"* ]] && run_module "docker" "$APPS/docker.sh" [[ " $SELECTED_APPS " == *" docker "* ]] && run_module "docker" "$APPS/docker.sh"
[[ "$SELECTED_APPS" == *"podman"* ]] && run_module "podman" "$APPS/podman.sh" [[ " $SELECTED_APPS " == *" podman "* ]] && run_module "podman" "$APPS/podman.sh"
[[ "$SELECTED_APPS" == *"cockpit"* ]] && run_module "cockpit" "$APPS/cockpit.sh" [[ " $SELECTED_APPS " == *" cockpit "* ]] && run_module "cockpit" "$APPS/cockpit.sh"
[[ "$SELECTED_APPS" == *"tlp"* ]] && run_module "tlp" "$APPS/tlp.sh" [[ " $SELECTED_APPS " == *" tlp "* ]] && run_module "tlp" "$APPS/tlp.sh"
[[ "$SELECTED_APPS" == *"butter"* ]] && run_module "butter" "$APPS/butter.sh" [[ " $SELECTED_APPS " == *" butter "* ]] && run_module "butter" "$APPS/butter.sh"
[[ "$SELECTED_APPS" == *"localsend"* ]] && run_module "localsend" "$APPS/localsend.sh" [[ " $SELECTED_APPS " == *" localsend "* ]] && run_module "localsend" "$APPS/localsend.sh"
[[ "$SELECTED_APPS" == *"croc"* ]] && run_module "croc" "$APPS/croc.sh" [[ " $SELECTED_APPS " == *" croc "* ]] && run_module "croc" "$APPS/croc.sh"
[[ "$SELECTED_APPS" == *"opendeck"* ]] && run_module "opendeck" "$APPS/opendeck.sh" [[ " $SELECTED_APPS " == *" opendeck "* ]] && run_module "opendeck" "$APPS/opendeck.sh"
[[ "$SELECTED_APPS" == *"localtunnel"* ]] && run_module "localtunnel" "$APPS/localtunnel.sh" [[ " $SELECTED_APPS " == *" localtunnel "* ]] && run_module "localtunnel" "$APPS/localtunnel.sh"
[[ "$SELECTED_APPS" == *"timeshift"* ]] && run_module "timeshift" "$APPS/timeshift.sh" [[ " $SELECTED_APPS " == *" timeshift "* ]] && run_module "timeshift" "$APPS/timeshift.sh"
[[ "$SELECTED_APPS" == *"zfs"* ]] && run_module "zfs" "$APPS/zfs.sh" [[ " $SELECTED_APPS " == *" zfs "* ]] && run_module "zfs" "$APPS/zfs.sh"
[[ "$SELECTED_APPS" == *"wprs"* ]] && run_module "wprs" "$APPS/wprs.sh" [[ " $SELECTED_APPS " == *" wprs "* ]] && run_module "wprs" "$APPS/wprs.sh"
[[ "$SELECTED_APPS" == *"plymouth"* ]] && run_module "plymouth" "$APPS/plymouth.sh" [[ " $SELECTED_APPS " == *" plymouth "* ]] && run_module "plymouth" "$APPS/plymouth.sh"
[[ "$SELECTED_APPS" == *"plymouth-custom"* ]] && run_module "plymouth-custom" "$APPS/plymouth-custom.sh" [[ " $SELECTED_APPS " == *" plymouth-custom "* ]] && run_module "plymouth-custom" "$APPS/plymouth-custom.sh"
[[ "$SELECTED_APPS" == *"steam"* ]] && run_module "steam" "$APPS/steam.sh" [[ " $SELECTED_APPS " == *" steam "* ]] && run_module "steam" "$APPS/steam.sh"
[[ "$SELECTED_APPS" == *"vesktop"* ]] && run_module "vesktop" "$APPS/vesktop.sh" [[ " $SELECTED_APPS " == *" vesktop "* ]] && run_module "vesktop" "$APPS/vesktop.sh"
[[ "$SELECTED_APPS" == *"spotify"* ]] && run_module "spotify" "$APPS/spotify.sh" [[ " $SELECTED_APPS " == *" spotify "* ]] && run_module "spotify" "$APPS/spotify.sh"
[[ "$SELECTED_APPS" == *"prism"* ]] && run_module "prism" "$APPS/prism.sh" [[ " $SELECTED_APPS " == *" prism "* ]] && run_module "prism" "$APPS/prism.sh"
[[ "$SELECTED_APPS" == *"vintagestory"* ]] && run_module "vintagestory" "$APPS/vintagestory.sh" [[ " $SELECTED_APPS " == *" vintagestory "* ]] && run_module "vintagestory" "$APPS/vintagestory.sh"
[[ "$SELECTED_APPS" == *"openarena"* ]] && run_module "openarena" "$APPS/openarena.sh" [[ " $SELECTED_APPS " == *" openarena "* ]] && run_module "openarena" "$APPS/openarena.sh"
[[ "$SELECTED_APPS" == *"tetris"* ]] && run_module "tetris" "$APPS/tetris.sh" [[ " $SELECTED_APPS " == *" tetris "* ]] && run_module "tetris" "$APPS/tetris.sh"
[[ "$SELECTED_APPS" == *"doom"* ]] && run_module "doom" "$APPS/doom.sh" [[ " $SELECTED_APPS " == *" doom "* ]] && run_module "doom" "$APPS/doom.sh"
[[ "$SELECTED_APPS" == *"sauerbraten"* ]] && run_module "sauerbraten" "$APPS/sauerbraten.sh" [[ " $SELECTED_APPS " == *" sauerbraten "* ]] && run_module "sauerbraten" "$APPS/sauerbraten.sh"
[[ "$SELECTED_APPS" == *"stuntrally"* ]] && run_module "stuntrally" "$APPS/stuntrally.sh" [[ " $SELECTED_APPS " == *" stuntrally "* ]] && run_module "stuntrally" "$APPS/stuntrally.sh"
[[ "$SELECTED_APPS" == *"onlyoffice"* ]] && run_module "onlyoffice" "$APPS/onlyoffice.sh" [[ " $SELECTED_APPS " == *" onlyoffice "* ]] && run_module "onlyoffice" "$APPS/onlyoffice.sh"
[[ "$SELECTED_APPS" == *"xournal"* ]] && run_module "xournal" "$APPS/xournal.sh" [[ " $SELECTED_APPS " == *" xournal "* ]] && run_module "xournal" "$APPS/xournal.sh"
[[ "$SELECTED_APPS" == *"rnote"* ]] && run_module "rnote" "$APPS/rnote.sh" [[ " $SELECTED_APPS " == *" rnote "* ]] && run_module "rnote" "$APPS/rnote.sh"
[[ "$SELECTED_APPS" == *"obsidian"* ]] && run_module "obsidian" "$APPS/obsidian.sh" [[ " $SELECTED_APPS " == *" obsidian "* ]] && run_module "obsidian" "$APPS/obsidian.sh"
[[ "$SELECTED_APPS" == *"tangent-notes"* ]] && run_module "tangent-notes" "$APPS/tangent-notes.sh" [[ " $SELECTED_APPS " == *" tangent-notes "* ]] && run_module "tangent-notes" "$APPS/tangent-notes.sh"
[[ "$SELECTED_APPS" == *"ffmpeg"* ]] && run_module "ffmpeg" "$APPS/ffmpeg.sh" [[ " $SELECTED_APPS " == *" ffmpeg "* ]] && run_module "ffmpeg" "$APPS/ffmpeg.sh"
[[ "$SELECTED_APPS" == *"sox"* ]] && run_module "sox" "$APPS/sox.sh" [[ " $SELECTED_APPS " == *" sox "* ]] && run_module "sox" "$APPS/sox.sh"
[[ "$SELECTED_APPS" == *"imagemagick"* ]] && run_module "imagemagick" "$APPS/imagemagick.sh" [[ " $SELECTED_APPS " == *" imagemagick "* ]] && run_module "imagemagick" "$APPS/imagemagick.sh"
[[ "$SELECTED_APPS" == *"yt-dlp"* ]] && run_module "yt-dlp" "$APPS/yt-dlp.sh" [[ " $SELECTED_APPS " == *" yt-dlp "* ]] && run_module "yt-dlp" "$APPS/yt-dlp.sh"
[[ "$SELECTED_APPS" == *"gimp"* ]] && run_module "gimp" "$APPS/gimp.sh" [[ " $SELECTED_APPS " == *" gimp "* ]] && run_module "gimp" "$APPS/gimp.sh"
[[ "$SELECTED_APPS" == *"inkscape"* ]] && run_module "inkscape" "$APPS/inkscape.sh" [[ " $SELECTED_APPS " == *" inkscape "* ]] && run_module "inkscape" "$APPS/inkscape.sh"
[[ "$SELECTED_APPS" == *"krita"* ]] && run_module "krita" "$APPS/krita.sh" [[ " $SELECTED_APPS " == *" krita "* ]] && run_module "krita" "$APPS/krita.sh"
[[ "$SELECTED_APPS" == *"kdenlive"* ]] && run_module "kdenlive" "$APPS/kdenlive.sh" [[ " $SELECTED_APPS " == *" kdenlive "* ]] && run_module "kdenlive" "$APPS/kdenlive.sh"
[[ "$SELECTED_APPS" == *"openshot"* ]] && run_module "openshot" "$APPS/openshot.sh" [[ " $SELECTED_APPS " == *" openshot "* ]] && run_module "openshot" "$APPS/openshot.sh"
[[ "$SELECTED_APPS" == *"shotcut"* ]] && run_module "shotcut" "$APPS/shotcut.sh" [[ " $SELECTED_APPS " == *" shotcut "* ]] && run_module "shotcut" "$APPS/shotcut.sh"
[[ "$SELECTED_APPS" == *"ardour"* ]] && run_module "ardour" "$APPS/ardour.sh" [[ " $SELECTED_APPS " == *" ardour "* ]] && run_module "ardour" "$APPS/ardour.sh"
[[ "$SELECTED_APPS" == *"audacity"* ]] && run_module "audacity" "$APPS/audacity.sh" [[ " $SELECTED_APPS " == *" audacity "* ]] && run_module "audacity" "$APPS/audacity.sh"
[[ "$SELECTED_APPS" == *"lmms"* ]] && run_module "lmms" "$APPS/lmms.sh" [[ " $SELECTED_APPS " == *" lmms "* ]] && run_module "lmms" "$APPS/lmms.sh"
[[ "$SELECTED_APPS" == *"mixxx"* ]] && run_module "mixxx" "$APPS/mixxx.sh" [[ " $SELECTED_APPS " == *" mixxx "* ]] && run_module "mixxx" "$APPS/mixxx.sh"
[[ "$SELECTED_APPS" == *"cecilia"* ]] && run_module "cecilia" "$APPS/cecilia.sh" [[ " $SELECTED_APPS " == *" cecilia "* ]] && run_module "cecilia" "$APPS/cecilia.sh"
[[ "$SELECTED_APPS" == *"chromium"* ]] && run_module "chromium" "$APPS/chromium.sh" [[ " $SELECTED_APPS " == *" chromium "* ]] && run_module "chromium" "$APPS/chromium.sh"
[[ "$SELECTED_APPS" == *"firefox-browser"* ]] && run_module "firefox-browser" "$APPS/firefox-browser.sh" [[ " $SELECTED_APPS " == *" firefox-browser "* ]] && run_module "firefox-browser" "$APPS/firefox-browser.sh"
[[ "$SELECTED_APPS" == *"zen-browser"* ]] && run_module "zen-browser" "$APPS/zen-browser.sh" [[ " $SELECTED_APPS " == *" zen-browser "* ]] && run_module "zen-browser" "$APPS/zen-browser.sh"
[[ "$SELECTED_APPS" == *"nyxt"* ]] && run_module "nyxt" "$APPS/nyxt.sh" [[ " $SELECTED_APPS " == *" nyxt "* ]] && run_module "nyxt" "$APPS/nyxt.sh"
[[ "$SELECTED_APPS" == *"librewolf"* ]] && run_module "librewolf" "$APPS/librewolf.sh" [[ " $SELECTED_APPS " == *" librewolf "* ]] && run_module "librewolf" "$APPS/librewolf.sh"
[[ "$SELECTED_APPS" == *"min-browser"* ]] && run_module "min-browser" "$APPS/min-browser.sh" [[ " $SELECTED_APPS " == *" min-browser "* ]] && run_module "min-browser" "$APPS/min-browser.sh"
[[ "$SELECTED_APPS" == *"vscodium"* ]] && run_module "vscodium" "$APPS/vscodium.sh" [[ " $SELECTED_APPS " == *" vscodium "* ]] && run_module "vscodium" "$APPS/vscodium.sh"
[[ "$SELECTED_APPS" == *"zed-ide"* ]] && run_module "zed-ide" "$APPS/zed-ide.sh" [[ " $SELECTED_APPS " == *" zed-ide "* ]] && run_module "zed-ide" "$APPS/zed-ide.sh"
[[ "$SELECTED_APPS" == *"geany"* ]] && run_module "geany" "$APPS/geany.sh" [[ " $SELECTED_APPS " == *" geany "* ]] && run_module "geany" "$APPS/geany.sh"
[[ "$SELECTED_APPS" == *"codeblocks"* ]] && run_module "codeblocks" "$APPS/codeblocks.sh" [[ " $SELECTED_APPS " == *" codeblocks "* ]] && run_module "codeblocks" "$APPS/codeblocks.sh"
[[ "$SELECTED_APPS" == *"kate"* ]] && run_module "kate" "$APPS/kate.sh" [[ " $SELECTED_APPS " == *" kate "* ]] && run_module "kate" "$APPS/kate.sh"
[[ "$SELECTED_APPS" == *"rdp-client"* ]] && run_module "rdp-client" "$APPS/rdp-client.sh" [[ " $SELECTED_APPS " == *" rdp-client "* ]] && run_module "rdp-client" "$APPS/rdp-client.sh"
[[ "$SELECTED_APPS" == *"lamco-rdp-server"* ]] && run_module "lamco-rdp-server" "$APPS/lamco-rdp-server.sh" [[ " $SELECTED_APPS " == *" lamco-rdp-server "* ]] && run_module "lamco-rdp-server" "$APPS/lamco-rdp-server.sh"
[[ "$SELECTED_APPS" == *"qemu"* ]] && run_module "qemu" "$APPS/qemu.sh" [[ " $SELECTED_APPS " == *" qemu "* ]] && run_module "qemu" "$APPS/qemu.sh"
[[ "$SELECTED_APPS" == *"freeipa-client"* ]] && run_module "freeipa-client" "$APPS/freeipa-client.sh" [[ " $SELECTED_APPS " == *" freeipa-client "* ]] && run_module "freeipa-client" "$APPS/freeipa-client.sh"
[[ "$SELECTED_APPS" == *"freeipa-server"* ]] && run_module "freeipa-server" "$APPS/freeipa-server.sh" [[ " $SELECTED_APPS " == *" freeipa-server "* ]] && run_module "freeipa-server" "$APPS/freeipa-server.sh"
# END GENERATED MODULES: module-dispatch # END GENERATED MODULES: module-dispatch
# ── Colorway (final step) ───────────────────────────────────────────────────── # ── Colorway (final step) ─────────────────────────────────────────────────────