fix(installer): repair broken package lists and make user-timer setup non-fatal

The core, hyprlua and hyprland package installs used backslash-continued
`pacman` commands with inline `#` comments. Bash treats the first inline
comment as the end of the command, so pacman ran with only the packages
before it and every later name (7zip, cronie, nwg-dock-hyprland, …) was
executed as a shell command — failing under `set -e`. Move all three lists
into arrays, where per-item comments are valid, and install with `--`.

Also:
- himalaya: install the official `himalaya` package (AUR `himalaya-bin` is gone).
- mail-notmuch / caldav-sync: make the systemd *user* timer setup and the
  initial sync best-effort. A bare TTY/chroot install has no user session bus
  (and ~/.config may not be writable yet), so `systemctl --user` and the mkdir
  could abort the module; warn and continue instead.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
main
Amir Alexander Abdelbaki 2026-06-26 18:20:21 +02:00
parent cb88b315a9
commit 2c05c4e274
6 changed files with 357 additions and 296 deletions

View File

@ -57,83 +57,92 @@ sudo pacman -Syu --noconfirm --needed flatpak
# 2. Install required packages # 2. Install required packages
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
log "Installing required packages..." log "Installing required packages..."
sudo pacman -Syu --noconfirm --needed \ # Packages live in an array so each can carry an inline comment. A single
hyprland hyprcursor wl-clipboard hyprpaper hyprlock wofi kitty dunst \ # backslash-continued `pacman` command cannot: bash treats the first inline
# hyprland — the Wayland compositor / window manager # comment as the end of the command, silently dropping every later package
# hyprcursor — hardware-accelerated cursor rendering for Hyprland # (which then get run as shell commands and abort under `set -e`).
# wl-clipboard — wl-copy / wl-paste; clipboard tools for Wayland HYPRLAND_PACKAGES=(
# hyprpaper — wallpaper utility with per-monitor and animation support hyprland # the Wayland compositor / window manager
# hyprlock — GPU-accelerated screen locker (Hyprland-native) hyprcursor # hardware-accelerated cursor rendering for Hyprland
# wofi — Wayland application launcher (rofi replacement) wl-clipboard # wl-copy / wl-paste; clipboard tools for Wayland
# kitty — GPU-accelerated terminal (default terminal in this setup) hyprpaper # wallpaper utility with per-monitor and animation support
# dunst — lightweight, scriptable notification daemon hyprlock # GPU-accelerated screen locker (Hyprland-native)
nwg-dock-hyprland nwg-drawer nwg-menu nwg-look \ wofi # Wayland application launcher (rofi replacement)
# nwg-dock-hyprland — dock/taskbar with Hyprland workspace awareness kitty # GPU-accelerated terminal (default terminal in this setup)
# nwg-drawer — application drawer (grid-style launcher) dunst # lightweight, scriptable notification daemon
# nwg-menu — GTK menu used in the panel's app button
# nwg-look — GTK/cursor/icon theme picker for wlroots sessions nwg-dock-hyprland # dock/taskbar with Hyprland workspace awareness
python cmake meson cpio pkgconf ruby-pkg-config \ nwg-drawer # application drawer (grid-style launcher)
nwg-menu # GTK menu used in the panel's app button
nwg-look # GTK/cursor/icon theme picker for wlroots sessions
# Build tools needed to compile EWW (Rust) and AUR packages (C/C++/Ruby) # Build tools needed to compile EWW (Rust) and AUR packages (C/C++/Ruby)
hyprsunset hypridle ksshaskpass \ python cmake meson cpio pkgconf ruby-pkg-config
# hyprsunset — blue-light filter / night-mode daemon for Hyprland
# hypridle — idle daemon that triggers lock/suspend after inactivity hyprsunset # blue-light filter / night-mode daemon for Hyprland
# ksshaskpass — Qt SSH passphrase dialog (registered as ssh-askpass) hypridle # idle daemon that triggers lock/suspend after inactivity
nm-connection-editor network-manager-applet blueman bluez \ ksshaskpass # Qt SSH passphrase dialog (registered as ssh-askpass)
# nm-connection-editor — GTK GUI for editing NetworkManager profiles
# network-manager-applet — system-tray applet showing Wi-Fi/VPN status nm-connection-editor # GTK GUI for editing NetworkManager profiles
# blueman — GTK Bluetooth manager with tray icon network-manager-applet # system-tray applet showing Wi-Fi/VPN status
# bluez — core Linux Bluetooth protocol stack blueman # GTK Bluetooth manager with tray icon
pipewire alsa-utils firefox greetd-tuigreet \ bluez # core Linux Bluetooth protocol stack
# pipewire — modern audio/video routing daemon
# alsa-utils — ALSA CLI tools (amixer, aplay) for low-level audio pipewire # modern audio/video routing daemon
# firefox — web browser alsa-utils # ALSA CLI tools (amixer, aplay) for low-level audio
# greetd-tuigreet — TUI login greeter (text-based, no GPU needed at DM) firefox # web browser
grim slurp gst-plugin-pipewire imagemagick \ greetd-tuigreet # TUI login greeter (text-based, no GPU needed at DM)
# grim — Wayland screenshot tool (outputs to file or stdout)
# slurp — interactive region selector (used with grim) grim # Wayland screenshot tool (outputs to file or stdout)
# gst-plugin-pipewire — GStreamer plugin bridging through PipeWire slurp # interactive region selector (used with grim)
# imagemagick — image processing (screenshot effects, compositing) gst-plugin-pipewire # GStreamer plugin bridging through PipeWire
nerd-fonts otf-font-awesome \ imagemagick # image processing (screenshot effects, compositing)
# nerd-fonts — all Nerd Font patched families (icon glyphs in bar)
# otf-font-awesome — Font Awesome icon glyphs for EWW/dunst nerd-fonts # all Nerd Font patched families (icon glyphs in bar)
pipewire-alsa pipewire-jack pipewire-pulse \ otf-font-awesome # Font Awesome icon glyphs for EWW/dunst
# Compatibility layers: let ALSA, JACK, and PulseAudio apps route through # Compatibility layers: let ALSA, JACK, and PulseAudio apps route through
# PipeWire without requiring code changes in those apps # PipeWire without requiring code changes in those apps
qt5-wayland qt6-wayland swww ttf-jetbrains-mono wireplumber \ pipewire-alsa pipewire-jack pipewire-pulse
# qt5-wayland / qt6-wayland — Qt platform plugins for native Wayland rendering
# swww — smooth animated wallpaper daemon qt5-wayland # Qt5 platform plugin for native Wayland rendering
# ttf-jetbrains-mono — monospace font for terminals and the EWW bar qt6-wayland # Qt6 platform plugin for native Wayland rendering
# wireplumber — PipeWire session/policy manager swww # smooth animated wallpaper daemon
qt6ct xdg-desktop-portal-hyprland xdg-utils \ ttf-jetbrains-mono # monospace font for terminals and the EWW bar
# qt6ct — Qt6 colour/style configurator (run as user) wireplumber # PipeWire session/policy manager
# xdg-desktop-portal-hyprland — Hyprland XDG portal (screen share, file pick)
# xdg-utils — xdg-open / MIME handling helpers qt6ct # Qt6 colour/style configurator (run as user)
xorg-server xorg-xinit papirus-icon-theme \ xdg-desktop-portal-hyprland # Hyprland XDG portal (screen share, file pick)
# xorg-server / xorg-xinit — X server for XWayland (legacy X11 apps) xdg-utils # xdg-open / MIME handling helpers
# papirus-icon-theme — icon theme used system-wide and by udiskie
cool-retro-term qalculate-gtk iwd dbus \ xorg-server # X server for XWayland (legacy X11 apps)
# cool-retro-term — retro CRT-style terminal emulator xorg-xinit # startx / xinitrc support for XWayland
# qalculate-gtk — powerful GTK calculator with unit conversion papirus-icon-theme # icon theme used system-wide and by udiskie
# iwd — Intel Wireless Daemon (lightweight Wi-Fi back-end)
# dbus — D-Bus inter-process communication daemon cool-retro-term # retro CRT-style terminal emulator
thunar tumbler thunar-archive-plugin thunar-shares-plugin thunar-volman \ qalculate-gtk # powerful GTK calculator with unit conversion
# thunar — lightweight GTK file manager (XFCE project) iwd # Intel Wireless Daemon (lightweight Wi-Fi back-end)
# tumbler — thumbnail service for Thunar dbus # D-Bus inter-process communication daemon
# thunar-archive-plugin — right-click archive (zip/tar) integration
# thunar-shares-plugin — Samba share management from Thunar thunar # lightweight GTK file manager (XFCE project)
# thunar-volman — automatic volume/device mounting in Thunar tumbler # thumbnail service for Thunar
hyprpicker pcmanfm-qt udisks2 ly kew \ thunar-archive-plugin # right-click archive (zip/tar) integration
# hyprpicker — colour picker outputting hex/rgb/hsl under Hyprland thunar-shares-plugin # Samba share management from Thunar
# pcmanfm-qt — Qt file manager kept as fallback thunar-volman # automatic volume/device mounting in Thunar
# udisks2 — D-Bus service for querying and managing storage devices
# ly — minimal TUI display manager (replaces getty on tty1) hyprpicker # colour picker outputting hex/rgb/hsl under Hyprland
# kew — terminal music player pcmanfm-qt # Qt file manager kept as fallback
hyprpolkitagent pavucontrol playerctl wf-recorder sound-theme-freedesktop udisks2 # D-Bus service for querying and managing storage devices
# hyprpolkitagent — Hyprland-native Polkit authentication agent ly # minimal TUI display manager (replaces getty on tty1)
# pavucontrol — PulseAudio/PipeWire volume control GUI kew # terminal music player
# playerctl — MPRIS media player controller (play/pause CLI)
# wf-recorder — screen recorder for wlroots compositors hyprpolkitagent # Hyprland-native Polkit authentication agent
# sound-theme-freedesktop — standard freedesktop sound event library pavucontrol # PulseAudio/PipeWire volume control GUI
playerctl # MPRIS media player controller (play/pause CLI)
wf-recorder # screen recorder for wlroots compositors
sound-theme-freedesktop # standard freedesktop sound event library
)
sudo pacman -Syu --noconfirm --needed -- "${HYPRLAND_PACKAGES[@]}"
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# 3. Enable essential services # 3. Enable essential services

View File

@ -57,88 +57,95 @@ sudo pacman -Syu --noconfirm --needed flatpak
# 2. Install required packages # 2. Install required packages
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
log "Installing required packages..." log "Installing required packages..."
sudo pacman -Syu --noconfirm --needed \ # Packages live in an array so each can carry an inline comment. A single
hyprland hyprcursor wl-clipboard hyprpaper hyprlock wofi kitty dunst \ # backslash-continued `pacman` command cannot: bash treats the first inline
# hyprland — Wayland compositor / window manager # comment as the end of the command, silently dropping every later package
# hyprcursor — hardware-accelerated cursor rendering for Hyprland # (which then get run as shell commands and abort under `set -e`).
# wl-clipboard — wl-copy / wl-paste; Wayland clipboard CLI tools HYPRLUA_PACKAGES=(
# hyprpaper — wallpaper utility with per-monitor support hyprland # Wayland compositor / window manager
# hyprlock — GPU-accelerated screen locker (Hyprland-native) hyprcursor # hardware-accelerated cursor rendering for Hyprland
# wofi — Wayland application launcher (rofi alternative) wl-clipboard # wl-copy / wl-paste; Wayland clipboard CLI tools
# kitty — GPU-accelerated terminal (default in this setup) hyprpaper # wallpaper utility with per-monitor support
# dunst — lightweight, scriptable notification daemon hyprlock # GPU-accelerated screen locker (Hyprland-native)
nwg-dock-hyprland nwg-drawer nwg-menu nwg-look \ wofi # Wayland application launcher (rofi alternative)
# nwg-dock-hyprland — dock/taskbar with Hyprland workspace awareness kitty # GPU-accelerated terminal (default in this setup)
# nwg-drawer — grid application drawer / launcher dunst # lightweight, scriptable notification daemon
# nwg-menu — GTK application menu for the panel button
# nwg-look — GTK/cursor/icon theme picker for wlroots sessions nwg-dock-hyprland # dock/taskbar with Hyprland workspace awareness
python cmake meson cpio pkgconf ruby-pkg-config \ nwg-drawer # grid application drawer / launcher
nwg-menu # GTK application menu for the panel button
nwg-look # GTK/cursor/icon theme picker for wlroots sessions
# Build toolchain required for EWW (Rust) and AUR package compilation # Build toolchain required for EWW (Rust) and AUR package compilation
hyprsunset hypridle ksshaskpass \ python cmake meson cpio pkgconf ruby-pkg-config
# hyprsunset — blue-light filter / night-mode daemon
# hypridle — idle daemon triggering lock/suspend after inactivity hyprsunset # blue-light filter / night-mode daemon
# ksshaskpass — Qt SSH passphrase dialog registered as ssh-askpass hypridle # idle daemon triggering lock/suspend after inactivity
nm-connection-editor network-manager-applet blueman bluez \ ksshaskpass # Qt SSH passphrase dialog registered as ssh-askpass
# nm-connection-editor — GTK editor for NetworkManager connection profiles
# network-manager-applet — tray applet showing network connection status nm-connection-editor # GTK editor for NetworkManager connection profiles
# blueman — GTK Bluetooth manager with tray icon support network-manager-applet # tray applet showing network connection status
# bluez — core Linux Bluetooth protocol stack blueman # GTK Bluetooth manager with tray icon support
pipewire alsa-utils firefox greetd-tuigreet \ bluez # core Linux Bluetooth protocol stack
# pipewire — modern audio/video routing daemon (replaces PulseAudio)
# alsa-utils — low-level ALSA CLI tools (amixer, aplay, arecord) pipewire # modern audio/video routing daemon (replaces PulseAudio)
# firefox — web browser alsa-utils # low-level ALSA CLI tools (amixer, aplay, arecord)
# greetd-tuigreet — TUI login greeter (text-based, no GPU requirement) firefox # web browser
grim slurp gst-plugin-pipewire imagemagick \ greetd-tuigreet # TUI login greeter (text-based, no GPU requirement)
# grim — Wayland screenshot capture tool
# slurp — interactive rectangular region selector for screenshots grim # Wayland screenshot capture tool
# gst-plugin-pipewire — GStreamer plugin routing through PipeWire slurp # interactive rectangular region selector for screenshots
# imagemagick — image processing toolkit for screenshot effects gst-plugin-pipewire # GStreamer plugin routing through PipeWire
nerd-fonts otf-font-awesome \ imagemagick # image processing toolkit for screenshot effects
# nerd-fonts — all Nerd Font families (icon glyphs in EWW bar)
# otf-font-awesome — Font Awesome glyph set for bar and notifications nerd-fonts # all Nerd Font families (icon glyphs in EWW bar)
pipewire-alsa pipewire-jack pipewire-pulse \ otf-font-awesome # Font Awesome glyph set for bar and notifications
# Compatibility shims letting ALSA, JACK, and PulseAudio apps route through # Compatibility shims letting ALSA, JACK, and PulseAudio apps route through
# PipeWire transparently without needing to be recompiled # PipeWire transparently without needing to be recompiled
qt5-wayland qt6-wayland swww ttf-jetbrains-mono wireplumber \ pipewire-alsa pipewire-jack pipewire-pulse
# qt5-wayland / qt6-wayland — Qt Wayland platform plugins for native rendering
# swww — smooth animated wallpaper daemon for wlroots qt5-wayland # Qt5 Wayland platform plugin for native rendering
# ttf-jetbrains-mono — monospace coding font used in terminals/bar qt6-wayland # Qt6 Wayland platform plugin for native rendering
# wireplumber — PipeWire session and policy manager swww # smooth animated wallpaper daemon for wlroots
xdg-desktop-portal-hyprland xdg-utils \ ttf-jetbrains-mono # monospace coding font used in terminals/bar
# xdg-desktop-portal-hyprland — Hyprland XDG portal (screen share, file pick) wireplumber # PipeWire session and policy manager
# xdg-utils — xdg-open and MIME handling utilities
xdg-desktop-portal-hyprland # Hyprland XDG portal (screen share, file pick)
xdg-utils # xdg-open and MIME handling utilities
# Note: qt6ct is NOT included in hyprlua (differs from hyprland.sh) # Note: qt6ct is NOT included in hyprlua (differs from hyprland.sh)
xorg-server xorg-xinit papirus-icon-theme \
# xorg-server / xorg-xinit — X server for XWayland (legacy X11 apps) xorg-server # X server for XWayland (legacy X11 apps)
# papirus-icon-theme — icon theme used system-wide and by udiskie xorg-xinit # startx / xinitrc support for XWayland
cool-retro-term qalculate-gtk iwd dbus \ papirus-icon-theme # icon theme used system-wide and by udiskie
# cool-retro-term — retro CRT-style terminal emulator
# qalculate-gtk — full-featured GTK calculator with unit conversion cool-retro-term # retro CRT-style terminal emulator
# iwd — Intel Wireless Daemon (lighter Wi-Fi stack than wpa_supplicant) qalculate-gtk # full-featured GTK calculator with unit conversion
# dbus — D-Bus inter-process communication daemon iwd # Intel Wireless Daemon (lighter Wi-Fi stack than wpa_supplicant)
thunar tumbler thunar-archive-plugin thunar-shares-plugin thunar-volman \ dbus # D-Bus inter-process communication daemon
# thunar — lightweight GTK file manager
# tumbler — D-Bus thumbnail service for Thunar thunar # lightweight GTK file manager
# thunar-archive-plugin — archive (zip/tar) right-click integration tumbler # D-Bus thumbnail service for Thunar
# thunar-shares-plugin — Samba share management in Thunar thunar-archive-plugin # archive (zip/tar) right-click integration
# thunar-volman — automatic volume/device mounting in Thunar thunar-shares-plugin # Samba share management in Thunar
hyprpicker pcmanfm-qt udisks2 ly kew \ thunar-volman # automatic volume/device mounting in Thunar
# hyprpicker — colour picker outputting hex/rgb/hsl values
# pcmanfm-qt — Qt file manager (kept as fallback / alternative) hyprpicker # colour picker outputting hex/rgb/hsl values
# udisks2 — D-Bus daemon for querying and managing storage devices pcmanfm-qt # Qt file manager (kept as fallback / alternative)
# ly — minimal TUI display manager (takes over tty1 from getty) udisks2 # D-Bus daemon for querying and managing storage devices
# kew — terminal-based music player ly # minimal TUI display manager (takes over tty1 from getty)
hyprpolkitagent pavucontrol playerctl wf-recorder sound-theme-freedesktop \ kew # terminal-based music player
# hyprpolkitagent — Hyprland-native Polkit authentication agent
# pavucontrol — PulseAudio/PipeWire GUI volume mixer hyprpolkitagent # Hyprland-native Polkit authentication agent
# playerctl — MPRIS media player CLI controller pavucontrol # PulseAudio/PipeWire GUI volume mixer
# wf-recorder — screen recorder for wlroots-based compositors playerctl # MPRIS media player CLI controller
# sound-theme-freedesktop — standard freedesktop sound event samples wf-recorder # screen recorder for wlroots-based compositors
python-opencv v4l-utils sound-theme-freedesktop # standard freedesktop sound event samples
# python-opencv — OpenCV Python bindings; used by the webcam presence-
# detection daemon to watch for the user at the desk and python-opencv # OpenCV Python bindings; webcam presence-detection daemon
# inhibit idle/screen-lock while they are present v4l-utils # Video4Linux2 tools for enumerating and configuring webcams
# v4l-utils — Video4Linux2 tools for enumerating and configuring webcams )
sudo pacman -Syu --noconfirm --needed -- "${HYPRLUA_PACKAGES[@]}"
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# 3. Enable essential services # 3. Enable essential services

View File

@ -40,122 +40,130 @@ log "Installing core packages..."
# #
# Package groupings with rationale: # Package groupings with rationale:
sudo pacman -Syu --noconfirm --needed \ # Packages are collected in an array rather than written as a single
# backslash-continued `pacman` invocation: an array literal is the only form
# where `#` comments (both full-line and trailing) are allowed between items.
# A continued command would treat the first inline comment as the end of the
# command, silently dropping every package after it.
CORE_PACKAGES=(
# ── Archiving & file utilities ──────────────────────────────────────────── # ── Archiving & file utilities ────────────────────────────────────────────
7zip \ # Modern replacement for p7zip — handles .7z, .zip, .rar, etc. 7zip # Modern replacement for p7zip — handles .7z, .zip, .rar, etc.
arch-install-scripts \ # genfstab and other Arch install helpers (useful even post-install) arch-install-scripts # genfstab and other Arch install helpers (useful even post-install)
atftp \ # TFTP client/server — used by some network boot tools atftp # TFTP client/server — used by some network boot tools
atool \ # Universal archive wrapper (handles zip/tar/gz/xz with one command) atool # Universal archive wrapper (handles zip/tar/gz/xz with one command)
\
# ── Base system & build tools ───────────────────────────────────────────── # ── Base system & build tools ─────────────────────────────────────────────
base \ # Minimal Arch base (filesystem, bash, glibc, etc.) base # Minimal Arch base (filesystem, bash, glibc, etc.)
base-devel \ # AUR build requirements: make, gcc, binutils, pkg-config, etc. base-devel # AUR build requirements: make, gcc, binutils, pkg-config, etc.
bc \ # Arbitrary precision calculator — used in many shell scripts bc # Arbitrary precision calculator — used in many shell scripts
bind \ # DNS tools: dig, nslookup, host bind # DNS tools: dig, nslookup, host
bluez \ # Bluetooth protocol stack — enables BT devices bluez # Bluetooth protocol stack — enables BT devices
btrfs-progs \ # btrfs filesystem tools: mkfs.btrfs, btrfsck, snapper btrfs-progs # btrfs filesystem tools: mkfs.btrfs, btrfsck, snapper
btop \ # Interactive resource monitor (CPU/mem/net/disk) btop # Interactive resource monitor (CPU/mem/net/disk)
\
cronie \ # Cron daemon for scheduled tasks (enabled later in core.sh) cronie # Cron daemon for scheduled tasks (enabled later in core.sh)
curl \ # HTTP/FTP transfer tool — used by many installers curl # HTTP/FTP transfer tool — used by many installers
\
# ── Hardware & disk utilities ───────────────────────────────────────────── # ── Hardware & disk utilities ─────────────────────────────────────────────
dmidecode \ # Reads hardware info from DMI/SMBIOS (CPU, memory, BIOS) dmidecode # Reads hardware info from DMI/SMBIOS (CPU, memory, BIOS)
distrobox \ # Run other distro containers inside Arch (uses podman/docker) distrobox # Run other distro containers inside Arch (uses podman/docker)
dosfstools \ # mkfs.fat for FAT/EFI partitions; used when setting up boot dosfstools # mkfs.fat for FAT/EFI partitions; used when setting up boot
dust \ # Disk usage analyzer — like `du` but cleaner output dust # Disk usage analyzer — like `du` but cleaner output
\
# ── Filesystem & recovery ──────────────────────────────────────────────── # ── Filesystem & recovery ────────────────────────────────────────────────
e2fsprogs \ # ext4 filesystem tools: fsck.ext4, mkfs.ext4, tune2fs e2fsprogs # ext4 filesystem tools: fsck.ext4, mkfs.ext4, tune2fs
fail2ban \ # Bans IPs after repeated auth failures (SSH protection) fail2ban # Bans IPs after repeated auth failures (SSH protection)
fastfetch \ # System info display (neofetch replacement, faster) fastfetch # System info display (neofetch replacement, faster)
fd \ # Fast alternative to `find`, respects .gitignore fd # Fast alternative to `find`, respects .gitignore
fdupes \ # Find duplicate files by checksum fdupes # Find duplicate files by checksum
ffmpeg \ # Video/audio processing framework; required by many tools ffmpeg # Video/audio processing framework; required by many tools
firefox \ # Default browser (also in DE install, but needed as base) firefox # Default browser (also in DE install, but needed as base)
flatpak \ # Universal app sandbox format; Flathub remote added in pkg-mgr flatpak # Universal app sandbox format; Flathub remote added in pkg-mgr
fzf \ # Fuzzy finder — used by shell, yazi, neovim integrations fzf # Fuzzy finder — used by shell, yazi, neovim integrations
\
# ── Compilers & language runtimes ──────────────────────────────────────── # ── Compilers & language runtimes ────────────────────────────────────────
gcc \ # GNU C compiler — needed for native AUR builds gcc # GNU C compiler — needed for native AUR builds
git \ # Version control — required everywhere git # Version control — required everywhere
glib2 \ # GNOME low-level lib; used by many GTK/D-Bus tools glib2 # GNOME low-level lib; used by many GTK/D-Bus tools
greetd-tuigreet \ # Text-mode login greeter (configured in core.sh) greetd-tuigreet # Text-mode login greeter (configured in core.sh)
grub \ # GRUB2 bootloader for x86_64-efi grub # GRUB2 bootloader for x86_64-efi
\
# ── Hardware identification & networking ────────────────────────────────── # ── Hardware identification & networking ──────────────────────────────────
hdparm \ # Disk performance testing and low-level ATA control hdparm # Disk performance testing and low-level ATA control
htop \ # Interactive process viewer (classic alternative to btop) htop # Interactive process viewer (classic alternative to btop)
inetutils \ # hostname, telnet, rsh, ftp utilities inetutils # hostname, telnet, rsh, ftp utilities
iputils \ # ping, tracepath, arping — basic IP network tools iputils # ping, tracepath, arping — basic IP network tools
iwd \ # Intel Wireless Daemon — WiFi backend for NetworkManager iwd # Intel Wireless Daemon — WiFi backend for NetworkManager
jq \ # JSON processor — used by installer scripts and modules jq # JSON processor — used by installer scripts and modules
ldns \ # DNS library + drill tool (alternative to dig) ldns # DNS library + drill tool (alternative to dig)
less \ # Pager for viewing long output; also needed by man less # Pager for viewing long output; also needed by man
libpulse \ # PulseAudio client library — compatibility shim for pipewire libpulse # PulseAudio client library — compatibility shim for pipewire
linux \ # The Linux kernel itself linux # The Linux kernel itself
linux-firmware \ # Microcode and firmware blobs for hardware support linux-firmware # Microcode and firmware blobs for hardware support
lshw \ # Detailed hardware listing (CPU, memory, PCI devices) lshw # Detailed hardware listing (CPU, memory, PCI devices)
lsof \ # List open files — invaluable for debugging processes/sockets lsof # List open files — invaluable for debugging processes/sockets
\
lynx \ # Text-mode web browser — useful in TTY-only environments lynx # Text-mode web browser — useful in TTY-only environments
\
# ── Editors & documentation ────────────────────────────────────────────── # ── Editors & documentation ──────────────────────────────────────────────
man-db \ # Man page database and viewer man-db # Man page database and viewer
mc \ # Midnight Commander — two-pane terminal file manager mc # Midnight Commander — two-pane terminal file manager
nano \ # Simple terminal text editor for quick edits nano # Simple terminal text editor for quick edits
neovim \ # Primary editor (configured via dotfiles/nvim/) neovim # Primary editor (configured via dotfiles/nvim/)
networkmanager \ # Network connection manager daemon networkmanager # Network connection manager daemon
\
# ── Fetch & monitoring ──────────────────────────────────────────────────── # ── Fetch & monitoring ────────────────────────────────────────────────────
onefetch \ # Git repo summary in the terminal (like neofetch for repos) onefetch # Git repo summary in the terminal (like neofetch for repos)
openbsd-netcat \ # Netcat implementation — port scanning, simple TCP connections openbsd-netcat # Netcat implementation — port scanning, simple TCP connections
openssh \ # SSH client and server (sshd enabled in optional module) openssh # SSH client and server (sshd enabled in optional module)
parted \ # Disk partitioning tool — used by arch-autoinstall.sh parted # Disk partitioning tool — used by arch-autoinstall.sh
pciutils \ # lspci — list PCI devices (needed for GPU detection) pciutils # lspci — list PCI devices (needed for GPU detection)
pipewire \ # Modern audio/video server (replaces PulseAudio + JACK) pipewire # Modern audio/video server (replaces PulseAudio + JACK)
\
# ── Programming languages ──────────────────────────────────────────────── # ── Programming languages ────────────────────────────────────────────────
python \ # Python 3 interpreter python # Python 3 interpreter
python-pip \ # Python package manager python-pip # Python package manager
qrencode \ # Generate QR codes in terminal — useful for sharing WiFi/URLs qrencode # Generate QR codes in terminal — useful for sharing WiFi/URLs
ripgrep \ # Fast recursive grep replacement (rg command) ripgrep # Fast recursive grep replacement (rg command)
rsync \ # Efficient file sync over SSH or locally rsync # Efficient file sync over SSH or locally
ruby-pkg-config \ # Ruby gem build helper — needed by some AUR packages ruby-pkg-config # Ruby gem build helper — needed by some AUR packages
rust \ # Rust compiler (also installed via rustup for toolchain mgmt) rust # Rust compiler (also installed via rustup for toolchain mgmt)
rustup \ # Rust toolchain manager — switches stable/nightly/beta rustup # Rust toolchain manager — switches stable/nightly/beta
\
# ── System monitoring & debugging ──────────────────────────────────────── # ── System monitoring & debugging ────────────────────────────────────────
smartmontools \ # S.M.A.R.T. disk health monitoring (smartctl) smartmontools # S.M.A.R.T. disk health monitoring (smartctl)
strace \ # System call tracer — debugging tool for process behavior strace # System call tracer — debugging tool for process behavior
symlinks \ # Scans and optionally fixes broken symlinks symlinks # Scans and optionally fixes broken symlinks
sysstat \ # System performance stats: iostat, mpstat, pidstat, sar sysstat # System performance stats: iostat, mpstat, pidstat, sar
tldr \ # Simplified man pages with practical examples tldr # Simplified man pages with practical examples
tmux \ # Terminal multiplexer — persistent sessions over SSH tmux # Terminal multiplexer — persistent sessions over SSH
tree \ # Display directory structure as a tree tree # Display directory structure as a tree
\
# ── Disk & USB management ──────────────────────────────────────────────── # ── Disk & USB management ────────────────────────────────────────────────
udisks2 \ # D-Bus service for auto-mounting removable media udisks2 # D-Bus service for auto-mounting removable media
udisks2-btrfs \ # btrfs extension for udisks2 udisks2-btrfs # btrfs extension for udisks2
udiskie \ # User-space udisks2 automounter daemon udiskie # User-space udisks2 automounter daemon
ufw \ # Uncomplicated Firewall — iptables frontend ufw # Uncomplicated Firewall — iptables frontend
usbutils \ # lsusb — list USB devices usbutils # lsusb — list USB devices
\
# ── Network tools & misc ───────────────────────────────────────────────── # ── Network tools & misc ─────────────────────────────────────────────────
vim \ # Classic Vi IMproved editor (backup editor, always present) vim # Classic Vi IMproved editor (backup editor, always present)
vnstat \ # Network traffic monitor — tracks usage per interface vnstat # Network traffic monitor — tracks usage per interface
wget \ # HTTP/FTP file downloader wget # HTTP/FTP file downloader
whois \ # Domain name lookup tool whois # Domain name lookup tool
wireplumber \ # Session/policy manager for PipeWire (required for audio) wireplumber # Session/policy manager for PipeWire (required for audio)
wireless_tools \ # Legacy iwconfig, iwlist — sometimes needed for troubleshooting wireless_tools # Legacy iwconfig, iwlist — sometimes needed for troubleshooting
wpa_supplicant \ # WPA2/WPA3 supplicant for WiFi authentication wpa_supplicant # WPA2/WPA3 supplicant for WiFi authentication
wprs \ # Wayland proxy for running X11 apps in Wayland sessions wprs # Wayland proxy for running X11 apps in Wayland sessions
\
# ── File manager & archive ──────────────────────────────────────────────── # ── File manager & archive ────────────────────────────────────────────────
yazi \ # Terminal file manager with image preview and fuzzy search yazi # Terminal file manager with image preview and fuzzy search
zip \ # Create ZIP archives zip # Create ZIP archives
unzip \ # Extract ZIP archives unzip # Extract ZIP archives
zram-generator # Systemd-based zram compressed swap setup (improves RAM efficiency) zram-generator # Systemd-based zram compressed swap setup (improves RAM efficiency)
)
sudo pacman -Syu --noconfirm --needed -- "${CORE_PACKAGES[@]}"
# ── AUR packages ────────────────────────────────────────────────────────────── # ── AUR packages ──────────────────────────────────────────────────────────────
# Only install packages that are NOT available in official repos. # Only install packages that are NOT available in official repos.

View File

@ -93,8 +93,10 @@ log "Discovering CalDAV collections (confirm any prompts with y)..."
yes | vdirsyncer discover calendars || true yes | vdirsyncer discover calendars || true
# Pull all events from the server for the first time. # Pull all events from the server for the first time.
# Best-effort: with placeholder credentials or no network at install time this
# is expected to fail, which must not abort the module. Warn and continue.
log "Running initial sync..." log "Running initial sync..."
vdirsyncer sync vdirsyncer sync || warn "Initial CalDAV sync failed (credentials/network not ready) — run 'vdirsyncer sync' once configured."
# ── khal configuration ──────────────────────────────────────────────────────── # ── khal configuration ────────────────────────────────────────────────────────
# khal needs one [[calendar]] section per local ICS directory. # khal needs one [[calendar]] section per local ICS directory.
@ -254,17 +256,23 @@ PYEOF
# Make the helper executable so it can be called directly from the PATH # Make the helper executable so it can be called directly from the PATH
chmod +x ~/.local/bin/ics-to-calendarim chmod +x ~/.local/bin/ics-to-calendarim
# Build the initial calendar.vim cache from the events we just synced # Build the initial calendar.vim cache from the events we just synced.
# Best-effort: harmless to skip if the first sync pulled nothing.
log "Running initial calendar.vim cache build..." log "Running initial calendar.vim cache build..."
~/.local/bin/ics-to-calendarim ~/.local/bin/ics-to-calendarim || warn "calendar.vim cache build skipped — rebuild later with: ics-to-calendarim"
# ── systemd user timer ──────────────────────────────────────────────────────── # ── systemd user timer ────────────────────────────────────────────────────────
# A systemd user timer keeps calendars current automatically. # A systemd user timer keeps calendars current automatically.
# Using systemd (instead of cron) lets the unit run without requiring root and # Using systemd (instead of cron) lets the unit run without requiring root and
# integrates cleanly with the user's login session. # integrates cleanly with the user's login session.
#
# Best-effort: when the installer runs from a bare TTY or chroot there is no
# per-user systemd session bus (and ~/.config may not yet be owned by the
# invoking user), so `systemctl --user` and even the mkdir can fail. That must
# not abort the module — the timer can be (re)created on first login. We warn
# and continue rather than letting `set -e` kill the install.
log "Installing vdirsyncer systemd user timer (every 15 min)..." log "Installing vdirsyncer systemd user timer (every 15 min)..."
mkdir -p ~/.config/systemd/user if mkdir -p ~/.config/systemd/user 2>/dev/null; then
# The service unit runs vdirsyncer sync then rebuilds the calendar.vim cache. # The service unit runs vdirsyncer sync then rebuilds the calendar.vim cache.
# Type=oneshot: the service is considered active only while the process runs; # Type=oneshot: the service is considered active only while the process runs;
# it exits when done rather than staying in the background. # it exits when done rather than staying in the background.
@ -297,10 +305,18 @@ Unit=vdirsyncer.service
WantedBy=timers.target WantedBy=timers.target
EOF EOF
# Reload systemd user daemon so it picks up the new unit files # A successful daemon-reload means a user session bus is available; only then
systemctl --user daemon-reload # is it worth trying to enable/start the timer.
# Enable and immediately start the timer; "--now" starts it without a reboot if systemctl --user daemon-reload 2>/dev/null; then
systemctl --user enable --now vdirsyncer.timer # Enable and immediately start the timer; "--now" starts it without a reboot.
systemctl --user enable --now vdirsyncer.timer 2>/dev/null \
|| warn "Could not enable vdirsyncer.timer now — run: systemctl --user enable --now vdirsyncer.timer"
else
warn "No user systemd session detected — enable the timer after login with: systemctl --user enable --now vdirsyncer.timer"
fi
else
warn "Could not create ~/.config/systemd/user — skipping the vdirsyncer timer (set it up after first login)."
fi
log "CalDAV sync configured. Events will appear in calendar.vim automatically." log "CalDAV sync configured. Events will appear in calendar.vim automatically."
log "Manual sync: vdirsyncer sync && ics-to-calendarim" log "Manual sync: vdirsyncer sync && ics-to-calendarim"

View File

@ -4,10 +4,9 @@ set -euo pipefail
# Load shared log/skip/warn/err helpers from the installer library. # Load shared log/skip/warn/err helpers from the installer library.
source "$(dirname "${BASH_SOURCE[0]}")/../../lib/logging.sh" source "$(dirname "${BASH_SOURCE[0]}")/../../lib/logging.sh"
log "Installing Himalaya (AUR)..." log "Installing Himalaya..."
# himalaya-bin is the pre-compiled binary release of the Himalaya CLI email client. # Himalaya is now packaged in the official Arch repos as `himalaya`, so install
# The -bin variant is preferred over building from source because compiling the full # it with pacman. (The old AUR `himalaya-bin` binary package has been dropped.)
# Rust workspace is slow and requires a complete Rust toolchain. # --needed skips the work if it is already installed.
# --answerdiff None / --answerclean All suppress interactive PKGBUILD/clean prompts. sudo pacman -S --noconfirm --needed himalaya
yay -S --answerdiff None --answerclean All --noconfirm himalaya-bin
log "Himalaya installed." log "Himalaya installed."

View File

@ -158,11 +158,16 @@ grep -qxF "text/html; w3m -dump -o document_charset=%{charset} '%s'; nametemplat
|| echo "text/html; w3m -dump -o document_charset=%{charset} '%s'; nametemplate=%s.html; copiousoutput" >> ~/.mailcap || echo "text/html; w3m -dump -o document_charset=%{charset} '%s'; nametemplate=%s.html; copiousoutput" >> ~/.mailcap
# ── systemd timer for periodic sync ─────────────────────────────────────────── # ── systemd timer for periodic sync ───────────────────────────────────────────
# This whole block is best-effort: when the installer runs from a bare TTY or a
# chroot there is no per-user systemd session bus (and ~/.config may not yet be
# owned by the invoking user), so `systemctl --user` and even the mkdir can fail.
# None of that should abort the module — the mail config is already in place and
# the timer can be (re)created on first graphical/login session. We therefore
# warn and continue instead of letting `set -e` kill the install.
log "Installing mbsync systemd user timer (every 5 min)..." log "Installing mbsync systemd user timer (every 5 min)..."
# User units live under ~/.config/systemd/user/; --user scope requires no root # User units live under ~/.config/systemd/user/; --user scope requires no root
# and units only run while the user session is active. # and units only run while the user session is active.
mkdir -p ~/.config/systemd/user if mkdir -p ~/.config/systemd/user 2>/dev/null; then
# Type=oneshot: systemd marks the service done as soon as ExecStart exits, # Type=oneshot: systemd marks the service done as soon as ExecStart exits,
# appropriate for a batch sync command that runs and terminates. # appropriate for a batch sync command that runs and terminates.
# After=network-online.target: prevents sync attempts before a route is available. # After=network-online.target: prevents sync attempts before a route is available.
@ -194,16 +199,33 @@ WantedBy=timers.target
EOF EOF
# Reload the user manager so it picks up the newly written unit files. # Reload the user manager so it picks up the newly written unit files.
systemctl --user daemon-reload # A successful daemon-reload means a user session bus is available; only then
# enable makes the timer survive reboots; --now also starts it in the current session. # is it worth trying to enable/start the timer. Guard both so the absence of
systemctl --user enable --now mbsync.timer # a session during install is reported, not fatal.
if systemctl --user daemon-reload 2>/dev/null; then
# enable makes the timer survive reboots; --now also starts it now.
systemctl --user enable --now mbsync.timer 2>/dev/null \
|| warn "Could not enable mbsync.timer now — run: systemctl --user enable --now mbsync.timer"
else
warn "No user systemd session detected — enable the timer after login with: systemctl --user enable --now mbsync.timer"
fi
else
warn "Could not create ~/.config/systemd/user — skipping the mbsync timer (set it up after first login)."
fi
# ── initial sync ────────────────────────────────────────────────────────────── # ── initial sync ──────────────────────────────────────────────────────────────
# Also best-effort: with placeholder credentials or no network at install time
# the first sync is expected to fail. Warn rather than abort so the module still
# reports success — the timer (or a manual `mbsync -a`) will sync once the user
# has filled in real account details.
log "Running initial mail sync..." log "Running initial mail sync..."
# -a syncs all configured channels; may take several minutes on a large mailbox. # -a syncs all configured channels; may take several minutes on a large mailbox.
mbsync -a if mbsync -a; then
# Index the freshly downloaded messages so alot can display them immediately. # Index the freshly downloaded messages so alot can display them immediately.
notmuch new notmuch new || warn "notmuch new failed — index later with: notmuch new"
else
warn "Initial mail sync failed (credentials/network not ready) — run 'mbsync -a && notmuch new' once configured."
fi
log "Mail setup complete. Syncs automatically every 5 min via systemd timer." log "Mail setup complete. Syncs automatically every 5 min via systemd timer."
log "Open alot with: alot | Check timer: systemctl --user status mbsync.timer" log "Open alot with: alot | Check timer: systemctl --user status mbsync.timer"