diff --git a/setup/modules/Desktop-Environments/hyprland.sh b/setup/modules/Desktop-Environments/hyprland.sh index fb6553d..f690620 100755 --- a/setup/modules/Desktop-Environments/hyprland.sh +++ b/setup/modules/Desktop-Environments/hyprland.sh @@ -57,83 +57,92 @@ sudo pacman -Syu --noconfirm --needed flatpak # 2. Install required packages # --------------------------------------------------------------------------- log "Installing required packages..." -sudo pacman -Syu --noconfirm --needed \ - hyprland hyprcursor wl-clipboard hyprpaper hyprlock wofi kitty dunst \ - # hyprland — the Wayland compositor / window manager - # hyprcursor — hardware-accelerated cursor rendering for Hyprland - # wl-clipboard — wl-copy / wl-paste; clipboard tools for Wayland - # hyprpaper — wallpaper utility with per-monitor and animation support - # hyprlock — GPU-accelerated screen locker (Hyprland-native) - # wofi — Wayland application launcher (rofi replacement) - # kitty — GPU-accelerated terminal (default terminal in this setup) - # dunst — lightweight, scriptable notification daemon - nwg-dock-hyprland nwg-drawer nwg-menu nwg-look \ - # nwg-dock-hyprland — dock/taskbar with Hyprland workspace awareness - # 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 - python cmake meson cpio pkgconf ruby-pkg-config \ +# Packages live in an array so each can carry an inline comment. A single +# backslash-continued `pacman` command cannot: bash treats the first inline +# comment as the end of the command, silently dropping every later package +# (which then get run as shell commands and abort under `set -e`). +HYPRLAND_PACKAGES=( + hyprland # the Wayland compositor / window manager + hyprcursor # hardware-accelerated cursor rendering for Hyprland + wl-clipboard # wl-copy / wl-paste; clipboard tools for Wayland + hyprpaper # wallpaper utility with per-monitor and animation support + hyprlock # GPU-accelerated screen locker (Hyprland-native) + wofi # Wayland application launcher (rofi replacement) + kitty # GPU-accelerated terminal (default terminal in this setup) + dunst # lightweight, scriptable notification daemon + + nwg-dock-hyprland # dock/taskbar with Hyprland workspace awareness + 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) - hyprsunset hypridle ksshaskpass \ - # hyprsunset — blue-light filter / night-mode daemon for Hyprland - # hypridle — idle daemon that triggers lock/suspend after inactivity - # ksshaskpass — Qt SSH passphrase dialog (registered as ssh-askpass) - nm-connection-editor network-manager-applet blueman bluez \ - # nm-connection-editor — GTK GUI for editing NetworkManager profiles - # network-manager-applet — system-tray applet showing Wi-Fi/VPN status - # blueman — GTK Bluetooth manager with tray icon - # bluez — core Linux Bluetooth protocol stack - pipewire alsa-utils firefox greetd-tuigreet \ - # pipewire — modern audio/video routing daemon - # alsa-utils — ALSA CLI tools (amixer, aplay) for low-level audio - # firefox — web browser - # greetd-tuigreet — TUI login greeter (text-based, no GPU needed at DM) - grim slurp gst-plugin-pipewire imagemagick \ - # grim — Wayland screenshot tool (outputs to file or stdout) - # slurp — interactive region selector (used with grim) - # gst-plugin-pipewire — GStreamer plugin bridging through PipeWire - # imagemagick — image processing (screenshot effects, compositing) - nerd-fonts otf-font-awesome \ - # nerd-fonts — all Nerd Font patched families (icon glyphs in bar) - # otf-font-awesome — Font Awesome icon glyphs for EWW/dunst - pipewire-alsa pipewire-jack pipewire-pulse \ + 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 + 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 + blueman # GTK Bluetooth manager with tray icon + bluez # core Linux Bluetooth protocol stack + + pipewire # modern audio/video routing daemon + alsa-utils # ALSA CLI tools (amixer, aplay) for low-level audio + firefox # web browser + 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) + gst-plugin-pipewire # GStreamer plugin bridging through PipeWire + 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 + # Compatibility layers: let ALSA, JACK, and PulseAudio apps route through # PipeWire without requiring code changes in those apps - qt5-wayland qt6-wayland swww ttf-jetbrains-mono wireplumber \ - # qt5-wayland / qt6-wayland — Qt platform plugins for native Wayland rendering - # swww — smooth animated wallpaper daemon - # ttf-jetbrains-mono — monospace font for terminals and the EWW bar - # wireplumber — PipeWire session/policy manager - qt6ct xdg-desktop-portal-hyprland xdg-utils \ - # qt6ct — Qt6 colour/style configurator (run as user) - # xdg-desktop-portal-hyprland — Hyprland XDG portal (screen share, file pick) - # xdg-utils — xdg-open / MIME handling helpers - xorg-server xorg-xinit papirus-icon-theme \ - # xorg-server / xorg-xinit — X server for XWayland (legacy X11 apps) - # papirus-icon-theme — icon theme used system-wide and by udiskie - cool-retro-term qalculate-gtk iwd dbus \ - # cool-retro-term — retro CRT-style terminal emulator - # qalculate-gtk — powerful GTK calculator with unit conversion - # iwd — Intel Wireless Daemon (lightweight Wi-Fi back-end) - # dbus — D-Bus inter-process communication daemon - thunar tumbler thunar-archive-plugin thunar-shares-plugin thunar-volman \ - # thunar — lightweight GTK file manager (XFCE project) - # tumbler — thumbnail service for Thunar - # thunar-archive-plugin — right-click archive (zip/tar) integration - # thunar-shares-plugin — Samba share management from Thunar - # thunar-volman — automatic volume/device mounting in Thunar - hyprpicker pcmanfm-qt udisks2 ly kew \ - # hyprpicker — colour picker outputting hex/rgb/hsl under Hyprland - # pcmanfm-qt — Qt file manager kept as fallback - # udisks2 — D-Bus service for querying and managing storage devices - # ly — minimal TUI display manager (replaces getty on tty1) - # kew — terminal music player - hyprpolkitagent pavucontrol playerctl wf-recorder sound-theme-freedesktop - # hyprpolkitagent — Hyprland-native Polkit authentication agent - # 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 + pipewire-alsa pipewire-jack pipewire-pulse + + qt5-wayland # Qt5 platform plugin for native Wayland rendering + qt6-wayland # Qt6 platform plugin for native Wayland rendering + swww # smooth animated wallpaper daemon + ttf-jetbrains-mono # monospace font for terminals and the EWW bar + wireplumber # PipeWire session/policy manager + + qt6ct # Qt6 colour/style configurator (run as user) + xdg-desktop-portal-hyprland # Hyprland XDG portal (screen share, file pick) + xdg-utils # xdg-open / MIME handling helpers + + xorg-server # X server for XWayland (legacy X11 apps) + xorg-xinit # startx / xinitrc support for XWayland + papirus-icon-theme # icon theme used system-wide and by udiskie + + cool-retro-term # retro CRT-style terminal emulator + qalculate-gtk # powerful GTK calculator with unit conversion + iwd # Intel Wireless Daemon (lightweight Wi-Fi back-end) + dbus # D-Bus inter-process communication daemon + + thunar # lightweight GTK file manager (XFCE project) + tumbler # thumbnail service for Thunar + thunar-archive-plugin # right-click archive (zip/tar) integration + thunar-shares-plugin # Samba share management from Thunar + thunar-volman # automatic volume/device mounting in Thunar + + hyprpicker # colour picker outputting hex/rgb/hsl under Hyprland + pcmanfm-qt # Qt file manager kept as fallback + udisks2 # D-Bus service for querying and managing storage devices + ly # minimal TUI display manager (replaces getty on tty1) + kew # terminal music player + + hyprpolkitagent # Hyprland-native Polkit authentication agent + 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 diff --git a/setup/modules/Desktop-Environments/hyprlua.sh b/setup/modules/Desktop-Environments/hyprlua.sh index 081dde2..69fa998 100755 --- a/setup/modules/Desktop-Environments/hyprlua.sh +++ b/setup/modules/Desktop-Environments/hyprlua.sh @@ -57,88 +57,95 @@ sudo pacman -Syu --noconfirm --needed flatpak # 2. Install required packages # --------------------------------------------------------------------------- log "Installing required packages..." -sudo pacman -Syu --noconfirm --needed \ - hyprland hyprcursor wl-clipboard hyprpaper hyprlock wofi kitty dunst \ - # hyprland — Wayland compositor / window manager - # hyprcursor — hardware-accelerated cursor rendering for Hyprland - # wl-clipboard — wl-copy / wl-paste; Wayland clipboard CLI tools - # hyprpaper — wallpaper utility with per-monitor support - # hyprlock — GPU-accelerated screen locker (Hyprland-native) - # wofi — Wayland application launcher (rofi alternative) - # kitty — GPU-accelerated terminal (default in this setup) - # dunst — lightweight, scriptable notification daemon - nwg-dock-hyprland nwg-drawer nwg-menu nwg-look \ - # nwg-dock-hyprland — dock/taskbar with Hyprland workspace awareness - # 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 - python cmake meson cpio pkgconf ruby-pkg-config \ +# Packages live in an array so each can carry an inline comment. A single +# backslash-continued `pacman` command cannot: bash treats the first inline +# comment as the end of the command, silently dropping every later package +# (which then get run as shell commands and abort under `set -e`). +HYPRLUA_PACKAGES=( + hyprland # Wayland compositor / window manager + hyprcursor # hardware-accelerated cursor rendering for Hyprland + wl-clipboard # wl-copy / wl-paste; Wayland clipboard CLI tools + hyprpaper # wallpaper utility with per-monitor support + hyprlock # GPU-accelerated screen locker (Hyprland-native) + wofi # Wayland application launcher (rofi alternative) + kitty # GPU-accelerated terminal (default in this setup) + dunst # lightweight, scriptable notification daemon + + nwg-dock-hyprland # dock/taskbar with Hyprland workspace awareness + 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 - hyprsunset hypridle ksshaskpass \ - # hyprsunset — blue-light filter / night-mode daemon - # hypridle — idle daemon triggering lock/suspend after inactivity - # ksshaskpass — Qt SSH passphrase dialog registered as ssh-askpass - nm-connection-editor network-manager-applet blueman bluez \ - # nm-connection-editor — GTK editor for NetworkManager connection profiles - # network-manager-applet — tray applet showing network connection status - # blueman — GTK Bluetooth manager with tray icon support - # bluez — core Linux Bluetooth protocol stack - pipewire alsa-utils firefox greetd-tuigreet \ - # pipewire — modern audio/video routing daemon (replaces PulseAudio) - # alsa-utils — low-level ALSA CLI tools (amixer, aplay, arecord) - # firefox — web browser - # greetd-tuigreet — TUI login greeter (text-based, no GPU requirement) - grim slurp gst-plugin-pipewire imagemagick \ - # grim — Wayland screenshot capture tool - # slurp — interactive rectangular region selector for screenshots - # gst-plugin-pipewire — GStreamer plugin routing through PipeWire - # imagemagick — image processing toolkit for screenshot effects - nerd-fonts otf-font-awesome \ - # nerd-fonts — all Nerd Font families (icon glyphs in EWW bar) - # otf-font-awesome — Font Awesome glyph set for bar and notifications - pipewire-alsa pipewire-jack pipewire-pulse \ + python cmake meson cpio pkgconf ruby-pkg-config + + hyprsunset # blue-light filter / night-mode daemon + hypridle # idle daemon triggering lock/suspend after inactivity + 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 + blueman # GTK Bluetooth manager with tray icon support + bluez # core Linux Bluetooth protocol stack + + pipewire # modern audio/video routing daemon (replaces PulseAudio) + alsa-utils # low-level ALSA CLI tools (amixer, aplay, arecord) + firefox # web browser + greetd-tuigreet # TUI login greeter (text-based, no GPU requirement) + + grim # Wayland screenshot capture tool + slurp # interactive rectangular region selector for screenshots + gst-plugin-pipewire # GStreamer plugin routing through PipeWire + 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 + # Compatibility shims letting ALSA, JACK, and PulseAudio apps route through # PipeWire transparently without needing to be recompiled - qt5-wayland qt6-wayland swww ttf-jetbrains-mono wireplumber \ - # qt5-wayland / qt6-wayland — Qt Wayland platform plugins for native rendering - # swww — smooth animated wallpaper daemon for wlroots - # ttf-jetbrains-mono — monospace coding font used in terminals/bar - # wireplumber — PipeWire session and policy manager - xdg-desktop-portal-hyprland xdg-utils \ - # xdg-desktop-portal-hyprland — Hyprland XDG portal (screen share, file pick) - # xdg-utils — xdg-open and MIME handling utilities + pipewire-alsa pipewire-jack pipewire-pulse + + qt5-wayland # Qt5 Wayland platform plugin for native rendering + qt6-wayland # Qt6 Wayland platform plugin for native rendering + swww # smooth animated wallpaper daemon for wlroots + ttf-jetbrains-mono # monospace coding font used in terminals/bar + wireplumber # PipeWire session and policy manager + + 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) - xorg-server xorg-xinit papirus-icon-theme \ - # xorg-server / xorg-xinit — X server for XWayland (legacy X11 apps) - # papirus-icon-theme — icon theme used system-wide and by udiskie - cool-retro-term qalculate-gtk iwd dbus \ - # cool-retro-term — retro CRT-style terminal emulator - # qalculate-gtk — full-featured GTK calculator with unit conversion - # iwd — Intel Wireless Daemon (lighter Wi-Fi stack than wpa_supplicant) - # dbus — D-Bus inter-process communication daemon - thunar tumbler thunar-archive-plugin thunar-shares-plugin thunar-volman \ - # thunar — lightweight GTK file manager - # tumbler — D-Bus thumbnail service for Thunar - # thunar-archive-plugin — archive (zip/tar) right-click integration - # thunar-shares-plugin — Samba share management in Thunar - # thunar-volman — automatic volume/device mounting in Thunar - hyprpicker pcmanfm-qt udisks2 ly kew \ - # hyprpicker — colour picker outputting hex/rgb/hsl values - # pcmanfm-qt — Qt file manager (kept as fallback / alternative) - # udisks2 — D-Bus daemon for querying and managing storage devices - # ly — minimal TUI display manager (takes over tty1 from getty) - # kew — terminal-based music player - hyprpolkitagent pavucontrol playerctl wf-recorder sound-theme-freedesktop \ - # hyprpolkitagent — Hyprland-native Polkit authentication agent - # pavucontrol — PulseAudio/PipeWire GUI volume mixer - # playerctl — MPRIS media player CLI controller - # wf-recorder — screen recorder for wlroots-based compositors - # sound-theme-freedesktop — standard freedesktop sound event samples - python-opencv v4l-utils - # python-opencv — OpenCV Python bindings; used by the webcam presence- - # detection daemon to watch for the user at the desk and - # inhibit idle/screen-lock while they are present - # v4l-utils — Video4Linux2 tools for enumerating and configuring webcams + + xorg-server # X server for XWayland (legacy X11 apps) + xorg-xinit # startx / xinitrc support for XWayland + 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 + iwd # Intel Wireless Daemon (lighter Wi-Fi stack than wpa_supplicant) + dbus # D-Bus inter-process communication daemon + + thunar # lightweight GTK file manager + tumbler # D-Bus thumbnail service for Thunar + thunar-archive-plugin # archive (zip/tar) right-click integration + thunar-shares-plugin # Samba share management in Thunar + 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) + udisks2 # D-Bus daemon for querying and managing storage devices + ly # minimal TUI display manager (takes over tty1 from getty) + kew # terminal-based music player + + hyprpolkitagent # Hyprland-native Polkit authentication agent + pavucontrol # PulseAudio/PipeWire GUI volume mixer + playerctl # MPRIS media player CLI controller + wf-recorder # screen recorder for wlroots-based compositors + sound-theme-freedesktop # standard freedesktop sound event samples + + python-opencv # OpenCV Python bindings; webcam presence-detection daemon + v4l-utils # Video4Linux2 tools for enumerating and configuring webcams +) +sudo pacman -Syu --noconfirm --needed -- "${HYPRLUA_PACKAGES[@]}" # --------------------------------------------------------------------------- # 3. Enable essential services diff --git a/setup/modules/core-packages.sh b/setup/modules/core-packages.sh index d6afe3b..d99c04d 100644 --- a/setup/modules/core-packages.sh +++ b/setup/modules/core-packages.sh @@ -40,122 +40,130 @@ log "Installing core packages..." # # 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 ──────────────────────────────────────────── - 7zip \ # Modern replacement for p7zip — handles .7z, .zip, .rar, etc. - arch-install-scripts \ # genfstab and other Arch install helpers (useful even post-install) - atftp \ # TFTP client/server — used by some network boot tools - atool \ # Universal archive wrapper (handles zip/tar/gz/xz with one command) - \ + 7zip # Modern replacement for p7zip — handles .7z, .zip, .rar, etc. + arch-install-scripts # genfstab and other Arch install helpers (useful even post-install) + atftp # TFTP client/server — used by some network boot tools + atool # Universal archive wrapper (handles zip/tar/gz/xz with one command) + # ── Base system & build tools ───────────────────────────────────────────── - base \ # Minimal Arch base (filesystem, bash, glibc, etc.) - base-devel \ # AUR build requirements: make, gcc, binutils, pkg-config, etc. - bc \ # Arbitrary precision calculator — used in many shell scripts - bind \ # DNS tools: dig, nslookup, host - bluez \ # Bluetooth protocol stack — enables BT devices - btrfs-progs \ # btrfs filesystem tools: mkfs.btrfs, btrfsck, snapper - btop \ # Interactive resource monitor (CPU/mem/net/disk) - \ - cronie \ # Cron daemon for scheduled tasks (enabled later in core.sh) - curl \ # HTTP/FTP transfer tool — used by many installers - \ + base # Minimal Arch base (filesystem, bash, glibc, etc.) + base-devel # AUR build requirements: make, gcc, binutils, pkg-config, etc. + bc # Arbitrary precision calculator — used in many shell scripts + bind # DNS tools: dig, nslookup, host + bluez # Bluetooth protocol stack — enables BT devices + btrfs-progs # btrfs filesystem tools: mkfs.btrfs, btrfsck, snapper + btop # Interactive resource monitor (CPU/mem/net/disk) + + cronie # Cron daemon for scheduled tasks (enabled later in core.sh) + curl # HTTP/FTP transfer tool — used by many installers + # ── Hardware & disk utilities ───────────────────────────────────────────── - dmidecode \ # Reads hardware info from DMI/SMBIOS (CPU, memory, BIOS) - distrobox \ # Run other distro containers inside Arch (uses podman/docker) - dosfstools \ # mkfs.fat for FAT/EFI partitions; used when setting up boot - dust \ # Disk usage analyzer — like `du` but cleaner output - \ + dmidecode # Reads hardware info from DMI/SMBIOS (CPU, memory, BIOS) + distrobox # Run other distro containers inside Arch (uses podman/docker) + dosfstools # mkfs.fat for FAT/EFI partitions; used when setting up boot + dust # Disk usage analyzer — like `du` but cleaner output + # ── Filesystem & recovery ──────────────────────────────────────────────── - e2fsprogs \ # ext4 filesystem tools: fsck.ext4, mkfs.ext4, tune2fs - fail2ban \ # Bans IPs after repeated auth failures (SSH protection) - fastfetch \ # System info display (neofetch replacement, faster) - fd \ # Fast alternative to `find`, respects .gitignore - fdupes \ # Find duplicate files by checksum - ffmpeg \ # Video/audio processing framework; required by many tools - firefox \ # Default browser (also in DE install, but needed as base) - flatpak \ # Universal app sandbox format; Flathub remote added in pkg-mgr - fzf \ # Fuzzy finder — used by shell, yazi, neovim integrations - \ + e2fsprogs # ext4 filesystem tools: fsck.ext4, mkfs.ext4, tune2fs + fail2ban # Bans IPs after repeated auth failures (SSH protection) + fastfetch # System info display (neofetch replacement, faster) + fd # Fast alternative to `find`, respects .gitignore + fdupes # Find duplicate files by checksum + ffmpeg # Video/audio processing framework; required by many tools + firefox # Default browser (also in DE install, but needed as base) + flatpak # Universal app sandbox format; Flathub remote added in pkg-mgr + fzf # Fuzzy finder — used by shell, yazi, neovim integrations + # ── Compilers & language runtimes ──────────────────────────────────────── - gcc \ # GNU C compiler — needed for native AUR builds - git \ # Version control — required everywhere - glib2 \ # GNOME low-level lib; used by many GTK/D-Bus tools - greetd-tuigreet \ # Text-mode login greeter (configured in core.sh) - grub \ # GRUB2 bootloader for x86_64-efi - \ + gcc # GNU C compiler — needed for native AUR builds + git # Version control — required everywhere + glib2 # GNOME low-level lib; used by many GTK/D-Bus tools + greetd-tuigreet # Text-mode login greeter (configured in core.sh) + grub # GRUB2 bootloader for x86_64-efi + # ── Hardware identification & networking ────────────────────────────────── - hdparm \ # Disk performance testing and low-level ATA control - htop \ # Interactive process viewer (classic alternative to btop) - inetutils \ # hostname, telnet, rsh, ftp utilities - iputils \ # ping, tracepath, arping — basic IP network tools - iwd \ # Intel Wireless Daemon — WiFi backend for NetworkManager - jq \ # JSON processor — used by installer scripts and modules - ldns \ # DNS library + drill tool (alternative to dig) - less \ # Pager for viewing long output; also needed by man - libpulse \ # PulseAudio client library — compatibility shim for pipewire - linux \ # The Linux kernel itself - linux-firmware \ # Microcode and firmware blobs for hardware support - lshw \ # Detailed hardware listing (CPU, memory, PCI devices) - lsof \ # List open files — invaluable for debugging processes/sockets - \ - lynx \ # Text-mode web browser — useful in TTY-only environments - \ + hdparm # Disk performance testing and low-level ATA control + htop # Interactive process viewer (classic alternative to btop) + inetutils # hostname, telnet, rsh, ftp utilities + iputils # ping, tracepath, arping — basic IP network tools + iwd # Intel Wireless Daemon — WiFi backend for NetworkManager + jq # JSON processor — used by installer scripts and modules + ldns # DNS library + drill tool (alternative to dig) + less # Pager for viewing long output; also needed by man + libpulse # PulseAudio client library — compatibility shim for pipewire + linux # The Linux kernel itself + linux-firmware # Microcode and firmware blobs for hardware support + lshw # Detailed hardware listing (CPU, memory, PCI devices) + lsof # List open files — invaluable for debugging processes/sockets + + lynx # Text-mode web browser — useful in TTY-only environments + # ── Editors & documentation ────────────────────────────────────────────── - man-db \ # Man page database and viewer - mc \ # Midnight Commander — two-pane terminal file manager - nano \ # Simple terminal text editor for quick edits - neovim \ # Primary editor (configured via dotfiles/nvim/) - networkmanager \ # Network connection manager daemon - \ + man-db # Man page database and viewer + mc # Midnight Commander — two-pane terminal file manager + nano # Simple terminal text editor for quick edits + neovim # Primary editor (configured via dotfiles/nvim/) + networkmanager # Network connection manager daemon + # ── Fetch & monitoring ──────────────────────────────────────────────────── - onefetch \ # Git repo summary in the terminal (like neofetch for repos) - openbsd-netcat \ # Netcat implementation — port scanning, simple TCP connections - openssh \ # SSH client and server (sshd enabled in optional module) - parted \ # Disk partitioning tool — used by arch-autoinstall.sh - pciutils \ # lspci — list PCI devices (needed for GPU detection) - pipewire \ # Modern audio/video server (replaces PulseAudio + JACK) - \ + onefetch # Git repo summary in the terminal (like neofetch for repos) + openbsd-netcat # Netcat implementation — port scanning, simple TCP connections + openssh # SSH client and server (sshd enabled in optional module) + parted # Disk partitioning tool — used by arch-autoinstall.sh + pciutils # lspci — list PCI devices (needed for GPU detection) + pipewire # Modern audio/video server (replaces PulseAudio + JACK) + # ── Programming languages ──────────────────────────────────────────────── - python \ # Python 3 interpreter - python-pip \ # Python package manager - qrencode \ # Generate QR codes in terminal — useful for sharing WiFi/URLs - ripgrep \ # Fast recursive grep replacement (rg command) - rsync \ # Efficient file sync over SSH or locally - ruby-pkg-config \ # Ruby gem build helper — needed by some AUR packages - rust \ # Rust compiler (also installed via rustup for toolchain mgmt) - rustup \ # Rust toolchain manager — switches stable/nightly/beta - \ + python # Python 3 interpreter + python-pip # Python package manager + qrencode # Generate QR codes in terminal — useful for sharing WiFi/URLs + ripgrep # Fast recursive grep replacement (rg command) + rsync # Efficient file sync over SSH or locally + ruby-pkg-config # Ruby gem build helper — needed by some AUR packages + rust # Rust compiler (also installed via rustup for toolchain mgmt) + rustup # Rust toolchain manager — switches stable/nightly/beta + # ── System monitoring & debugging ──────────────────────────────────────── - smartmontools \ # S.M.A.R.T. disk health monitoring (smartctl) - strace \ # System call tracer — debugging tool for process behavior - symlinks \ # Scans and optionally fixes broken symlinks - sysstat \ # System performance stats: iostat, mpstat, pidstat, sar - tldr \ # Simplified man pages with practical examples - tmux \ # Terminal multiplexer — persistent sessions over SSH - tree \ # Display directory structure as a tree - \ + smartmontools # S.M.A.R.T. disk health monitoring (smartctl) + strace # System call tracer — debugging tool for process behavior + symlinks # Scans and optionally fixes broken symlinks + sysstat # System performance stats: iostat, mpstat, pidstat, sar + tldr # Simplified man pages with practical examples + tmux # Terminal multiplexer — persistent sessions over SSH + tree # Display directory structure as a tree + # ── Disk & USB management ──────────────────────────────────────────────── - udisks2 \ # D-Bus service for auto-mounting removable media - udisks2-btrfs \ # btrfs extension for udisks2 - udiskie \ # User-space udisks2 automounter daemon - ufw \ # Uncomplicated Firewall — iptables frontend - usbutils \ # lsusb — list USB devices - \ + udisks2 # D-Bus service for auto-mounting removable media + udisks2-btrfs # btrfs extension for udisks2 + udiskie # User-space udisks2 automounter daemon + ufw # Uncomplicated Firewall — iptables frontend + usbutils # lsusb — list USB devices + # ── Network tools & misc ───────────────────────────────────────────────── - vim \ # Classic Vi IMproved editor (backup editor, always present) - vnstat \ # Network traffic monitor — tracks usage per interface - wget \ # HTTP/FTP file downloader - whois \ # Domain name lookup tool - wireplumber \ # Session/policy manager for PipeWire (required for audio) - wireless_tools \ # Legacy iwconfig, iwlist — sometimes needed for troubleshooting - wpa_supplicant \ # WPA2/WPA3 supplicant for WiFi authentication - wprs \ # Wayland proxy for running X11 apps in Wayland sessions - \ + vim # Classic Vi IMproved editor (backup editor, always present) + vnstat # Network traffic monitor — tracks usage per interface + wget # HTTP/FTP file downloader + whois # Domain name lookup tool + wireplumber # Session/policy manager for PipeWire (required for audio) + wireless_tools # Legacy iwconfig, iwlist — sometimes needed for troubleshooting + wpa_supplicant # WPA2/WPA3 supplicant for WiFi authentication + wprs # Wayland proxy for running X11 apps in Wayland sessions + # ── File manager & archive ──────────────────────────────────────────────── - yazi \ # Terminal file manager with image preview and fuzzy search - zip \ # Create ZIP archives - unzip \ # Extract ZIP archives - zram-generator # Systemd-based zram compressed swap setup (improves RAM efficiency) + yazi # Terminal file manager with image preview and fuzzy search + zip # Create ZIP archives + unzip # Extract ZIP archives + zram-generator # Systemd-based zram compressed swap setup (improves RAM efficiency) +) + +sudo pacman -Syu --noconfirm --needed -- "${CORE_PACKAGES[@]}" # ── AUR packages ────────────────────────────────────────────────────────────── # Only install packages that are NOT available in official repos. diff --git a/setup/modules/optional-Modules/apps/caldav-sync.sh b/setup/modules/optional-Modules/apps/caldav-sync.sh index 0ba3aae..b61b538 100755 --- a/setup/modules/optional-Modules/apps/caldav-sync.sh +++ b/setup/modules/optional-Modules/apps/caldav-sync.sh @@ -93,8 +93,10 @@ log "Discovering CalDAV collections (confirm any prompts with y)..." yes | vdirsyncer discover calendars || true # 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..." -vdirsyncer sync +vdirsyncer sync || warn "Initial CalDAV sync failed (credentials/network not ready) — run 'vdirsyncer sync' once configured." # ── khal configuration ──────────────────────────────────────────────────────── # khal needs one [[calendar]] section per local ICS directory. @@ -254,23 +256,29 @@ PYEOF # Make the helper executable so it can be called directly from the PATH 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..." -~/.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 ──────────────────────────────────────────────────────── # A systemd user timer keeps calendars current automatically. # Using systemd (instead of cron) lets the unit run without requiring root and # 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)..." -mkdir -p ~/.config/systemd/user - -# The service unit runs vdirsyncer sync then rebuilds the calendar.vim cache. -# Type=oneshot: the service is considered active only while the process runs; -# it exits when done rather than staying in the background. -# After=network-online.target: ensures we don't try to sync before the network -# is available (important at boot). -cat > ~/.config/systemd/user/vdirsyncer.service << EOF +if mkdir -p ~/.config/systemd/user 2>/dev/null; then + # The service unit runs vdirsyncer sync then rebuilds the calendar.vim cache. + # Type=oneshot: the service is considered active only while the process runs; + # it exits when done rather than staying in the background. + # After=network-online.target: ensures we don't try to sync before the network + # is available (important at boot). + cat > ~/.config/systemd/user/vdirsyncer.service << EOF [Unit] Description=Sync CalDAV and rebuild calendar.vim cache After=network-online.target @@ -281,10 +289,10 @@ ExecStart=/usr/bin/vdirsyncer sync ExecStartPost=$HOME/.local/bin/ics-to-calendarim EOF -# The timer unit triggers the service on a schedule. -# OnBootSec=2min : first run 2 minutes after login (let the network settle) -# OnUnitActiveSec=15min : repeat every 15 minutes after the last activation -cat > ~/.config/systemd/user/vdirsyncer.timer << EOF + # The timer unit triggers the service on a schedule. + # OnBootSec=2min : first run 2 minutes after login (let the network settle) + # OnUnitActiveSec=15min : repeat every 15 minutes after the last activation + cat > ~/.config/systemd/user/vdirsyncer.timer << EOF [Unit] Description=Run vdirsyncer every 15 minutes @@ -297,10 +305,18 @@ Unit=vdirsyncer.service WantedBy=timers.target EOF -# Reload systemd user daemon so it picks up the new unit files -systemctl --user daemon-reload -# Enable and immediately start the timer; "--now" starts it without a reboot -systemctl --user enable --now vdirsyncer.timer + # A successful daemon-reload means a user session bus is available; only then + # is it worth trying to enable/start the timer. + if systemctl --user daemon-reload 2>/dev/null; then + # 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 "Manual sync: vdirsyncer sync && ics-to-calendarim" diff --git a/setup/modules/optional-Modules/apps/himalaya.sh b/setup/modules/optional-Modules/apps/himalaya.sh index febc62f..1a17e9a 100755 --- a/setup/modules/optional-Modules/apps/himalaya.sh +++ b/setup/modules/optional-Modules/apps/himalaya.sh @@ -4,10 +4,9 @@ set -euo pipefail # Load shared log/skip/warn/err helpers from the installer library. source "$(dirname "${BASH_SOURCE[0]}")/../../lib/logging.sh" -log "Installing Himalaya (AUR)..." -# himalaya-bin is the pre-compiled binary release of the Himalaya CLI email client. -# The -bin variant is preferred over building from source because compiling the full -# Rust workspace is slow and requires a complete Rust toolchain. -# --answerdiff None / --answerclean All suppress interactive PKGBUILD/clean prompts. -yay -S --answerdiff None --answerclean All --noconfirm himalaya-bin +log "Installing Himalaya..." +# Himalaya is now packaged in the official Arch repos as `himalaya`, so install +# it with pacman. (The old AUR `himalaya-bin` binary package has been dropped.) +# --needed skips the work if it is already installed. +sudo pacman -S --noconfirm --needed himalaya log "Himalaya installed." diff --git a/setup/modules/optional-Modules/apps/mail-notmuch.sh b/setup/modules/optional-Modules/apps/mail-notmuch.sh index 2603bf0..df68c53 100755 --- a/setup/modules/optional-Modules/apps/mail-notmuch.sh +++ b/setup/modules/optional-Modules/apps/mail-notmuch.sh @@ -158,15 +158,20 @@ 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 # ── 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)..." # User units live under ~/.config/systemd/user/; --user scope requires no root # and units only run while the user session is active. -mkdir -p ~/.config/systemd/user - -# Type=oneshot: systemd marks the service done as soon as ExecStart exits, -# appropriate for a batch sync command that runs and terminates. -# After=network-online.target: prevents sync attempts before a route is available. -cat > ~/.config/systemd/user/mbsync.service << EOF +if mkdir -p ~/.config/systemd/user 2>/dev/null; then + # Type=oneshot: systemd marks the service done as soon as ExecStart exits, + # appropriate for a batch sync command that runs and terminates. + # After=network-online.target: prevents sync attempts before a route is available. + cat > ~/.config/systemd/user/mbsync.service << EOF [Unit] Description=Sync mail with mbsync After=network-online.target @@ -178,9 +183,9 @@ ExecStart=/usr/bin/mbsync -a ExecStartPost=/usr/bin/notmuch new EOF -# OnBootSec=2min: delay the first run by 2 min to avoid startup congestion. -# OnUnitActiveSec=5min: repeat 5 min after the previous run finishes. -cat > ~/.config/systemd/user/mbsync.timer << EOF + # OnBootSec=2min: delay the first run by 2 min to avoid startup congestion. + # OnUnitActiveSec=5min: repeat 5 min after the previous run finishes. + cat > ~/.config/systemd/user/mbsync.timer << EOF [Unit] Description=Run mbsync every 5 minutes @@ -193,17 +198,34 @@ Unit=mbsync.service WantedBy=timers.target EOF -# Reload the user manager so it picks up the newly written unit files. -systemctl --user daemon-reload -# enable makes the timer survive reboots; --now also starts it in the current session. -systemctl --user enable --now mbsync.timer + # Reload the user manager so it picks up the newly written unit files. + # A successful daemon-reload means a user session bus is available; only then + # is it worth trying to enable/start the timer. Guard both so the absence of + # 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 ────────────────────────────────────────────────────────────── +# 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..." # -a syncs all configured channels; may take several minutes on a large mailbox. -mbsync -a -# Index the freshly downloaded messages so alot can display them immediately. -notmuch new +if mbsync -a; then + # Index the freshly downloaded messages so alot can display them immediately. + 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 "Open alot with: alot | Check timer: systemctl --user status mbsync.timer"